User prompt
when clicked light, spawn light unit , when medium clicked spawn medium unit . also for heavy
User prompt
don't spawn automatic units, units should spawn when user clicks buttons and the gold cost should br redacted from gold
User prompt
put buttons for spawning units, also player should earn gold every second, have three different units for every age
Code edit (1 edits merged)
Please save this source code
User prompt
Age of Defense: Evolution Wars
Initial prompt
Create a 2D mobile strategy-defense game inspired by ‘Age of War.’ The game must be optimized for Android and iOS. Use a side-view 2D layout. Core mechanics: • The player’s base is on the left, the enemy base is on the right. Each base has health points (HP). • Both sides spawn units automatically. Units walk toward the opponent’s base and attack when they meet enemy units. • The player earns gold by killing enemy units. Gold is used to spawn new units. • The player can upgrade through ages: Stone Age → Medieval Age → Modern Age → Future Age. • Each age unlocks stronger units, better base design, and a more powerful base weapon. • The base has a defensive turret that automatically shoots enemies. • The game ends when one base’s HP reaches 0. Gameplay rules: • Units move left-to-right (player side) and right-to-left (enemy side). • Units attack automatically when in range. • Each unit has stats: HP, attack, speed, cost. • Age upgrades require gold and trigger visual + gameplay changes. • Difficulty increases as the enemy upgrades ages and spawns stronger units. Mobile requirements: • Responsive UI with touch controls (buttons for spawning units, upgrading age, and showing gold/HP). • Optimized for smooth performance on both Android and iOS. • Simple, cartoon-like art style for readability on small screens. • Include basic sound effects for spawning, attacking, and upgrading. • Ensure the game runs in both portrait and landscape modes. Deliverables: • Core game loop (spawn units, fight, earn gold, upgrade ages). • Enemy AI that automatically spawns units and upgrades. • Mobile-friendly UI (gold counter, age upgrade button, unit spawn buttons, HP bar for both bases). • Scene management: main menu, gameplay, game over screen. • Code structured for scalability (easy to add more units or ages later)
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Base = Container.expand(function (isPlayer) { var self = Container.call(this); self.isPlayer = isPlayer; self.age = 0; self.maxHp = 1000; self.hp = self.maxHp; self.turretCooldown = 0; var assetNames = isPlayer ? ['playerBaseStone', 'playerBaseMedieval', 'playerBaseModern', 'playerBaseFuture'] : ['enemyBaseStone', 'enemyBaseMedieval', 'enemyBaseModern', 'enemyBaseFuture']; self.baseGraphics = self.attachAsset(assetNames[self.age], { anchorX: 0.5, anchorY: 1.0 }); self.turret = self.addChild(LK.getAsset(isPlayer ? 'playerTurret' : 'enemyTurret', { anchorX: 0.5, anchorY: 0.5 })); self.turret.x = 0; self.turret.y = -200; self.update = function () { if (self.turretCooldown > 0) { self.turretCooldown--; } }; self.takeDamage = function (damage) { self.hp -= damage; LK.effects.flashObject(self, 0xFF0000, 300); LK.getSound('baseHit').play(); if (self.hp <= 0) { return true; } return false; }; self.upgradeAge = function () { if (self.age < 3) { self.age++; self.removeChild(self.baseGraphics); var assetNames = self.isPlayer ? ['playerBaseStone', 'playerBaseMedieval', 'playerBaseModern', 'playerBaseFuture'] : ['enemyBaseStone', 'enemyBaseMedieval', 'enemyBaseModern', 'enemyBaseFuture']; self.baseGraphics = self.attachAsset(assetNames[self.age], { anchorX: 0.5, anchorY: 1.0 }); } }; self.shootTurret = function (targets) { if (self.turretCooldown <= 0 && targets.length > 0) { var target = targets[0]; var bullet = new Bullet(self.isPlayer, self.x, self.y - 200, target); bullets.push(bullet); game.addChild(bullet); self.turretCooldown = 30; } }; return self; }); var Bullet = Container.expand(function (isPlayer, startX, startY, target) { var self = Container.call(this); self.isPlayer = isPlayer; self.target = target; self.speed = 8; self.damage = 30; var bulletGraphics = self.attachAsset(isPlayer ? 'playerBullet' : 'enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.x = startX; self.y = startY; // Calculate direction to target var dx = target.x - startX; var dy = target.y - startY; 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 EnemyUnit = Container.expand(function (age) { var self = Container.call(this); self.age = age || 0; self.hp = (self.age + 1) * 50; self.maxHp = self.hp; self.damage = (self.age + 1) * 25; self.speed = -2; self.attackCooldown = 0; self.target = null; var assetNames = ['enemyUnitStone', 'enemyUnitMedieval', 'enemyUnitModern', 'enemyUnitFuture']; var unitGraphics = self.attachAsset(assetNames[self.age], { anchorX: 0.5, anchorY: 1.0 }); self.update = function () { if (self.attackCooldown > 0) { self.attackCooldown--; } // Move towards player base if (!self.target) { self.x += self.speed; } }; self.takeDamage = function (damage) { self.hp -= damage; LK.effects.flashObject(self, 0xFF0000, 200); if (self.hp <= 0) { return true; } return false; }; self.attack = function (target) { if (self.attackCooldown <= 0) { self.attackCooldown = 60; return self.damage; } return 0; }; return self; }); var PlayerUnit = Container.expand(function (age) { var self = Container.call(this); self.age = age || 0; self.hp = (self.age + 1) * 50; self.maxHp = self.hp; self.damage = (self.age + 1) * 25; self.speed = 2; self.attackCooldown = 0; self.target = null; var assetNames = ['playerUnitStone', 'playerUnitMedieval', 'playerUnitModern', 'playerUnitFuture']; var unitGraphics = self.attachAsset(assetNames[self.age], { anchorX: 0.5, anchorY: 1.0 }); self.update = function () { if (self.attackCooldown > 0) { self.attackCooldown--; } // Move towards enemy base if (!self.target) { self.x += self.speed; } }; self.takeDamage = function (damage) { self.hp -= damage; LK.effects.flashObject(self, 0xFF0000, 200); if (self.hp <= 0) { return true; } return false; }; self.attack = function (target) { if (self.attackCooldown <= 0) { self.attackCooldown = 60; return self.damage; } return 0; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Sound assets // Turret assets // Bullet assets // Enemy unit assets for different ages // Player unit assets for different ages // Enemy base assets for different ages // Player base assets for different ages // Game state variables var playerGold = 100; var playerAge = 0; var enemyAge = 0; var gameSpeed = 1; // Game objects arrays var playerUnits = []; var enemyUnits = []; var bullets = []; // Age costs and unit costs var ageCosts = [0, 200, 500, 1000]; var unitCosts = [50, 100, 200, 400]; // Create bases var playerBase = game.addChild(new Base(true)); playerBase.x = 200; playerBase.y = 2400; var enemyBase = game.addChild(new Base(false)); enemyBase.x = 1848; enemyBase.y = 2400; // Create ground var ground = game.addChild(LK.getAsset({ anchorX: 0, anchorY: 0 }, {})); ground.x = 0; ground.y = 2400; // UI Elements var goldText = new Text2('Gold: ' + playerGold, { size: 60, fill: 0xFFD700 }); goldText.anchor.set(0, 0); LK.gui.topLeft.addChild(goldText); goldText.x = 120; goldText.y = 20; var playerHpText = new Text2('Player HP: ' + playerBase.hp, { size: 50, fill: 0x00FF00 }); playerHpText.anchor.set(0, 0); LK.gui.top.addChild(playerHpText); playerHpText.x = -200; playerHpText.y = 20; var enemyHpText = new Text2('Enemy HP: ' + enemyBase.hp, { size: 50, fill: 0xFF0000 }); enemyHpText.anchor.set(0, 0); LK.gui.top.addChild(enemyHpText); enemyHpText.x = 200; enemyHpText.y = 20; // Spawn unit button var spawnButton = LK.gui.bottomLeft.addChild(LK.getAsset({ anchorX: 0.5, anchorY: 0.5 }, {})); spawnButton.x = 150; spawnButton.y = -80; var spawnBtnText = new Text2('Spawn Unit\n' + unitCosts[playerAge] + ' Gold', { size: 30, fill: 0xFFFFFF }); spawnBtnText.anchor.set(0.5, 0.5); spawnButton.addChild(spawnBtnText); // Age upgrade button var upgradeButton = LK.gui.bottomRight.addChild(LK.getAsset({ anchorX: 0.5, anchorY: 0.5 }, {})); upgradeButton.x = -150; upgradeButton.y = -80; var upgradeBtnText = new Text2('Upgrade Age\n' + (playerAge < 3 ? ageCosts[playerAge + 1] + ' Gold' : 'Max Age'), { size: 30, fill: 0xFFFFFF }); upgradeBtnText.anchor.set(0.5, 0.5); upgradeButton.addChild(upgradeBtnText); // Age display var ageNames = ['Stone Age', 'Medieval', 'Modern', 'Future']; var ageText = new Text2('Age: ' + ageNames[playerAge], { size: 50, fill: 0xFFFFFF }); ageText.anchor.set(0.5, 0); LK.gui.top.addChild(ageText); ageText.y = 80; // Timers for spawning var playerSpawnTimer = 0; var enemySpawnTimer = 0; // Touch handlers spawnButton.down = function (x, y, obj) { if (playerGold >= unitCosts[playerAge]) { spawnPlayerUnit(); } }; upgradeButton.down = function (x, y, obj) { if (playerAge < 3 && playerGold >= ageCosts[playerAge + 1]) { upgradePlayerAge(); } }; // Game functions function spawnPlayerUnit() { if (playerGold >= unitCosts[playerAge]) { playerGold -= unitCosts[playerAge]; var unit = new PlayerUnit(playerAge); unit.x = 300; unit.y = 2400; playerUnits.push(unit); game.addChild(unit); LK.getSound('unitSpawn').play(); updateUI(); } } function spawnEnemyUnit() { var unit = new EnemyUnit(enemyAge); unit.x = 1748; unit.y = 2400; enemyUnits.push(unit); game.addChild(unit); } function upgradePlayerAge() { if (playerAge < 3 && playerGold >= ageCosts[playerAge + 1]) { playerGold -= ageCosts[playerAge + 1]; playerAge++; playerBase.upgradeAge(); LK.getSound('upgrade').play(); updateUI(); } } function upgradeEnemyAge() { if (enemyAge < 3) { enemyAge++; enemyBase.upgradeAge(); } } function updateUI() { goldText.setText('Gold: ' + playerGold); playerHpText.setText('Player HP: ' + Math.max(0, playerBase.hp)); enemyHpText.setText('Enemy HP: ' + Math.max(0, enemyBase.hp)); spawnBtnText.setText('Spawn Unit\n' + unitCosts[playerAge] + ' Gold'); upgradeBtnText.setText(playerAge < 3 ? 'Upgrade Age\n' + ageCosts[playerAge + 1] + ' Gold' : 'Max Age'); ageText.setText('Age: ' + ageNames[playerAge]); } // Main game update game.update = function () { // Auto-spawn units playerSpawnTimer++; enemySpawnTimer++; if (playerSpawnTimer >= 180) { if (playerGold >= unitCosts[playerAge]) { spawnPlayerUnit(); } playerSpawnTimer = 0; } if (enemySpawnTimer >= 200) { spawnEnemyUnit(); enemySpawnTimer = 0; } // Auto-upgrade enemy age if (LK.ticks % 1800 == 0 && enemyAge < 3) { upgradeEnemyAge(); } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; if (bullet.target && bullet.target.parent) { // Check collision with target if (bullet.intersects(bullet.target)) { var died = bullet.target.takeDamage(bullet.damage); if (died) { if (bullet.target.isPlayer !== undefined) { // It's a unit if (!bullet.target.isPlayer) { playerGold += 25; } var unitArray = bullet.target.isPlayer ? playerUnits : enemyUnits; var unitIndex = unitArray.indexOf(bullet.target); if (unitIndex > -1) { unitArray.splice(unitIndex, 1); } bullet.target.destroy(); } } bullet.destroy(); bullets.splice(i, 1); continue; } } // Remove bullets that go off screen if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) { bullet.destroy(); bullets.splice(i, 1); } } // Update player units for (var i = playerUnits.length - 1; i >= 0; i--) { var unit = playerUnits[i]; // Check if unit reached enemy base if (unit.x >= 1700) { var died = enemyBase.takeDamage(unit.damage); unit.destroy(); playerUnits.splice(i, 1); if (died) { LK.showYouWin(); return; } continue; } // Check combat with enemy units var inCombat = false; for (var j = 0; j < enemyUnits.length; j++) { var enemy = enemyUnits[j]; var distance = Math.abs(unit.x - enemy.x); if (distance < 80) { inCombat = true; var damage = unit.attack(enemy); if (damage > 0) { var enemyDied = enemy.takeDamage(damage); LK.getSound('combat').play(); if (enemyDied) { playerGold += 25; enemy.destroy(); enemyUnits.splice(j, 1); j--; } } break; } } if (!inCombat) { unit.target = null; } } // Update enemy units for (var i = enemyUnits.length - 1; i >= 0; i--) { var unit = enemyUnits[i]; // Check if unit reached player base if (unit.x <= 348) { var died = playerBase.takeDamage(unit.damage); unit.destroy(); enemyUnits.splice(i, 1); if (died) { LK.showGameOver(); return; } continue; } // Check combat with player units var inCombat = false; for (var j = 0; j < playerUnits.length; j++) { var player = playerUnits[j]; var distance = Math.abs(unit.x - player.x); if (distance < 80) { inCombat = true; var damage = unit.attack(player); if (damage > 0) { var playerDied = player.takeDamage(damage); if (playerDied) { player.destroy(); playerUnits.splice(j, 1); j--; } } break; } } if (!inCombat) { unit.target = null; } } // Base turret shooting if (playerUnits.length > 0) { var nearbyEnemies = enemyUnits.filter(function (unit) { return unit.x > 1400; }); enemyBase.shootTurret(nearbyEnemies); } if (enemyUnits.length > 0) { var nearbyPlayers = playerUnits.filter(function (unit) { return unit.x < 648; }); playerBase.shootTurret(nearbyPlayers); } updateUI(); };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,469 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Base = Container.expand(function (isPlayer) {
+ var self = Container.call(this);
+ self.isPlayer = isPlayer;
+ self.age = 0;
+ self.maxHp = 1000;
+ self.hp = self.maxHp;
+ self.turretCooldown = 0;
+ var assetNames = isPlayer ? ['playerBaseStone', 'playerBaseMedieval', 'playerBaseModern', 'playerBaseFuture'] : ['enemyBaseStone', 'enemyBaseMedieval', 'enemyBaseModern', 'enemyBaseFuture'];
+ self.baseGraphics = self.attachAsset(assetNames[self.age], {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.turret = self.addChild(LK.getAsset(isPlayer ? 'playerTurret' : 'enemyTurret', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ }));
+ self.turret.x = 0;
+ self.turret.y = -200;
+ self.update = function () {
+ if (self.turretCooldown > 0) {
+ self.turretCooldown--;
+ }
+ };
+ self.takeDamage = function (damage) {
+ self.hp -= damage;
+ LK.effects.flashObject(self, 0xFF0000, 300);
+ LK.getSound('baseHit').play();
+ if (self.hp <= 0) {
+ return true;
+ }
+ return false;
+ };
+ self.upgradeAge = function () {
+ if (self.age < 3) {
+ self.age++;
+ self.removeChild(self.baseGraphics);
+ var assetNames = self.isPlayer ? ['playerBaseStone', 'playerBaseMedieval', 'playerBaseModern', 'playerBaseFuture'] : ['enemyBaseStone', 'enemyBaseMedieval', 'enemyBaseModern', 'enemyBaseFuture'];
+ self.baseGraphics = self.attachAsset(assetNames[self.age], {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ }
+ };
+ self.shootTurret = function (targets) {
+ if (self.turretCooldown <= 0 && targets.length > 0) {
+ var target = targets[0];
+ var bullet = new Bullet(self.isPlayer, self.x, self.y - 200, target);
+ bullets.push(bullet);
+ game.addChild(bullet);
+ self.turretCooldown = 30;
+ }
+ };
+ return self;
+});
+var Bullet = Container.expand(function (isPlayer, startX, startY, target) {
+ var self = Container.call(this);
+ self.isPlayer = isPlayer;
+ self.target = target;
+ self.speed = 8;
+ self.damage = 30;
+ var bulletGraphics = self.attachAsset(isPlayer ? 'playerBullet' : 'enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.x = startX;
+ self.y = startY;
+ // Calculate direction to target
+ var dx = target.x - startX;
+ var dy = target.y - startY;
+ 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 EnemyUnit = Container.expand(function (age) {
+ var self = Container.call(this);
+ self.age = age || 0;
+ self.hp = (self.age + 1) * 50;
+ self.maxHp = self.hp;
+ self.damage = (self.age + 1) * 25;
+ self.speed = -2;
+ self.attackCooldown = 0;
+ self.target = null;
+ var assetNames = ['enemyUnitStone', 'enemyUnitMedieval', 'enemyUnitModern', 'enemyUnitFuture'];
+ var unitGraphics = self.attachAsset(assetNames[self.age], {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.update = function () {
+ if (self.attackCooldown > 0) {
+ self.attackCooldown--;
+ }
+ // Move towards player base
+ if (!self.target) {
+ self.x += self.speed;
+ }
+ };
+ self.takeDamage = function (damage) {
+ self.hp -= damage;
+ LK.effects.flashObject(self, 0xFF0000, 200);
+ if (self.hp <= 0) {
+ return true;
+ }
+ return false;
+ };
+ self.attack = function (target) {
+ if (self.attackCooldown <= 0) {
+ self.attackCooldown = 60;
+ return self.damage;
+ }
+ return 0;
+ };
+ return self;
+});
+var PlayerUnit = Container.expand(function (age) {
+ var self = Container.call(this);
+ self.age = age || 0;
+ self.hp = (self.age + 1) * 50;
+ self.maxHp = self.hp;
+ self.damage = (self.age + 1) * 25;
+ self.speed = 2;
+ self.attackCooldown = 0;
+ self.target = null;
+ var assetNames = ['playerUnitStone', 'playerUnitMedieval', 'playerUnitModern', 'playerUnitFuture'];
+ var unitGraphics = self.attachAsset(assetNames[self.age], {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.update = function () {
+ if (self.attackCooldown > 0) {
+ self.attackCooldown--;
+ }
+ // Move towards enemy base
+ if (!self.target) {
+ self.x += self.speed;
+ }
+ };
+ self.takeDamage = function (damage) {
+ self.hp -= damage;
+ LK.effects.flashObject(self, 0xFF0000, 200);
+ if (self.hp <= 0) {
+ return true;
+ }
+ return false;
+ };
+ self.attack = function (target) {
+ if (self.attackCooldown <= 0) {
+ self.attackCooldown = 60;
+ return self.damage;
+ }
+ return 0;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+// Sound assets
+// Turret assets
+// Bullet assets
+// Enemy unit assets for different ages
+// Player unit assets for different ages
+// Enemy base assets for different ages
+// Player base assets for different ages
+// Game state variables
+var playerGold = 100;
+var playerAge = 0;
+var enemyAge = 0;
+var gameSpeed = 1;
+// Game objects arrays
+var playerUnits = [];
+var enemyUnits = [];
+var bullets = [];
+// Age costs and unit costs
+var ageCosts = [0, 200, 500, 1000];
+var unitCosts = [50, 100, 200, 400];
+// Create bases
+var playerBase = game.addChild(new Base(true));
+playerBase.x = 200;
+playerBase.y = 2400;
+var enemyBase = game.addChild(new Base(false));
+enemyBase.x = 1848;
+enemyBase.y = 2400;
+// Create ground
+var ground = game.addChild(LK.getAsset({
+ anchorX: 0,
+ anchorY: 0
+}, {}));
+ground.x = 0;
+ground.y = 2400;
+// UI Elements
+var goldText = new Text2('Gold: ' + playerGold, {
+ size: 60,
+ fill: 0xFFD700
+});
+goldText.anchor.set(0, 0);
+LK.gui.topLeft.addChild(goldText);
+goldText.x = 120;
+goldText.y = 20;
+var playerHpText = new Text2('Player HP: ' + playerBase.hp, {
+ size: 50,
+ fill: 0x00FF00
+});
+playerHpText.anchor.set(0, 0);
+LK.gui.top.addChild(playerHpText);
+playerHpText.x = -200;
+playerHpText.y = 20;
+var enemyHpText = new Text2('Enemy HP: ' + enemyBase.hp, {
+ size: 50,
+ fill: 0xFF0000
+});
+enemyHpText.anchor.set(0, 0);
+LK.gui.top.addChild(enemyHpText);
+enemyHpText.x = 200;
+enemyHpText.y = 20;
+// Spawn unit button
+var spawnButton = LK.gui.bottomLeft.addChild(LK.getAsset({
+ anchorX: 0.5,
+ anchorY: 0.5
+}, {}));
+spawnButton.x = 150;
+spawnButton.y = -80;
+var spawnBtnText = new Text2('Spawn Unit\n' + unitCosts[playerAge] + ' Gold', {
+ size: 30,
+ fill: 0xFFFFFF
+});
+spawnBtnText.anchor.set(0.5, 0.5);
+spawnButton.addChild(spawnBtnText);
+// Age upgrade button
+var upgradeButton = LK.gui.bottomRight.addChild(LK.getAsset({
+ anchorX: 0.5,
+ anchorY: 0.5
+}, {}));
+upgradeButton.x = -150;
+upgradeButton.y = -80;
+var upgradeBtnText = new Text2('Upgrade Age\n' + (playerAge < 3 ? ageCosts[playerAge + 1] + ' Gold' : 'Max Age'), {
+ size: 30,
+ fill: 0xFFFFFF
+});
+upgradeBtnText.anchor.set(0.5, 0.5);
+upgradeButton.addChild(upgradeBtnText);
+// Age display
+var ageNames = ['Stone Age', 'Medieval', 'Modern', 'Future'];
+var ageText = new Text2('Age: ' + ageNames[playerAge], {
+ size: 50,
+ fill: 0xFFFFFF
+});
+ageText.anchor.set(0.5, 0);
+LK.gui.top.addChild(ageText);
+ageText.y = 80;
+// Timers for spawning
+var playerSpawnTimer = 0;
+var enemySpawnTimer = 0;
+// Touch handlers
+spawnButton.down = function (x, y, obj) {
+ if (playerGold >= unitCosts[playerAge]) {
+ spawnPlayerUnit();
+ }
+};
+upgradeButton.down = function (x, y, obj) {
+ if (playerAge < 3 && playerGold >= ageCosts[playerAge + 1]) {
+ upgradePlayerAge();
+ }
+};
+// Game functions
+function spawnPlayerUnit() {
+ if (playerGold >= unitCosts[playerAge]) {
+ playerGold -= unitCosts[playerAge];
+ var unit = new PlayerUnit(playerAge);
+ unit.x = 300;
+ unit.y = 2400;
+ playerUnits.push(unit);
+ game.addChild(unit);
+ LK.getSound('unitSpawn').play();
+ updateUI();
+ }
+}
+function spawnEnemyUnit() {
+ var unit = new EnemyUnit(enemyAge);
+ unit.x = 1748;
+ unit.y = 2400;
+ enemyUnits.push(unit);
+ game.addChild(unit);
+}
+function upgradePlayerAge() {
+ if (playerAge < 3 && playerGold >= ageCosts[playerAge + 1]) {
+ playerGold -= ageCosts[playerAge + 1];
+ playerAge++;
+ playerBase.upgradeAge();
+ LK.getSound('upgrade').play();
+ updateUI();
+ }
+}
+function upgradeEnemyAge() {
+ if (enemyAge < 3) {
+ enemyAge++;
+ enemyBase.upgradeAge();
+ }
+}
+function updateUI() {
+ goldText.setText('Gold: ' + playerGold);
+ playerHpText.setText('Player HP: ' + Math.max(0, playerBase.hp));
+ enemyHpText.setText('Enemy HP: ' + Math.max(0, enemyBase.hp));
+ spawnBtnText.setText('Spawn Unit\n' + unitCosts[playerAge] + ' Gold');
+ upgradeBtnText.setText(playerAge < 3 ? 'Upgrade Age\n' + ageCosts[playerAge + 1] + ' Gold' : 'Max Age');
+ ageText.setText('Age: ' + ageNames[playerAge]);
+}
+// Main game update
+game.update = function () {
+ // Auto-spawn units
+ playerSpawnTimer++;
+ enemySpawnTimer++;
+ if (playerSpawnTimer >= 180) {
+ if (playerGold >= unitCosts[playerAge]) {
+ spawnPlayerUnit();
+ }
+ playerSpawnTimer = 0;
+ }
+ if (enemySpawnTimer >= 200) {
+ spawnEnemyUnit();
+ enemySpawnTimer = 0;
+ }
+ // Auto-upgrade enemy age
+ if (LK.ticks % 1800 == 0 && enemyAge < 3) {
+ upgradeEnemyAge();
+ }
+ // Update bullets
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ if (bullet.target && bullet.target.parent) {
+ // Check collision with target
+ if (bullet.intersects(bullet.target)) {
+ var died = bullet.target.takeDamage(bullet.damage);
+ if (died) {
+ if (bullet.target.isPlayer !== undefined) {
+ // It's a unit
+ if (!bullet.target.isPlayer) {
+ playerGold += 25;
+ }
+ var unitArray = bullet.target.isPlayer ? playerUnits : enemyUnits;
+ var unitIndex = unitArray.indexOf(bullet.target);
+ if (unitIndex > -1) {
+ unitArray.splice(unitIndex, 1);
+ }
+ bullet.target.destroy();
+ }
+ }
+ bullet.destroy();
+ bullets.splice(i, 1);
+ continue;
+ }
+ }
+ // Remove bullets that go off screen
+ if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
+ bullet.destroy();
+ bullets.splice(i, 1);
+ }
+ }
+ // Update player units
+ for (var i = playerUnits.length - 1; i >= 0; i--) {
+ var unit = playerUnits[i];
+ // Check if unit reached enemy base
+ if (unit.x >= 1700) {
+ var died = enemyBase.takeDamage(unit.damage);
+ unit.destroy();
+ playerUnits.splice(i, 1);
+ if (died) {
+ LK.showYouWin();
+ return;
+ }
+ continue;
+ }
+ // Check combat with enemy units
+ var inCombat = false;
+ for (var j = 0; j < enemyUnits.length; j++) {
+ var enemy = enemyUnits[j];
+ var distance = Math.abs(unit.x - enemy.x);
+ if (distance < 80) {
+ inCombat = true;
+ var damage = unit.attack(enemy);
+ if (damage > 0) {
+ var enemyDied = enemy.takeDamage(damage);
+ LK.getSound('combat').play();
+ if (enemyDied) {
+ playerGold += 25;
+ enemy.destroy();
+ enemyUnits.splice(j, 1);
+ j--;
+ }
+ }
+ break;
+ }
+ }
+ if (!inCombat) {
+ unit.target = null;
+ }
+ }
+ // Update enemy units
+ for (var i = enemyUnits.length - 1; i >= 0; i--) {
+ var unit = enemyUnits[i];
+ // Check if unit reached player base
+ if (unit.x <= 348) {
+ var died = playerBase.takeDamage(unit.damage);
+ unit.destroy();
+ enemyUnits.splice(i, 1);
+ if (died) {
+ LK.showGameOver();
+ return;
+ }
+ continue;
+ }
+ // Check combat with player units
+ var inCombat = false;
+ for (var j = 0; j < playerUnits.length; j++) {
+ var player = playerUnits[j];
+ var distance = Math.abs(unit.x - player.x);
+ if (distance < 80) {
+ inCombat = true;
+ var damage = unit.attack(player);
+ if (damage > 0) {
+ var playerDied = player.takeDamage(damage);
+ if (playerDied) {
+ player.destroy();
+ playerUnits.splice(j, 1);
+ j--;
+ }
+ }
+ break;
+ }
+ }
+ if (!inCombat) {
+ unit.target = null;
+ }
+ }
+ // Base turret shooting
+ if (playerUnits.length > 0) {
+ var nearbyEnemies = enemyUnits.filter(function (unit) {
+ return unit.x > 1400;
+ });
+ enemyBase.shootTurret(nearbyEnemies);
+ }
+ if (enemyUnits.length > 0) {
+ var nearbyPlayers = playerUnits.filter(function (unit) {
+ return unit.x < 648;
+ });
+ playerBase.shootTurret(nearbyPlayers);
+ }
+ updateUI();
+};
\ No newline at end of file