User prompt
HAREGLA LOS HERRORES DEL CODIGO
User prompt
QUE NO ENTIENDES QUE AL TOCAR EL BOTON DE CHARACTER SELECT TE LLEBEN HA UN APARTADO DE ESKINS
User prompt
HAORA HAS QUE ESE BOTON TE LLEBE A UNA VENTANA DIFERENTE
User prompt
HASN UN BOTON QUE TE LLEVE A UNA SECCION PARA SELCIONAR PERSONAJES
User prompt
MAKE IT POSSIBLE TO CHOOSE THE OTHER ROBOTS BY PRESSING THE CHARACTER BUTTON
User prompt
have a score bar next to the wave bar
User prompt
NOW THE CHARACTER OPTION WILL TAKE YOU TO ANOTHER MENU WHERE THERE WILL BE MORE ROBOTS APART FROM THE ONE WE HAVE
User prompt
NOW PUT AN OPTION TO CHANGE CHARACTERS IN THE MAIN MENU
User prompt
HAVE A START MENU
User prompt
LET THE BOSS BE AN ENEMY APART FROM THE NORMAL ONES
User prompt
NOW SPAWNS A BOSS EVERY 5 WAVES
User prompt
The light blue cube will be a robot and the yellow balls will recharge a super ability and leave a score bar.
User prompt
that the blue cube is a robot and that you earn points by killing viruses
User prompt
Please fix the bug: 'TypeError: LK.effects.shakeScreen is not a function' in or related to this line: 'LK.effects.shakeScreen(5, 100);' Line Number: 413
User prompt
that the blue cube is a robot and that you earn points by killing viruses
User prompt
Please fix the bug: 'ReferenceError: playerMech is not defined' in or related to this line: 'if (playerMech) {' Line Number: 36
User prompt
You can make characters that are robots and enemies that are viruses.
User prompt
Generate the first version of the source code of my game: Mech Arena Battle. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Mech Arena Battle
Initial prompt
robot fight
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BossVirus = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('bossVirus', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 300;
self.maxHealth = 300;
self.speed = 0.8;
self.damage = 30;
self.lastX = 0;
self.lastY = 0;
self.isBoss = true;
// Tint boss dark red to distinguish from regular viruses
bossGraphics.tint = 0x880000;
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
// Move towards player
if (playerRobot) {
var dx = playerRobot.x - self.x;
var dy = playerRobot.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Attack player if close enough
if (distance < 150) {
playerRobot.takeDamage(self.damage * 0.15); // More damage per frame when close
}
}
};
self.takeDamage = function (damage) {
self.health -= damage;
tween(bossGraphics, {
tint: 0xff0000
}, {
duration: 100,
onFinish: function onFinish() {
tween(bossGraphics, {
tint: 0x880000
}, {
duration: 100
});
}
});
if (self.health <= 0) {
self.destroy();
return true; // Boss destroyed
}
return false;
};
return self;
});
var EnemyVirus = Container.expand(function () {
var self = Container.call(this);
var virusGraphics = self.attachAsset('enemyVirus', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 30;
self.speed = 2;
self.damage = 10;
self.lastX = 0;
self.lastY = 0;
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
// Move towards player
if (playerRobot) {
var dx = playerRobot.x - self.x;
var dy = playerRobot.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Attack player if close enough
if (distance < 100) {
playerRobot.takeDamage(self.damage * 0.1); // Damage per frame when close
}
}
};
self.takeDamage = function (damage) {
self.health -= damage;
tween(virusGraphics, {
tint: 0xff0000
}, {
duration: 100,
onFinish: function onFinish() {
tween(virusGraphics, {
tint: 0xffffff
}, {
duration: 100
});
}
});
if (self.health <= 0) {
self.destroy();
return true; // Virus destroyed
}
return false;
};
return self;
});
var Laser = Container.expand(function () {
var self = Container.call(this);
var laserGraphics = self.attachAsset('laser', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.damage = 25;
self.targetX = 0;
self.targetY = 0;
self.directionX = 0;
self.directionY = 0;
self.setTarget = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.directionX = dx / distance;
self.directionY = dy / distance;
}
// Rotate laser to face target
laserGraphics.rotation = Math.atan2(dy, dx);
};
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
// Remove laser if it goes off screen
if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
self.destroy();
}
};
return self;
});
var PlayerRobot = Container.expand(function () {
var self = Container.call(this);
var robotGraphics = self.attachAsset('playerRobot', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.fireRate = 20; // Fire every 20 ticks
self.fireCooldown = 0;
self.superAbility = 0; // Super ability charge (0-100)
self.maxSuperAbility = 100;
self.update = function () {
if (self.fireCooldown > 0) {
self.fireCooldown--;
}
};
self.takeDamage = function (damage) {
self.health -= damage;
// Flash red when taking damage
tween(robotGraphics, {
tint: 0xff0000
}, {
duration: 200,
onFinish: function onFinish() {
tween(robotGraphics, {
tint: 0xffffff
}, {
duration: 200
});
}
});
if (self.health <= 0) {
LK.showGameOver();
}
};
self.canFire = function () {
return self.fireCooldown <= 0;
};
self.fire = function () {
if (self.canFire()) {
self.fireCooldown = self.fireRate;
return true;
}
return false;
};
self.useSuperAbility = function () {
if (self.superAbility >= 100) {
self.superAbility = 0;
return true;
}
return false;
};
return self;
});
var TankRobot = PlayerRobot.expand(function () {
var self = PlayerRobot.call(this);
var robotGraphics = self.attachAsset('tankRobot', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 150;
self.maxHealth = 150;
self.fireRate = 30; // Slower firing
self.speed = 0.7; // Slower movement
robotGraphics.tint = 0x808080; // Gray tint
return self;
});
var SpeedRobot = PlayerRobot.expand(function () {
var self = PlayerRobot.call(this);
var robotGraphics = self.attachAsset('speedRobot', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 75;
self.maxHealth = 75;
self.fireRate = 15; // Faster firing
self.speed = 1.5; // Faster movement
robotGraphics.tint = 0x00FF80; // Green-blue tint
return self;
});
var NinjaRobot = PlayerRobot.expand(function () {
var self = PlayerRobot.call(this);
var robotGraphics = self.attachAsset('ninjaRobot', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 60;
self.maxHealth = 60;
self.fireRate = 10; // Very fast firing
self.speed = 2.0; // Very fast movement
robotGraphics.tint = 0x4040FF; // Purple tint
return self;
});
var HeavyRobot = PlayerRobot.expand(function () {
var self = PlayerRobot.call(this);
var robotGraphics = self.attachAsset('heavyRobot', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 200;
self.maxHealth = 200;
self.fireRate = 40; // Much slower firing
self.speed = 0.5; // Much slower movement
robotGraphics.tint = 0xFF8000; // Orange tint
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'health'; // 'health', 'weapon', 'shield'
self.collected = false;
// Floating animation
tween(powerGraphics, {
y: powerGraphics.y - 20
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(powerGraphics, {
y: powerGraphics.y + 20
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (!self.collected) {
// Restart floating animation
tween(powerGraphics, {
y: powerGraphics.y - 20
}, {
duration: 1000,
easing: tween.easeInOut
});
}
}
});
}
});
self.collect = function () {
if (!self.collected) {
self.collected = true;
LK.getSound('power_up').play();
// Recharge super ability
playerRobot.superAbility = Math.min(playerRobot.superAbility + 25, playerRobot.maxSuperAbility);
// Scale up and fade out effect
tween(powerGraphics, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
}
};
return self;
});
/****
* Initialize Game
****/
// Game variables
var game = new LK.Game({
backgroundColor: 0x111111
});
/****
* Game Code
****/
// Initialize assets for the robot vs virus battle game
// Game variables
var playerRobot;
var characterSelectButton;
var characterSelectText;
var character1Button;
var character2Button;
var character3Button;
var character4Button;
var character5Button;
var startGameButton;
var enemies = [];
var lasers = [];
var powerUps = [];
var dragNode = null;
var wave = 1;
var enemySpawnTimer = 0;
var powerUpSpawnTimer = 0;
var lastBossWave = 0;
var bossActive = false;
var gameState = 'menu'; // 'menu', 'characterSelect', or 'playing'
var startButton;
var titleText;
var instructionText;
var selectedCharacter = 'playerRobot'; // Default character
var characterPreviewRobots = []; // Array to hold preview robots
// Create arena background
var arena = game.addChild(LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
}));
// Create start menu elements
titleText = new Text2('ROBOT vs VIRUS', {
size: 120,
fill: 0x00FF00
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 800;
game.addChild(titleText);
instructionText = new Text2('Tap to Start\n\nDrag robot to move\nKill viruses to earn points\nCollect yellow orbs for super ability', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 1300;
game.addChild(instructionText);
// Add character selection button
characterSelectButton = new Text2('CHARACTER SELECT', {
size: 80,
fill: 0x00FFFF
});
characterSelectButton.anchor.set(0.5, 0.5);
characterSelectButton.x = 1024;
characterSelectButton.y = 1500;
game.addChild(characterSelectButton);
// Create character selection screen elements (hidden initially)
characterSelectText = new Text2('SELECT CHARACTER', {
size: 100,
fill: 0x00FF00
});
characterSelectText.anchor.set(0.5, 0.5);
characterSelectText.x = 1024;
characterSelectText.y = 500;
characterSelectText.visible = false;
game.addChild(characterSelectText);
character1Button = new Text2('STANDARD ROBOT\nBalanced Stats', {
size: 60,
fill: 0x0080FF
});
character1Button.anchor.set(0.5, 0.5);
character1Button.x = 1024;
character1Button.y = 800;
character1Button.visible = false;
game.addChild(character1Button);
character2Button = new Text2('SPEED ROBOT\nFast & Agile', {
size: 60,
fill: 0x00FF80
});
character2Button.anchor.set(0.5, 0.5);
character2Button.x = 1024;
character2Button.y = 950;
character2Button.visible = false;
game.addChild(character2Button);
character3Button = new Text2('TANK ROBOT\nHigh Health', {
size: 60,
fill: 0x808080
});
character3Button.anchor.set(0.5, 0.5);
character3Button.x = 1024;
character3Button.y = 1100;
character3Button.visible = false;
game.addChild(character3Button);
var character4Button = new Text2('NINJA ROBOT\nSuper Fast', {
size: 60,
fill: 0x4040FF
});
character4Button.anchor.set(0.5, 0.5);
character4Button.x = 1024;
character4Button.y = 1250;
character4Button.visible = false;
game.addChild(character4Button);
var character5Button = new Text2('HEAVY ROBOT\nMaximum Armor', {
size: 60,
fill: 0xFF8000
});
character5Button.anchor.set(0.5, 0.5);
character5Button.x = 1024;
character5Button.y = 1400;
character5Button.visible = false;
game.addChild(character5Button);
var startGameButton = new Text2('START GAME', {
size: 80,
fill: 0x00FF00
});
startGameButton.anchor.set(0.5, 0.5);
startGameButton.x = 1024;
startGameButton.y = 1550;
startGameButton.visible = false;
game.addChild(startGameButton);
backButton = new Text2('BACK', {
size: 60,
fill: 0xFFFFFF
});
backButton.anchor.set(0.5, 0.5);
backButton.x = 1024;
backButton.y = 1650;
backButton.visible = false;
game.addChild(backButton);
// Player robot will be created when game starts
playerRobot = null;
// Create UI elements (hidden initially)
var scoreText = new Text2('Robot Score: 0', {
size: 60,
fill: 0x00FF00
});
scoreText.anchor.set(0, 0);
scoreText.visible = false;
LK.gui.topRight.addChild(scoreText);
var healthText = new Text2('Health: 100', {
size: 60,
fill: 0xFF0000
});
healthText.anchor.set(0, 0);
healthText.y = 70;
healthText.visible = false;
LK.gui.topRight.addChild(healthText);
var waveText = new Text2('Wave: 1', {
size: 60,
fill: 0xFFFFFF
});
waveText.anchor.set(0.5, 0);
waveText.visible = false;
LK.gui.top.addChild(waveText);
var scoreDisplayText = new Text2('Score: 0', {
size: 60,
fill: 0x00FF00
});
scoreDisplayText.anchor.set(0.5, 0);
scoreDisplayText.y = 70;
scoreDisplayText.visible = false;
LK.gui.top.addChild(scoreDisplayText);
var superAbilityText = new Text2('Super: 0%', {
size: 60,
fill: 0xFFFF00
});
superAbilityText.anchor.set(0, 0);
superAbilityText.y = 140;
superAbilityText.visible = false;
LK.gui.topRight.addChild(superAbilityText);
// Touch/mouse controls
function handleMove(x, y, obj) {
if (dragNode && playerRobot) {
// Keep player within arena bounds
var newX = Math.max(200, Math.min(1848, x));
var newY = Math.max(200, Math.min(2532, y));
playerRobot.x = newX;
playerRobot.y = newY;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (gameState === 'menu') {
var localPos = game.toLocal({
x: x,
y: y
});
// Check if tapping on character select button
if (localPos.y > 1450 && localPos.y < 1550 && localPos.x > 500 && localPos.x < 1500) {
// Show character selection window
showCharacterSelectWindow();
} else {
// Start the game with default character
startGame();
}
} else if (gameState === 'characterSelect') {
var localPos = game.toLocal({
x: x,
y: y
});
// Check character button taps
if (localPos.y > 750 && localPos.y < 850 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'standard';
updateCharacterButtons();
} else if (localPos.y > 900 && localPos.y < 1000 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'speed';
updateCharacterButtons();
} else if (localPos.y > 1050 && localPos.y < 1150 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'tank';
updateCharacterButtons();
} else if (localPos.y > 1200 && localPos.y < 1300 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'ninja';
updateCharacterButtons();
} else if (localPos.y > 1350 && localPos.y < 1450 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'heavy';
updateCharacterButtons();
} else if (localPos.y > 1500 && localPos.y < 1600 && localPos.x > 500 && localPos.x < 1500) {
// Start game button
startGame();
} else if (localPos.y > 1600 && localPos.y < 1700 && localPos.x > 500 && localPos.x < 1500) {
// Back button
hideCharacterSelectWindow();
}
} else if (gameState === 'playing') {
dragNode = playerRobot;
handleMove(x, y, obj);
}
};
// Function to show character selection window
function showCharacterSelectWindow() {
gameState = 'characterSelect';
// Hide main menu elements
titleText.visible = false;
instructionText.visible = false;
characterSelectButton.visible = false;
// Change title text to "CHARACTER SKINS"
characterSelectText.setText('CHARACTER SKINS');
// Create character preview robots if they don't exist
if (characterPreviewRobots.length === 0) {
// Standard Robot preview
var standardPreview = game.addChild(LK.getAsset('playerRobot', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 800,
scaleX: 0.6,
scaleY: 0.6
}));
characterPreviewRobots.push(standardPreview);
// Speed Robot preview
var speedPreview = game.addChild(LK.getAsset('speedRobot', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 950,
scaleX: 0.6,
scaleY: 0.6
}));
speedPreview.tint = 0x00FF80;
characterPreviewRobots.push(speedPreview);
// Tank Robot preview
var tankPreview = game.addChild(LK.getAsset('tankRobot', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 1100,
scaleX: 0.6,
scaleY: 0.6
}));
tankPreview.tint = 0x808080;
characterPreviewRobots.push(tankPreview);
// Ninja Robot preview
var ninjaPreview = game.addChild(LK.getAsset('ninjaRobot', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 1250,
scaleX: 0.6,
scaleY: 0.6
}));
ninjaPreview.tint = 0x4040FF;
characterPreviewRobots.push(ninjaPreview);
// Heavy Robot preview
var heavyPreview = game.addChild(LK.getAsset('heavyRobot', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 1400,
scaleX: 0.6,
scaleY: 0.6
}));
heavyPreview.tint = 0xFF8000;
characterPreviewRobots.push(heavyPreview);
}
// Show character preview robots
for (var i = 0; i < characterPreviewRobots.length; i++) {
characterPreviewRobots[i].visible = true;
}
// Show character selection window elements
characterSelectText.visible = true;
character1Button.visible = true;
character2Button.visible = true;
character3Button.visible = true;
character4Button.visible = true;
character5Button.visible = true;
startGameButton.visible = true;
backButton.visible = true;
updateCharacterButtons();
}
// Function to hide character selection window
function hideCharacterSelectWindow() {
gameState = 'menu';
// Hide character preview robots
for (var i = 0; i < characterPreviewRobots.length; i++) {
characterPreviewRobots[i].visible = false;
}
// Hide character selection window elements
characterSelectText.visible = false;
character1Button.visible = false;
character2Button.visible = false;
character3Button.visible = false;
character4Button.visible = false;
character5Button.visible = false;
startGameButton.visible = false;
backButton.visible = false;
// Show main menu elements
titleText.visible = true;
instructionText.visible = true;
characterSelectButton.visible = true;
}
// Function to update character button appearance based on selection
function updateCharacterButtons() {
// Reset all button colors
character1Button.tint = 0xFFFFFF;
character2Button.tint = 0xFFFFFF;
character3Button.tint = 0xFFFFFF;
character4Button.tint = 0xFFFFFF;
character5Button.tint = 0xFFFFFF;
// Highlight selected character button
if (selectedCharacter === 'standard') {
character1Button.tint = 0x00FF00;
} else if (selectedCharacter === 'speed') {
character2Button.tint = 0x00FF00;
} else if (selectedCharacter === 'tank') {
character3Button.tint = 0x00FF00;
} else if (selectedCharacter === 'ninja') {
character4Button.tint = 0x00FF00;
} else if (selectedCharacter === 'heavy') {
character5Button.tint = 0x00FF00;
}
}
// Function to start the game
function startGame() {
gameState = 'playing';
// Hide character preview robots
for (var i = 0; i < characterPreviewRobots.length; i++) {
characterPreviewRobots[i].visible = false;
}
titleText.visible = false;
instructionText.visible = false;
characterSelectButton.visible = false;
characterSelectText.visible = false;
character1Button.visible = false;
character2Button.visible = false;
character3Button.visible = false;
character4Button.visible = false;
character5Button.visible = false;
startGameButton.visible = false;
backButton.visible = false;
// Create the selected robot type
if (playerRobot) {
playerRobot.destroy();
}
if (selectedCharacter === 'standard') {
playerRobot = game.addChild(new PlayerRobot());
} else if (selectedCharacter === 'speed') {
playerRobot = game.addChild(new SpeedRobot());
} else if (selectedCharacter === 'tank') {
playerRobot = game.addChild(new TankRobot());
} else if (selectedCharacter === 'ninja') {
playerRobot = game.addChild(new NinjaRobot());
} else if (selectedCharacter === 'heavy') {
playerRobot = game.addChild(new HeavyRobot());
} else {
playerRobot = game.addChild(new PlayerRobot());
}
playerRobot.x = 1024;
playerRobot.y = 1366;
playerRobot.visible = true;
scoreText.visible = true;
healthText.visible = true;
waveText.visible = true;
superAbilityText.visible = true;
scoreDisplayText.visible = true;
}
game.up = function (x, y, obj) {
dragNode = null;
};
// Helper function to find closest virus
function findClosestEnemy() {
var closestEnemy = null;
var closestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - playerRobot.x;
var dy = enemy.y - playerRobot.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closestDistance = distance;
closestEnemy = enemy;
}
}
return closestEnemy;
}
// Spawn virus function
function spawnEnemy() {
var enemy = new EnemyVirus();
// Spawn at random edge of arena
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
enemy.x = 200 + Math.random() * 1648;
enemy.y = 100;
break;
case 1:
// Right
enemy.x = 1948;
enemy.y = 200 + Math.random() * 2332;
break;
case 2:
// Bottom
enemy.x = 200 + Math.random() * 1648;
enemy.y = 2632;
break;
case 3:
// Left
enemy.x = 100;
enemy.y = 200 + Math.random() * 2332;
break;
}
enemies.push(enemy);
game.addChild(enemy);
}
// Spawn power-up function
function spawnPowerUp() {
var powerUp = new PowerUp();
powerUp.x = 300 + Math.random() * 1448;
powerUp.y = 300 + Math.random() * 2132;
powerUps.push(powerUp);
game.addChild(powerUp);
}
// Spawn boss function
function spawnBoss() {
var boss = new BossVirus();
// Spawn boss at top center
boss.x = 1024;
boss.y = 100;
enemies.push(boss);
game.addChild(boss);
bossActive = true;
}
// Main game update loop
game.update = function () {
// Only update game logic when playing
if (gameState !== 'playing') {
return;
}
// Update UI
scoreText.setText('Robot Kills: ' + LK.getScore());
healthText.setText('Health: ' + Math.max(0, playerRobot.health));
waveText.setText('Wave: ' + wave);
superAbilityText.setText('Super: ' + Math.floor(playerRobot.superAbility) + '%');
scoreDisplayText.setText('Score: ' + LK.getScore());
// Robot auto-fire at closest virus
if (playerRobot.canFire()) {
var target = findClosestEnemy();
if (target) {
if (playerRobot.fire()) {
var laser = new Laser();
laser.x = playerRobot.x;
laser.y = playerRobot.y;
laser.setTarget(target.x, target.y);
lasers.push(laser);
game.addChild(laser);
LK.getSound('laser_fire').play();
}
}
}
// Use super ability when fully charged
if (playerRobot.superAbility >= 100 && enemies.length > 0) {
if (playerRobot.useSuperAbility()) {
// Fire lasers at all enemies
for (var k = 0; k < enemies.length; k++) {
var superLaser = new Laser();
superLaser.x = playerRobot.x;
superLaser.y = playerRobot.y;
superLaser.setTarget(enemies[k].x, enemies[k].y);
lasers.push(superLaser);
game.addChild(superLaser);
}
LK.getSound('laser_fire').play();
// Flash robot yellow to show super ability used
tween(playerRobot.children[0], {
tint: 0xffff00
}, {
duration: 200,
onFinish: function onFinish() {
tween(playerRobot.children[0], {
tint: 0xffffff
}, {
duration: 200
});
}
});
}
}
// Update and check laser collisions
for (var i = lasers.length - 1; i >= 0; i--) {
var laser = lasers[i];
if (laser.destroyed) {
lasers.splice(i, 1);
continue;
}
// Check laser vs enemy collisions
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (laser.intersects(enemy)) {
if (enemy.takeDamage(laser.damage)) {
// Virus destroyed - award points to robot
var points = enemy.isBoss ? 200 : 10; // Boss gives 200 points, regular virus gives 10
LK.setScore(LK.getScore() + points);
LK.getSound('enemy_destroy').play();
// Check if boss was destroyed
if (enemy.isBoss) {
bossActive = false;
}
// Flash robot blue to show successful kill
tween(playerRobot.children[0], {
tint: 0x00ffff
}, {
duration: 150,
onFinish: function onFinish() {
tween(playerRobot.children[0], {
tint: 0xffffff
}, {
duration: 150
});
}
});
enemies.splice(j, 1);
}
laser.destroy();
lasers.splice(i, 1);
break;
}
}
}
// Check power-up collection
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.intersects(playerRobot)) {
powerUp.collect();
powerUps.splice(i, 1);
} else if (powerUp.destroyed) {
powerUps.splice(i, 1);
}
}
// Remove destroyed enemies
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i].destroyed) {
enemies.splice(i, 1);
}
}
// Spawn enemies based on wave
enemySpawnTimer++;
var spawnRate = Math.max(60 - wave * 5, 20); // Faster spawning each wave
if (enemySpawnTimer >= spawnRate) {
spawnEnemy();
enemySpawnTimer = 0;
}
// Spawn power-ups occasionally
powerUpSpawnTimer++;
if (powerUpSpawnTimer >= 600) {
// Every 10 seconds
spawnPowerUp();
powerUpSpawnTimer = 0;
}
// Check wave progression
if (LK.ticks % 1800 === 0) {
// Every 30 seconds
wave++;
// Spawn boss every 5 waves
if (wave - lastBossWave >= 5 && !bossActive) {
spawnBoss();
lastBossWave = wave;
}
}
// Low health warning effect (removed screen shake as LK.effects.shakeScreen doesn't exist)
if (playerRobot.health < 30 && LK.ticks % 10 === 0) {
// Flash the player robot red to indicate low health
tween(playerRobot.children[0], {
tint: 0xff0000
}, {
duration: 100,
onFinish: function onFinish() {
tween(playerRobot.children[0], {
tint: 0xffffff
}, {
duration: 100
});
}
});
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BossVirus = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('bossVirus', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 300;
self.maxHealth = 300;
self.speed = 0.8;
self.damage = 30;
self.lastX = 0;
self.lastY = 0;
self.isBoss = true;
// Tint boss dark red to distinguish from regular viruses
bossGraphics.tint = 0x880000;
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
// Move towards player
if (playerRobot) {
var dx = playerRobot.x - self.x;
var dy = playerRobot.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Attack player if close enough
if (distance < 150) {
playerRobot.takeDamage(self.damage * 0.15); // More damage per frame when close
}
}
};
self.takeDamage = function (damage) {
self.health -= damage;
tween(bossGraphics, {
tint: 0xff0000
}, {
duration: 100,
onFinish: function onFinish() {
tween(bossGraphics, {
tint: 0x880000
}, {
duration: 100
});
}
});
if (self.health <= 0) {
self.destroy();
return true; // Boss destroyed
}
return false;
};
return self;
});
var EnemyVirus = Container.expand(function () {
var self = Container.call(this);
var virusGraphics = self.attachAsset('enemyVirus', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 30;
self.speed = 2;
self.damage = 10;
self.lastX = 0;
self.lastY = 0;
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
// Move towards player
if (playerRobot) {
var dx = playerRobot.x - self.x;
var dy = playerRobot.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Attack player if close enough
if (distance < 100) {
playerRobot.takeDamage(self.damage * 0.1); // Damage per frame when close
}
}
};
self.takeDamage = function (damage) {
self.health -= damage;
tween(virusGraphics, {
tint: 0xff0000
}, {
duration: 100,
onFinish: function onFinish() {
tween(virusGraphics, {
tint: 0xffffff
}, {
duration: 100
});
}
});
if (self.health <= 0) {
self.destroy();
return true; // Virus destroyed
}
return false;
};
return self;
});
var Laser = Container.expand(function () {
var self = Container.call(this);
var laserGraphics = self.attachAsset('laser', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.damage = 25;
self.targetX = 0;
self.targetY = 0;
self.directionX = 0;
self.directionY = 0;
self.setTarget = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.directionX = dx / distance;
self.directionY = dy / distance;
}
// Rotate laser to face target
laserGraphics.rotation = Math.atan2(dy, dx);
};
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
// Remove laser if it goes off screen
if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
self.destroy();
}
};
return self;
});
var PlayerRobot = Container.expand(function () {
var self = Container.call(this);
var robotGraphics = self.attachAsset('playerRobot', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.fireRate = 20; // Fire every 20 ticks
self.fireCooldown = 0;
self.superAbility = 0; // Super ability charge (0-100)
self.maxSuperAbility = 100;
self.update = function () {
if (self.fireCooldown > 0) {
self.fireCooldown--;
}
};
self.takeDamage = function (damage) {
self.health -= damage;
// Flash red when taking damage
tween(robotGraphics, {
tint: 0xff0000
}, {
duration: 200,
onFinish: function onFinish() {
tween(robotGraphics, {
tint: 0xffffff
}, {
duration: 200
});
}
});
if (self.health <= 0) {
LK.showGameOver();
}
};
self.canFire = function () {
return self.fireCooldown <= 0;
};
self.fire = function () {
if (self.canFire()) {
self.fireCooldown = self.fireRate;
return true;
}
return false;
};
self.useSuperAbility = function () {
if (self.superAbility >= 100) {
self.superAbility = 0;
return true;
}
return false;
};
return self;
});
var TankRobot = PlayerRobot.expand(function () {
var self = PlayerRobot.call(this);
var robotGraphics = self.attachAsset('tankRobot', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 150;
self.maxHealth = 150;
self.fireRate = 30; // Slower firing
self.speed = 0.7; // Slower movement
robotGraphics.tint = 0x808080; // Gray tint
return self;
});
var SpeedRobot = PlayerRobot.expand(function () {
var self = PlayerRobot.call(this);
var robotGraphics = self.attachAsset('speedRobot', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 75;
self.maxHealth = 75;
self.fireRate = 15; // Faster firing
self.speed = 1.5; // Faster movement
robotGraphics.tint = 0x00FF80; // Green-blue tint
return self;
});
var NinjaRobot = PlayerRobot.expand(function () {
var self = PlayerRobot.call(this);
var robotGraphics = self.attachAsset('ninjaRobot', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 60;
self.maxHealth = 60;
self.fireRate = 10; // Very fast firing
self.speed = 2.0; // Very fast movement
robotGraphics.tint = 0x4040FF; // Purple tint
return self;
});
var HeavyRobot = PlayerRobot.expand(function () {
var self = PlayerRobot.call(this);
var robotGraphics = self.attachAsset('heavyRobot', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 200;
self.maxHealth = 200;
self.fireRate = 40; // Much slower firing
self.speed = 0.5; // Much slower movement
robotGraphics.tint = 0xFF8000; // Orange tint
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'health'; // 'health', 'weapon', 'shield'
self.collected = false;
// Floating animation
tween(powerGraphics, {
y: powerGraphics.y - 20
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(powerGraphics, {
y: powerGraphics.y + 20
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (!self.collected) {
// Restart floating animation
tween(powerGraphics, {
y: powerGraphics.y - 20
}, {
duration: 1000,
easing: tween.easeInOut
});
}
}
});
}
});
self.collect = function () {
if (!self.collected) {
self.collected = true;
LK.getSound('power_up').play();
// Recharge super ability
playerRobot.superAbility = Math.min(playerRobot.superAbility + 25, playerRobot.maxSuperAbility);
// Scale up and fade out effect
tween(powerGraphics, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
}
};
return self;
});
/****
* Initialize Game
****/
// Game variables
var game = new LK.Game({
backgroundColor: 0x111111
});
/****
* Game Code
****/
// Initialize assets for the robot vs virus battle game
// Game variables
var playerRobot;
var characterSelectButton;
var characterSelectText;
var character1Button;
var character2Button;
var character3Button;
var character4Button;
var character5Button;
var startGameButton;
var enemies = [];
var lasers = [];
var powerUps = [];
var dragNode = null;
var wave = 1;
var enemySpawnTimer = 0;
var powerUpSpawnTimer = 0;
var lastBossWave = 0;
var bossActive = false;
var gameState = 'menu'; // 'menu', 'characterSelect', or 'playing'
var startButton;
var titleText;
var instructionText;
var selectedCharacter = 'playerRobot'; // Default character
var characterPreviewRobots = []; // Array to hold preview robots
// Create arena background
var arena = game.addChild(LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
}));
// Create start menu elements
titleText = new Text2('ROBOT vs VIRUS', {
size: 120,
fill: 0x00FF00
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 800;
game.addChild(titleText);
instructionText = new Text2('Tap to Start\n\nDrag robot to move\nKill viruses to earn points\nCollect yellow orbs for super ability', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 1300;
game.addChild(instructionText);
// Add character selection button
characterSelectButton = new Text2('CHARACTER SELECT', {
size: 80,
fill: 0x00FFFF
});
characterSelectButton.anchor.set(0.5, 0.5);
characterSelectButton.x = 1024;
characterSelectButton.y = 1500;
game.addChild(characterSelectButton);
// Create character selection screen elements (hidden initially)
characterSelectText = new Text2('SELECT CHARACTER', {
size: 100,
fill: 0x00FF00
});
characterSelectText.anchor.set(0.5, 0.5);
characterSelectText.x = 1024;
characterSelectText.y = 500;
characterSelectText.visible = false;
game.addChild(characterSelectText);
character1Button = new Text2('STANDARD ROBOT\nBalanced Stats', {
size: 60,
fill: 0x0080FF
});
character1Button.anchor.set(0.5, 0.5);
character1Button.x = 1024;
character1Button.y = 800;
character1Button.visible = false;
game.addChild(character1Button);
character2Button = new Text2('SPEED ROBOT\nFast & Agile', {
size: 60,
fill: 0x00FF80
});
character2Button.anchor.set(0.5, 0.5);
character2Button.x = 1024;
character2Button.y = 950;
character2Button.visible = false;
game.addChild(character2Button);
character3Button = new Text2('TANK ROBOT\nHigh Health', {
size: 60,
fill: 0x808080
});
character3Button.anchor.set(0.5, 0.5);
character3Button.x = 1024;
character3Button.y = 1100;
character3Button.visible = false;
game.addChild(character3Button);
var character4Button = new Text2('NINJA ROBOT\nSuper Fast', {
size: 60,
fill: 0x4040FF
});
character4Button.anchor.set(0.5, 0.5);
character4Button.x = 1024;
character4Button.y = 1250;
character4Button.visible = false;
game.addChild(character4Button);
var character5Button = new Text2('HEAVY ROBOT\nMaximum Armor', {
size: 60,
fill: 0xFF8000
});
character5Button.anchor.set(0.5, 0.5);
character5Button.x = 1024;
character5Button.y = 1400;
character5Button.visible = false;
game.addChild(character5Button);
var startGameButton = new Text2('START GAME', {
size: 80,
fill: 0x00FF00
});
startGameButton.anchor.set(0.5, 0.5);
startGameButton.x = 1024;
startGameButton.y = 1550;
startGameButton.visible = false;
game.addChild(startGameButton);
backButton = new Text2('BACK', {
size: 60,
fill: 0xFFFFFF
});
backButton.anchor.set(0.5, 0.5);
backButton.x = 1024;
backButton.y = 1650;
backButton.visible = false;
game.addChild(backButton);
// Player robot will be created when game starts
playerRobot = null;
// Create UI elements (hidden initially)
var scoreText = new Text2('Robot Score: 0', {
size: 60,
fill: 0x00FF00
});
scoreText.anchor.set(0, 0);
scoreText.visible = false;
LK.gui.topRight.addChild(scoreText);
var healthText = new Text2('Health: 100', {
size: 60,
fill: 0xFF0000
});
healthText.anchor.set(0, 0);
healthText.y = 70;
healthText.visible = false;
LK.gui.topRight.addChild(healthText);
var waveText = new Text2('Wave: 1', {
size: 60,
fill: 0xFFFFFF
});
waveText.anchor.set(0.5, 0);
waveText.visible = false;
LK.gui.top.addChild(waveText);
var scoreDisplayText = new Text2('Score: 0', {
size: 60,
fill: 0x00FF00
});
scoreDisplayText.anchor.set(0.5, 0);
scoreDisplayText.y = 70;
scoreDisplayText.visible = false;
LK.gui.top.addChild(scoreDisplayText);
var superAbilityText = new Text2('Super: 0%', {
size: 60,
fill: 0xFFFF00
});
superAbilityText.anchor.set(0, 0);
superAbilityText.y = 140;
superAbilityText.visible = false;
LK.gui.topRight.addChild(superAbilityText);
// Touch/mouse controls
function handleMove(x, y, obj) {
if (dragNode && playerRobot) {
// Keep player within arena bounds
var newX = Math.max(200, Math.min(1848, x));
var newY = Math.max(200, Math.min(2532, y));
playerRobot.x = newX;
playerRobot.y = newY;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (gameState === 'menu') {
var localPos = game.toLocal({
x: x,
y: y
});
// Check if tapping on character select button
if (localPos.y > 1450 && localPos.y < 1550 && localPos.x > 500 && localPos.x < 1500) {
// Show character selection window
showCharacterSelectWindow();
} else {
// Start the game with default character
startGame();
}
} else if (gameState === 'characterSelect') {
var localPos = game.toLocal({
x: x,
y: y
});
// Check character button taps
if (localPos.y > 750 && localPos.y < 850 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'standard';
updateCharacterButtons();
} else if (localPos.y > 900 && localPos.y < 1000 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'speed';
updateCharacterButtons();
} else if (localPos.y > 1050 && localPos.y < 1150 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'tank';
updateCharacterButtons();
} else if (localPos.y > 1200 && localPos.y < 1300 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'ninja';
updateCharacterButtons();
} else if (localPos.y > 1350 && localPos.y < 1450 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'heavy';
updateCharacterButtons();
} else if (localPos.y > 1500 && localPos.y < 1600 && localPos.x > 500 && localPos.x < 1500) {
// Start game button
startGame();
} else if (localPos.y > 1600 && localPos.y < 1700 && localPos.x > 500 && localPos.x < 1500) {
// Back button
hideCharacterSelectWindow();
}
} else if (gameState === 'playing') {
dragNode = playerRobot;
handleMove(x, y, obj);
}
};
// Function to show character selection window
function showCharacterSelectWindow() {
gameState = 'characterSelect';
// Hide main menu elements
titleText.visible = false;
instructionText.visible = false;
characterSelectButton.visible = false;
// Change title text to "CHARACTER SKINS"
characterSelectText.setText('CHARACTER SKINS');
// Create character preview robots if they don't exist
if (characterPreviewRobots.length === 0) {
// Standard Robot preview
var standardPreview = game.addChild(LK.getAsset('playerRobot', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 800,
scaleX: 0.6,
scaleY: 0.6
}));
characterPreviewRobots.push(standardPreview);
// Speed Robot preview
var speedPreview = game.addChild(LK.getAsset('speedRobot', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 950,
scaleX: 0.6,
scaleY: 0.6
}));
speedPreview.tint = 0x00FF80;
characterPreviewRobots.push(speedPreview);
// Tank Robot preview
var tankPreview = game.addChild(LK.getAsset('tankRobot', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 1100,
scaleX: 0.6,
scaleY: 0.6
}));
tankPreview.tint = 0x808080;
characterPreviewRobots.push(tankPreview);
// Ninja Robot preview
var ninjaPreview = game.addChild(LK.getAsset('ninjaRobot', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 1250,
scaleX: 0.6,
scaleY: 0.6
}));
ninjaPreview.tint = 0x4040FF;
characterPreviewRobots.push(ninjaPreview);
// Heavy Robot preview
var heavyPreview = game.addChild(LK.getAsset('heavyRobot', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 1400,
scaleX: 0.6,
scaleY: 0.6
}));
heavyPreview.tint = 0xFF8000;
characterPreviewRobots.push(heavyPreview);
}
// Show character preview robots
for (var i = 0; i < characterPreviewRobots.length; i++) {
characterPreviewRobots[i].visible = true;
}
// Show character selection window elements
characterSelectText.visible = true;
character1Button.visible = true;
character2Button.visible = true;
character3Button.visible = true;
character4Button.visible = true;
character5Button.visible = true;
startGameButton.visible = true;
backButton.visible = true;
updateCharacterButtons();
}
// Function to hide character selection window
function hideCharacterSelectWindow() {
gameState = 'menu';
// Hide character preview robots
for (var i = 0; i < characterPreviewRobots.length; i++) {
characterPreviewRobots[i].visible = false;
}
// Hide character selection window elements
characterSelectText.visible = false;
character1Button.visible = false;
character2Button.visible = false;
character3Button.visible = false;
character4Button.visible = false;
character5Button.visible = false;
startGameButton.visible = false;
backButton.visible = false;
// Show main menu elements
titleText.visible = true;
instructionText.visible = true;
characterSelectButton.visible = true;
}
// Function to update character button appearance based on selection
function updateCharacterButtons() {
// Reset all button colors
character1Button.tint = 0xFFFFFF;
character2Button.tint = 0xFFFFFF;
character3Button.tint = 0xFFFFFF;
character4Button.tint = 0xFFFFFF;
character5Button.tint = 0xFFFFFF;
// Highlight selected character button
if (selectedCharacter === 'standard') {
character1Button.tint = 0x00FF00;
} else if (selectedCharacter === 'speed') {
character2Button.tint = 0x00FF00;
} else if (selectedCharacter === 'tank') {
character3Button.tint = 0x00FF00;
} else if (selectedCharacter === 'ninja') {
character4Button.tint = 0x00FF00;
} else if (selectedCharacter === 'heavy') {
character5Button.tint = 0x00FF00;
}
}
// Function to start the game
function startGame() {
gameState = 'playing';
// Hide character preview robots
for (var i = 0; i < characterPreviewRobots.length; i++) {
characterPreviewRobots[i].visible = false;
}
titleText.visible = false;
instructionText.visible = false;
characterSelectButton.visible = false;
characterSelectText.visible = false;
character1Button.visible = false;
character2Button.visible = false;
character3Button.visible = false;
character4Button.visible = false;
character5Button.visible = false;
startGameButton.visible = false;
backButton.visible = false;
// Create the selected robot type
if (playerRobot) {
playerRobot.destroy();
}
if (selectedCharacter === 'standard') {
playerRobot = game.addChild(new PlayerRobot());
} else if (selectedCharacter === 'speed') {
playerRobot = game.addChild(new SpeedRobot());
} else if (selectedCharacter === 'tank') {
playerRobot = game.addChild(new TankRobot());
} else if (selectedCharacter === 'ninja') {
playerRobot = game.addChild(new NinjaRobot());
} else if (selectedCharacter === 'heavy') {
playerRobot = game.addChild(new HeavyRobot());
} else {
playerRobot = game.addChild(new PlayerRobot());
}
playerRobot.x = 1024;
playerRobot.y = 1366;
playerRobot.visible = true;
scoreText.visible = true;
healthText.visible = true;
waveText.visible = true;
superAbilityText.visible = true;
scoreDisplayText.visible = true;
}
game.up = function (x, y, obj) {
dragNode = null;
};
// Helper function to find closest virus
function findClosestEnemy() {
var closestEnemy = null;
var closestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - playerRobot.x;
var dy = enemy.y - playerRobot.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closestDistance = distance;
closestEnemy = enemy;
}
}
return closestEnemy;
}
// Spawn virus function
function spawnEnemy() {
var enemy = new EnemyVirus();
// Spawn at random edge of arena
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
enemy.x = 200 + Math.random() * 1648;
enemy.y = 100;
break;
case 1:
// Right
enemy.x = 1948;
enemy.y = 200 + Math.random() * 2332;
break;
case 2:
// Bottom
enemy.x = 200 + Math.random() * 1648;
enemy.y = 2632;
break;
case 3:
// Left
enemy.x = 100;
enemy.y = 200 + Math.random() * 2332;
break;
}
enemies.push(enemy);
game.addChild(enemy);
}
// Spawn power-up function
function spawnPowerUp() {
var powerUp = new PowerUp();
powerUp.x = 300 + Math.random() * 1448;
powerUp.y = 300 + Math.random() * 2132;
powerUps.push(powerUp);
game.addChild(powerUp);
}
// Spawn boss function
function spawnBoss() {
var boss = new BossVirus();
// Spawn boss at top center
boss.x = 1024;
boss.y = 100;
enemies.push(boss);
game.addChild(boss);
bossActive = true;
}
// Main game update loop
game.update = function () {
// Only update game logic when playing
if (gameState !== 'playing') {
return;
}
// Update UI
scoreText.setText('Robot Kills: ' + LK.getScore());
healthText.setText('Health: ' + Math.max(0, playerRobot.health));
waveText.setText('Wave: ' + wave);
superAbilityText.setText('Super: ' + Math.floor(playerRobot.superAbility) + '%');
scoreDisplayText.setText('Score: ' + LK.getScore());
// Robot auto-fire at closest virus
if (playerRobot.canFire()) {
var target = findClosestEnemy();
if (target) {
if (playerRobot.fire()) {
var laser = new Laser();
laser.x = playerRobot.x;
laser.y = playerRobot.y;
laser.setTarget(target.x, target.y);
lasers.push(laser);
game.addChild(laser);
LK.getSound('laser_fire').play();
}
}
}
// Use super ability when fully charged
if (playerRobot.superAbility >= 100 && enemies.length > 0) {
if (playerRobot.useSuperAbility()) {
// Fire lasers at all enemies
for (var k = 0; k < enemies.length; k++) {
var superLaser = new Laser();
superLaser.x = playerRobot.x;
superLaser.y = playerRobot.y;
superLaser.setTarget(enemies[k].x, enemies[k].y);
lasers.push(superLaser);
game.addChild(superLaser);
}
LK.getSound('laser_fire').play();
// Flash robot yellow to show super ability used
tween(playerRobot.children[0], {
tint: 0xffff00
}, {
duration: 200,
onFinish: function onFinish() {
tween(playerRobot.children[0], {
tint: 0xffffff
}, {
duration: 200
});
}
});
}
}
// Update and check laser collisions
for (var i = lasers.length - 1; i >= 0; i--) {
var laser = lasers[i];
if (laser.destroyed) {
lasers.splice(i, 1);
continue;
}
// Check laser vs enemy collisions
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (laser.intersects(enemy)) {
if (enemy.takeDamage(laser.damage)) {
// Virus destroyed - award points to robot
var points = enemy.isBoss ? 200 : 10; // Boss gives 200 points, regular virus gives 10
LK.setScore(LK.getScore() + points);
LK.getSound('enemy_destroy').play();
// Check if boss was destroyed
if (enemy.isBoss) {
bossActive = false;
}
// Flash robot blue to show successful kill
tween(playerRobot.children[0], {
tint: 0x00ffff
}, {
duration: 150,
onFinish: function onFinish() {
tween(playerRobot.children[0], {
tint: 0xffffff
}, {
duration: 150
});
}
});
enemies.splice(j, 1);
}
laser.destroy();
lasers.splice(i, 1);
break;
}
}
}
// Check power-up collection
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.intersects(playerRobot)) {
powerUp.collect();
powerUps.splice(i, 1);
} else if (powerUp.destroyed) {
powerUps.splice(i, 1);
}
}
// Remove destroyed enemies
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i].destroyed) {
enemies.splice(i, 1);
}
}
// Spawn enemies based on wave
enemySpawnTimer++;
var spawnRate = Math.max(60 - wave * 5, 20); // Faster spawning each wave
if (enemySpawnTimer >= spawnRate) {
spawnEnemy();
enemySpawnTimer = 0;
}
// Spawn power-ups occasionally
powerUpSpawnTimer++;
if (powerUpSpawnTimer >= 600) {
// Every 10 seconds
spawnPowerUp();
powerUpSpawnTimer = 0;
}
// Check wave progression
if (LK.ticks % 1800 === 0) {
// Every 30 seconds
wave++;
// Spawn boss every 5 waves
if (wave - lastBossWave >= 5 && !bossActive) {
spawnBoss();
lastBossWave = wave;
}
}
// Low health warning effect (removed screen shake as LK.effects.shakeScreen doesn't exist)
if (playerRobot.health < 30 && LK.ticks % 10 === 0) {
// Flash the player robot red to indicate low health
tween(playerRobot.children[0], {
tint: 0xff0000
}, {
duration: 100,
onFinish: function onFinish() {
tween(playerRobot.children[0], {
tint: 0xffffff
}, {
duration: 100
});
}
});
}
};
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Mech Arena Battle" and with the description "Control a powerful mech in arena combat, fighting waves of enemy robots while dodging attacks and collecting power-ups to survive as long as possible.". No text on banner!
robot. In-Game asset. 2d. High contrast. No shadows
VIRUS TECNOLOGICO. In-Game asset. 2d. High contrast. No shadows
chispa de energia. In-Game asset. 2d. High contrast. No shadows
piso tecnologico neon. In-Game asset. 2d. High contrast. No shadows
MEGABOT. In-Game asset. 2d. High contrast. No shadows
BALA RAYO LASER. In-Game asset. 2d. High contrast. No shadows