User prompt
can restore health when got resource
User prompt
enemy bullet low speed
User prompt
obstacle can destroy
User prompt
auto bullet shoot
User prompt
rover can attack
User prompt
rover auto slow bullet
User prompt
enemy multi direction bullet attack player
User prompt
enemy can shoot targeting player
Code edit (1 edits merged)
Please save this source code
User prompt
Mars Rover: Red Planet Rescue
Initial prompt
mars scifi game action gameboy advance style
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0, roverLevel: 1, speedLevel: 1, weaponLevel: 1 }); /**** * Classes ****/ var Alien = Container.expand(function () { var self = Container.call(this); var alienGraphics = self.attachAsset('alien', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1 + Math.random() * 2; self.health = 2; self.active = true; self.points = 25; self.movePattern = Math.floor(Math.random() * 3); // 0: straight, 1: zigzag, 2: sine self.moveCounter = 0; self.update = function () { // Alien shooting logic if (self.active && Math.random() < 0.01) { // Random chance to shoot var alienBullet = new AlienBullet(); alienBullet.x = self.x; alienBullet.y = self.y + 40; // Start below the alien // Set random direction for multi-directional shooting alienBullet.directionX = Math.random() * 2 - 1; // Random value between -1 and 1 alienBullet.directionY = 1; // Always shoot downwards alienBullets.push(alienBullet); game.addChild(alienBullet); } if (!self.active) { return; } self.y += self.speed; // Different movement patterns if (self.movePattern === 1) { // ZigZag if (self.moveCounter % 60 < 30) { self.x += 1.5; } else { self.x -= 1.5; } } else if (self.movePattern === 2) { // Sine wave self.x += Math.sin(self.moveCounter / 20) * 2; } self.moveCounter++; // Check if alien is off screen if (self.y > 2732 + 50) { self.active = false; } }; self.takeDamage = function (amount) { self.health -= amount; // Flash effect LK.effects.flashObject(self, 0xFF0000, 200); if (self.health <= 0) { self.destroy(); } }; self.destroy = function () { self.active = false; // Scale out and fade tween(alienGraphics, { alpha: 0, scaleX: 0.2, scaleY: 0.2, rotation: Math.PI * 2 }, { duration: 400, easing: tween.easeInOut, onFinish: function onFinish() { // Alien will be removed by the game update loop } }); }; return self; }); var AlienBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; // Reduced speed for alien bullets self.damage = 1; self.active = true; self.directionX = 0; // Initialize horizontal direction self.directionY = 1; // Initialize vertical direction self.update = function () { if (!self.active) { return; } self.x += self.speed * self.directionX; // Update x position based on direction self.y += self.speed * self.directionY; // Update y position based on direction // Check if bullet is off screen if (self.y > 2732 + 50 || self.x < -50 || self.x > 2048 + 50) { self.active = false; } }; self.hit = function () { self.active = false; tween(bulletGraphics, { alpha: 0 }, { duration: 200, onFinish: function onFinish() { // Bullet will be removed by the game update loop } }); }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12; self.damage = 1; self.active = true; self.update = function () { if (!self.active) { return; } self.y -= self.speed * 0.5; // Slow down the bullet speed by half // Check if bullet is off screen if (self.y < -50) { self.active = false; } }; self.hit = function () { self.active = false; tween(bulletGraphics, { alpha: 0 }, { duration: 200, onFinish: function onFinish() { // Bullet will be removed by the game update loop } }); }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1.5 + Math.random() * 1.5; self.active = true; self.update = function () { if (!self.active) { return; } self.y += self.speed; // Slowly rotate the obstacle obstacleGraphics.rotation += 0.01; // Check if obstacle is off screen if (self.y > 2732 + 50) { self.active = false; } }; self.hit = function () { self.active = false; LK.effects.flashObject(self, 0xFF0000, 200); tween(obstacleGraphics, { alpha: 0, scaleX: 1.5, scaleY: 1.5, rotation: obstacleGraphics.rotation + Math.PI }, { duration: 300, onFinish: function onFinish() { // Obstacle will be removed by the game update loop } }); }; return self; }); var Resource = Container.expand(function () { var self = Container.call(this); var resourceGraphics = self.attachAsset('resource', { anchorX: 0.5, anchorY: 0.5 }); self.value = 10; self.active = true; self.speed = 2 + Math.random() * 2; self.update = function () { if (!self.active) { return; } self.y += self.speed; // Make the resource bob slightly side to side self.x += Math.sin(LK.ticks / 20) * 0.8; // Check if resource is off screen if (self.y > 2732 + 50) { self.active = false; } }; self.collect = function () { self.active = false; tween(resourceGraphics, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: 300, onFinish: function onFinish() { // Resource will be removed by the game update loop } }); }; return self; }); var Rover = Container.expand(function () { var self = Container.call(this); // Main rover body var roverBody = self.attachAsset('rover', { anchorX: 0.5, anchorY: 0.5 }); // Left wheel var leftWheel = LK.getAsset('wheel', { anchorX: 0.5, anchorY: 0.5, x: -45, y: 25 }); self.addChild(leftWheel); // Right wheel var rightWheel = LK.getAsset('wheel', { anchorX: 0.5, anchorY: 0.5, x: 45, y: 25 }); self.addChild(rightWheel); // Solar panel var solarPanel = LK.getAsset('solar', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -20 }); self.addChild(solarPanel); // Antenna var antenna = LK.getAsset('antenna', { anchorX: 0.5, anchorY: 0.5, x: 30, y: -40 }); self.addChild(antenna); // Set rover properties self.speed = 5 + (storage.speedLevel - 1) * 0.8; self.fireRate = 800 - (storage.weaponLevel - 1) * 100; self.lastFire = 0; self.health = 3 + (storage.roverLevel - 1); self.shieldActive = false; // Initialize movement self.isMoving = false; self.targetX = 0; self.targetY = 0; self.moveTowards = function (x, y) { self.isMoving = true; self.targetX = x; self.targetY = y; }; self.stopMoving = function () { self.isMoving = false; }; self.update = function () { if (self.isMoving) { 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; // Animate wheels leftWheel.rotation += 0.2; rightWheel.rotation += 0.2; } else { self.x = self.targetX; self.y = self.targetY; } } // Constrain to game bounds if (self.x < roverBody.width / 2) { self.x = roverBody.width / 2; } else if (self.x > 2048 - roverBody.width / 2) { self.x = 2048 - roverBody.width / 2; } if (self.y < roverBody.height / 2) { self.y = roverBody.height / 2; } else if (self.y > 2732 - roverBody.height / 2) { self.y = 2732 - roverBody.height / 2; } }; self.fire = function () { var currentTime = Date.now(); if (currentTime - self.lastFire < self.fireRate) { return null; } self.lastFire = currentTime; var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y - 40; bullet.damage = storage.weaponLevel; // Play shoot sound LK.getSound('shoot').play(); return bullet; }; self.takeDamage = function () { if (self.shieldActive) { return; } self.health--; LK.effects.flashObject(self, 0xFF0000, 300); LK.getSound('damage').play(); // Activate brief shield self.shieldActive = true; tween(roverBody, { alpha: 0.5 }, { duration: 200, onFinish: function onFinish() { tween(roverBody, { alpha: 1 }, { duration: 200 }); } }); // Deactivate shield after invulnerability period LK.setTimeout(function () { self.shieldActive = false; }, 1500); return self.health <= 0; }; self.fire = function () { var currentTime = Date.now(); if (currentTime - self.lastFire < self.fireRate) { return null; } self.lastFire = currentTime; var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y - 40; bullet.damage = storage.weaponLevel; // Play shoot sound LK.getSound('shoot').play(); return bullet; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xC0392B // Mars red }); /**** * Game Code ****/ // Game state variables var score = 0; var level = 1; var gameActive = true; var spawnRate = 120; // Frames between spawns var spawnCounter = 0; var difficultyTimer = 0; // Game objects var rover; var bullets = []; var alienBullets = []; // Array to track alien bullets var resources = []; var aliens = []; var obstacles = []; // Background - Mars terrain var terrainBackground = LK.getAsset('terrain', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(terrainBackground); // Create rover rover = new Rover(); rover.x = 2048 / 2; rover.y = 2732 - 200; game.addChild(rover); // UI elements var scoreTxt = new Text2('SCORE: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topRight.addChild(scoreTxt); scoreTxt.x = -scoreTxt.width - 20; scoreTxt.y = 20; var levelTxt = new Text2('LEVEL: 1', { size: 60, fill: 0xFFFFFF }); levelTxt.anchor.set(0, 0); LK.gui.top.addChild(levelTxt); levelTxt.y = 20; var healthTxt = new Text2('HEALTH: ' + rover.health, { size: 60, fill: 0xFFFFFF }); healthTxt.anchor.set(0, 0); LK.gui.topRight.addChild(healthTxt); healthTxt.x = -healthTxt.width - 20; healthTxt.y = 90; // Touch controls var dragNode = null; // Handle touch/mouse down game.down = function (x, y, obj) { if (!gameActive) { return; } // Fire when touching the top half of the screen if (y < 2732 / 2) { var newBullet = rover.fire(); if (newBullet) { bullets.push(newBullet); game.addChild(newBullet); } } else { // Move rover when touching the bottom half rover.moveTowards(x, y); dragNode = rover; } }; // Handle touch/mouse move game.move = function (x, y, obj) { if (!gameActive || !dragNode) { return; } rover.moveTowards(x, y); }; // Handle touch/mouse up game.up = function (x, y, obj) { dragNode = null; }; // Spawn a resource function spawnResource() { var resource = new Resource(); resource.x = 100 + Math.random() * (2048 - 200); resource.y = -50; resources.push(resource); game.addChild(resource); } // Spawn an alien function spawnAlien() { var alien = new Alien(); alien.x = 100 + Math.random() * (2048 - 200); alien.y = -50; alien.health = 1 + Math.floor(level / 3); alien.points = 25 + level * 5; aliens.push(alien); game.addChild(alien); } // Spawn an obstacle function spawnObstacle() { var obstacle = new Obstacle(); obstacle.x = 100 + Math.random() * (2048 - 200); obstacle.y = -50; obstacles.push(obstacle); game.addChild(obstacle); } // Update score display function updateScore(newScore) { score = newScore; scoreTxt.setText('SCORE: ' + score); scoreTxt.x = -scoreTxt.width - 20; // Update high score if needed if (score > storage.highScore) { storage.highScore = score; } } // Update level display function updateLevel(newLevel) { level = newLevel; levelTxt.setText('LEVEL: ' + level); // Increase difficulty with level spawnRate = Math.max(60, 120 - level * 10); } // Update health display function updateHealth() { healthTxt.setText('HEALTH: ' + rover.health); healthTxt.x = -healthTxt.width - 20; } // Start background music LK.playMusic('bgMusic', { loop: true, fade: { start: 0, end: 0.3, duration: 1000 } }); // Game update loop game.update = function () { if (!gameActive) { return; } // Increase difficulty over time difficultyTimer++; if (difficultyTimer >= 900) { // Every 15 seconds difficultyTimer = 0; updateLevel(level + 1); } // Spawn objects spawnCounter++; if (spawnCounter >= spawnRate) { spawnCounter = 0; // Randomly decide what to spawn var rand = Math.random(); if (rand < 0.5) { spawnResource(); } else if (rand < 0.8) { spawnAlien(); } else { spawnObstacle(); } } // Update rover rover.update(); // Auto fire bullets from rover var newBullet = rover.fire(); if (newBullet) { bullets.push(newBullet); game.addChild(newBullet); } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; bullet.update(); // Remove inactive bullets if (!bullet.active) { game.removeChild(bullet); bullets.splice(i, 1); } } // Update alien bullets for (var i = alienBullets.length - 1; i >= 0; i--) { var alienBullet = alienBullets[i]; alienBullet.update(); // Check for collision with rover if (alienBullet.active && alienBullet.intersects(rover)) { alienBullet.hit(); var gameOver = rover.takeDamage(); updateHealth(); if (gameOver) { endGame(); } } // Remove inactive alien bullets if (!alienBullet.active) { game.removeChild(alienBullet); alienBullets.splice(i, 1); } } // Update resources for (var i = resources.length - 1; i >= 0; i--) { var resource = resources[i]; resource.update(); // Check for collision with rover if (resource.active && resource.intersects(rover)) { resource.collect(); updateScore(score + resource.value); rover.health = Math.min(rover.health + 1, 3 + (storage.roverLevel - 1)); // Restore health, max health depends on rover level updateHealth(); // Update health display LK.getSound('collect').play(); } // Remove inactive resources if (!resource.active) { game.removeChild(resource); resources.splice(i, 1); } } // Update aliens for (var i = aliens.length - 1; i >= 0; i--) { var alien = aliens[i]; alien.update(); // Check for collision with bullets for (var j = bullets.length - 1; j >= 0; j--) { var bullet = bullets[j]; if (alien.active && bullet.active && alien.intersects(bullet)) { bullet.hit(); alien.takeDamage(bullet.damage); if (!alien.active) { updateScore(score + alien.points); } } } // Check for collision with rover if (alien.active && alien.intersects(rover)) { alien.destroy(); var gameOver = rover.takeDamage(); updateHealth(); if (gameOver) { endGame(); } } // Remove inactive aliens if (!alien.active) { game.removeChild(alien); aliens.splice(i, 1); } } // Update obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; obstacle.update(); // Check for collision with bullets for (var j = bullets.length - 1; j >= 0; j--) { var bullet = bullets[j]; if (obstacle.active && bullet.active && obstacle.intersects(bullet)) { bullet.hit(); // Obstacles are not destroyed by bullets, but bullets are destroyed } } // Check for collision with rover if (obstacle.active && obstacle.intersects(rover)) { obstacle.hit(); var gameOver = rover.takeDamage(); updateHealth(); if (gameOver) { endGame(); } } // Remove inactive obstacles if (!obstacle.active) { game.removeChild(obstacle); obstacles.splice(i, 1); } } }; // End the game function endGame() { gameActive = false; // Save final score to leaderboard LK.setScore(score); // Play explosion sound LK.getSound('explosion').play(); // Flash screen and show game over LK.effects.flashScreen(0xFF0000, 1000); LK.setTimeout(function () { LK.showGameOver(); }, 1000); }
===================================================================
--- original.js
+++ change.js
@@ -587,8 +587,10 @@
// Check for collision with rover
if (resource.active && resource.intersects(rover)) {
resource.collect();
updateScore(score + resource.value);
+ rover.health = Math.min(rover.health + 1, 3 + (storage.roverLevel - 1)); // Restore health, max health depends on rover level
+ updateHealth(); // Update health display
LK.getSound('collect').play();
}
// Remove inactive resources
if (!resource.active) {
vertical gray top down image mars scifi rover. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
top down image purple squid alien. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
blue thunder orb entity. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
yellow bright aurora. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows