User prompt
When the wave get up. Do hard the game
User prompt
Do not in line . Do like list to do we can read also the money
User prompt
Make line that see icon to buy
User prompt
Add more defence tower button to buy.
User prompt
Add one big but defense tower
User prompt
Add button I cannot see the button to buy tower
User prompt
Add button for buy defence tower
User prompt
Add without money we cannot place defence tower
User prompt
We can see money total on top bottom
User prompt
Make a icon system. When kill zombie we get moneywe can see. Total money.
Code edit (1 edits merged)
Please save this source code
User prompt
Zombie Siege: Tower Wars
Initial prompt
Expanding the Threat: Enemy Bot Towers This addition significantly changes the defensive dynamic. It's no longer just about stopping zombies; you now have to contend with automated enemy defenses that are actively trying to dismantle your base. * Hostile AI Towers: These are automated enemy structures, perhaps built by a rival survivor faction or even by the zombies themselves (mutated, bio-mechanical constructs?). They'll deploy on the map and actively fire upon your main tower, your hero, and even your defensive turrets. * Strategic Targets: Unlike zombies, which are often numerous but individually weaker (though some are tough!), these bot towers would be fewer in number but heavily armed and armored. They become high-priority targets that you need to eliminate quickly to reduce incoming damage to your base. * Varied Bot Tower Types: * Artillery Bots: Long-range but slow-firing, lobbing projectiles that deal area-of-effect damage to your base or a cluster of your towers. * Assault Bots: Closer-range, rapid-fire turrets that focus on shredding individual defensive towers or your hero. * Disruption Bots: Don't deal direct damage, but emit EMPs or jamming signals that temporarily disable your towers, reduce their fire rate, or block your hero's abilities. * Repair Bots (Enemy): These might not attack directly but move around the map, actively repairing damaged enemy bot towers or even buffing nearby zombies. Taking these out first becomes crucial. * Counter-Strategies: * Target Prioritization: Players will need to decide whether to focus fire on the immediate zombie threat or divert resources and hero attention to neutralizing a dangerous enemy bot tower. * Specialized Towers: You might need specific tower types designed to counter these bots, such as EMP emitters to temporarily disable them, or armor-piercing turrets that are less effective against flesh-and-blood zombies but devastating against mechanical foes. * Hero Engagement: The hero unit becomes even more critical here. They could be the primary means to quickly take down bot towers, perhaps through specific "sabotage" abilities or by drawing their fire away from your main defenses. * Placement & Spawning: These bot towers could spawn at fixed locations, or they might occasionally drop in via aerial support or emerge from hidden bunkers. Their appearance could be tied to specific wave milestones or a rising "threat level." Adding these hostile bot towers introduces a fascinating "tower vs. tower" element to the game, demanding more tactical thinking and resource allocation beyond just fending off the zombie hordes. It forces players to be proactive in eliminating threats that aren't just moving along a path but are actively seeking to dismantle their defenses.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var DefenseTower = Container.expand(function () { var self = Container.call(this); var towerGraphics = self.attachAsset('defenseTower', { anchorX: 0.5, anchorY: 0.5 }); self.health = 200; self.maxHealth = 200; self.damage = 30; self.range = 300; self.shootCooldown = 0; self.update = function () { var target = self.findNearestEnemy(); if (target && self.shootCooldown <= 0) { self.shootAt(target); self.shootCooldown = 45; // 0.75 second cooldown } if (self.shootCooldown > 0) { self.shootCooldown--; } }; self.findNearestEnemy = function () { var nearest = null; var minDistance = Infinity; for (var i = 0; i < zombies.length; i++) { var zombie = zombies[i]; var distance = Math.sqrt(Math.pow(zombie.x - self.x, 2) + Math.pow(zombie.y - self.y, 2)); if (distance < minDistance && distance < self.range) { minDistance = distance; nearest = zombie; } } return nearest; }; self.shootAt = function (target) { var bullet = new TowerBullet(); bullet.x = self.x; bullet.y = self.y; bullet.targetX = target.x; bullet.targetY = target.y; bullet.damage = self.damage; towerBullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); }; self.takeDamage = function (amount) { self.health -= amount; LK.effects.flashObject(self, 0xff0000, 200); if (self.health <= 0) { self.die(); } }; self.die = function () { self.destroy(); var index = defenseTowers.indexOf(self); if (index > -1) { defenseTowers.splice(index, 1); } }; return self; }); var EnemyBot = Container.expand(function (botType) { var self = Container.call(this); var botGraphics = self.attachAsset(botType, { anchorX: 0.5, anchorY: 0.5 }); self.botType = botType; self.health = 150; self.maxHealth = 150; self.damage = 25; self.range = 350; self.shootCooldown = 0; // Set specific properties based on bot type if (botType === 'artilleryBot') { self.damage = 60; self.range = 400; self.shootCooldown = 90; // Slower but more powerful } else if (botType === 'assaultBot') { self.damage = 20; self.range = 250; self.shootCooldown = 20; // Faster firing } else if (botType === 'disruptionBot') { self.damage = 15; self.range = 300; self.shootCooldown = 120; // Special ability cooldown } else if (botType === 'repairBot') { self.damage = 0; self.range = 200; self.shootCooldown = 180; // Repair cooldown } self.update = function () { var target = self.findTarget(); if (target && self.shootCooldown <= 0) { if (self.botType === 'repairBot') { self.repairAllies(); } else { self.shootAt(target); } self.shootCooldown = self.getBaseCooldown(); } if (self.shootCooldown > 0) { self.shootCooldown--; } }; self.findTarget = function () { var targets = []; // Add player base as target var distanceToBase = Math.sqrt(Math.pow(playerBase.x - self.x, 2) + Math.pow(playerBase.y - self.y, 2)); if (distanceToBase < self.range) { targets.push({ target: playerBase, distance: distanceToBase }); } // Add hero as target var distanceToHero = Math.sqrt(Math.pow(hero.x - self.x, 2) + Math.pow(hero.y - self.y, 2)); if (distanceToHero < self.range) { targets.push({ target: hero, distance: distanceToHero }); } // Add defense towers as targets for (var i = 0; i < defenseTowers.length; i++) { var tower = defenseTowers[i]; var distance = Math.sqrt(Math.pow(tower.x - self.x, 2) + Math.pow(tower.y - self.y, 2)); if (distance < self.range) { targets.push({ target: tower, distance: distance }); } } // Return nearest target if (targets.length > 0) { targets.sort(function (a, b) { return a.distance - b.distance; }); return targets[0].target; } return null; }; self.shootAt = function (target) { var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = self.y; bullet.targetX = target.x; bullet.targetY = target.y; bullet.damage = self.damage; bullet.isAOE = self.botType === 'artilleryBot'; enemyBullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); }; self.repairAllies = function () { for (var i = 0; i < enemyBots.length; i++) { var bot = enemyBots[i]; if (bot !== self) { var distance = Math.sqrt(Math.pow(bot.x - self.x, 2) + Math.pow(bot.y - self.y, 2)); if (distance < self.range) { bot.health = Math.min(bot.health + 30, bot.maxHealth); LK.effects.flashObject(bot, 0x00ff00, 300); } } } }; self.getBaseCooldown = function () { if (self.botType === 'artilleryBot') return 90; if (self.botType === 'assaultBot') return 20; if (self.botType === 'disruptionBot') return 120; if (self.botType === 'repairBot') return 180; return 60; }; self.takeDamage = function (amount) { self.health -= amount; LK.effects.flashObject(self, 0xff0000, 200); if (self.health <= 0) { self.die(); } }; self.die = function () { LK.getSound('explosion').play(); LK.setScore(LK.getScore() + 25); scoreText.setText('Score: ' + LK.getScore()); self.destroy(); var index = enemyBots.indexOf(self); if (index > -1) { enemyBots.splice(index, 1); } }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.damage = 25; self.targetX = 0; self.targetY = 0; self.isAOE = false; 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.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } else { self.explode(); } // Remove if off screen if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) { self.destroy(); var index = enemyBullets.indexOf(self); if (index > -1) { enemyBullets.splice(index, 1); } } }; self.explode = function () { if (self.isAOE) { // AOE damage var explosion = LK.getAsset('explosion', { anchorX: 0.5, anchorY: 0.5, x: self.x, y: self.y, alpha: 0.7 }); game.addChild(explosion); tween(explosion, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 500, onFinish: function onFinish() { explosion.destroy(); } }); // Damage everything in range var explosionRange = 150; if (self.intersects(playerBase)) { playerBase.takeDamage(self.damage); } if (self.intersects(hero)) { hero.takeDamage(self.damage); } for (var i = 0; i < defenseTowers.length; i++) { var tower = defenseTowers[i]; var distance = Math.sqrt(Math.pow(tower.x - self.x, 2) + Math.pow(tower.y - self.y, 2)); if (distance < explosionRange) { tower.takeDamage(self.damage); } } LK.getSound('explosion').play(); } else { // Single target damage if (self.intersects(playerBase)) { playerBase.takeDamage(self.damage); } else if (self.intersects(hero)) { hero.takeDamage(self.damage); } else { for (var i = 0; i < defenseTowers.length; i++) { var tower = defenseTowers[i]; if (self.intersects(tower)) { tower.takeDamage(self.damage); break; } } } } self.destroy(); var index = enemyBullets.indexOf(self); if (index > -1) { enemyBullets.splice(index, 1); } }; return self; }); var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); self.health = 300; self.maxHealth = 300; self.speed = 3; self.damage = 40; self.shootCooldown = 0; self.targetX = self.x; self.targetY = self.y; self.update = function () { // Move towards target position 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; } // Auto-attack nearest enemy var nearestEnemy = self.findNearestEnemy(); if (nearestEnemy && self.shootCooldown <= 0) { self.shootAt(nearestEnemy); self.shootCooldown = 30; // 0.5 second cooldown } if (self.shootCooldown > 0) { self.shootCooldown--; } }; self.findNearestEnemy = function () { var nearest = null; var minDistance = Infinity; // Check zombies for (var i = 0; i < zombies.length; i++) { var zombie = zombies[i]; var distance = Math.sqrt(Math.pow(zombie.x - self.x, 2) + Math.pow(zombie.y - self.y, 2)); if (distance < minDistance && distance < 400) { minDistance = distance; nearest = zombie; } } // Check enemy bots for (var i = 0; i < enemyBots.length; i++) { var bot = enemyBots[i]; var distance = Math.sqrt(Math.pow(bot.x - self.x, 2) + Math.pow(bot.y - self.y, 2)); if (distance < minDistance && distance < 400) { minDistance = distance; nearest = bot; } } return nearest; }; self.shootAt = function (target) { var bullet = new HeroBullet(); bullet.x = self.x; bullet.y = self.y; bullet.targetX = target.x; bullet.targetY = target.y; bullet.damage = self.damage; heroBullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); }; self.moveTo = function (x, y) { self.targetX = x; self.targetY = y; }; self.takeDamage = function (amount) { self.health -= amount; LK.effects.flashObject(self, 0xff0000, 300); if (self.health <= 0) { self.die(); } }; self.die = function () { gameOver = true; LK.showGameOver(); }; return self; }); var HeroBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('heroBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.damage = 40; self.targetX = 0; self.targetY = 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.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } else { self.explode(); } // Remove if off screen if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) { self.destroy(); var index = heroBullets.indexOf(self); if (index > -1) { heroBullets.splice(index, 1); } } }; self.explode = function () { // Check for zombie hits for (var i = 0; i < zombies.length; i++) { var zombie = zombies[i]; if (self.intersects(zombie)) { zombie.takeDamage(self.damage); self.destroy(); var index = heroBullets.indexOf(self); if (index > -1) { heroBullets.splice(index, 1); } return; } } // Check for enemy bot hits for (var i = 0; i < enemyBots.length; i++) { var bot = enemyBots[i]; if (self.intersects(bot)) { bot.takeDamage(self.damage); self.destroy(); var index = heroBullets.indexOf(self); if (index > -1) { heroBullets.splice(index, 1); } return; } } self.destroy(); var index = heroBullets.indexOf(self); if (index > -1) { heroBullets.splice(index, 1); } }; return self; }); var PlayerBase = Container.expand(function () { var self = Container.call(this); var baseGraphics = self.attachAsset('playerBase', { anchorX: 0.5, anchorY: 0.5 }); self.health = 1000; self.maxHealth = 1000; self.takeDamage = function (amount) { self.health -= amount; LK.effects.flashObject(self, 0xff0000, 300); healthText.setText('Base Health: ' + self.health + '/' + self.maxHealth); if (self.health <= 0) { gameOver = true; LK.showGameOver(); } }; return self; }); var TowerBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.damage = 30; self.targetX = 0; self.targetY = 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.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } else { self.explode(); } // Remove if off screen if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) { self.destroy(); var index = towerBullets.indexOf(self); if (index > -1) { towerBullets.splice(index, 1); } } }; self.explode = function () { // Check for zombie hits for (var i = 0; i < zombies.length; i++) { var zombie = zombies[i]; if (self.intersects(zombie)) { zombie.takeDamage(self.damage); break; } } self.destroy(); var index = towerBullets.indexOf(self); if (index > -1) { towerBullets.splice(index, 1); } }; return self; }); var Zombie = Container.expand(function () { var self = Container.call(this); var zombieGraphics = self.attachAsset('zombie', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; self.speed = 1; self.damage = 20; self.target = null; self.attackCooldown = 0; self.update = function () { if (!self.target) { self.target = playerBase; } // Move towards target var dx = self.target.x - self.x; var dy = self.target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 50) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } else { // Attack target if (self.attackCooldown <= 0) { if (self.target === playerBase) { playerBase.takeDamage(self.damage); } self.attackCooldown = 60; // 1 second cooldown } } if (self.attackCooldown > 0) { self.attackCooldown--; } }; self.takeDamage = function (amount) { self.health -= amount; LK.effects.flashObject(self, 0xff0000, 200); if (self.health <= 0) { self.die(); } }; self.die = function () { LK.getSound('zombieHit').play(); LK.setScore(LK.getScore() + 10); scoreText.setText('Score: ' + LK.getScore()); self.destroy(); var index = zombies.indexOf(self); if (index > -1) { zombies.splice(index, 1); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2a2a2a }); /**** * Game Code ****/ // Game state variables var gameOver = false; var wave = 1; var zombiesSpawned = 0; var zombiesPerWave = 5; var spawnTimer = 0; var botSpawnTimer = 0; var resources = 100; // Game objects arrays var zombies = []; var enemyBots = []; var defenseTowers = []; var towerBullets = []; var heroBullets = []; var enemyBullets = []; // Create player base var playerBase = new PlayerBase(); playerBase.x = 1024; playerBase.y = 2400; game.addChild(playerBase); // Create hero var hero = new Hero(); hero.x = 1024; hero.y = 2200; game.addChild(hero); // Create UI elements var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); LK.gui.topRight.addChild(scoreText); var healthText = new Text2('Base Health: 1000/1000', { size: 50, fill: 0xFFFFFF }); healthText.anchor.set(0, 0); healthText.x = -400; LK.gui.topRight.addChild(healthText); var waveText = new Text2('Wave: 1', { size: 55, fill: 0xFFFF00 }); waveText.anchor.set(0.5, 0); LK.gui.top.addChild(waveText); var resourceText = new Text2('Resources: 100', { size: 45, fill: 0x00FF00 }); resourceText.anchor.set(0, 0); LK.gui.bottomLeft.addChild(resourceText); // Game control functions function spawnZombie() { var zombie = new Zombie(); // Spawn from random edge var edge = Math.floor(Math.random() * 4); if (edge === 0) { // Top zombie.x = Math.random() * 2048; zombie.y = 0; } else if (edge === 1) { // Right zombie.x = 2048; zombie.y = Math.random() * 2732; } else if (edge === 2) { // Bottom zombie.x = Math.random() * 2048; zombie.y = 2732; } else { // Left zombie.x = 0; zombie.y = Math.random() * 2732; } zombies.push(zombie); game.addChild(zombie); zombiesSpawned++; } function spawnEnemyBot() { var botTypes = ['artilleryBot', 'assaultBot', 'disruptionBot', 'repairBot']; var randomType = botTypes[Math.floor(Math.random() * botTypes.length)]; var bot = new EnemyBot(randomType); bot.x = Math.random() * 1800 + 124; bot.y = Math.random() * 1000 + 200; enemyBots.push(bot); game.addChild(bot); } function buildDefenseTower(x, y) { if (resources >= 50) { var tower = new DefenseTower(); tower.x = x; tower.y = y; defenseTowers.push(tower); game.addChild(tower); resources -= 50; resourceText.setText('Resources: ' + resources); } } // Event handlers game.down = function (x, y, obj) { // Check if clicking on empty space to build tower var canBuild = true; var minDistance = 120; // Check distance from other towers for (var i = 0; i < defenseTowers.length; i++) { var tower = defenseTowers[i]; var distance = Math.sqrt(Math.pow(tower.x - x, 2) + Math.pow(tower.y - y, 2)); if (distance < minDistance) { canBuild = false; break; } } // Check distance from base var distanceToBase = Math.sqrt(Math.pow(playerBase.x - x, 2) + Math.pow(playerBase.y - y, 2)); if (distanceToBase < 150) { canBuild = false; } // Check distance from hero var distanceToHero = Math.sqrt(Math.pow(hero.x - x, 2) + Math.pow(hero.y - y, 2)); if (distanceToHero < 100) { canBuild = false; } if (canBuild && y < 2300) { // Don't build too close to base area buildDefenseTower(x, y); } else { // Move hero to clicked position hero.moveTo(x, y); } }; // Main game loop game.update = function () { if (gameOver) return; // Resource generation if (LK.ticks % 180 === 0) { // Every 3 seconds resources += 10; resourceText.setText('Resources: ' + resources); } // Zombie spawning if (zombiesSpawned < zombiesPerWave) { spawnTimer++; if (spawnTimer >= 120) { // Spawn every 2 seconds spawnZombie(); spawnTimer = 0; } } // Enemy bot spawning botSpawnTimer++; if (botSpawnTimer >= 600) { // Spawn bot every 10 seconds spawnEnemyBot(); botSpawnTimer = 0; } // Check for wave completion if (zombiesSpawned >= zombiesPerWave && zombies.length === 0) { wave++; zombiesSpawned = 0; zombiesPerWave += 3; waveText.setText('Wave: ' + wave); // Bonus resources for completing wave resources += 25; resourceText.setText('Resources: ' + resources); } // Win condition if (wave >= 10 && zombies.length === 0 && enemyBots.length === 0) { LK.showYouWin(); } // Update all bullets for (var i = towerBullets.length - 1; i >= 0; i--) { var bullet = towerBullets[i]; if (bullet.destroyed) { towerBullets.splice(i, 1); } } for (var i = heroBullets.length - 1; i >= 0; i--) { var bullet = heroBullets[i]; if (bullet.destroyed) { heroBullets.splice(i, 1); } } for (var i = enemyBullets.length - 1; i >= 0; i--) { var bullet = enemyBullets[i]; if (bullet.destroyed) { enemyBullets.splice(i, 1); } } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,758 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var DefenseTower = Container.expand(function () {
+ var self = Container.call(this);
+ var towerGraphics = self.attachAsset('defenseTower', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 200;
+ self.maxHealth = 200;
+ self.damage = 30;
+ self.range = 300;
+ self.shootCooldown = 0;
+ self.update = function () {
+ var target = self.findNearestEnemy();
+ if (target && self.shootCooldown <= 0) {
+ self.shootAt(target);
+ self.shootCooldown = 45; // 0.75 second cooldown
+ }
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ };
+ self.findNearestEnemy = function () {
+ var nearest = null;
+ var minDistance = Infinity;
+ for (var i = 0; i < zombies.length; i++) {
+ var zombie = zombies[i];
+ var distance = Math.sqrt(Math.pow(zombie.x - self.x, 2) + Math.pow(zombie.y - self.y, 2));
+ if (distance < minDistance && distance < self.range) {
+ minDistance = distance;
+ nearest = zombie;
+ }
+ }
+ return nearest;
+ };
+ self.shootAt = function (target) {
+ var bullet = new TowerBullet();
+ bullet.x = self.x;
+ bullet.y = self.y;
+ bullet.targetX = target.x;
+ bullet.targetY = target.y;
+ bullet.damage = self.damage;
+ towerBullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ };
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ LK.effects.flashObject(self, 0xff0000, 200);
+ if (self.health <= 0) {
+ self.die();
+ }
+ };
+ self.die = function () {
+ self.destroy();
+ var index = defenseTowers.indexOf(self);
+ if (index > -1) {
+ defenseTowers.splice(index, 1);
+ }
+ };
+ return self;
+});
+var EnemyBot = Container.expand(function (botType) {
+ var self = Container.call(this);
+ var botGraphics = self.attachAsset(botType, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.botType = botType;
+ self.health = 150;
+ self.maxHealth = 150;
+ self.damage = 25;
+ self.range = 350;
+ self.shootCooldown = 0;
+ // Set specific properties based on bot type
+ if (botType === 'artilleryBot') {
+ self.damage = 60;
+ self.range = 400;
+ self.shootCooldown = 90; // Slower but more powerful
+ } else if (botType === 'assaultBot') {
+ self.damage = 20;
+ self.range = 250;
+ self.shootCooldown = 20; // Faster firing
+ } else if (botType === 'disruptionBot') {
+ self.damage = 15;
+ self.range = 300;
+ self.shootCooldown = 120; // Special ability cooldown
+ } else if (botType === 'repairBot') {
+ self.damage = 0;
+ self.range = 200;
+ self.shootCooldown = 180; // Repair cooldown
+ }
+ self.update = function () {
+ var target = self.findTarget();
+ if (target && self.shootCooldown <= 0) {
+ if (self.botType === 'repairBot') {
+ self.repairAllies();
+ } else {
+ self.shootAt(target);
+ }
+ self.shootCooldown = self.getBaseCooldown();
+ }
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ };
+ self.findTarget = function () {
+ var targets = [];
+ // Add player base as target
+ var distanceToBase = Math.sqrt(Math.pow(playerBase.x - self.x, 2) + Math.pow(playerBase.y - self.y, 2));
+ if (distanceToBase < self.range) {
+ targets.push({
+ target: playerBase,
+ distance: distanceToBase
+ });
+ }
+ // Add hero as target
+ var distanceToHero = Math.sqrt(Math.pow(hero.x - self.x, 2) + Math.pow(hero.y - self.y, 2));
+ if (distanceToHero < self.range) {
+ targets.push({
+ target: hero,
+ distance: distanceToHero
+ });
+ }
+ // Add defense towers as targets
+ for (var i = 0; i < defenseTowers.length; i++) {
+ var tower = defenseTowers[i];
+ var distance = Math.sqrt(Math.pow(tower.x - self.x, 2) + Math.pow(tower.y - self.y, 2));
+ if (distance < self.range) {
+ targets.push({
+ target: tower,
+ distance: distance
+ });
+ }
+ }
+ // Return nearest target
+ if (targets.length > 0) {
+ targets.sort(function (a, b) {
+ return a.distance - b.distance;
+ });
+ return targets[0].target;
+ }
+ return null;
+ };
+ self.shootAt = function (target) {
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y;
+ bullet.targetX = target.x;
+ bullet.targetY = target.y;
+ bullet.damage = self.damage;
+ bullet.isAOE = self.botType === 'artilleryBot';
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ };
+ self.repairAllies = function () {
+ for (var i = 0; i < enemyBots.length; i++) {
+ var bot = enemyBots[i];
+ if (bot !== self) {
+ var distance = Math.sqrt(Math.pow(bot.x - self.x, 2) + Math.pow(bot.y - self.y, 2));
+ if (distance < self.range) {
+ bot.health = Math.min(bot.health + 30, bot.maxHealth);
+ LK.effects.flashObject(bot, 0x00ff00, 300);
+ }
+ }
+ }
+ };
+ self.getBaseCooldown = function () {
+ if (self.botType === 'artilleryBot') return 90;
+ if (self.botType === 'assaultBot') return 20;
+ if (self.botType === 'disruptionBot') return 120;
+ if (self.botType === 'repairBot') return 180;
+ return 60;
+ };
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ LK.effects.flashObject(self, 0xff0000, 200);
+ if (self.health <= 0) {
+ self.die();
+ }
+ };
+ self.die = function () {
+ LK.getSound('explosion').play();
+ LK.setScore(LK.getScore() + 25);
+ scoreText.setText('Score: ' + LK.getScore());
+ self.destroy();
+ var index = enemyBots.indexOf(self);
+ if (index > -1) {
+ enemyBots.splice(index, 1);
+ }
+ };
+ return self;
+});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 6;
+ self.damage = 25;
+ self.targetX = 0;
+ self.targetY = 0;
+ self.isAOE = false;
+ 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.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ } else {
+ self.explode();
+ }
+ // Remove if off screen
+ if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
+ self.destroy();
+ var index = enemyBullets.indexOf(self);
+ if (index > -1) {
+ enemyBullets.splice(index, 1);
+ }
+ }
+ };
+ self.explode = function () {
+ if (self.isAOE) {
+ // AOE damage
+ var explosion = LK.getAsset('explosion', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: self.x,
+ y: self.y,
+ alpha: 0.7
+ });
+ game.addChild(explosion);
+ tween(explosion, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 500,
+ onFinish: function onFinish() {
+ explosion.destroy();
+ }
+ });
+ // Damage everything in range
+ var explosionRange = 150;
+ if (self.intersects(playerBase)) {
+ playerBase.takeDamage(self.damage);
+ }
+ if (self.intersects(hero)) {
+ hero.takeDamage(self.damage);
+ }
+ for (var i = 0; i < defenseTowers.length; i++) {
+ var tower = defenseTowers[i];
+ var distance = Math.sqrt(Math.pow(tower.x - self.x, 2) + Math.pow(tower.y - self.y, 2));
+ if (distance < explosionRange) {
+ tower.takeDamage(self.damage);
+ }
+ }
+ LK.getSound('explosion').play();
+ } else {
+ // Single target damage
+ if (self.intersects(playerBase)) {
+ playerBase.takeDamage(self.damage);
+ } else if (self.intersects(hero)) {
+ hero.takeDamage(self.damage);
+ } else {
+ for (var i = 0; i < defenseTowers.length; i++) {
+ var tower = defenseTowers[i];
+ if (self.intersects(tower)) {
+ tower.takeDamage(self.damage);
+ break;
+ }
+ }
+ }
+ }
+ self.destroy();
+ var index = enemyBullets.indexOf(self);
+ if (index > -1) {
+ enemyBullets.splice(index, 1);
+ }
+ };
+ return self;
+});
+var Hero = Container.expand(function () {
+ var self = Container.call(this);
+ var heroGraphics = self.attachAsset('hero', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 300;
+ self.maxHealth = 300;
+ self.speed = 3;
+ self.damage = 40;
+ self.shootCooldown = 0;
+ self.targetX = self.x;
+ self.targetY = self.y;
+ self.update = function () {
+ // Move towards target position
+ 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;
+ }
+ // Auto-attack nearest enemy
+ var nearestEnemy = self.findNearestEnemy();
+ if (nearestEnemy && self.shootCooldown <= 0) {
+ self.shootAt(nearestEnemy);
+ self.shootCooldown = 30; // 0.5 second cooldown
+ }
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ };
+ self.findNearestEnemy = function () {
+ var nearest = null;
+ var minDistance = Infinity;
+ // Check zombies
+ for (var i = 0; i < zombies.length; i++) {
+ var zombie = zombies[i];
+ var distance = Math.sqrt(Math.pow(zombie.x - self.x, 2) + Math.pow(zombie.y - self.y, 2));
+ if (distance < minDistance && distance < 400) {
+ minDistance = distance;
+ nearest = zombie;
+ }
+ }
+ // Check enemy bots
+ for (var i = 0; i < enemyBots.length; i++) {
+ var bot = enemyBots[i];
+ var distance = Math.sqrt(Math.pow(bot.x - self.x, 2) + Math.pow(bot.y - self.y, 2));
+ if (distance < minDistance && distance < 400) {
+ minDistance = distance;
+ nearest = bot;
+ }
+ }
+ return nearest;
+ };
+ self.shootAt = function (target) {
+ var bullet = new HeroBullet();
+ bullet.x = self.x;
+ bullet.y = self.y;
+ bullet.targetX = target.x;
+ bullet.targetY = target.y;
+ bullet.damage = self.damage;
+ heroBullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ };
+ self.moveTo = function (x, y) {
+ self.targetX = x;
+ self.targetY = y;
+ };
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ LK.effects.flashObject(self, 0xff0000, 300);
+ if (self.health <= 0) {
+ self.die();
+ }
+ };
+ self.die = function () {
+ gameOver = true;
+ LK.showGameOver();
+ };
+ return self;
+});
+var HeroBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('heroBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 10;
+ self.damage = 40;
+ self.targetX = 0;
+ self.targetY = 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.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ } else {
+ self.explode();
+ }
+ // Remove if off screen
+ if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
+ self.destroy();
+ var index = heroBullets.indexOf(self);
+ if (index > -1) {
+ heroBullets.splice(index, 1);
+ }
+ }
+ };
+ self.explode = function () {
+ // Check for zombie hits
+ for (var i = 0; i < zombies.length; i++) {
+ var zombie = zombies[i];
+ if (self.intersects(zombie)) {
+ zombie.takeDamage(self.damage);
+ self.destroy();
+ var index = heroBullets.indexOf(self);
+ if (index > -1) {
+ heroBullets.splice(index, 1);
+ }
+ return;
+ }
+ }
+ // Check for enemy bot hits
+ for (var i = 0; i < enemyBots.length; i++) {
+ var bot = enemyBots[i];
+ if (self.intersects(bot)) {
+ bot.takeDamage(self.damage);
+ self.destroy();
+ var index = heroBullets.indexOf(self);
+ if (index > -1) {
+ heroBullets.splice(index, 1);
+ }
+ return;
+ }
+ }
+ self.destroy();
+ var index = heroBullets.indexOf(self);
+ if (index > -1) {
+ heroBullets.splice(index, 1);
+ }
+ };
+ return self;
+});
+var PlayerBase = Container.expand(function () {
+ var self = Container.call(this);
+ var baseGraphics = self.attachAsset('playerBase', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 1000;
+ self.maxHealth = 1000;
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ LK.effects.flashObject(self, 0xff0000, 300);
+ healthText.setText('Base Health: ' + self.health + '/' + self.maxHealth);
+ if (self.health <= 0) {
+ gameOver = true;
+ LK.showGameOver();
+ }
+ };
+ return self;
+});
+var TowerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.damage = 30;
+ self.targetX = 0;
+ self.targetY = 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.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ } else {
+ self.explode();
+ }
+ // Remove if off screen
+ if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
+ self.destroy();
+ var index = towerBullets.indexOf(self);
+ if (index > -1) {
+ towerBullets.splice(index, 1);
+ }
+ }
+ };
+ self.explode = function () {
+ // Check for zombie hits
+ for (var i = 0; i < zombies.length; i++) {
+ var zombie = zombies[i];
+ if (self.intersects(zombie)) {
+ zombie.takeDamage(self.damage);
+ break;
+ }
+ }
+ self.destroy();
+ var index = towerBullets.indexOf(self);
+ if (index > -1) {
+ towerBullets.splice(index, 1);
+ }
+ };
+ return self;
+});
+var Zombie = Container.expand(function () {
+ var self = Container.call(this);
+ var zombieGraphics = self.attachAsset('zombie', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 100;
+ self.maxHealth = 100;
+ self.speed = 1;
+ self.damage = 20;
+ self.target = null;
+ self.attackCooldown = 0;
+ self.update = function () {
+ if (!self.target) {
+ self.target = playerBase;
+ }
+ // Move towards target
+ var dx = self.target.x - self.x;
+ var dy = self.target.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 50) {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ } else {
+ // Attack target
+ if (self.attackCooldown <= 0) {
+ if (self.target === playerBase) {
+ playerBase.takeDamage(self.damage);
+ }
+ self.attackCooldown = 60; // 1 second cooldown
+ }
+ }
+ if (self.attackCooldown > 0) {
+ self.attackCooldown--;
+ }
+ };
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ LK.effects.flashObject(self, 0xff0000, 200);
+ if (self.health <= 0) {
+ self.die();
+ }
+ };
+ self.die = function () {
+ LK.getSound('zombieHit').play();
+ LK.setScore(LK.getScore() + 10);
+ scoreText.setText('Score: ' + LK.getScore());
+ self.destroy();
+ var index = zombies.indexOf(self);
+ if (index > -1) {
+ zombies.splice(index, 1);
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2a2a2a
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var gameOver = false;
+var wave = 1;
+var zombiesSpawned = 0;
+var zombiesPerWave = 5;
+var spawnTimer = 0;
+var botSpawnTimer = 0;
+var resources = 100;
+// Game objects arrays
+var zombies = [];
+var enemyBots = [];
+var defenseTowers = [];
+var towerBullets = [];
+var heroBullets = [];
+var enemyBullets = [];
+// Create player base
+var playerBase = new PlayerBase();
+playerBase.x = 1024;
+playerBase.y = 2400;
+game.addChild(playerBase);
+// Create hero
+var hero = new Hero();
+hero.x = 1024;
+hero.y = 2200;
+game.addChild(hero);
+// Create UI elements
+var scoreText = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0, 0);
+LK.gui.topRight.addChild(scoreText);
+var healthText = new Text2('Base Health: 1000/1000', {
+ size: 50,
+ fill: 0xFFFFFF
+});
+healthText.anchor.set(0, 0);
+healthText.x = -400;
+LK.gui.topRight.addChild(healthText);
+var waveText = new Text2('Wave: 1', {
+ size: 55,
+ fill: 0xFFFF00
+});
+waveText.anchor.set(0.5, 0);
+LK.gui.top.addChild(waveText);
+var resourceText = new Text2('Resources: 100', {
+ size: 45,
+ fill: 0x00FF00
+});
+resourceText.anchor.set(0, 0);
+LK.gui.bottomLeft.addChild(resourceText);
+// Game control functions
+function spawnZombie() {
+ var zombie = new Zombie();
+ // Spawn from random edge
+ var edge = Math.floor(Math.random() * 4);
+ if (edge === 0) {
+ // Top
+ zombie.x = Math.random() * 2048;
+ zombie.y = 0;
+ } else if (edge === 1) {
+ // Right
+ zombie.x = 2048;
+ zombie.y = Math.random() * 2732;
+ } else if (edge === 2) {
+ // Bottom
+ zombie.x = Math.random() * 2048;
+ zombie.y = 2732;
+ } else {
+ // Left
+ zombie.x = 0;
+ zombie.y = Math.random() * 2732;
+ }
+ zombies.push(zombie);
+ game.addChild(zombie);
+ zombiesSpawned++;
+}
+function spawnEnemyBot() {
+ var botTypes = ['artilleryBot', 'assaultBot', 'disruptionBot', 'repairBot'];
+ var randomType = botTypes[Math.floor(Math.random() * botTypes.length)];
+ var bot = new EnemyBot(randomType);
+ bot.x = Math.random() * 1800 + 124;
+ bot.y = Math.random() * 1000 + 200;
+ enemyBots.push(bot);
+ game.addChild(bot);
+}
+function buildDefenseTower(x, y) {
+ if (resources >= 50) {
+ var tower = new DefenseTower();
+ tower.x = x;
+ tower.y = y;
+ defenseTowers.push(tower);
+ game.addChild(tower);
+ resources -= 50;
+ resourceText.setText('Resources: ' + resources);
+ }
+}
+// Event handlers
+game.down = function (x, y, obj) {
+ // Check if clicking on empty space to build tower
+ var canBuild = true;
+ var minDistance = 120;
+ // Check distance from other towers
+ for (var i = 0; i < defenseTowers.length; i++) {
+ var tower = defenseTowers[i];
+ var distance = Math.sqrt(Math.pow(tower.x - x, 2) + Math.pow(tower.y - y, 2));
+ if (distance < minDistance) {
+ canBuild = false;
+ break;
+ }
+ }
+ // Check distance from base
+ var distanceToBase = Math.sqrt(Math.pow(playerBase.x - x, 2) + Math.pow(playerBase.y - y, 2));
+ if (distanceToBase < 150) {
+ canBuild = false;
+ }
+ // Check distance from hero
+ var distanceToHero = Math.sqrt(Math.pow(hero.x - x, 2) + Math.pow(hero.y - y, 2));
+ if (distanceToHero < 100) {
+ canBuild = false;
+ }
+ if (canBuild && y < 2300) {
+ // Don't build too close to base area
+ buildDefenseTower(x, y);
+ } else {
+ // Move hero to clicked position
+ hero.moveTo(x, y);
+ }
+};
+// Main game loop
+game.update = function () {
+ if (gameOver) return;
+ // Resource generation
+ if (LK.ticks % 180 === 0) {
+ // Every 3 seconds
+ resources += 10;
+ resourceText.setText('Resources: ' + resources);
+ }
+ // Zombie spawning
+ if (zombiesSpawned < zombiesPerWave) {
+ spawnTimer++;
+ if (spawnTimer >= 120) {
+ // Spawn every 2 seconds
+ spawnZombie();
+ spawnTimer = 0;
+ }
+ }
+ // Enemy bot spawning
+ botSpawnTimer++;
+ if (botSpawnTimer >= 600) {
+ // Spawn bot every 10 seconds
+ spawnEnemyBot();
+ botSpawnTimer = 0;
+ }
+ // Check for wave completion
+ if (zombiesSpawned >= zombiesPerWave && zombies.length === 0) {
+ wave++;
+ zombiesSpawned = 0;
+ zombiesPerWave += 3;
+ waveText.setText('Wave: ' + wave);
+ // Bonus resources for completing wave
+ resources += 25;
+ resourceText.setText('Resources: ' + resources);
+ }
+ // Win condition
+ if (wave >= 10 && zombies.length === 0 && enemyBots.length === 0) {
+ LK.showYouWin();
+ }
+ // Update all bullets
+ for (var i = towerBullets.length - 1; i >= 0; i--) {
+ var bullet = towerBullets[i];
+ if (bullet.destroyed) {
+ towerBullets.splice(i, 1);
+ }
+ }
+ for (var i = heroBullets.length - 1; i >= 0; i--) {
+ var bullet = heroBullets[i];
+ if (bullet.destroyed) {
+ heroBullets.splice(i, 1);
+ }
+ }
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var bullet = enemyBullets[i];
+ if (bullet.destroyed) {
+ enemyBullets.splice(i, 1);
+ }
+ }
+};
\ No newline at end of file
bullet. 2d. High contrast. No shadows
zombie. 2d. High contrast. No shadows
playerBase. In-Game asset. 2d. High contrast. No shadows
hero. In-Game asset. 2d. High contrast. No shadows
artilleryBot. In-Game asset. 2d. High contrast. No shadows
defenseTower. In-Game asset. 2d. High contrast. No shadows
enemyBullet. In-Game asset. 2d. High contrast. No shadows
assaultBot. In-Game asset. 2d. High contrast. No shadows
repairBot. In-Game asset. 2d. High contrast. No shadows
explosion. In-Game asset. 2d. High contrast. No shadows
disruptionBot. In-Game asset. 2d. High contrast. No shadows
heroBullet. In-Game asset. 2d. High contrast. No shadows
Coin. In-Game asset. 2d. High contrast. No shadows
buyButton. In-Game asset. 2d. High contrast. No shadows
Zombie boss. In-Game asset. 2d. High contrast. No shadows
Start button. In-Game asset. 2d. High contrast. No shadows