/****
* 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