User prompt
Move the coffee drops text 25 pixels up
User prompt
In the helpgui, make the coffee drops text center to the bottom coffee drop image
User prompt
In the help gui, add new text 15 pixels to the right of the coffee drop which states the number of coffee drops collected. Make sure the coffee drops are tracked with local storage and make sure it is updated each time a coffee drop is collected. Don't affect how coffee drops are counted in the score counter
User prompt
Please fix the bug: 'ReferenceError: coffeeDropCountText is not defined' in or related to this line: 'coffeeDropCountText.setText(storage.coffeeDropsCollected.toString());' Line Number: 1573
User prompt
Please fix the bug: 'ReferenceError: coffeeDropCountText is not defined' in or related to this line: 'coffeeDropCountText.setText(storage.coffeeDropsCollected.toString());' Line Number: 1572
User prompt
In the help gui, add new text 15 pixels to the right of the coffee drop which states the number of coffee drops collected. Make sure the coffee drops are tracked with local storage and make sure it is updated each time a coffee drop is collected
User prompt
In the help gui, can you add new coffee drop 150 pixels above the bottom of the screen and 150 pixels from the left of the screen
User prompt
In the help gui, can you add new coffee drop 150 pixels above the bottom of the screen and 50 pixels from the left of the screen
User prompt
In the help gui, can you add new coffee drop 125 pixels above the bottom of the screen and 125 pixels from the left of the screen
User prompt
In the help gui, can you add new coffee drop 125 pixels above the bottom of the screen and 125 pixels from the left of the screen
User prompt
In the help gui, can you add new coffee drop 35 pixels above the bottom of the screen and 35 pixels from the left of the screen
User prompt
In the help gui, can you move the *avoid the spinning spike* text up 30 pixels up and 30 pixels to the left please
User prompt
In the help gui, can you make the spike 50% smaller
User prompt
In the help gui, can you move the timer icon and text up 50 pixels
Code edit (1 edits merged)
Please save this source code
User prompt
Change "ballInfoText.rotation = 5 * (Math.PI / 360);" to make the rotation 180 degrees
Code edit (1 edits merged)
Please save this source code
User prompt
In the help screen, make the text horizontal
User prompt
Don't save the in game score with persistent data. Just track the total and update the high score if that score beats a previous high score please
User prompt
Don't use finalscore to calculate the highest score. Make sure the score saves even if the player leaves before the round is finished
User prompt
The highest score is not saving in perpetual data after the game is finished. Please fix that
User prompt
Below the Coffee Catcher text on the home screen, put the highest score the user has ever gotten with the text "Highest Score: ". Use perpetual data to save this value
User prompt
Remove the help button opening animation and make sure it is ready to be changed to another animation
User prompt
Can you keep presistent storage for if the spinning spikes are enabled or disabled āŖš” Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'storage is not defined' in or related to this line: 'gameSettings.disableSpikes = storage.disableSpikes;' Line Number: 1433
/**** * 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 = 20; var direction = 1; cupGraphics.rotation = -35 * (Math.PI / 180); self.updateDance = function () { var rotationSpeed = 70 * (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('Collect the coffee drop for +1 score. +1 on the \ncountdown for easy and normal gamemodes.', { 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('Coffee Catcher', { 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 = typeof LK.localStorage !== 'undefined' ? parseInt(LK.localStorage.getItem('highScore')) || 0 : 0; // Check if the final score is greater than the high score if (finalScore > highScore) { // Update the high score in localStorage if (typeof LK.localStorage !== 'undefined') { LK.localStorage.setItem('highScore', finalScore.toString()); } } 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
@@ -1,5 +1,12 @@
/****
+* Plugins
+****/
+var storage = LK.import("@upit/storage.v1", {
+ disableSpikes: false
+});
+
+/****
* Classes
****/
// Replace basic particle graphics with enhanced ParticleGraphics
// Ball class
@@ -1362,14 +1369,14 @@
/****
* Game Code
****/
-// Instantiate ExplosionAsset to preload the asset
+// 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
-// Create and set the new background
-// Initialize game settings
+// Instantiate ExplosionAsset to preload the asset
var explosionAsset = new ExplosionAsset();
function createExplosion(x, y) {
var explosion = new Explosion();
explosion.x = x;
@@ -1394,11 +1401,8 @@
if (LK.ticks % 60 == 0) {
spawnFallingObjects();
}
}
-var storage = {
- disableSpikes: false // Default value, can be updated based on actual storage implementation
-};
var gameSettings = new GameSettings();
gameSettings.disableSpikes = storage.disableSpikes;
game.showSettingsGUI = function () {
var settingsGUI = new SettingsGUI();
Coffee droplet.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. Shadows at the bottom.
Have the coffee cup open at the top
High end Coffee Shop. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. Shadows at the bottom.
Coffee trail going vertical. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. Shadows at the bottom.
Coffee splashing effect. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No Shadows.
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 bottom part that is not coming from the center explosion
Rectangular coffee themed start button. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Remove the random stuff below the question mark
Coffee themed button which has the text "gamemode". Make the aspect ratio of this button 5:1. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.