/**** * 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 ****/ // Game variables // Initialize assets for the robot vs virus battle game var playerRobot; 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 characterSelectText; var character1Button; var character2Button; var character3Button; var backButton; var selectedCharacter = 'playerRobot'; // Default character // 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\nCharacter Select\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 = 1400; game.addChild(instructionText); // 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); backButton = new Text2('BACK', { size: 60, fill: 0xFFFFFF }); backButton.anchor.set(0.5, 0.5); backButton.x = 1024; backButton.y = 1600; 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 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') { // Check if tapping on character select option var localPos = game.toLocal({ x: x, y: y }); if (localPos.y > 1300 && localPos.y < 1400 && localPos.x > 500 && localPos.x < 1500) { // Show character selection gameState = 'characterSelect'; titleText.visible = false; instructionText.visible = false; characterSelectText.visible = true; character1Button.visible = true; character2Button.visible = true; character3Button.visible = true; character4Button.visible = true; character5Button.visible = true; backButton.visible = true; } 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'; startGame(); } else if (localPos.y > 900 && localPos.y < 1000 && localPos.x > 500 && localPos.x < 1500) { selectedCharacter = 'speed'; startGame(); } else if (localPos.y > 1050 && localPos.y < 1150 && localPos.x > 500 && localPos.x < 1500) { selectedCharacter = 'tank'; startGame(); } else if (localPos.y > 1200 && localPos.y < 1300 && localPos.x > 500 && localPos.x < 1500) { selectedCharacter = 'ninja'; startGame(); } else if (localPos.y > 1350 && localPos.y < 1450 && localPos.x > 500 && localPos.x < 1500) { selectedCharacter = 'heavy'; startGame(); } else if (localPos.y > 1550 && localPos.y < 1650 && localPos.x > 500 && localPos.x < 1500) { // Back button gameState = 'menu'; characterSelectText.visible = false; character1Button.visible = false; character2Button.visible = false; character3Button.visible = false; character4Button.visible = false; character5Button.visible = false; backButton.visible = false; titleText.visible = true; instructionText.visible = true; } } else if (gameState === 'playing') { dragNode = playerRobot; handleMove(x, y, obj); } }; // Function to start the game function startGame() { gameState = 'playing'; titleText.visible = false; instructionText.visible = false; characterSelectText.visible = false; character1Button.visible = false; character2Button.visible = false; character3Button.visible = false; character4Button.visible = false; character5Button.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; } 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) + '%'); // 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
****/
// Game variables
// Initialize assets for the robot vs virus battle game
var playerRobot;
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 characterSelectText;
var character1Button;
var character2Button;
var character3Button;
var backButton;
var selectedCharacter = 'playerRobot'; // Default character
// 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\nCharacter Select\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 = 1400;
game.addChild(instructionText);
// 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);
backButton = new Text2('BACK', {
size: 60,
fill: 0xFFFFFF
});
backButton.anchor.set(0.5, 0.5);
backButton.x = 1024;
backButton.y = 1600;
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 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') {
// Check if tapping on character select option
var localPos = game.toLocal({
x: x,
y: y
});
if (localPos.y > 1300 && localPos.y < 1400 && localPos.x > 500 && localPos.x < 1500) {
// Show character selection
gameState = 'characterSelect';
titleText.visible = false;
instructionText.visible = false;
characterSelectText.visible = true;
character1Button.visible = true;
character2Button.visible = true;
character3Button.visible = true;
character4Button.visible = true;
character5Button.visible = true;
backButton.visible = true;
} 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';
startGame();
} else if (localPos.y > 900 && localPos.y < 1000 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'speed';
startGame();
} else if (localPos.y > 1050 && localPos.y < 1150 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'tank';
startGame();
} else if (localPos.y > 1200 && localPos.y < 1300 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'ninja';
startGame();
} else if (localPos.y > 1350 && localPos.y < 1450 && localPos.x > 500 && localPos.x < 1500) {
selectedCharacter = 'heavy';
startGame();
} else if (localPos.y > 1550 && localPos.y < 1650 && localPos.x > 500 && localPos.x < 1500) {
// Back button
gameState = 'menu';
characterSelectText.visible = false;
character1Button.visible = false;
character2Button.visible = false;
character3Button.visible = false;
character4Button.visible = false;
character5Button.visible = false;
backButton.visible = false;
titleText.visible = true;
instructionText.visible = true;
}
} else if (gameState === 'playing') {
dragNode = playerRobot;
handleMove(x, y, obj);
}
};
// Function to start the game
function startGame() {
gameState = 'playing';
titleText.visible = false;
instructionText.visible = false;
characterSelectText.visible = false;
character1Button.visible = false;
character2Button.visible = false;
character3Button.visible = false;
character4Button.visible = false;
character5Button.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;
}
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) + '%');
// 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
});
}
});
}
};
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
BALA LASER. In-Game asset. 2d. High contrast. No shadows
piso tecnologico neon. In-Game asset. 2d. High contrast. No shadows