/****
* 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();
};