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