JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
<style> #grid-overlay { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: 999; pointer-events: none; display: grid; grid-template-columns: repeat(10, 1fr); grid-template-rows: repeat(10, 1fr); } .cell { background: transparent; transition: background 0.5s; } </style> <div id="grid-overlay"> <!-- Cells will be generated here by JavaScript --> </div> <script> (function() { // Configuration variables const GRID_SIZE = 10; // 10x10 grid const TURN_INTERVAL = 100; // Interval for turning cells (in milliseconds) const TARGET_BLACK_PERCENTAGE = 0.75; // 75% of cells // Create the grid overlay and cells const grid = document.getElementById('grid-overlay'); const cells = []; for (let i = 0; i < GRID_SIZE * GRID_SIZE; i++) { const cell = document.createElement('div'); cell.className = 'cell'; grid.appendChild(cell); cells.push(cell); } // Generate a seed based on the local year and day of the year const now = new Date(); const seed = now.getFullYear() * 365 + Math.floor((now - new Date(now.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24)); // Shuffle function using the seed for consistent randomization function seededShuffle(array, seed) { let currentIndex = array.length, randomIndex; const rng = (function(seed) { return function() { seed = (seed * 16807) % 2147483647; return (seed - 1) / 2147483646; }; })(seed); while (currentIndex !== 0) { randomIndex = Math.floor(rng() * currentIndex); currentIndex--; [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]]; } return array; } // Start the cell turning process let blackCellsCount = 0; const totalCells = cells.length; const cellsToTurnBlack = Math.floor(totalCells * TARGET_BLACK_PERCENTAGE); const shuffledCells = seededShuffle([...cells], seed); function turnNextCellBlack() { if (blackCellsCount >= cellsToTurnBlack) { return; } const cell = shuffledCells[blackCellsCount]; cell.style.background = 'black'; blackCellsCount++; setTimeout(turnNextCellBlack, TURN_INTERVAL); } turnNextCellBlack(); })(); </script>
<div style="background-image: url('other/evilloop.gif'); background-size: cover; background-position: center; background-repeat: no-repeat; width: 100vw; height: 100vh; position: fixed; top: 0; left: 0; opacity: 0; animation: fadeIn 300s forwards;"></div><style>@keyframes fadeIn { from { opacity: 0; } to { opacity: 0.03; } }</style><style> .text { animation: pulsate 1s infinite; text-transform: uppercase; position: fixed; top: 50%; left: 50%; width: 200vw; /* Set the width to 200vw */ text-align: center; font-size: 9vh; font-weight: 100; z-index: 1000000; color: rgba(255, 255, 255, 0); transition: opacity 1s ease-in-out; transform: translate(-50%, -50%); /* Center the element horizontally and vertically */ } .fade-in { opacity: 0.9; /* Set max visibility to 50% */ } .fade-out { opacity: 0; } </style> <div id="text" class="text"></div> <script> const phrases = [ "pump", "stroke", "edge", "goon", "harder", "pump more", "need more", "stroke more", "goon more", "CAN't STOP", "addict", "No escape", "Never end", "helpless", "only porn", "leak", "leak more", "brainwashed", "nothing else", "can't resist", "never stop", "controlled", "drool", "drool more", "throb", "throb more", "devoted", "enslaved", "obsessed", "trapped", "give in", "embrace it", "accept it", "only this", "worship porn", "forever lost", "lose control", "worship ass", "worship it", "lose yourself", "faster", "submit", "only this", "need this", "surrender", "pervert", "deviant", "corrupted", "deeper", "don't think" ]; const neonColors = [ "#ff1bff", // Magenta "#00FFFF", // Cyan "#ebff0d", // Yellow "#ff0000", // Red "#77ff18", // Lime ]; const textElement = document.getElementById('text'); let currentPhraseIndex = -1; let intervalTime = 5000; // Initial interval time in milliseconds let fadeDuration = 4500; // Initial fade-in/fade-out duration in milliseconds let elapsedTime = 0; const accelerationDuration = 10 * 60 * 1000; // 10 minutes in milliseconds const minInterval = 1100; // Minimum interval time in milliseconds const minFadeDuration = 100; // Minimum fade-in/fade-out duration in milliseconds function getRandomPhrase() { let newIndex; do { newIndex = Math.floor(Math.random() * phrases.length); } while (newIndex === currentPhraseIndex); currentPhraseIndex = newIndex; return phrases[newIndex]; } function getRandomColor() { const isRandomColor = Math.random() < 0.1; // 10% chance for a random neon color if (isRandomColor) { const randomIndex = Math.floor(Math.random() * neonColors.length); return neonColors[randomIndex]; } return 'white'; // 90% chance to be white } function updateTiming() { elapsedTime += intervalTime; const progress = elapsedTime / accelerationDuration; intervalTime = Math.max(minInterval, 5000 - (progress * 4700)); fadeDuration = Math.max(minFadeDuration, 1000 - (progress * 900)); } function showNextPhrase() { textElement.classList.remove('fade-in'); textElement.classList.add('fade-out'); setTimeout(() => { textElement.textContent = getRandomPhrase(); textElement.classList.remove('fade-out'); textElement.classList.add('fade-in'); textElement.style.transition = `opacity ${fadeDuration}ms ease-in-out`; textElement.style.color = getRandomColor(); updateTiming(); setTimeout(showNextPhrase, intervalTime); }, fadeDuration); } // Start the first phrase showNextPhrase(); </script>
<<script>>UIBar.stow()<</script>><center><style>#ui-bar, #history-backward, #history-forward {display: none;} } #passages { color: #393839; }</style>Initializing<br><span class="pulsating-text">Goon Forever</span><br></center><<script>> (function() { function preloadImages() { const formats = ['gif', 'webp']; const batchSize = 50; // Number of concurrent requests per batch const totalImages = 250; // Total number of images let totalSize = 0; // Total size in bytes of all images loaded function updateDisplay() { const mbLoaded = (totalSize / (1024 * 1024)).toFixed(2); // Convert bytes to MB and format document.getElementById('mb-loaded').innerText = `${mbLoaded} MB`; } // Function to fetch image and accumulate its size function fetchImageSize(imagePath) { return new Promise((resolve) => { const xhr = new XMLHttpRequest(); xhr.open('GET', imagePath, true); xhr.responseType = 'blob'; // Use 'blob' to get the size of the response xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { const size = xhr.response.size; // Get size of the response totalSize += size; // Add the size of the loaded image updateDisplay(); resolve(true); } else { resolve(false); // Handle failed load } }; xhr.onerror = () => resolve(false); // Handle error xhr.send(); }); } // Function to process images in batches async function processBatches() { for (let i = 0; i < totalImages; i += batchSize) { // Create an array of promises for the current batch const batchPromises = []; for (let j = 0; j < batchSize; j++) { for (const format of formats) { const imagePath = `contentA/${i + j}.${format}`; batchPromises.push(fetchImageSize(imagePath)); } } // Process the batch promises and wait for all of them to complete await Promise.all(batchPromises); } } return processBatches(); } preloadImages().then(() => { State.variables.datapreloading = true; Engine.play("age verification"); }); })(); <</script>> <center><div id="mb-loaded" style="opacity: 0.5;">0.00 MB</div></center>
<script>(function playRandomSound(lastPlayedIndex = -1) { const soundFiles = Array.from({ length: 14 }, (_, i) => `sounds/sf${i + 1}.mp3`); const availableSounds = soundFiles.filter((_, i) => i !== lastPlayedIndex); const audio = new Audio(availableSounds[Math.floor(Math.random() * availableSounds.length)]); audio.playbackRate = Math.random() * 0.2 + 0.9; audio.onended = () => playRandomSound(soundFiles.indexOf(audio.src)); audio.play(); })();</script>
<div class="pulsating-text" style="margin-top: -50px; font-size: 78px; text-transform: uppercase; font-weight: 700; z-index: 99999;">Goon</div><div class="pulsating-text " style="margin-top: -30px; font-size: 42px; text-transform: uppercase; ">Forever</div><div class="pulsating-text" style="margin-top: -0px; font-size: 16px;">By Crudekiss</div> <h5 style="font-size: 14px;">[<a class="outlink social" style="color: #f96854;" href="https://www.patreon.com/crudekiss/membership" target="_blank">Patreon</a>] [<a class="outlink social" style="color: #7289da" href="https://discord.com/invite/KzZ44NKZrY" target="_blank">Discord</a>] [<a class="outlink social" style="color: #1DA1F2" href="https://x.com/Crudekiss" target="_blank">X.com</a>]</h5><<if $currently_gooning>><<timed 0.2s>><<include gfc_timer>><</timed>><</if>>
<<script>>UIBar.stow()<</script>><style>#history-backward, #history-forward { display: none; }</style><<type 100ms>><center>Are you 18+ years old?</center><</type>><br><center class="warning" style="color: #696669" ><<type 35ms>>[<<link 'Yes'>><<fullscreen>><<goto "settings_1">><</link>>] [[[No|age_error]]] <</type>></center>
<<script>>UIBar.stow()<</script>><style>#ui-bar, #history-backward, #history-forward {display: none;} } #passages { color: #393839; }</style><<type 100ms>><center>Access Denied</center><</type>><<timed 5s>><<goto "wiki">><</timed>>
<<script>>UIBar.stow()<</script>><center><style>#ui-bar, #history-backward, #history-forward {display: none;} } #passages { color: #393839; }</style><<timed 1s>><<type 50ms>><p style="opacity: 0.5;">Global Daily Seed: $DailySeed</p><</type>><</timed>><<timed 4s>><<goto "system">><</timed>></center>
<<script>>(function(){var now=new Date(),year=now.getFullYear(),start=new Date(year,0,0),diff=now-start,oneDay=1000*60*60*24,dayOfYear=Math.floor(diff/oneDay),seed=year*1000+dayOfYear,characters='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',result='',base=characters.length;for(var i=0;i<6;i++){result=characters[seed%base]+result;seed=Math.floor(seed/base);}State.variables.DailySeed=result;})()<</script>><<script>>UIBar.stow()<</script>><center><style>#ui-bar, #history-backward, #history-forward {display: none;} } #passages { color: #393839; }</style><<timed 1s>><<type 79ms>>Brought to you by<br><span class="pulsating-text">Crudekiss</span><br><</type>><</timed>><<timed 5s>><<goto "display_seed">><</timed>></center>
<<script>>UIBar.stow()<</script>><style>#history-backward, #history-forward { display: none; }</style><<type 100ms>><center>Activate brainwashing mode?</center><</type>><<type 10ms>><span class="mode-ifno" style="color: #525252; font-style: italic; text-transform: uppercase;"><center>Rapidly flashing text</center></span><</type>><br><center class="warning" style="color: #696669" ><<type 35ms>>[<<link 'Yes'>><<set $brainwashing_mode = true>><<goto "settings_2">><</link>>] [<<link 'No'>><<set $brainwashing_mode = false>><<goto "settings_2">><</link>>] <</type>></center>
<<script>>UIBar.stow()<</script>><style>#history-backward, #history-forward { display: none; }</style><<type 100ms>>Activate censored mode?<</type>><<type 10ms>><span class="mode-ifno" style="color: #525252; font-style: italic; text-transform: uppercase;"><center>cover 75% of the screen</center></span><</type>><br><center class="warning" style="color: #696669" ><<type 35ms>>[<<link 'Yes'>><<set $censored_mode = true>><<goto "settings_3">><</link>>] [<<link 'No'>><<set $censored_mode = false>><<goto "settings_3">><</link>>] <</type>></center>
<<script>>UIBar.stow()<</script>><style>#history-backward, #history-forward { display: none; }</style><<type 100ms>><center>Activate mindbreaker mode?</center><</type>><<type 10ms>><span class="mode-ifno" style="color: #525252; font-style: italic; text-transform: uppercase;"><center>accelerate to 10 gifs/s<br></center></span><</type>><br><center><center class="warning" style="color: #696669" ><<type 35ms>>[<<link 'Yes'>><<set $mindbreak_mode = true>><<goto "loading">><</link>>] [<<link 'No'>><<set $mindbreak_mode = false>><<goto "loading">><</link>>] <</type>></center>
<<set $currently_gooning = true>><<if $mindbreak_mode>><script>const START_INTERVAL = 5000, END_INTERVAL = 100, TOTAL_TIME = 3 * 60 * 1000, MAX_TRANSITION = 99; </script><</if>><<script>>UIBar.stow()<</script>><<include Sounds3>><<if $brainwashing_mode>><<timed 5s>><<include HypnoText_mode>><</timed>> <</if>><<if $censored_mode>><<timed 1s>><<include Censored_mode>><</timed>><</if>><script> // Function to safely define a constant if it hasn't been defined yet function defineConst(name, value) { try { if (typeof window[name] === 'undefined') { Object.defineProperty(window, name, { value: value, writable: false, enumerable: true, configurable: false }); console.log(`Constant ${name} defined.`); } else { console.log(`Constant ${name} is already defined.`); } } catch (error) { console.error(`Error defining constant ${name}: ${error.message}`); } } // Configuration variables with safety checks defineConst('TOTAL_IMAGES', 247); defineConst('IMAGE_FOLDER', 'contentA'); defineConst('IMAGE_EXTENSIONS', ['gif', 'webp']); defineConst('START_INTERVAL', 5000); defineConst('END_INTERVAL', 650); defineConst('TOTAL_TIME', 10 * 60 * 1000); defineConst('MIN_CHANGES_BEFORE_REPEAT', 60); defineConst('MAX_INITIAL_UPDATES', 2); defineConst('FIRST_RANGE', 50); defineConst('SECOND_RANGE', 150); defineConst('TOTAL_UPDATE_RANGES', 10); let updateCount = 0; let recentImages = []; const MAX_RECENT_IMAGES = MIN_CHANGES_BEFORE_REPEAT; let startTime = Date.now(); console.log('Script initialized.'); // Function to generate a seed based on the current year, day of the year, and number of generations function generateSeed() { try { const now = new Date(); const year = now.getFullYear(); const dayOfYear = Math.floor((now - new Date(year, 0, 0)) / 86400000); return year * 1000000 + dayOfYear * 1000 + updateCount; } catch (error) { console.error(`Error generating seed: ${error.message}`); return Date.now(); // Fallback to timestamp as seed } } // Function to get a seeded random number function seededRandom(seed) { try { const x = Math.sin(seed) * 10000; return x - Math.floor(x); } catch (error) { console.error(`Error generating seeded random: ${error.message}`); return Math.random(); // Fallback to standard random } } // Function to get a random image index function getRandomImageIndex() { try { let maxIndex; if (updateCount < MAX_INITIAL_UPDATES) { maxIndex = FIRST_RANGE; } else if (updateCount < TOTAL_UPDATE_RANGES) { maxIndex = SECOND_RANGE; } else { maxIndex = TOTAL_IMAGES - 1; } let index; let seed = generateSeed(); do { index = Math.floor(seededRandom(seed) * (maxIndex + 1)); seed += 1; } while (recentImages.includes(index)); console.log(`Generated random image index: ${index} (Range: 0-${maxIndex})`); return index; } catch (error) { console.error(`Error getting random image index: ${error.message}`); return 0; // Fallback to the first image index } } // Function to generate image URLs for all extensions function getImageUrls(index) { try { const urls = IMAGE_EXTENSIONS.map(ext => `${IMAGE_FOLDER}/${index}.${ext}`); console.log(`Generated image URLs for index ${index}: ${urls.join(', ')}`); return urls; } catch (error) { console.error(`Error generating image URLs: ${error.message}`); return [`${IMAGE_FOLDER}/default.png`]; // Fallback URL } } // Function to try loading images with fallbacks function loadImage(urls, callback) { try { const img = new Image(); img.onload = () => { console.log(`Successfully loaded image: ${urls[0]}`); callback(urls[0]); }; img.onerror = () => { console.log(`Failed to load image: ${urls[0]}`); if (urls.length > 1) { console.log(`Trying next URL...`); loadImage(urls.slice(1), callback); } else { console.error(`Failed to load any image from URLs: ${urls.join(', ')}`); } }; console.log(`Starting to load image from URL: ${urls[0]}`); img.src = urls[0]; } catch (error) { console.error(`Error loading image: ${error.message}`); } } // Function to update the background image function updateBackgroundImage() { try { console.log(`Update #${updateCount + 1} - Updating background image...`); const imageIndex = getRandomImageIndex(); const urls = getImageUrls(imageIndex); console.log(`Attempting to load images: ${urls.join(', ')}`); loadImage(urls, (validUrl) => { console.log(`Setting background image to: ${validUrl}`); document.body.style.backgroundImage = `url('${validUrl}')`; recentImages.push(imageIndex); if (recentImages.length > MAX_RECENT_IMAGES) { recentImages.shift(); } }); } catch (error) { console.error(`Error updating background image: ${error.message}`); } } // Function to calculate the current interval based on elapsed time function calculateInterval() { try { const elapsedTime = Date.now() - startTime; const progress = Math.min(elapsedTime / TOTAL_TIME, 1); const interval = START_INTERVAL + (END_INTERVAL - START_INTERVAL) * progress; console.log(`Calculated interval: ${interval} ms`); return interval; } catch (error) { console.error(`Error calculating interval: ${error.message}`); return START_INTERVAL; // Fallback to the start interval } } // Function to calculate the transition duration based on the interval function calculateTransitionDuration(interval) { try { const maxInterval = START_INTERVAL; const maxTransition = 0.5; const minTransition = 0; const progress = (maxInterval - interval) / (maxInterval - END_INTERVAL); const transitionDuration = Math.max(minTransition, maxTransition * progress); console.log(`Calculated transition duration: ${transitionDuration} s`); return transitionDuration; } catch (error) { console.error(`Error calculating transition duration: ${error.message}`); return 0.5; // Fallback to max transition duration } } // Recursive function to update image and adjust interval and transition function scheduleNextUpdate() { try { updateBackgroundImage(); updateCount++; console.log(`Update count: ${updateCount}`); const interval = calculateInterval(); const transitionDuration = calculateTransitionDuration(interval); document.body.style.transition = `background-image ${transitionDuration}s ease-in-out`; console.log(`CSS transition set to: background-image ${transitionDuration}s ease-in-out`); console.log(`Scheduling next update in ${interval} ms`); setTimeout(scheduleNextUpdate, interval); } catch (error) { console.error(`Error scheduling next update: ${error.message}`); setTimeout(scheduleNextUpdate, START_INTERVAL); // Retry after a fallback interval } } // Start the initial update and scheduling console.log('Starting background image updates...'); scheduleNextUpdate(); </script><script> window.addEventListener('beforeunload', e => e.returnValue = 'Are you sure you want to leave?');</script>
<<script>>UIBar.stow()<</script>><style>#ui-bar, #history-backward, #history-forward {display: none;} } #passages { color: #393839; }</style><<timed 0.2s>><<goto "Initializing">><</timed>>
<<script>>UIBar.stow()<</script>><style>#ui-bar, #history-backward, #history-forward {display: none;} } #passages { color: #393839; }</style><iframe src="https://en.wikipedia.org/wiki/Pornography_addiction" style=" position: fixed; top: 0; left: 0; width: 100%; height: 100%; border: none; "> </iframe>
<script>const STORAGE_KEY = 'time_spent_gooning_for_crudekiss';</script><script> // Initialize timeSpent if not already set if (!localStorage.getItem(STORAGE_KEY)) { localStorage.setItem(STORAGE_KEY, '0'); } function updateTimeSpent() { try { // Retrieve and increment the timeSpent counter let timeSpent = parseInt(localStorage.getItem(STORAGE_KEY), 10); if (isNaN(timeSpent)) timeSpent = 0; // Handle NaN case timeSpent += 1; // Increment by one second localStorage.setItem(STORAGE_KEY, timeSpent); // Calculate days, hours, minutes, and seconds const seconds = timeSpent % 60; const minutes = Math.floor(timeSpent / 60) % 60; const hours = Math.floor(timeSpent / (60 * 60)) % 24; const days = Math.floor(timeSpent / (60 * 60 * 24)); // Build the display string with abbreviations let displayTime = ''; if (days > 0) displayTime += `${days}d `; if (hours > 0) displayTime += `${hours}h `; if (minutes > 0) displayTime += `${minutes}m `; displayTime += `${seconds}s`; // Update the HTML element if it exists const timeSpentElement = document.getElementById('timeSpent'); if (timeSpentElement) { timeSpentElement.innerText = displayTime.trim(); } } catch (error) { // Log errors to the console (can be modified to alert or ignore) console.error('Error updating time spent:', error); } } // Update the time every second setInterval(updateTimeSpent, 1000); </script>[<span id="timeSpent"></span>]