User prompt
path of Enemy is big and wide and more terns and boss reward is 20 and solider reward is 5 and hp is 100 and runners reward is 2.5 and hp is 50
User prompt
change boss every time when boss kill next every time his defense was stronger then last time and the path of Enemy change into like up to down and Towers place down
User prompt
tank move Medium and soldier move Medium fast and the path change to dropped
User prompt
can you change it place towers and also tank is move fast its hp is 250 and reward only 15 and after 6 wave it comes to boss and the boss hp is almost 500
Code edit (1 edits merged)
Please save this source code
User prompt
Tower Defense: Infinite Remix
Initial prompt
🔹 Game Title: Tower Defense: Infinite Remix 🔹 Towers (3 types) Tower Damage Range Fire Rate Cost Cannon Medium Medium Slow 50 Sniper High Long Very Slow 100 Laser Low Short Fast 30 🔹 Enemies (3 types) Enemy HP Speed Reward Soldier 50 Medium 10 Tank 200 Slow 25 Runner 25 Fast 5 🔹 Features in First Version ✅ Place towers on predefined spots ✅ Enemies spawn in waves ✅ Towers auto-shoot when enemies enter range ✅ Money increases on kill, spend to place towers ✅ Game over if too many enemies reach the end 🔹 Future Upgrades (after first version) Tower upgrade system Boss waves Multiple maps Leaderboard (local) Map theme – Sci-fi
/****
* Classes
****/
var Bullet = Container.expand(function (startX, startY, target, damage) {
var self = Container.call(this);
self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = startX;
self.y = startY;
self.target = target;
self.damage = damage;
self.speed = 8;
self.update = function () {
if (!self.target || self.target.destroyed) {
self.removeBullet();
return;
}
var dx = self.target.x - self.x;
var dy = self.target.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 10) {
self.target.takeDamage(self.damage);
self.removeBullet();
} else {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
self.removeBullet = function () {
for (var i = bullets.length - 1; i >= 0; i--) {
if (bullets[i] === self) {
bullets.splice(i, 1);
break;
}
}
self.destroy();
};
return self;
});
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
self.type = type;
self.pathIndex = 0;
self.x = path[0].x;
self.y = path[0].y;
self.lastPathIndex = 0;
if (type === 'soldier') {
self.attachAsset('soldier', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.speed = 2.5;
self.reward = 15;
} else if (type === 'tank') {
self.attachAsset('tank', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 250;
self.maxHealth = 250;
self.speed = 2;
self.reward = 15;
} else if (type === 'runner') {
self.attachAsset('runner', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 50;
self.maxHealth = 50;
self.speed = 4;
self.reward = 10;
} else if (type === 'boss') {
self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
var bossHealth = 500 + bossKillCount * 200;
self.health = bossHealth;
self.maxHealth = bossHealth;
self.speed = 1;
self.reward = 50 + bossKillCount * 25;
}
self.update = function () {
self.move();
};
self.move = function () {
if (self.pathIndex >= path.length - 1) {
self.reachedEnd();
return;
}
var targetPoint = path[self.pathIndex + 1];
var dx = targetPoint.x - self.x;
var dy = targetPoint.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 5) {
self.pathIndex++;
self.lastPathIndex = self.pathIndex;
} else {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health <= 0) {
self.die();
}
};
self.die = function () {
if (self.type === 'boss') {
bossKillCount++;
}
money += self.reward;
moneyText.setText('Money: ' + money);
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] === self) {
enemies.splice(i, 1);
break;
}
}
self.destroy();
LK.getSound('enemyHit').play();
};
self.reachedEnd = function () {
lives--;
livesText.setText('Lives: ' + lives);
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] === self) {
enemies.splice(i, 1);
break;
}
}
self.destroy();
if (lives <= 0) {
LK.showGameOver();
}
};
return self;
});
var Tower = Container.expand(function (type, x, y) {
var self = Container.call(this);
self.type = type;
self.x = x;
self.y = y;
self.range = 200;
self.shootCooldown = 0;
self.target = null;
if (type === 'cannon') {
self.attachAsset('cannon', {
anchorX: 0.5,
anchorY: 0.5
});
self.damage = 30;
self.fireRate = 60;
} else if (type === 'sniper') {
self.attachAsset('sniper', {
anchorX: 0.5,
anchorY: 0.5
});
self.damage = 80;
self.fireRate = 120;
self.range = 350;
} else if (type === 'laser') {
self.attachAsset('laser', {
anchorX: 0.5,
anchorY: 0.5
});
self.damage = 15;
self.fireRate = 20;
}
self.update = function () {
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
self.findTarget();
if (self.target && self.shootCooldown <= 0) {
self.shoot();
self.shootCooldown = self.fireRate;
}
};
self.findTarget = function () {
var closestEnemy = null;
var closestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var distance = Math.sqrt(Math.pow(enemy.x - self.x, 2) + Math.pow(enemy.y - self.y, 2));
if (distance <= self.range && distance < closestDistance) {
closestEnemy = enemy;
closestDistance = distance;
}
}
self.target = closestEnemy;
};
self.shoot = function () {
if (self.target) {
var bullet = new Bullet(self.x, self.y, self.target, self.damage);
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
};
return self;
});
var TowerSpot = Container.expand(function (x, y) {
var self = Container.call(this);
self.attachAsset('towerSpot', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = x;
self.y = y;
self.occupied = false;
self.tower = null;
self.down = function (localX, localY, obj) {
if (!self.occupied && selectedTowerType && canAffordTower(selectedTowerType)) {
self.placeTower(selectedTowerType);
}
};
self.placeTower = function (type) {
var cost = getTowerCost(type);
if (money >= cost) {
money -= cost;
moneyText.setText('Money: ' + money);
var tower = new Tower(type, self.x, self.y);
towers.push(tower);
game.addChild(tower);
self.occupied = true;
self.tower = tower;
self.alpha = 0.3;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
var money = 200;
var lives = 20;
var wave = 1;
var waveTimer = 0;
var spawnTimer = 0;
var enemiesInWave = 0;
var enemiesSpawned = 0;
var selectedTowerType = null;
var bossKillCount = 0;
var towers = [];
var enemies = [];
var bullets = [];
var towerSpots = [];
var path = [{
x: 1024,
y: 0
}, {
x: 1024,
y: 400
}, {
x: 800,
y: 400
}, {
x: 800,
y: 800
}, {
x: 1200,
y: 800
}, {
x: 1200,
y: 1200
}, {
x: 600,
y: 1200
}, {
x: 600,
y: 1600
}, {
x: 1024,
y: 1600
}, {
x: 1024,
y: 2000
}];
// Create path visualization
for (var i = 0; i < path.length - 1; i++) {
var pathSegment = LK.getAsset('path', {
anchorX: 0.5,
anchorY: 0.5
});
pathSegment.x = (path[i].x + path[i + 1].x) / 2;
pathSegment.y = (path[i].y + path[i + 1].y) / 2;
var dx = path[i + 1].x - path[i].x;
var dy = path[i + 1].y - path[i].y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (Math.abs(dx) > Math.abs(dy)) {
pathSegment.width = distance;
pathSegment.height = 80;
} else {
pathSegment.width = 80;
pathSegment.height = distance;
}
game.addChild(pathSegment);
}
// Tower spots removed - towers can now be placed anywhere
// UI Elements
var moneyText = new Text2('Money: ' + money, {
size: 60,
fill: '#ffffff'
});
moneyText.anchor.set(0, 0);
LK.gui.topLeft.addChild(moneyText);
moneyText.x = 120;
moneyText.y = 20;
var livesText = new Text2('Lives: ' + lives, {
size: 60,
fill: '#ffffff'
});
livesText.anchor.set(0, 0);
LK.gui.topLeft.addChild(livesText);
livesText.x = 120;
livesText.y = 100;
var waveText = new Text2('Wave: ' + wave, {
size: 60,
fill: '#ffffff'
});
waveText.anchor.set(0, 0);
LK.gui.topLeft.addChild(waveText);
waveText.x = 120;
waveText.y = 180;
// Tower selection buttons
var cannonButton = LK.getAsset('cannon', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
cannonButton.x = 500;
cannonButton.y = 2500;
game.addChild(cannonButton);
var sniperButton = LK.getAsset('sniper', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
sniperButton.x = 900;
sniperButton.y = 2500;
game.addChild(sniperButton);
var laserButton = LK.getAsset('laser', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
laserButton.x = 1300;
laserButton.y = 2500;
game.addChild(laserButton);
var cannonCostText = new Text2('50', {
size: 40,
fill: '#ffffff'
});
cannonCostText.anchor.set(0.5, 0.5);
cannonCostText.x = 500;
cannonCostText.y = 2550;
game.addChild(cannonCostText);
var sniperCostText = new Text2('100', {
size: 40,
fill: '#ffffff'
});
sniperCostText.anchor.set(0.5, 0.5);
sniperCostText.x = 900;
sniperCostText.y = 2550;
game.addChild(sniperCostText);
var laserCostText = new Text2('30', {
size: 40,
fill: '#ffffff'
});
laserCostText.anchor.set(0.5, 0.5);
laserCostText.x = 1300;
laserCostText.y = 2550;
game.addChild(laserCostText);
function getTowerCost(type) {
if (type === 'cannon') return 50;
if (type === 'sniper') return 100;
if (type === 'laser') return 30;
return 0;
}
function canAffordTower(type) {
return money >= getTowerCost(type);
}
function updateButtonColors() {
cannonButton.tint = canAffordTower('cannon') ? 0xffffff : 0x666666;
sniperButton.tint = canAffordTower('sniper') ? 0xffffff : 0x666666;
laserButton.tint = canAffordTower('laser') ? 0xffffff : 0x666666;
}
function spawnEnemy() {
var enemyType;
if (wave >= 6 && enemiesSpawned === 0) {
// Spawn boss as first enemy after wave 6
enemyType = 'boss';
} else {
var rand = Math.random();
if (rand < 0.6) {
enemyType = 'soldier';
} else if (rand < 0.8) {
enemyType = 'tank';
} else {
enemyType = 'runner';
}
}
var enemy = new Enemy(enemyType);
enemies.push(enemy);
game.addChild(enemy);
enemiesSpawned++;
}
function startWave() {
enemiesInWave = 5 + wave * 2;
enemiesSpawned = 0;
spawnTimer = 0;
}
game.down = function (x, y, obj) {
// Check tower button clicks
var buttonSize = 80;
if (y >= 2500 - buttonSize / 2 && y <= 2500 + buttonSize / 2) {
if (x >= 500 - buttonSize / 2 && x <= 500 + buttonSize / 2) {
selectedTowerType = 'cannon';
} else if (x >= 900 - buttonSize / 2 && x <= 900 + buttonSize / 2) {
selectedTowerType = 'sniper';
} else if (x >= 1300 - buttonSize / 2 && x <= 1300 + buttonSize / 2) {
selectedTowerType = 'laser';
}
} else if (selectedTowerType && canAffordTower(selectedTowerType)) {
// Check if click is not on path or existing tower
var canPlace = true;
for (var i = 0; i < towers.length; i++) {
var tower = towers[i];
var distance = Math.sqrt(Math.pow(x - tower.x, 2) + Math.pow(y - tower.y, 2));
if (distance < 100) {
canPlace = false;
break;
}
}
if (canPlace) {
var cost = getTowerCost(selectedTowerType);
if (money >= cost) {
money -= cost;
moneyText.setText('Money: ' + money);
var tower = new Tower(selectedTowerType, x, y);
towers.push(tower);
game.addChild(tower);
}
}
}
};
game.update = function () {
// Update all towers
for (var i = 0; i < towers.length; i++) {
towers[i].update();
}
// Update all enemies
for (var i = 0; i < enemies.length; i++) {
enemies[i].update();
}
// Update all bullets
for (var i = 0; i < bullets.length; i++) {
bullets[i].update();
}
// Wave management
if (enemies.length === 0 && enemiesSpawned >= enemiesInWave) {
waveTimer++;
if (waveTimer >= 180) {
// 3 seconds between waves
wave++;
waveText.setText('Wave: ' + wave);
startWave();
waveTimer = 0;
}
}
// Enemy spawning
if (enemiesSpawned < enemiesInWave) {
spawnTimer++;
if (spawnTimer >= 45) {
// Spawn every 0.75 seconds
spawnEnemy();
spawnTimer = 0;
}
}
// Update button colors based on affordability
updateButtonColors();
};
// Start first wave
startWave(); ===================================================================
--- original.js
+++ change.js
@@ -73,18 +73,19 @@
self.maxHealth = 50;
self.speed = 4;
self.reward = 10;
} else if (type === 'boss') {
- self.attachAsset('tank', {
+ self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
- self.health = 500;
- self.maxHealth = 500;
+ var bossHealth = 500 + bossKillCount * 200;
+ self.health = bossHealth;
+ self.maxHealth = bossHealth;
self.speed = 1;
- self.reward = 50;
+ self.reward = 50 + bossKillCount * 25;
}
self.update = function () {
self.move();
};
@@ -111,8 +112,11 @@
self.die();
}
};
self.die = function () {
+ if (self.type === 'boss') {
+ bossKillCount++;
+ }
money += self.reward;
moneyText.setText('Money: ' + money);
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] === self) {
@@ -251,42 +255,43 @@
var spawnTimer = 0;
var enemiesInWave = 0;
var enemiesSpawned = 0;
var selectedTowerType = null;
+var bossKillCount = 0;
var towers = [];
var enemies = [];
var bullets = [];
var towerSpots = [];
var path = [{
- x: 0,
+ x: 1024,
+ y: 0
+}, {
+ x: 1024,
+ y: 400
+}, {
+ x: 800,
+ y: 400
+}, {
+ x: 800,
y: 800
}, {
- x: 300,
+ x: 1200,
y: 800
}, {
- x: 300,
+ x: 1200,
y: 1200
}, {
- x: 700,
+ x: 600,
y: 1200
}, {
- x: 700,
+ x: 600,
y: 1600
}, {
- x: 1100,
+ x: 1024,
y: 1600
}, {
- x: 1100,
+ x: 1024,
y: 2000
-}, {
- x: 1500,
- y: 2000
-}, {
- x: 1500,
- y: 2400
-}, {
- x: 2048,
- y: 2400
}];
// Create path visualization
for (var i = 0; i < path.length - 1; i++) {
var pathSegment = LK.getAsset('path', {
@@ -339,52 +344,52 @@
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
-cannonButton.x = 1700;
-cannonButton.y = 300;
+cannonButton.x = 500;
+cannonButton.y = 2500;
game.addChild(cannonButton);
var sniperButton = LK.getAsset('sniper', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
-sniperButton.x = 1700;
-sniperButton.y = 450;
+sniperButton.x = 900;
+sniperButton.y = 2500;
game.addChild(sniperButton);
var laserButton = LK.getAsset('laser', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
-laserButton.x = 1700;
-laserButton.y = 600;
+laserButton.x = 1300;
+laserButton.y = 2500;
game.addChild(laserButton);
var cannonCostText = new Text2('50', {
size: 40,
fill: '#ffffff'
});
cannonCostText.anchor.set(0.5, 0.5);
-cannonCostText.x = 1700;
-cannonCostText.y = 350;
+cannonCostText.x = 500;
+cannonCostText.y = 2550;
game.addChild(cannonCostText);
var sniperCostText = new Text2('100', {
size: 40,
fill: '#ffffff'
});
sniperCostText.anchor.set(0.5, 0.5);
-sniperCostText.x = 1700;
-sniperCostText.y = 500;
+sniperCostText.x = 900;
+sniperCostText.y = 2550;
game.addChild(sniperCostText);
var laserCostText = new Text2('30', {
size: 40,
fill: '#ffffff'
});
laserCostText.anchor.set(0.5, 0.5);
-laserCostText.x = 1700;
-laserCostText.y = 650;
+laserCostText.x = 1300;
+laserCostText.y = 2550;
game.addChild(laserCostText);
function getTowerCost(type) {
if (type === 'cannon') return 50;
if (type === 'sniper') return 100;
@@ -426,14 +431,14 @@
}
game.down = function (x, y, obj) {
// Check tower button clicks
var buttonSize = 80;
- if (x >= 1700 - buttonSize / 2 && x <= 1700 + buttonSize / 2) {
- if (y >= 300 - buttonSize / 2 && y <= 300 + buttonSize / 2) {
+ if (y >= 2500 - buttonSize / 2 && y <= 2500 + buttonSize / 2) {
+ if (x >= 500 - buttonSize / 2 && x <= 500 + buttonSize / 2) {
selectedTowerType = 'cannon';
- } else if (y >= 450 - buttonSize / 2 && y <= 450 + buttonSize / 2) {
+ } else if (x >= 900 - buttonSize / 2 && x <= 900 + buttonSize / 2) {
selectedTowerType = 'sniper';
- } else if (y >= 600 - buttonSize / 2 && y <= 600 + buttonSize / 2) {
+ } else if (x >= 1300 - buttonSize / 2 && x <= 1300 + buttonSize / 2) {
selectedTowerType = 'laser';
}
} else if (selectedTowerType && canAffordTower(selectedTowerType)) {
// Check if click is not on path or existing tower