/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 20;
self.maxHealth = 20;
self.speed = 2;
self.damage = 5;
self.reward = 25;
self.targetX = 0;
self.targetY = 0;
self.lastX = self.x;
self.lastY = self.y;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
var EnemyBoss = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemyBoss', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 200;
self.maxHealth = 200;
self.speed = 1.5;
self.damage = 15;
self.reward = 500;
self.targetX = 0;
self.targetY = 0;
self.lastX = self.x;
self.lastY = self.y;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
var Projectile = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('projectile', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.targetX = 0;
self.targetY = 0;
self.damage = 10;
self.lastY = 0;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < self.speed) {
self.reachedTarget = true;
} else {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
var Soldier = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('soldier', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 30;
self.maxHealth = 30;
self.damage = 10;
self.fireRate = 30;
self.range = 300;
self.fireCounter = 0;
self.cost = 50;
self.type = 'soldier';
self.update = function () {
self.fireCounter++;
};
return self;
});
var Tank = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('tank', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 80;
self.maxHealth = 80;
self.damage = 25;
self.fireRate = 45;
self.range = 350;
self.fireCounter = 0;
self.cost = 120;
self.type = 'tank';
self.update = function () {
self.fireCounter++;
};
return self;
});
var Turret = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('turret', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 50;
self.maxHealth = 50;
self.damage = 15;
self.fireRate = 20;
self.range = 400;
self.fireCounter = 0;
self.cost = 80;
self.type = 'turret';
self.update = function () {
self.fireCounter++;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var baseHealth = 100;
var maxBaseHealth = 100;
var resources = 200;
var maxResources = 500;
var wave = 1;
var score = 0;
var gameActive = true;
var units = [];
var enemies = [];
var projectiles = [];
var selectedUnit = null;
var resourceSpawns = [];
var waveActive = false;
var waveCounter = 0;
var waveDelay = 180;
var baseX = 2048 / 2;
var baseY = 2732 / 2;
var base = game.addChild(LK.getAsset('base', {
anchorX: 0.5,
anchorY: 0.5,
x: baseX,
y: baseY
}));
var healthText = new Text2(baseHealth + ' HP', {
size: 80,
fill: '#FF5252'
});
healthText.anchor.set(0.5, 0.5);
healthText.x = baseX;
healthText.y = baseY - 150;
game.addChild(healthText);
var resourceText = new Text2('Resources: ' + resources, {
size: 60,
fill: '#FFD700'
});
resourceText.anchor.set(0, 0);
resourceText.x = 100;
resourceText.y = 100;
LK.gui.top.addChild(resourceText);
var waveText = new Text2('Wave: ' + wave, {
size: 60,
fill: '#FFFFFF'
});
waveText.anchor.set(0.5, 0);
waveText.x = 1024;
waveText.y = 50;
LK.gui.top.addChild(waveText);
var scoreText = new Text2('Enemies Defeated: ' + score, {
size: 50,
fill: '#00FF00'
});
scoreText.anchor.set(1, 0);
scoreText.x = 2048 - 100;
scoreText.y = 100;
LK.gui.top.addChild(scoreText);
var unitCostText = new Text2('Soldier: 50 | Tank: 120 | Turret: 80', {
size: 40,
fill: '#FFFFFF'
});
unitCostText.anchor.set(0.5, 1);
unitCostText.x = 1024;
unitCostText.y = 2732 - 50;
LK.gui.bottom.addChild(unitCostText);
function spawnEnemy(x, y, isBoss) {
var enemy;
if (isBoss) {
enemy = new EnemyBoss();
enemy.targetX = baseX;
enemy.targetY = baseY;
} else {
enemy = new Enemy();
enemy.targetX = baseX;
enemy.targetY = baseY;
}
enemy.x = x;
enemy.y = y;
enemy.lastX = x;
enemy.lastY = y;
game.addChild(enemy);
enemies.push(enemy);
}
function spawnWave() {
waveActive = true;
waveCounter = 0;
var enemyCount = 3 + wave * 2;
var spawnPositions = [{
x: 200,
y: 200
}, {
x: 1848,
y: 200
}, {
x: 200,
y: 2532
}, {
x: 1848,
y: 2532
}];
var spawnIndex = 0;
for (var i = 0; i < enemyCount; i++) {
var pos = spawnPositions[spawnIndex % spawnPositions.length];
spawnEnemy(pos.x, pos.y, false);
spawnIndex++;
}
if (wave > 3) {
spawnEnemy(1024, 100, true);
}
}
function deployUnit(unitType, clickX, clickY) {
var unitCost = 0;
var unit = null;
if (unitType === 'soldier') {
unitCost = 50;
unit = new Soldier();
} else if (unitType === 'tank') {
unitCost = 120;
unit = new Tank();
} else if (unitType === 'turret') {
unitCost = 80;
unit = new Turret();
}
if (unit && resources >= unitCost) {
resources -= unitCost;
unit.x = clickX;
unit.y = clickY;
game.addChild(unit);
units.push(unit);
LK.getSound('deploy').play();
return true;
}
return false;
}
function findClosestEnemy(fromX, fromY, range) {
var closest = null;
var closestDist = range + 1;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - fromX;
var dy = enemy.y - fromY;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < closestDist) {
closest = enemy;
closestDist = dist;
}
}
return closest;
}
function fireProjectile(fromX, fromY, toX, toY, damage) {
var projectile = new Projectile();
projectile.x = fromX;
projectile.y = fromY;
projectile.targetX = toX;
projectile.targetY = toY;
projectile.damage = damage;
game.addChild(projectile);
projectiles.push(projectile);
LK.getSound('shoot').play();
}
function damageEnemy(enemy, damage) {
enemy.health -= damage;
LK.effects.flashObject(enemy, 0xFFFF00, 200);
if (enemy.health <= 0) {
enemy.destroy();
enemies.splice(enemies.indexOf(enemy), 1);
score++;
resources += Math.floor(enemy.reward / 2);
LK.setScore(score);
LK.getSound('explosion').play();
}
}
function damageBase(damage) {
baseHealth -= damage;
LK.effects.flashObject(base, 0xFF0000, 300);
if (baseHealth <= 0) {
baseHealth = 0;
gameActive = false;
LK.showGameOver();
}
}
game.down = function (x, y, obj) {
if (!gameActive) return;
var clickX = x;
var clickY = y;
if (clickX < 400 && clickY > 2400) {
if (deployUnit('soldier', clickX + 200, clickY - 200)) {
selectedUnit = units[units.length - 1];
}
} else if (clickX < 1200 && clickX >= 400 && clickY > 2400) {
if (deployUnit('tank', clickX + 200, clickY - 200)) {
selectedUnit = units[units.length - 1];
}
} else if (clickX >= 1200 && clickY > 2400) {
if (deployUnit('turret', clickX - 200, clickY - 200)) {
selectedUnit = units[units.length - 1];
}
} else {
selectedUnit = null;
}
};
game.update = function () {
if (!gameActive) return;
resourceText.setText('Resources: ' + resources);
healthText.setText(baseHealth + ' HP');
waveText.setText('Wave: ' + wave);
scoreText.setText('Enemies Defeated: ' + score);
if (!waveActive && waveDelay > 0) {
waveDelay--;
if (waveDelay === 0) {
spawnWave();
}
}
for (var u = units.length - 1; u >= 0; u--) {
var unit = units[u];
unit.update();
var target = findClosestEnemy(unit.x, unit.y, unit.range);
if (target && unit.fireCounter >= unit.fireRate) {
fireProjectile(unit.x, unit.y, target.x, target.y, unit.damage);
unit.fireCounter = 0;
}
}
for (var p = projectiles.length - 1; p >= 0; p--) {
var projectile = projectiles[p];
projectile.update();
if (projectile.reachedTarget) {
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
var dx = enemy.x - projectile.x;
var dy = enemy.y - projectile.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 60) {
damageEnemy(enemy, projectile.damage);
projectile.destroy();
projectiles.splice(p, 1);
break;
}
}
if (p < projectiles.length && projectiles[p] === projectile) {
projectile.destroy();
projectiles.splice(p, 1);
}
}
if (p < projectiles.length && projectile.y < -100) {
projectile.destroy();
projectiles.splice(p, 1);
}
}
for (var en = enemies.length - 1; en >= 0; en--) {
var enemy = enemies[en];
enemy.update();
var dx = baseX - enemy.x;
var dy = baseY - enemy.y;
var distToBase = Math.sqrt(dx * dx + dy * dy);
if (distToBase < 100) {
damageBase(enemy.damage);
enemy.destroy();
enemies.splice(en, 1);
}
}
if (waveActive && enemies.length === 0) {
waveActive = false;
wave++;
waveDelay = 180;
resources += 50 * wave;
if (resources > maxResources) {
resources = maxResources;
}
if (wave > 5) {
LK.showYouWin();
gameActive = false;
}
}
};
LK.playMusic('battleMusic', {
loop: true
});
spawnWave(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 20;
self.maxHealth = 20;
self.speed = 2;
self.damage = 5;
self.reward = 25;
self.targetX = 0;
self.targetY = 0;
self.lastX = self.x;
self.lastY = self.y;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
var EnemyBoss = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemyBoss', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 200;
self.maxHealth = 200;
self.speed = 1.5;
self.damage = 15;
self.reward = 500;
self.targetX = 0;
self.targetY = 0;
self.lastX = self.x;
self.lastY = self.y;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
var Projectile = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('projectile', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.targetX = 0;
self.targetY = 0;
self.damage = 10;
self.lastY = 0;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < self.speed) {
self.reachedTarget = true;
} else {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
var Soldier = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('soldier', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 30;
self.maxHealth = 30;
self.damage = 10;
self.fireRate = 30;
self.range = 300;
self.fireCounter = 0;
self.cost = 50;
self.type = 'soldier';
self.update = function () {
self.fireCounter++;
};
return self;
});
var Tank = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('tank', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 80;
self.maxHealth = 80;
self.damage = 25;
self.fireRate = 45;
self.range = 350;
self.fireCounter = 0;
self.cost = 120;
self.type = 'tank';
self.update = function () {
self.fireCounter++;
};
return self;
});
var Turret = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('turret', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 50;
self.maxHealth = 50;
self.damage = 15;
self.fireRate = 20;
self.range = 400;
self.fireCounter = 0;
self.cost = 80;
self.type = 'turret';
self.update = function () {
self.fireCounter++;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var baseHealth = 100;
var maxBaseHealth = 100;
var resources = 200;
var maxResources = 500;
var wave = 1;
var score = 0;
var gameActive = true;
var units = [];
var enemies = [];
var projectiles = [];
var selectedUnit = null;
var resourceSpawns = [];
var waveActive = false;
var waveCounter = 0;
var waveDelay = 180;
var baseX = 2048 / 2;
var baseY = 2732 / 2;
var base = game.addChild(LK.getAsset('base', {
anchorX: 0.5,
anchorY: 0.5,
x: baseX,
y: baseY
}));
var healthText = new Text2(baseHealth + ' HP', {
size: 80,
fill: '#FF5252'
});
healthText.anchor.set(0.5, 0.5);
healthText.x = baseX;
healthText.y = baseY - 150;
game.addChild(healthText);
var resourceText = new Text2('Resources: ' + resources, {
size: 60,
fill: '#FFD700'
});
resourceText.anchor.set(0, 0);
resourceText.x = 100;
resourceText.y = 100;
LK.gui.top.addChild(resourceText);
var waveText = new Text2('Wave: ' + wave, {
size: 60,
fill: '#FFFFFF'
});
waveText.anchor.set(0.5, 0);
waveText.x = 1024;
waveText.y = 50;
LK.gui.top.addChild(waveText);
var scoreText = new Text2('Enemies Defeated: ' + score, {
size: 50,
fill: '#00FF00'
});
scoreText.anchor.set(1, 0);
scoreText.x = 2048 - 100;
scoreText.y = 100;
LK.gui.top.addChild(scoreText);
var unitCostText = new Text2('Soldier: 50 | Tank: 120 | Turret: 80', {
size: 40,
fill: '#FFFFFF'
});
unitCostText.anchor.set(0.5, 1);
unitCostText.x = 1024;
unitCostText.y = 2732 - 50;
LK.gui.bottom.addChild(unitCostText);
function spawnEnemy(x, y, isBoss) {
var enemy;
if (isBoss) {
enemy = new EnemyBoss();
enemy.targetX = baseX;
enemy.targetY = baseY;
} else {
enemy = new Enemy();
enemy.targetX = baseX;
enemy.targetY = baseY;
}
enemy.x = x;
enemy.y = y;
enemy.lastX = x;
enemy.lastY = y;
game.addChild(enemy);
enemies.push(enemy);
}
function spawnWave() {
waveActive = true;
waveCounter = 0;
var enemyCount = 3 + wave * 2;
var spawnPositions = [{
x: 200,
y: 200
}, {
x: 1848,
y: 200
}, {
x: 200,
y: 2532
}, {
x: 1848,
y: 2532
}];
var spawnIndex = 0;
for (var i = 0; i < enemyCount; i++) {
var pos = spawnPositions[spawnIndex % spawnPositions.length];
spawnEnemy(pos.x, pos.y, false);
spawnIndex++;
}
if (wave > 3) {
spawnEnemy(1024, 100, true);
}
}
function deployUnit(unitType, clickX, clickY) {
var unitCost = 0;
var unit = null;
if (unitType === 'soldier') {
unitCost = 50;
unit = new Soldier();
} else if (unitType === 'tank') {
unitCost = 120;
unit = new Tank();
} else if (unitType === 'turret') {
unitCost = 80;
unit = new Turret();
}
if (unit && resources >= unitCost) {
resources -= unitCost;
unit.x = clickX;
unit.y = clickY;
game.addChild(unit);
units.push(unit);
LK.getSound('deploy').play();
return true;
}
return false;
}
function findClosestEnemy(fromX, fromY, range) {
var closest = null;
var closestDist = range + 1;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - fromX;
var dy = enemy.y - fromY;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < closestDist) {
closest = enemy;
closestDist = dist;
}
}
return closest;
}
function fireProjectile(fromX, fromY, toX, toY, damage) {
var projectile = new Projectile();
projectile.x = fromX;
projectile.y = fromY;
projectile.targetX = toX;
projectile.targetY = toY;
projectile.damage = damage;
game.addChild(projectile);
projectiles.push(projectile);
LK.getSound('shoot').play();
}
function damageEnemy(enemy, damage) {
enemy.health -= damage;
LK.effects.flashObject(enemy, 0xFFFF00, 200);
if (enemy.health <= 0) {
enemy.destroy();
enemies.splice(enemies.indexOf(enemy), 1);
score++;
resources += Math.floor(enemy.reward / 2);
LK.setScore(score);
LK.getSound('explosion').play();
}
}
function damageBase(damage) {
baseHealth -= damage;
LK.effects.flashObject(base, 0xFF0000, 300);
if (baseHealth <= 0) {
baseHealth = 0;
gameActive = false;
LK.showGameOver();
}
}
game.down = function (x, y, obj) {
if (!gameActive) return;
var clickX = x;
var clickY = y;
if (clickX < 400 && clickY > 2400) {
if (deployUnit('soldier', clickX + 200, clickY - 200)) {
selectedUnit = units[units.length - 1];
}
} else if (clickX < 1200 && clickX >= 400 && clickY > 2400) {
if (deployUnit('tank', clickX + 200, clickY - 200)) {
selectedUnit = units[units.length - 1];
}
} else if (clickX >= 1200 && clickY > 2400) {
if (deployUnit('turret', clickX - 200, clickY - 200)) {
selectedUnit = units[units.length - 1];
}
} else {
selectedUnit = null;
}
};
game.update = function () {
if (!gameActive) return;
resourceText.setText('Resources: ' + resources);
healthText.setText(baseHealth + ' HP');
waveText.setText('Wave: ' + wave);
scoreText.setText('Enemies Defeated: ' + score);
if (!waveActive && waveDelay > 0) {
waveDelay--;
if (waveDelay === 0) {
spawnWave();
}
}
for (var u = units.length - 1; u >= 0; u--) {
var unit = units[u];
unit.update();
var target = findClosestEnemy(unit.x, unit.y, unit.range);
if (target && unit.fireCounter >= unit.fireRate) {
fireProjectile(unit.x, unit.y, target.x, target.y, unit.damage);
unit.fireCounter = 0;
}
}
for (var p = projectiles.length - 1; p >= 0; p--) {
var projectile = projectiles[p];
projectile.update();
if (projectile.reachedTarget) {
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
var dx = enemy.x - projectile.x;
var dy = enemy.y - projectile.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 60) {
damageEnemy(enemy, projectile.damage);
projectile.destroy();
projectiles.splice(p, 1);
break;
}
}
if (p < projectiles.length && projectiles[p] === projectile) {
projectile.destroy();
projectiles.splice(p, 1);
}
}
if (p < projectiles.length && projectile.y < -100) {
projectile.destroy();
projectiles.splice(p, 1);
}
}
for (var en = enemies.length - 1; en >= 0; en--) {
var enemy = enemies[en];
enemy.update();
var dx = baseX - enemy.x;
var dy = baseY - enemy.y;
var distToBase = Math.sqrt(dx * dx + dy * dy);
if (distToBase < 100) {
damageBase(enemy.damage);
enemy.destroy();
enemies.splice(en, 1);
}
}
if (waveActive && enemies.length === 0) {
waveActive = false;
wave++;
waveDelay = 180;
resources += 50 * wave;
if (resources > maxResources) {
resources = maxResources;
}
if (wave > 5) {
LK.showYouWin();
gameActive = false;
}
}
};
LK.playMusic('battleMusic', {
loop: true
});
spawnWave();