/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Boss = Container.expand(function () { var self = Container.call(this); var bossGraphics = self.attachAsset('boss', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.health = 1000; self.maxHealth = 1000; self.lastY = 0; self.healthText = new Text2(self.health.toString(), { size: 60, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 3 }); self.healthText.anchor.set(0.5, 0.5); self.healthText.x = 0; self.healthText.y = -100; self.addChild(self.healthText); self.takeDamage = function (damage) { self.health -= damage; self.healthText.setText(self.health.toString()); LK.effects.flashObject(self, 0xFFFFFF, 200); if (self.health <= 0) { // Create particle explosion effect for (var p = 0; p < 10; p++) { var particle = new Particle(); particle.x = self.x; particle.y = self.y; var angle = p / 10 * Math.PI * 2; var speed = 4 + Math.random() * 3; particle.vx = Math.cos(angle) * speed; particle.vy = Math.sin(angle) * speed; particle.tint = 0x8B0000; self.parent.addChild(particle); } // Add death animation tween(self, { scaleX: 0.1, scaleY: 0.1, alpha: 0 }, { duration: 500, easing: tween.easeOut }); return true; // Boss is dead } return false; }; self.update = function () { self.y += self.speed; }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 15; self.damage = 1; self.lastY = 0; self.update = function () { self.y -= self.speed; }; return self; }); var DamageUpgrade = Container.expand(function () { var self = Container.call(this); var upgradeGraphics = self.attachAsset('damageUpgrade', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.lastY = 0; self.update = function () { self.y += self.speed; self.rotation += 0.03; }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; self.health = 3; self.maxHealth = 3; self.lastY = 0; self.healthText = new Text2(self.health.toString(), { size: 45, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 2 }); self.healthText.anchor.set(0.5, 0.5); self.healthText.x = 0; self.healthText.y = -60; self.addChild(self.healthText); self.takeDamage = function (damage) { self.health -= damage; self.healthText.setText(self.health.toString()); LK.effects.flashObject(self, 0xFFFFFF, 200); if (self.health <= 0) { // Create particle explosion effect for (var p = 0; p < 6; p++) { var particle = new Particle(); particle.x = self.x; particle.y = self.y; var angle = p / 6 * Math.PI * 2; var speed = 3 + Math.random() * 2; particle.vx = Math.cos(angle) * speed; particle.vy = Math.sin(angle) * speed; particle.tint = 0xff4444; self.parent.addChild(particle); } // Add death animation tween(self, { scaleX: 0.1, scaleY: 0.1, alpha: 0 }, { duration: 300, easing: tween.easeOut }); return true; // Enemy is dead } return false; }; self.update = function () { self.y += self.speed; }; return self; }); var FireRateUpgrade = Container.expand(function () { var self = Container.call(this); var upgradeGraphics = self.attachAsset('fireRateUpgrade', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.lastY = 0; self.update = function () { self.y += self.speed; self.rotation += 0.03; }; return self; }); var HealthBoost = Container.expand(function () { var self = Container.call(this); var boostGraphics = self.attachAsset('healthBoost', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.lastY = 0; self.update = function () { self.y += self.speed; self.rotation += 0.03; }; return self; }); var HealthUpgrade = Container.expand(function () { var self = Container.call(this); var upgradeGraphics = self.attachAsset('healthUpgrade', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.lastY = 0; self.update = function () { self.y += self.speed; self.rotation += 0.03; }; return self; }); var MultishotUpgrade = Container.expand(function () { var self = Container.call(this); var upgradeGraphics = self.attachAsset('multishotUpgrade', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.lastY = 0; self.update = function () { self.y += self.speed; self.rotation += 0.03; }; return self; }); var Particle = Container.expand(function () { var self = Container.call(this); var particleGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); particleGraphics.scaleX = 0.3; particleGraphics.scaleY = 0.3; particleGraphics.tint = 0xffffff; self.vx = 0; self.vy = 0; self.life = 1.0; self.update = function () { self.x += self.vx; self.y += self.vy; self.life -= 0.02; self.alpha = self.life; if (self.life <= 0) { self.destroy(); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.health = 3; self.maxHealth = Math.min(3, 10); self.speed = 5; self.fireRate = 1; // Start at 1 and increment up self.bulletDamage = 1; self.multiShot = 1; // Number of bullets per shot self.lastShot = 0; self.shoot = function () { if (LK.ticks - self.lastShot >= Math.floor(60 / self.fireRate)) { self.lastShot = LK.ticks; LK.getSound('shoot').play(); for (var i = 0; i < self.multiShot; i++) { var bullet = new Bullet(); bullet.x = self.x + (i - (self.multiShot - 1) / 2) * 20; bullet.y = self.y - 40; bullet.damage = self.bulletDamage + extraDamageFromBosses; bullet.lastY = bullet.y; bullets.push(bullet); game.addChild(bullet); } } }; self.upgradeFireRate = function () { if (self.fireRate < 8) { self.fireRate += 1; } }; self.upgradeDamage = function () { self.bulletDamage += 1; }; self.upgradeMultiShot = function () { if (self.multiShot >= 5) { // Reset multishot to 1 and add 1 damage self.multiShot = 1; self.bulletDamage += 1; } else { self.multiShot += 1; } }; self.takeDamage = function () { self.health--; LK.getSound('damage').play(); // Add red tint animation to player tween(self, { tint: 0xFF0000 }, { duration: 200, onFinish: function onFinish() { tween(self, { tint: 0xFFFFFF }, { duration: 200 }); } }); if (self.health <= 0) { LK.showGameOver(); } }; self.heal = function () { if (self.health < 10) { var healAmount = 1 + healthRegenLevel; self.health = Math.min(self.health + healAmount, 10); } }; self.upgradeHealthRegen = function () { if (healthRegenLevel < 3) { healthRegenLevel++; } if (healthRegenLevel >= 3) { extraDamageFromBosses += 5; } }; self.upgradeSpeed = function () { if (self.speed < 10) { self.speed = Math.min(Math.floor(self.speed * 1.15) + 1, 10); } }; return self; }); var SpeedUpgrade = Container.expand(function () { var self = Container.call(this); var upgradeGraphics = self.attachAsset('speedUpgrade', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.lastY = 0; self.update = function () { self.y += self.speed; self.rotation += 0.03; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a1a }); /**** * Game Code ****/ // Game dimensions and layout - no lanes, full width spawning var gameWidth = 2048; // Background scrolling setup var background1 = game.addChild(LK.getAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); var background2 = game.addChild(LK.getAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: -2732 })); var backgroundSpeed = 2; // Create player var player = game.addChild(new Player()); player.x = gameWidth / 2; player.y = 2732 - 200; // Game arrays var enemies = []; var bullets = []; var fireRateUpgrades = []; var healthUpgrades = []; var damageUpgrades = []; var speedUpgrades = []; var multishotUpgrades = []; var bosses = []; var bossSpawnCounter = 0; var healthBoosts = []; var healthRegenLevel = 0; // 0 = +1, 1 = +2, 2 = +3 var extraDamageFromBosses = 0; // Dragging variables var isDragging = false; var dragOffset = { x: 0, y: 0 }; // Game variables var gameSpeed = 1; var enemySpawnRate = 120; // UI Elements var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 1); scoreText.x = 50; scoreText.y = -50; LK.gui.bottomLeft.addChild(scoreText); var healthText = new Text2('Health: 3', { size: 60, fill: 0xFF0000 }); healthText.anchor.set(1, 0); LK.gui.topRight.addChild(healthText); // Player upgrades display var upgradesText = new Text2('Upgrades:\nDamage: 1\nSpeed: 5\nMultiShot: 1\nFireRate: 30', { size: 40, fill: 0x00FFFF }); upgradesText.anchor.set(1, 0); upgradesText.x = -10; upgradesText.y = 80; LK.gui.topRight.addChild(upgradesText); // Game timer display var timerText = new Text2('Time: 00:00', { size: 50, fill: 0xFFFFFF }); timerText.anchor.set(0.5, 0); LK.gui.top.addChild(timerText); // Input handling - drag mechanics game.down = function (x, y, obj) { isDragging = true; dragOffset.x = x - player.x; dragOffset.y = y - player.y; }; game.move = function (x, y, obj) { if (isDragging) { player.x = Math.max(50, Math.min(2048 - 50, x - dragOffset.x)); player.y = Math.max(50, Math.min(2732 - 50, y - dragOffset.y)); } }; game.up = function (x, y, obj) { isDragging = false; }; // Main game loop game.update = function () { // Update scrolling background background1.y += backgroundSpeed; background2.y += backgroundSpeed; // Reset background positions when they go off screen if (background1.y >= 2732) { background1.y = background2.y - 2732; } if (background2.y >= 2732) { background2.y = background1.y - 2732; } // Update game speed gameSpeed += 0.001; // Update score and UI scoreText.setText('Score: ' + LK.getScore()); healthText.setText('Health: ' + player.health); upgradesText.setText('Upgrades:\nDamage: ' + player.bulletDamage + '\nSpeed: ' + player.speed + '\nMultiShot: ' + player.multiShot + '\nFireRate: ' + player.fireRate); // Update timer display var minutes = Math.floor(LK.ticks / 3600); var seconds = Math.floor(LK.ticks % 3600 / 60); var timeString = (minutes < 10 ? '0' : '') + minutes + ':' + (seconds < 10 ? '0' : '') + seconds; timerText.setText('Time: ' + timeString); // Calculate enemy health based on time // Every 30 seconds = 1800 ticks at 60fps (+10 health) // Every 60 seconds = 3600 ticks at 60fps (+20 health) var enemyHealthBonus30s = Math.floor(LK.ticks / 1800) * 10; var enemyHealthBonus60s = Math.floor(LK.ticks / 3600) * 20; var enemyHealthBonus = enemyHealthBonus30s + enemyHealthBonus60s; // Spawn enemies across full width if (LK.ticks % Math.max(30, enemySpawnRate - Math.floor(LK.ticks / 100)) == 0) { var enemy = new Enemy(); enemy.x = 25 + Math.random() * (gameWidth - 50); // Random position with 25px boundaries enemy.y = -50; enemy.speed = 4 + gameSpeed; enemy.health = 3 + enemyHealthBonus; enemy.maxHealth = 3 + enemyHealthBonus; enemy.healthText.setText(enemy.health.toString()); enemy.lastY = enemy.y; enemies.push(enemy); game.addChild(enemy); } // Spawn fire rate upgrades across full width (much reduced rate for natural spawns) if (LK.ticks % Math.max(1800, 2400 - Math.floor(LK.ticks / 20)) == 0) { var fireRateUpgrade = new FireRateUpgrade(); fireRateUpgrade.x = 25 + Math.random() * (gameWidth - 50); // Random position with 25px boundaries fireRateUpgrade.y = -50; fireRateUpgrade.speed = 6 + gameSpeed; fireRateUpgrade.lastY = fireRateUpgrade.y; fireRateUpgrades.push(fireRateUpgrade); game.addChild(fireRateUpgrade); } // Spawn boss every 2 minutes (7200 ticks at 60fps) if (LK.ticks > 0 && LK.ticks % 7200 == 0) { var boss = new Boss(); boss.x = gameWidth / 2; boss.y = -75; boss.speed = 2 + gameSpeed * 0.5; // Increase health by 1000 each time boss.health = 1000 + bossSpawnCounter * 1000; boss.maxHealth = boss.health; boss.healthText.setText(boss.health.toString()); boss.lastY = boss.y; bosses.push(boss); game.addChild(boss); bossSpawnCounter++; } // Auto shooting player.shoot(); // Update and check bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; // Check if bullet went off screen if (bullet.lastY > -50 && bullet.y <= -50) { bullet.destroy(); bullets.splice(i, 1); continue; } bullet.lastY = bullet.y; } // Check bullet-enemy collisions for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { var enemyDead = enemy.takeDamage(bullet.damage); bullet.destroy(); bullets.splice(i, 1); if (enemyDead) { LK.setScore(LK.getScore() + 1); // Drop upgrade chance when enemy dies - total 80% chance var dropChance = Math.random(); if (dropChance < 0.25 && player.fireRate < 8) { // 25% Fire Rate upgrade (only if fireRate < 8) var droppedUpgrade = new FireRateUpgrade(); droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, enemy.x)); droppedUpgrade.y = enemy.y; droppedUpgrade.speed = 4; droppedUpgrade.lastY = droppedUpgrade.y; fireRateUpgrades.push(droppedUpgrade); game.addChild(droppedUpgrade); } else if (dropChance < 0.45) { // 20% Damage upgrade var droppedUpgrade = new DamageUpgrade(); droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, enemy.x)); droppedUpgrade.y = enemy.y; droppedUpgrade.speed = 4; droppedUpgrade.lastY = droppedUpgrade.y; damageUpgrades.push(droppedUpgrade); game.addChild(droppedUpgrade); } else if (dropChance < 0.65 && player.speed < 10) { // 20% Speed upgrade (only if speed < 10) var droppedUpgrade = new SpeedUpgrade(); droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, enemy.x)); droppedUpgrade.y = enemy.y; droppedUpgrade.speed = 4; droppedUpgrade.lastY = droppedUpgrade.y; speedUpgrades.push(droppedUpgrade); game.addChild(droppedUpgrade); } else if (dropChance < 0.75) { // 10% Multishot upgrade var droppedUpgrade = new MultishotUpgrade(); droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, enemy.x)); droppedUpgrade.y = enemy.y; droppedUpgrade.speed = 4; droppedUpgrade.lastY = droppedUpgrade.y; multishotUpgrades.push(droppedUpgrade); game.addChild(droppedUpgrade); } else if (dropChance < 0.80) { // 5% Health upgrade var droppedUpgrade = new HealthUpgrade(); droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, enemy.x)); droppedUpgrade.y = enemy.y; droppedUpgrade.speed = 4; droppedUpgrade.lastY = droppedUpgrade.y; healthUpgrades.push(droppedUpgrade); game.addChild(droppedUpgrade); } // Remove enemy from array and destroy immediately enemies.splice(j, 1); enemy.destroy(); } break; } } } // Check bullet-boss collisions for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; for (var j = bosses.length - 1; j >= 0; j--) { var boss = bosses[j]; if (bullet.intersects(boss)) { var bossDead = boss.takeDamage(bullet.damage); bullet.destroy(); bullets.splice(i, 1); if (bossDead) { LK.setScore(LK.getScore() + 100); // Boss always drops health boost var healthBoost = new HealthBoost(); healthBoost.x = boss.x; healthBoost.y = boss.y; healthBoost.speed = 4; healthBoost.lastY = healthBoost.y; healthBoosts.push(healthBoost); game.addChild(healthBoost); // Boss always drops 3 random upgrades for (var k = 0; k < 3; k++) { var dropChance = Math.random(); var droppedUpgrade; if (dropChance < 0.3) { droppedUpgrade = new FireRateUpgrade(); fireRateUpgrades.push(droppedUpgrade); } else if (dropChance < 0.5) { droppedUpgrade = new DamageUpgrade(); damageUpgrades.push(droppedUpgrade); } else if (dropChance < 0.7) { droppedUpgrade = new SpeedUpgrade(); speedUpgrades.push(droppedUpgrade); } else if (dropChance < 0.85) { droppedUpgrade = new MultishotUpgrade(); multishotUpgrades.push(droppedUpgrade); } else { droppedUpgrade = new HealthUpgrade(); healthUpgrades.push(droppedUpgrade); } droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, boss.x + (k - 1) * 60)); droppedUpgrade.y = boss.y; droppedUpgrade.speed = 4; droppedUpgrade.lastY = droppedUpgrade.y; game.addChild(droppedUpgrade); } // Remove boss from array and destroy immediately bosses.splice(j, 1); boss.destroy(); } break; } } } // Update and check enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; // Check if enemy went off screen if (enemy.lastY < 2732 + 50 && enemy.y >= 2732 + 50) { player.takeDamage(); // Player takes damage when enemy reaches bottom enemy.destroy(); enemies.splice(i, 1); continue; } // Check collision with player if (enemy.intersects(player)) { player.takeDamage(); enemy.destroy(); enemies.splice(i, 1); continue; } enemy.lastY = enemy.y; } // Update and check bosses for (var i = bosses.length - 1; i >= 0; i--) { var boss = bosses[i]; // Check if boss went off screen if (boss.lastY < 2732 + 75 && boss.y >= 2732 + 75) { player.takeDamage(); // Player takes damage when boss reaches bottom boss.destroy(); bosses.splice(i, 1); continue; } // Check collision with player if (boss.intersects(player)) { player.takeDamage(); boss.destroy(); bosses.splice(i, 1); continue; } boss.lastY = boss.y; } // Update and check fire rate upgrades for (var i = fireRateUpgrades.length - 1; i >= 0; i--) { var fireRateUpgrade = fireRateUpgrades[i]; // Check if upgrade went off screen if (fireRateUpgrade.lastY < 2732 + 50 && fireRateUpgrade.y >= 2732 + 50) { fireRateUpgrade.destroy(); fireRateUpgrades.splice(i, 1); continue; } // Check collection by player if (fireRateUpgrade.intersects(player)) { LK.getSound('collect').play(); player.upgradeFireRate(); // Add player upgrade animation tween(player, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150, onFinish: function onFinish() { tween(player, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150 }); } }); LK.effects.flashObject(fireRateUpgrade, 0xffa500, 300); fireRateUpgrade.destroy(); fireRateUpgrades.splice(i, 1); continue; } fireRateUpgrade.lastY = fireRateUpgrade.y; } // Update and check damage upgrades for (var i = damageUpgrades.length - 1; i >= 0; i--) { var damageUpgrade = damageUpgrades[i]; // Check if upgrade went off screen if (damageUpgrade.lastY < 2732 + 50 && damageUpgrade.y >= 2732 + 50) { damageUpgrade.destroy(); damageUpgrades.splice(i, 1); continue; } // Check collection by player if (damageUpgrade.intersects(player)) { LK.getSound('collect').play(); player.upgradeDamage(); // Add player upgrade animation tween(player, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150, onFinish: function onFinish() { tween(player, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150 }); } }); LK.effects.flashObject(damageUpgrade, 0xffff00, 300); damageUpgrade.destroy(); damageUpgrades.splice(i, 1); continue; } damageUpgrade.lastY = damageUpgrade.y; } // Update and check speed upgrades for (var i = speedUpgrades.length - 1; i >= 0; i--) { var speedUpgrade = speedUpgrades[i]; // Check if upgrade went off screen if (speedUpgrade.lastY < 2732 + 50 && speedUpgrade.y >= 2732 + 50) { speedUpgrade.destroy(); speedUpgrades.splice(i, 1); continue; } // Check collection by player if (speedUpgrade.intersects(player)) { LK.getSound('collect').play(); player.upgradeSpeed(); // Add player upgrade animation tween(player, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150, onFinish: function onFinish() { tween(player, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150 }); } }); LK.effects.flashObject(speedUpgrade, 0x0000ff, 300); speedUpgrade.destroy(); speedUpgrades.splice(i, 1); continue; } speedUpgrade.lastY = speedUpgrade.y; } // Update and check multishot upgrades for (var i = multishotUpgrades.length - 1; i >= 0; i--) { var multishotUpgrade = multishotUpgrades[i]; // Check if upgrade went off screen if (multishotUpgrade.lastY < 2732 + 50 && multishotUpgrade.y >= 2732 + 50) { multishotUpgrade.destroy(); multishotUpgrades.splice(i, 1); continue; } // Check collection by player if (multishotUpgrade.intersects(player)) { LK.getSound('collect').play(); player.upgradeMultiShot(); // Add player upgrade animation tween(player, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150, onFinish: function onFinish() { tween(player, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150 }); } }); LK.effects.flashObject(multishotUpgrade, 0x800000, 300); multishotUpgrade.destroy(); multishotUpgrades.splice(i, 1); continue; } multishotUpgrade.lastY = multishotUpgrade.y; } // Update and check health upgrades for (var i = healthUpgrades.length - 1; i >= 0; i--) { var healthUpgrade = healthUpgrades[i]; // Check if upgrade went off screen if (healthUpgrade.lastY < 2732 + 50 && healthUpgrade.y >= 2732 + 50) { healthUpgrade.destroy(); healthUpgrades.splice(i, 1); continue; } // Check collection by player if (healthUpgrade.intersects(player)) { LK.getSound('collect').play(); player.maxHealth = Math.min(Math.floor(player.maxHealth * 1.2) + 1, 10); player.heal(); // Add player upgrade animation tween(player, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150, onFinish: function onFinish() { tween(player, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150 }); } }); LK.effects.flashObject(healthUpgrade, 0x4caf50, 300); healthUpgrade.destroy(); healthUpgrades.splice(i, 1); continue; } healthUpgrade.lastY = healthUpgrade.y; } // Update and check health boosts for (var i = healthBoosts.length - 1; i >= 0; i--) { var healthBoost = healthBoosts[i]; // Check if boost went off screen if (healthBoost.lastY < 2732 + 50 && healthBoost.y >= 2732 + 50) { healthBoost.destroy(); healthBoosts.splice(i, 1); continue; } // Check collection by player if (healthBoost.intersects(player)) { LK.getSound('collect').play(); player.upgradeHealthRegen(); // Add player upgrade animation tween(player, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150, onFinish: function onFinish() { tween(player, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150 }); } }); LK.effects.flashObject(healthBoost, 0x00ff80, 300); healthBoost.destroy(); healthBoosts.splice(i, 1); continue; } healthBoost.lastY = healthBoost.y; } }; // Start background music LK.playMusic('background');
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.health = 1000;
self.maxHealth = 1000;
self.lastY = 0;
self.healthText = new Text2(self.health.toString(), {
size: 60,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 3
});
self.healthText.anchor.set(0.5, 0.5);
self.healthText.x = 0;
self.healthText.y = -100;
self.addChild(self.healthText);
self.takeDamage = function (damage) {
self.health -= damage;
self.healthText.setText(self.health.toString());
LK.effects.flashObject(self, 0xFFFFFF, 200);
if (self.health <= 0) {
// Create particle explosion effect
for (var p = 0; p < 10; p++) {
var particle = new Particle();
particle.x = self.x;
particle.y = self.y;
var angle = p / 10 * Math.PI * 2;
var speed = 4 + Math.random() * 3;
particle.vx = Math.cos(angle) * speed;
particle.vy = Math.sin(angle) * speed;
particle.tint = 0x8B0000;
self.parent.addChild(particle);
}
// Add death animation
tween(self, {
scaleX: 0.1,
scaleY: 0.1,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut
});
return true; // Boss is dead
}
return false;
};
self.update = function () {
self.y += self.speed;
};
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.damage = 1;
self.lastY = 0;
self.update = function () {
self.y -= self.speed;
};
return self;
});
var DamageUpgrade = Container.expand(function () {
var self = Container.call(this);
var upgradeGraphics = self.attachAsset('damageUpgrade', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.lastY = 0;
self.update = function () {
self.y += self.speed;
self.rotation += 0.03;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.health = 3;
self.maxHealth = 3;
self.lastY = 0;
self.healthText = new Text2(self.health.toString(), {
size: 45,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 2
});
self.healthText.anchor.set(0.5, 0.5);
self.healthText.x = 0;
self.healthText.y = -60;
self.addChild(self.healthText);
self.takeDamage = function (damage) {
self.health -= damage;
self.healthText.setText(self.health.toString());
LK.effects.flashObject(self, 0xFFFFFF, 200);
if (self.health <= 0) {
// Create particle explosion effect
for (var p = 0; p < 6; p++) {
var particle = new Particle();
particle.x = self.x;
particle.y = self.y;
var angle = p / 6 * Math.PI * 2;
var speed = 3 + Math.random() * 2;
particle.vx = Math.cos(angle) * speed;
particle.vy = Math.sin(angle) * speed;
particle.tint = 0xff4444;
self.parent.addChild(particle);
}
// Add death animation
tween(self, {
scaleX: 0.1,
scaleY: 0.1,
alpha: 0
}, {
duration: 300,
easing: tween.easeOut
});
return true; // Enemy is dead
}
return false;
};
self.update = function () {
self.y += self.speed;
};
return self;
});
var FireRateUpgrade = Container.expand(function () {
var self = Container.call(this);
var upgradeGraphics = self.attachAsset('fireRateUpgrade', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.lastY = 0;
self.update = function () {
self.y += self.speed;
self.rotation += 0.03;
};
return self;
});
var HealthBoost = Container.expand(function () {
var self = Container.call(this);
var boostGraphics = self.attachAsset('healthBoost', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.lastY = 0;
self.update = function () {
self.y += self.speed;
self.rotation += 0.03;
};
return self;
});
var HealthUpgrade = Container.expand(function () {
var self = Container.call(this);
var upgradeGraphics = self.attachAsset('healthUpgrade', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.lastY = 0;
self.update = function () {
self.y += self.speed;
self.rotation += 0.03;
};
return self;
});
var MultishotUpgrade = Container.expand(function () {
var self = Container.call(this);
var upgradeGraphics = self.attachAsset('multishotUpgrade', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.lastY = 0;
self.update = function () {
self.y += self.speed;
self.rotation += 0.03;
};
return self;
});
var Particle = Container.expand(function () {
var self = Container.call(this);
var particleGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
particleGraphics.scaleX = 0.3;
particleGraphics.scaleY = 0.3;
particleGraphics.tint = 0xffffff;
self.vx = 0;
self.vy = 0;
self.life = 1.0;
self.update = function () {
self.x += self.vx;
self.y += self.vy;
self.life -= 0.02;
self.alpha = self.life;
if (self.life <= 0) {
self.destroy();
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.maxHealth = Math.min(3, 10);
self.speed = 5;
self.fireRate = 1; // Start at 1 and increment up
self.bulletDamage = 1;
self.multiShot = 1; // Number of bullets per shot
self.lastShot = 0;
self.shoot = function () {
if (LK.ticks - self.lastShot >= Math.floor(60 / self.fireRate)) {
self.lastShot = LK.ticks;
LK.getSound('shoot').play();
for (var i = 0; i < self.multiShot; i++) {
var bullet = new Bullet();
bullet.x = self.x + (i - (self.multiShot - 1) / 2) * 20;
bullet.y = self.y - 40;
bullet.damage = self.bulletDamage + extraDamageFromBosses;
bullet.lastY = bullet.y;
bullets.push(bullet);
game.addChild(bullet);
}
}
};
self.upgradeFireRate = function () {
if (self.fireRate < 8) {
self.fireRate += 1;
}
};
self.upgradeDamage = function () {
self.bulletDamage += 1;
};
self.upgradeMultiShot = function () {
if (self.multiShot >= 5) {
// Reset multishot to 1 and add 1 damage
self.multiShot = 1;
self.bulletDamage += 1;
} else {
self.multiShot += 1;
}
};
self.takeDamage = function () {
self.health--;
LK.getSound('damage').play();
// Add red tint animation to player
tween(self, {
tint: 0xFF0000
}, {
duration: 200,
onFinish: function onFinish() {
tween(self, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
if (self.health <= 0) {
LK.showGameOver();
}
};
self.heal = function () {
if (self.health < 10) {
var healAmount = 1 + healthRegenLevel;
self.health = Math.min(self.health + healAmount, 10);
}
};
self.upgradeHealthRegen = function () {
if (healthRegenLevel < 3) {
healthRegenLevel++;
}
if (healthRegenLevel >= 3) {
extraDamageFromBosses += 5;
}
};
self.upgradeSpeed = function () {
if (self.speed < 10) {
self.speed = Math.min(Math.floor(self.speed * 1.15) + 1, 10);
}
};
return self;
});
var SpeedUpgrade = Container.expand(function () {
var self = Container.call(this);
var upgradeGraphics = self.attachAsset('speedUpgrade', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.lastY = 0;
self.update = function () {
self.y += self.speed;
self.rotation += 0.03;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
// Game dimensions and layout - no lanes, full width spawning
var gameWidth = 2048;
// Background scrolling setup
var background1 = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
var background2 = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: -2732
}));
var backgroundSpeed = 2;
// Create player
var player = game.addChild(new Player());
player.x = gameWidth / 2;
player.y = 2732 - 200;
// Game arrays
var enemies = [];
var bullets = [];
var fireRateUpgrades = [];
var healthUpgrades = [];
var damageUpgrades = [];
var speedUpgrades = [];
var multishotUpgrades = [];
var bosses = [];
var bossSpawnCounter = 0;
var healthBoosts = [];
var healthRegenLevel = 0; // 0 = +1, 1 = +2, 2 = +3
var extraDamageFromBosses = 0;
// Dragging variables
var isDragging = false;
var dragOffset = {
x: 0,
y: 0
};
// Game variables
var gameSpeed = 1;
var enemySpawnRate = 120;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 1);
scoreText.x = 50;
scoreText.y = -50;
LK.gui.bottomLeft.addChild(scoreText);
var healthText = new Text2('Health: 3', {
size: 60,
fill: 0xFF0000
});
healthText.anchor.set(1, 0);
LK.gui.topRight.addChild(healthText);
// Player upgrades display
var upgradesText = new Text2('Upgrades:\nDamage: 1\nSpeed: 5\nMultiShot: 1\nFireRate: 30', {
size: 40,
fill: 0x00FFFF
});
upgradesText.anchor.set(1, 0);
upgradesText.x = -10;
upgradesText.y = 80;
LK.gui.topRight.addChild(upgradesText);
// Game timer display
var timerText = new Text2('Time: 00:00', {
size: 50,
fill: 0xFFFFFF
});
timerText.anchor.set(0.5, 0);
LK.gui.top.addChild(timerText);
// Input handling - drag mechanics
game.down = function (x, y, obj) {
isDragging = true;
dragOffset.x = x - player.x;
dragOffset.y = y - player.y;
};
game.move = function (x, y, obj) {
if (isDragging) {
player.x = Math.max(50, Math.min(2048 - 50, x - dragOffset.x));
player.y = Math.max(50, Math.min(2732 - 50, y - dragOffset.y));
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
// Main game loop
game.update = function () {
// Update scrolling background
background1.y += backgroundSpeed;
background2.y += backgroundSpeed;
// Reset background positions when they go off screen
if (background1.y >= 2732) {
background1.y = background2.y - 2732;
}
if (background2.y >= 2732) {
background2.y = background1.y - 2732;
}
// Update game speed
gameSpeed += 0.001;
// Update score and UI
scoreText.setText('Score: ' + LK.getScore());
healthText.setText('Health: ' + player.health);
upgradesText.setText('Upgrades:\nDamage: ' + player.bulletDamage + '\nSpeed: ' + player.speed + '\nMultiShot: ' + player.multiShot + '\nFireRate: ' + player.fireRate);
// Update timer display
var minutes = Math.floor(LK.ticks / 3600);
var seconds = Math.floor(LK.ticks % 3600 / 60);
var timeString = (minutes < 10 ? '0' : '') + minutes + ':' + (seconds < 10 ? '0' : '') + seconds;
timerText.setText('Time: ' + timeString);
// Calculate enemy health based on time
// Every 30 seconds = 1800 ticks at 60fps (+10 health)
// Every 60 seconds = 3600 ticks at 60fps (+20 health)
var enemyHealthBonus30s = Math.floor(LK.ticks / 1800) * 10;
var enemyHealthBonus60s = Math.floor(LK.ticks / 3600) * 20;
var enemyHealthBonus = enemyHealthBonus30s + enemyHealthBonus60s;
// Spawn enemies across full width
if (LK.ticks % Math.max(30, enemySpawnRate - Math.floor(LK.ticks / 100)) == 0) {
var enemy = new Enemy();
enemy.x = 25 + Math.random() * (gameWidth - 50); // Random position with 25px boundaries
enemy.y = -50;
enemy.speed = 4 + gameSpeed;
enemy.health = 3 + enemyHealthBonus;
enemy.maxHealth = 3 + enemyHealthBonus;
enemy.healthText.setText(enemy.health.toString());
enemy.lastY = enemy.y;
enemies.push(enemy);
game.addChild(enemy);
}
// Spawn fire rate upgrades across full width (much reduced rate for natural spawns)
if (LK.ticks % Math.max(1800, 2400 - Math.floor(LK.ticks / 20)) == 0) {
var fireRateUpgrade = new FireRateUpgrade();
fireRateUpgrade.x = 25 + Math.random() * (gameWidth - 50); // Random position with 25px boundaries
fireRateUpgrade.y = -50;
fireRateUpgrade.speed = 6 + gameSpeed;
fireRateUpgrade.lastY = fireRateUpgrade.y;
fireRateUpgrades.push(fireRateUpgrade);
game.addChild(fireRateUpgrade);
}
// Spawn boss every 2 minutes (7200 ticks at 60fps)
if (LK.ticks > 0 && LK.ticks % 7200 == 0) {
var boss = new Boss();
boss.x = gameWidth / 2;
boss.y = -75;
boss.speed = 2 + gameSpeed * 0.5;
// Increase health by 1000 each time
boss.health = 1000 + bossSpawnCounter * 1000;
boss.maxHealth = boss.health;
boss.healthText.setText(boss.health.toString());
boss.lastY = boss.y;
bosses.push(boss);
game.addChild(boss);
bossSpawnCounter++;
}
// Auto shooting
player.shoot();
// Update and check bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Check if bullet went off screen
if (bullet.lastY > -50 && bullet.y <= -50) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
bullet.lastY = bullet.y;
}
// Check bullet-enemy collisions
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
var enemyDead = enemy.takeDamage(bullet.damage);
bullet.destroy();
bullets.splice(i, 1);
if (enemyDead) {
LK.setScore(LK.getScore() + 1);
// Drop upgrade chance when enemy dies - total 80% chance
var dropChance = Math.random();
if (dropChance < 0.25 && player.fireRate < 8) {
// 25% Fire Rate upgrade (only if fireRate < 8)
var droppedUpgrade = new FireRateUpgrade();
droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, enemy.x));
droppedUpgrade.y = enemy.y;
droppedUpgrade.speed = 4;
droppedUpgrade.lastY = droppedUpgrade.y;
fireRateUpgrades.push(droppedUpgrade);
game.addChild(droppedUpgrade);
} else if (dropChance < 0.45) {
// 20% Damage upgrade
var droppedUpgrade = new DamageUpgrade();
droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, enemy.x));
droppedUpgrade.y = enemy.y;
droppedUpgrade.speed = 4;
droppedUpgrade.lastY = droppedUpgrade.y;
damageUpgrades.push(droppedUpgrade);
game.addChild(droppedUpgrade);
} else if (dropChance < 0.65 && player.speed < 10) {
// 20% Speed upgrade (only if speed < 10)
var droppedUpgrade = new SpeedUpgrade();
droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, enemy.x));
droppedUpgrade.y = enemy.y;
droppedUpgrade.speed = 4;
droppedUpgrade.lastY = droppedUpgrade.y;
speedUpgrades.push(droppedUpgrade);
game.addChild(droppedUpgrade);
} else if (dropChance < 0.75) {
// 10% Multishot upgrade
var droppedUpgrade = new MultishotUpgrade();
droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, enemy.x));
droppedUpgrade.y = enemy.y;
droppedUpgrade.speed = 4;
droppedUpgrade.lastY = droppedUpgrade.y;
multishotUpgrades.push(droppedUpgrade);
game.addChild(droppedUpgrade);
} else if (dropChance < 0.80) {
// 5% Health upgrade
var droppedUpgrade = new HealthUpgrade();
droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, enemy.x));
droppedUpgrade.y = enemy.y;
droppedUpgrade.speed = 4;
droppedUpgrade.lastY = droppedUpgrade.y;
healthUpgrades.push(droppedUpgrade);
game.addChild(droppedUpgrade);
}
// Remove enemy from array and destroy immediately
enemies.splice(j, 1);
enemy.destroy();
}
break;
}
}
}
// Check bullet-boss collisions
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
for (var j = bosses.length - 1; j >= 0; j--) {
var boss = bosses[j];
if (bullet.intersects(boss)) {
var bossDead = boss.takeDamage(bullet.damage);
bullet.destroy();
bullets.splice(i, 1);
if (bossDead) {
LK.setScore(LK.getScore() + 100);
// Boss always drops health boost
var healthBoost = new HealthBoost();
healthBoost.x = boss.x;
healthBoost.y = boss.y;
healthBoost.speed = 4;
healthBoost.lastY = healthBoost.y;
healthBoosts.push(healthBoost);
game.addChild(healthBoost);
// Boss always drops 3 random upgrades
for (var k = 0; k < 3; k++) {
var dropChance = Math.random();
var droppedUpgrade;
if (dropChance < 0.3) {
droppedUpgrade = new FireRateUpgrade();
fireRateUpgrades.push(droppedUpgrade);
} else if (dropChance < 0.5) {
droppedUpgrade = new DamageUpgrade();
damageUpgrades.push(droppedUpgrade);
} else if (dropChance < 0.7) {
droppedUpgrade = new SpeedUpgrade();
speedUpgrades.push(droppedUpgrade);
} else if (dropChance < 0.85) {
droppedUpgrade = new MultishotUpgrade();
multishotUpgrades.push(droppedUpgrade);
} else {
droppedUpgrade = new HealthUpgrade();
healthUpgrades.push(droppedUpgrade);
}
droppedUpgrade.x = Math.max(25, Math.min(gameWidth - 25, boss.x + (k - 1) * 60));
droppedUpgrade.y = boss.y;
droppedUpgrade.speed = 4;
droppedUpgrade.lastY = droppedUpgrade.y;
game.addChild(droppedUpgrade);
}
// Remove boss from array and destroy immediately
bosses.splice(j, 1);
boss.destroy();
}
break;
}
}
}
// Update and check enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
// Check if enemy went off screen
if (enemy.lastY < 2732 + 50 && enemy.y >= 2732 + 50) {
player.takeDamage(); // Player takes damage when enemy reaches bottom
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with player
if (enemy.intersects(player)) {
player.takeDamage();
enemy.destroy();
enemies.splice(i, 1);
continue;
}
enemy.lastY = enemy.y;
}
// Update and check bosses
for (var i = bosses.length - 1; i >= 0; i--) {
var boss = bosses[i];
// Check if boss went off screen
if (boss.lastY < 2732 + 75 && boss.y >= 2732 + 75) {
player.takeDamage(); // Player takes damage when boss reaches bottom
boss.destroy();
bosses.splice(i, 1);
continue;
}
// Check collision with player
if (boss.intersects(player)) {
player.takeDamage();
boss.destroy();
bosses.splice(i, 1);
continue;
}
boss.lastY = boss.y;
}
// Update and check fire rate upgrades
for (var i = fireRateUpgrades.length - 1; i >= 0; i--) {
var fireRateUpgrade = fireRateUpgrades[i];
// Check if upgrade went off screen
if (fireRateUpgrade.lastY < 2732 + 50 && fireRateUpgrade.y >= 2732 + 50) {
fireRateUpgrade.destroy();
fireRateUpgrades.splice(i, 1);
continue;
}
// Check collection by player
if (fireRateUpgrade.intersects(player)) {
LK.getSound('collect').play();
player.upgradeFireRate();
// Add player upgrade animation
tween(player, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(player, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 150
});
}
});
LK.effects.flashObject(fireRateUpgrade, 0xffa500, 300);
fireRateUpgrade.destroy();
fireRateUpgrades.splice(i, 1);
continue;
}
fireRateUpgrade.lastY = fireRateUpgrade.y;
}
// Update and check damage upgrades
for (var i = damageUpgrades.length - 1; i >= 0; i--) {
var damageUpgrade = damageUpgrades[i];
// Check if upgrade went off screen
if (damageUpgrade.lastY < 2732 + 50 && damageUpgrade.y >= 2732 + 50) {
damageUpgrade.destroy();
damageUpgrades.splice(i, 1);
continue;
}
// Check collection by player
if (damageUpgrade.intersects(player)) {
LK.getSound('collect').play();
player.upgradeDamage();
// Add player upgrade animation
tween(player, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(player, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 150
});
}
});
LK.effects.flashObject(damageUpgrade, 0xffff00, 300);
damageUpgrade.destroy();
damageUpgrades.splice(i, 1);
continue;
}
damageUpgrade.lastY = damageUpgrade.y;
}
// Update and check speed upgrades
for (var i = speedUpgrades.length - 1; i >= 0; i--) {
var speedUpgrade = speedUpgrades[i];
// Check if upgrade went off screen
if (speedUpgrade.lastY < 2732 + 50 && speedUpgrade.y >= 2732 + 50) {
speedUpgrade.destroy();
speedUpgrades.splice(i, 1);
continue;
}
// Check collection by player
if (speedUpgrade.intersects(player)) {
LK.getSound('collect').play();
player.upgradeSpeed();
// Add player upgrade animation
tween(player, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(player, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 150
});
}
});
LK.effects.flashObject(speedUpgrade, 0x0000ff, 300);
speedUpgrade.destroy();
speedUpgrades.splice(i, 1);
continue;
}
speedUpgrade.lastY = speedUpgrade.y;
}
// Update and check multishot upgrades
for (var i = multishotUpgrades.length - 1; i >= 0; i--) {
var multishotUpgrade = multishotUpgrades[i];
// Check if upgrade went off screen
if (multishotUpgrade.lastY < 2732 + 50 && multishotUpgrade.y >= 2732 + 50) {
multishotUpgrade.destroy();
multishotUpgrades.splice(i, 1);
continue;
}
// Check collection by player
if (multishotUpgrade.intersects(player)) {
LK.getSound('collect').play();
player.upgradeMultiShot();
// Add player upgrade animation
tween(player, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(player, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 150
});
}
});
LK.effects.flashObject(multishotUpgrade, 0x800000, 300);
multishotUpgrade.destroy();
multishotUpgrades.splice(i, 1);
continue;
}
multishotUpgrade.lastY = multishotUpgrade.y;
}
// Update and check health upgrades
for (var i = healthUpgrades.length - 1; i >= 0; i--) {
var healthUpgrade = healthUpgrades[i];
// Check if upgrade went off screen
if (healthUpgrade.lastY < 2732 + 50 && healthUpgrade.y >= 2732 + 50) {
healthUpgrade.destroy();
healthUpgrades.splice(i, 1);
continue;
}
// Check collection by player
if (healthUpgrade.intersects(player)) {
LK.getSound('collect').play();
player.maxHealth = Math.min(Math.floor(player.maxHealth * 1.2) + 1, 10);
player.heal();
// Add player upgrade animation
tween(player, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(player, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 150
});
}
});
LK.effects.flashObject(healthUpgrade, 0x4caf50, 300);
healthUpgrade.destroy();
healthUpgrades.splice(i, 1);
continue;
}
healthUpgrade.lastY = healthUpgrade.y;
}
// Update and check health boosts
for (var i = healthBoosts.length - 1; i >= 0; i--) {
var healthBoost = healthBoosts[i];
// Check if boost went off screen
if (healthBoost.lastY < 2732 + 50 && healthBoost.y >= 2732 + 50) {
healthBoost.destroy();
healthBoosts.splice(i, 1);
continue;
}
// Check collection by player
if (healthBoost.intersects(player)) {
LK.getSound('collect').play();
player.upgradeHealthRegen();
// Add player upgrade animation
tween(player, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(player, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 150
});
}
});
LK.effects.flashObject(healthBoost, 0x00ff80, 300);
healthBoost.destroy();
healthBoosts.splice(i, 1);
continue;
}
healthBoost.lastY = healthBoost.y;
}
};
// Start background music
LK.playMusic('background');
Aşırı kızgın, hatta kafasından alevler çıkan, kübizm tarzında bir canavar çiz.. In-Game asset. 2d. High contrast. No shadows
kübizm tarzında düz bir mermi. In-Game asset. 2d. High contrast. No shadows
Aşırı kızgın, kübizm tarzında bir canavar çiz.. In-Game asset. 2d. High contrast. No shadows
Bir iyileşme efekti çiz kübizm tarzında. In-Game asset. 2d. High contrast. No shadows
Ortaçağ tarzında bir uzay gemisi çiz ve çizim tarzıda kübizm olsun. In-Game asset. 2d. High contrast. No shadows
Bir iyileşme efekti çiz sade olsun In-Game asset. 2d. High contrast. No shadows
saldırı hızını artışını gösteren bir çizim In-Game asset. 2d. High contrast. No shadows
hız artışını görselleştir ve mavi olsun In-Game asset. 2d. High contrast. No shadows
Birden fazla mermi, üzerinde + işareti olsun ve mavi olsun In-Game asset. 2d. High contrast. No shadows
Kaslı bir kol üstünde de + işareti olan bir çizim yap mavi olsun In-Game asset. 2d. High contrast. No shadows
Tekrar eden başlangıç ve son noktası aynı olan bir uzay arkaplan olarak yapmak istiyorum In-Game asset. 2d. High contrast.