/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Boss = Container.expand(function () { var self = Container.call(this); var bossGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5, scaleX: 3, scaleY: 1.5, tint: 0x8B0000 }); self.health = 5; self.x = 1800; self.y = 500; self.moveDirection = 1; self.speed = 3; self.lastSpawnTime = 0; self.update = function () { self.y += self.moveDirection * self.speed; if (self.y <= 300) { self.y = 300; self.moveDirection = 1; } if (self.y >= 2400) { self.y = 2400; self.moveDirection = -1; } // Spawn falling objects every 60 frames if (LK.ticks - self.lastSpawnTime > 60) { spawnFallingObject(); self.lastSpawnTime = LK.ticks; } }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('regularBean', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8, tint: 0x8B4513 }); self.speed = 12; self.update = function () { self.x += self.speed; bulletGraphics.rotation += 0.3; }; return self; }); var CoffeeCup = Container.expand(function () { var self = Container.call(this); var cupGraphics = self.attachAsset('coffeeCup', { anchorX: 0.5, anchorY: 0.5 }); self.velocityY = 0; self.gravity = 0.8; self.jumpForce = -12; self.isRising = false; self.isInvincible = false; self.invincibleTimer = 0; self.wasRisingLastFrame = false; self.update = function () { var wasRising = self.isRising; if (self.isRising) { self.velocityY += self.jumpForce * 0.3; // Add flying animation when starting to rise if (!self.wasRisingLastFrame) { tween(cupGraphics, { rotation: -0.3, scaleX: 1.2, scaleY: 1.2 }, { duration: 200, easing: tween.easeOut }); } } else { self.velocityY += self.gravity; // Return to normal when not rising if (self.wasRisingLastFrame) { tween(cupGraphics, { rotation: 0, scaleX: 1.0, scaleY: 1.0 }, { duration: 300, easing: tween.easeOut }); } } self.wasRisingLastFrame = wasRising; self.velocityY = Math.max(-15, Math.min(15, self.velocityY)); self.y += self.velocityY; if (self.y < 100) { self.y = 100; self.velocityY = 0; } if (self.y > 2632) { self.y = 2632; self.velocityY = 0; } if (self.isInvincible) { self.invincibleTimer--; cupGraphics.alpha = self.invincibleTimer % 10 < 5 ? 0.5 : 1.0; if (self.invincibleTimer <= 0) { self.isInvincible = false; cupGraphics.alpha = 1.0; } } }; self.makeInvincible = function () { self.isInvincible = true; self.invincibleTimer = 300; }; return self; }); var CoffeeDrop = Container.expand(function () { var self = Container.call(this); var dropGraphics = self.attachAsset('regularBean', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.6, tint: 0x8B4513 }); self.speed = Math.random() * 3 + 2; self.alpha = Math.random() * 0.5 + 0.3; dropGraphics.alpha = self.alpha; self.update = function () { self.y += self.speed; dropGraphics.rotation += 0.05; }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8, tint: 0x8B0000 }); self.speed = -6; self.health = 2; self.moveDirection = 1; self.verticalSpeed = 2; self.maxHealth = 2; self.type = 'enemy'; self.scoreValue = 25; self.pulseTimer = 0; self.lastDamageTime = 0; self.isDamaged = false; self.update = function () { self.x += self.speed; self.y += self.moveDirection * self.verticalSpeed; if (self.y <= 200) { self.y = 200; self.moveDirection = 1; } if (self.y >= 2500) { self.y = 2500; self.moveDirection = -1; } enemyGraphics.rotation += 0.05; // Add pulsing effect based on health self.pulseTimer += 0.1; var healthRatio = self.health / self.maxHealth; var pulseScale = 0.8 + Math.sin(self.pulseTimer) * 0.1 * (1 - healthRatio); enemyGraphics.scaleX = pulseScale; enemyGraphics.scaleY = pulseScale; // Handle damage visual effects if (self.isDamaged) { var damageTime = LK.ticks - self.lastDamageTime; if (damageTime > 30) { self.isDamaged = false; enemyGraphics.tint = 0x8B0000; } } }; self.takeDamage = function () { self.health--; self.isDamaged = true; self.lastDamageTime = LK.ticks; enemyGraphics.tint = 0xFF0000; LK.effects.flashObject(self, 0xFFFFFF, 200); }; self.getScoreValue = function () { return self.scoreValue; }; self.isDestroyed = function () { return self.health <= 0; }; return self; }); var FallingObject = Container.expand(function () { var self = Container.call(this); var objectGraphics = self.attachAsset('regularBean', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, tint: 0xFF4500 }); self.velocityX = -6; self.velocityY = 2; self.gravity = 0.5; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; self.velocityY += self.gravity; objectGraphics.rotation += 0.2; }; return self; }); var GoldenBean = Container.expand(function () { var self = Container.call(this); var beanGraphics = self.attachAsset('goldenBean', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -8; self.collected = false; self.pulseTimer = 0; self.update = function () { self.x += self.speed; beanGraphics.rotation += 0.15; self.pulseTimer += 0.2; var scale = 1 + Math.sin(self.pulseTimer) * 0.2; beanGraphics.scaleX = scale; beanGraphics.scaleY = scale; }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -8; self.update = function () { self.x += self.speed; }; return self; }); var RegularBean = Container.expand(function () { var self = Container.call(this); var beanGraphics = self.attachAsset('regularBean', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -8; self.collected = false; self.update = function () { self.x += self.speed; beanGraphics.rotation += 0.1; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ game.setBackgroundColor(0x87CEEB); // Game state var gameState = 'menu'; // 'menu' or 'playing' var menuContainer; var titleText; var playButton; var instructionsText; // Game variables var coffeeCup; var regularBeans = []; var goldenBeans = []; var obstacles = []; var gameSpeed = 1; var spawnTimer = 0; var goldenBeanTimer = 0; var highScore = storage.highScore || 0; var bossActive = false; var boss = null; var bossHealth = 5; var enemies = []; var enemySpawnTimer = 0; var fallingObjects = []; var bossSpawnTimer = 0; var lives = 3; var energy = 100; var maxEnergy = 100; var energyDecayRate = 0.2; var bullets = []; var shootButton; var coffeeDrops = []; var dropSpawnTimer = 0; // UI elements var scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var highScoreTxt = new Text2('Best: ' + highScore, { size: 60, fill: 0xFFFF00 }); highScoreTxt.anchor.set(1, 0); highScoreTxt.x = -50; highScoreTxt.y = 100; LK.gui.topRight.addChild(highScoreTxt); var livesTxt = new Text2('Lives: ' + lives, { size: 60, fill: 0xFF69B4 }); livesTxt.anchor.set(0, 0); livesTxt.x = 50; livesTxt.y = 100; LK.gui.topLeft.addChild(livesTxt); var bossHealthTxt = new Text2('Boss Health: 5', { size: 60, fill: 0xFF0000 }); bossHealthTxt.anchor.set(0.5, 0); bossHealthTxt.x = 0; bossHealthTxt.y = 200; bossHealthTxt.visible = false; LK.gui.top.addChild(bossHealthTxt); var energyTxt = new Text2('Energy: 100', { size: 60, fill: 0x00FF00 }); energyTxt.anchor.set(0, 0); energyTxt.x = 50; energyTxt.y = 180; LK.gui.topLeft.addChild(energyTxt); // Create shoot button var shootButtonGraphic = LK.getAsset('regularBean', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2, tint: 0xFF4500 }); shootButton = LK.gui.bottomRight.addChild(shootButtonGraphic); shootButton.x = -150; shootButton.y = -150; var shootButtonText = new Text2('SHOOT', { size: 40, fill: 0xFFFFFF }); shootButtonText.anchor.set(0.5, 0.5); shootButton.addChild(shootButtonText); // Add shoot button event handler shootButton.down = function (x, y, obj) { shootBullet(); }; // Input handling game.down = function (x, y, obj) { if (gameState === 'menu') { // Handle menu interactions - check if play button was clicked if (playButton && Math.abs(x - playButton.x) < 100 && Math.abs(y - playButton.y) < 100) { startGame(); } return; } if (gameState === 'playing' && coffeeCup) { // Check if shoot button was pressed var globalPos = game.toGlobal({ x: 0, y: 0 }); var guiPos = LK.gui.toGlobal({ x: 0, y: 0 }); var buttonWorldX = guiPos.x + LK.gui.bottomRight.x + shootButton.x; var buttonWorldY = guiPos.y + LK.gui.bottomRight.y + shootButton.y; var gameWorldX = globalPos.x + x; var gameWorldY = globalPos.y + y; var buttonDistance = Math.sqrt((gameWorldX - buttonWorldX) * (gameWorldX - buttonWorldX) + (gameWorldY - buttonWorldY) * (gameWorldY - buttonWorldY)); if (buttonDistance < 80) { shootBullet(); } else { coffeeCup.isRising = true; } } }; game.up = function (x, y, obj) { if (gameState === 'playing' && coffeeCup) { coffeeCup.isRising = false; } }; // Spawn functions function spawnRegularBean() { var bean = new RegularBean(); bean.x = 2200; bean.y = Math.random() * 2400 + 200; regularBeans.push(bean); game.addChild(bean); } function spawnGoldenBean() { var bean = new GoldenBean(); bean.x = 2200; bean.y = Math.random() * 2400 + 200; goldenBeans.push(bean); game.addChild(bean); } function spawnObstacle() { var obstacle = new Obstacle(); obstacle.x = 2200; obstacle.y = Math.random() * 2000 + 400; obstacles.push(obstacle); game.addChild(obstacle); } function spawnBoss() { var boss = new Boss(); game.addChild(boss); return boss; } function spawnFallingObject() { var obj = new FallingObject(); obj.x = 1800 + Math.random() * 200 - 100; obj.y = 200; fallingObjects.push(obj); game.addChild(obj); } function spawnEnemy() { var enemy = new Enemy(); enemy.x = 2200; enemy.y = Math.random() * 2000 + 400; enemies.push(enemy); game.addChild(enemy); } function spawnCoffeeDrop() { var drop = new CoffeeDrop(); drop.x = Math.random() * 2048; drop.y = -50; coffeeDrops.push(drop); game.addChild(drop); } function shootBullet() { if (gameState !== 'playing' || !coffeeCup) { return; } var bullet = new Bullet(); bullet.x = coffeeCup.x + 100; bullet.y = coffeeCup.y; bullets.push(bullet); game.addChild(bullet); } // Main game loop game.update = function () { // Always update coffee waterfall background dropSpawnTimer++; if (dropSpawnTimer % 5 === 0) { spawnCoffeeDrop(); } for (var d = coffeeDrops.length - 1; d >= 0; d--) { var drop = coffeeDrops[d]; if (drop.y > 2800) { drop.destroy(); coffeeDrops.splice(d, 1); } } // Only run game logic when in playing state if (gameState !== 'playing') { return; } // Check for boss activation at score 1000 if (LK.getScore() >= 1000 && !bossActive) { bossActive = true; boss = spawnBoss(); bossHealth = boss.health; // Clear existing elements when boss appears for (var clear = obstacles.length - 1; clear >= 0; clear--) { obstacles[clear].destroy(); obstacles.splice(clear, 1); } for (var clearBeans = regularBeans.length - 1; clearBeans >= 0; clearBeans--) { regularBeans[clearBeans].destroy(); regularBeans.splice(clearBeans, 1); } for (var clearEnemies = enemies.length - 1; clearEnemies >= 0; clearEnemies--) { enemies[clearEnemies].destroy(); enemies.splice(clearEnemies, 1); } LK.effects.flashScreen(0x8B0000, 1000); } if (!bossActive) { // Update game speed gameSpeed = 1 + LK.getScore() / 100 * 0.5; // Update spawn timers spawnTimer++; goldenBeanTimer++; enemySpawnTimer++; // Spawn regular beans if (spawnTimer % Math.max(30, 60 - Math.floor(LK.getScore() / 10)) === 0) { spawnRegularBean(); } // Spawn obstacles if (spawnTimer % Math.max(80, 120 - Math.floor(LK.getScore() / 5)) === 0) { spawnObstacle(); } // Spawn enemies if (enemySpawnTimer % Math.max(100, 180 - Math.floor(LK.getScore() / 8)) === 0) { spawnEnemy(); } // Spawn golden bean (rare) if (goldenBeanTimer > 600 && Math.random() < 0.01) { spawnGoldenBean(); goldenBeanTimer = 0; } bossHealthTxt.visible = false; } else { // Show boss health during boss battle bossHealthTxt.visible = true; bossHealthTxt.setText('Boss Health: ' + bossHealth); } // Update and check regular beans for (var i = regularBeans.length - 1; i >= 0; i--) { var bean = regularBeans[i]; if (bean.x < -100) { bean.destroy(); regularBeans.splice(i, 1); continue; } if (!bean.collected && bean.intersects(coffeeCup)) { bean.collected = true; LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); // Restore energy when collecting beans energy = Math.min(maxEnergy, energy + 20); energyTxt.setText('Energy: ' + Math.floor(energy)); // Update energy color based on level if (energy > 60) { energyTxt.fill = 0x00FF00; // Green } else if (energy > 30) { energyTxt.fill = 0xFFFF00; // Yellow } else { energyTxt.fill = 0xFF0000; // Red } LK.getSound('collectBean').play(); LK.effects.flashObject(bean, 0xFFFFFF, 200); tween(bean, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 200, onFinish: function onFinish() { bean.destroy(); } }); regularBeans.splice(i, 1); } } // Update and check golden beans for (var j = goldenBeans.length - 1; j >= 0; j--) { var goldenBean = goldenBeans[j]; if (goldenBean.x < -100) { goldenBean.destroy(); goldenBeans.splice(j, 1); continue; } if (!goldenBean.collected && goldenBean.intersects(coffeeCup)) { goldenBean.collected = true; LK.setScore(LK.getScore() + 100); scoreTxt.setText('Score: ' + LK.getScore()); // Restore significant energy when collecting golden beans energy = maxEnergy; energyTxt.setText('Energy: ' + Math.floor(energy)); energyTxt.fill = 0x00FF00; // Green LK.getSound('collectGolden').play(); LK.effects.flashScreen(0xFFD700, 500); coffeeCup.makeInvincible(); tween(goldenBean, { alpha: 0, scaleX: 3, scaleY: 3 }, { duration: 500, onFinish: function onFinish() { goldenBean.destroy(); } }); goldenBeans.splice(j, 1); } } // Update and check obstacles for (var k = obstacles.length - 1; k >= 0; k--) { var obstacle = obstacles[k]; if (obstacle.x < -100) { obstacle.destroy(); obstacles.splice(k, 1); continue; } if (!coffeeCup.isInvincible && obstacle.intersects(coffeeCup)) { lives--; livesTxt.setText('Lives: ' + lives); coffeeCup.makeInvincible(); LK.effects.flashScreen(0xFF0000, 500); obstacle.destroy(); obstacles.splice(k, 1); if (lives <= 0) { // Update high score if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; } LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } break; } } // Update and check enemies for (var e = enemies.length - 1; e >= 0; e--) { var enemy = enemies[e]; if (enemy.x < -100) { enemy.destroy(); enemies.splice(e, 1); continue; } // Check collision with coffee cup if (!coffeeCup.isInvincible && enemy.intersects(coffeeCup)) { lives--; livesTxt.setText('Lives: ' + lives); coffeeCup.makeInvincible(); LK.effects.flashScreen(0xFF0000, 500); // Enemy takes damage when hitting player (self-destructive attack) enemy.takeDamage(); if (enemy.isDestroyed()) { enemy.destroy(); enemies.splice(e, 1); } if (lives <= 0) { // Update high score if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; } LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } break; } } // Update speed for all moving objects for (var l = 0; l < regularBeans.length; l++) { regularBeans[l].speed = -8 * gameSpeed; } for (var m = 0; m < goldenBeans.length; m++) { goldenBeans[m].speed = -8 * gameSpeed; } for (var n = 0; n < obstacles.length; n++) { obstacles[n].speed = -8 * gameSpeed; } for (var p = 0; p < enemies.length; p++) { enemies[p].speed = -6 * gameSpeed; } // Handle falling objects during boss battle if (bossActive) { for (var f = fallingObjects.length - 1; f >= 0; f--) { var fallingObj = fallingObjects[f]; if (fallingObj.y > 2800 || fallingObj.x < -100) { fallingObj.destroy(); fallingObjects.splice(f, 1); continue; } // Check collision with coffee cup if (fallingObj.intersects(coffeeCup) && !coffeeCup.isInvincible) { lives--; livesTxt.setText('Lives: ' + lives); coffeeCup.makeInvincible(); LK.effects.flashScreen(0xFF0000, 500); fallingObj.destroy(); fallingObjects.splice(f, 1); if (lives <= 0) { // Update high score if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; } LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } break; } // Check if falling object hits boss (coffee cup can throw objects at boss) if (fallingObj.intersects(boss) && fallingObj.velocityX < 0) { boss.health--; bossHealth = boss.health; LK.effects.flashObject(boss, 0xFF0000, 300); // Add screen shake effect when boss is hit tween(game, { x: Math.random() * 20 - 10, y: Math.random() * 20 - 10 }, { duration: 100, onFinish: function onFinish() { tween(game, { x: 0, y: 0 }, { duration: 100 }); } }); fallingObj.destroy(); fallingObjects.splice(f, 1); if (bossHealth <= 0) { // Boss defeated LK.setScore(LK.getScore() + 500); scoreTxt.setText('Score: ' + LK.getScore()); boss.destroy(); bossActive = false; boss = null; LK.effects.flashScreen(0x00FF00, 1000); LK.showYouWin(); } } } } // Update and check bullets for (var b = bullets.length - 1; b >= 0; b--) { var bullet = bullets[b]; if (bullet.x > 2200) { bullet.destroy(); bullets.splice(b, 1); continue; } // Check bullet collision with obstacles for (var o = obstacles.length - 1; o >= 0; o--) { if (bullet.intersects(obstacles[o])) { LK.effects.flashObject(obstacles[o], 0xFFFFFF, 200); obstacles[o].destroy(); obstacles.splice(o, 1); bullet.destroy(); bullets.splice(b, 1); LK.setScore(LK.getScore() + 50); scoreTxt.setText('Score: ' + LK.getScore()); break; } } // Check bullet collision with enemies for (var en = enemies.length - 1; en >= 0; en--) { if (bullet.intersects(enemies[en])) { enemies[en].takeDamage(); if (enemies[en].isDestroyed()) { LK.setScore(LK.getScore() + enemies[en].getScoreValue()); scoreTxt.setText('Score: ' + LK.getScore()); enemies[en].destroy(); enemies.splice(en, 1); } bullet.destroy(); bullets.splice(b, 1); break; } } // Check bullet collision with boss if (bossActive && boss && bullet.intersects(boss)) { boss.health--; bossHealth = boss.health; LK.effects.flashObject(boss, 0xFF0000, 300); bullet.destroy(); bullets.splice(b, 1); if (bossHealth <= 0) { LK.setScore(LK.getScore() + 500); scoreTxt.setText('Score: ' + LK.getScore()); boss.destroy(); bossActive = false; boss = null; LK.effects.flashScreen(0x00FF00, 1000); LK.showYouWin(); } } } if (!bossActive) { energy -= energyDecayRate; energy = Math.max(0, energy); energyTxt.setText('Energy: ' + Math.floor(energy)); if (energy > 60) { energyTxt.fill = 0x00FF00; // Green } else if (energy > 30) { energyTxt.fill = 0xFFFF00; // Yellow } else { energyTxt.fill = 0xFF0000; // Red } // Game over when energy reaches zero if (energy <= 0) { // Update high score if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; } LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } } }; // Create main menu function createMainMenu() { menuContainer = game.addChild(new Container()); // Title text titleText = new Text2('COFFEE RUNNER', { size: 150, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 800; menuContainer.addChild(titleText); // Play button var playButtonGraphic = LK.getAsset('coffeeCup', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); playButton = menuContainer.addChild(playButtonGraphic); playButton.x = 1024; playButton.y = 1400; var playButtonText = new Text2('PLAY', { size: 80, fill: 0x000000 }); playButtonText.anchor.set(0.5, 0.5); playButton.addChild(playButtonText); // Instructions text instructionsText = new Text2('Tap to fly • Collect beans • Avoid obstacles', { size: 60, fill: 0xFFFFFF }); instructionsText.anchor.set(0.5, 0.5); instructionsText.x = 1024; instructionsText.y = 1800; menuContainer.addChild(instructionsText); // High score display var menuHighScoreText = new Text2('Best Score: ' + highScore, { size: 80, fill: 0xFFD700 }); menuHighScoreText.anchor.set(0.5, 0.5); menuHighScoreText.x = 1024; menuHighScoreText.y = 1200; menuContainer.addChild(menuHighScoreText); // Play button event handler playButton.down = function (x, y, obj) { startGame(); }; } function startGame() { if (gameState !== 'menu') return; gameState = 'playing'; // Hide menu if (menuContainer) { menuContainer.destroy(); menuContainer = null; } // Initialize coffee cup coffeeCup = game.addChild(new CoffeeCup()); coffeeCup.x = 400; coffeeCup.y = 1366; // Reset game variables LK.setScore(0); scoreTxt.setText('Score: 0'); lives = 3; livesTxt.setText('Lives: ' + lives); energy = 100; energyTxt.setText('Energy: 100'); energyTxt.fill = 0x00FF00; gameSpeed = 1; spawnTimer = 0; goldenBeanTimer = 0; bossActive = false; boss = null; bossHealth = 5; // Clear any existing game objects regularBeans = []; goldenBeans = []; obstacles = []; enemies = []; fallingObjects = []; bullets = []; // Keep coffee drops for background effect } // Initialize main menu createMainMenu();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 3,
scaleY: 1.5,
tint: 0x8B0000
});
self.health = 5;
self.x = 1800;
self.y = 500;
self.moveDirection = 1;
self.speed = 3;
self.lastSpawnTime = 0;
self.update = function () {
self.y += self.moveDirection * self.speed;
if (self.y <= 300) {
self.y = 300;
self.moveDirection = 1;
}
if (self.y >= 2400) {
self.y = 2400;
self.moveDirection = -1;
}
// Spawn falling objects every 60 frames
if (LK.ticks - self.lastSpawnTime > 60) {
spawnFallingObject();
self.lastSpawnTime = LK.ticks;
}
};
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('regularBean', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8,
tint: 0x8B4513
});
self.speed = 12;
self.update = function () {
self.x += self.speed;
bulletGraphics.rotation += 0.3;
};
return self;
});
var CoffeeCup = Container.expand(function () {
var self = Container.call(this);
var cupGraphics = self.attachAsset('coffeeCup', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityY = 0;
self.gravity = 0.8;
self.jumpForce = -12;
self.isRising = false;
self.isInvincible = false;
self.invincibleTimer = 0;
self.wasRisingLastFrame = false;
self.update = function () {
var wasRising = self.isRising;
if (self.isRising) {
self.velocityY += self.jumpForce * 0.3;
// Add flying animation when starting to rise
if (!self.wasRisingLastFrame) {
tween(cupGraphics, {
rotation: -0.3,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut
});
}
} else {
self.velocityY += self.gravity;
// Return to normal when not rising
if (self.wasRisingLastFrame) {
tween(cupGraphics, {
rotation: 0,
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 300,
easing: tween.easeOut
});
}
}
self.wasRisingLastFrame = wasRising;
self.velocityY = Math.max(-15, Math.min(15, self.velocityY));
self.y += self.velocityY;
if (self.y < 100) {
self.y = 100;
self.velocityY = 0;
}
if (self.y > 2632) {
self.y = 2632;
self.velocityY = 0;
}
if (self.isInvincible) {
self.invincibleTimer--;
cupGraphics.alpha = self.invincibleTimer % 10 < 5 ? 0.5 : 1.0;
if (self.invincibleTimer <= 0) {
self.isInvincible = false;
cupGraphics.alpha = 1.0;
}
}
};
self.makeInvincible = function () {
self.isInvincible = true;
self.invincibleTimer = 300;
};
return self;
});
var CoffeeDrop = Container.expand(function () {
var self = Container.call(this);
var dropGraphics = self.attachAsset('regularBean', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.3,
scaleY: 0.6,
tint: 0x8B4513
});
self.speed = Math.random() * 3 + 2;
self.alpha = Math.random() * 0.5 + 0.3;
dropGraphics.alpha = self.alpha;
self.update = function () {
self.y += self.speed;
dropGraphics.rotation += 0.05;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8,
tint: 0x8B0000
});
self.speed = -6;
self.health = 2;
self.moveDirection = 1;
self.verticalSpeed = 2;
self.maxHealth = 2;
self.type = 'enemy';
self.scoreValue = 25;
self.pulseTimer = 0;
self.lastDamageTime = 0;
self.isDamaged = false;
self.update = function () {
self.x += self.speed;
self.y += self.moveDirection * self.verticalSpeed;
if (self.y <= 200) {
self.y = 200;
self.moveDirection = 1;
}
if (self.y >= 2500) {
self.y = 2500;
self.moveDirection = -1;
}
enemyGraphics.rotation += 0.05;
// Add pulsing effect based on health
self.pulseTimer += 0.1;
var healthRatio = self.health / self.maxHealth;
var pulseScale = 0.8 + Math.sin(self.pulseTimer) * 0.1 * (1 - healthRatio);
enemyGraphics.scaleX = pulseScale;
enemyGraphics.scaleY = pulseScale;
// Handle damage visual effects
if (self.isDamaged) {
var damageTime = LK.ticks - self.lastDamageTime;
if (damageTime > 30) {
self.isDamaged = false;
enemyGraphics.tint = 0x8B0000;
}
}
};
self.takeDamage = function () {
self.health--;
self.isDamaged = true;
self.lastDamageTime = LK.ticks;
enemyGraphics.tint = 0xFF0000;
LK.effects.flashObject(self, 0xFFFFFF, 200);
};
self.getScoreValue = function () {
return self.scoreValue;
};
self.isDestroyed = function () {
return self.health <= 0;
};
return self;
});
var FallingObject = Container.expand(function () {
var self = Container.call(this);
var objectGraphics = self.attachAsset('regularBean', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5,
tint: 0xFF4500
});
self.velocityX = -6;
self.velocityY = 2;
self.gravity = 0.5;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityY += self.gravity;
objectGraphics.rotation += 0.2;
};
return self;
});
var GoldenBean = Container.expand(function () {
var self = Container.call(this);
var beanGraphics = self.attachAsset('goldenBean', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -8;
self.collected = false;
self.pulseTimer = 0;
self.update = function () {
self.x += self.speed;
beanGraphics.rotation += 0.15;
self.pulseTimer += 0.2;
var scale = 1 + Math.sin(self.pulseTimer) * 0.2;
beanGraphics.scaleX = scale;
beanGraphics.scaleY = scale;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -8;
self.update = function () {
self.x += self.speed;
};
return self;
});
var RegularBean = Container.expand(function () {
var self = Container.call(this);
var beanGraphics = self.attachAsset('regularBean', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -8;
self.collected = false;
self.update = function () {
self.x += self.speed;
beanGraphics.rotation += 0.1;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
game.setBackgroundColor(0x87CEEB);
// Game state
var gameState = 'menu'; // 'menu' or 'playing'
var menuContainer;
var titleText;
var playButton;
var instructionsText;
// Game variables
var coffeeCup;
var regularBeans = [];
var goldenBeans = [];
var obstacles = [];
var gameSpeed = 1;
var spawnTimer = 0;
var goldenBeanTimer = 0;
var highScore = storage.highScore || 0;
var bossActive = false;
var boss = null;
var bossHealth = 5;
var enemies = [];
var enemySpawnTimer = 0;
var fallingObjects = [];
var bossSpawnTimer = 0;
var lives = 3;
var energy = 100;
var maxEnergy = 100;
var energyDecayRate = 0.2;
var bullets = [];
var shootButton;
var coffeeDrops = [];
var dropSpawnTimer = 0;
// UI elements
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var highScoreTxt = new Text2('Best: ' + highScore, {
size: 60,
fill: 0xFFFF00
});
highScoreTxt.anchor.set(1, 0);
highScoreTxt.x = -50;
highScoreTxt.y = 100;
LK.gui.topRight.addChild(highScoreTxt);
var livesTxt = new Text2('Lives: ' + lives, {
size: 60,
fill: 0xFF69B4
});
livesTxt.anchor.set(0, 0);
livesTxt.x = 50;
livesTxt.y = 100;
LK.gui.topLeft.addChild(livesTxt);
var bossHealthTxt = new Text2('Boss Health: 5', {
size: 60,
fill: 0xFF0000
});
bossHealthTxt.anchor.set(0.5, 0);
bossHealthTxt.x = 0;
bossHealthTxt.y = 200;
bossHealthTxt.visible = false;
LK.gui.top.addChild(bossHealthTxt);
var energyTxt = new Text2('Energy: 100', {
size: 60,
fill: 0x00FF00
});
energyTxt.anchor.set(0, 0);
energyTxt.x = 50;
energyTxt.y = 180;
LK.gui.topLeft.addChild(energyTxt);
// Create shoot button
var shootButtonGraphic = LK.getAsset('regularBean', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2,
tint: 0xFF4500
});
shootButton = LK.gui.bottomRight.addChild(shootButtonGraphic);
shootButton.x = -150;
shootButton.y = -150;
var shootButtonText = new Text2('SHOOT', {
size: 40,
fill: 0xFFFFFF
});
shootButtonText.anchor.set(0.5, 0.5);
shootButton.addChild(shootButtonText);
// Add shoot button event handler
shootButton.down = function (x, y, obj) {
shootBullet();
};
// Input handling
game.down = function (x, y, obj) {
if (gameState === 'menu') {
// Handle menu interactions - check if play button was clicked
if (playButton && Math.abs(x - playButton.x) < 100 && Math.abs(y - playButton.y) < 100) {
startGame();
}
return;
}
if (gameState === 'playing' && coffeeCup) {
// Check if shoot button was pressed
var globalPos = game.toGlobal({
x: 0,
y: 0
});
var guiPos = LK.gui.toGlobal({
x: 0,
y: 0
});
var buttonWorldX = guiPos.x + LK.gui.bottomRight.x + shootButton.x;
var buttonWorldY = guiPos.y + LK.gui.bottomRight.y + shootButton.y;
var gameWorldX = globalPos.x + x;
var gameWorldY = globalPos.y + y;
var buttonDistance = Math.sqrt((gameWorldX - buttonWorldX) * (gameWorldX - buttonWorldX) + (gameWorldY - buttonWorldY) * (gameWorldY - buttonWorldY));
if (buttonDistance < 80) {
shootBullet();
} else {
coffeeCup.isRising = true;
}
}
};
game.up = function (x, y, obj) {
if (gameState === 'playing' && coffeeCup) {
coffeeCup.isRising = false;
}
};
// Spawn functions
function spawnRegularBean() {
var bean = new RegularBean();
bean.x = 2200;
bean.y = Math.random() * 2400 + 200;
regularBeans.push(bean);
game.addChild(bean);
}
function spawnGoldenBean() {
var bean = new GoldenBean();
bean.x = 2200;
bean.y = Math.random() * 2400 + 200;
goldenBeans.push(bean);
game.addChild(bean);
}
function spawnObstacle() {
var obstacle = new Obstacle();
obstacle.x = 2200;
obstacle.y = Math.random() * 2000 + 400;
obstacles.push(obstacle);
game.addChild(obstacle);
}
function spawnBoss() {
var boss = new Boss();
game.addChild(boss);
return boss;
}
function spawnFallingObject() {
var obj = new FallingObject();
obj.x = 1800 + Math.random() * 200 - 100;
obj.y = 200;
fallingObjects.push(obj);
game.addChild(obj);
}
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = 2200;
enemy.y = Math.random() * 2000 + 400;
enemies.push(enemy);
game.addChild(enemy);
}
function spawnCoffeeDrop() {
var drop = new CoffeeDrop();
drop.x = Math.random() * 2048;
drop.y = -50;
coffeeDrops.push(drop);
game.addChild(drop);
}
function shootBullet() {
if (gameState !== 'playing' || !coffeeCup) {
return;
}
var bullet = new Bullet();
bullet.x = coffeeCup.x + 100;
bullet.y = coffeeCup.y;
bullets.push(bullet);
game.addChild(bullet);
}
// Main game loop
game.update = function () {
// Always update coffee waterfall background
dropSpawnTimer++;
if (dropSpawnTimer % 5 === 0) {
spawnCoffeeDrop();
}
for (var d = coffeeDrops.length - 1; d >= 0; d--) {
var drop = coffeeDrops[d];
if (drop.y > 2800) {
drop.destroy();
coffeeDrops.splice(d, 1);
}
}
// Only run game logic when in playing state
if (gameState !== 'playing') {
return;
}
// Check for boss activation at score 1000
if (LK.getScore() >= 1000 && !bossActive) {
bossActive = true;
boss = spawnBoss();
bossHealth = boss.health;
// Clear existing elements when boss appears
for (var clear = obstacles.length - 1; clear >= 0; clear--) {
obstacles[clear].destroy();
obstacles.splice(clear, 1);
}
for (var clearBeans = regularBeans.length - 1; clearBeans >= 0; clearBeans--) {
regularBeans[clearBeans].destroy();
regularBeans.splice(clearBeans, 1);
}
for (var clearEnemies = enemies.length - 1; clearEnemies >= 0; clearEnemies--) {
enemies[clearEnemies].destroy();
enemies.splice(clearEnemies, 1);
}
LK.effects.flashScreen(0x8B0000, 1000);
}
if (!bossActive) {
// Update game speed
gameSpeed = 1 + LK.getScore() / 100 * 0.5;
// Update spawn timers
spawnTimer++;
goldenBeanTimer++;
enemySpawnTimer++;
// Spawn regular beans
if (spawnTimer % Math.max(30, 60 - Math.floor(LK.getScore() / 10)) === 0) {
spawnRegularBean();
}
// Spawn obstacles
if (spawnTimer % Math.max(80, 120 - Math.floor(LK.getScore() / 5)) === 0) {
spawnObstacle();
}
// Spawn enemies
if (enemySpawnTimer % Math.max(100, 180 - Math.floor(LK.getScore() / 8)) === 0) {
spawnEnemy();
}
// Spawn golden bean (rare)
if (goldenBeanTimer > 600 && Math.random() < 0.01) {
spawnGoldenBean();
goldenBeanTimer = 0;
}
bossHealthTxt.visible = false;
} else {
// Show boss health during boss battle
bossHealthTxt.visible = true;
bossHealthTxt.setText('Boss Health: ' + bossHealth);
}
// Update and check regular beans
for (var i = regularBeans.length - 1; i >= 0; i--) {
var bean = regularBeans[i];
if (bean.x < -100) {
bean.destroy();
regularBeans.splice(i, 1);
continue;
}
if (!bean.collected && bean.intersects(coffeeCup)) {
bean.collected = true;
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
// Restore energy when collecting beans
energy = Math.min(maxEnergy, energy + 20);
energyTxt.setText('Energy: ' + Math.floor(energy));
// Update energy color based on level
if (energy > 60) {
energyTxt.fill = 0x00FF00; // Green
} else if (energy > 30) {
energyTxt.fill = 0xFFFF00; // Yellow
} else {
energyTxt.fill = 0xFF0000; // Red
}
LK.getSound('collectBean').play();
LK.effects.flashObject(bean, 0xFFFFFF, 200);
tween(bean, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 200,
onFinish: function onFinish() {
bean.destroy();
}
});
regularBeans.splice(i, 1);
}
}
// Update and check golden beans
for (var j = goldenBeans.length - 1; j >= 0; j--) {
var goldenBean = goldenBeans[j];
if (goldenBean.x < -100) {
goldenBean.destroy();
goldenBeans.splice(j, 1);
continue;
}
if (!goldenBean.collected && goldenBean.intersects(coffeeCup)) {
goldenBean.collected = true;
LK.setScore(LK.getScore() + 100);
scoreTxt.setText('Score: ' + LK.getScore());
// Restore significant energy when collecting golden beans
energy = maxEnergy;
energyTxt.setText('Energy: ' + Math.floor(energy));
energyTxt.fill = 0x00FF00; // Green
LK.getSound('collectGolden').play();
LK.effects.flashScreen(0xFFD700, 500);
coffeeCup.makeInvincible();
tween(goldenBean, {
alpha: 0,
scaleX: 3,
scaleY: 3
}, {
duration: 500,
onFinish: function onFinish() {
goldenBean.destroy();
}
});
goldenBeans.splice(j, 1);
}
}
// Update and check obstacles
for (var k = obstacles.length - 1; k >= 0; k--) {
var obstacle = obstacles[k];
if (obstacle.x < -100) {
obstacle.destroy();
obstacles.splice(k, 1);
continue;
}
if (!coffeeCup.isInvincible && obstacle.intersects(coffeeCup)) {
lives--;
livesTxt.setText('Lives: ' + lives);
coffeeCup.makeInvincible();
LK.effects.flashScreen(0xFF0000, 500);
obstacle.destroy();
obstacles.splice(k, 1);
if (lives <= 0) {
// Update high score
if (LK.getScore() > highScore) {
highScore = LK.getScore();
storage.highScore = highScore;
}
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
}
break;
}
}
// Update and check enemies
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
if (enemy.x < -100) {
enemy.destroy();
enemies.splice(e, 1);
continue;
}
// Check collision with coffee cup
if (!coffeeCup.isInvincible && enemy.intersects(coffeeCup)) {
lives--;
livesTxt.setText('Lives: ' + lives);
coffeeCup.makeInvincible();
LK.effects.flashScreen(0xFF0000, 500);
// Enemy takes damage when hitting player (self-destructive attack)
enemy.takeDamage();
if (enemy.isDestroyed()) {
enemy.destroy();
enemies.splice(e, 1);
}
if (lives <= 0) {
// Update high score
if (LK.getScore() > highScore) {
highScore = LK.getScore();
storage.highScore = highScore;
}
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
}
break;
}
}
// Update speed for all moving objects
for (var l = 0; l < regularBeans.length; l++) {
regularBeans[l].speed = -8 * gameSpeed;
}
for (var m = 0; m < goldenBeans.length; m++) {
goldenBeans[m].speed = -8 * gameSpeed;
}
for (var n = 0; n < obstacles.length; n++) {
obstacles[n].speed = -8 * gameSpeed;
}
for (var p = 0; p < enemies.length; p++) {
enemies[p].speed = -6 * gameSpeed;
}
// Handle falling objects during boss battle
if (bossActive) {
for (var f = fallingObjects.length - 1; f >= 0; f--) {
var fallingObj = fallingObjects[f];
if (fallingObj.y > 2800 || fallingObj.x < -100) {
fallingObj.destroy();
fallingObjects.splice(f, 1);
continue;
}
// Check collision with coffee cup
if (fallingObj.intersects(coffeeCup) && !coffeeCup.isInvincible) {
lives--;
livesTxt.setText('Lives: ' + lives);
coffeeCup.makeInvincible();
LK.effects.flashScreen(0xFF0000, 500);
fallingObj.destroy();
fallingObjects.splice(f, 1);
if (lives <= 0) {
// Update high score
if (LK.getScore() > highScore) {
highScore = LK.getScore();
storage.highScore = highScore;
}
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
}
break;
}
// Check if falling object hits boss (coffee cup can throw objects at boss)
if (fallingObj.intersects(boss) && fallingObj.velocityX < 0) {
boss.health--;
bossHealth = boss.health;
LK.effects.flashObject(boss, 0xFF0000, 300);
// Add screen shake effect when boss is hit
tween(game, {
x: Math.random() * 20 - 10,
y: Math.random() * 20 - 10
}, {
duration: 100,
onFinish: function onFinish() {
tween(game, {
x: 0,
y: 0
}, {
duration: 100
});
}
});
fallingObj.destroy();
fallingObjects.splice(f, 1);
if (bossHealth <= 0) {
// Boss defeated
LK.setScore(LK.getScore() + 500);
scoreTxt.setText('Score: ' + LK.getScore());
boss.destroy();
bossActive = false;
boss = null;
LK.effects.flashScreen(0x00FF00, 1000);
LK.showYouWin();
}
}
}
}
// Update and check bullets
for (var b = bullets.length - 1; b >= 0; b--) {
var bullet = bullets[b];
if (bullet.x > 2200) {
bullet.destroy();
bullets.splice(b, 1);
continue;
}
// Check bullet collision with obstacles
for (var o = obstacles.length - 1; o >= 0; o--) {
if (bullet.intersects(obstacles[o])) {
LK.effects.flashObject(obstacles[o], 0xFFFFFF, 200);
obstacles[o].destroy();
obstacles.splice(o, 1);
bullet.destroy();
bullets.splice(b, 1);
LK.setScore(LK.getScore() + 50);
scoreTxt.setText('Score: ' + LK.getScore());
break;
}
}
// Check bullet collision with enemies
for (var en = enemies.length - 1; en >= 0; en--) {
if (bullet.intersects(enemies[en])) {
enemies[en].takeDamage();
if (enemies[en].isDestroyed()) {
LK.setScore(LK.getScore() + enemies[en].getScoreValue());
scoreTxt.setText('Score: ' + LK.getScore());
enemies[en].destroy();
enemies.splice(en, 1);
}
bullet.destroy();
bullets.splice(b, 1);
break;
}
}
// Check bullet collision with boss
if (bossActive && boss && bullet.intersects(boss)) {
boss.health--;
bossHealth = boss.health;
LK.effects.flashObject(boss, 0xFF0000, 300);
bullet.destroy();
bullets.splice(b, 1);
if (bossHealth <= 0) {
LK.setScore(LK.getScore() + 500);
scoreTxt.setText('Score: ' + LK.getScore());
boss.destroy();
bossActive = false;
boss = null;
LK.effects.flashScreen(0x00FF00, 1000);
LK.showYouWin();
}
}
}
if (!bossActive) {
energy -= energyDecayRate;
energy = Math.max(0, energy);
energyTxt.setText('Energy: ' + Math.floor(energy));
if (energy > 60) {
energyTxt.fill = 0x00FF00; // Green
} else if (energy > 30) {
energyTxt.fill = 0xFFFF00; // Yellow
} else {
energyTxt.fill = 0xFF0000; // Red
}
// Game over when energy reaches zero
if (energy <= 0) {
// Update high score
if (LK.getScore() > highScore) {
highScore = LK.getScore();
storage.highScore = highScore;
}
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
}
}
};
// Create main menu
function createMainMenu() {
menuContainer = game.addChild(new Container());
// Title text
titleText = new Text2('COFFEE RUNNER', {
size: 150,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 800;
menuContainer.addChild(titleText);
// Play button
var playButtonGraphic = LK.getAsset('coffeeCup', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
playButton = menuContainer.addChild(playButtonGraphic);
playButton.x = 1024;
playButton.y = 1400;
var playButtonText = new Text2('PLAY', {
size: 80,
fill: 0x000000
});
playButtonText.anchor.set(0.5, 0.5);
playButton.addChild(playButtonText);
// Instructions text
instructionsText = new Text2('Tap to fly • Collect beans • Avoid obstacles', {
size: 60,
fill: 0xFFFFFF
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 1024;
instructionsText.y = 1800;
menuContainer.addChild(instructionsText);
// High score display
var menuHighScoreText = new Text2('Best Score: ' + highScore, {
size: 80,
fill: 0xFFD700
});
menuHighScoreText.anchor.set(0.5, 0.5);
menuHighScoreText.x = 1024;
menuHighScoreText.y = 1200;
menuContainer.addChild(menuHighScoreText);
// Play button event handler
playButton.down = function (x, y, obj) {
startGame();
};
}
function startGame() {
if (gameState !== 'menu') return;
gameState = 'playing';
// Hide menu
if (menuContainer) {
menuContainer.destroy();
menuContainer = null;
}
// Initialize coffee cup
coffeeCup = game.addChild(new CoffeeCup());
coffeeCup.x = 400;
coffeeCup.y = 1366;
// Reset game variables
LK.setScore(0);
scoreTxt.setText('Score: 0');
lives = 3;
livesTxt.setText('Lives: ' + lives);
energy = 100;
energyTxt.setText('Energy: 100');
energyTxt.fill = 0x00FF00;
gameSpeed = 1;
spawnTimer = 0;
goldenBeanTimer = 0;
bossActive = false;
boss = null;
bossHealth = 5;
// Clear any existing game objects
regularBeans = [];
goldenBeans = [];
obstacles = [];
enemies = [];
fallingObjects = [];
bullets = [];
// Keep coffee drops for background effect
}
// Initialize main menu
createMainMenu();
una tasa de cafe caricaturesca de pixeles con un jet pak. In-Game asset. 2d. High contrast. No shadows
grano de cafe dorado de pixeles. In-Game asset. 2d. High contrast. No shadows
grano de caffe de pixeles. In-Game asset. 2d. High contrast. No shadows
pared de pinchos berticales de pixeles. In-Game asset. 2d. High contrast. No shadows