User prompt
que el fondo sea un regtangulo
User prompt
que el boton de disparar sea un coete y las balas panes
User prompt
que cada sierto tiempo haya una vida mas en forma de corason ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
que halla un enemigo cada 50
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var localPos = game.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 293
User prompt
que haya un boton para disparar y moverse
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'energyTxt.style.fill = 0x00FF00; // Green' Line Number: 523
User prompt
que hayan mas enemigos ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'energyTxt.style.fill = 0x00FF00; // Green' Line Number: 521
User prompt
que hayan mas variedad de enemigos
User prompt
que los enemigos sean un objeto a parte
User prompt
que hayan mas enemigos
User prompt
que el fondo sea un regtangulo
User prompt
que el fondo sea un regtangulo
User prompt
que el fondo sea un paisage
User prompt
que los enemigos sean un objeto a parte
User prompt
que haya enemigos
User prompt
que el fondo del juego sean cascadas de cafe
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'bullet.x = coffeeCup.x + 100;' Line Number: 373
User prompt
que tenga un menu prinsipal
User prompt
que dispare
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var buttonPos = LK.gui.bottomRight.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 299
User prompt
que la tasa pueda disparar con un botón en pantalla
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'energyTxt.style.fill = 0x00FF00; // Green' Line Number: 522
User prompt
que haya una linea de energia del get pak que si no se agarran puntos se acaba la energia y pierde ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/****
* 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 FastEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.6,
scaleY: 1.2,
tint: 0xFF4500
});
self.speed = -10;
self.health = 1;
self.moveDirection = 1;
self.verticalSpeed = 4;
self.maxHealth = 1;
self.type = 'fastEnemy';
self.scoreValue = 15;
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.15;
// Add rapid pulsing effect for fast enemy
self.pulseTimer += 0.3;
var pulseScale = 0.6 + Math.sin(self.pulseTimer) * 0.2;
enemyGraphics.scaleX = pulseScale;
enemyGraphics.scaleY = 1.2 + Math.sin(self.pulseTimer) * 0.1;
// Handle damage visual effects
if (self.isDamaged) {
var damageTime = LK.ticks - self.lastDamageTime;
if (damageTime > 20) {
self.isDamaged = false;
enemyGraphics.tint = 0xFF4500;
}
}
};
self.takeDamage = function () {
self.health--;
self.isDamaged = true;
self.lastDamageTime = LK.ticks;
enemyGraphics.tint = 0xFFFF00;
LK.effects.flashObject(self, 0xFFFFFF, 150);
};
self.getScoreValue = function () {
return self.scoreValue;
};
self.isDestroyed = function () {
return self.health <= 0;
};
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;
});
var TankEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 0.8,
tint: 0x4B0082
});
self.speed = -3;
self.health = 4;
self.moveDirection = 1;
self.verticalSpeed = 1;
self.maxHealth = 4;
self.type = 'tankEnemy';
self.scoreValue = 50;
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.02;
// Add slow pulsing effect based on health
self.pulseTimer += 0.05;
var healthRatio = self.health / self.maxHealth;
var pulseScale = 1.2 + Math.sin(self.pulseTimer) * 0.05 * (1 - healthRatio);
enemyGraphics.scaleX = pulseScale;
enemyGraphics.scaleY = 0.8 + Math.sin(self.pulseTimer) * 0.02;
// Handle damage visual effects
if (self.isDamaged) {
var damageTime = LK.ticks - self.lastDamageTime;
if (damageTime > 40) {
self.isDamaged = false;
enemyGraphics.tint = 0x4B0082;
}
}
};
self.takeDamage = function () {
self.health--;
self.isDamaged = true;
self.lastDamageTime = LK.ticks;
enemyGraphics.tint = 0xFF69B4;
LK.effects.flashObject(self, 0xFFFFFF, 300);
};
self.getScoreValue = function () {
return self.scoreValue;
};
self.isDestroyed = function () {
return self.health <= 0;
};
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 fastEnemies = [];
var tankEnemies = [];
var enemySpawnTimer = 0;
var fastEnemySpawnTimer = 0;
var tankEnemySpawnTimer = 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 spawnFastEnemy() {
var fastEnemy = new FastEnemy();
fastEnemy.x = 2200;
fastEnemy.y = Math.random() * 2000 + 400;
fastEnemies.push(fastEnemy);
game.addChild(fastEnemy);
}
function spawnTankEnemy() {
var tankEnemy = new TankEnemy();
tankEnemy.x = 2200;
tankEnemy.y = Math.random() * 2000 + 400;
tankEnemies.push(tankEnemy);
game.addChild(tankEnemy);
}
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);
}
for (var clearFast = fastEnemies.length - 1; clearFast >= 0; clearFast--) {
fastEnemies[clearFast].destroy();
fastEnemies.splice(clearFast, 1);
}
for (var clearTank = tankEnemies.length - 1; clearTank >= 0; clearTank--) {
tankEnemies[clearTank].destroy();
tankEnemies.splice(clearTank, 1);
}
LK.effects.flashScreen(0x8B0000, 1000);
}
if (!bossActive) {
// Update game speed
gameSpeed = 1 + LK.getScore() / 100 * 0.5;
// Update spawn timers
spawnTimer++;
goldenBeanTimer++;
enemySpawnTimer++;
fastEnemySpawnTimer++;
tankEnemySpawnTimer++;
// 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 fast enemies (more frequent at higher scores)
if (fastEnemySpawnTimer % Math.max(150, 250 - Math.floor(LK.getScore() / 6)) === 0) {
spawnFastEnemy();
}
// Spawn tank enemies (less frequent, higher scores)
if (LK.getScore() > 200 && tankEnemySpawnTimer % Math.max(300, 400 - Math.floor(LK.getScore() / 10)) === 0) {
spawnTankEnemy();
}
// 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 and check fast enemies
for (var fe = fastEnemies.length - 1; fe >= 0; fe--) {
var fastEnemy = fastEnemies[fe];
if (fastEnemy.x < -100) {
fastEnemy.destroy();
fastEnemies.splice(fe, 1);
continue;
}
// Check collision with coffee cup
if (!coffeeCup.isInvincible && fastEnemy.intersects(coffeeCup)) {
lives--;
livesTxt.setText('Lives: ' + lives);
coffeeCup.makeInvincible();
LK.effects.flashScreen(0xFF0000, 500);
// Fast enemy takes damage when hitting player
fastEnemy.takeDamage();
if (fastEnemy.isDestroyed()) {
fastEnemy.destroy();
fastEnemies.splice(fe, 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 tank enemies
for (var te = tankEnemies.length - 1; te >= 0; te--) {
var tankEnemy = tankEnemies[te];
if (tankEnemy.x < -100) {
tankEnemy.destroy();
tankEnemies.splice(te, 1);
continue;
}
// Check collision with coffee cup
if (!coffeeCup.isInvincible && tankEnemy.intersects(coffeeCup)) {
lives--;
livesTxt.setText('Lives: ' + lives);
coffeeCup.makeInvincible();
LK.effects.flashScreen(0xFF0000, 500);
// Tank enemy takes damage when hitting player
tankEnemy.takeDamage();
if (tankEnemy.isDestroyed()) {
tankEnemy.destroy();
tankEnemies.splice(te, 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;
}
for (var pf = 0; pf < fastEnemies.length; pf++) {
fastEnemies[pf].speed = -10 * gameSpeed;
}
for (var pt = 0; pt < tankEnemies.length; pt++) {
tankEnemies[pt].speed = -3 * 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 fast enemies
for (var fen = fastEnemies.length - 1; fen >= 0; fen--) {
if (bullet.intersects(fastEnemies[fen])) {
fastEnemies[fen].takeDamage();
if (fastEnemies[fen].isDestroyed()) {
LK.setScore(LK.getScore() + fastEnemies[fen].getScoreValue());
scoreTxt.setText('Score: ' + LK.getScore());
fastEnemies[fen].destroy();
fastEnemies.splice(fen, 1);
}
bullet.destroy();
bullets.splice(b, 1);
break;
}
}
// Check bullet collision with tank enemies
for (var ten = tankEnemies.length - 1; ten >= 0; ten--) {
if (bullet.intersects(tankEnemies[ten])) {
tankEnemies[ten].takeDamage();
if (tankEnemies[ten].isDestroyed()) {
LK.setScore(LK.getScore() + tankEnemies[ten].getScoreValue());
scoreTxt.setText('Score: ' + LK.getScore());
tankEnemies[ten].destroy();
tankEnemies.splice(ten, 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 = [];
fastEnemies = [];
tankEnemies = [];
fallingObjects = [];
bullets = [];
// Keep coffee drops for background effect
}
// Initialize main menu
createMainMenu(); ===================================================================
--- original.js
+++ change.js
@@ -123,8 +123,26 @@
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,
@@ -142,49 +160,10 @@
self.scoreValue = 25;
self.pulseTimer = 0;
self.lastDamageTime = 0;
self.isDamaged = false;
- self.aggressionLevel = Math.random() * 0.5 + 0.5; // 0.5 to 1.0 aggression
- self.behaviorType = Math.random() < 0.5 ? 'aggressive' : 'defensive';
- self.attackCooldown = 0;
- self.lastPlayerY = 0;
- self.trackingSpeed = 1.5;
- self.detectionRange = 300;
- self.isTracking = false;
- self.colorPhase = 0;
- self.originalTint = 0x8B0000;
self.update = function () {
self.x += self.speed;
- // Enhanced AI behavior based on enemy type
- if (self.behaviorType === 'aggressive' && coffeeCup) {
- var distanceToPlayer = Math.abs(self.y - coffeeCup.y);
- if (distanceToPlayer < self.detectionRange) {
- self.isTracking = true;
- // Track player more aggressively
- if (coffeeCup.y > self.y) {
- self.y += self.trackingSpeed * self.aggressionLevel;
- } else {
- self.y -= self.trackingSpeed * self.aggressionLevel;
- }
- // Change color when tracking
- self.colorPhase += 0.3;
- var intensity = Math.sin(self.colorPhase) * 0.3 + 0.7;
- enemyGraphics.tint = 0xFF0000 * intensity;
- } else {
- self.isTracking = false;
- enemyGraphics.tint = self.originalTint;
- }
- } else {
- // Defensive behavior - try to avoid player
- if (coffeeCup && Math.abs(self.y - coffeeCup.y) < 150) {
- if (coffeeCup.y > self.y) {
- self.y -= self.verticalSpeed * 0.5;
- } else {
- self.y += self.verticalSpeed * 0.5;
- }
- }
- }
- // Standard vertical movement with bounds checking
self.y += self.moveDirection * self.verticalSpeed;
if (self.y <= 200) {
self.y = 200;
self.moveDirection = 1;
@@ -192,68 +171,37 @@
if (self.y >= 2500) {
self.y = 2500;
self.moveDirection = -1;
}
- // Enhanced rotation based on behavior
- var rotationSpeed = self.isTracking ? 0.15 : 0.05;
- enemyGraphics.rotation += rotationSpeed * self.aggressionLevel;
- // Add pulsing effect based on health and aggression
- self.pulseTimer += 0.1 * self.aggressionLevel;
+ 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) * self.aggressionLevel;
+ 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 = self.originalTint;
+ enemyGraphics.tint = 0x8B0000;
}
}
- // Update attack cooldown
- if (self.attackCooldown > 0) {
- self.attackCooldown--;
- }
};
self.takeDamage = function () {
self.health--;
self.isDamaged = true;
self.lastDamageTime = LK.ticks;
enemyGraphics.tint = 0xFF0000;
LK.effects.flashObject(self, 0xFFFFFF, 200);
- // Increase aggression when damaged
- self.aggressionLevel = Math.min(1.0, self.aggressionLevel + 0.2);
- // Change behavior to aggressive when heavily damaged
- if (self.health <= 1) {
- self.behaviorType = 'aggressive';
- self.trackingSpeed = 2.5;
- }
};
self.getScoreValue = function () {
- // More aggressive enemies give more points
- var bonusPoints = self.behaviorType === 'aggressive' ? 15 : 0;
- return self.scoreValue + bonusPoints;
+ return self.scoreValue;
};
self.isDestroyed = function () {
return self.health <= 0;
};
- self.canAttack = function () {
- return self.attackCooldown <= 0 && self.isTracking;
- };
- self.performAttack = function () {
- if (self.canAttack()) {
- self.attackCooldown = 60; // 1 second cooldown at 60fps
- return true;
- }
- return false;
- };
- self.getBehaviorType = function () {
- return self.behaviorType;
- };
- self.getAggressionLevel = function () {
- return self.aggressionLevel;
- };
return self;
});
var FallingObject = Container.expand(function () {
var self = Container.call(this);
@@ -274,8 +222,68 @@
objectGraphics.rotation += 0.2;
};
return self;
});
+var FastEnemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.6,
+ scaleY: 1.2,
+ tint: 0xFF4500
+ });
+ self.speed = -10;
+ self.health = 1;
+ self.moveDirection = 1;
+ self.verticalSpeed = 4;
+ self.maxHealth = 1;
+ self.type = 'fastEnemy';
+ self.scoreValue = 15;
+ 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.15;
+ // Add rapid pulsing effect for fast enemy
+ self.pulseTimer += 0.3;
+ var pulseScale = 0.6 + Math.sin(self.pulseTimer) * 0.2;
+ enemyGraphics.scaleX = pulseScale;
+ enemyGraphics.scaleY = 1.2 + Math.sin(self.pulseTimer) * 0.1;
+ // Handle damage visual effects
+ if (self.isDamaged) {
+ var damageTime = LK.ticks - self.lastDamageTime;
+ if (damageTime > 20) {
+ self.isDamaged = false;
+ enemyGraphics.tint = 0xFF4500;
+ }
+ }
+ };
+ self.takeDamage = function () {
+ self.health--;
+ self.isDamaged = true;
+ self.lastDamageTime = LK.ticks;
+ enemyGraphics.tint = 0xFFFF00;
+ LK.effects.flashObject(self, 0xFFFFFF, 150);
+ };
+ self.getScoreValue = function () {
+ return self.scoreValue;
+ };
+ self.isDestroyed = function () {
+ return self.health <= 0;
+ };
+ return self;
+});
var GoldenBean = Container.expand(function () {
var self = Container.call(this);
var beanGraphics = self.attachAsset('goldenBean', {
anchorX: 0.5,
@@ -319,8 +327,69 @@
beanGraphics.rotation += 0.1;
};
return self;
});
+var TankEnemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.2,
+ scaleY: 0.8,
+ tint: 0x4B0082
+ });
+ self.speed = -3;
+ self.health = 4;
+ self.moveDirection = 1;
+ self.verticalSpeed = 1;
+ self.maxHealth = 4;
+ self.type = 'tankEnemy';
+ self.scoreValue = 50;
+ 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.02;
+ // Add slow pulsing effect based on health
+ self.pulseTimer += 0.05;
+ var healthRatio = self.health / self.maxHealth;
+ var pulseScale = 1.2 + Math.sin(self.pulseTimer) * 0.05 * (1 - healthRatio);
+ enemyGraphics.scaleX = pulseScale;
+ enemyGraphics.scaleY = 0.8 + Math.sin(self.pulseTimer) * 0.02;
+ // Handle damage visual effects
+ if (self.isDamaged) {
+ var damageTime = LK.ticks - self.lastDamageTime;
+ if (damageTime > 40) {
+ self.isDamaged = false;
+ enemyGraphics.tint = 0x4B0082;
+ }
+ }
+ };
+ self.takeDamage = function () {
+ self.health--;
+ self.isDamaged = true;
+ self.lastDamageTime = LK.ticks;
+ enemyGraphics.tint = 0xFF69B4;
+ LK.effects.flashObject(self, 0xFFFFFF, 300);
+ };
+ self.getScoreValue = function () {
+ return self.scoreValue;
+ };
+ self.isDestroyed = function () {
+ return self.health <= 0;
+ };
+ return self;
+});
/****
* Initialize Game
****/
@@ -350,17 +419,23 @@
var bossActive = false;
var boss = null;
var bossHealth = 5;
var enemies = [];
+var fastEnemies = [];
+var tankEnemies = [];
var enemySpawnTimer = 0;
+var fastEnemySpawnTimer = 0;
+var tankEnemySpawnTimer = 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
@@ -494,20 +569,32 @@
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = 2200;
enemy.y = Math.random() * 2000 + 400;
- // Add some variation to enemy characteristics
- var difficultyMultiplier = Math.min(2.0, 1 + LK.getScore() / 500);
- enemy.speed = -6 * (0.8 + Math.random() * 0.4) * difficultyMultiplier;
- enemy.verticalSpeed = 2 * (0.7 + Math.random() * 0.6);
- // Increase chance of aggressive enemies as score increases
- if (Math.random() < LK.getScore() / 1000 * 0.3 + 0.2) {
- enemy.behaviorType = 'aggressive';
- enemy.aggressionLevel = 0.7 + Math.random() * 0.3;
- }
enemies.push(enemy);
game.addChild(enemy);
}
+function spawnFastEnemy() {
+ var fastEnemy = new FastEnemy();
+ fastEnemy.x = 2200;
+ fastEnemy.y = Math.random() * 2000 + 400;
+ fastEnemies.push(fastEnemy);
+ game.addChild(fastEnemy);
+}
+function spawnTankEnemy() {
+ var tankEnemy = new TankEnemy();
+ tankEnemy.x = 2200;
+ tankEnemy.y = Math.random() * 2000 + 400;
+ tankEnemies.push(tankEnemy);
+ game.addChild(tankEnemy);
+}
+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;
}
@@ -518,8 +605,20 @@
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;
}
@@ -540,8 +639,16 @@
for (var clearEnemies = enemies.length - 1; clearEnemies >= 0; clearEnemies--) {
enemies[clearEnemies].destroy();
enemies.splice(clearEnemies, 1);
}
+ for (var clearFast = fastEnemies.length - 1; clearFast >= 0; clearFast--) {
+ fastEnemies[clearFast].destroy();
+ fastEnemies.splice(clearFast, 1);
+ }
+ for (var clearTank = tankEnemies.length - 1; clearTank >= 0; clearTank--) {
+ tankEnemies[clearTank].destroy();
+ tankEnemies.splice(clearTank, 1);
+ }
LK.effects.flashScreen(0x8B0000, 1000);
}
if (!bossActive) {
// Update game speed
@@ -549,8 +656,10 @@
// Update spawn timers
spawnTimer++;
goldenBeanTimer++;
enemySpawnTimer++;
+ fastEnemySpawnTimer++;
+ tankEnemySpawnTimer++;
// Spawn regular beans
if (spawnTimer % Math.max(30, 60 - Math.floor(LK.getScore() / 10)) === 0) {
spawnRegularBean();
}
@@ -558,15 +667,19 @@
if (spawnTimer % Math.max(80, 120 - Math.floor(LK.getScore() / 5)) === 0) {
spawnObstacle();
}
// Spawn enemies
- if (enemySpawnTimer % Math.max(40, 80 - Math.floor(LK.getScore() / 5)) === 0) {
+ if (enemySpawnTimer % Math.max(100, 180 - Math.floor(LK.getScore() / 8)) === 0) {
spawnEnemy();
}
- // Spawn additional enemies with different timing
- if (enemySpawnTimer % Math.max(60, 120 - Math.floor(LK.getScore() / 4)) === 0) {
- spawnEnemy();
+ // Spawn fast enemies (more frequent at higher scores)
+ if (fastEnemySpawnTimer % Math.max(150, 250 - Math.floor(LK.getScore() / 6)) === 0) {
+ spawnFastEnemy();
}
+ // Spawn tank enemies (less frequent, higher scores)
+ if (LK.getScore() > 200 && tankEnemySpawnTimer % Math.max(300, 400 - Math.floor(LK.getScore() / 10)) === 0) {
+ spawnTankEnemy();
+ }
// Spawn golden bean (rare)
if (goldenBeanTimer > 600 && Math.random() < 0.01) {
spawnGoldenBean();
goldenBeanTimer = 0;
@@ -686,26 +799,12 @@
if (!coffeeCup.isInvincible && enemy.intersects(coffeeCup)) {
lives--;
livesTxt.setText('Lives: ' + lives);
coffeeCup.makeInvincible();
- // Different screen flash effects based on enemy behavior
- var flashColor = enemy.getBehaviorType() === 'aggressive' ? 0xFF4500 : 0xFF0000;
- LK.effects.flashScreen(flashColor, 500);
- // Enemy attack behavior - aggressive enemies do more damage
- if (enemy.getBehaviorType() === 'aggressive') {
- // Aggressive enemies have a chance to do double damage
- if (Math.random() < enemy.getAggressionLevel() * 0.3) {
- lives--; // Extra damage
- livesTxt.setText('Lives: ' + lives);
- LK.effects.flashScreen(0xFF0000, 1000); // Longer flash for critical hit
- }
- }
+ LK.effects.flashScreen(0xFF0000, 500);
// Enemy takes damage when hitting player (self-destructive attack)
enemy.takeDamage();
if (enemy.isDestroyed()) {
- // Add score based on enemy type and aggression
- LK.setScore(LK.getScore() + enemy.getScoreValue());
- scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(e, 1);
}
if (lives <= 0) {
@@ -719,8 +818,72 @@
}
break;
}
}
+ // Update and check fast enemies
+ for (var fe = fastEnemies.length - 1; fe >= 0; fe--) {
+ var fastEnemy = fastEnemies[fe];
+ if (fastEnemy.x < -100) {
+ fastEnemy.destroy();
+ fastEnemies.splice(fe, 1);
+ continue;
+ }
+ // Check collision with coffee cup
+ if (!coffeeCup.isInvincible && fastEnemy.intersects(coffeeCup)) {
+ lives--;
+ livesTxt.setText('Lives: ' + lives);
+ coffeeCup.makeInvincible();
+ LK.effects.flashScreen(0xFF0000, 500);
+ // Fast enemy takes damage when hitting player
+ fastEnemy.takeDamage();
+ if (fastEnemy.isDestroyed()) {
+ fastEnemy.destroy();
+ fastEnemies.splice(fe, 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 tank enemies
+ for (var te = tankEnemies.length - 1; te >= 0; te--) {
+ var tankEnemy = tankEnemies[te];
+ if (tankEnemy.x < -100) {
+ tankEnemy.destroy();
+ tankEnemies.splice(te, 1);
+ continue;
+ }
+ // Check collision with coffee cup
+ if (!coffeeCup.isInvincible && tankEnemy.intersects(coffeeCup)) {
+ lives--;
+ livesTxt.setText('Lives: ' + lives);
+ coffeeCup.makeInvincible();
+ LK.effects.flashScreen(0xFF0000, 500);
+ // Tank enemy takes damage when hitting player
+ tankEnemy.takeDamage();
+ if (tankEnemy.isDestroyed()) {
+ tankEnemy.destroy();
+ tankEnemies.splice(te, 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;
}
@@ -732,8 +895,14 @@
}
for (var p = 0; p < enemies.length; p++) {
enemies[p].speed = -6 * gameSpeed;
}
+ for (var pf = 0; pf < fastEnemies.length; pf++) {
+ fastEnemies[pf].speed = -10 * gameSpeed;
+ }
+ for (var pt = 0; pt < tankEnemies.length; pt++) {
+ tankEnemies[pt].speed = -3 * gameSpeed;
+ }
// Handle falling objects during boss battle
if (bossActive) {
for (var f = fallingObjects.length - 1; f >= 0; f--) {
var fallingObj = fallingObjects[f];
@@ -819,33 +988,50 @@
}
// Check bullet collision with enemies
for (var en = enemies.length - 1; en >= 0; en--) {
if (bullet.intersects(enemies[en])) {
- var enemy = enemies[en];
- enemy.takeDamage();
- // Different visual effects based on enemy behavior
- if (enemy.getBehaviorType() === 'aggressive') {
- LK.effects.flashObject(enemy, 0xFF4500, 300);
- } else {
- LK.effects.flashObject(enemy, 0xFFFFFF, 200);
- }
- if (enemy.isDestroyed()) {
- // Bonus points for destroying aggressive enemies
- var scoreBonus = enemy.getBehaviorType() === 'aggressive' ? 15 : 0;
- LK.setScore(LK.getScore() + enemy.getScoreValue() + scoreBonus);
+ enemies[en].takeDamage();
+ if (enemies[en].isDestroyed()) {
+ LK.setScore(LK.getScore() + enemies[en].getScoreValue());
scoreTxt.setText('Score: ' + LK.getScore());
- // Special destruction effect for aggressive enemies
- if (enemy.getBehaviorType() === 'aggressive') {
- LK.effects.flashScreen(0xFFD700, 300);
- }
- enemy.destroy();
+ enemies[en].destroy();
enemies.splice(en, 1);
}
bullet.destroy();
bullets.splice(b, 1);
break;
}
}
+ // Check bullet collision with fast enemies
+ for (var fen = fastEnemies.length - 1; fen >= 0; fen--) {
+ if (bullet.intersects(fastEnemies[fen])) {
+ fastEnemies[fen].takeDamage();
+ if (fastEnemies[fen].isDestroyed()) {
+ LK.setScore(LK.getScore() + fastEnemies[fen].getScoreValue());
+ scoreTxt.setText('Score: ' + LK.getScore());
+ fastEnemies[fen].destroy();
+ fastEnemies.splice(fen, 1);
+ }
+ bullet.destroy();
+ bullets.splice(b, 1);
+ break;
+ }
+ }
+ // Check bullet collision with tank enemies
+ for (var ten = tankEnemies.length - 1; ten >= 0; ten--) {
+ if (bullet.intersects(tankEnemies[ten])) {
+ tankEnemies[ten].takeDamage();
+ if (tankEnemies[ten].isDestroyed()) {
+ LK.setScore(LK.getScore() + tankEnemies[ten].getScoreValue());
+ scoreTxt.setText('Score: ' + LK.getScore());
+ tankEnemies[ten].destroy();
+ tankEnemies.splice(ten, 1);
+ }
+ bullet.destroy();
+ bullets.splice(b, 1);
+ break;
+ }
+ }
// Check bullet collision with boss
if (bossActive && boss && bullet.intersects(boss)) {
boss.health--;
bossHealth = boss.health;
@@ -967,9 +1153,12 @@
regularBeans = [];
goldenBeans = [];
obstacles = [];
enemies = [];
+ fastEnemies = [];
+ tankEnemies = [];
fallingObjects = [];
bullets = [];
+ // Keep coffee drops for background effect
}
// Initialize main menu
createMainMenu();
\ No newline at end of file
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
martillo mounstroso de pixeles. In-Game asset. 2d. High contrast. No shadows
corazon de pixeles. In-Game asset. 2d. High contrast. No shadows
pan de pixeles. In-Game asset. 2d. High contrast. No shadows
coete de pixeles. In-Game asset. 2d. High contrast. No shadows
paisage con cascadas de cafe de pixeles. In-Game asset. 2d. High contrast. No shadows