/****
* 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(); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,433 @@
-/****
+/****
+* 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: 0x000000
-});
\ No newline at end of file
+ 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();
\ No newline at end of file