/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Building = Container.expand(function () { var self = Container.call(this); var buildingGraphics = self.attachAsset('building', { anchorX: 0.5, anchorY: 0.5 }); self.health = 200; self.maxHealth = 200; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.health = 0; return true; } LK.effects.flashObject(self, 0xFF0000, 500); return false; }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.targetX = 0; self.targetY = 0; self.damage = 25; self.setTarget = function (x, y) { self.targetX = x; self.targetY = y; var dx = x - self.x; var dy = y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); self.velocityX = dx / distance * self.speed; self.velocityY = dy / distance * self.speed; }; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; self.speed = 1.5; self.coinValue = 10; self.targetX = 1024; self.targetY = 1366; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.health = 0; return true; } return false; }; self.update = function () { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; return self; }); var Tower = Container.expand(function () { var self = Container.call(this); self.range = 200; self.damage = 80; self.fireRate = 50; self.lastFired = 0; self.cost = 50; self.towerType = 'basic'; var towerGraphics = self.attachAsset('basicTower', { anchorX: 0.5, anchorY: 0.5 }); self.canFire = function () { var adjustedFireRate = Math.max(10, self.fireRate - (level - 1) * 5); return LK.ticks - self.lastFired >= adjustedFireRate; }; self.findTarget = function () { var closestEnemy = null; var closestDistance = self.range; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < closestDistance) { closestDistance = distance; closestEnemy = enemy; } } return closestEnemy; }; self.fire = function (target) { if (!self.canFire()) return; var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullet.damage = self.damage; bullet.setTarget(target.x, target.y); bullets.push(bullet); game.addChild(bullet); self.lastFired = LK.ticks; LK.getSound('shoot').play(); }; self.update = function () { var target = self.findTarget(); if (target) { self.fire(target); } }; return self; }); var RapidTower = Tower.expand(function () { var self = Tower.call(this); self.removeChild(self.children[0]); var rapidGraphics = self.attachAsset('rapidTower', { anchorX: 0.5, anchorY: 0.5 }); self.range = 150; self.damage = 40; self.fireRate = 15; self.cost = 75; self.towerType = 'rapid'; self.canFire = function () { var adjustedFireRate = Math.max(5, self.fireRate - (level - 1) * 2); return LK.ticks - self.lastFired >= adjustedFireRate; }; self.fire = function (target) { if (!self.canFire()) return; var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullet.damage = self.damage; bullet.setTarget(target.x, target.y); bullets.push(bullet); game.addChild(bullet); self.lastFired = LK.ticks; LK.getSound('shoot').play(); }; self.findTarget = function () { var closestEnemy = null; var closestDistance = self.range; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < closestDistance) { closestDistance = distance; closestEnemy = enemy; } } return closestEnemy; }; self.update = function () { var target = self.findTarget(); if (target) { self.fire(target); } }; return self; }); var HeavyTower = Tower.expand(function () { var self = Tower.call(this); self.removeChild(self.children[0]); var heavyGraphics = self.attachAsset('heavyTower', { anchorX: 0.5, anchorY: 0.5 }); self.range = 350; self.damage = 200; self.fireRate = 120; self.cost = 100; self.towerType = 'heavy'; self.canFire = function () { var adjustedFireRate = Math.max(20, self.fireRate - (level - 1) * 10); return LK.ticks - self.lastFired >= adjustedFireRate; }; self.fire = function (target) { if (!self.canFire()) return; var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullet.damage = self.damage; bullet.setTarget(target.x, target.y); bullets.push(bullet); game.addChild(bullet); self.lastFired = LK.ticks; LK.getSound('shoot').play(); }; self.findTarget = function () { var closestEnemy = null; var closestDistance = self.range; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < closestDistance) { closestDistance = distance; closestEnemy = enemy; } } return closestEnemy; }; self.update = function () { var target = self.findTarget(); if (target) { self.fire(target); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2F4F2F }); /**** * Game Code ****/ var building; var towers = []; var enemies = []; var bullets = []; var coins = 500; var wave = 1; var enemiesInWave = 5; var enemiesSpawned = 0; var waveActive = false; var spawnTimer = 0; var selectedTowerType = 'basic'; var showingRange = false; var rangeIndicator = null; var lives = 3; var level = 1; // Initialize building at center building = game.addChild(new Building()); building.x = 1024; building.y = 1366; // UI Elements var coinsText = new Text2('Gold: ' + coins, { size: 60, fill: 0xFFD700 }); coinsText.anchor.set(1, 0); coinsText.x = -20; coinsText.y = 120; LK.gui.topRight.addChild(coinsText); var waveText = new Text2('Wave: ' + wave, { size: 60, fill: 0xFFFFFF }); waveText.anchor.set(0.5, 0); LK.gui.top.addChild(waveText); var healthText = new Text2('Health: ' + building.health, { size: 60, fill: 0xFF0000 }); healthText.anchor.set(0, 0); LK.gui.bottomLeft.addChild(healthText); var livesText = new Text2('Lives: ' + lives, { size: 60, fill: 0xFF6347 }); livesText.anchor.set(0, 0); livesText.y = 80; LK.gui.bottomLeft.addChild(livesText); var levelText = new Text2('Level: ' + level, { size: 60, fill: 0x00FFFF }); levelText.anchor.set(0, 0); levelText.y = 160; LK.gui.bottomLeft.addChild(levelText); // Tower selection buttons var basicButton = new Text2('Basic (50)', { size: 40, fill: 0x00FF00 }); basicButton.anchor.set(0.5, 1); LK.gui.bottom.addChild(basicButton); var heavyButton = new Text2('Heavy (100)', { size: 40, fill: 0x0000FF }); heavyButton.anchor.set(0.5, 1); heavyButton.y = -80; LK.gui.bottom.addChild(heavyButton); var rapidButton = new Text2('Rapid (75)', { size: 40, fill: 0xFFFF00 }); rapidButton.anchor.set(0.5, 1); rapidButton.y = -160; LK.gui.bottom.addChild(rapidButton); // Button interactions basicButton.down = function () { selectedTowerType = 'basic'; updateButtonColors(); }; heavyButton.down = function () { selectedTowerType = 'heavy'; updateButtonColors(); }; rapidButton.down = function () { selectedTowerType = 'rapid'; updateButtonColors(); }; function updateButtonColors() { basicButton.tint = selectedTowerType === 'basic' ? 0xFFFFFF : 0x888888; heavyButton.tint = selectedTowerType === 'heavy' ? 0xFFFFFF : 0x888888; rapidButton.tint = selectedTowerType === 'rapid' ? 0xFFFFFF : 0x888888; } updateButtonColors(); function spawnEnemy() { var enemy = new Enemy(); // Spawn from random edge var side = Math.floor(Math.random() * 4); switch (side) { case 0: // Top enemy.x = Math.random() * 2048; enemy.y = -30; break; case 1: // Right enemy.x = 2078; enemy.y = Math.random() * 2732; break; case 2: // Bottom enemy.x = Math.random() * 2048; enemy.y = 2762; break; case 3: // Left enemy.x = -30; enemy.y = Math.random() * 2732; break; } enemy.targetX = building.x; enemy.targetY = building.y; enemy.health = 50 + wave * 40 + level * 50; enemy.maxHealth = enemy.health; enemy.speed = 1.5 + level * 0.5; enemy.coinValue = 10; enemies.push(enemy); game.addChild(enemy); } function startWave() { if (!waveActive) { waveActive = true; enemiesSpawned = 0; enemiesInWave = 5 + wave * 3 + level * 2; spawnTimer = 0; } } function canPlaceTower(x, y) { // Check if position is too close to building var dx = x - building.x; var dy = y - building.y; if (Math.sqrt(dx * dx + dy * dy) < 150) { return false; } // Check if position overlaps with existing towers for (var i = 0; i < towers.length; i++) { var tower = towers[i]; var tdx = x - tower.x; var tdy = y - tower.y; if (Math.sqrt(tdx * tdx + tdy * tdy) < 100) { return false; } } return true; } function getTowerCost(type) { switch (type) { case 'basic': return 50; case 'heavy': return 100; case 'rapid': return 75; default: return 50; } } function placeTower(x, y, type) { var cost = getTowerCost(type); if (coins < cost) return false; if (!canPlaceTower(x, y)) return false; var tower; switch (type) { case 'heavy': tower = new HeavyTower(); break; case 'rapid': tower = new RapidTower(); break; default: tower = new Tower(); break; } tower.x = x; tower.y = y; towers.push(tower); game.addChild(tower); coins -= cost; coinsText.setText('Gold: ' + coins); return true; } // Game input handling game.down = function (x, y, obj) { placeTower(x, y, selectedTowerType); }; // Start first wave startWave(); game.update = function () { // Wave spawning if (waveActive && enemiesSpawned < enemiesInWave) { spawnTimer++; if (spawnTimer >= 90) { // Spawn every 1.5 seconds spawnEnemy(); enemiesSpawned++; spawnTimer = 0; } } // Check if wave is complete if (waveActive && enemiesSpawned >= enemiesInWave && enemies.length === 0) { waveActive = false; wave++; level++; waveText.setText('Wave: ' + wave); levelText.setText('Level: ' + level); // Start next wave after delay LK.setTimeout(function () { startWave(); }, 3000); } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; // Check if bullet is off screen if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check bullet-enemy collisions var hit = false; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { var killed = enemy.takeDamage(bullet.damage); if (killed) { coins += enemy.coinValue; coinsText.setText('Gold: ' + coins); enemy.destroy(); enemies.splice(j, 1); LK.getSound('enemyHit').play(); } bullet.destroy(); bullets.splice(i, 1); hit = true; break; } } } // Update enemies for (var k = enemies.length - 1; k >= 0; k--) { var enemy = enemies[k]; // Check if enemy reached building if (enemy.intersects(building)) { lives--; livesText.setText('Lives: ' + lives); enemy.destroy(); enemies.splice(k, 1); LK.getSound('buildingHit').play(); LK.effects.flashObject(building, 0xFF0000, 500); if (lives <= 0) { LK.showGameOver(); return; } } } // Check victory condition (survived 10 waves) if (wave > 10 && !waveActive && enemies.length === 0) { LK.showYouWin(); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Building = Container.expand(function () {
var self = Container.call(this);
var buildingGraphics = self.attachAsset('building', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 200;
self.maxHealth = 200;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health <= 0) {
self.health = 0;
return true;
}
LK.effects.flashObject(self, 0xFF0000, 500);
return false;
};
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.targetX = 0;
self.targetY = 0;
self.damage = 25;
self.setTarget = function (x, y) {
self.targetX = x;
self.targetY = y;
var dx = x - self.x;
var dy = y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
self.velocityX = dx / distance * self.speed;
self.velocityY = dy / distance * self.speed;
};
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.speed = 1.5;
self.coinValue = 10;
self.targetX = 1024;
self.targetY = 1366;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health <= 0) {
self.health = 0;
return true;
}
return false;
};
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
var Tower = Container.expand(function () {
var self = Container.call(this);
self.range = 200;
self.damage = 80;
self.fireRate = 50;
self.lastFired = 0;
self.cost = 50;
self.towerType = 'basic';
var towerGraphics = self.attachAsset('basicTower', {
anchorX: 0.5,
anchorY: 0.5
});
self.canFire = function () {
var adjustedFireRate = Math.max(10, self.fireRate - (level - 1) * 5);
return LK.ticks - self.lastFired >= adjustedFireRate;
};
self.findTarget = function () {
var closestEnemy = null;
var closestDistance = self.range;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - self.x;
var dy = enemy.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closestDistance = distance;
closestEnemy = enemy;
}
}
return closestEnemy;
};
self.fire = function (target) {
if (!self.canFire()) return;
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.damage = self.damage;
bullet.setTarget(target.x, target.y);
bullets.push(bullet);
game.addChild(bullet);
self.lastFired = LK.ticks;
LK.getSound('shoot').play();
};
self.update = function () {
var target = self.findTarget();
if (target) {
self.fire(target);
}
};
return self;
});
var RapidTower = Tower.expand(function () {
var self = Tower.call(this);
self.removeChild(self.children[0]);
var rapidGraphics = self.attachAsset('rapidTower', {
anchorX: 0.5,
anchorY: 0.5
});
self.range = 150;
self.damage = 40;
self.fireRate = 15;
self.cost = 75;
self.towerType = 'rapid';
self.canFire = function () {
var adjustedFireRate = Math.max(5, self.fireRate - (level - 1) * 2);
return LK.ticks - self.lastFired >= adjustedFireRate;
};
self.fire = function (target) {
if (!self.canFire()) return;
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.damage = self.damage;
bullet.setTarget(target.x, target.y);
bullets.push(bullet);
game.addChild(bullet);
self.lastFired = LK.ticks;
LK.getSound('shoot').play();
};
self.findTarget = function () {
var closestEnemy = null;
var closestDistance = self.range;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - self.x;
var dy = enemy.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closestDistance = distance;
closestEnemy = enemy;
}
}
return closestEnemy;
};
self.update = function () {
var target = self.findTarget();
if (target) {
self.fire(target);
}
};
return self;
});
var HeavyTower = Tower.expand(function () {
var self = Tower.call(this);
self.removeChild(self.children[0]);
var heavyGraphics = self.attachAsset('heavyTower', {
anchorX: 0.5,
anchorY: 0.5
});
self.range = 350;
self.damage = 200;
self.fireRate = 120;
self.cost = 100;
self.towerType = 'heavy';
self.canFire = function () {
var adjustedFireRate = Math.max(20, self.fireRate - (level - 1) * 10);
return LK.ticks - self.lastFired >= adjustedFireRate;
};
self.fire = function (target) {
if (!self.canFire()) return;
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.damage = self.damage;
bullet.setTarget(target.x, target.y);
bullets.push(bullet);
game.addChild(bullet);
self.lastFired = LK.ticks;
LK.getSound('shoot').play();
};
self.findTarget = function () {
var closestEnemy = null;
var closestDistance = self.range;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - self.x;
var dy = enemy.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closestDistance = distance;
closestEnemy = enemy;
}
}
return closestEnemy;
};
self.update = function () {
var target = self.findTarget();
if (target) {
self.fire(target);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2F4F2F
});
/****
* Game Code
****/
var building;
var towers = [];
var enemies = [];
var bullets = [];
var coins = 500;
var wave = 1;
var enemiesInWave = 5;
var enemiesSpawned = 0;
var waveActive = false;
var spawnTimer = 0;
var selectedTowerType = 'basic';
var showingRange = false;
var rangeIndicator = null;
var lives = 3;
var level = 1;
// Initialize building at center
building = game.addChild(new Building());
building.x = 1024;
building.y = 1366;
// UI Elements
var coinsText = new Text2('Gold: ' + coins, {
size: 60,
fill: 0xFFD700
});
coinsText.anchor.set(1, 0);
coinsText.x = -20;
coinsText.y = 120;
LK.gui.topRight.addChild(coinsText);
var waveText = new Text2('Wave: ' + wave, {
size: 60,
fill: 0xFFFFFF
});
waveText.anchor.set(0.5, 0);
LK.gui.top.addChild(waveText);
var healthText = new Text2('Health: ' + building.health, {
size: 60,
fill: 0xFF0000
});
healthText.anchor.set(0, 0);
LK.gui.bottomLeft.addChild(healthText);
var livesText = new Text2('Lives: ' + lives, {
size: 60,
fill: 0xFF6347
});
livesText.anchor.set(0, 0);
livesText.y = 80;
LK.gui.bottomLeft.addChild(livesText);
var levelText = new Text2('Level: ' + level, {
size: 60,
fill: 0x00FFFF
});
levelText.anchor.set(0, 0);
levelText.y = 160;
LK.gui.bottomLeft.addChild(levelText);
// Tower selection buttons
var basicButton = new Text2('Basic (50)', {
size: 40,
fill: 0x00FF00
});
basicButton.anchor.set(0.5, 1);
LK.gui.bottom.addChild(basicButton);
var heavyButton = new Text2('Heavy (100)', {
size: 40,
fill: 0x0000FF
});
heavyButton.anchor.set(0.5, 1);
heavyButton.y = -80;
LK.gui.bottom.addChild(heavyButton);
var rapidButton = new Text2('Rapid (75)', {
size: 40,
fill: 0xFFFF00
});
rapidButton.anchor.set(0.5, 1);
rapidButton.y = -160;
LK.gui.bottom.addChild(rapidButton);
// Button interactions
basicButton.down = function () {
selectedTowerType = 'basic';
updateButtonColors();
};
heavyButton.down = function () {
selectedTowerType = 'heavy';
updateButtonColors();
};
rapidButton.down = function () {
selectedTowerType = 'rapid';
updateButtonColors();
};
function updateButtonColors() {
basicButton.tint = selectedTowerType === 'basic' ? 0xFFFFFF : 0x888888;
heavyButton.tint = selectedTowerType === 'heavy' ? 0xFFFFFF : 0x888888;
rapidButton.tint = selectedTowerType === 'rapid' ? 0xFFFFFF : 0x888888;
}
updateButtonColors();
function spawnEnemy() {
var enemy = new Enemy();
// Spawn from random edge
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
enemy.x = Math.random() * 2048;
enemy.y = -30;
break;
case 1:
// Right
enemy.x = 2078;
enemy.y = Math.random() * 2732;
break;
case 2:
// Bottom
enemy.x = Math.random() * 2048;
enemy.y = 2762;
break;
case 3:
// Left
enemy.x = -30;
enemy.y = Math.random() * 2732;
break;
}
enemy.targetX = building.x;
enemy.targetY = building.y;
enemy.health = 50 + wave * 40 + level * 50;
enemy.maxHealth = enemy.health;
enemy.speed = 1.5 + level * 0.5;
enemy.coinValue = 10;
enemies.push(enemy);
game.addChild(enemy);
}
function startWave() {
if (!waveActive) {
waveActive = true;
enemiesSpawned = 0;
enemiesInWave = 5 + wave * 3 + level * 2;
spawnTimer = 0;
}
}
function canPlaceTower(x, y) {
// Check if position is too close to building
var dx = x - building.x;
var dy = y - building.y;
if (Math.sqrt(dx * dx + dy * dy) < 150) {
return false;
}
// Check if position overlaps with existing towers
for (var i = 0; i < towers.length; i++) {
var tower = towers[i];
var tdx = x - tower.x;
var tdy = y - tower.y;
if (Math.sqrt(tdx * tdx + tdy * tdy) < 100) {
return false;
}
}
return true;
}
function getTowerCost(type) {
switch (type) {
case 'basic':
return 50;
case 'heavy':
return 100;
case 'rapid':
return 75;
default:
return 50;
}
}
function placeTower(x, y, type) {
var cost = getTowerCost(type);
if (coins < cost) return false;
if (!canPlaceTower(x, y)) return false;
var tower;
switch (type) {
case 'heavy':
tower = new HeavyTower();
break;
case 'rapid':
tower = new RapidTower();
break;
default:
tower = new Tower();
break;
}
tower.x = x;
tower.y = y;
towers.push(tower);
game.addChild(tower);
coins -= cost;
coinsText.setText('Gold: ' + coins);
return true;
}
// Game input handling
game.down = function (x, y, obj) {
placeTower(x, y, selectedTowerType);
};
// Start first wave
startWave();
game.update = function () {
// Wave spawning
if (waveActive && enemiesSpawned < enemiesInWave) {
spawnTimer++;
if (spawnTimer >= 90) {
// Spawn every 1.5 seconds
spawnEnemy();
enemiesSpawned++;
spawnTimer = 0;
}
}
// Check if wave is complete
if (waveActive && enemiesSpawned >= enemiesInWave && enemies.length === 0) {
waveActive = false;
wave++;
level++;
waveText.setText('Wave: ' + wave);
levelText.setText('Level: ' + level);
// Start next wave after delay
LK.setTimeout(function () {
startWave();
}, 3000);
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Check if bullet is off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet-enemy collisions
var hit = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
var killed = enemy.takeDamage(bullet.damage);
if (killed) {
coins += enemy.coinValue;
coinsText.setText('Gold: ' + coins);
enemy.destroy();
enemies.splice(j, 1);
LK.getSound('enemyHit').play();
}
bullet.destroy();
bullets.splice(i, 1);
hit = true;
break;
}
}
}
// Update enemies
for (var k = enemies.length - 1; k >= 0; k--) {
var enemy = enemies[k];
// Check if enemy reached building
if (enemy.intersects(building)) {
lives--;
livesText.setText('Lives: ' + lives);
enemy.destroy();
enemies.splice(k, 1);
LK.getSound('buildingHit').play();
LK.effects.flashObject(building, 0xFF0000, 500);
if (lives <= 0) {
LK.showGameOver();
return;
}
}
}
// Check victory condition (survived 10 waves)
if (wave > 10 && !waveActive && enemies.length === 0) {
LK.showYouWin();
}
};