User prompt
Add random hearts that drop from above like enemy tanks and make them come very rarely
User prompt
Start the game with five lives
User prompt
make healt
User prompt
Make enemy tanks fire only once every 2 seconds
User prompt
Make enemy tanks fire only once every 1 seconds
User prompt
Make enemy tanks fire only once every 2 seconds
User prompt
add a boss that comes after a certain amount of time in the game
User prompt
make enemy bullet speed low
Code edit (1 edits merged)
Please save this source code
User prompt
Frontline Command
Initial prompt
make a war game
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Enemy Shell Class
var EnemyShell = Container.expand(function () {
var self = Container.call(this);
var shell = self.attachAsset('enemyShell', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = shell.width;
self.height = shell.height;
self.vx = 0;
self.vy = 8; // Reduced speed
self.update = function () {
self.x += self.vx;
self.y += self.vy;
};
return self;
});
// Enemy Tank Class
var EnemyTank = Container.expand(function () {
var self = Container.call(this);
var tank = self.attachAsset('enemyTank', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = tank.width;
self.height = tank.height;
// Movement
self.speed = 6 + Math.random() * 2 + Math.floor(LK.getScore() / 10); // Escalate with score
// Firing
self.fireInterval = 120; // 2 seconds at 60fps
self.fireCounter = 0;
self.update = function () {
self.y += self.speed;
self.fireCounter++;
if (self.fireCounter >= self.fireInterval) {
self.fireCounter = 0;
self.fire();
}
};
self.fire = function () {
var shell = new EnemyShell();
shell.x = self.x;
shell.y = self.y + self.height / 2 + shell.height / 2;
// Aim at player
var dx = player.x - shell.x;
var dy = player.y - shell.y;
var mag = Math.sqrt(dx * dx + dy * dy);
// Lowered speed for enemy shells
var shellSpeed = 7 + Math.floor(LK.getScore() / 20);
shell.vx = dx / mag * shellSpeed;
shell.vy = dy / mag * shellSpeed;
enemyShells.push(shell);
game.addChild(shell);
LK.getSound('enemyFire').play();
};
return self;
});
// Explosion effect (for destroyed tanks)
var Explosion = Container.expand(function () {
var self = Container.call(this);
var exp = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5
});
exp.alpha = 0.7;
// Animate fade out and destroy
tween(exp, {
alpha: 0
}, {
duration: 350,
easing: tween.linear,
onFinish: function onFinish() {
self.destroy();
}
});
return self;
});
// Heart Drop Class (powerup)
var HeartDrop = Container.expand(function () {
var self = Container.call(this);
var heart = self.attachAsset('heart', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = heart.width;
self.height = heart.height;
self.speed = 7 + Math.random() * 2;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player Shell Class
var PlayerShell = Container.expand(function () {
var self = Container.call(this);
var shell = self.attachAsset('playerShell', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = shell.width;
self.height = shell.height;
self.speed = -32; // Upwards
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player Tank Class
var PlayerTank = Container.expand(function () {
var self = Container.call(this);
var tank = self.attachAsset('playerTank', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = tank.width;
self.height = tank.height;
// Fire cooldown
self.canFire = true;
self.fireCooldown = 18; // frames (0.3s)
self.cooldownCounter = 0;
self.update = function () {
if (!self.canFire) {
self.cooldownCounter++;
if (self.cooldownCounter >= self.fireCooldown) {
self.canFire = true;
self.cooldownCounter = 0;
}
}
};
// Fire a shell
self.fire = function () {
if (self.canFire) {
var shell = new PlayerShell();
shell.x = self.x;
shell.y = self.y - self.height / 2 - shell.height / 2;
playerShells.push(shell);
game.addChild(shell);
LK.getSound('fire').play();
self.canFire = false;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x22272b
});
/****
* Game Code
****/
// Sound effects
// Explosion: white ellipse (for flash effect)
// Enemy shell: orange ellipse
// Enemy tank: red box
// Player shell: yellow ellipse
// Player tank: green box
// Game area
var GAME_W = 2048;
var GAME_H = 2732;
// Player
var player = new PlayerTank();
player.x = GAME_W / 2;
player.y = GAME_H - 350;
game.addChild(player);
// Arrays for game objects
var playerShells = [];
var enemyTanks = [];
var enemyShells = [];
var heartDrops = []; // Array for heart drops
// Score display
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Player health
var playerHealth = 5;
var healthTxt = new Text2('❤❤❤❤❤', {
size: 100,
fill: 0xFF4444
});
healthTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(healthTxt);
healthTxt.x = 300;
healthTxt.y = 0;
// Dragging
var dragNode = null;
// Spawn enemy timer
var enemySpawnInterval = 90; // frames (1.5s)
var enemySpawnCounter = 0;
// Difficulty escalation
function getEnemySpawnInterval() {
var s = LK.getScore();
if (s < 10) return 90;
if (s < 25) return 70;
if (s < 50) return 55;
return 40;
}
// Move handler (drag player tank)
function handleMove(x, y, obj) {
if (dragNode) {
// Clamp to game area, avoid top 100px (menu)
var minX = dragNode.width / 2;
var maxX = GAME_W - dragNode.width / 2;
var minY = 100 + dragNode.height / 2;
var maxY = GAME_H - dragNode.height / 2;
dragNode.x = Math.max(minX, Math.min(maxX, x));
dragNode.y = Math.max(minY, Math.min(maxY, y));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Only drag if touch is on player tank
var local = player.toLocal(game.toGlobal({
x: x,
y: y
}));
if (local.x > -player.width / 2 && local.x < player.width / 2 && local.y > -player.height / 2 && local.y < player.height / 2) {
dragNode = player;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Tap to fire (anywhere)
game.tap = function (x, y, obj) {
player.fire();
};
// For compatibility, also fire on down if not dragging
game.down = function (x, y, obj) {
var local = player.toLocal(game.toGlobal({
x: x,
y: y
}));
if (local.x > -player.width / 2 && local.x < player.width / 2 && local.y > -player.height / 2 && local.y < player.height / 2) {
dragNode = player;
} else {
player.fire();
}
};
// Main update loop
game.update = function () {
// Update player
player.update();
// Update player shells
for (var i = playerShells.length - 1; i >= 0; i--) {
var shell = playerShells[i];
shell.update();
// Remove if off screen
if (shell.y < -shell.height / 2) {
shell.destroy();
playerShells.splice(i, 1);
continue;
}
// Check collision with enemy tanks
for (var j = enemyTanks.length - 1; j >= 0; j--) {
var enemy = enemyTanks[j];
if (shell.intersects(enemy)) {
// Explosion
var exp = new Explosion();
exp.x = enemy.x;
exp.y = enemy.y;
game.addChild(exp);
LK.getSound('explode').play();
// Remove both
shell.destroy();
playerShells.splice(i, 1);
enemy.destroy();
enemyTanks.splice(j, 1);
// Score
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
break;
}
}
}
// Update enemy tanks
for (var i = enemyTanks.length - 1; i >= 0; i--) {
var enemy = enemyTanks[i];
enemy.update();
// Remove if off screen
if (enemy.y > GAME_H + enemy.height / 2) {
enemy.destroy();
enemyTanks.splice(i, 1);
continue;
}
// Check collision with player
if (enemy.intersects(player)) {
// Explosion
var exp = new Explosion();
exp.x = player.x;
exp.y = player.y;
game.addChild(exp);
LK.getSound('explode').play();
LK.effects.flashScreen(0xff0000, 800);
// Decrease health
playerHealth--;
// Update health display
var hearts = '';
for (var h = 0; h < playerHealth; h++) hearts += '❤';
healthTxt.setText(hearts);
if (playerHealth <= 0) {
LK.showGameOver();
return;
}
// Remove enemy tank
enemy.destroy();
enemyTanks.splice(i, 1);
continue;
}
}
// Update enemy shells
for (var i = enemyShells.length - 1; i >= 0; i--) {
var shell = enemyShells[i];
shell.update();
// Remove if off screen
if (shell.y > GAME_H + shell.height / 2 || shell.x < -shell.width / 2 || shell.x > GAME_W + shell.width / 2) {
shell.destroy();
enemyShells.splice(i, 1);
continue;
}
// Check collision with player
if (shell.intersects(player)) {
// Explosion
var exp = new Explosion();
exp.x = player.x;
exp.y = player.y;
game.addChild(exp);
LK.getSound('explode').play();
LK.effects.flashScreen(0xff0000, 800);
// Decrease health
playerHealth--;
// Update health display
var hearts = '';
for (var h = 0; h < playerHealth; h++) hearts += '❤';
healthTxt.setText(hearts);
if (playerHealth <= 0) {
LK.showGameOver();
return;
}
// Remove shell
shell.destroy();
enemyShells.splice(i, 1);
continue;
}
}
// Spawn enemies
enemySpawnCounter++;
if (enemySpawnCounter >= getEnemySpawnInterval()) {
enemySpawnCounter = 0;
var enemy = new EnemyTank();
// Random x, avoid edges
var margin = 200;
enemy.x = margin + Math.random() * (GAME_W - 2 * margin);
enemy.y = -enemy.height / 2;
enemyTanks.push(enemy);
game.addChild(enemy);
}
// Rarely spawn heart drops (about 1 in 400 frames, ~every 6-7 seconds)
if (Math.random() < 1 / 400) {
var heart = new HeartDrop();
var margin = 200;
heart.x = margin + Math.random() * (GAME_W - 2 * margin);
heart.y = -heart.height / 2;
heartDrops.push(heart);
game.addChild(heart);
}
// Update heart drops
for (var i = heartDrops.length - 1; i >= 0; i--) {
var heart = heartDrops[i];
heart.update();
// Remove if off screen
if (heart.y > GAME_H + heart.height / 2) {
heart.destroy();
heartDrops.splice(i, 1);
continue;
}
// Check collision with player
if (heart.intersects(player)) {
// Only heal if not at max health
if (playerHealth < 5) {
playerHealth++;
var hearts = '';
for (var h = 0; h < playerHealth; h++) hearts += '❤';
healthTxt.setText(hearts);
}
heart.destroy();
heartDrops.splice(i, 1);
continue;
}
}
};
// Set initial score
LK.setScore(0);
scoreTxt.setText('0');
;
// Set initial health
playerHealth = 5;
var hearts = '';
for (var h = 0; h < playerHealth; h++) hearts += '❤';
healthTxt.setText(hearts); ===================================================================
--- original.js
+++ change.js
@@ -82,8 +82,23 @@
}
});
return self;
});
+// Heart Drop Class (powerup)
+var HeartDrop = Container.expand(function () {
+ var self = Container.call(this);
+ var heart = self.attachAsset('heart', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = heart.width;
+ self.height = heart.height;
+ self.speed = 7 + Math.random() * 2;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
// Player Shell Class
var PlayerShell = Container.expand(function () {
var self = Container.call(this);
var shell = self.attachAsset('playerShell', {
@@ -144,15 +159,15 @@
/****
* Game Code
****/
-// Game area
-// Player tank: green box
-// Player shell: yellow ellipse
-// Enemy tank: red box
-// Enemy shell: orange ellipse
-// Explosion: white ellipse (for flash effect)
// Sound effects
+// Explosion: white ellipse (for flash effect)
+// Enemy shell: orange ellipse
+// Enemy tank: red box
+// Player shell: yellow ellipse
+// Player tank: green box
+// Game area
var GAME_W = 2048;
var GAME_H = 2732;
// Player
var player = new PlayerTank();
@@ -162,8 +177,9 @@
// Arrays for game objects
var playerShells = [];
var enemyTanks = [];
var enemyShells = [];
+var heartDrops = []; // Array for heart drops
// Score display
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
@@ -352,8 +368,41 @@
enemy.y = -enemy.height / 2;
enemyTanks.push(enemy);
game.addChild(enemy);
}
+ // Rarely spawn heart drops (about 1 in 400 frames, ~every 6-7 seconds)
+ if (Math.random() < 1 / 400) {
+ var heart = new HeartDrop();
+ var margin = 200;
+ heart.x = margin + Math.random() * (GAME_W - 2 * margin);
+ heart.y = -heart.height / 2;
+ heartDrops.push(heart);
+ game.addChild(heart);
+ }
+ // Update heart drops
+ for (var i = heartDrops.length - 1; i >= 0; i--) {
+ var heart = heartDrops[i];
+ heart.update();
+ // Remove if off screen
+ if (heart.y > GAME_H + heart.height / 2) {
+ heart.destroy();
+ heartDrops.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (heart.intersects(player)) {
+ // Only heal if not at max health
+ if (playerHealth < 5) {
+ playerHealth++;
+ var hearts = '';
+ for (var h = 0; h < playerHealth; h++) hearts += '❤';
+ healthTxt.setText(hearts);
+ }
+ heart.destroy();
+ heartDrops.splice(i, 1);
+ continue;
+ }
+ }
};
// Set initial score
LK.setScore(0);
scoreTxt.setText('0');