/**** 
* 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, unitType) {
	var self = Container.call(this);
	self.age = age || 0;
	self.unitType = unitType || 0;
	// Unit stats based on type: Light(0), Medium(1), Heavy(2)
	var hpMultipliers = [40, 80, 120];
	var damageMultipliers = [20, 40, 60];
	var speedMultipliers = [3, 2, 1];
	self.hp = (self.age + 1) * hpMultipliers[self.unitType];
	self.maxHp = self.hp;
	self.damage = (self.age + 1) * damageMultipliers[self.unitType];
	self.speed = -speedMultipliers[self.unitType];
	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
	});
	// Visual scaling based on unit type
	var scales = [0.8, 1.0, 1.2];
	unitGraphics.scaleX = scales[self.unitType];
	unitGraphics.scaleY = scales[self.unitType];
	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, unitType) {
	var self = Container.call(this);
	self.age = age || 0;
	self.unitType = unitType || 0;
	// Unit stats based on type: Light(0), Medium(1), Heavy(2)
	var hpMultipliers = [40, 80, 120];
	var damageMultipliers = [20, 40, 60];
	var speedMultipliers = [3, 2, 1];
	self.hp = (self.age + 1) * hpMultipliers[self.unitType];
	self.maxHp = self.hp;
	self.damage = (self.age + 1) * damageMultipliers[self.unitType];
	self.speed = speedMultipliers[self.unitType];
	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
	});
	// Visual scaling based on unit type
	var scales = [0.8, 1.0, 1.2];
	unitGraphics.scaleX = scales[self.unitType];
	unitGraphics.scaleY = scales[self.unitType];
	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
****/ 
// Game state variables
// Player base assets for different ages
// Enemy base assets for different ages
// Player unit assets for different ages
// Enemy unit assets for different ages
// Bullet assets
// Turret assets
// Sound assets
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 = [[30, 60, 120],
// Stone Age: Light, Medium, Heavy
[60, 120, 240],
// Medieval: Light, Medium, Heavy  
[120, 240, 480],
// Modern: Light, Medium, Heavy
[240, 480, 960] // Future: Light, Medium, Heavy
];
// Gold generation timer
var goldTimer = 0;
// 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;
// Three unit spawn buttons
var spawnButtons = [];
var spawnButtonTexts = [];
var unitNames = ['Light', 'Medium', 'Heavy'];
for (var b = 0; b < 3; b++) {
	var spawnButton = LK.gui.bottomLeft.addChild(LK.getAsset('spawnBtn', {
		anchorX: 0.5,
		anchorY: 0.5
	}));
	spawnButton.x = 150 + b * 220;
	spawnButton.y = -80;
	spawnButton.unitType = b;
	var spawnBtnText = new Text2(unitNames[b] + '\n' + unitCosts[playerAge][b] + ' Gold', {
		size: 25,
		fill: 0xFFFFFF
	});
	spawnBtnText.anchor.set(0.5, 0.5);
	spawnButton.addChild(spawnBtnText);
	spawnButtons.push(spawnButton);
	spawnButtonTexts.push(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;
// Timer for enemy spawning
var enemySpawnTimer = 0;
// Touch handlers for unit spawn buttons
for (var i = 0; i < 3; i++) {
	(function (buttonIndex) {
		spawnButtons[buttonIndex].down = function (x, y, obj) {
			if (playerGold >= unitCosts[playerAge][buttonIndex]) {
				spawnPlayerUnit(buttonIndex);
			}
		};
	})(i);
}
upgradeButton.down = function (x, y, obj) {
	if (playerAge < 3 && playerGold >= ageCosts[playerAge + 1]) {
		upgradePlayerAge();
	}
};
// Game functions
function spawnPlayerUnit(unitType) {
	unitType = unitType || 0;
	if (playerGold >= unitCosts[playerAge][unitType]) {
		playerGold -= unitCosts[playerAge][unitType];
		var unit = new PlayerUnit(playerAge, unitType);
		unit.x = 300;
		unit.y = 2400;
		playerUnits.push(unit);
		game.addChild(unit);
		LK.getSound('unitSpawn').play();
		updateUI();
	}
}
function spawnEnemyUnit() {
	var unitType = Math.floor(Math.random() * 3);
	var unit = new EnemyUnit(enemyAge, unitType);
	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));
	// Update all three unit buttons
	for (var i = 0; i < 3; i++) {
		spawnButtonTexts[i].setText(unitNames[i] + '\n' + unitCosts[playerAge][i] + ' 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 () {
	// Generate gold every second (60 ticks)
	goldTimer++;
	if (goldTimer >= 60) {
		playerGold += 10;
		goldTimer = 0;
	}
	// Enemy auto-spawn only
	enemySpawnTimer++;
	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();
}; /**** 
* 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, unitType) {
	var self = Container.call(this);
	self.age = age || 0;
	self.unitType = unitType || 0;
	// Unit stats based on type: Light(0), Medium(1), Heavy(2)
	var hpMultipliers = [40, 80, 120];
	var damageMultipliers = [20, 40, 60];
	var speedMultipliers = [3, 2, 1];
	self.hp = (self.age + 1) * hpMultipliers[self.unitType];
	self.maxHp = self.hp;
	self.damage = (self.age + 1) * damageMultipliers[self.unitType];
	self.speed = -speedMultipliers[self.unitType];
	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
	});
	// Visual scaling based on unit type
	var scales = [0.8, 1.0, 1.2];
	unitGraphics.scaleX = scales[self.unitType];
	unitGraphics.scaleY = scales[self.unitType];
	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, unitType) {
	var self = Container.call(this);
	self.age = age || 0;
	self.unitType = unitType || 0;
	// Unit stats based on type: Light(0), Medium(1), Heavy(2)
	var hpMultipliers = [40, 80, 120];
	var damageMultipliers = [20, 40, 60];
	var speedMultipliers = [3, 2, 1];
	self.hp = (self.age + 1) * hpMultipliers[self.unitType];
	self.maxHp = self.hp;
	self.damage = (self.age + 1) * damageMultipliers[self.unitType];
	self.speed = speedMultipliers[self.unitType];
	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
	});
	// Visual scaling based on unit type
	var scales = [0.8, 1.0, 1.2];
	unitGraphics.scaleX = scales[self.unitType];
	unitGraphics.scaleY = scales[self.unitType];
	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
****/ 
// Game state variables
// Player base assets for different ages
// Enemy base assets for different ages
// Player unit assets for different ages
// Enemy unit assets for different ages
// Bullet assets
// Turret assets
// Sound assets
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 = [[30, 60, 120],
// Stone Age: Light, Medium, Heavy
[60, 120, 240],
// Medieval: Light, Medium, Heavy  
[120, 240, 480],
// Modern: Light, Medium, Heavy
[240, 480, 960] // Future: Light, Medium, Heavy
];
// Gold generation timer
var goldTimer = 0;
// 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;
// Three unit spawn buttons
var spawnButtons = [];
var spawnButtonTexts = [];
var unitNames = ['Light', 'Medium', 'Heavy'];
for (var b = 0; b < 3; b++) {
	var spawnButton = LK.gui.bottomLeft.addChild(LK.getAsset('spawnBtn', {
		anchorX: 0.5,
		anchorY: 0.5
	}));
	spawnButton.x = 150 + b * 220;
	spawnButton.y = -80;
	spawnButton.unitType = b;
	var spawnBtnText = new Text2(unitNames[b] + '\n' + unitCosts[playerAge][b] + ' Gold', {
		size: 25,
		fill: 0xFFFFFF
	});
	spawnBtnText.anchor.set(0.5, 0.5);
	spawnButton.addChild(spawnBtnText);
	spawnButtons.push(spawnButton);
	spawnButtonTexts.push(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;
// Timer for enemy spawning
var enemySpawnTimer = 0;
// Touch handlers for unit spawn buttons
for (var i = 0; i < 3; i++) {
	(function (buttonIndex) {
		spawnButtons[buttonIndex].down = function (x, y, obj) {
			if (playerGold >= unitCosts[playerAge][buttonIndex]) {
				spawnPlayerUnit(buttonIndex);
			}
		};
	})(i);
}
upgradeButton.down = function (x, y, obj) {
	if (playerAge < 3 && playerGold >= ageCosts[playerAge + 1]) {
		upgradePlayerAge();
	}
};
// Game functions
function spawnPlayerUnit(unitType) {
	unitType = unitType || 0;
	if (playerGold >= unitCosts[playerAge][unitType]) {
		playerGold -= unitCosts[playerAge][unitType];
		var unit = new PlayerUnit(playerAge, unitType);
		unit.x = 300;
		unit.y = 2400;
		playerUnits.push(unit);
		game.addChild(unit);
		LK.getSound('unitSpawn').play();
		updateUI();
	}
}
function spawnEnemyUnit() {
	var unitType = Math.floor(Math.random() * 3);
	var unit = new EnemyUnit(enemyAge, unitType);
	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));
	// Update all three unit buttons
	for (var i = 0; i < 3; i++) {
		spawnButtonTexts[i].setText(unitNames[i] + '\n' + unitCosts[playerAge][i] + ' 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 () {
	// Generate gold every second (60 ticks)
	goldTimer++;
	if (goldTimer >= 60) {
		playerGold += 10;
		goldTimer = 0;
	}
	// Enemy auto-spawn only
	enemySpawnTimer++;
	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();
};