User prompt
Please fix the bug: 'Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': The document is sandboxed and lacks the 'allow-same-origin' flag.' in or related to this line: 'if (self.alpha <= 0) {' Line Number: 666 āŖš” Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': The document is sandboxed and lacks the 'allow-same-origin' flag.' in or related to this line: 'if (!isPaused) {' Line Number: 1619
Code edit (1 edits merged)
Please save this source code
Remix started
Copy Coffee Catcher
/**** * Plugins ****/ var storage = LK.import("@upit/storage.v1", { disableSpikes: false }); /**** * Classes ****/ // Replace basic particle graphics with enhanced ParticleGraphics // Ball class var Ball = Container.expand(function () { var self = Container.call(this); self.particlePool = new ParticlePool(); self.createParticle = function () { var particle = this.particlePool.getParticle(); if (particle) { particle.x = self.x; particle.y = self.y; particle.alpha = 1; // Reset particle alpha if (!self.isDestroyed && game.children.includes(self)) { game.addChildAt(particle, game.getChildIndex(self)); } } }; // Use BallGraphics for ball visuals var ballGraphics = new BallGraphics(); var shadowGraphics = new ShadowGraphics(); shadowGraphics.y = ballGraphics.height * 0.1; shadowGraphics.alpha = 0.5; self.addChild(shadowGraphics); self.addChild(ballGraphics); self.speed = Math.random() * 3 + 2; self.scoreValue = 1; // Default score value for each ball self._move_migrated = function () { var speedMultiplier = gameSettings.difficulty === 'hard' ? 4 : gameSettings.difficulty === 'insane' ? 10 : gameSettings.difficulty === 'easy' ? 1 : 2; self.y += self.speed * speedMultiplier; self.createParticle(); }; self.resetPosition = function () { self.x = Math.random() * (2048 - ballGraphics.width) + ballGraphics.width / 2; self.y = -ballGraphics.height; }; self.isDestroyed = false; self.resetPosition(); }); // BallGraphics class for enhanced ball visuals var BallGraphics = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5 }); // Additional visual enhancements can be added here }); // CoffeeBean class var CoffeeBean = Container.expand(function () { var self = Container.call(this); self.particlePool = new CoffeeParticlePool(); self.createParticle = function () { var particle = this.particlePool.getParticle(); if (particle) { particle.x = self.x; particle.y = self.y; particle.alpha = 1; // Reset particle alpha if (!self.isDestroyed && game.children.includes(self)) { game.addChildAt(particle, game.getChildIndex(self)); } } }; // Use CoffeeBeanGraphics for coffee bean visuals var coffeeBeanGraphics = new CoffeeBeanGraphics(); var shadowGraphics = new ShadowGraphics(); shadowGraphics.y = coffeeBeanGraphics.height * 0.1; shadowGraphics.alpha = 0.5; self.addChild(shadowGraphics); self.addChild(coffeeBeanGraphics); self.speed = Math.random() * 3 + 2; self.scoreValue = 5; // Default score value for each coffee bean self._move_migrated = function () { var speedMultiplier = gameSettings.difficulty === 'hard' ? 16 : gameSettings.difficulty === 'insane' ? 40 : gameSettings.difficulty === 'easy' ? 4 : 8; self.y += self.speed * speedMultiplier; self.createParticle(); if (self.y > 2732) { self.isDestroyed = true; } }; self.resetPosition = function () { self.x = Math.random() * (2048 - coffeeBeanGraphics.width) + coffeeBeanGraphics.width / 2; self.y = -coffeeBeanGraphics.height; }; self.isDestroyed = false; self.resetPosition(); }); // CoffeeBeanGraphics class for enhanced coffee bean visuals var CoffeeBeanGraphics = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('coffeeBean', { anchorX: 0.5, anchorY: 0.5 }); // Additional visual enhancements can be added here }); // CoffeeCup class var CoffeeCup = Container.expand(function () { var self = Container.call(this); var cupGraphics = new CupGraphics(); self.addChild(cupGraphics); self.x = 2048 / 2 - 100; self.y = 2732 - cupGraphics.height / 2; self.intersects = function (ball) { var bounds = self.getBounds(); var ballBounds = ball.getBounds(); if (bounds.x < ballBounds.x + ballBounds.width && bounds.x + bounds.width > ballBounds.x && bounds.y < ballBounds.y + ballBounds.height && bounds.y + bounds.height > ballBounds.y) { if (ball instanceof SpinningSpike) { LK.effects.flashObject(self, 0xff0000, 300); // Flash red for 300ms } LK.setScore(LK.getScore() + ball.scoreValue); if (!(ball instanceof TimerItem) && gameSettings.difficulty !== 'hard' && gameSettings.difficulty !== 'insane') { LK.getSound('CoffeeSplashingIntoCup').play(); countdownTimer.duration += 1; } // Add time to the timer based on difficulty updateScoreDisplay(); timerTxt.setText(countdownTimer.duration.toString()); // Update the timer display instantly LK.effects.flashObject(ball, 0xffff00, 300); // Add a yellow glow effect to the ball for 300ms when caught self.animate(); // Trigger cup animation when a ball is collected return true; } return false; }; self.animate = function () { var originalScaleX = self.scale.x; var originalScaleY = self.scale.y; var scaleFactor = 1.1; var animationFrames = 7.5; var currentFrame = 0; var grow = true; function updateAnimation() { if (currentFrame < animationFrames) { if (grow) { self.scale.x = originalScaleX * (1 + (scaleFactor - 1) * (currentFrame / animationFrames)); self.scale.y = originalScaleY * (1 + (scaleFactor - 1) * (currentFrame / animationFrames)); } else { self.scale.x = originalScaleX * (1 + (scaleFactor - 1) * (1 - currentFrame / animationFrames)); self.scale.y = originalScaleY * (1 + (scaleFactor - 1) * (1 - currentFrame / animationFrames)); } currentFrame++; } else if (grow) { grow = false; currentFrame = 0; } else { self.scale.x = originalScaleX; self.scale.y = originalScaleY; LK.off('tick', updateAnimation); } } if (!self.animationCooldown) { self.animationCooldown = true; LK.setTimeout(function () { self.animationCooldown = false; }, 500); LK.on('tick', updateAnimation); } }; }); var CoffeeParticle = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('coffeeParticle', { anchorX: 0.5, anchorY: 0.5 }); self.lifeSpan = 60; // Frames until particle fades out self._update_migrated = function () { self.alpha -= 1 / self.lifeSpan; if (self.alpha <= 0) { self.destroy(); } // Destroy particle when faded out }; LK.on('tick', self._update_migrated); }); var CoffeeParticlePool = Container.expand(function () { var self = Container.call(this); self.pool = []; self.maxParticles = 100; self.getParticle = function () { for (var i = 0; i < self.pool.length; i++) { if (self.pool[i].alpha <= 0) { return self.pool[i]; } } if (self.pool.length < self.maxParticles) { var newParticle = new CoffeeParticle(); self.pool.push(newParticle); return newParticle; } return null; }; self._update_migrated = function () { self.pool.forEach(function (particle) { if (particle.alpha > 0) { particle._update_migrated(); } }); }; LK.on('tick', self._update_migrated); }); var Countdown = Container.expand(function () { var self = Container.call(this); Countdown.prototype.animateDownwards = function () { var startY = self.y; var endY = 2732 / 2 + 200; // Move 200 pixels downwards from the center var frames = 20; // Animation duration of 1/3 second at 60FPS var currentFrame = 0; function updateAnimation() { if (currentFrame < frames) { var progress = currentFrame / frames; self.y = startY + (endY - startY) * progress; currentFrame++; } else { LK.off('tick', updateAnimation); game.removeChild(self); } } LK.on('tick', updateAnimation); }; self.counter = 3; var countdownText = new Text2(self.counter.toString(), { size: 200, fill: '#00ff00', // Green color stroke: '#000000', // Black stroke strokeThickness: 8, // Stroke thickness anchor: { x: 0.5, y: 0.5 } }); self.addChild(countdownText); countdownText.x = 2048 / 2; countdownText.y = 2732 / 2; self._update_migrated = function () { if (self.counter > 0 && !self.countdownStarted) { self.countdownStarted = true; var countdownInterval = LK.setInterval(function () { self.counter--; countdownText.setText(self.counter.toString()); if (self.counter === 0) { LK.clearInterval(countdownInterval); self.animateDownwards(); isPaused = false; // Unpause the game after countdown } }, 1000); } }; LK.on('tick', self._update_migrated); }); // CountdownTimer class to manage the 60-second countdown var CountdownTimer = Container.expand(function (duration, displayText, onComplete) { var self = Container.call(this); self.duration = duration; self.displayText = displayText; self.onComplete = onComplete; self._update_migrated = function () { if (!isPaused && LK.ticks % 60 == 0) { if (self.duration > 0) { self.duration--; self.displayText.setText(self.duration.toString()); } else if (self.duration === 0) { LK.showGameOver(); } } }; }); // CupGraphics class for enhanced cup visuals var CupGraphics = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('cup', { anchorX: 0.5, anchorY: 1 }); // Additional visual enhancements can be added here }); var DancingCup = Container.expand(function () { var self = Container.call(this); var cupGraphics = self.attachAsset('DancingCup', { anchorX: 0.5, anchorY: 0.5 }); self.addChild(cupGraphics); var animationSpeed = 0.1; var animationDistance = 10; var direction = 1; cupGraphics.rotation = -10 * (Math.PI / 180); self.updateDance = function () { var rotationSpeed = 20 * (Math.PI / 180); var stayDuration = 60; // 1 second at 60FPS if (self.stayCounter > 0) { self.stayCounter--; return; } cupGraphics.rotation += (self.reverseAnimation ? -1 : 1) * direction * rotationSpeed; if (Math.abs(cupGraphics.rotation) >= rotationSpeed) { direction *= -1; self.stayCounter = stayDuration; } }; self.stayCounter = 0; LK.on('tick', self.updateDance); }); var DancingCupAsset = Container.expand(function () { var self = Container.call(this); this.preload = function () { var graphics = self.attachAsset('DancingCup', { anchorX: 0.5, anchorY: 0.5 }); }; this.preload(); }); // Instantiate ExplosionAsset to preload the asset var Explosion = Container.expand(function () { var self = Container.call(this); var explosionGraphics = new ExplosionGraphics(); self.addChild(explosionGraphics); self.lifeSpan = 30; // Frames until explosion fades out self._update_migrated = function () { self.alpha -= 1 / self.lifeSpan; if (self.alpha <= 0) { self.destroy(); } // Destroy explosion when faded out }; LK.on('tick', self._update_migrated); }); var ExplosionAsset = Container.expand(function () { var self = Container.call(this); this.preload = function () { var graphics = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5 }); }; this.preload(); }); // ExplosionGraphics class for enhanced explosion visuals var ExplosionGraphics = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5 }); self.addChild(graphics); // Additional visual enhancements can be added here }); var GUIAnimation = Container.expand(function (target, changeFactor, animationFrames, animationType, onComplete) { var self = Container.call(this); self.target = target; self.changeFactor = changeFactor; self.animationFrames = animationFrames; self.currentFrame = 0; self.animationType = animationType; self.onComplete = onComplete; self.updateAnimation = function () { if (self.currentFrame < self.animationFrames) { switch (self.animationType) { case 'scale': self.target.scale.x *= 1 - self.changeFactor * (self.currentFrame / self.animationFrames); self.target.scale.y *= 1 - self.changeFactor * (self.currentFrame / self.animationFrames); break; case 'slide': self.target.x += self.changeFactor * (self.currentFrame / self.animationFrames) * 2048; // Slide to the right break; // Other animation types can be added here } self.currentFrame++; } else { LK.off('tick', self.updateAnimation); if (self.onComplete) { self.onComplete(); } } }; self.start = function () { LK.on('tick', self.updateAnimation); }; }); var GameModeGUI = Container.expand(function () { var self = Container.call(this); var gameModeGUIAsset = self.attachAsset('gameModeGUI', { anchorX: 0.5, anchorY: 0.5 }); gameModeGUIAsset.x = 0; gameModeGUIAsset.y = 0; self.addChild(gameModeGUIAsset); settingsButton.visible = false; // Add an 'x' button to close the game mode GUI var closeButton = self.attachAsset('closeButton', { anchorX: 0.5, anchorY: 0.5 }); closeButton.x = gameModeGUIAsset.width / 2 - closeButton.width / 2 + 120; closeButton.y = -gameModeGUIAsset.height / 2 + closeButton.height / 2; self.addChild(closeButton); closeButton.on('down', function () { if (self.parent) { self.parent.removeChild(self); settingsButton.visible = true; } }); // Add a 'Casual' button to the game mode GUI var casualButton = self.attachAsset('casualButton', { anchorX: 0.5, anchorY: 0.5 }); var casualButtonText = new Text2('Casual', { size: 100, fill: '#ffffff', font: 'bold', stroke: '#000000', strokeThickness: 8 }); casualButtonText.anchor.set(0.5, 0.5); casualButtonText.x = 0; casualButtonText.y = 0; casualButton.addChild(casualButtonText); self.addChild(casualButton); casualButton.x = 0; casualButton.y = -gameModeGUIAsset.height / 2 + casualButton.height / 2 + 20; // Track the active game mode var activeGameMode = 'casual'; // Add event listener for 'Casual' button casualButton.on('down', function () { if (activeGameMode !== 'casual') { activeGameMode = 'casual'; // Update button appearance to indicate active mode casualButton.tint = 0x66ff00; casualButton.scale.x *= 1.05; casualButton.scale.y *= 1.05; // Reset other buttons to default appearance easyButton.tint = 0xFF0000; normalButton.tint = 0xFF0000; hardButton.tint = 0xFF0000; insaneButton.tint = 0xFF0000; easyButton.scale.x /= 1.05; easyButton.scale.y /= 1.05; normalButton.scale.x /= 1.05; normalButton.scale.y /= 1.05; hardButton.scale.x /= 1.05; hardButton.scale.y /= 1.05; insaneButton.scale.x /= 1.05; insaneButton.scale.y /= 1.05; } }); }); var GameSettings = Container.expand(function () { var self = Container.call(this); self.soundEnabled = true; self.difficulty = typeof LK.localStorage !== 'undefined' ? LK.localStorage.getItem('selectedDifficulty') || 'normal' : 'normal'; self.toggleSound = function () { self.soundEnabled = !self.soundEnabled; }; self.setDifficulty = function (difficulty) { self.difficulty = difficulty; // Persist the selected difficulty if (typeof LK.localStorage !== 'undefined') { LK.localStorage.setItem('selectedDifficulty', difficulty); } }; self.setButtonTint = function (difficulty, tint) { self.buttonTints[difficulty] = tint; }; }); var HelpGUI = Container.expand(function () { var self = Container.call(this); var helpAsset = self.attachAsset('helpAsset', { anchorX: 0.5, anchorY: 0.5 }); helpAsset.tint = 0xD2B48C; // Light brown color self.addChild(helpAsset); helpAsset.x = 0; helpAsset.y = 0; // Add a home button to the help GUI var homeButton = LK.getAsset('homeButton', { anchorX: 0.5, anchorY: 0.5 }); homeButton.x = 850; homeButton.y = -1250; // Position 1250 pixels above the center of the help GUI and 750 pixels to the right self.addChild(homeButton); homeButton.on('down', function () { // Start the closing animation for the help GUI var closingAnimationFrames = 30; var currentClosingFrame = 0; var startY = self.y; var endY = 2732 + self.height / 2; // End position off-screen at the bottom var startAlpha = self.alpha; function animateClosing() { if (currentClosingFrame < closingAnimationFrames) { var progress = currentClosingFrame / closingAnimationFrames; self.y = startY + (endY - startY) * progress; self.alpha = startAlpha * (1 - progress); currentClosingFrame++; } else { LK.off('tick', animateClosing); game.removeChild(self); } } LK.on('tick', animateClosing); // Show the start GUI and settings GUI if they are not already visible if (!game.children.includes(startScreen)) { startScreen.x = 2048 / 2; startScreen.y = 2732 / 2; game.addChild(startScreen); } if (settingsGUI && !game.children.includes(settingsGUI)) { game.addChild(settingsGUI); settingsGUI.visible = true; } }); // Add information about the stagnant ball item var ballInfoContainer = new Container(); var ballAsset = LK.getAsset('ball', { anchorX: 0.5, anchorY: 0.5 }); ballAsset.rotation = 10 * (Math.PI / 180); ballInfoContainer.addChild(ballAsset); var ballInfoText = new Text2('Donot let the god fall to the ground, hold him in the flying plane', { size: 50, fill: '#ffffff', anchor: { x: 0, y: 0.5 }, stroke: '#000000', strokeThickness: 5 }); ballInfoText.x = ballAsset.width - 20; ballInfoText.rotation = 5 * (Math.PI / 360); ballInfoContainer.addChild(ballInfoText); ballInfoContainer.x = -750; ballInfoContainer.y = homeButton.y + homeButton.height + 50; ballInfoText.y = ballAsset.height - 200; self.addChild(ballInfoContainer); // Add new coffee bean help below the ball help var coffeeBeanInfoContainer = new Container(); var coffeeBeanAsset = LK.getAsset('coffeeBean', { anchorX: 0.5, anchorY: 0.5 }); coffeeBeanAsset.rotation = 10 * (Math.PI / 180); coffeeBeanInfoContainer.addChild(coffeeBeanAsset); var coffeeBeanInfoText = new Text2('Collect the Coffee Bean for +5 score. +1 on the\ncountdown for easy and normal gamemodes.\n*WARNING! THIS ITEM FALLS DOWN FAST!*', { size: 50, fill: '#ffffff', anchor: { x: 0, y: 0.5 }, stroke: '#000000', strokeThickness: 5 }); coffeeBeanInfoText.x = coffeeBeanAsset.width - 20; coffeeBeanInfoText.rotation = 5 * (Math.PI / 360); coffeeBeanInfoContainer.addChild(coffeeBeanInfoText); coffeeBeanInfoContainer.x = -750; coffeeBeanInfoContainer.y = ballInfoContainer.y + ballInfoContainer.height + 50; coffeeBeanInfoText.y = coffeeBeanAsset.height - 200; self.addChild(coffeeBeanInfoContainer); // Add new timer help below the coffee bean help var timerInfoContainer = new Container(); var timerAsset = LK.getAsset('timerItem', { anchorX: 0.5, anchorY: 0.5 }); timerAsset.rotation = 10 * (Math.PI / 180); timerInfoContainer.addChild(timerAsset); var timerInfoText = new Text2('Collect the Timer for +5 on the countdown.\n*WARNING! THIS ITEM FALLS DOWN FAST!*', { size: 50, fill: '#ffffff', anchor: { x: 0, y: 0.5 }, stroke: '#000000', strokeThickness: 5 }); timerInfoText.x = timerAsset.width - 20; timerInfoText.rotation = 5 * (Math.PI / 360); timerInfoContainer.addChild(timerInfoText); timerInfoContainer.x = -750; timerInfoContainer.y = coffeeBeanInfoContainer.y + coffeeBeanInfoContainer.height + 80; // Moved down by 50 pixels timerInfoText.y = timerAsset.height - 200; self.addChild(timerInfoContainer); // Add new spinning spike help below the timer help var spinningSpikeInfoContainer = new Container(); var spinningSpikeAsset = LK.getAsset('spinningSpike', { anchorX: 0.5, anchorY: 0.5 }); spinningSpikeInfoContainer.addChild(spinningSpikeAsset); var spinningSpikeInfoText = new Text2('*Avoid the spinning spike at all costs!*\nThis item will make you lose 10 score!', { size: 50, fill: '#ffffff', anchor: { x: 0, y: 0.5 }, stroke: '#000000', strokeThickness: 5 }); spinningSpikeInfoText.x = spinningSpikeAsset.width - 20; spinningSpikeInfoText.rotation = 5 * (Math.PI / 360); spinningSpikeInfoContainer.addChild(spinningSpikeInfoText); spinningSpikeInfoContainer.x = -750; spinningSpikeInfoContainer.y = timerInfoContainer.y + timerInfoContainer.height + 30; self.addChild(spinningSpikeInfoContainer); }); // Replace basic splash graphics with enhanced SplashGraphics // Function to create a splash effect var Particle = Container.expand(function () { var self = Container.call(this); var particleGraphics = new ParticleGraphics(); self.addChild(particleGraphics); self.lifeSpan = 60; // Frames until particle fades out self._update_migrated = function () { self.alpha -= 1 / self.lifeSpan; if (self.alpha <= 0) { self.destroy(); } // Destroy particle when faded out }; }); var ParticleAsset = Container.expand(function () { var self = Container.call(this); this.preload = function () { var graphics = self.attachAsset('particle', { anchorX: 0.5, anchorY: 0.5 }); }; this.preload(); }); // Initialize the particle pool // ParticleGraphics class for enhanced particle visuals var ParticleGraphics = Container.expand(function () { var self = Container.call(this); var graphics = LK.getAsset('particle', { anchorX: 0.5, anchorY: 0.5 }); self.addChild(graphics); // Additional visual enhancements can be added here }); var ParticlePool = Container.expand(function () { var self = Container.call(this); self.pool = []; self.maxParticles = 100; self.getParticle = function () { for (var i = 0; i < self.pool.length; i++) { if (self.pool[i].alpha <= 0) { return self.pool[i]; } } if (self.pool.length < self.maxParticles) { var newParticle = new Particle(); self.pool.push(newParticle); return newParticle; } return null; }; self._update_migrated = function () { self.pool.forEach(function (particle) { if (particle.alpha > 0) { particle._update_migrated(); } }); }; LK.on('tick', self._update_migrated); }); var RotateAndZoomAnimation = Container.expand(function (target, zoomFactor, animationFrames, rotations) { var self = Container.call(this); self.target = target; self.zoomFactor = zoomFactor; self.animationFrames = animationFrames; self.rotations = rotations; self.currentFrame = 0; self.updateAnimation = function () { if (self.currentFrame < self.animationFrames) { var progress = self.currentFrame / self.animationFrames; self.target.scale.x = self.target.scale.x * (1 + self.zoomFactor * progress); self.target.scale.y = self.target.scale.y * (1 + self.zoomFactor * progress); self.target.rotation = 2 * Math.PI * self.rotations * progress; self.currentFrame++; } else { LK.off('tick', self.updateAnimation); if (self.onComplete) { self.onComplete(); } } }; self.start = function (onComplete) { self.onComplete = onComplete; LK.on('tick', self.updateAnimation); }; }); var ScaleAnimation = Container.expand(function (target, scaleFactor, animationFrames) { var self = Container.call(this); self.target = target; self.originalScaleX = target.scale.x; self.originalScaleY = target.scale.y; self.scaleFactor = scaleFactor; self.animationFrames = animationFrames; self.currentFrame = 0; self.updateAnimation = function () { if (self.currentFrame < self.animationFrames) { self.target.scale.x = self.originalScaleX * (1 - self.scaleFactor * (self.currentFrame / self.animationFrames)); self.target.scale.y = self.originalScaleY * (1 - self.scaleFactor * (self.currentFrame / self.animationFrames)); self.currentFrame++; } else { LK.off('tick', self.updateAnimation); if (self.onComplete) { self.onComplete(); } } }; self.start = function (onComplete) { self.onComplete = onComplete; LK.on('tick', self.updateAnimation); }; }); // Initialize game settings var SettingsButton = Container.expand(function () { var self = Container.call(this); var buttonGraphics = self.attachAsset('settingsButton', { anchorX: 0.5, anchorY: 0.5 }); self.addChild(buttonGraphics); self.x = 2048 - buttonGraphics.width / 2 - 60; // Position from the right edge and 50 pixels to the left self.y = buttonGraphics.height / 2 + 60; // Position from the top edge and 50 pixels down var settingsGUI = new SettingsGUI(); settingsGUI.x = 2048 / 2; settingsGUI.y = 2732 / 2; self.on('down', function (x, y, obj) { if (game.children.includes(settingsGUI)) { settingsGUI.animateClose(); } else if (!self.clickDisabled) { self.pauseGame(); } }); SettingsButton.prototype.pauseGame = function () { timerTxt.visible = false; scoreTxt.visible = false; this.isDown = true; var rotateAndZoomAnimation = new RotateAndZoomAnimation(this, 0.1, 5, 1); rotateAndZoomAnimation.start(function () { self.visible = false; isPaused = true; // Pause the game when settings are opened self.scale.x = 1; self.scale.y = 1; // Reset scale after animation if (startScreen.parent) { LK.setTimeout(function () { self.clickDisabled = false; }, 1000); // Disable click for 1 second if start screen is up } else { LK.setTimeout(function () { self.clickDisabled = false; }, 4000); // Otherwise, disable click for 4 seconds } self.clickDisabled = true; }); }; self.on('up', function (x, y, obj) { if (self.isDown) { self.isDown = false; self.scale.x /= 1.05; self.scale.y /= 1.05; if (!settingsGUI || !game.children.includes(settingsGUI)) { var animateFadeIn = function animateFadeIn() { if (currentFrame < fadeInFrames) { settingsGUI.alpha = currentFrame / fadeInFrames; currentFrame++; } else { LK.off('tick', animateFadeIn); } }; settingsGUI = new SettingsGUI(); settingsGUI.x = 2048 / 2; settingsGUI.y = 2732 / 2; settingsGUI.alpha = 0; // Start with the GUI fully transparent game.addChild(settingsGUI); // Animate the GUI to fade in var fadeInFrames = 30; var currentFrame = 0; LK.on('tick', animateFadeIn); } } }); self.on('upoutside', function (obj) { if (self.isDown) { self.isDown = false; self.scale.x /= 1.05; self.scale.y /= 1.05; } }); self.on('over', function (obj) { if (!self.isDown) { self.scale.x *= 1.05; self.scale.y *= 1.05; } }); self.on('out', function (obj) { if (!self.isDown) { self.scale.x /= 1.05; self.scale.y /= 1.05; } }); }); var SettingsGUI = Container.expand(function () { var self = Container.call(this); function animateButtonZoom(button) { var originalScaleX = button.scale.x; var originalScaleY = button.scale.y; var scaleFactor = 1.05; var animationFrames = 15; var currentFrame = 0; function updateAnimation() { if (currentFrame < animationFrames) { button.scale.x = originalScaleX * (1 + (scaleFactor - 1) * (currentFrame / animationFrames)); button.scale.y = originalScaleY * (1 + (scaleFactor - 1) * (currentFrame / animationFrames)); currentFrame++; } else { button.scale.x = originalScaleX; button.scale.y = originalScaleY; LK.off('tick', updateAnimation); } } LK.on('tick', updateAnimation); } var background = self.attachAsset('settingsBackground', { anchorX: 0.5, anchorY: 0.5 }); background.curve = 5; var closeButton = self.attachAsset('closeButton', { anchorX: 0.5, anchorY: 0.5 }); closeButton.x = background.width / 2 - closeButton.width / 2; closeButton.y = -background.height / 2 - closeButton.height / 2; self.addChild(background); self.addChild(closeButton); // Add 'Set Your Difficulty' text over the Settings GUI var difficultyText = new Text2('Set Your Difficulty', { size: 110, // 10% bigger font size fill: '#ffffff', // White color font: 'bold', // Bold font stroke: '#000000', // Black outline strokeThickness: 10 // Outline thickness }); difficultyText.anchor.set(0.5, 0); difficultyText.x = 0; difficultyText.y = -background.height / 2 + 210; self.addChild(difficultyText); // Add 'Settings In The Works!' text under the difficulty title closeButton.on('down', function () { self.animateClose(); }); self.animateClose = function () { var currentDifficulty = gameSettings.difficulty; var animation = new GUIAnimation(self, 0.1, 10, 'slide', function () { self.unpauseGame(currentDifficulty); }); animation.start(); }; SettingsGUI.prototype.unpauseGame = function (currentDifficulty) { if (this.parent) { this.parent.removeChild(this); } settingsButton.visible = true; // Only start countdown if not on start screen scoreTxt.visible = true; timerTxt.visible = true; if (gameSettings.disableSpikes) { balls = balls.filter(function (ball) { if (ball instanceof SpinningSpike) { createExplosion(ball.x, ball.y); ball.destroy(); return false; } return true; }); } if (!startScreen.parent) { var countdown = new Countdown(); game.addChild(countdown); countdown._update_migrated(); } }; // Add difficulty selection buttons var buttonPadding = 10; var easyButton = self.attachAsset('easyButton', { anchorX: 0.5, anchorY: 0.5 }); easyButton.tint = gameSettings.difficulty === 'easy' ? 0x66ff00 : 0xFF0000; // Set button color based on the current difficulty var easyButtonText = new Text2('Easy', { size: 100, fill: '#ffffff', font: 'bold', stroke: '#000000', strokeThickness: 8 }); easyButtonText.anchor.set(0.5, 0.5); easyButtonText.x = 0; easyButtonText.y = 0; easyButton.addChild(easyButtonText); self.addChild(easyButton); easyButton.x = 0; easyButton.y = buttonPadding - 1250 + 350 + 30; var normalButton = self.attachAsset('normalButton', { anchorX: 0.5, anchorY: 0.5 }); normalButton.tint = gameSettings.difficulty === 'normal' ? 0x66ff00 : 0xFF0000; // Set button color based on the current difficulty var normalButtonText = new Text2('Normal', { size: 100, fill: '#ffffff', font: 'bold', stroke: '#000000', strokeThickness: 8 }); normalButtonText.anchor.set(0.5, 0.5); normalButtonText.x = 0; normalButtonText.y = 0; normalButton.addChild(normalButtonText); self.addChild(normalButton); normalButton.x = 0; normalButton.y = easyButton.y + easyButton.height + buttonPadding; var hardButton = self.attachAsset('hardButton', { anchorX: 0.5, anchorY: 0.5 }); hardButton.tint = gameSettings.difficulty === 'hard' ? 0x66ff00 : 0xFF0000; // Set button color based on the current difficulty var hardButtonText = new Text2('Hard', { size: 100, fill: '#ffffff', font: 'bold', stroke: '#000000', strokeThickness: 8 }); hardButtonText.anchor.set(0.5, 0.5); hardButtonText.x = 0; hardButtonText.y = 0; hardButton.addChild(hardButtonText); self.addChild(hardButton); hardButton.x = 0; hardButton.y = normalButton.y + normalButton.height + buttonPadding; var insaneButton = self.attachAsset('insaneButton', { anchorX: 0.5, anchorY: 0.5 }); if (gameSettings.difficulty === 'insane') { // Set button color based on the current difficulty insaneButton.tint = 0x66ff00; insaneButton.scale.x = 1.05; insaneButton.scale.y = 1.05; } else { insaneButton.tint = 0xFF0000; insaneButton.scale.x = 1; insaneButton.scale.y = 1; } insaneButton.on('down', function () { easyButton.tint = 0xFF0000; // Revert to red normalButton.tint = 0xFF0000; // Revert to red hardButton.tint = 0xFF0000; // Revert to red gameSettings.setDifficulty('insane'); }); var insaneButtonText = new Text2('Insane', { size: 100, fill: '#ffffff', font: 'bold', stroke: '#000000', strokeThickness: 8 }); insaneButtonText.anchor.set(0.5, 0.5); insaneButtonText.x = 0; insaneButtonText.y = 0; insaneButton.addChild(insaneButtonText); self.addChild(insaneButton); // Add 'Disable Spinning Spikes' setting with a checkbox var disableSpikesText = new Text2('Disable Spinning Spikes', { size: 100, fill: '#ffffff', stroke: '#000000', strokeThickness: 8 }); disableSpikesText.anchor.set(0, 0.5); disableSpikesText.x = -background.width / 4 - 225; disableSpikesText.y = insaneButton.y + insaneButton.height + buttonPadding / 2 - 500; self.addChild(disableSpikesText); var disableSpikesCheckbox = self.attachAsset('checkbox', { anchorX: 0.5, anchorY: 0.5 }); disableSpikesCheckbox.x = disableSpikesText.x + disableSpikesText.width + 120; disableSpikesCheckbox.y = disableSpikesText.y; self.addChild(disableSpikesCheckbox); disableSpikesCheckbox.on('down', function () { gameSettings.disableSpikes = !gameSettings.disableSpikes; storage.disableSpikes = gameSettings.disableSpikes; // Update the color of the checkbox based on the new setting state if (gameSettings.disableSpikes) { disableSpikesCheckbox.tint = 0x00FF00; // Set checkbox color to green } else { disableSpikesCheckbox.tint = 0xFF0000; // Set checkbox color to red } }); // Set the initial state of disableSpikes based on gameSettings if (gameSettings.disableSpikes) { disableSpikesCheckbox.tint = 0x00FF00; // Set checkbox color to green } else { disableSpikesCheckbox.tint = 0xFF0000; // Set checkbox color to red } insaneButton.x = 0; insaneButton.y = hardButton.y + hardButton.height + buttonPadding; self.addChild(easyButton); self.addChild(normalButton); self.addChild(hardButton); easyButton.lastClickTime = 0; easyButton.on('down', function () { var currentTime = Date.now(); if (currentTime - easyButton.lastClickTime >= 1000) { gameSettings.setDifficulty('easy'); updateButtonColors(gameSettings.difficulty); animateButtonZoom(easyButton); easyButton.lastClickTime = currentTime; } }); normalButton.lastClickTime = 0; normalButton.on('down', function () { var currentTime = Date.now(); if (currentTime - normalButton.lastClickTime >= 1000) { gameSettings.setDifficulty('normal'); updateButtonColors(gameSettings.difficulty); animateButtonZoom(normalButton); normalButton.lastClickTime = currentTime; } }); hardButton.lastClickTime = 0; hardButton.on('down', function () { var currentTime = Date.now(); if (currentTime - hardButton.lastClickTime >= 1000) { gameSettings.setDifficulty('hard'); updateButtonColors(gameSettings.difficulty); animateButtonZoom(hardButton); hardButton.lastClickTime = currentTime; } }); insaneButton.lastClickTime = 0; insaneButton.on('down', function () { var currentTime = Date.now(); if (currentTime - insaneButton.lastClickTime >= 1000) { gameSettings.setDifficulty('insane'); updateButtonColors(gameSettings.difficulty); animateButtonZoom(insaneButton); insaneButton.lastClickTime = currentTime; } }); function updateButtonColors(selectedDifficulty) { easyButton.tint = selectedDifficulty === 'easy' ? 0x66ff00 : 0xFF0000; normalButton.tint = selectedDifficulty === 'normal' ? 0x66ff00 : 0xFF0000; hardButton.tint = selectedDifficulty === 'hard' ? 0x66ff00 : 0xFF0000; insaneButton.tint = selectedDifficulty === 'insane' ? 0x66ff00 : 0xFF0000; } }); // ShadowGraphics class for shadow visuals var ShadowGraphics = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('shadow', { anchorX: 0.5, anchorY: 0.5 }); // Additional visual enhancements for shadow can be added here }); // SpinningSpike class var SpinningSpike = Container.expand(function () { var self = Container.call(this); var spikeGraphics = self.attachAsset('spinningSpike', { anchorX: 0.5, anchorY: 0.5 }); self.addChild(spikeGraphics); self.speed = Math.random() * 3 + 2; self.rotationSpeed = 4 * 2 * Math.PI; // 4 times per second self.scoreValue = -10; // Deducts points when collected self._move_migrated = function () { self.y += self.speed * 2; // Fall speed increased by 2 times self.rotation += self.rotationSpeed / 60; // Game runs at 60FPS if (self.y > 2732) { self.isDestroyed = true; } }; self.resetPosition = function () { self.x = Math.random() * (2048 - spikeGraphics.width) + spikeGraphics.width / 2; self.y = -spikeGraphics.height; }; self.resetPosition(); }); // Splash effect class var Splash = Container.expand(function () { var self = Container.call(this); // Replace basic splash graphics with enhanced SplashGraphics var splashGraphics = new SplashGraphics(); self.addChild(splashGraphics); self.lifeSpan = 30; // Frames until splash fades out self._update_migrated = function () { self.alpha -= 1 / self.lifeSpan; if (self.alpha <= 0) { self.destroy(); } // Destroy splash when faded out }; LK.on('tick', self._update_migrated); }); var SplashAsset = Container.expand(function () { var self = Container.call(this); this.preload = function () { var graphics = self.attachAsset('splash', { anchorX: 0.5, anchorY: 0.5 }); }; this.preload(); }); // SplashGraphics class for enhanced splash visuals var SplashGraphics = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('splash', { anchorX: 0.5, anchorY: 0.5 }); // Additional visual enhancements can be added here }); var StartButtonAnimation = Container.expand(function (startButton) { var self = Container.call(this); self.startButton = startButton; var minX = game.width / 2 - 10; var maxX = game.width / 2 + 10; var speed = 0.5; // Speed of the animation var direction = 1; // Start moving to the right self.updateAnimation = function () { if (!isPaused) { self.startButton.x += speed * direction; if (self.startButton.x > maxX || self.startButton.x < minX) { direction *= -1; // Reverse direction } } }; LK.on('tick', self.updateAnimation); }); var StartScreen = Container.expand(function () { var self = Container.call(this); var startScreenBackground = self.attachAsset('startScreen', { anchorX: 0.5, anchorY: 0.5 }); startScreenBackground.tint = 0xF1E7D6; // very light brown color startScreenBackground.x = game.width / 2; startScreenBackground.y = game.height / 2; self.addChild(startScreenBackground); var startButton = self.attachAsset('startButton', { anchorX: 0.5, anchorY: 0.5 }); startButton.x = game.width / 2 - 580; startButton.y = game.height / 2 + 1000; // Add new 'Gamemode' button to the start GUI var gameModeButton = self.attachAsset('gameModeButton', { anchorX: 0.5, anchorY: 0.5 }); gameModeButton.x = game.width / 2 + 75; gameModeButton.y = game.height / 2 + 1000; self.addChild(gameModeButton); // Add 'Coffee Catcher' text to the start GUI var coffeeCatcherText = new Text2('Catch the \n Gods', { size: 225, fill: '#8B4513', // Coffee color font: 'bold', stroke: '#000000', strokeThickness: 12 }); coffeeCatcherText.anchor.set(0.5, 0); coffeeCatcherText.x = game.width / 2; coffeeCatcherText.y = game.height / 2 - 850; // Position 100 pixels higher above the start button self.addChild(coffeeCatcherText); self.addChild(startButton); // Add new '?' button to the start GUI var helpButton = self.attachAsset('helpButton', { anchorX: 0.5, anchorY: 0.5 }); helpButton.x = game.width / 2 + 700; helpButton.y = game.height / 2 + 1000; self.addChild(helpButton); helpButton.on('down', function () { var helpGUI = new HelpGUI(); helpGUI.x = 2048 + helpGUI.width / 2; // Start off-screen to the right helpGUI.y = 2732 / 2; game.addChild(helpGUI); // Animate helpGUI from right to left var animationFrames = 30; var currentFrame = 0; var endX = 2048 / 2; // Center position function animateHelpGUI() { if (currentFrame < animationFrames) { var progress = currentFrame / animationFrames; helpGUI.x = 2048 / 2 + helpGUI.width / 2 * (1 - progress) - 30; currentFrame++; } else { LK.off('tick', animateHelpGUI); } } LK.on('tick', animateHelpGUI); if (settingsGUI) { settingsGUI.visible = false; } }); // Add new asset 'DancingCup' to the start GUI var dancingCup1 = new DancingCup(); dancingCup1.x = game.width / 2 - 900; dancingCup1.y = game.height / 2 - 700; // Position to the left of the Coffee Catcher text self.addChild(dancingCup1); var dancingCup2 = new DancingCup(); dancingCup2.x = game.width / 2 + 900; dancingCup2.y = game.height / 2 - 700; // Position to the right of the Coffee Catcher text dancingCup2.reverseAnimation = true; // Flag to reverse the animation direction self.addChild(dancingCup2); // Add left to right motion animation to the start button startButton.on('over', function () { startButton.scale.x *= 1.05; startButton.scale.y *= 1.05; }); startButton.on('out', function () { startButton.scale.x /= 1.05; startButton.scale.y /= 1.05; }); startButton.on('down', function () { LK.gui.top.addChild(scoreTxt); // Add score text to GUI overlay LK.gui.top.addChild(timerTxt); // Add timer text to GUI overlay isPaused = false; // Start the closing animation for the start menu GUI var closeAnimation = new GUIAnimation(self, 0.1, 30, 'slide', function () { game.removeChild(self); }); closeAnimation.start(); }); }); // TimerItem class var TimerItem = Container.expand(function () { var self = Container.call(this); var timerItemGraphics = self.attachAsset('timerItem', { anchorX: 0.5, anchorY: 0.5 }); var shadowGraphics = new ShadowGraphics(); shadowGraphics.y = timerItemGraphics.height * 0.1; shadowGraphics.alpha = 0.5; self.addChild(shadowGraphics); self.addChild(timerItemGraphics); self.speed = Math.random() * 3 + 2; self._move_migrated = function () { var speedMultiplier = gameSettings.difficulty === 'hard' ? 12 : gameSettings.difficulty === 'insane' ? 30 : gameSettings.difficulty === 'easy' ? 3 : 6; self.y += self.speed * speedMultiplier; self.createParticle(); if (self.y > 2732) { self.isDestroyed = true; } }; self.resetPosition = function () { self.x = Math.random() * (2048 - timerItemGraphics.width) + timerItemGraphics.width / 2; self.y = -timerItemGraphics.height; }; self.isDestroyed = false; self.resetPosition(); self.particlePool = new CoffeeParticlePool(); self.createParticle = function () { var particle = self.particlePool.getParticle(); if (particle) { particle.x = self.x; particle.y = self.y; particle.alpha = 1; // Reset particle alpha if (!self.isDestroyed && game.children.includes(self)) { game.addChildAt(particle, game.getChildIndex(self)); } } }; }); // TimerParticle class for unique TimerItem particle visuals var TimerParticle = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('timerParticle', { anchorX: 0.5, anchorY: 0.5 }); self.lifeSpan = 60; // Frames until particle fades out self._update_migrated = function () { self.alpha -= 1 / self.lifeSpan; if (self.alpha <= 0) { self.destroy(); } // Destroy particle when faded out }; LK.on('tick', self._update_migrated); }); var TimerParticleAsset = Container.expand(function () { var self = Container.call(this); this.preload = function () { var graphics = self.attachAsset('timerParticle', { anchorX: 0.5, anchorY: 0.5 }); }; this.preload(); }); // TimerParticlePool class for pooling TimerItem's unique particles var TimerParticlePool = Container.expand(function () { var self = Container.call(this); self.pool = []; self.maxParticles = 100; self.getParticle = function () { for (var i = 0; i < self.pool.length; i++) { if (self.pool[i].alpha <= 0) { return self.pool[i]; } } if (self.pool.length < self.maxParticles) { var newParticle = new TimerParticle(); self.pool.push(newParticle); return newParticle; } return null; }; self._update_migrated = function () { self.pool.forEach(function (particle) { if (particle.alpha > 0) { particle._update_migrated(); } }); }; LK.on('tick', self._update_migrated); }); /**** * Initialize Game ****/ // Replace basic cup graphics with enhanced CupGraphics var game = new LK.Game({ backgroundColor: 0x00000000 //Set game background to invisible }); /**** * Game Code ****/ // Initialize game settings // Create and set the new background // Function to create a splash effect // Replace basic splash graphics with enhanced SplashGraphics // Function to create a splash effect // Instantiate ExplosionAsset to preload the asset var explosionAsset = new ExplosionAsset(); function createExplosion(x, y) { var explosion = new Explosion(); explosion.x = x; explosion.y = y; if (!game.children.includes(explosion)) { game.addChildAt(explosion, game.children.length - 1); } } function updateFallingObjects() { // Move existing falling objects balls.forEach(function (ball) { ball._move_migrated(); }); // Handle off-screen falling objects for (var i = balls.length - 1; i >= 0; i--) { if (balls[i].y > game.height || balls[i].isDestroyed) { balls[i].destroy(); balls.splice(i, 1); } } // Spawn new falling objects if (LK.ticks % 60 == 0) { spawnFallingObjects(); } } var gameSettings = new GameSettings(); gameSettings.disableSpikes = storage.disableSpikes; game.showSettingsGUI = function () { var settingsGUI = new SettingsGUI(); settingsGUI.x = 2048 / 2; settingsGUI.y = 2732 / 2; LK.gui.top.addChild(settingsGUI); }; var particlePool = new ParticlePool(); function createSplash(x, y) { var splash = new Splash(); splash.x = x; splash.y = y; if (!game.children.includes(splash)) { game.addChildAt(splash, game.children.length - 1); } } var background = game.attachAsset('background', {}); background.x = 0; // Set to top left on the x-axis background.y = 0; // Set to top left on the y-axis game.addChild(background); // Initialize game elements var balls = []; var cup = game.addChild(new CoffeeCup()); var score = 0; var requiredScore = 10; // The score needed to win var scoreTxt = new Text2(score.toString(), { size: 150, fill: 0xFFFFFF, stroke: '#000000', strokeThickness: 8 }); var timerTxt = new Text2('60', { size: 100, fill: 0xFFFFFF, stroke: '#000000', strokeThickness: 8 }); scoreTxt.anchor.set(0.5, 0); timerTxt.anchor.set(0.5, 0); // Initially hide the score and timer text // LK.gui.top.addChild(scoreTxt); // LK.gui.top.addChild(timerTxt); timerTxt.y = scoreTxt.height + 20; // Add settings button to the top left of the screen var settingsGUI; var settingsButton = new SettingsButton(); game.addChild(settingsButton); // Create a function to update the score display function updateScoreDisplay() { scoreTxt.setText(score.toString()); } var CoffeeBeanFactory = { createCoffeeBean: function createCoffeeBean() { var coffeeBean = new CoffeeBean(); balls.push(coffeeBean); game.addChildAt(coffeeBean, game.getChildIndex(settingsButton) - 1); return coffeeBean; } }; var TimerItemFactory = { createTimerItem: function createTimerItem() { var timerItem = new TimerItem(); balls.push(timerItem); game.addChildAt(timerItem, game.getChildIndex(settingsButton) - 1); return timerItem; } }; var BallFactory = { createBall: function createBall() { var ball = new Ball(); balls.push(ball); game.addChildAt(ball, game.getChildIndex(settingsButton) - 1); return ball; } }; function spawnFallingObjects() { var randomChance = Math.random(); var difficulty = gameSettings.difficulty; var spinningSpikeChance = difficulty === 'normal' ? 0.01 : difficulty === 'hard' ? 0.05 : difficulty === 'insane' ? 0.1 : 0; if (!gameSettings.disableSpikes && randomChance < spinningSpikeChance) { var spinningSpike = new SpinningSpike(); balls.push(spinningSpike); game.addChildAt(spinningSpike, game.getChildIndex(settingsButton) - 1); } else if (randomChance < 0.05 + spinningSpikeChance) { CoffeeBeanFactory.createCoffeeBean(); } else if (randomChance >= 0.05 + spinningSpikeChance && randomChance < 0.06 + spinningSpikeChance) { TimerItemFactory.createTimerItem(); } else { BallFactory.createBall(); } } // Create a function to end the game function endGame() { var finalScore = LK.getScore(); // Retrieve the current high score from localStorage var highScore = storage.highScore || 0; // Check if the final score is greater than the high score if (finalScore > highScore) { // Update the high score in localStorage storage.highScore = finalScore; } LK.setTimeout(function () { LK.showGameOver(); }, 0); } // Create a function to handle ball and cup collisions function handleCollisions() { for (var i = balls.length - 1; i >= 0; i--) { if (cup.intersects(balls[i])) { if (balls[i] instanceof TimerItem) { countdownTimer.duration += 10; // Add 10 seconds to the timer } else { if (canCollectScore) { score += balls[i].scoreValue; if (balls[i] instanceof SpinningSpike && score < 0) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } // Prevent score from going negative updateScoreDisplay(); } } createSplash(balls[i].x, balls[i].y); balls[i].destroy(); balls.splice(i, 1); } else if (balls[i].y > 2732) { balls[i].destroy(); balls.splice(i, 1); } } } // Create a function to handle dragging the cup function handleDrag(obj) { var event = obj.event; var pos = game.toLocal(event.global); cup.x = pos.x; } // Add event listeners for dragging the cup game.on('down', function (x, y, obj) { if (!isPaused) { handleDrag(obj); } }); game.on('move', function (x, y, obj) { if (!isPaused) { handleDrag(obj); } }); // Main game loop var canCollectScore = false; var isPaused = false; LK.setTimeout(function () { canCollectScore = true; }, 100); // Initialize the 60-second countdown timer var countdownTimer = new CountdownTimer(60, timerTxt, function () { LK.effects.flashScreen(score >= requiredScore ? 0x00ff00 : 0xff0000, 1000); LK.showGameOver(); }); var startScreen = new StartScreen(); startScreen.x = 2048 / 2 - 1000; startScreen.y = 2732 / 2 - 1500; game.addChild(startScreen); // Make settings button visible on start screen game.addChild(settingsButton); isPaused = true; // Initialize the 60-second countdown timer var countdownTimer = new CountdownTimer(60, timerTxt, function () { LK.effects.flashScreen(score >= requiredScore ? 0x00ff00 : 0xff0000, 1000); LK.showGameOver(); }); LK.on('tick', function () { // Update the countdown timer countdownTimer._update_migrated(); // Handle collisions handleCollisions(); // Update falling objects if (!isPaused) { updateFallingObjects(); } });
===================================================================
--- original.js
+++ change.js
Black circle with a bit of transparency.
Coffee Bean With Nothing Else. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Clock, Nothing else in the image.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A white particle trail, vertical. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Remove the plus from this image
Red X. Nothing else.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
White rectangle, curved corners. Small black border. Simple, modern. Aspect ratio 1550 * 2500.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Include only the spike.
Remove the random stuff below the question mark