/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var BaseBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('baseBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.damage = 20; self.targetX = 0; self.targetY = 0; self.directionX = 0; self.directionY = 0; self.setTarget = function (x, y) { self.targetX = x; self.targetY = y; var dx = x - self.x; var dy = y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.directionX = dx / distance; self.directionY = dy / distance; } }; self.update = function () { self.x += self.directionX * self.speed; self.y += self.directionY * self.speed; }; return self; }); var BaseTurret = Container.expand(function () { var self = Container.call(this); var turretGraphics = self.attachAsset('baseTurret', { anchorX: 0.5, anchorY: 0.5 }); self.lastShot = 0; self.shootCooldown = 400; self.range = 350; self.damage = 45; self.findNearestEnemy = function () { var nearestEnemy = null; var nearestDistance = Infinity; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance && distance <= self.range) { nearestDistance = distance; nearestEnemy = enemy; } } return nearestEnemy; }; self.shootAtEnemy = function (target) { var bullet = new BaseBullet(); bullet.x = self.x; bullet.y = self.y; bullet.setTarget(target.x, target.y); bullet.damage = self.damage; baseBullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); }; self.update = function () { if (LK.ticks - self.lastShot > self.shootCooldown / 16.67) { var target = self.findNearestEnemy(); if (target) { self.shootAtEnemy(target); self.lastShot = LK.ticks; var angle = Math.atan2(target.y - self.y, target.x - self.x); turretGraphics.rotation = angle; } } }; return self; }); var Bear = Container.expand(function () { var self = Container.call(this); var bearGraphics = self.attachAsset('bear', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1.8; self.damage = 70; self.health = 200; self.maxHealth = 200; self.chargeTimer = 0; self.isCharging = false; self.takeDamage = function (damage) { self.health -= damage; // Create blood splatter effect createBloodSplatter(self.x, self.y, Math.min(damage / 12, 8)); tween(bearGraphics, { tint: 0xff0000 }, { duration: 100 }); tween(bearGraphics, { tint: 0xffffff }, { duration: 100 }); if (self.health <= 0) { // Create larger blood splatter when dying createBloodSplatter(self.x, self.y, 12); return true; } return false; }; self.update = function () { var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.chargeTimer++; if (self.chargeTimer > 100 && !self.isCharging) { self.isCharging = true; self.chargeTimer = 0; tween(bearGraphics, { tint: 0x8B4513 }, { duration: 300 }); tween(self, { x: self.x + dx / distance * self.speed * 10, y: self.y + dy / distance * self.speed * 10 }, { duration: 700, onFinish: function onFinish() { self.isCharging = false; tween(bearGraphics, { tint: 0xffffff }, { duration: 300 }); } }); } else if (!self.isCharging) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); var BloodParticle = Container.expand(function () { var self = Container.call(this); var bloodGraphics = self.attachAsset('baseBullet', { anchorX: 0.5, anchorY: 0.5 }); bloodGraphics.tint = 0x8B0000; // Dark red color bloodGraphics.scaleX = 0.3; bloodGraphics.scaleY = 0.3; self.velocityX = (Math.random() - 0.5) * 8; self.velocityY = (Math.random() - 0.5) * 8; self.gravity = 0.2; self.life = 60; // 1 second at 60fps self.maxLife = 60; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; self.velocityY += self.gravity; self.life--; // Fade out over time var alpha = self.life / self.maxLife; bloodGraphics.alpha = alpha; }; return self; }); var BloodTrail = Container.expand(function () { var self = Container.call(this); var trailGraphics = self.attachAsset('baseBullet', { anchorX: 0.5, anchorY: 0.5 }); trailGraphics.tint = 0x8B0000; // Dark red color trailGraphics.scaleX = 0.4; // Make trails twice as wide trailGraphics.scaleY = 1.2; // Make trails twice as long self.life = 360; // 6 seconds at 60fps - double duration self.maxLife = 360; self.fadeSpeed = 0.002; // Slower fade for more visible trails self.update = function () { self.life--; // Fade out over time var alpha = self.life / self.maxLife; trailGraphics.alpha = alpha * 0.7; // Scale down over time var scale = alpha * 0.6; trailGraphics.scaleX = 0.2 * scale; trailGraphics.scaleY = 0.6 * scale; }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12; self.damage = 35; self.targetX = 0; self.targetY = 0; self.directionX = 0; self.directionY = 0; self.setTarget = function (x, y) { self.targetX = x; self.targetY = y; var dx = x - self.x; var dy = y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.directionX = dx / distance; self.directionY = dy / distance; } }; self.update = function () { self.x += self.directionX * self.speed; self.y += self.directionY * self.speed; }; return self; }); var ControlledAnimal = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'sheep'; self.speed = 3; self.damage = 30; self.health = 100; self.maxHealth = 100; var animalGraphics = self.attachAsset('controlledAnimal', { anchorX: 0.5, anchorY: 0.5, tint: 0x00ffff }); self.takeDamage = function (damage) { self.health -= damage; // Create blood splatter effect createBloodSplatter(self.x, self.y, Math.min(damage / 8, 6)); tween(animalGraphics, { tint: 0xff0000 }, { duration: 100, onFinish: function onFinish() { tween(animalGraphics, { tint: 0x00ffff }, { duration: 100 }); } }); if (self.health <= 0) { // Create blood splatter when dying createBloodSplatter(self.x, self.y, 10); return true; } return false; }; self.attackEnemies = function () { var attackRange = 100; for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; if (enemy.type === self.type) continue; // Don't attack same type var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= attackRange) { var enemyDied = enemy.takeDamage(self.damage); if (enemyDied) { LK.setScore(LK.getScore() + 15); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } } } }; self.update = function () { // Attack nearby enemies of different types if (LK.ticks % 30 === 0) { self.attackEnemies(); } }; return self; }); var Eagle = Container.expand(function () { var self = Container.call(this); var eagleGraphics = self.attachAsset('eagle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4.0; self.damage = 40; self.health = 80; self.maxHealth = 80; self.swoopTimer = 0; self.isSwooping = false; self.flightPattern = 0; self.takeDamage = function (damage) { self.health -= damage; tween(eagleGraphics, { tint: 0xff0000 }, { duration: 100 }); tween(eagleGraphics, { tint: 0xffffff }, { duration: 100 }); if (self.health <= 0) { return true; } return false; }; self.update = function () { var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.swoopTimer++; self.flightPattern++; if (self.swoopTimer > 80 && !self.isSwooping) { self.isSwooping = true; self.swoopTimer = 0; tween(self, { x: hero.x, y: hero.y }, { duration: 600, onFinish: function onFinish() { self.isSwooping = false; } }); } else if (!self.isSwooping) { var circleX = hero.x + Math.cos(self.flightPattern * 0.05) * 150; var circleY = hero.y + Math.sin(self.flightPattern * 0.05) * 150; self.x += (circleX - self.x) * 0.02; self.y += (circleY - self.y) * 0.02; } } }; return self; }); var Elephant = Container.expand(function () { var self = Container.call(this); var elephantGraphics = self.attachAsset('elephant', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1.5; self.damage = 80; self.health = 250; self.maxHealth = 250; self.trampleTimer = 0; self.isTrampling = false; self.takeDamage = function (damage) { self.health -= damage; tween(elephantGraphics, { tint: 0xff0000 }, { duration: 100 }); tween(elephantGraphics, { tint: 0xffffff }, { duration: 100 }); if (self.health <= 0) { return true; } return false; }; self.update = function () { var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.trampleTimer++; if (self.trampleTimer > 120 && !self.isTrampling) { self.isTrampling = true; self.trampleTimer = 0; LK.effects.flashScreen(0x8B4513, 200); tween(self, { x: self.x + dx / distance * self.speed * 8, y: self.y + dy / distance * self.speed * 8 }, { duration: 1000, onFinish: function onFinish() { self.isTrampling = false; } }); } else if (!self.isTrampling) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); var Enemy = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'sheep'; self.speed = 1; self.damage = 10; self.health = 30; self.maxHealth = 30; var enemyGraphics; if (self.type === 'sheep') { enemyGraphics = self.attachAsset('sheep', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1.5; self.damage = 12; self.health = 30; self.maxHealth = 30; } else if (self.type === 'cow') { enemyGraphics = self.attachAsset('cow', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1.2; self.damage = 35; self.health = 100; self.maxHealth = 100; } else if (self.type === 'chicken') { enemyGraphics = self.attachAsset('chicken', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4.2; self.damage = 12; self.health = 35; self.maxHealth = 35; } else if (self.type === 'chick') { enemyGraphics = self.attachAsset('chick', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; self.damage = 8; self.health = 20; self.maxHealth = 20; } else if (self.type === 'snake') { enemyGraphics = self.attachAsset('snake', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2.2; self.damage = 28; self.health = 50; self.maxHealth = 50; self.zigzagTimer = 0; self.zigzagDirection = 1; } else if (self.type === 'mouse') { enemyGraphics = self.attachAsset('mouse', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.damage = 10; self.health = 25; self.maxHealth = 25; self.jumpTimer = 0; self.isJumping = false; } else if (self.type === 'hyperSheep') { enemyGraphics = self.attachAsset('hyperSheep', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3.5; self.damage = 18; self.health = 60; self.maxHealth = 60; self.chargeTimer = 0; self.isCharging = false; } else if (self.type === 'hyperCow') { enemyGraphics = self.attachAsset('hyperCow', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2.5; self.damage = 25; self.health = 70; self.maxHealth = 70; self.rageMode = false; self.rageDuration = 0; } else if (self.type === 'hyperChicken') { enemyGraphics = self.attachAsset('hyperChicken', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); self.speed = 2.5; self.damage = 15; self.health = 120; self.maxHealth = 120; self.flightTimer = 0; self.isFlying = false; self.isBoss = true; } else if (self.type === 'pig') { enemyGraphics = self.attachAsset('pig', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1.5; self.damage = 22; self.health = 70; self.maxHealth = 70; self.rollTimer = 0; self.isRolling = false; } else if (self.type === 'goat') { enemyGraphics = self.attachAsset('goat', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2.8; self.damage = 32; self.health = 85; self.maxHealth = 85; self.headbuttTimer = 0; } else if (self.type === 'duck') { enemyGraphics = self.attachAsset('duck', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3.2; self.damage = 18; self.health = 40; self.maxHealth = 40; self.quackTimer = 0; } else if (self.type === 'rabbit') { enemyGraphics = self.attachAsset('rabbit', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4.5; self.damage = 15; self.health = 30; self.maxHealth = 30; self.hopTimer = 0; } else if (self.type === 'omegaSheep') { enemyGraphics = self.attachAsset('omegaSheep', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); self.speed = 3.5; self.damage = 15; self.health = 50; self.maxHealth = 50; self.omegaTimer = 0; self.isOmega = true; } else if (self.type === 'omegaCow') { enemyGraphics = self.attachAsset('omegaCow', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); self.speed = 3.2; self.damage = 20; self.health = 60; self.maxHealth = 60; self.omegaTimer = 0; self.isOmega = true; } else if (self.type === 'omegaChicken') { enemyGraphics = self.attachAsset('omegaChicken', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); self.speed = 4.0; self.damage = 15; self.health = 45; self.maxHealth = 45; self.omegaTimer = 0; self.isOmega = true; } else if (self.type === 'omegaPig') { enemyGraphics = self.attachAsset('omegaPig', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); self.speed = 3.5; self.damage = 18; self.health = 55; self.maxHealth = 55; self.omegaTimer = 0; self.isOmega = true; } else if (self.type === 'windBoss') { enemyGraphics = self.attachAsset('windBoss', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.8, scaleY: 1.8 }); self.speed = 3.0; self.damage = 25; self.health = 80; self.maxHealth = 80; self.windTimer = 0; self.isBoss = true; self.windPushTimer = 0; } else if (self.type === 'magmaBoss') { enemyGraphics = self.attachAsset('magmaBoss', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.9, scaleY: 1.9 }); self.speed = 2.5; self.damage = 30; self.health = 90; self.maxHealth = 90; self.magmaTimer = 0; self.isBoss = true; self.lavaSprayTimer = 0; } self.takeDamage = function (damage) { self.health -= damage; // Mark as wounded to start blood trail self.isWounded = true; self.lastTrailX = self.x; self.lastTrailY = self.y; self.trailTimer = 0; // Create blood splatter effect createBloodSplatter(self.x, self.y, Math.min(damage / 6, 15)); // Add extra blood spray for critical hits if (damage >= 40) { createBloodSplatter(self.x, self.y, 20); LK.effects.flashObject(self, 0xff0000, 200); } // Create initial blood trail createBloodTrail(self.x, self.y); // Flash red when hit tween(enemyGraphics, { tint: 0xff0000 }, { duration: 100 }); tween(enemyGraphics, { tint: 0xffffff }, { duration: 100 }); if (self.health <= 0) { // Create bigger blood splatter when dying createBloodSplatter(self.x, self.y, 12); return true; // Enemy died } return false; }; self.update = function () { // Move towards hero var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); // Create blood trail if wounded and moving if (self.isWounded) { self.trailTimer = self.trailTimer || 0; self.trailTimer++; if (self.trailTimer > 3) { // Create trail every 3 frames for more blood var moveDistance = Math.sqrt((self.x - (self.lastTrailX || self.x)) * (self.x - (self.lastTrailX || self.x)) + (self.y - (self.lastTrailY || self.y)) * (self.y - (self.lastTrailY || self.y))); if (moveDistance > 8) { // Create multiple trails for heavier bleeding createBloodTrail(self.x, self.y); if (self.health <= self.maxHealth * 0.3) { // Heavy bleeding when severely wounded createBloodTrail(self.x + (Math.random() - 0.5) * 15, self.y + (Math.random() - 0.5) * 15); createBloodTrail(self.x + (Math.random() - 0.5) * 15, self.y + (Math.random() - 0.5) * 15); } self.lastTrailX = self.x; self.lastTrailY = self.y; self.trailTimer = 0; } } } if (distance > 0) { if (self.type === 'snake') { // Snake moves in zigzag pattern self.zigzagTimer++; if (self.zigzagTimer > 20) { self.zigzagDirection *= -1; self.zigzagTimer = 0; } var zigzagOffset = self.zigzagDirection * 30; self.x += dx / distance * self.speed + zigzagOffset * 0.02; self.y += dy / distance * self.speed; } else if (self.type === 'mouse') { // Mouse jumps towards hero self.jumpTimer++; if (self.jumpTimer > 40 && !self.isJumping) { self.isJumping = true; self.jumpTimer = 0; // Quick jump movement tween(self, { x: self.x + dx / distance * self.speed * 8, y: self.y + dy / distance * self.speed * 8 }, { duration: 300, onComplete: function onComplete() { self.isJumping = false; } }); } else if (!self.isJumping) { // Slow movement when not jumping self.x += dx / distance * (self.speed * 0.3); self.y += dy / distance * (self.speed * 0.3); } } else if (self.type === 'hyperSheep') { // HyperSheep charges at hero periodically self.chargeTimer++; if (self.chargeTimer > 60 && !self.isCharging) { self.isCharging = true; self.chargeTimer = 0; // Charge attack with visual effect tween(enemyGraphics, { tint: 0xff0000 }, { duration: 200 }); tween(self, { x: self.x + dx / distance * self.speed * 12, y: self.y + dy / distance * self.speed * 12 }, { duration: 500, onFinish: function onFinish() { self.isCharging = false; tween(enemyGraphics, { tint: 0xffffff }, { duration: 200 }); } }); } else if (!self.isCharging) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } else if (self.type === 'hyperCow') { // HyperCow enters rage mode when low health if (self.health <= self.maxHealth * 0.3 && !self.rageMode) { self.rageMode = true; self.rageDuration = 5000; self.speed *= 2; self.damage *= 1.5; tween(enemyGraphics, { tint: 0xff4400 }, { duration: 300 }); } if (self.rageMode) { self.rageDuration -= 16.67; if (self.rageDuration <= 0) { self.rageMode = false; self.speed /= 2; self.damage /= 1.5; tween(enemyGraphics, { tint: 0xffffff }, { duration: 300 }); } } self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } else if (self.type === 'hyperChicken') { // HyperChicken flies in aerial patterns self.flightTimer++; if (self.flightTimer > 120 && !self.isFlying) { self.isFlying = true; self.flightTimer = 0; // Aerial dive attack tween(self, { x: hero.x, y: hero.y - 100 }, { duration: 800, onFinish: function onFinish() { tween(self, { x: hero.x, y: hero.y }, { duration: 400, onFinish: function onFinish() { self.isFlying = false; } }); } }); } else if (!self.isFlying) { // Circle around hero var angle = Math.atan2(dy, dx) + Math.sin(LK.ticks * 0.05) * 0.5; self.x += Math.cos(angle) * self.speed; self.y += Math.sin(angle) * self.speed; } } else if (self.type === 'pig') { // Pig rolls towards hero self.rollTimer++; if (self.rollTimer > 80 && !self.isRolling) { self.isRolling = true; self.rollTimer = 0; tween(self, { x: self.x + dx / distance * self.speed * 6, y: self.y + dy / distance * self.speed * 6 }, { duration: 600, onFinish: function onFinish() { self.isRolling = false; } }); } else if (!self.isRolling) { self.x += dx / distance * self.speed * 0.5; self.y += dy / distance * self.speed * 0.5; } } else if (self.type === 'goat') { // Goat charges with headbutt self.headbuttTimer++; if (self.headbuttTimer > 70) { self.headbuttTimer = 0; var angle = Math.atan2(dy, dx); self.x += Math.cos(angle) * self.speed * 2; self.y += Math.sin(angle) * self.speed * 2; } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } else if (self.type === 'duck') { // Duck waddles in wavy pattern self.quackTimer++; var waveOffset = Math.sin(self.quackTimer * 0.1) * 20; self.x += dx / distance * self.speed + waveOffset * 0.02; self.y += dy / distance * self.speed; } else if (self.type === 'rabbit') { // Rabbit hops quickly self.hopTimer++; if (self.hopTimer > 25) { self.hopTimer = 0; self.x += dx / distance * self.speed * 2; self.y += dy / distance * self.speed * 2; } else { self.x += dx / distance * self.speed * 0.3; self.y += dy / distance * self.speed * 0.3; } } else if (self.type === 'windBoss') { // Wind boss creates wind gusts and pushes hero self.windTimer++; self.windPushTimer++; if (self.windTimer > 200) { self.windTimer = 0; // Create wind gust effect LK.effects.flashScreen(0x87ceeb, 300); // Teleport in swirling pattern var angle = LK.ticks * 0.1; self.x = hero.x + Math.cos(angle) * 200; self.y = hero.y + Math.sin(angle) * 200; } // Push hero away periodically if (self.windPushTimer > 120 && distance < 300) { self.windPushTimer = 0; var pushForce = 30; hero.x += dx / distance * -pushForce; // Push away from boss hero.y += dy / distance * -pushForce; // Keep hero in bounds hero.x = Math.max(40, Math.min(2048 - 40, hero.x)); hero.y = Math.max(40, Math.min(2732 - 40, hero.y)); LK.getSound('windevent').play(); } self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } else if (self.type === 'magmaBoss') { // Magma boss creates lava sprays and fire effects self.magmaTimer++; self.lavaSprayTimer++; if (self.magmaTimer > 240) { self.magmaTimer = 0; // Create magma eruption effect - reduced intensity LK.effects.flashScreen(0xff4500, 200); // Create blood splatters to simulate lava spray - reduced intensity createBloodSplatter(self.x, self.y, 12); tween(enemyGraphics, { tint: 0xffff00 }, { duration: 200, onFinish: function onFinish() { tween(enemyGraphics, { tint: 0xffffff }, { duration: 200 }); } }); } // Create lava spray damage zones - much more reduced frequency and damage if (self.lavaSprayTimer > 720) { self.lavaSprayTimer = 0; var sprayRadius = 100; var heroDx = hero.x - self.x; var heroDy = hero.y - self.y; var heroDistance = Math.sqrt(heroDx * heroDx + heroDy * heroDy); if (heroDistance <= sprayRadius) { hero.takeDamage(5); LK.effects.flashObject(hero, 0xff4500, 100); } } self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } else if (self.type.indexOf('omega') === 0) { // Omega animals have enhanced movement self.omegaTimer++; if (self.omegaTimer > 60) { self.omegaTimer = 0; // Omega boost tween(enemyGraphics, { tint: 0xff00ff }, { duration: 200, onFinish: function onFinish() { tween(enemyGraphics, { tint: 0xffffff }, { duration: 200 }); } }); self.x += dx / distance * self.speed * 3; self.y += dy / distance * self.speed * 3; } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } else { // Normal movement for other enemies self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); var Erdo = Container.expand(function () { var self = Container.call(this); var erdoGraphics = self.attachAsset('erdo', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.lastShot = 0; self.shootCooldown = 80; // Very fast shooting self.isActive = false; self.activationTimer = 0; self.maxActivationTime = 15000; // 15 seconds active self.isMovingToCenter = false; self.targetX = 0; self.targetY = 0; self.shootDirections = [{ x: 1, y: 0 }, { x: -1, y: 0 }, { x: 0, y: 1 }, { x: 0, y: -1 }, { x: 0.707, y: 0.707 }, { x: -0.707, y: 0.707 }, { x: 0.707, y: -0.707 }, { x: -0.707, y: -0.707 }]; self.activate = function () { self.isActive = true; self.activationTimer = 0; self.visible = true; self.alpha = 0; self.isMovingToCenter = true; // Spawn from random edge var side = Math.floor(Math.random() * 4); if (side === 0) { // Top self.x = Math.random() * 2048; self.y = -50; } else if (side === 1) { // Right self.x = 2048 + 50; self.y = Math.random() * 2732; } else if (side === 2) { // Bottom self.x = Math.random() * 2048; self.y = 2732 + 50; } else { // Left self.x = -50; self.y = Math.random() * 2732; } // Set target to center self.targetX = 2048 / 2; self.targetY = 2732 / 2; // Fade in effect tween(self, { alpha: 1 }, { duration: 300 }); LK.getSound('powerUp').play(); }; self.deactivate = function () { self.isActive = false; self.isMovingToCenter = false; // Grant hero enhanced abilities for 15 seconds after Erdo leaves hero.hasShield = true; hero.shieldDuration = 15000; // 15 seconds shield hero.explosiveShotMode = true; hero.explosiveShotDuration = 15000; // 15 seconds explosive shots hero.rapidShootCooldown = 200; // 0.2 seconds between shots hero.shootCooldown = hero.rapidShootCooldown; // Visual effect for enhanced mode tween(hero, { tint: 0xffaa00 }, { duration: 500 }); // Fade out effect tween(self, { alpha: 0 }, { duration: 300, onFinish: function onFinish() { self.visible = false; } }); }; self.shootInAllDirections = function () { // Only shoot if there are enemies to target if (enemies.length === 0) return; for (var i = 0; i < enemies.length && i < self.shootDirections.length; i++) { var enemy = enemies[i]; var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullet.setTarget(enemy.x, enemy.y); bullet.speed = 15; // Very fast bullets bullets.push(bullet); game.addChild(bullet); } LK.getSound('shoot').play(); }; self.update = function () { if (!self.isActive) return; self.activationTimer += 16.67; // Move to center first if (self.isMovingToCenter) { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 20) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } else { self.isMovingToCenter = false; } } // Shoot rapidly in all directions when in center if (!self.isMovingToCenter && LK.ticks - self.lastShot > self.shootCooldown / 16.67) { self.shootInAllDirections(); self.lastShot = LK.ticks; } // Deactivate after time limit if (self.activationTimer >= self.maxActivationTime) { self.deactivate(); } }; self.visible = false; return self; }); var EvilErdo = Container.expand(function () { var self = Container.call(this); var evilErdoGraphics = self.attachAsset('erdo', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 2.5 }); evilErdoGraphics.tint = 0xff0000; // Red tint for evil self.health = 500; self.maxHealth = 500; self.speed = 3; self.damage = 40; self.lastShot = 0; self.shootCooldown = 120; // 2 seconds between shots self.isBoss = true; self.phase = 1; // Boss has 3 phases self.phaseTimer = 0; self.isActive = false; self.teleportTimer = 0; self.darkEnergyTimer = 0; self.shootDirections = [{ x: 1, y: 0 }, { x: -1, y: 0 }, { x: 0, y: 1 }, { x: 0, y: -1 }, { x: 0.707, y: 0.707 }, { x: -0.707, y: 0.707 }, { x: 0.707, y: -0.707 }, { x: -0.707, y: -0.707 }]; self.activate = function () { self.isActive = true; self.visible = true; self.alpha = 0; self.health = self.maxHealth; self.phase = 1; self.phaseTimer = 0; // Spawn at center of screen self.x = 2048 / 2; self.y = 2732 / 2; // Dark entrance effect LK.effects.flashScreen(0x800080, 1000); tween(self, { alpha: 1 }, { duration: 500 }); // Stop all enemy spawning evilErdoBattleActive = true; // Clear all existing enemies for (var i = enemies.length - 1; i >= 0; i--) { enemies[i].destroy(); enemies.splice(i, 1); } LK.getSound('powerUp').play(); }; self.takeDamage = function (damage) { self.health -= damage; // Create dark energy effect when hit createBloodSplatter(self.x, self.y, Math.min(damage / 6, 20)); // Flash red when hit tween(evilErdoGraphics, { tint: 0xffffff }, { duration: 100 }); tween(evilErdoGraphics, { tint: 0xff0000 }, { duration: 100 }); // Check for phase transitions if (self.health <= self.maxHealth * 0.66 && self.phase === 1) { self.phase = 2; self.phaseTimer = 0; self.shootCooldown = 80; // Faster shooting LK.effects.flashScreen(0x4B0082, 500); } else if (self.health <= self.maxHealth * 0.33 && self.phase === 2) { self.phase = 3; self.phaseTimer = 0; self.shootCooldown = 60; // Even faster shooting self.speed = 4; LK.effects.flashScreen(0x000000, 800); } if (self.health <= 0) { // Create massive explosion when defeated createBloodSplatter(self.x, self.y, 30); LK.effects.flashScreen(0xFFD700, 1000); // End evil erdo battle evilErdoBattleActive = false; return true; } return false; }; self.shootAtHero = function () { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullet.setTarget(hero.x, hero.y); bullet.damage = self.damage; bullet.speed = 8; // Make bullet red for evil erdo if (bullet.attachAsset) { var bulletGraphics = bullet.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); bulletGraphics.tint = 0xff0000; } bullets.push(bullet); game.addChild(bullet); }; self.shootInAllDirections = function () { for (var i = 0; i < self.shootDirections.length; i++) { var direction = self.shootDirections[i]; var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; var targetX = self.x + direction.x * 500; var targetY = self.y + direction.y * 500; bullet.setTarget(targetX, targetY); bullet.damage = self.damage; bullet.speed = 10; bullets.push(bullet); game.addChild(bullet); } }; self.darkEnergyAttack = function () { // Create dark energy explosion around evil erdo var explosionRadius = 200; var heroDx = hero.x - self.x; var heroDy = hero.y - self.y; var heroDistance = Math.sqrt(heroDx * heroDx + heroDy * heroDy); if (heroDistance <= explosionRadius) { hero.takeDamage(25); LK.effects.flashObject(hero, 0x800080, 300); } createBloodSplatter(self.x, self.y, 25); LK.effects.flashScreen(0x4B0082, 200); }; self.update = function () { if (!self.isActive) return; self.phaseTimer += 16.67; self.teleportTimer += 16.67; self.darkEnergyTimer += 16.67; // Move towards hero var dx = hero.x - self.x; var dy = hero.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; } // Phase 1: Basic shooting if (self.phase === 1) { if (LK.ticks - self.lastShot > self.shootCooldown / 16.67) { self.shootAtHero(); self.lastShot = LK.ticks; } } // Phase 2: Multi-directional shooting + teleport else if (self.phase === 2) { if (LK.ticks - self.lastShot > self.shootCooldown / 16.67) { self.shootInAllDirections(); self.lastShot = LK.ticks; } // Teleport occasionally if (self.teleportTimer > 3000) { self.teleportTimer = 0; var newX = Math.random() * (2048 - 200) + 100; var newY = Math.random() * (2732 - 200) + 100; tween(self, { x: newX, y: newY }, { duration: 300 }); LK.effects.flashScreen(0x9400D3, 200); } } // Phase 3: All attacks + dark energy else if (self.phase === 3) { if (LK.ticks - self.lastShot > self.shootCooldown / 16.67) { self.shootInAllDirections(); self.shootAtHero(); self.lastShot = LK.ticks; } // More frequent teleporting if (self.teleportTimer > 2000) { self.teleportTimer = 0; var newX = Math.random() * (2048 - 200) + 100; var newY = Math.random() * (2732 - 200) + 100; tween(self, { x: newX, y: newY }, { duration: 200 }); LK.effects.flashScreen(0x000000, 300); } // Dark energy attacks if (self.darkEnergyTimer > 1500) { self.darkEnergyTimer = 0; self.darkEnergyAttack(); } } }; self.visible = false; return self; }); var ExplosiveBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); bulletGraphics.tint = 0xff4400; // Orange tint for explosive bullets bulletGraphics.scaleX = 1.3; bulletGraphics.scaleY = 1.3; self.speed = 12; self.damage = 40; // Reduced damage self.targetX = 0; self.targetY = 0; self.directionX = 0; self.directionY = 0; self.setTarget = function (x, y) { self.targetX = x; self.targetY = y; var dx = x - self.x; var dy = y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.directionX = dx / distance; self.directionY = dy / distance; } }; self.explode = function () { // Create explosion visual effect LK.effects.flashObject(self, 0xff4400, 300); createBloodSplatter(self.x, self.y, 15); // Damage enemies in explosion radius var explosionRadius = 60; for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= explosionRadius) { var enemyDied = enemy.takeDamage(self.damage * 0.7); if (enemyDied) { LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } } } }; self.update = function () { self.x += self.directionX * self.speed; self.y += self.directionY * self.speed; }; return self; }); var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); self.maxHealth = 100; self.health = self.maxHealth; self.speed = 2.5; self.normalSpeed = 3; self.boostedSpeed = 6; self.hasShield = false; self.shieldDuration = 0; self.rapidFire = false; self.rapidFireDuration = 0; self.lastShot = 0; self.shootCooldown = 500; // milliseconds self.normalShootCooldown = 500; self.rapidShootCooldown = 150; self.hyperchargeMode = false; self.hyperhargeDuration = 0; self.invisibilityMode = false; self.invisibilityDuration = 0; self.multiShotMode = false; self.multiShotDuration = 0; self.timeSlowMode = false; self.timeSlowDuration = 0; self.timeStopMode = false; self.timeStopDuration = 0; self.timeRewindMode = false; self.timeRewindDuration = 0; self.explosiveShotMode = false; self.explosiveShotDuration = 0; self.lifeStealMode = false; self.lifeStealDuration = 0; self.berserkerMode = false; self.berserkerDuration = 0; self.magnetMode = false; self.magnetDuration = 0; self.reflectMode = false; self.reflectDuration = 0; self.phoenixMode = false; self.phoenixDuration = 0; self.vampireMode = false; self.vampireDuration = 0; self.godMode = false; self.godModeDuration = 0; self.shadowStrikeMode = false; self.shadowStrikeDuration = 0; self.necromancyMode = false; self.necromancyDuration = 0; self.auraMode = false; self.auraDuration = 0; self.chainLightningMode = false; self.chainLightningDuration = 0; self.summonMode = false; self.summonDuration = 0; self.meteorMode = false; self.meteorDuration = 0; self.berserkAuraMode = false; self.berserkAuraDuration = 0; self.dimensionRiftMode = false; self.dimensionRiftDuration = 0; self.divineBlastMode = false; self.divineBlastDuration = 0; self.apocalypseMode = false; self.apocalypseDuration = 0; self.titanShieldMode = false; self.titanShieldDuration = 0; self.berserkRageMode = false; self.berserkRageDuration = 0; self.lightningStormMode = false; self.lightningStormDuration = 0; self.bloodRainMode = false; self.bloodRainDuration = 0; self.voidWalkerMode = false; self.voidWalkerDuration = 0; self.cosmicRageMode = false; self.cosmicRageDuration = 0; self.soulHarvestMode = false; self.soulHarvestDuration = 0; self.timeDistortionMode = false; self.timeDistortionDuration = 0; self.elementalFuryMode = false; self.elementalFuryDuration = 0; self.quantumLeapMode = false; self.quantumLeapDuration = 0; self.dragonBreathMode = false; self.dragonBreathDuration = 0; self.arcaneStormMode = false; self.arcaneStormDuration = 0; self.plasmaBurstMode = false; self.plasmaBurstDuration = 0; self.galaxyCollapseMode = false; self.galaxyCollapseDuration = 0; self.infinityMode = false; self.infinityDuration = 0; self.omegaDestructionMode = false; self.omegaDestructionDuration = 0; self.savedPosition = { x: 0, y: 0 }; self.savedHealth = 0; var shieldGraphics = self.attachAsset('shieldEffect', { anchorX: 0.5, anchorY: 0.5, alpha: 0.5 }); shieldGraphics.visible = false; self.takeDamage = function (damage) { if (self.hasShield) { return false; // No damage taken } self.health -= damage; // Create blood splatter effect when hero is hit createBloodSplatter(self.x, self.y, Math.min(damage / 8, 10)); // Create blood trail when hero is damaged createBloodTrail(self.x, self.y); if (self.health <= 0) { self.health = 0; // Create large blood splatter when hero dies createBloodSplatter(self.x, self.y, 15); return true; // Hero died } return false; }; self.activateShield = function () { self.hasShield = true; self.shieldDuration = 5000; // 5 seconds shieldGraphics.visible = true; LK.getSound('powerUp').play(); }; self.activateSpeedBoost = function () { self.speed = self.boostedSpeed; LK.getSound('powerUp').play(); LK.setTimeout(function () { self.speed = self.normalSpeed; }, 3000); }; self.activateRapidFire = function () { self.rapidFire = true; self.rapidFireDuration = 4000; // 4 seconds self.shootCooldown = self.rapidShootCooldown; LK.getSound('powerUp').play(); }; self.activateFreeze = function () { freezeEnemies(); LK.getSound('powerUp').play(); }; self.activateExplosion = function () { explodeNearbyEnemies(); LK.getSound('powerUp').play(); }; self.activateHealing = function () { self.health = Math.min(self.health + 30, self.maxHealth); LK.getSound('powerUp').play(); }; self.activateHypercharge = function () { self.hyperchargeMode = true; self.hyperhargeDuration = 8000; // 8 seconds self.speed = self.boostedSpeed * 1.5; self.shootCooldown = 50; // Very fast shooting heroGraphics.tint = 0xffff00; // Yellow tint LK.getSound('hypercharge').play(); }; self.activateTeleport = function () { // Teleport to random safe location var safeX = Math.random() * (2048 - 160) + 80; var safeY = Math.random() * (2732 - 160) + 80; tween(self, { x: safeX, y: safeY }, { duration: 100 }); LK.getSound('teleport').play(); }; self.activateInvisibility = function () { self.invisibilityMode = true; self.invisibilityDuration = 5000; // 5 seconds heroGraphics.alpha = 0.3; LK.getSound('powerUp').play(); }; self.activateMultiShot = function () { self.multiShotMode = true; self.multiShotDuration = 6000; // 6 seconds LK.getSound('powerUp').play(); }; self.activateTimeSlow = function () { self.timeSlowMode = true; self.timeSlowDuration = 8000; // 8 seconds timeSlowFactor = 0.3; // Slow down time LK.getSound('timeSlow').play(); }; self.activateTimeStop = function () { self.timeStopMode = true; self.timeStopDuration = 3000; // 3 seconds timeStopActive = true; LK.getSound('timeStop').play(); }; self.activateTimeRewind = function () { // Save current position and health for rewind self.savedPosition.x = self.x; self.savedPosition.y = self.y; self.savedHealth = self.health; self.timeRewindMode = true; self.timeRewindDuration = 5000; // 5 seconds LK.getSound('timeRewind').play(); }; self.activateLifeSteal = function () { self.lifeStealMode = true; self.lifeStealDuration = 10000; // 10 seconds heroGraphics.tint = 0x8B0000; // Dark red tint LK.getSound('powerUp').play(); }; self.activateBerserker = function () { self.berserkerMode = true; self.berserkerDuration = 8000; // 8 seconds self.speed = self.normalSpeed * 2; self.shootCooldown = 50; // Very fast shooting heroGraphics.tint = 0xFF4500; // Orange red tint LK.getSound('powerUp').play(); }; self.activateMagnet = function () { self.magnetMode = true; self.magnetDuration = 12000; // 12 seconds heroGraphics.tint = 0x4169E1; // Blue tint LK.getSound('powerUp').play(); }; self.activateReflect = function () { self.reflectMode = true; self.reflectDuration = 6000; // 6 seconds heroGraphics.tint = 0x9932CC; // Purple tint LK.getSound('powerUp').play(); }; self.activatePhoenix = function () { self.phoenixMode = true; self.phoenixDuration = 15000; // 15 seconds - one time revival heroGraphics.tint = 0xFF6347; // Tomato red tint LK.getSound('powerUp').play(); }; self.activateVampire = function () { self.vampireMode = true; self.vampireDuration = 10000; // 10 seconds heroGraphics.tint = 0x800080; // Purple tint LK.getSound('powerUp').play(); }; self.activateGodMode = function () { self.godMode = true; self.godModeDuration = 2000; // 2 seconds heroGraphics.tint = 0xFFD700; // Gold tint self.hasShield = true; self.speed = self.normalSpeed * 1.5; self.shootCooldown = 150; // Fast shooting but not ultra fast LK.getSound('powerUp').play(); }; self.activateShadowStrike = function () { self.shadowStrikeMode = true; self.shadowStrikeDuration = 8000; // 8 seconds heroGraphics.tint = 0x2f1b69; // Dark purple tint self.speed = self.normalSpeed * 2.5; self.shootCooldown = 100; // Fast shooting LK.getSound('powerUp').play(); }; self.activateNecromancy = function () { self.necromancyMode = true; self.necromancyDuration = 12000; // 12 seconds heroGraphics.tint = 0x1a0d1a; // Dark black tint LK.getSound('powerUp').play(); }; self.activateAura = function () { self.auraMode = true; self.auraDuration = 10000; // 10 seconds heroGraphics.tint = 0xffd43b; // Bright yellow tint self.speed = self.normalSpeed * 1.8; LK.getSound('powerUp').play(); }; self.activateChainLightning = function () { self.chainLightningMode = true; self.chainLightningDuration = 6000; // 6 seconds heroGraphics.tint = 0x4a90e2; // Electric blue tint LK.getSound('powerUp').play(); }; self.activateSummon = function () { self.summonMode = true; self.summonDuration = 15000; // 15 seconds heroGraphics.tint = 0x7ed321; // Green tint LK.getSound('powerUp').play(); }; self.activateMeteor = function () { self.meteorMode = true; self.meteorDuration = 8000; // 8 seconds heroGraphics.tint = 0xd0021b; // Red tint LK.getSound('powerUp').play(); }; self.activateBerserkAura = function () { self.berserkAuraMode = true; self.berserkAuraDuration = 10000; // 10 seconds heroGraphics.tint = 0xf5a623; // Orange tint self.speed = self.normalSpeed * 2.2; self.shootCooldown = 60; // Very fast shooting LK.getSound('powerUp').play(); }; self.activateDimensionRift = function () { self.dimensionRiftMode = true; self.dimensionRiftDuration = 7000; // 7 seconds heroGraphics.tint = 0x9013fe; // Purple tint LK.getSound('powerUp').play(); }; self.activateDivineBlast = function () { self.divineBlastMode = true; self.divineBlastDuration = 5000; // 5 seconds heroGraphics.tint = 0xffffff; // White tint self.shootCooldown = 50; // Fast shooting LK.getSound('powerUp').play(); }; self.activateApocalypse = function () { self.apocalypseMode = true; self.apocalypseDuration = 6000; // 6 seconds heroGraphics.tint = 0x000000; // Black tint self.speed = self.normalSpeed * 1.5; self.shootCooldown = 40; // Very fast shooting LK.getSound('powerUp').play(); }; self.activateTitanShield = function () { self.titanShieldMode = true; self.titanShieldDuration = 12000; // 12 seconds self.hasShield = true; self.damage *= 2; // Double damage while shielded heroGraphics.tint = 0x4169e1; // Blue steel tint LK.getSound('powerUp').play(); }; self.activateBerserkRage = function () { self.berserkRageMode = true; self.berserkRageDuration = 8000; // 8 seconds self.speed = self.normalSpeed * 3; self.shootCooldown = 30; // Ultra fast shooting self.damage *= 3; // Triple damage heroGraphics.tint = 0x8b0000; // Dark red tint LK.getSound('powerUp').play(); }; self.activateLightningStorm = function () { self.lightningStormMode = true; self.lightningStormDuration = 10000; // 10 seconds heroGraphics.tint = 0xffff00; // Yellow tint LK.getSound('powerUp').play(); }; self.activateBloodRain = function () { self.bloodRainMode = true; self.bloodRainDuration = 15000; // 15 seconds heroGraphics.tint = 0x8b0000; // Blood red tint LK.getSound('powerUp').play(); }; self.activateVoidWalker = function () { self.voidWalkerMode = true; self.voidWalkerDuration = 20000; // 20 seconds heroGraphics.tint = 0x1a0033; // Deep void purple self.hasShield = true; self.speed = self.normalSpeed * 4; self.shootCooldown = 20; // Ultra fast shooting LK.getSound('powerUp').play(); }; self.activateCosmicRage = function () { self.cosmicRageMode = true; self.cosmicRageDuration = 18000; // 18 seconds heroGraphics.tint = 0xff0099; // Cosmic pink self.damage *= 5; // Quintuple damage self.speed = self.normalSpeed * 3.5; LK.getSound('powerUp').play(); }; self.activateSoulHarvest = function () { self.soulHarvestMode = true; self.soulHarvestDuration = 25000; // 25 seconds heroGraphics.tint = 0x660066; // Soul purple LK.getSound('powerUp').play(); }; self.activateTimeDistortion = function () { self.timeDistortionMode = true; self.timeDistortionDuration = 15000; // 15 seconds heroGraphics.tint = 0x00ccff; // Time blue timeSlowFactor = 0.1; // Extremely slow time LK.getSound('powerUp').play(); }; self.activateElementalFury = function () { self.elementalFuryMode = true; self.elementalFuryDuration = 22000; // 22 seconds heroGraphics.tint = 0xff6600; // Elemental orange self.shootCooldown = 15; // Super fast shooting LK.getSound('powerUp').play(); }; self.activateQuantumLeap = function () { self.quantumLeapMode = true; self.quantumLeapDuration = 20000; // 20 seconds heroGraphics.tint = 0x00ff99; // Quantum green self.speed = self.normalSpeed * 6; LK.getSound('powerUp').play(); }; self.activateDragonBreath = function () { self.dragonBreathMode = true; self.dragonBreathDuration = 16000; // 16 seconds heroGraphics.tint = 0xff3300; // Dragon red LK.getSound('powerUp').play(); }; self.activateArcaneStorm = function () { self.arcaneStormMode = true; self.arcaneStormDuration = 24000; // 24 seconds heroGraphics.tint = 0x9933ff; // Arcane purple LK.getSound('powerUp').play(); }; self.activatePlasmaBurst = function () { self.plasmaBurstMode = true; self.plasmaBurstDuration = 14000; // 14 seconds heroGraphics.tint = 0x00ffff; // Plasma cyan self.shootCooldown = 10; // Extremely fast shooting LK.getSound('powerUp').play(); }; self.activateGalaxyCollapse = function () { self.galaxyCollapseMode = true; self.galaxyCollapseDuration = 12000; // 12 seconds heroGraphics.tint = 0x000066; // Galaxy dark blue LK.getSound('powerUp').play(); }; self.activateInfinity = function () { self.infinityMode = true; self.infinityDuration = 10000; // 10 seconds heroGraphics.tint = 0xffffff; // Infinity white self.hasShield = true; self.speed = self.normalSpeed * 3; self.shootCooldown = 100; // Fast shooting self.damage *= 2; // 2x damage LK.getSound('powerUp').play(); }; self.activateOmegaDestruction = function () { self.omegaDestructionMode = true; self.omegaDestructionDuration = 8000; // 8 seconds heroGraphics.tint = 0xff0000; // Omega red LK.getSound('powerUp').play(); }; self.update = function () { if (self.shieldDuration > 0) { self.shieldDuration -= 16.67; // Approximately 60fps if (self.shieldDuration <= 0) { self.hasShield = false; shieldGraphics.visible = false; } } if (self.rapidFireDuration > 0) { self.rapidFireDuration -= 16.67; if (self.rapidFireDuration <= 0) { self.rapidFire = false; self.shootCooldown = self.normalShootCooldown; } } if (self.hyperhargeDuration > 0) { self.hyperhargeDuration -= 16.67; if (self.hyperhargeDuration <= 0) { self.hyperchargeMode = false; self.speed = self.normalSpeed; self.shootCooldown = self.normalShootCooldown; heroGraphics.tint = 0xffffff; } } if (self.invisibilityDuration > 0) { self.invisibilityDuration -= 16.67; if (self.invisibilityDuration <= 0) { self.invisibilityMode = false; heroGraphics.alpha = 1.0; } } if (self.multiShotDuration > 0) { self.multiShotDuration -= 16.67; if (self.multiShotDuration <= 0) { self.multiShotMode = false; } } if (self.timeSlowDuration > 0) { self.timeSlowDuration -= 16.67; if (self.timeSlowDuration <= 0) { self.timeSlowMode = false; timeSlowFactor = 1.0; // Reset time speed } } if (self.timeStopDuration > 0) { self.timeStopDuration -= 16.67; if (self.timeStopDuration <= 0) { self.timeStopMode = false; timeStopActive = false; } } if (self.timeRewindDuration > 0) { self.timeRewindDuration -= 16.67; if (self.timeRewindDuration <= 0) { self.timeRewindMode = false; // Execute rewind effect self.x = self.savedPosition.x; self.y = self.savedPosition.y; self.health = self.savedHealth; tween(self, { alpha: 0.5 }, { duration: 300, onFinish: function onFinish() { tween(self, { alpha: 1.0 }, { duration: 300 }); } }); } } if (self.explosiveShotDuration > 0) { self.explosiveShotDuration -= 16.67; if (self.explosiveShotDuration <= 0) { self.explosiveShotMode = false; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.lifeStealDuration > 0) { self.lifeStealDuration -= 16.67; if (self.lifeStealDuration <= 0) { self.lifeStealMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.berserkerDuration > 0) { self.berserkerDuration -= 16.67; if (self.berserkerDuration <= 0) { self.berserkerMode = false; self.speed = self.normalSpeed; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.magnetDuration > 0) { self.magnetDuration -= 16.67; if (self.magnetDuration <= 0) { self.magnetMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.reflectDuration > 0) { self.reflectDuration -= 16.67; if (self.reflectDuration <= 0) { self.reflectMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.phoenixDuration > 0) { self.phoenixDuration -= 16.67; if (self.phoenixDuration <= 0) { self.phoenixMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.vampireDuration > 0) { self.vampireDuration -= 16.67; if (self.vampireDuration <= 0) { self.vampireMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.godModeDuration > 0) { self.godModeDuration -= 16.67; if (self.godModeDuration <= 0) { self.godMode = false; self.hasShield = false; self.speed = self.normalSpeed; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.shadowStrikeDuration > 0) { self.shadowStrikeDuration -= 16.67; if (self.shadowStrikeDuration <= 0) { self.shadowStrikeMode = false; self.speed = self.normalSpeed; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.necromancyDuration > 0) { self.necromancyDuration -= 16.67; if (self.necromancyDuration <= 0) { self.necromancyMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.auraDuration > 0) { self.auraDuration -= 16.67; if (self.auraDuration <= 0) { self.auraMode = false; self.speed = self.normalSpeed; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.chainLightningDuration > 0) { self.chainLightningDuration -= 16.67; if (self.chainLightningDuration <= 0) { self.chainLightningMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.summonDuration > 0) { self.summonDuration -= 16.67; if (self.summonDuration <= 0) { self.summonMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.meteorDuration > 0) { self.meteorDuration -= 16.67; if (self.meteorDuration <= 0) { self.meteorMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.berserkAuraDuration > 0) { self.berserkAuraDuration -= 16.67; if (self.berserkAuraDuration <= 0) { self.berserkAuraMode = false; self.speed = self.normalSpeed; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.dimensionRiftDuration > 0) { self.dimensionRiftDuration -= 16.67; if (self.dimensionRiftDuration <= 0) { self.dimensionRiftMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.divineBlastDuration > 0) { self.divineBlastDuration -= 16.67; if (self.divineBlastDuration <= 0) { self.divineBlastMode = false; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.apocalypseDuration > 0) { self.apocalypseDuration -= 16.67; if (self.apocalypseDuration <= 0) { self.apocalypseMode = false; self.speed = self.normalSpeed; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.titanShieldDuration > 0) { self.titanShieldDuration -= 16.67; if (self.titanShieldDuration <= 0) { self.titanShieldMode = false; self.hasShield = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.berserkRageDuration > 0) { self.berserkRageDuration -= 16.67; if (self.berserkRageDuration <= 0) { self.berserkRageMode = false; self.speed = self.normalSpeed; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.lightningStormDuration > 0) { self.lightningStormDuration -= 16.67; if (self.lightningStormDuration <= 0) { self.lightningStormMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.bloodRainDuration > 0) { self.bloodRainDuration -= 16.67; if (self.bloodRainDuration <= 0) { self.bloodRainMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.voidWalkerDuration > 0) { self.voidWalkerDuration -= 16.67; if (self.voidWalkerDuration <= 0) { self.voidWalkerMode = false; self.hasShield = false; self.speed = self.normalSpeed; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.cosmicRageDuration > 0) { self.cosmicRageDuration -= 16.67; if (self.cosmicRageDuration <= 0) { self.cosmicRageMode = false; self.speed = self.normalSpeed; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.soulHarvestDuration > 0) { self.soulHarvestDuration -= 16.67; if (self.soulHarvestDuration <= 0) { self.soulHarvestMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.timeDistortionDuration > 0) { self.timeDistortionDuration -= 16.67; if (self.timeDistortionDuration <= 0) { self.timeDistortionMode = false; timeSlowFactor = 1.0; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.elementalFuryDuration > 0) { self.elementalFuryDuration -= 16.67; if (self.elementalFuryDuration <= 0) { self.elementalFuryMode = false; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.quantumLeapDuration > 0) { self.quantumLeapDuration -= 16.67; if (self.quantumLeapDuration <= 0) { self.quantumLeapMode = false; self.speed = self.normalSpeed; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.dragonBreathDuration > 0) { self.dragonBreathDuration -= 16.67; if (self.dragonBreathDuration <= 0) { self.dragonBreathMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.arcaneStormDuration > 0) { self.arcaneStormDuration -= 16.67; if (self.arcaneStormDuration <= 0) { self.arcaneStormMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.plasmaBurstDuration > 0) { self.plasmaBurstDuration -= 16.67; if (self.plasmaBurstDuration <= 0) { self.plasmaBurstMode = false; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.galaxyCollapseDuration > 0) { self.galaxyCollapseDuration -= 16.67; if (self.galaxyCollapseDuration <= 0) { self.galaxyCollapseMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.infinityDuration > 0) { self.infinityDuration -= 16.67; if (self.infinityDuration <= 0) { self.infinityMode = false; self.hasShield = false; self.speed = self.normalSpeed; self.shootCooldown = self.normalShootCooldown; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } if (self.omegaDestructionDuration > 0) { self.omegaDestructionDuration -= 16.67; if (self.omegaDestructionDuration <= 0) { self.omegaDestructionMode = false; tween(heroGraphics, { tint: 0xffffff }, { duration: 500 }); } } }; return self; }); var HeroBase = Container.expand(function () { var self = Container.call(this); var baseGraphics = self.attachAsset('heroBase', { anchorX: 0.5, anchorY: 0.5 }); self.turrets = []; self.initializeTurrets = function () { // Create 4 turrets around the base var turretPositions = [{ x: -60, y: -60 }, { x: 60, y: -60 }, { x: -60, y: 60 }, { x: 60, y: 60 }]; for (var i = 0; i < turretPositions.length; i++) { var turret = new BaseTurret(); turret.x = self.x + turretPositions[i].x; turret.y = self.y + turretPositions[i].y; self.turrets.push(turret); game.addChild(turret); } }; self.isHeroInSafeZone = function (heroX, heroY) { var dx = heroX - self.x; var dy = heroY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); return distance <= 120; }; self.update = function () { // Update turret positions relative to base for (var i = 0; i < self.turrets.length; i++) { var turret = self.turrets[i]; turret.update(); } }; return self; }); var Lion = Container.expand(function () { var self = Container.call(this); var lionGraphics = self.attachAsset('lion', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2.0; self.damage = 45; self.health = 120; self.maxHealth = 120; self.roarTimer = 0; self.takeDamage = function (damage) { self.health -= damage; tween(lionGraphics, { tint: 0xff0000 }, { duration: 100 }); tween(lionGraphics, { tint: 0xffffff }, { duration: 100 }); if (self.health <= 0) { return true; } return false; }; self.update = function () { var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.roarTimer++; if (self.roarTimer > 90) { self.roarTimer = 0; // Roar effect - speeds up briefly self.x += dx / distance * self.speed * 3; self.y += dy / distance * self.speed * 3; } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); var MiracleMenu = Container.expand(function () { var self = Container.call(this); var menuBg = LK.getAsset('baseMenu', { anchorX: 0.5, anchorY: 0.5, tint: 0x2c2c2c, width: 2048, height: 2732 }); self.isVisible = false; self.visible = false; self.buttons = []; self.buttonTexts = []; self.miracleIcons = []; self.createMiracleButtons = function () { // Clear existing buttons for (var i = 0; i < self.buttons.length; i++) { if (self.buttons[i]) self.buttons[i].destroy(); } for (var i = 0; i < self.buttonTexts.length; i++) { if (self.buttonTexts[i]) self.buttonTexts[i].destroy(); } for (var i = 0; i < self.miracleIcons.length; i++) { if (self.miracleIcons[i]) self.miracleIcons[i].destroy(); } self.buttons = []; self.buttonTexts = []; self.miracleIcons = []; // Add title var titleText = new Text2('STORED MIRACLES - CLICK TO USE', { size: 70, fill: 0xFFD700 }); titleText.anchor.set(0.5, 0.5); titleText.x = 0; titleText.y = -300; self.addChild(titleText); // Add miracle count var countText = new Text2('(' + storedMiracles.length + '/' + maxStoredMiracles + ')', { size: 50, fill: 0xFFFF00 }); countText.anchor.set(0.5, 0.5); countText.x = 0; countText.y = -250; self.addChild(countText); // Create buttons for each stored miracle var startY = -150; var buttonWidth = 600; var buttonHeight = 80; for (var i = 0; i < storedMiracles.length; i++) { var miracleType = storedMiracles[i]; var button = LK.getAsset('menuButton', { anchorX: 0.5, anchorY: 0.5, tint: 0x4444ff, width: buttonWidth, height: buttonHeight }); button.x = 0; button.y = startY + i * 100; button.miracleType = miracleType; button.miracleIndex = i; self.addChild(button); self.buttons.push(button); // Create miracle icon var miracleIcon = createMiracleIcon(miracleType); miracleIcon.x = -200; miracleIcon.y = startY + i * 100; self.addChild(miracleIcon); self.miracleIcons.push(miracleIcon); // Create button text var buttonText = new Text2(miracleType.toUpperCase(), { size: 40, fill: 0xffffff }); buttonText.anchor.set(0.5, 0.5); buttonText.x = 0; buttonText.y = startY + i * 100; self.addChild(buttonText); self.buttonTexts.push(buttonText); } // Add activate all button var activateAllButton = LK.getAsset('menuButton', { anchorX: 0.5, anchorY: 0.5, tint: 0xff6600, width: 450, height: 80 }); activateAllButton.x = 0; activateAllButton.y = startY + storedMiracles.length * 100 + 50; activateAllButton.actionType = 'activateAll'; self.addChild(activateAllButton); self.buttons.push(activateAllButton); var activateAllText = new Text2('ACTIVATE ALL', { size: 40, fill: 0xffffff }); activateAllText.anchor.set(0.5, 0.5); activateAllText.x = 0; activateAllText.y = startY + storedMiracles.length * 100 + 50; self.addChild(activateAllText); self.buttonTexts.push(activateAllText); // Add movement freedom button var movementButton = LK.getAsset('menuButton', { anchorX: 0.5, anchorY: 0.5, tint: 0x00aa00, width: 400, height: 80 }); movementButton.x = 0; movementButton.y = startY + storedMiracles.length * 100 + 100; movementButton.actionType = 'freeMovement'; self.addChild(movementButton); self.buttons.push(movementButton); var movementText = new Text2('FREE MOVEMENT', { size: 40, fill: 0xffffff }); movementText.anchor.set(0.5, 0.5); movementText.x = 0; movementText.y = startY + storedMiracles.length * 100 + 100; self.addChild(movementText); self.buttonTexts.push(movementText); // Add close button var closeButton = LK.getAsset('menuButton', { anchorX: 0.5, anchorY: 0.5, tint: 0xff4444, width: 200, height: 60 }); closeButton.x = 0; closeButton.y = startY + storedMiracles.length * 100 + 200; closeButton.actionType = 'close'; self.addChild(closeButton); self.buttons.push(closeButton); var closeText = new Text2('CLOSE', { size: 30, fill: 0xffffff }); closeText.anchor.set(0.5, 0.5); closeText.x = 0; closeText.y = startY + storedMiracles.length * 100 + 200; self.addChild(closeText); self.buttonTexts.push(closeText); }; self.show = function () { self.isVisible = true; self.visible = true; self.alpha = 0; self.scaleX = 0.8; self.scaleY = 0.8; // Remove gamePaused = true to keep enemies spawning self.createMiracleButtons(); tween(self, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 300 }); }; self.hide = function () { self.isVisible = false; // Remove gamePaused = false since game is not paused tween(self, { alpha: 0, scaleX: 0.8, scaleY: 0.8 }, { duration: 300, onFinish: function onFinish() { self.visible = false; } }); }; self.down = function (x, y, obj) { if (!self.isVisible) return; // Convert screen coordinates to local menu coordinates var localX = x - self.x; var localY = y - self.y; for (var i = 0; i < self.buttons.length; i++) { var button = self.buttons[i]; var dx = localX - button.x; var dy = localY - button.y; var buttonWidth = button.actionType === 'close' ? 100 : button.actionType === 'freeMovement' ? 200 : button.actionType === 'activateAll' ? 225 : 300; var buttonHeight = button.actionType === 'close' ? 30 : 40; if (Math.abs(dx) <= buttonWidth && Math.abs(dy) <= buttonHeight) { if (button.actionType === 'close') { self.hide(); } else if (button.actionType === 'freeMovement') { self.hide(); // Teleport hero away from base var teleportX = Math.random() * (2048 - 200) + 100; var teleportY = Math.random() * (2732 - 400) + 200; // Ensure not too close to base while (Math.sqrt((teleportX - heroBase.x) * (teleportX - heroBase.x) + (teleportY - heroBase.y) * (teleportY - heroBase.y)) < 300) { teleportX = Math.random() * (2048 - 200) + 100; teleportY = Math.random() * (2732 - 400) + 200; } hero.x = teleportX; hero.y = teleportY; LK.getSound('teleport').play(); } else if (button.actionType === 'activateAll') { // Activate all stored miracles for (var j = storedMiracles.length - 1; j >= 0; j--) { useStoredMiracle(j); } self.hide(); // Teleport hero away from base var teleportX = Math.random() * (2048 - 200) + 100; var teleportY = Math.random() * (2732 - 400) + 200; // Ensure not too close to base while (Math.sqrt((teleportX - heroBase.x) * (teleportX - heroBase.x) + (teleportY - heroBase.y) * (teleportY - heroBase.y)) < 300) { teleportX = Math.random() * (2048 - 200) + 100; teleportY = Math.random() * (2732 - 400) + 200; } hero.x = teleportX; hero.y = teleportY; LK.getSound('teleport').play(); } else if (button.miracleType) { // Use stored miracle useStoredMiracle(button.miracleIndex); self.hide(); // Teleport hero away from base var teleportX = Math.random() * (2048 - 200) + 100; var teleportY = Math.random() * (2732 - 400) + 200; // Ensure not too close to base while (Math.sqrt((teleportX - heroBase.x) * (teleportX - heroBase.x) + (teleportY - heroBase.y) * (teleportY - heroBase.y)) < 300) { teleportX = Math.random() * (2048 - 200) + 100; teleportY = Math.random() * (2732 - 400) + 200; } hero.x = teleportX; hero.y = teleportY; LK.getSound('teleport').play(); } break; } } }; self.alpha = 0; self.scaleX = 0.8; self.scaleY = 0.8; return self; }); var MiracleToken = Container.expand(function () { var self = Container.call(this); var tokenGraphics; self.type = 'speed'; // speed, shield, rapidFire, freeze, explosion, healing self.bobOffset = Math.random() * Math.PI * 2; self.startY = 0; self.setTokenType = function (type) { self.type = type; if (type === 'freeze') { tokenGraphics = self.attachAsset('freezeToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'explosion') { tokenGraphics = self.attachAsset('explosionToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'healing') { tokenGraphics = self.attachAsset('healingToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'hypercharge') { tokenGraphics = self.attachAsset('hyperchargeToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'teleport') { tokenGraphics = self.attachAsset('teleportToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'invisibility') { tokenGraphics = self.attachAsset('invisibilityToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'multiShot') { tokenGraphics = self.attachAsset('multiShotToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'timeSlow') { tokenGraphics = self.attachAsset('timeSlowToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'timeStop') { tokenGraphics = self.attachAsset('timeStopToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'timeRewind') { tokenGraphics = self.attachAsset('timeRewindToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'lifeSteal') { tokenGraphics = self.attachAsset('lifeStealToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'berserker') { tokenGraphics = self.attachAsset('berserkerToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'magnet') { tokenGraphics = self.attachAsset('magnetToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'reflect') { tokenGraphics = self.attachAsset('reflectToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'phoenix') { tokenGraphics = self.attachAsset('phoenixToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'vampire') { tokenGraphics = self.attachAsset('vampireToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'godMode') { tokenGraphics = self.attachAsset('godModeToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'shadowStrike') { tokenGraphics = self.attachAsset('shadowStrikeToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'necromancy') { tokenGraphics = self.attachAsset('necromancyToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'aura') { tokenGraphics = self.attachAsset('auraToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'chainLightning') { tokenGraphics = self.attachAsset('chainLightningToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'summon') { tokenGraphics = self.attachAsset('summonToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'meteor') { tokenGraphics = self.attachAsset('meteorToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'berserkAura') { tokenGraphics = self.attachAsset('berserkAuraToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'dimensionRift') { tokenGraphics = self.attachAsset('dimensionRiftToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'divineBlast') { tokenGraphics = self.attachAsset('divineBlastToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'apocalypse') { tokenGraphics = self.attachAsset('apocalypseToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'titanShield') { tokenGraphics = self.attachAsset('titanShieldToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'berserkRage') { tokenGraphics = self.attachAsset('berserkRageToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'lightningStorm') { tokenGraphics = self.attachAsset('lightningStormToken', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'bloodRain') { tokenGraphics = self.attachAsset('bloodRainToken', { anchorX: 0.5, anchorY: 0.5 }); } else { tokenGraphics = self.attachAsset('miracleToken', { anchorX: 0.5, anchorY: 0.5 }); } }; // Initialize with default token self.setTokenType('speed'); self.update = function () { // Bobbing animation self.y = self.startY + Math.sin(LK.ticks * 0.1 + self.bobOffset) * 10; // Rotate tokenGraphics.rotation += 0.05; }; return self; }); var Tiger = Container.expand(function () { var self = Container.call(this); var tigerGraphics = self.attachAsset('tiger', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3.5; self.damage = 55; self.health = 140; self.maxHealth = 140; self.prowlTimer = 0; self.isStealthed = false; self.takeDamage = function (damage) { self.health -= damage; tween(tigerGraphics, { tint: 0xff0000 }, { duration: 100 }); tween(tigerGraphics, { tint: 0xffffff }, { duration: 100 }); if (self.health <= 0) { return true; } return false; }; self.update = function () { var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.prowlTimer++; if (self.prowlTimer > 120 && !self.isStealthed) { self.isStealthed = true; self.prowlTimer = 0; tigerGraphics.alpha = 0.3; tween(self, { x: hero.x + dx / distance * 200, y: hero.y + dy / distance * 200 }, { duration: 800, onFinish: function onFinish() { self.isStealthed = false; tigerGraphics.alpha = 1.0; } }); } else if (!self.isStealthed) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); var TitanBear = Container.expand(function () { var self = Container.call(this); var titanGraphics = self.attachAsset('bear', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 2.5 }); titanGraphics.tint = 0x8B0000; // Dark red tint self.speed = 0.8; self.damage = 40; self.health = 150; self.maxHealth = 150; self.earthQuakeTimer = 0; self.roarTimer = 0; self.isBoss = true; self.takeDamage = function (damage) { self.health -= damage; createBloodSplatter(self.x, self.y, Math.min(damage / 8, 20)); tween(titanGraphics, { tint: 0xff0000 }, { duration: 150 }); tween(titanGraphics, { tint: 0x8B0000 }, { duration: 150 }); if (self.health <= 0) { createBloodSplatter(self.x, self.y, 25); return true; } return false; }; self.update = function () { var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.earthQuakeTimer++; self.roarTimer++; // Earthquake attack every 8 seconds if (self.earthQuakeTimer > 480) { self.earthQuakeTimer = 0; // Screen shake effect tween(game, { x: game.x + 15 }, { duration: 100 }); tween(game, { x: game.x - 15 }, { duration: 100 }); tween(game, { x: game.x }, { duration: 100 }); // Damage hero if close if (distance < 400) { hero.takeDamage(50); LK.effects.flashScreen(0x8B4513, 600); } } // Intimidating roar every 5 seconds if (self.roarTimer > 300) { self.roarTimer = 0; LK.effects.flashScreen(0x8B0000, 400); // Slow down hero temporarily var originalSpeed = hero.speed; hero.speed *= 0.5; LK.setTimeout(function () { hero.speed = originalSpeed; }, 2000); } self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; return self; }); var UltiOptiMegaToken = Container.expand(function () { var self = Container.call(this); var tokenGraphics = self.attachAsset('ultioptimegaToken', { anchorX: 0.5, anchorY: 0.5 }); self.type = 'ultioptimega'; self.bobOffset = Math.random() * Math.PI * 2; self.startY = 0; // Enhanced visual effects tokenGraphics.tint = 0x9900ff; // Purple tint self.particleTimer = 0; self.update = function () { // Enhanced bobbing animation with pulsing effect self.y = self.startY + Math.sin(LK.ticks * 0.15 + self.bobOffset) * 15; // Pulsing scale animation var scale = 1 + Math.sin(LK.ticks * 0.1) * 0.3; tokenGraphics.scaleX = scale; tokenGraphics.scaleY = scale; // Faster rotation tokenGraphics.rotation += 0.1; // Create particle effects around token self.particleTimer++; if (self.particleTimer > 10) { self.particleTimer = 0; createBloodSplatter(self.x + (Math.random() - 0.5) * 60, self.y + (Math.random() - 0.5) * 60, 3); } }; return self; }); var Wolf = Container.expand(function () { var self = Container.call(this); var wolfGraphics = self.attachAsset('wolf', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3.2; self.damage = 50; self.health = 110; self.maxHealth = 110; self.packTimer = 0; self.howlTimer = 0; self.lastTrailX = 0; self.lastTrailY = 0; self.trailTimer = 0; self.isWounded = false; self.takeDamage = function (damage) { self.health -= damage; self.isWounded = true; // Create blood trail when damaged createBloodTrail(self.x, self.y); tween(wolfGraphics, { tint: 0xff0000 }, { duration: 100 }); tween(wolfGraphics, { tint: 0xffffff }, { duration: 100 }); if (self.health <= 0) { return true; } return false; }; self.update = function () { var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.howlTimer++; if (self.howlTimer > 150) { self.howlTimer = 0; for (var i = 0; i < enemies.length; i++) { var otherEnemy = enemies[i]; if (otherEnemy !== self && otherEnemy.type === 'wolf') { var dist = Math.sqrt((otherEnemy.x - self.x) * (otherEnemy.x - self.x) + (otherEnemy.y - self.y) * (otherEnemy.y - self.y)); if (dist < 200) { otherEnemy.speed = Math.min(otherEnemy.speed * 1.2, 5.0); } } } } // Create blood trail if wounded and moving if (self.isWounded) { self.trailTimer++; if (self.trailTimer > 8) { // Create trail every 8 frames var moveDistance = Math.sqrt((self.x - self.lastTrailX) * (self.x - self.lastTrailX) + (self.y - self.lastTrailY) * (self.y - self.lastTrailY)); if (moveDistance > 15) { createBloodTrail(self.x, self.y); self.lastTrailX = self.x; self.lastTrailY = self.y; self.trailTimer = 0; } } } self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x228B22 // Forest green background }); /**** * Game Code ****/ // Sound effects // UI elements // Projectiles and power-ups // Farm animal enemies // Hero character // Game state variables var hero; var enemies = []; var bullets = []; var miracleTokens = []; var gameState = 'playing'; // playing, gameOver var currentWave = 1; var enemiesInWave = 3; var enemiesSpawned = 0; var waveSpawnTimer = 0; var nextWaveTimer = 0; var miracleTokenCount = 0; var lastAutoShoot = 0; var dragNode = null; var frozenEnemies = []; var freezeDuration = 0; var heroBase; var baseBullets = []; var bossSpawned = false; var bloodParticles = []; var bloodTrails = []; var miracleMenu; var controlledAnimal = null; var controlledAnimalType = ''; var controlledAnimalDuration = 0; var bossLevels = [1000, 2500, 5000, 8000, 12000]; var currentBossLevel = 0; var erdo = null; var erdoLastActivated = 0; var erdoCooldown = 15000; // 15 seconds cooldown between activations var erdoRevivalAvailable = false; var heroRevivalShots = 0; var heroRevivalShotCooldown = 0; // UI elements var healthBar; var healthBarBg; var scoreTxt; var waveTxt; var miracleCountTxt; // Initialize UI function initializeUI() { // Health bar background (dark background) healthBarBg = LK.getAsset('healthBar', { anchorX: 0, anchorY: 0, tint: 0x333333, width: 250, height: 30 }); // Health bar foreground (actual health) healthBar = LK.getAsset('healthBar', { anchorX: 0, anchorY: 0, tint: 0x00ff00, width: 240, height: 25 }); // Health bar border/frame var healthBarFrame = LK.getAsset('healthBar', { anchorX: 0, anchorY: 0, tint: 0xffffff, width: 250, height: 30 }); LK.gui.topLeft.addChild(healthBarBg); LK.gui.topLeft.addChild(healthBar); LK.gui.topLeft.addChild(healthBarFrame); healthBarBg.x = 120; healthBarBg.y = 20; healthBar.x = 125; healthBar.y = 22.5; healthBarFrame.x = 120; healthBarFrame.y = 20; // Make frame just an outline healthBarFrame.alpha = 0.8; // Score text scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Wave text waveTxt = new Text2('Wave: 1', { size: 50, fill: 0xFFFF00 }); waveTxt.anchor.set(1, 0); LK.gui.topRight.addChild(waveTxt); waveTxt.x = -20; waveTxt.y = 20; // Miracle token count miracleCountTxt = new Text2('Miracles: 0', { size: 45, fill: 0xFFD700 }); miracleCountTxt.anchor.set(1, 0); LK.gui.topRight.addChild(miracleCountTxt); miracleCountTxt.x = -20; miracleCountTxt.y = 80; } // Initialize hero function initializeHero() { hero = game.addChild(new Hero()); hero.x = 2048 / 2; hero.y = 2732 / 2; } // Spawn enemy function spawnEnemy() { // Don't spawn enemies during evil erdo battle if (evilErdoBattleActive) return; var enemy; var rand = Math.random(); // Count current bosses to limit to maximum 1 to prevent crashes var currentBossCount = 0; for (var i = 0; i < enemies.length; i++) { if (enemies[i].isBoss || enemies[i].isOmega) { currentBossCount++; } } // Check if boss should spawn at different levels - much more reduced frequency var shouldSpawnBoss = false; var bossType = 'hyperChicken'; // Only spawn boss if we have no bosses currently if (currentBossCount === 0) { // Significantly increase boss spawn thresholds for much less frequent bosses var reducedBossLevels = [2000, 4500, 7500, 12000, 18000, 25000, 35000, 50000, 70000, 100000]; for (var b = 0; b < reducedBossLevels.length; b++) { if (LK.getScore() >= reducedBossLevels[b] && currentBossLevel <= b) { shouldSpawnBoss = true; currentBossLevel = b + 1; // More boss variety including wind and magma bosses var bossTypes = ['hyperChicken', 'omegaSheep', 'omegaCow', 'omegaChicken', 'omegaPig', 'hyperCow', 'hyperSheep', 'windBoss', 'magmaBoss', 'titanBear']; bossType = bossTypes[b % bossTypes.length]; break; } } // Drastically reduce random boss spawn chance if (!shouldSpawnBoss && currentWave >= 8) { var bossChance = Math.min(0.015 + currentWave * 0.002, 0.04); if (Math.random() < bossChance) { shouldSpawnBoss = true; var omegaTypes = ['omegaSheep', 'omegaCow', 'omegaChicken', 'omegaPig', 'windBoss', 'magmaBoss', 'titanBear']; bossType = omegaTypes[Math.floor(Math.random() * omegaTypes.length)]; } } } if (shouldSpawnBoss) { enemy = new Enemy(bossType); // Trigger wind event when wind boss spawns if (bossType === 'windBoss') { LK.getSound('windevent').play(); windEventActive = true; windEventDuration = 30000; // 30 seconds } // Trigger magma event when magma boss spawns if (bossType === 'magmaBoss') { LK.playMusic('magma_event'); magmaEventActive = true; magmaEventDuration = 15000; // 15 seconds - reduced from 30 } // Special spawning for Titan Bear if (bossType === 'titanBear') { enemy = new TitanBear(); LK.effects.flashScreen(0x8B0000, 800); } } else if (currentWave <= 2) { enemy = new Enemy('sheep'); } else if (currentWave <= 4) { if (rand < 0.7) { enemy = new Enemy('sheep'); } else { enemy = new Enemy('chicken'); } } else { // More aggressive spawn distribution with higher chance of stronger enemies if (rand < 0.05) { enemy = new Enemy('sheep'); } else if (rand < 0.10) { enemy = new Enemy('chicken'); } else if (rand < 0.15) { enemy = new Enemy('cow'); } else if (rand < 0.20) { enemy = new Enemy('chick'); } else if (rand < 0.25) { enemy = new Enemy('snake'); } else if (rand < 0.30) { enemy = new Enemy('mouse'); } else if (rand < 0.35) { enemy = new Enemy('pig'); } else if (rand < 0.40) { enemy = new Enemy('goat'); } else if (rand < 0.45) { enemy = new Enemy('duck'); } else if (rand < 0.50) { enemy = new Enemy('rabbit'); } else if (rand < 0.65) { enemy = new Enemy('hyperSheep'); } else if (rand < 0.80) { enemy = new Enemy('hyperCow'); } else if (rand < 0.90) { enemy = new Enemy('hyperChicken'); } else if (rand < 0.93) { // Add new violent animal types enemy = new Lion(); } else if (rand < 0.96) { enemy = new Tiger(); } else if (rand < 0.98) { enemy = new Wolf(); } else if (rand < 0.995) { enemy = new Bear(); } else { enemy = new Elephant(); } } // Spawn from random edge var side = Math.floor(Math.random() * 4); if (side === 0) { // Top enemy.x = Math.random() * 2048; enemy.y = -50; } else if (side === 1) { // Right enemy.x = 2048 + 50; enemy.y = Math.random() * 2732; } else if (side === 2) { // Bottom enemy.x = Math.random() * 2048; enemy.y = 2732 + 50; } else { // Left enemy.x = -50; enemy.y = Math.random() * 2732; } enemies.push(enemy); game.addChild(enemy); } // Create bullet towards nearest enemy function shootAtNearestEnemy() { if (enemies.length === 0) return; var nearestEnemy = null; var nearestDistance = Infinity; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - hero.x; var dy = enemy.y - hero.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance) { nearestDistance = distance; nearestEnemy = enemy; } } if (nearestEnemy) { if (hero.explosiveShotMode) { // Fire 3 explosive bullets in spread pattern for (var i = -1; i <= 1; i++) { var bullet = new ExplosiveBullet(); bullet.x = hero.x; bullet.y = hero.y; var angle = Math.atan2(nearestEnemy.y - hero.y, nearestEnemy.x - hero.x) + i * 0.25; var targetX = hero.x + Math.cos(angle) * 500; var targetY = hero.y + Math.sin(angle) * 500; bullet.setTarget(targetX, targetY); bullets.push(bullet); game.addChild(bullet); } } else if (hero.multiShotMode) { // Fire 3 bullets in spread pattern for (var i = -1; i <= 1; i++) { var bullet = new Bullet(); bullet.x = hero.x; bullet.y = hero.y; var angle = Math.atan2(nearestEnemy.y - hero.y, nearestEnemy.x - hero.x) + i * 0.3; var targetX = hero.x + Math.cos(angle) * 500; var targetY = hero.y + Math.sin(angle) * 500; bullet.setTarget(targetX, targetY); bullets.push(bullet); game.addChild(bullet); } } else { var bullet = new Bullet(); bullet.x = hero.x; bullet.y = hero.y; bullet.setTarget(nearestEnemy.x, nearestEnemy.y); bullets.push(bullet); game.addChild(bullet); } LK.getSound('shoot').play(); } } // Create blood splatter effect function createBloodSplatter(x, y, intensity) { // Drastically limit blood particles to prevent crashes if (bloodParticles.length > 20) return; intensity = intensity || 3; // Significantly reduce intensity to prevent memory overflow intensity = Math.min(intensity, 4); // Only create blood effects every few frames to reduce load if (LK.ticks % 3 !== 0) return; for (var i = 0; i < intensity; i++) { var blood = new BloodParticle(); blood.x = x + (Math.random() - 0.5) * 40; blood.y = y + (Math.random() - 0.5) * 40; // Reduce velocity variation blood.velocityX = (Math.random() - 0.5) * 12; blood.velocityY = (Math.random() - 0.5) * 12; // Much shorter life to free memory faster blood.life = 30; blood.maxLife = 30; bloodParticles.push(blood); game.addChild(blood); } // Remove screen shake to reduce processing } // Create blood trail effect function createBloodTrail(x, y) { // Drastically limit blood trails to prevent crashes if (bloodTrails.length > 15) return; // Only create trails every few frames to reduce load if (LK.ticks % 5 !== 0) return; var trail = new BloodTrail(); trail.x = x + (Math.random() - 0.5) * 10; trail.y = y + (Math.random() - 0.5) * 10; bloodTrails.push(trail); game.addChild(trail); } // Create miracle token function createMiracleToken(x, y) { var token = new MiracleToken(); token.x = x; token.y = y; token.startY = y; var rand = Math.random(); if (rand < 0.05) { token.setTokenType('speed'); } else if (rand < 0.10) { token.setTokenType('shield'); } else if (rand < 0.15) { token.setTokenType('rapidFire'); } else if (rand < 0.20) { token.setTokenType('freeze'); } else if (rand < 0.25) { token.setTokenType('explosion'); } else if (rand < 0.30) { token.setTokenType('healing'); } else if (rand < 0.35) { token.setTokenType('hypercharge'); } else if (rand < 0.40) { token.setTokenType('teleport'); } else if (rand < 0.45) { token.setTokenType('invisibility'); } else if (rand < 0.50) { token.setTokenType('multiShot'); } else if (rand < 0.55) { token.setTokenType('timeSlow'); } else if (rand < 0.60) { token.setTokenType('timeStop'); } else if (rand < 0.65) { token.setTokenType('timeRewind'); } else if (rand < 0.70) { token.setTokenType('lifeSteal'); } else if (rand < 0.75) { token.setTokenType('berserker'); } else if (rand < 0.80) { token.setTokenType('magnet'); } else if (rand < 0.85) { token.setTokenType('reflect'); } else if (rand < 0.90) { token.setTokenType('phoenix'); } else if (rand < 0.87) { token.setTokenType('vampire'); } else if (rand < 0.885) { token.setTokenType('shadowStrike'); } else if (rand < 0.90) { token.setTokenType('necromancy'); } else if (rand < 0.915) { token.setTokenType('aura'); } else if (rand < 0.93) { token.setTokenType('chainLightning'); } else if (rand < 0.945) { token.setTokenType('summon'); } else if (rand < 0.96) { token.setTokenType('meteor'); } else if (rand < 0.975) { token.setTokenType('berserkAura'); } else if (rand < 0.987) { token.setTokenType('dimensionRift'); } else if (rand < 0.995) { token.setTokenType('divineBlast'); } else if (rand < 0.997) { token.setTokenType('apocalypse'); } else if (rand < 0.9975) { token.setTokenType('titanShield'); } else if (rand < 0.998) { token.setTokenType('berserkRage'); } else if (rand < 0.9985) { token.setTokenType('lightningStorm'); } else if (rand < 0.999) { token.setTokenType('bloodRain'); } else { token.setTokenType('godMode'); } miracleTokens.push(token); game.addChild(token); } // Freeze all enemies function freezeEnemies() { freezeDuration = 3000; // 3 seconds for (var i = 0; i < enemies.length; i++) { enemies[i].frozenSpeed = enemies[i].speed; enemies[i].speed = 0; enemies[i].isFrozen = true; // Visual effect - tint blue tween(enemies[i], { tint: 0x0088ff }, { duration: 200 }); } } // Explode nearby enemies function explodeNearbyEnemies() { var explosionRadius = 200; for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var dx = enemy.x - hero.x; var dy = enemy.y - hero.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= explosionRadius) { // Create explosion effect LK.effects.flashObject(enemy, 0xff4400, 300); var enemyDied = enemy.takeDamage(50); if (enemyDied) { LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } } } } // Revival explosion effect function createRevivalExplosion() { var explosionRadius = 300; // Create massive visual explosion LK.effects.flashScreen(0xffaa00, 1000); // Create blood splatters around hero for (var i = 0; i < 20; i++) { createBloodSplatter(hero.x + (Math.random() - 0.5) * 200, hero.y + (Math.random() - 0.5) * 200, 15); } // Damage and freeze nearby enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var dx = enemy.x - hero.x; var dy = enemy.y - hero.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= explosionRadius) { // Damage enemy var enemyDied = enemy.takeDamage(30); if (enemyDied) { LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); continue; } // Freeze enemy for 8 seconds enemy.frozenSpeed = enemy.speed; enemy.speed = 0; enemy.isFrozen = true; enemy.freezeTimer = 8000; // 8 seconds tween(enemy, { tint: 0x0088ff }, { duration: 200 }); } } } // Handle move events function handleMove(x, y, obj) { if (gameState !== 'playing' || gamePaused) return; if (dragNode) { // Keep hero within bounds dragNode.x = Math.max(40, Math.min(2048 - 40, x)); dragNode.y = Math.max(40, Math.min(2732 - 40, y)); } // Control animal if active if (controlledAnimal && !dragNode) { controlledAnimal.x = Math.max(40, Math.min(2048 - 40, x)); controlledAnimal.y = Math.max(40, Math.min(2732 - 40, y)); } } // Touch/mouse events game.move = handleMove; game.down = function (x, y, obj) { // Handle revival button click first if (gameState === 'revivalOption' && handleRevivalClick(x, y)) { return; } // Handle miracle menu clicks if (miracleMenu.isVisible) { miracleMenu.down(x, y, obj); return; } // Handle storage UI clicks if (handleStorageClick(x, y)) { return; } if (gameState !== 'playing' || gamePaused) return; dragNode = hero; handleMove(x, y, obj); }; game.up = function (x, y, obj) { dragNode = null; }; // Initialize base function initializeBase() { heroBase = game.addChild(new HeroBase()); heroBase.x = 2048 / 2; heroBase.y = 2732 - 200; heroBase.initializeTurrets(); } // Initialize game initializeUI(); initializeHero(); initializeBase(); // Initialize miracle storage loadStoredMiracles(); updateStoredMiraclesUI(); // Initialize miracle menu miracleMenu = game.addChild(new MiracleMenu()); miracleMenu.x = 2048 / 2; miracleMenu.y = 2732 / 2; // Initialize Erdo helper erdo = game.addChild(new Erdo()); // Initialize Evil Erdo evilErdo = game.addChild(new EvilErdo()); // Play farm war music LK.playMusic('farm_war'); // Main game update loop game.update = function () { if (gameState !== 'playing') return; // Update hero hero.update(); // Update controlled animal if (controlledAnimal) { controlledAnimal.update(); controlledAnimalDuration -= 16.67; if (controlledAnimalDuration <= 0) { controlledAnimal.destroy(); controlledAnimal = null; controlledAnimalType = ''; } } // Create controlled animal if type selected if (controlledAnimalType !== '' && controlledAnimal === null) { controlledAnimal = game.addChild(new ControlledAnimal(controlledAnimalType)); controlledAnimal.x = heroBase.x; controlledAnimal.y = heroBase.y - 50; } // Update base heroBase.update(); // Check if hero is in safe zone var heroInSafeZone = heroBase.isHeroInSafeZone(hero.x, hero.y); // Base interaction system - access stored miracles when in base if (heroInSafeZone) { // Show miracle menu when entering base if (!miracleMenu.isVisible) { miracleMenu.show(); } // Show stored miracles UI with enhanced visibility if (storedMiracles.length > 0) { for (var i = 0; i < storedMiraclesUI.length; i++) { if (storedMiraclesUI[i]) { storedMiraclesUI[i].alpha = 1.0; storedMiraclesUI[i].scaleX = 1.2; storedMiraclesUI[i].scaleY = 1.2; } } // Add pulsing effect to indicate availability if (storageText) { storageText.alpha = 0.8 + Math.sin(LK.ticks * 0.1) * 0.2; storageText.setText('STORED MIRACLES - CLICK TO USE (' + storedMiracles.length + '/' + maxStoredMiracles + ')'); } } } else { // Hide miracle menu when leaving base if (miracleMenu.isVisible) { miracleMenu.hide(); } // Reset UI when not in base for (var i = 0; i < storedMiraclesUI.length; i++) { if (storedMiraclesUI[i]) { storedMiraclesUI[i].alpha = 0.7; storedMiraclesUI[i].scaleX = 0.7; storedMiraclesUI[i].scaleY = 0.7; } } if (storageText) { storageText.alpha = 1.0; storageText.setText('STORED MIRACLES (' + storedMiracles.length + '/' + maxStoredMiracles + ')'); } } // Update freeze duration if (freezeDuration > 0) { freezeDuration -= 16.67; // Approximately 60fps if (freezeDuration <= 0) { // Unfreeze all enemies for (var i = 0; i < enemies.length; i++) { if (enemies[i].isFrozen) { enemies[i].speed = enemies[i].frozenSpeed; enemies[i].isFrozen = false; // Remove blue tint tween(enemies[i], { tint: 0xffffff }, { duration: 200 }); } } } } // Update health bar var healthPercent = hero.health / hero.maxHealth; healthBar.width = 240 * healthPercent; // Update health bar color based on health percentage if (healthPercent > 0.6) { healthBar.tint = 0x00ff00; // Green } else if (healthPercent > 0.3) { healthBar.tint = 0xffff00; // Yellow } else { healthBar.tint = 0xff0000; // Red } // Add pulsing effect when health is low if (healthPercent <= 0.25) { var pulseAlpha = 0.5 + Math.sin(LK.ticks * 0.2) * 0.3; healthBar.alpha = pulseAlpha; } else { healthBar.alpha = 1.0; } // Activate Erdo when hero health is low if (healthPercent <= 0.3 && !erdo.isActive && LK.ticks - erdoLastActivated > erdoCooldown / 16.67) { erdo.activate(); erdoLastActivated = LK.ticks; erdoRevivalAvailable = true; } // Update Erdo if (erdo) { erdo.update(); } // Update Evil Erdo if (evilErdo && evilErdoBattleActive) { evilErdo.update(); // Check if evil erdo is defeated if (evilErdo.health <= 0 && evilErdoBattleActive) { evilErdoBattleActive = false; evilErdo.visible = false; evilErdo.isActive = false; // Grant massive score bonus LK.setScore(LK.getScore() + 1000); scoreTxt.setText('Score: ' + LK.getScore()); // Create victory explosion createBloodSplatter(evilErdo.x, evilErdo.y, 50); LK.effects.flashScreen(0xFFD700, 1500); // Grant hero powerful temporary abilities hero.hasShield = true; hero.shieldDuration = 10000; hero.explosiveShotMode = true; hero.explosiveShotDuration = 15000; hero.rapidShootCooldown = 100; hero.shootCooldown = hero.rapidShootCooldown; LK.getSound('powerUp').play(); } } // Handle revival 5-shot system if (heroRevivalShots > 0) { heroRevivalShotCooldown -= 16.67; if (heroRevivalShotCooldown <= 0) { // Shoot 5 bullets in spread pattern for (var i = -2; i <= 2; i++) { var bullet = new Bullet(); bullet.x = hero.x; bullet.y = hero.y; var angle = Math.atan2(-1, 0) + i * 0.4; // Spread upward var targetX = hero.x + Math.cos(angle) * 500; var targetY = hero.y + Math.sin(angle) * 500; bullet.setTarget(targetX, targetY); bullet.speed = 12; bullets.push(bullet); game.addChild(bullet); } LK.getSound('shoot').play(); heroRevivalShots--; heroRevivalShotCooldown = 700; // 0.7 seconds between shots } } else { // Auto shoot if (LK.ticks - lastAutoShoot > hero.shootCooldown / 16.67) { shootAtNearestEnemy(); lastAutoShoot = LK.ticks; } } // Wave spawning - limit enemies to prevent crashes (not during evil erdo battle) if (!evilErdoBattleActive && enemiesSpawned < enemiesInWave && enemies.length < 30) { waveSpawnTimer++; if (waveSpawnTimer >= 45) { // Spawn every 0.75 seconds - slower to reduce load spawnEnemy(); // Reduce multiple enemy spawning if (currentWave >= 8 && enemies.length < 20) { spawnEnemy(); } if (currentWave >= 15 && enemies.length < 15) { spawnEnemy(); } enemiesSpawned++; waveSpawnTimer = 0; } } // Check for next wave if (enemiesSpawned >= enemiesInWave && enemies.length === 0) { nextWaveTimer++; if (nextWaveTimer >= 120) { // 2 second delay currentWave++; enemiesInWave = 3 + currentWave; enemiesSpawned = 0; nextWaveTimer = 0; waveTxt.setText('Wave: ' + currentWave); } } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; // Handle revival freeze timer if (enemy.freezeTimer !== undefined && enemy.freezeTimer > 0) { enemy.freezeTimer -= 16.67; if (enemy.freezeTimer <= 0) { enemy.speed = enemy.frozenSpeed; enemy.isFrozen = false; enemy.freezeTimer = undefined; tween(enemy, { tint: 0xffffff }, { duration: 200 }); } } // Apply time effects to enemy movement if (!timeStopActive) { var originalSpeed = enemy.speed; enemy.speed *= timeSlowFactor; enemy.update(); enemy.speed = originalSpeed; } // Check collision with controlled animal if (controlledAnimal && enemy.intersects(controlledAnimal) && enemy.type !== controlledAnimal.type) { var animalDied = controlledAnimal.takeDamage(enemy.damage); if (animalDied) { controlledAnimal.destroy(); controlledAnimal = null; controlledAnimalType = ''; controlledAnimalDuration = 0; } enemy.destroy(); enemies.splice(i, 1); continue; } // Check collision with evil erdo if (evilErdoBattleActive && evilErdo.intersects(hero) && !hero.invisibilityMode && !heroInSafeZone) { var heroDied = hero.takeDamage(evilErdo.damage); if (heroDied) { gameState = 'gameOver'; LK.showGameOver(); return; } LK.effects.flashScreen(0x800080, 300); } // Check collision with hero (only if not in safe zone) if (!evilErdoBattleActive && enemy.intersects(hero) && !hero.invisibilityMode && !heroInSafeZone) { var heroDied = hero.takeDamage(enemy.damage); if (heroDied) { if (erdoRevivalAvailable) { // Show revival option instead of immediate game over gameState = 'revivalOption'; showRevivalButton(); return; } else { gameState = 'gameOver'; LK.showGameOver(); return; } } // Remove enemy after collision enemy.destroy(); enemies.splice(i, 1); LK.effects.flashScreen(0xff0000, 500); continue; } // Remove enemies that are too far off screen if (enemy.x < -200 || enemy.x > 2248 || enemy.y < -200 || enemy.y > 2932) { enemy.destroy(); enemies.splice(i, 1); } } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; bullet.update(); // Check collision with evil erdo first if (evilErdoBattleActive && bullet.intersects(evilErdo)) { var evilErdoDied = evilErdo.takeDamage(bullet.damage); bullet.destroy(); bullets.splice(i, 1); if (evilErdoDied) { // Evil erdo defeated - handled in main update loop } continue; } // Check collision with enemies var hitEnemy = false; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { // Check if it's an explosive bullet if (bullet.explode) { bullet.explode(); // Trigger explosion effect } var enemyDied = enemy.takeDamage(bullet.damage); // Life steal and vampire healing if (hero.lifeStealMode || hero.vampireMode) { var healAmount = Math.min(bullet.damage * 0.15, 8); hero.health = Math.min(hero.health + healAmount, hero.maxHealth); LK.effects.flashObject(hero, 0x00ff00, 100); } if (enemyDied) { // Additional vampire healing on kill if (hero.vampireMode) { hero.health = Math.min(hero.health + 20, hero.maxHealth); } // Create UltiOptiMega token when boss is killed if (enemy.isBoss || enemy.isOmega) { var ultiToken = new UltiOptiMegaToken(); ultiToken.x = enemy.x; ultiToken.y = enemy.y; ultiToken.startY = enemy.y; miracleTokens.push(ultiToken); game.addChild(ultiToken); LK.effects.flashScreen(0x9900ff, 800); // End magma event when magma boss is killed if (enemy.type === 'magmaBoss' && magmaEventActive) { magmaEventActive = false; magmaEventDuration = 0; // Restore normal music LK.playMusic('farm_war'); } } // Create miracle token chance if (Math.random() < 0.55) { // 55% chance createMiracleToken(enemy.x, enemy.y); } var scoreIncrease = enemy.isBoss ? 100 : 10; LK.setScore(LK.getScore() + scoreIncrease); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(j, 1); LK.getSound('enemyHit').play(); } bullet.destroy(); bullets.splice(i, 1); hitEnemy = true; break; } } if (hitEnemy) continue; // Remove bullets that are off screen if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) { bullet.destroy(); bullets.splice(i, 1); } } // Update base bullets for (var i = baseBullets.length - 1; i >= 0; i--) { var bullet = baseBullets[i]; bullet.update(); // Check collision with enemies var hitEnemy = false; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { var enemyDied = enemy.takeDamage(bullet.damage); if (enemyDied) { // Create miracle token chance if (Math.random() < 0.3) { createMiracleToken(enemy.x, enemy.y); } var scoreIncrease = enemy.isBoss ? 100 : 10; LK.setScore(LK.getScore() + scoreIncrease); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(j, 1); LK.getSound('enemyHit').play(); } bullet.destroy(); baseBullets.splice(i, 1); hitEnemy = true; break; } } if (hitEnemy) continue; // Remove bullets that are off screen if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) { bullet.destroy(); baseBullets.splice(i, 1); } } // Update blood particles - cleanup aggressively for (var i = bloodParticles.length - 1; i >= 0; i--) { var blood = bloodParticles[i]; blood.update(); if (blood.life <= 0) { blood.destroy(); bloodParticles.splice(i, 1); } } // Force cleanup if too many particles if (bloodParticles.length > 25) { for (var i = 0; i < 10; i++) { if (bloodParticles[i]) { bloodParticles[i].destroy(); bloodParticles.splice(i, 1); } } } // Update blood trails - cleanup aggressively for (var i = bloodTrails.length - 1; i >= 0; i--) { var trail = bloodTrails[i]; trail.update(); if (trail.life <= 0) { trail.destroy(); bloodTrails.splice(i, 1); } } // Force cleanup if too many trails if (bloodTrails.length > 20) { for (var i = 0; i < 5; i++) { if (bloodTrails[i]) { bloodTrails[i].destroy(); bloodTrails.splice(i, 1); } } } // Update miracle tokens for (var i = miracleTokens.length - 1; i >= 0; i--) { var token = miracleTokens[i]; token.update(); // Check collision with hero if (token.intersects(hero)) { miracleTokenCount++; miracleCountTxt.setText('Miracles: ' + miracleTokenCount); // Check if storage is available and hero is holding down if (dragNode && storedMiracles.length < maxStoredMiracles) { // Store the miracle instead of using it var stored = addMiracleToStorage(token.type); if (stored) { LK.getSound('tokenCollect').play(); token.destroy(); miracleTokens.splice(i, 1); continue; } } // Activate power-up immediately activateMiraclePower(token.type); LK.getSound('tokenCollect').play(); token.destroy(); miracleTokens.splice(i, 1); } } // Handle special miracle effects if (hero.magnetMode) { // Attract nearby miracle tokens for (var i = 0; i < miracleTokens.length; i++) { var token = miracleTokens[i]; var dx = hero.x - token.x; var dy = hero.y - token.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 200 && distance > 0) { token.x += dx / distance * 8; token.y += dy / distance * 8; } } } // Handle phoenix revival if (hero.phoenixMode && hero.health <= 0) { hero.health = hero.maxHealth; hero.phoenixMode = false; hero.phoenixDuration = 0; createRevivalExplosion(); LK.effects.flashObject(hero, 0xFF6347, 1000); } // Handle reflect damage if (hero.reflectMode) { for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; if (enemy.intersects(hero)) { var enemyDied = enemy.takeDamage(enemy.damage); if (enemyDied) { LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } LK.effects.flashObject(enemy, 0x9932CC, 200); } } } // Handle shadow strike - teleport behind enemies and deal massive damage if (hero.shadowStrikeMode && LK.ticks % 180 === 0 && enemies.length > 0) { var targetEnemy = enemies[Math.floor(Math.random() * enemies.length)]; hero.x = targetEnemy.x + 80; hero.y = targetEnemy.y + 80; var enemyDied = targetEnemy.takeDamage(100); if (enemyDied) { LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); targetEnemy.destroy(); enemies.splice(enemies.indexOf(targetEnemy), 1); } LK.effects.flashObject(hero, 0x2f1b69, 300); } // Handle necromancy - revive dead enemies as allies if (hero.necromancyMode && LK.ticks % 300 === 0) { for (var i = 0; i < 2; i++) { var reviveBuddy = game.addChild(new ControlledAnimal('sheep')); reviveBuddy.x = hero.x + (Math.random() - 0.5) * 200; reviveBuddy.y = hero.y + (Math.random() - 0.5) * 200; reviveBuddy.health = 200; reviveBuddy.damage = 50; } } // Handle aura - heal hero and boost nearby allies if (hero.auraMode && LK.ticks % 60 === 0) { hero.health = Math.min(hero.health + 5, hero.maxHealth); if (controlledAnimal) { controlledAnimal.health = Math.min(controlledAnimal.health + 10, controlledAnimal.maxHealth); } LK.effects.flashObject(hero, 0xffd43b, 100); } // Handle chain lightning - damage multiple enemies in chain if (hero.chainLightningMode && LK.ticks % 120 === 0 && enemies.length > 0) { var lightningTargets = enemies.slice(0, Math.min(5, enemies.length)); for (var i = 0; i < lightningTargets.length; i++) { var enemy = lightningTargets[i]; var enemyDied = enemy.takeDamage(60); if (enemyDied) { LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(enemies.indexOf(enemy), 1); } LK.effects.flashObject(enemy, 0x4a90e2, 200); } } // Handle summon - spawn protective creatures if (hero.summonMode && LK.ticks % 600 === 0) { for (var i = 0; i < 3; i++) { var summonedCreature = game.addChild(new ControlledAnimal('chicken')); summonedCreature.x = hero.x + Math.cos(i * 2.09) * 100; summonedCreature.y = hero.y + Math.sin(i * 2.09) * 100; summonedCreature.health = 150; summonedCreature.damage = 40; } } // Handle meteor - random devastating strikes from sky if (hero.meteorMode && LK.ticks % 180 === 0) { var meteorX = Math.random() * 2048; var meteorY = Math.random() * 2732; var meteorRadius = 150; for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var dx = enemy.x - meteorX; var dy = enemy.y - meteorY; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= meteorRadius) { var enemyDied = enemy.takeDamage(120); if (enemyDied) { LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } } } LK.effects.flashScreen(0xd0021b, 200); createBloodSplatter(meteorX, meteorY, 20); } // Handle berserk aura - boost all allies damage and speed if (hero.berserkAuraMode && LK.ticks % 90 === 0) { if (controlledAnimal) { controlledAnimal.speed = Math.min(controlledAnimal.speed * 1.1, 8); controlledAnimal.damage = Math.min(controlledAnimal.damage * 1.1, 80); } LK.effects.flashObject(hero, 0xf5a623, 150); } // Handle dimension rift - teleport enemies to random locations if (hero.dimensionRiftMode && LK.ticks % 240 === 0) { for (var i = 0; i < Math.min(3, enemies.length); i++) { var enemy = enemies[i]; enemy.x = Math.random() * 2048; enemy.y = Math.random() * 2732; LK.effects.flashObject(enemy, 0x9013fe, 300); } } // Handle divine blast - massive holy damage to all enemies if (hero.divineBlastMode && LK.ticks % 300 === 0) { for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var enemyDied = enemy.takeDamage(80); if (enemyDied) { LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } LK.effects.flashObject(enemy, 0xffffff, 500); } LK.effects.flashScreen(0xffffff, 300); } // Handle apocalypse - screen-wide devastation if (hero.apocalypseMode && LK.ticks % 360 === 0) { for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var enemyDied = enemy.takeDamage(150); if (enemyDied) { LK.setScore(LK.getScore() + 15); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } } LK.effects.flashScreen(0x000000, 800); createBloodSplatter(2048 / 2, 2732 / 2, 30); } // Handle lightning storm - continuous lightning strikes if (hero.lightningStormMode && LK.ticks % 60 === 0) { for (var i = 0; i < 3; i++) { var lightningX = Math.random() * 2048; var lightningY = Math.random() * 2732; var lightningRadius = 100; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; var dx = enemy.x - lightningX; var dy = enemy.y - lightningY; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= lightningRadius) { var enemyDied = enemy.takeDamage(90); if (enemyDied) { LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(j, 1); } } } LK.effects.flashScreen(0xffff00, 150); } } // Handle blood rain - constant damage to all enemies if (hero.bloodRainMode && LK.ticks % 90 === 0) { for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var enemyDied = enemy.takeDamage(35); if (enemyDied) { LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } createBloodSplatter(enemy.x, enemy.y, 8); } LK.effects.flashScreen(0x8b0000, 100); } // Handle void walker - phase through enemies and deal damage if (hero.voidWalkerMode && LK.ticks % 30 === 0) { for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var dx = hero.x - enemy.x; var dy = hero.y - enemy.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 150) { var enemyDied = enemy.takeDamage(200); if (enemyDied) { LK.setScore(LK.getScore() + 15); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } LK.effects.flashObject(enemy, 0x1a0033, 200); } } } // Handle cosmic rage - screen-wide devastation with cosmic energy if (hero.cosmicRageMode && LK.ticks % 120 === 0) { for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var enemyDied = enemy.takeDamage(300); if (enemyDied) { LK.setScore(LK.getScore() + 20); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } LK.effects.flashObject(enemy, 0xff0099, 300); } LK.effects.flashScreen(0xff0099, 300); createBloodSplatter(2048 / 2, 2732 / 2, 40); } // Handle soul harvest - drain life from all enemies if (hero.soulHarvestMode && LK.ticks % 90 === 0) { for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var soulDrain = Math.min(enemy.health * 0.1, 50); enemy.takeDamage(soulDrain); hero.health = Math.min(hero.health + soulDrain * 0.5, hero.maxHealth); LK.effects.flashObject(enemy, 0x660066, 150); } LK.effects.flashObject(hero, 0x00ff00, 100); } // Handle elemental fury - constant elemental explosions if (hero.elementalFuryMode && LK.ticks % 45 === 0) { for (var i = 0; i < 8; i++) { var elementX = Math.random() * 2048; var elementY = Math.random() * 2732; var elementRadius = 180; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; var dx = enemy.x - elementX; var dy = enemy.y - elementY; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= elementRadius) { var enemyDied = enemy.takeDamage(150); if (enemyDied) { LK.setScore(LK.getScore() + 15); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(j, 1); } } } LK.effects.flashScreen(0xff6600, 100); createBloodSplatter(elementX, elementY, 25); } } // Handle quantum leap - teleport and create quantum explosions if (hero.quantumLeapMode && LK.ticks % 180 === 0) { // Teleport to random location hero.x = Math.random() * 1800 + 124; hero.y = Math.random() * 2400 + 166; // Create quantum explosion at new location var quantumRadius = 250; for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var dx = enemy.x - hero.x; var dy = enemy.y - hero.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= quantumRadius) { var enemyDied = enemy.takeDamage(250); if (enemyDied) { LK.setScore(LK.getScore() + 20); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } } } LK.effects.flashScreen(0x00ff99, 400); createBloodSplatter(hero.x, hero.y, 35); } // Handle dragon breath - continuous fire streams if (hero.dragonBreathMode && LK.ticks % 30 === 0) { var breathAngle = LK.ticks * 0.1; for (var i = 0; i < 12; i++) { var angle = breathAngle + i * (Math.PI * 2 / 12); var breathX = hero.x + Math.cos(angle) * 200; var breathY = hero.y + Math.sin(angle) * 200; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; var dx = enemy.x - breathX; var dy = enemy.y - breathY; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= 80) { var enemyDied = enemy.takeDamage(120); if (enemyDied) { LK.setScore(LK.getScore() + 15); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(j, 1); } LK.effects.flashObject(enemy, 0xff3300, 150); } } createBloodSplatter(breathX, breathY, 8); } } // Handle arcane storm - magical energy waves if (hero.arcaneStormMode && LK.ticks % 75 === 0) { var waveRadius = LK.ticks % 600 * 2; for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var dx = enemy.x - hero.x; var dy = enemy.y - hero.y; var distance = Math.sqrt(dx * dx + dy * dy); if (Math.abs(distance - waveRadius) <= 50) { var enemyDied = enemy.takeDamage(180); if (enemyDied) { LK.setScore(LK.getScore() + 15); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } LK.effects.flashObject(enemy, 0x9933ff, 200); } } } // Handle galaxy collapse - pull all enemies to center and crush if (hero.galaxyCollapseMode && LK.ticks % 120 === 0) { var centerX = 2048 / 2; var centerY = 2732 / 2; for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var dx = centerX - enemy.x; var dy = centerY - enemy.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { // Pull enemies towards center enemy.x += dx / distance * 15; enemy.y += dy / distance * 15; } // Damage enemies near center if (distance < 200) { var enemyDied = enemy.takeDamage(400); if (enemyDied) { LK.setScore(LK.getScore() + 25); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } } } LK.effects.flashScreen(0x000066, 200); createBloodSplatter(centerX, centerY, 50); } // Handle infinity mode - omnipotent destruction if (hero.infinityMode && LK.ticks % 60 === 0) { for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; var enemyDied = enemy.takeDamage(500); if (enemyDied) { LK.setScore(LK.getScore() + 30); scoreTxt.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.splice(i, 1); } LK.effects.flashObject(enemy, 0xffffff, 400); } LK.effects.flashScreen(0xffffff, 150); createBloodSplatter(hero.x, hero.y, 60); } // Handle omega destruction - ultimate annihilation if (hero.omegaDestructionMode && LK.ticks % 90 === 0) { // Instantly kill all enemies on screen for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; LK.setScore(LK.getScore() + 50); createBloodSplatter(enemy.x, enemy.y, 5); enemy.destroy(); enemies.splice(i, 1); } LK.effects.flashScreen(0xff0000, 100); // Reduce blood rain to prevent crashes for (var i = 0; i < 5; i++) { createBloodSplatter(Math.random() * 2048, Math.random() * 2732, 3); } } // Handle wind event duration if (windEventActive) { windEventDuration -= 16.67; if (windEventDuration <= 0) { windEventActive = false; } // Create wind effects during event if (LK.ticks % 120 === 0) { // Push all enemies in swirling pattern for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; if (enemy.type !== 'windBoss') { var windAngle = LK.ticks * 0.05; enemy.x += Math.cos(windAngle) * 30; enemy.y += Math.sin(windAngle) * 30; // Keep enemies in bounds enemy.x = Math.max(0, Math.min(2048, enemy.x)); enemy.y = Math.max(0, Math.min(2732, enemy.y)); } } } } // Handle magma event duration if (magmaEventActive) { magmaEventDuration -= 16.67; if (magmaEventDuration <= 0) { magmaEventActive = false; // Restore normal music LK.playMusic('farm_war'); } // Create magma effects during event - much more reduced frequency and intensity if (LK.ticks % 1200 === 0) { // Create only 1 lava burst to prevent crashes var lavaX = Math.random() * 2048; var lavaY = Math.random() * 2732; createBloodSplatter(lavaX, lavaY, 3); LK.effects.flashScreen(0xff4500, 50); } } }; var bossSpawned = false; var timeSlowFactor = 1.0; var timeStopActive = false; var gamePaused = false; // Revival system variables var revivalButton = null; var revivalButtonText = null; var evilErdo = null; var evilErdoBattleActive = false; // Show revival button function function showRevivalButton() { if (revivalButton) return; // Button already exists // Create revival button revivalButton = LK.getAsset('menuButton', { anchorX: 0.5, anchorY: 0.5, tint: 0x00ff00, width: 300, height: 80 }); revivalButton.x = 2048 / 2; revivalButton.y = 2732 / 2 + 100; revivalButton.visible = true; game.addChild(revivalButton); // Create revival button text revivalButtonText = new Text2('REVIVE WITH ERDO', { size: 40, fill: 0xffffff }); revivalButtonText.anchor.set(0.5, 0.5); revivalButtonText.x = 2048 / 2; revivalButtonText.y = 2732 / 2 + 100; revivalButtonText.visible = true; game.addChild(revivalButtonText); } // Hide revival button function function hideRevivalButton() { if (revivalButton) { revivalButton.destroy(); revivalButton = null; } if (revivalButtonText) { revivalButtonText.destroy(); revivalButtonText = null; } } // Handle revival button click function handleRevivalClick(x, y) { if (!revivalButton || gameState !== 'revivalOption') return false; var dx = x - revivalButton.x; var dy = y - revivalButton.y; if (Math.abs(dx) <= 150 && Math.abs(dy) <= 40) { // Revival clicked hero.health = hero.maxHealth; heroRevivalShots = 5; heroRevivalShotCooldown = 0; erdoRevivalAvailable = false; erdo.deactivate(); erdoLastActivated = LK.ticks; createRevivalExplosion(); LK.effects.flashObject(hero, 0x00ff00, 500); hideRevivalButton(); gameState = 'playing'; // Spawn evil erdo boss fight if (evilErdo) { evilErdo.activate(); } return true; } return false; } // Wind and magma event variables var windEventActive = false; var windEventDuration = 0; var magmaEventActive = false; var magmaEventDuration = 0; // Miracle storage system var storedMiracles = []; var maxStoredMiracles = 5; // Load stored miracles from storage function loadStoredMiracles() { storedMiracles = storage.storedMiracles || []; } // Save stored miracles to storage function saveStoredMiracles() { storage.storedMiracles = storedMiracles; } // Add miracle to storage function addMiracleToStorage(miracleType) { if (storedMiracles.length < maxStoredMiracles) { storedMiracles.push(miracleType); saveStoredMiracles(); updateStoredMiraclesUI(); return true; } return false; } // Use stored miracle function useStoredMiracle(index) { if (index >= 0 && index < storedMiracles.length) { var miracleType = storedMiracles[index]; activateMiraclePower(miracleType, true); // Pass true to indicate from storage storedMiracles.splice(index, 1); saveStoredMiracles(); updateStoredMiraclesUI(); return true; } return false; } // Activate miracle power by type function activateMiraclePower(type, fromStorage) { var isFromStorage = fromStorage || false; var durationMultiplier = isFromStorage ? 2.5 : 1.0; // 2.5x duration when used from storage if (type === 'speed') { hero.activateSpeedBoost(); if (isFromStorage) { // Extended speed boost duration LK.setTimeout(function () { hero.speed = hero.normalSpeed; }, 7500); // 7.5 seconds instead of 3 } } else if (type === 'shield') { hero.activateShield(); if (isFromStorage) { hero.shieldDuration = 12500; // 12.5 seconds instead of 5 } } else if (type === 'rapidFire') { hero.activateRapidFire(); if (isFromStorage) { hero.rapidFireDuration = 10000; // 10 seconds instead of 4 } } else if (type === 'freeze') { hero.activateFreeze(); } else if (type === 'explosion') { hero.activateExplosion(); } else if (type === 'healing') { hero.activateHealing(); if (isFromStorage) { // Enhanced healing when used from storage hero.health = Math.min(hero.health + 20, hero.maxHealth); } } else if (type === 'hypercharge') { hero.activateHypercharge(); if (isFromStorage) { hero.hyperhargeDuration = 20000; // 20 seconds instead of 8 } } else if (type === 'teleport') { hero.activateTeleport(); } else if (type === 'invisibility') { hero.activateInvisibility(); if (isFromStorage) { hero.invisibilityDuration = 12500; // 12.5 seconds instead of 5 } } else if (type === 'multiShot') { hero.activateMultiShot(); if (isFromStorage) { hero.multiShotDuration = 15000; // 15 seconds instead of 6 } } else if (type === 'timeSlow') { hero.activateTimeSlow(); if (isFromStorage) { hero.timeSlowDuration = 20000; // 20 seconds instead of 8 } } else if (type === 'timeStop') { hero.activateTimeStop(); if (isFromStorage) { hero.timeStopDuration = 7500; // 7.5 seconds instead of 3 } } else if (type === 'timeRewind') { hero.activateTimeRewind(); if (isFromStorage) { hero.timeRewindDuration = 12500; // 12.5 seconds instead of 5 } } else if (type === 'lifeSteal') { hero.activateLifeSteal(); if (isFromStorage) { hero.lifeStealDuration = 25000; // 25 seconds instead of 10 } } else if (type === 'berserker') { hero.activateBerserker(); if (isFromStorage) { hero.berserkerDuration = 20000; // 20 seconds instead of 8 } } else if (type === 'magnet') { hero.activateMagnet(); if (isFromStorage) { hero.magnetDuration = 30000; // 30 seconds instead of 12 } } else if (type === 'reflect') { hero.activateReflect(); if (isFromStorage) { hero.reflectDuration = 15000; // 15 seconds instead of 6 } } else if (type === 'phoenix') { hero.activatePhoenix(); if (isFromStorage) { hero.phoenixDuration = 37500; // 37.5 seconds instead of 15 } } else if (type === 'vampire') { hero.activateVampire(); if (isFromStorage) { hero.vampireDuration = 25000; // 25 seconds instead of 10 } } else if (type === 'godMode') { hero.activateGodMode(); if (isFromStorage) { hero.godModeDuration = 5000; // 5 seconds instead of 2 } } else if (type === 'shadowStrike') { hero.activateShadowStrike(); if (isFromStorage) { hero.shadowStrikeDuration = 20000; // 20 seconds instead of 8 } } else if (type === 'necromancy') { hero.activateNecromancy(); if (isFromStorage) { hero.necromancyDuration = 30000; // 30 seconds instead of 12 } } else if (type === 'aura') { hero.activateAura(); if (isFromStorage) { hero.auraDuration = 25000; // 25 seconds instead of 10 } } else if (type === 'chainLightning') { hero.activateChainLightning(); if (isFromStorage) { hero.chainLightningDuration = 15000; // 15 seconds instead of 6 } } else if (type === 'summon') { hero.activateSummon(); if (isFromStorage) { hero.summonDuration = 37500; // 37.5 seconds instead of 15 } } else if (type === 'meteor') { hero.activateMeteor(); if (isFromStorage) { hero.meteorDuration = 20000; // 20 seconds instead of 8 } } else if (type === 'berserkAura') { hero.activateBerserkAura(); if (isFromStorage) { hero.berserkAuraDuration = 25000; // 25 seconds instead of 10 } } else if (type === 'dimensionRift') { hero.activateDimensionRift(); if (isFromStorage) { hero.dimensionRiftDuration = 17500; // 17.5 seconds instead of 7 } } else if (type === 'divineBlast') { hero.activateDivineBlast(); if (isFromStorage) { hero.divineBlastDuration = 12500; // 12.5 seconds instead of 5 } } else if (type === 'divineBlast') { hero.activateDivineBlast(); } else if (type === 'apocalypse') { hero.activateApocalypse(); if (isFromStorage) { hero.apocalypseDuration = 15000; // 15 seconds instead of 6 } } else if (type === 'titanShield') { hero.activateTitanShield(); if (isFromStorage) { hero.titanShieldDuration = 30000; // 30 seconds instead of 12 } } else if (type === 'berserkRage') { hero.activateBerserkRage(); if (isFromStorage) { hero.berserkRageDuration = 20000; // 20 seconds instead of 8 } } else if (type === 'lightningStorm') { hero.activateLightningStorm(); if (isFromStorage) { hero.lightningStormDuration = 25000; // 25 seconds instead of 10 } } else if (type === 'bloodRain') { hero.activateBloodRain(); if (isFromStorage) { hero.bloodRainDuration = 37500; // 37.5 seconds instead of 15 } } else if (type === 'ultioptimega') { var ultraAbilities = ['voidWalker', 'cosmicRage', 'soulHarvest', 'timeDistortion', 'elementalFury', 'quantumLeap', 'dragonBreath', 'arcaneStorm', 'plasmaBurst', 'galaxyCollapse', 'infinity', 'omegaDestruction']; var selectedAbility = ultraAbilities[Math.floor(Math.random() * ultraAbilities.length)]; if (selectedAbility === 'voidWalker') { hero.activateVoidWalker(); if (isFromStorage) hero.voidWalkerDuration = 50000; // 50 seconds instead of 20 } else if (selectedAbility === 'cosmicRage') { hero.activateCosmicRage(); if (isFromStorage) hero.cosmicRageDuration = 45000; // 45 seconds instead of 18 } else if (selectedAbility === 'soulHarvest') { hero.activateSoulHarvest(); if (isFromStorage) hero.soulHarvestDuration = 62500; // 62.5 seconds instead of 25 } else if (selectedAbility === 'timeDistortion') { hero.activateTimeDistortion(); if (isFromStorage) hero.timeDistortionDuration = 37500; // 37.5 seconds instead of 15 } else if (selectedAbility === 'elementalFury') { hero.activateElementalFury(); if (isFromStorage) hero.elementalFuryDuration = 55000; // 55 seconds instead of 22 } else if (selectedAbility === 'quantumLeap') { hero.activateQuantumLeap(); if (isFromStorage) hero.quantumLeapDuration = 50000; // 50 seconds instead of 20 } else if (selectedAbility === 'dragonBreath') { hero.activateDragonBreath(); if (isFromStorage) hero.dragonBreathDuration = 40000; // 40 seconds instead of 16 } else if (selectedAbility === 'arcaneStorm') { hero.activateArcaneStorm(); if (isFromStorage) hero.arcaneStormDuration = 60000; // 60 seconds instead of 24 } else if (selectedAbility === 'plasmaBurst') { hero.activatePlasmaBurst(); if (isFromStorage) hero.plasmaBurstDuration = 35000; // 35 seconds instead of 14 } else if (selectedAbility === 'galaxyCollapse') { hero.activateGalaxyCollapse(); if (isFromStorage) hero.galaxyCollapseDuration = 30000; // 30 seconds instead of 12 } else if (selectedAbility === 'infinity') { hero.activateInfinity(); if (isFromStorage) hero.infinityDuration = 25000; // 25 seconds instead of 10 } else if (selectedAbility === 'omegaDestruction') { hero.activateOmegaDestruction(); if (isFromStorage) hero.omegaDestructionDuration = 20000; // 20 seconds instead of 8 } LK.effects.flashScreen(0x9900ff, 1000); } // Enhanced visual effect when used from storage if (isFromStorage) { LK.effects.flashScreen(0x00ff00, 500); LK.effects.flashObject(hero, 0x00ff00, 800); } } // Storage UI elements var storedMiraclesUI = []; var storageText = null; // Update stored miracles UI function updateStoredMiraclesUI() { // Initialize storedMiraclesUI if undefined if (!storedMiraclesUI) { storedMiraclesUI = []; } // Clear existing UI for (var i = 0; i < storedMiraclesUI.length; i++) { if (storedMiraclesUI[i]) { storedMiraclesUI[i].destroy(); } } storedMiraclesUI = []; if (storageText) { storageText.destroy(); } // Create storage title storageText = new Text2('STORED MIRACLES (' + storedMiracles.length + '/' + maxStoredMiracles + ')', { size: 35, fill: 0xFFD700 }); storageText.anchor.set(0, 0); LK.gui.topLeft.addChild(storageText); storageText.x = 20; storageText.y = 140; // Create stored miracle icons for (var i = 0; i < storedMiracles.length; i++) { var miracleType = storedMiracles[i]; var miracleIcon = createMiracleIcon(miracleType); miracleIcon.x = 20 + i * 60; miracleIcon.y = 180; miracleIcon.storageIndex = i; LK.gui.topLeft.addChild(miracleIcon); storedMiraclesUI.push(miracleIcon); } } // Create miracle icon for storage UI function createMiracleIcon(type) { var icon; if (type === 'freeze') { icon = LK.getAsset('freezeToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'explosion') { icon = LK.getAsset('explosionToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'healing') { icon = LK.getAsset('healingToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'hypercharge') { icon = LK.getAsset('hyperchargeToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'teleport') { icon = LK.getAsset('teleportToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'invisibility') { icon = LK.getAsset('invisibilityToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'multiShot') { icon = LK.getAsset('multiShotToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'timeSlow') { icon = LK.getAsset('timeSlowToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'timeStop') { icon = LK.getAsset('timeStopToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'timeRewind') { icon = LK.getAsset('timeRewindToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'lifeSteal') { icon = LK.getAsset('lifeStealToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'berserker') { icon = LK.getAsset('berserkerToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'magnet') { icon = LK.getAsset('magnetToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'reflect') { icon = LK.getAsset('reflectToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'phoenix') { icon = LK.getAsset('phoenixToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'vampire') { icon = LK.getAsset('vampireToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'godMode') { icon = LK.getAsset('godModeToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else if (type === 'ultioptimega') { icon = LK.getAsset('ultioptimegaToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } else { icon = LK.getAsset('miracleToken', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); } return icon; } // Handle storage UI clicks function handleStorageClick(x, y) { if (gameState !== 'playing' || gamePaused) return false; // Check if hero is in base safe zone var heroInSafeZone = heroBase.isHeroInSafeZone(hero.x, hero.y); if (!heroInSafeZone) { return false; // Can only use stored miracles when in base } for (var i = 0; i < storedMiraclesUI.length; i++) { var icon = storedMiraclesUI[i]; if (icon && icon.storageIndex !== undefined) { var iconGlobalPos = LK.gui.topLeft.toGlobal(icon.position); var dx = x - iconGlobalPos.x; var dy = y - iconGlobalPos.y; if (Math.abs(dx) <= 25 && Math.abs(dy) <= 25) { useStoredMiracle(icon.storageIndex); return true; } } } return false; } // UI elements var healthBar;
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var BaseBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('baseBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.damage = 20;
self.targetX = 0;
self.targetY = 0;
self.directionX = 0;
self.directionY = 0;
self.setTarget = function (x, y) {
self.targetX = x;
self.targetY = y;
var dx = x - self.x;
var dy = y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.directionX = dx / distance;
self.directionY = dy / distance;
}
};
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
};
return self;
});
var BaseTurret = Container.expand(function () {
var self = Container.call(this);
var turretGraphics = self.attachAsset('baseTurret', {
anchorX: 0.5,
anchorY: 0.5
});
self.lastShot = 0;
self.shootCooldown = 400;
self.range = 350;
self.damage = 45;
self.findNearestEnemy = function () {
var nearestEnemy = null;
var nearestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - self.x;
var dy = enemy.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < nearestDistance && distance <= self.range) {
nearestDistance = distance;
nearestEnemy = enemy;
}
}
return nearestEnemy;
};
self.shootAtEnemy = function (target) {
var bullet = new BaseBullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.setTarget(target.x, target.y);
bullet.damage = self.damage;
baseBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
self.update = function () {
if (LK.ticks - self.lastShot > self.shootCooldown / 16.67) {
var target = self.findNearestEnemy();
if (target) {
self.shootAtEnemy(target);
self.lastShot = LK.ticks;
var angle = Math.atan2(target.y - self.y, target.x - self.x);
turretGraphics.rotation = angle;
}
}
};
return self;
});
var Bear = Container.expand(function () {
var self = Container.call(this);
var bearGraphics = self.attachAsset('bear', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1.8;
self.damage = 70;
self.health = 200;
self.maxHealth = 200;
self.chargeTimer = 0;
self.isCharging = false;
self.takeDamage = function (damage) {
self.health -= damage;
// Create blood splatter effect
createBloodSplatter(self.x, self.y, Math.min(damage / 12, 8));
tween(bearGraphics, {
tint: 0xff0000
}, {
duration: 100
});
tween(bearGraphics, {
tint: 0xffffff
}, {
duration: 100
});
if (self.health <= 0) {
// Create larger blood splatter when dying
createBloodSplatter(self.x, self.y, 12);
return true;
}
return false;
};
self.update = function () {
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.chargeTimer++;
if (self.chargeTimer > 100 && !self.isCharging) {
self.isCharging = true;
self.chargeTimer = 0;
tween(bearGraphics, {
tint: 0x8B4513
}, {
duration: 300
});
tween(self, {
x: self.x + dx / distance * self.speed * 10,
y: self.y + dy / distance * self.speed * 10
}, {
duration: 700,
onFinish: function onFinish() {
self.isCharging = false;
tween(bearGraphics, {
tint: 0xffffff
}, {
duration: 300
});
}
});
} else if (!self.isCharging) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
}
};
return self;
});
var BloodParticle = Container.expand(function () {
var self = Container.call(this);
var bloodGraphics = self.attachAsset('baseBullet', {
anchorX: 0.5,
anchorY: 0.5
});
bloodGraphics.tint = 0x8B0000; // Dark red color
bloodGraphics.scaleX = 0.3;
bloodGraphics.scaleY = 0.3;
self.velocityX = (Math.random() - 0.5) * 8;
self.velocityY = (Math.random() - 0.5) * 8;
self.gravity = 0.2;
self.life = 60; // 1 second at 60fps
self.maxLife = 60;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityY += self.gravity;
self.life--;
// Fade out over time
var alpha = self.life / self.maxLife;
bloodGraphics.alpha = alpha;
};
return self;
});
var BloodTrail = Container.expand(function () {
var self = Container.call(this);
var trailGraphics = self.attachAsset('baseBullet', {
anchorX: 0.5,
anchorY: 0.5
});
trailGraphics.tint = 0x8B0000; // Dark red color
trailGraphics.scaleX = 0.4; // Make trails twice as wide
trailGraphics.scaleY = 1.2; // Make trails twice as long
self.life = 360; // 6 seconds at 60fps - double duration
self.maxLife = 360;
self.fadeSpeed = 0.002; // Slower fade for more visible trails
self.update = function () {
self.life--;
// Fade out over time
var alpha = self.life / self.maxLife;
trailGraphics.alpha = alpha * 0.7;
// Scale down over time
var scale = alpha * 0.6;
trailGraphics.scaleX = 0.2 * scale;
trailGraphics.scaleY = 0.6 * scale;
};
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12;
self.damage = 35;
self.targetX = 0;
self.targetY = 0;
self.directionX = 0;
self.directionY = 0;
self.setTarget = function (x, y) {
self.targetX = x;
self.targetY = y;
var dx = x - self.x;
var dy = y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.directionX = dx / distance;
self.directionY = dy / distance;
}
};
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
};
return self;
});
var ControlledAnimal = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'sheep';
self.speed = 3;
self.damage = 30;
self.health = 100;
self.maxHealth = 100;
var animalGraphics = self.attachAsset('controlledAnimal', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x00ffff
});
self.takeDamage = function (damage) {
self.health -= damage;
// Create blood splatter effect
createBloodSplatter(self.x, self.y, Math.min(damage / 8, 6));
tween(animalGraphics, {
tint: 0xff0000
}, {
duration: 100,
onFinish: function onFinish() {
tween(animalGraphics, {
tint: 0x00ffff
}, {
duration: 100
});
}
});
if (self.health <= 0) {
// Create blood splatter when dying
createBloodSplatter(self.x, self.y, 10);
return true;
}
return false;
};
self.attackEnemies = function () {
var attackRange = 100;
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.type === self.type) continue; // Don't attack same type
var dx = enemy.x - self.x;
var dy = enemy.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= attackRange) {
var enemyDied = enemy.takeDamage(self.damage);
if (enemyDied) {
LK.setScore(LK.getScore() + 15);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
}
}
};
self.update = function () {
// Attack nearby enemies of different types
if (LK.ticks % 30 === 0) {
self.attackEnemies();
}
};
return self;
});
var Eagle = Container.expand(function () {
var self = Container.call(this);
var eagleGraphics = self.attachAsset('eagle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4.0;
self.damage = 40;
self.health = 80;
self.maxHealth = 80;
self.swoopTimer = 0;
self.isSwooping = false;
self.flightPattern = 0;
self.takeDamage = function (damage) {
self.health -= damage;
tween(eagleGraphics, {
tint: 0xff0000
}, {
duration: 100
});
tween(eagleGraphics, {
tint: 0xffffff
}, {
duration: 100
});
if (self.health <= 0) {
return true;
}
return false;
};
self.update = function () {
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.swoopTimer++;
self.flightPattern++;
if (self.swoopTimer > 80 && !self.isSwooping) {
self.isSwooping = true;
self.swoopTimer = 0;
tween(self, {
x: hero.x,
y: hero.y
}, {
duration: 600,
onFinish: function onFinish() {
self.isSwooping = false;
}
});
} else if (!self.isSwooping) {
var circleX = hero.x + Math.cos(self.flightPattern * 0.05) * 150;
var circleY = hero.y + Math.sin(self.flightPattern * 0.05) * 150;
self.x += (circleX - self.x) * 0.02;
self.y += (circleY - self.y) * 0.02;
}
}
};
return self;
});
var Elephant = Container.expand(function () {
var self = Container.call(this);
var elephantGraphics = self.attachAsset('elephant', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1.5;
self.damage = 80;
self.health = 250;
self.maxHealth = 250;
self.trampleTimer = 0;
self.isTrampling = false;
self.takeDamage = function (damage) {
self.health -= damage;
tween(elephantGraphics, {
tint: 0xff0000
}, {
duration: 100
});
tween(elephantGraphics, {
tint: 0xffffff
}, {
duration: 100
});
if (self.health <= 0) {
return true;
}
return false;
};
self.update = function () {
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.trampleTimer++;
if (self.trampleTimer > 120 && !self.isTrampling) {
self.isTrampling = true;
self.trampleTimer = 0;
LK.effects.flashScreen(0x8B4513, 200);
tween(self, {
x: self.x + dx / distance * self.speed * 8,
y: self.y + dy / distance * self.speed * 8
}, {
duration: 1000,
onFinish: function onFinish() {
self.isTrampling = false;
}
});
} else if (!self.isTrampling) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
}
};
return self;
});
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'sheep';
self.speed = 1;
self.damage = 10;
self.health = 30;
self.maxHealth = 30;
var enemyGraphics;
if (self.type === 'sheep') {
enemyGraphics = self.attachAsset('sheep', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1.5;
self.damage = 12;
self.health = 30;
self.maxHealth = 30;
} else if (self.type === 'cow') {
enemyGraphics = self.attachAsset('cow', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1.2;
self.damage = 35;
self.health = 100;
self.maxHealth = 100;
} else if (self.type === 'chicken') {
enemyGraphics = self.attachAsset('chicken', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4.2;
self.damage = 12;
self.health = 35;
self.maxHealth = 35;
} else if (self.type === 'chick') {
enemyGraphics = self.attachAsset('chick', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.damage = 8;
self.health = 20;
self.maxHealth = 20;
} else if (self.type === 'snake') {
enemyGraphics = self.attachAsset('snake', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2.2;
self.damage = 28;
self.health = 50;
self.maxHealth = 50;
self.zigzagTimer = 0;
self.zigzagDirection = 1;
} else if (self.type === 'mouse') {
enemyGraphics = self.attachAsset('mouse', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.damage = 10;
self.health = 25;
self.maxHealth = 25;
self.jumpTimer = 0;
self.isJumping = false;
} else if (self.type === 'hyperSheep') {
enemyGraphics = self.attachAsset('hyperSheep', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3.5;
self.damage = 18;
self.health = 60;
self.maxHealth = 60;
self.chargeTimer = 0;
self.isCharging = false;
} else if (self.type === 'hyperCow') {
enemyGraphics = self.attachAsset('hyperCow', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2.5;
self.damage = 25;
self.health = 70;
self.maxHealth = 70;
self.rageMode = false;
self.rageDuration = 0;
} else if (self.type === 'hyperChicken') {
enemyGraphics = self.attachAsset('hyperChicken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
self.speed = 2.5;
self.damage = 15;
self.health = 120;
self.maxHealth = 120;
self.flightTimer = 0;
self.isFlying = false;
self.isBoss = true;
} else if (self.type === 'pig') {
enemyGraphics = self.attachAsset('pig', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1.5;
self.damage = 22;
self.health = 70;
self.maxHealth = 70;
self.rollTimer = 0;
self.isRolling = false;
} else if (self.type === 'goat') {
enemyGraphics = self.attachAsset('goat', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2.8;
self.damage = 32;
self.health = 85;
self.maxHealth = 85;
self.headbuttTimer = 0;
} else if (self.type === 'duck') {
enemyGraphics = self.attachAsset('duck', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3.2;
self.damage = 18;
self.health = 40;
self.maxHealth = 40;
self.quackTimer = 0;
} else if (self.type === 'rabbit') {
enemyGraphics = self.attachAsset('rabbit', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4.5;
self.damage = 15;
self.health = 30;
self.maxHealth = 30;
self.hopTimer = 0;
} else if (self.type === 'omegaSheep') {
enemyGraphics = self.attachAsset('omegaSheep', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
self.speed = 3.5;
self.damage = 15;
self.health = 50;
self.maxHealth = 50;
self.omegaTimer = 0;
self.isOmega = true;
} else if (self.type === 'omegaCow') {
enemyGraphics = self.attachAsset('omegaCow', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
self.speed = 3.2;
self.damage = 20;
self.health = 60;
self.maxHealth = 60;
self.omegaTimer = 0;
self.isOmega = true;
} else if (self.type === 'omegaChicken') {
enemyGraphics = self.attachAsset('omegaChicken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
self.speed = 4.0;
self.damage = 15;
self.health = 45;
self.maxHealth = 45;
self.omegaTimer = 0;
self.isOmega = true;
} else if (self.type === 'omegaPig') {
enemyGraphics = self.attachAsset('omegaPig', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
self.speed = 3.5;
self.damage = 18;
self.health = 55;
self.maxHealth = 55;
self.omegaTimer = 0;
self.isOmega = true;
} else if (self.type === 'windBoss') {
enemyGraphics = self.attachAsset('windBoss', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.8,
scaleY: 1.8
});
self.speed = 3.0;
self.damage = 25;
self.health = 80;
self.maxHealth = 80;
self.windTimer = 0;
self.isBoss = true;
self.windPushTimer = 0;
} else if (self.type === 'magmaBoss') {
enemyGraphics = self.attachAsset('magmaBoss', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.9,
scaleY: 1.9
});
self.speed = 2.5;
self.damage = 30;
self.health = 90;
self.maxHealth = 90;
self.magmaTimer = 0;
self.isBoss = true;
self.lavaSprayTimer = 0;
}
self.takeDamage = function (damage) {
self.health -= damage;
// Mark as wounded to start blood trail
self.isWounded = true;
self.lastTrailX = self.x;
self.lastTrailY = self.y;
self.trailTimer = 0;
// Create blood splatter effect
createBloodSplatter(self.x, self.y, Math.min(damage / 6, 15));
// Add extra blood spray for critical hits
if (damage >= 40) {
createBloodSplatter(self.x, self.y, 20);
LK.effects.flashObject(self, 0xff0000, 200);
}
// Create initial blood trail
createBloodTrail(self.x, self.y);
// Flash red when hit
tween(enemyGraphics, {
tint: 0xff0000
}, {
duration: 100
});
tween(enemyGraphics, {
tint: 0xffffff
}, {
duration: 100
});
if (self.health <= 0) {
// Create bigger blood splatter when dying
createBloodSplatter(self.x, self.y, 12);
return true; // Enemy died
}
return false;
};
self.update = function () {
// Move towards hero
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Create blood trail if wounded and moving
if (self.isWounded) {
self.trailTimer = self.trailTimer || 0;
self.trailTimer++;
if (self.trailTimer > 3) {
// Create trail every 3 frames for more blood
var moveDistance = Math.sqrt((self.x - (self.lastTrailX || self.x)) * (self.x - (self.lastTrailX || self.x)) + (self.y - (self.lastTrailY || self.y)) * (self.y - (self.lastTrailY || self.y)));
if (moveDistance > 8) {
// Create multiple trails for heavier bleeding
createBloodTrail(self.x, self.y);
if (self.health <= self.maxHealth * 0.3) {
// Heavy bleeding when severely wounded
createBloodTrail(self.x + (Math.random() - 0.5) * 15, self.y + (Math.random() - 0.5) * 15);
createBloodTrail(self.x + (Math.random() - 0.5) * 15, self.y + (Math.random() - 0.5) * 15);
}
self.lastTrailX = self.x;
self.lastTrailY = self.y;
self.trailTimer = 0;
}
}
}
if (distance > 0) {
if (self.type === 'snake') {
// Snake moves in zigzag pattern
self.zigzagTimer++;
if (self.zigzagTimer > 20) {
self.zigzagDirection *= -1;
self.zigzagTimer = 0;
}
var zigzagOffset = self.zigzagDirection * 30;
self.x += dx / distance * self.speed + zigzagOffset * 0.02;
self.y += dy / distance * self.speed;
} else if (self.type === 'mouse') {
// Mouse jumps towards hero
self.jumpTimer++;
if (self.jumpTimer > 40 && !self.isJumping) {
self.isJumping = true;
self.jumpTimer = 0;
// Quick jump movement
tween(self, {
x: self.x + dx / distance * self.speed * 8,
y: self.y + dy / distance * self.speed * 8
}, {
duration: 300,
onComplete: function onComplete() {
self.isJumping = false;
}
});
} else if (!self.isJumping) {
// Slow movement when not jumping
self.x += dx / distance * (self.speed * 0.3);
self.y += dy / distance * (self.speed * 0.3);
}
} else if (self.type === 'hyperSheep') {
// HyperSheep charges at hero periodically
self.chargeTimer++;
if (self.chargeTimer > 60 && !self.isCharging) {
self.isCharging = true;
self.chargeTimer = 0;
// Charge attack with visual effect
tween(enemyGraphics, {
tint: 0xff0000
}, {
duration: 200
});
tween(self, {
x: self.x + dx / distance * self.speed * 12,
y: self.y + dy / distance * self.speed * 12
}, {
duration: 500,
onFinish: function onFinish() {
self.isCharging = false;
tween(enemyGraphics, {
tint: 0xffffff
}, {
duration: 200
});
}
});
} else if (!self.isCharging) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
} else if (self.type === 'hyperCow') {
// HyperCow enters rage mode when low health
if (self.health <= self.maxHealth * 0.3 && !self.rageMode) {
self.rageMode = true;
self.rageDuration = 5000;
self.speed *= 2;
self.damage *= 1.5;
tween(enemyGraphics, {
tint: 0xff4400
}, {
duration: 300
});
}
if (self.rageMode) {
self.rageDuration -= 16.67;
if (self.rageDuration <= 0) {
self.rageMode = false;
self.speed /= 2;
self.damage /= 1.5;
tween(enemyGraphics, {
tint: 0xffffff
}, {
duration: 300
});
}
}
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
} else if (self.type === 'hyperChicken') {
// HyperChicken flies in aerial patterns
self.flightTimer++;
if (self.flightTimer > 120 && !self.isFlying) {
self.isFlying = true;
self.flightTimer = 0;
// Aerial dive attack
tween(self, {
x: hero.x,
y: hero.y - 100
}, {
duration: 800,
onFinish: function onFinish() {
tween(self, {
x: hero.x,
y: hero.y
}, {
duration: 400,
onFinish: function onFinish() {
self.isFlying = false;
}
});
}
});
} else if (!self.isFlying) {
// Circle around hero
var angle = Math.atan2(dy, dx) + Math.sin(LK.ticks * 0.05) * 0.5;
self.x += Math.cos(angle) * self.speed;
self.y += Math.sin(angle) * self.speed;
}
} else if (self.type === 'pig') {
// Pig rolls towards hero
self.rollTimer++;
if (self.rollTimer > 80 && !self.isRolling) {
self.isRolling = true;
self.rollTimer = 0;
tween(self, {
x: self.x + dx / distance * self.speed * 6,
y: self.y + dy / distance * self.speed * 6
}, {
duration: 600,
onFinish: function onFinish() {
self.isRolling = false;
}
});
} else if (!self.isRolling) {
self.x += dx / distance * self.speed * 0.5;
self.y += dy / distance * self.speed * 0.5;
}
} else if (self.type === 'goat') {
// Goat charges with headbutt
self.headbuttTimer++;
if (self.headbuttTimer > 70) {
self.headbuttTimer = 0;
var angle = Math.atan2(dy, dx);
self.x += Math.cos(angle) * self.speed * 2;
self.y += Math.sin(angle) * self.speed * 2;
} else {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
} else if (self.type === 'duck') {
// Duck waddles in wavy pattern
self.quackTimer++;
var waveOffset = Math.sin(self.quackTimer * 0.1) * 20;
self.x += dx / distance * self.speed + waveOffset * 0.02;
self.y += dy / distance * self.speed;
} else if (self.type === 'rabbit') {
// Rabbit hops quickly
self.hopTimer++;
if (self.hopTimer > 25) {
self.hopTimer = 0;
self.x += dx / distance * self.speed * 2;
self.y += dy / distance * self.speed * 2;
} else {
self.x += dx / distance * self.speed * 0.3;
self.y += dy / distance * self.speed * 0.3;
}
} else if (self.type === 'windBoss') {
// Wind boss creates wind gusts and pushes hero
self.windTimer++;
self.windPushTimer++;
if (self.windTimer > 200) {
self.windTimer = 0;
// Create wind gust effect
LK.effects.flashScreen(0x87ceeb, 300);
// Teleport in swirling pattern
var angle = LK.ticks * 0.1;
self.x = hero.x + Math.cos(angle) * 200;
self.y = hero.y + Math.sin(angle) * 200;
}
// Push hero away periodically
if (self.windPushTimer > 120 && distance < 300) {
self.windPushTimer = 0;
var pushForce = 30;
hero.x += dx / distance * -pushForce; // Push away from boss
hero.y += dy / distance * -pushForce;
// Keep hero in bounds
hero.x = Math.max(40, Math.min(2048 - 40, hero.x));
hero.y = Math.max(40, Math.min(2732 - 40, hero.y));
LK.getSound('windevent').play();
}
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
} else if (self.type === 'magmaBoss') {
// Magma boss creates lava sprays and fire effects
self.magmaTimer++;
self.lavaSprayTimer++;
if (self.magmaTimer > 240) {
self.magmaTimer = 0;
// Create magma eruption effect - reduced intensity
LK.effects.flashScreen(0xff4500, 200);
// Create blood splatters to simulate lava spray - reduced intensity
createBloodSplatter(self.x, self.y, 12);
tween(enemyGraphics, {
tint: 0xffff00
}, {
duration: 200,
onFinish: function onFinish() {
tween(enemyGraphics, {
tint: 0xffffff
}, {
duration: 200
});
}
});
}
// Create lava spray damage zones - much more reduced frequency and damage
if (self.lavaSprayTimer > 720) {
self.lavaSprayTimer = 0;
var sprayRadius = 100;
var heroDx = hero.x - self.x;
var heroDy = hero.y - self.y;
var heroDistance = Math.sqrt(heroDx * heroDx + heroDy * heroDy);
if (heroDistance <= sprayRadius) {
hero.takeDamage(5);
LK.effects.flashObject(hero, 0xff4500, 100);
}
}
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
} else if (self.type.indexOf('omega') === 0) {
// Omega animals have enhanced movement
self.omegaTimer++;
if (self.omegaTimer > 60) {
self.omegaTimer = 0;
// Omega boost
tween(enemyGraphics, {
tint: 0xff00ff
}, {
duration: 200,
onFinish: function onFinish() {
tween(enemyGraphics, {
tint: 0xffffff
}, {
duration: 200
});
}
});
self.x += dx / distance * self.speed * 3;
self.y += dy / distance * self.speed * 3;
} else {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
} else {
// Normal movement for other enemies
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
}
};
return self;
});
var Erdo = Container.expand(function () {
var self = Container.call(this);
var erdoGraphics = self.attachAsset('erdo', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.lastShot = 0;
self.shootCooldown = 80; // Very fast shooting
self.isActive = false;
self.activationTimer = 0;
self.maxActivationTime = 15000; // 15 seconds active
self.isMovingToCenter = false;
self.targetX = 0;
self.targetY = 0;
self.shootDirections = [{
x: 1,
y: 0
}, {
x: -1,
y: 0
}, {
x: 0,
y: 1
}, {
x: 0,
y: -1
}, {
x: 0.707,
y: 0.707
}, {
x: -0.707,
y: 0.707
}, {
x: 0.707,
y: -0.707
}, {
x: -0.707,
y: -0.707
}];
self.activate = function () {
self.isActive = true;
self.activationTimer = 0;
self.visible = true;
self.alpha = 0;
self.isMovingToCenter = true;
// Spawn from random edge
var side = Math.floor(Math.random() * 4);
if (side === 0) {
// Top
self.x = Math.random() * 2048;
self.y = -50;
} else if (side === 1) {
// Right
self.x = 2048 + 50;
self.y = Math.random() * 2732;
} else if (side === 2) {
// Bottom
self.x = Math.random() * 2048;
self.y = 2732 + 50;
} else {
// Left
self.x = -50;
self.y = Math.random() * 2732;
}
// Set target to center
self.targetX = 2048 / 2;
self.targetY = 2732 / 2;
// Fade in effect
tween(self, {
alpha: 1
}, {
duration: 300
});
LK.getSound('powerUp').play();
};
self.deactivate = function () {
self.isActive = false;
self.isMovingToCenter = false;
// Grant hero enhanced abilities for 15 seconds after Erdo leaves
hero.hasShield = true;
hero.shieldDuration = 15000; // 15 seconds shield
hero.explosiveShotMode = true;
hero.explosiveShotDuration = 15000; // 15 seconds explosive shots
hero.rapidShootCooldown = 200; // 0.2 seconds between shots
hero.shootCooldown = hero.rapidShootCooldown;
// Visual effect for enhanced mode
tween(hero, {
tint: 0xffaa00
}, {
duration: 500
});
// Fade out effect
tween(self, {
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
self.visible = false;
}
});
};
self.shootInAllDirections = function () {
// Only shoot if there are enemies to target
if (enemies.length === 0) return;
for (var i = 0; i < enemies.length && i < self.shootDirections.length; i++) {
var enemy = enemies[i];
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.setTarget(enemy.x, enemy.y);
bullet.speed = 15; // Very fast bullets
bullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
};
self.update = function () {
if (!self.isActive) return;
self.activationTimer += 16.67;
// Move to center first
if (self.isMovingToCenter) {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 20) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
} else {
self.isMovingToCenter = false;
}
}
// Shoot rapidly in all directions when in center
if (!self.isMovingToCenter && LK.ticks - self.lastShot > self.shootCooldown / 16.67) {
self.shootInAllDirections();
self.lastShot = LK.ticks;
}
// Deactivate after time limit
if (self.activationTimer >= self.maxActivationTime) {
self.deactivate();
}
};
self.visible = false;
return self;
});
var EvilErdo = Container.expand(function () {
var self = Container.call(this);
var evilErdoGraphics = self.attachAsset('erdo', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.5,
scaleY: 2.5
});
evilErdoGraphics.tint = 0xff0000; // Red tint for evil
self.health = 500;
self.maxHealth = 500;
self.speed = 3;
self.damage = 40;
self.lastShot = 0;
self.shootCooldown = 120; // 2 seconds between shots
self.isBoss = true;
self.phase = 1; // Boss has 3 phases
self.phaseTimer = 0;
self.isActive = false;
self.teleportTimer = 0;
self.darkEnergyTimer = 0;
self.shootDirections = [{
x: 1,
y: 0
}, {
x: -1,
y: 0
}, {
x: 0,
y: 1
}, {
x: 0,
y: -1
}, {
x: 0.707,
y: 0.707
}, {
x: -0.707,
y: 0.707
}, {
x: 0.707,
y: -0.707
}, {
x: -0.707,
y: -0.707
}];
self.activate = function () {
self.isActive = true;
self.visible = true;
self.alpha = 0;
self.health = self.maxHealth;
self.phase = 1;
self.phaseTimer = 0;
// Spawn at center of screen
self.x = 2048 / 2;
self.y = 2732 / 2;
// Dark entrance effect
LK.effects.flashScreen(0x800080, 1000);
tween(self, {
alpha: 1
}, {
duration: 500
});
// Stop all enemy spawning
evilErdoBattleActive = true;
// Clear all existing enemies
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].destroy();
enemies.splice(i, 1);
}
LK.getSound('powerUp').play();
};
self.takeDamage = function (damage) {
self.health -= damage;
// Create dark energy effect when hit
createBloodSplatter(self.x, self.y, Math.min(damage / 6, 20));
// Flash red when hit
tween(evilErdoGraphics, {
tint: 0xffffff
}, {
duration: 100
});
tween(evilErdoGraphics, {
tint: 0xff0000
}, {
duration: 100
});
// Check for phase transitions
if (self.health <= self.maxHealth * 0.66 && self.phase === 1) {
self.phase = 2;
self.phaseTimer = 0;
self.shootCooldown = 80; // Faster shooting
LK.effects.flashScreen(0x4B0082, 500);
} else if (self.health <= self.maxHealth * 0.33 && self.phase === 2) {
self.phase = 3;
self.phaseTimer = 0;
self.shootCooldown = 60; // Even faster shooting
self.speed = 4;
LK.effects.flashScreen(0x000000, 800);
}
if (self.health <= 0) {
// Create massive explosion when defeated
createBloodSplatter(self.x, self.y, 30);
LK.effects.flashScreen(0xFFD700, 1000);
// End evil erdo battle
evilErdoBattleActive = false;
return true;
}
return false;
};
self.shootAtHero = function () {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.setTarget(hero.x, hero.y);
bullet.damage = self.damage;
bullet.speed = 8;
// Make bullet red for evil erdo
if (bullet.attachAsset) {
var bulletGraphics = bullet.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
bulletGraphics.tint = 0xff0000;
}
bullets.push(bullet);
game.addChild(bullet);
};
self.shootInAllDirections = function () {
for (var i = 0; i < self.shootDirections.length; i++) {
var direction = self.shootDirections[i];
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
var targetX = self.x + direction.x * 500;
var targetY = self.y + direction.y * 500;
bullet.setTarget(targetX, targetY);
bullet.damage = self.damage;
bullet.speed = 10;
bullets.push(bullet);
game.addChild(bullet);
}
};
self.darkEnergyAttack = function () {
// Create dark energy explosion around evil erdo
var explosionRadius = 200;
var heroDx = hero.x - self.x;
var heroDy = hero.y - self.y;
var heroDistance = Math.sqrt(heroDx * heroDx + heroDy * heroDy);
if (heroDistance <= explosionRadius) {
hero.takeDamage(25);
LK.effects.flashObject(hero, 0x800080, 300);
}
createBloodSplatter(self.x, self.y, 25);
LK.effects.flashScreen(0x4B0082, 200);
};
self.update = function () {
if (!self.isActive) return;
self.phaseTimer += 16.67;
self.teleportTimer += 16.67;
self.darkEnergyTimer += 16.67;
// Move towards hero
var dx = hero.x - self.x;
var dy = hero.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;
}
// Phase 1: Basic shooting
if (self.phase === 1) {
if (LK.ticks - self.lastShot > self.shootCooldown / 16.67) {
self.shootAtHero();
self.lastShot = LK.ticks;
}
}
// Phase 2: Multi-directional shooting + teleport
else if (self.phase === 2) {
if (LK.ticks - self.lastShot > self.shootCooldown / 16.67) {
self.shootInAllDirections();
self.lastShot = LK.ticks;
}
// Teleport occasionally
if (self.teleportTimer > 3000) {
self.teleportTimer = 0;
var newX = Math.random() * (2048 - 200) + 100;
var newY = Math.random() * (2732 - 200) + 100;
tween(self, {
x: newX,
y: newY
}, {
duration: 300
});
LK.effects.flashScreen(0x9400D3, 200);
}
}
// Phase 3: All attacks + dark energy
else if (self.phase === 3) {
if (LK.ticks - self.lastShot > self.shootCooldown / 16.67) {
self.shootInAllDirections();
self.shootAtHero();
self.lastShot = LK.ticks;
}
// More frequent teleporting
if (self.teleportTimer > 2000) {
self.teleportTimer = 0;
var newX = Math.random() * (2048 - 200) + 100;
var newY = Math.random() * (2732 - 200) + 100;
tween(self, {
x: newX,
y: newY
}, {
duration: 200
});
LK.effects.flashScreen(0x000000, 300);
}
// Dark energy attacks
if (self.darkEnergyTimer > 1500) {
self.darkEnergyTimer = 0;
self.darkEnergyAttack();
}
}
};
self.visible = false;
return self;
});
var ExplosiveBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
bulletGraphics.tint = 0xff4400; // Orange tint for explosive bullets
bulletGraphics.scaleX = 1.3;
bulletGraphics.scaleY = 1.3;
self.speed = 12;
self.damage = 40; // Reduced damage
self.targetX = 0;
self.targetY = 0;
self.directionX = 0;
self.directionY = 0;
self.setTarget = function (x, y) {
self.targetX = x;
self.targetY = y;
var dx = x - self.x;
var dy = y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.directionX = dx / distance;
self.directionY = dy / distance;
}
};
self.explode = function () {
// Create explosion visual effect
LK.effects.flashObject(self, 0xff4400, 300);
createBloodSplatter(self.x, self.y, 15);
// Damage enemies in explosion radius
var explosionRadius = 60;
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var dx = enemy.x - self.x;
var dy = enemy.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= explosionRadius) {
var enemyDied = enemy.takeDamage(self.damage * 0.7);
if (enemyDied) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
}
}
};
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
};
return self;
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 100;
self.health = self.maxHealth;
self.speed = 2.5;
self.normalSpeed = 3;
self.boostedSpeed = 6;
self.hasShield = false;
self.shieldDuration = 0;
self.rapidFire = false;
self.rapidFireDuration = 0;
self.lastShot = 0;
self.shootCooldown = 500; // milliseconds
self.normalShootCooldown = 500;
self.rapidShootCooldown = 150;
self.hyperchargeMode = false;
self.hyperhargeDuration = 0;
self.invisibilityMode = false;
self.invisibilityDuration = 0;
self.multiShotMode = false;
self.multiShotDuration = 0;
self.timeSlowMode = false;
self.timeSlowDuration = 0;
self.timeStopMode = false;
self.timeStopDuration = 0;
self.timeRewindMode = false;
self.timeRewindDuration = 0;
self.explosiveShotMode = false;
self.explosiveShotDuration = 0;
self.lifeStealMode = false;
self.lifeStealDuration = 0;
self.berserkerMode = false;
self.berserkerDuration = 0;
self.magnetMode = false;
self.magnetDuration = 0;
self.reflectMode = false;
self.reflectDuration = 0;
self.phoenixMode = false;
self.phoenixDuration = 0;
self.vampireMode = false;
self.vampireDuration = 0;
self.godMode = false;
self.godModeDuration = 0;
self.shadowStrikeMode = false;
self.shadowStrikeDuration = 0;
self.necromancyMode = false;
self.necromancyDuration = 0;
self.auraMode = false;
self.auraDuration = 0;
self.chainLightningMode = false;
self.chainLightningDuration = 0;
self.summonMode = false;
self.summonDuration = 0;
self.meteorMode = false;
self.meteorDuration = 0;
self.berserkAuraMode = false;
self.berserkAuraDuration = 0;
self.dimensionRiftMode = false;
self.dimensionRiftDuration = 0;
self.divineBlastMode = false;
self.divineBlastDuration = 0;
self.apocalypseMode = false;
self.apocalypseDuration = 0;
self.titanShieldMode = false;
self.titanShieldDuration = 0;
self.berserkRageMode = false;
self.berserkRageDuration = 0;
self.lightningStormMode = false;
self.lightningStormDuration = 0;
self.bloodRainMode = false;
self.bloodRainDuration = 0;
self.voidWalkerMode = false;
self.voidWalkerDuration = 0;
self.cosmicRageMode = false;
self.cosmicRageDuration = 0;
self.soulHarvestMode = false;
self.soulHarvestDuration = 0;
self.timeDistortionMode = false;
self.timeDistortionDuration = 0;
self.elementalFuryMode = false;
self.elementalFuryDuration = 0;
self.quantumLeapMode = false;
self.quantumLeapDuration = 0;
self.dragonBreathMode = false;
self.dragonBreathDuration = 0;
self.arcaneStormMode = false;
self.arcaneStormDuration = 0;
self.plasmaBurstMode = false;
self.plasmaBurstDuration = 0;
self.galaxyCollapseMode = false;
self.galaxyCollapseDuration = 0;
self.infinityMode = false;
self.infinityDuration = 0;
self.omegaDestructionMode = false;
self.omegaDestructionDuration = 0;
self.savedPosition = {
x: 0,
y: 0
};
self.savedHealth = 0;
var shieldGraphics = self.attachAsset('shieldEffect', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5
});
shieldGraphics.visible = false;
self.takeDamage = function (damage) {
if (self.hasShield) {
return false; // No damage taken
}
self.health -= damage;
// Create blood splatter effect when hero is hit
createBloodSplatter(self.x, self.y, Math.min(damage / 8, 10));
// Create blood trail when hero is damaged
createBloodTrail(self.x, self.y);
if (self.health <= 0) {
self.health = 0;
// Create large blood splatter when hero dies
createBloodSplatter(self.x, self.y, 15);
return true; // Hero died
}
return false;
};
self.activateShield = function () {
self.hasShield = true;
self.shieldDuration = 5000; // 5 seconds
shieldGraphics.visible = true;
LK.getSound('powerUp').play();
};
self.activateSpeedBoost = function () {
self.speed = self.boostedSpeed;
LK.getSound('powerUp').play();
LK.setTimeout(function () {
self.speed = self.normalSpeed;
}, 3000);
};
self.activateRapidFire = function () {
self.rapidFire = true;
self.rapidFireDuration = 4000; // 4 seconds
self.shootCooldown = self.rapidShootCooldown;
LK.getSound('powerUp').play();
};
self.activateFreeze = function () {
freezeEnemies();
LK.getSound('powerUp').play();
};
self.activateExplosion = function () {
explodeNearbyEnemies();
LK.getSound('powerUp').play();
};
self.activateHealing = function () {
self.health = Math.min(self.health + 30, self.maxHealth);
LK.getSound('powerUp').play();
};
self.activateHypercharge = function () {
self.hyperchargeMode = true;
self.hyperhargeDuration = 8000; // 8 seconds
self.speed = self.boostedSpeed * 1.5;
self.shootCooldown = 50; // Very fast shooting
heroGraphics.tint = 0xffff00; // Yellow tint
LK.getSound('hypercharge').play();
};
self.activateTeleport = function () {
// Teleport to random safe location
var safeX = Math.random() * (2048 - 160) + 80;
var safeY = Math.random() * (2732 - 160) + 80;
tween(self, {
x: safeX,
y: safeY
}, {
duration: 100
});
LK.getSound('teleport').play();
};
self.activateInvisibility = function () {
self.invisibilityMode = true;
self.invisibilityDuration = 5000; // 5 seconds
heroGraphics.alpha = 0.3;
LK.getSound('powerUp').play();
};
self.activateMultiShot = function () {
self.multiShotMode = true;
self.multiShotDuration = 6000; // 6 seconds
LK.getSound('powerUp').play();
};
self.activateTimeSlow = function () {
self.timeSlowMode = true;
self.timeSlowDuration = 8000; // 8 seconds
timeSlowFactor = 0.3; // Slow down time
LK.getSound('timeSlow').play();
};
self.activateTimeStop = function () {
self.timeStopMode = true;
self.timeStopDuration = 3000; // 3 seconds
timeStopActive = true;
LK.getSound('timeStop').play();
};
self.activateTimeRewind = function () {
// Save current position and health for rewind
self.savedPosition.x = self.x;
self.savedPosition.y = self.y;
self.savedHealth = self.health;
self.timeRewindMode = true;
self.timeRewindDuration = 5000; // 5 seconds
LK.getSound('timeRewind').play();
};
self.activateLifeSteal = function () {
self.lifeStealMode = true;
self.lifeStealDuration = 10000; // 10 seconds
heroGraphics.tint = 0x8B0000; // Dark red tint
LK.getSound('powerUp').play();
};
self.activateBerserker = function () {
self.berserkerMode = true;
self.berserkerDuration = 8000; // 8 seconds
self.speed = self.normalSpeed * 2;
self.shootCooldown = 50; // Very fast shooting
heroGraphics.tint = 0xFF4500; // Orange red tint
LK.getSound('powerUp').play();
};
self.activateMagnet = function () {
self.magnetMode = true;
self.magnetDuration = 12000; // 12 seconds
heroGraphics.tint = 0x4169E1; // Blue tint
LK.getSound('powerUp').play();
};
self.activateReflect = function () {
self.reflectMode = true;
self.reflectDuration = 6000; // 6 seconds
heroGraphics.tint = 0x9932CC; // Purple tint
LK.getSound('powerUp').play();
};
self.activatePhoenix = function () {
self.phoenixMode = true;
self.phoenixDuration = 15000; // 15 seconds - one time revival
heroGraphics.tint = 0xFF6347; // Tomato red tint
LK.getSound('powerUp').play();
};
self.activateVampire = function () {
self.vampireMode = true;
self.vampireDuration = 10000; // 10 seconds
heroGraphics.tint = 0x800080; // Purple tint
LK.getSound('powerUp').play();
};
self.activateGodMode = function () {
self.godMode = true;
self.godModeDuration = 2000; // 2 seconds
heroGraphics.tint = 0xFFD700; // Gold tint
self.hasShield = true;
self.speed = self.normalSpeed * 1.5;
self.shootCooldown = 150; // Fast shooting but not ultra fast
LK.getSound('powerUp').play();
};
self.activateShadowStrike = function () {
self.shadowStrikeMode = true;
self.shadowStrikeDuration = 8000; // 8 seconds
heroGraphics.tint = 0x2f1b69; // Dark purple tint
self.speed = self.normalSpeed * 2.5;
self.shootCooldown = 100; // Fast shooting
LK.getSound('powerUp').play();
};
self.activateNecromancy = function () {
self.necromancyMode = true;
self.necromancyDuration = 12000; // 12 seconds
heroGraphics.tint = 0x1a0d1a; // Dark black tint
LK.getSound('powerUp').play();
};
self.activateAura = function () {
self.auraMode = true;
self.auraDuration = 10000; // 10 seconds
heroGraphics.tint = 0xffd43b; // Bright yellow tint
self.speed = self.normalSpeed * 1.8;
LK.getSound('powerUp').play();
};
self.activateChainLightning = function () {
self.chainLightningMode = true;
self.chainLightningDuration = 6000; // 6 seconds
heroGraphics.tint = 0x4a90e2; // Electric blue tint
LK.getSound('powerUp').play();
};
self.activateSummon = function () {
self.summonMode = true;
self.summonDuration = 15000; // 15 seconds
heroGraphics.tint = 0x7ed321; // Green tint
LK.getSound('powerUp').play();
};
self.activateMeteor = function () {
self.meteorMode = true;
self.meteorDuration = 8000; // 8 seconds
heroGraphics.tint = 0xd0021b; // Red tint
LK.getSound('powerUp').play();
};
self.activateBerserkAura = function () {
self.berserkAuraMode = true;
self.berserkAuraDuration = 10000; // 10 seconds
heroGraphics.tint = 0xf5a623; // Orange tint
self.speed = self.normalSpeed * 2.2;
self.shootCooldown = 60; // Very fast shooting
LK.getSound('powerUp').play();
};
self.activateDimensionRift = function () {
self.dimensionRiftMode = true;
self.dimensionRiftDuration = 7000; // 7 seconds
heroGraphics.tint = 0x9013fe; // Purple tint
LK.getSound('powerUp').play();
};
self.activateDivineBlast = function () {
self.divineBlastMode = true;
self.divineBlastDuration = 5000; // 5 seconds
heroGraphics.tint = 0xffffff; // White tint
self.shootCooldown = 50; // Fast shooting
LK.getSound('powerUp').play();
};
self.activateApocalypse = function () {
self.apocalypseMode = true;
self.apocalypseDuration = 6000; // 6 seconds
heroGraphics.tint = 0x000000; // Black tint
self.speed = self.normalSpeed * 1.5;
self.shootCooldown = 40; // Very fast shooting
LK.getSound('powerUp').play();
};
self.activateTitanShield = function () {
self.titanShieldMode = true;
self.titanShieldDuration = 12000; // 12 seconds
self.hasShield = true;
self.damage *= 2; // Double damage while shielded
heroGraphics.tint = 0x4169e1; // Blue steel tint
LK.getSound('powerUp').play();
};
self.activateBerserkRage = function () {
self.berserkRageMode = true;
self.berserkRageDuration = 8000; // 8 seconds
self.speed = self.normalSpeed * 3;
self.shootCooldown = 30; // Ultra fast shooting
self.damage *= 3; // Triple damage
heroGraphics.tint = 0x8b0000; // Dark red tint
LK.getSound('powerUp').play();
};
self.activateLightningStorm = function () {
self.lightningStormMode = true;
self.lightningStormDuration = 10000; // 10 seconds
heroGraphics.tint = 0xffff00; // Yellow tint
LK.getSound('powerUp').play();
};
self.activateBloodRain = function () {
self.bloodRainMode = true;
self.bloodRainDuration = 15000; // 15 seconds
heroGraphics.tint = 0x8b0000; // Blood red tint
LK.getSound('powerUp').play();
};
self.activateVoidWalker = function () {
self.voidWalkerMode = true;
self.voidWalkerDuration = 20000; // 20 seconds
heroGraphics.tint = 0x1a0033; // Deep void purple
self.hasShield = true;
self.speed = self.normalSpeed * 4;
self.shootCooldown = 20; // Ultra fast shooting
LK.getSound('powerUp').play();
};
self.activateCosmicRage = function () {
self.cosmicRageMode = true;
self.cosmicRageDuration = 18000; // 18 seconds
heroGraphics.tint = 0xff0099; // Cosmic pink
self.damage *= 5; // Quintuple damage
self.speed = self.normalSpeed * 3.5;
LK.getSound('powerUp').play();
};
self.activateSoulHarvest = function () {
self.soulHarvestMode = true;
self.soulHarvestDuration = 25000; // 25 seconds
heroGraphics.tint = 0x660066; // Soul purple
LK.getSound('powerUp').play();
};
self.activateTimeDistortion = function () {
self.timeDistortionMode = true;
self.timeDistortionDuration = 15000; // 15 seconds
heroGraphics.tint = 0x00ccff; // Time blue
timeSlowFactor = 0.1; // Extremely slow time
LK.getSound('powerUp').play();
};
self.activateElementalFury = function () {
self.elementalFuryMode = true;
self.elementalFuryDuration = 22000; // 22 seconds
heroGraphics.tint = 0xff6600; // Elemental orange
self.shootCooldown = 15; // Super fast shooting
LK.getSound('powerUp').play();
};
self.activateQuantumLeap = function () {
self.quantumLeapMode = true;
self.quantumLeapDuration = 20000; // 20 seconds
heroGraphics.tint = 0x00ff99; // Quantum green
self.speed = self.normalSpeed * 6;
LK.getSound('powerUp').play();
};
self.activateDragonBreath = function () {
self.dragonBreathMode = true;
self.dragonBreathDuration = 16000; // 16 seconds
heroGraphics.tint = 0xff3300; // Dragon red
LK.getSound('powerUp').play();
};
self.activateArcaneStorm = function () {
self.arcaneStormMode = true;
self.arcaneStormDuration = 24000; // 24 seconds
heroGraphics.tint = 0x9933ff; // Arcane purple
LK.getSound('powerUp').play();
};
self.activatePlasmaBurst = function () {
self.plasmaBurstMode = true;
self.plasmaBurstDuration = 14000; // 14 seconds
heroGraphics.tint = 0x00ffff; // Plasma cyan
self.shootCooldown = 10; // Extremely fast shooting
LK.getSound('powerUp').play();
};
self.activateGalaxyCollapse = function () {
self.galaxyCollapseMode = true;
self.galaxyCollapseDuration = 12000; // 12 seconds
heroGraphics.tint = 0x000066; // Galaxy dark blue
LK.getSound('powerUp').play();
};
self.activateInfinity = function () {
self.infinityMode = true;
self.infinityDuration = 10000; // 10 seconds
heroGraphics.tint = 0xffffff; // Infinity white
self.hasShield = true;
self.speed = self.normalSpeed * 3;
self.shootCooldown = 100; // Fast shooting
self.damage *= 2; // 2x damage
LK.getSound('powerUp').play();
};
self.activateOmegaDestruction = function () {
self.omegaDestructionMode = true;
self.omegaDestructionDuration = 8000; // 8 seconds
heroGraphics.tint = 0xff0000; // Omega red
LK.getSound('powerUp').play();
};
self.update = function () {
if (self.shieldDuration > 0) {
self.shieldDuration -= 16.67; // Approximately 60fps
if (self.shieldDuration <= 0) {
self.hasShield = false;
shieldGraphics.visible = false;
}
}
if (self.rapidFireDuration > 0) {
self.rapidFireDuration -= 16.67;
if (self.rapidFireDuration <= 0) {
self.rapidFire = false;
self.shootCooldown = self.normalShootCooldown;
}
}
if (self.hyperhargeDuration > 0) {
self.hyperhargeDuration -= 16.67;
if (self.hyperhargeDuration <= 0) {
self.hyperchargeMode = false;
self.speed = self.normalSpeed;
self.shootCooldown = self.normalShootCooldown;
heroGraphics.tint = 0xffffff;
}
}
if (self.invisibilityDuration > 0) {
self.invisibilityDuration -= 16.67;
if (self.invisibilityDuration <= 0) {
self.invisibilityMode = false;
heroGraphics.alpha = 1.0;
}
}
if (self.multiShotDuration > 0) {
self.multiShotDuration -= 16.67;
if (self.multiShotDuration <= 0) {
self.multiShotMode = false;
}
}
if (self.timeSlowDuration > 0) {
self.timeSlowDuration -= 16.67;
if (self.timeSlowDuration <= 0) {
self.timeSlowMode = false;
timeSlowFactor = 1.0; // Reset time speed
}
}
if (self.timeStopDuration > 0) {
self.timeStopDuration -= 16.67;
if (self.timeStopDuration <= 0) {
self.timeStopMode = false;
timeStopActive = false;
}
}
if (self.timeRewindDuration > 0) {
self.timeRewindDuration -= 16.67;
if (self.timeRewindDuration <= 0) {
self.timeRewindMode = false;
// Execute rewind effect
self.x = self.savedPosition.x;
self.y = self.savedPosition.y;
self.health = self.savedHealth;
tween(self, {
alpha: 0.5
}, {
duration: 300,
onFinish: function onFinish() {
tween(self, {
alpha: 1.0
}, {
duration: 300
});
}
});
}
}
if (self.explosiveShotDuration > 0) {
self.explosiveShotDuration -= 16.67;
if (self.explosiveShotDuration <= 0) {
self.explosiveShotMode = false;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.lifeStealDuration > 0) {
self.lifeStealDuration -= 16.67;
if (self.lifeStealDuration <= 0) {
self.lifeStealMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.berserkerDuration > 0) {
self.berserkerDuration -= 16.67;
if (self.berserkerDuration <= 0) {
self.berserkerMode = false;
self.speed = self.normalSpeed;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.magnetDuration > 0) {
self.magnetDuration -= 16.67;
if (self.magnetDuration <= 0) {
self.magnetMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.reflectDuration > 0) {
self.reflectDuration -= 16.67;
if (self.reflectDuration <= 0) {
self.reflectMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.phoenixDuration > 0) {
self.phoenixDuration -= 16.67;
if (self.phoenixDuration <= 0) {
self.phoenixMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.vampireDuration > 0) {
self.vampireDuration -= 16.67;
if (self.vampireDuration <= 0) {
self.vampireMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.godModeDuration > 0) {
self.godModeDuration -= 16.67;
if (self.godModeDuration <= 0) {
self.godMode = false;
self.hasShield = false;
self.speed = self.normalSpeed;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.shadowStrikeDuration > 0) {
self.shadowStrikeDuration -= 16.67;
if (self.shadowStrikeDuration <= 0) {
self.shadowStrikeMode = false;
self.speed = self.normalSpeed;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.necromancyDuration > 0) {
self.necromancyDuration -= 16.67;
if (self.necromancyDuration <= 0) {
self.necromancyMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.auraDuration > 0) {
self.auraDuration -= 16.67;
if (self.auraDuration <= 0) {
self.auraMode = false;
self.speed = self.normalSpeed;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.chainLightningDuration > 0) {
self.chainLightningDuration -= 16.67;
if (self.chainLightningDuration <= 0) {
self.chainLightningMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.summonDuration > 0) {
self.summonDuration -= 16.67;
if (self.summonDuration <= 0) {
self.summonMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.meteorDuration > 0) {
self.meteorDuration -= 16.67;
if (self.meteorDuration <= 0) {
self.meteorMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.berserkAuraDuration > 0) {
self.berserkAuraDuration -= 16.67;
if (self.berserkAuraDuration <= 0) {
self.berserkAuraMode = false;
self.speed = self.normalSpeed;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.dimensionRiftDuration > 0) {
self.dimensionRiftDuration -= 16.67;
if (self.dimensionRiftDuration <= 0) {
self.dimensionRiftMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.divineBlastDuration > 0) {
self.divineBlastDuration -= 16.67;
if (self.divineBlastDuration <= 0) {
self.divineBlastMode = false;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.apocalypseDuration > 0) {
self.apocalypseDuration -= 16.67;
if (self.apocalypseDuration <= 0) {
self.apocalypseMode = false;
self.speed = self.normalSpeed;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.titanShieldDuration > 0) {
self.titanShieldDuration -= 16.67;
if (self.titanShieldDuration <= 0) {
self.titanShieldMode = false;
self.hasShield = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.berserkRageDuration > 0) {
self.berserkRageDuration -= 16.67;
if (self.berserkRageDuration <= 0) {
self.berserkRageMode = false;
self.speed = self.normalSpeed;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.lightningStormDuration > 0) {
self.lightningStormDuration -= 16.67;
if (self.lightningStormDuration <= 0) {
self.lightningStormMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.bloodRainDuration > 0) {
self.bloodRainDuration -= 16.67;
if (self.bloodRainDuration <= 0) {
self.bloodRainMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.voidWalkerDuration > 0) {
self.voidWalkerDuration -= 16.67;
if (self.voidWalkerDuration <= 0) {
self.voidWalkerMode = false;
self.hasShield = false;
self.speed = self.normalSpeed;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.cosmicRageDuration > 0) {
self.cosmicRageDuration -= 16.67;
if (self.cosmicRageDuration <= 0) {
self.cosmicRageMode = false;
self.speed = self.normalSpeed;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.soulHarvestDuration > 0) {
self.soulHarvestDuration -= 16.67;
if (self.soulHarvestDuration <= 0) {
self.soulHarvestMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.timeDistortionDuration > 0) {
self.timeDistortionDuration -= 16.67;
if (self.timeDistortionDuration <= 0) {
self.timeDistortionMode = false;
timeSlowFactor = 1.0;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.elementalFuryDuration > 0) {
self.elementalFuryDuration -= 16.67;
if (self.elementalFuryDuration <= 0) {
self.elementalFuryMode = false;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.quantumLeapDuration > 0) {
self.quantumLeapDuration -= 16.67;
if (self.quantumLeapDuration <= 0) {
self.quantumLeapMode = false;
self.speed = self.normalSpeed;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.dragonBreathDuration > 0) {
self.dragonBreathDuration -= 16.67;
if (self.dragonBreathDuration <= 0) {
self.dragonBreathMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.arcaneStormDuration > 0) {
self.arcaneStormDuration -= 16.67;
if (self.arcaneStormDuration <= 0) {
self.arcaneStormMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.plasmaBurstDuration > 0) {
self.plasmaBurstDuration -= 16.67;
if (self.plasmaBurstDuration <= 0) {
self.plasmaBurstMode = false;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.galaxyCollapseDuration > 0) {
self.galaxyCollapseDuration -= 16.67;
if (self.galaxyCollapseDuration <= 0) {
self.galaxyCollapseMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.infinityDuration > 0) {
self.infinityDuration -= 16.67;
if (self.infinityDuration <= 0) {
self.infinityMode = false;
self.hasShield = false;
self.speed = self.normalSpeed;
self.shootCooldown = self.normalShootCooldown;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
if (self.omegaDestructionDuration > 0) {
self.omegaDestructionDuration -= 16.67;
if (self.omegaDestructionDuration <= 0) {
self.omegaDestructionMode = false;
tween(heroGraphics, {
tint: 0xffffff
}, {
duration: 500
});
}
}
};
return self;
});
var HeroBase = Container.expand(function () {
var self = Container.call(this);
var baseGraphics = self.attachAsset('heroBase', {
anchorX: 0.5,
anchorY: 0.5
});
self.turrets = [];
self.initializeTurrets = function () {
// Create 4 turrets around the base
var turretPositions = [{
x: -60,
y: -60
}, {
x: 60,
y: -60
}, {
x: -60,
y: 60
}, {
x: 60,
y: 60
}];
for (var i = 0; i < turretPositions.length; i++) {
var turret = new BaseTurret();
turret.x = self.x + turretPositions[i].x;
turret.y = self.y + turretPositions[i].y;
self.turrets.push(turret);
game.addChild(turret);
}
};
self.isHeroInSafeZone = function (heroX, heroY) {
var dx = heroX - self.x;
var dy = heroY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
return distance <= 120;
};
self.update = function () {
// Update turret positions relative to base
for (var i = 0; i < self.turrets.length; i++) {
var turret = self.turrets[i];
turret.update();
}
};
return self;
});
var Lion = Container.expand(function () {
var self = Container.call(this);
var lionGraphics = self.attachAsset('lion', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2.0;
self.damage = 45;
self.health = 120;
self.maxHealth = 120;
self.roarTimer = 0;
self.takeDamage = function (damage) {
self.health -= damage;
tween(lionGraphics, {
tint: 0xff0000
}, {
duration: 100
});
tween(lionGraphics, {
tint: 0xffffff
}, {
duration: 100
});
if (self.health <= 0) {
return true;
}
return false;
};
self.update = function () {
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.roarTimer++;
if (self.roarTimer > 90) {
self.roarTimer = 0;
// Roar effect - speeds up briefly
self.x += dx / distance * self.speed * 3;
self.y += dy / distance * self.speed * 3;
} else {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
}
};
return self;
});
var MiracleMenu = Container.expand(function () {
var self = Container.call(this);
var menuBg = LK.getAsset('baseMenu', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x2c2c2c,
width: 2048,
height: 2732
});
self.isVisible = false;
self.visible = false;
self.buttons = [];
self.buttonTexts = [];
self.miracleIcons = [];
self.createMiracleButtons = function () {
// Clear existing buttons
for (var i = 0; i < self.buttons.length; i++) {
if (self.buttons[i]) self.buttons[i].destroy();
}
for (var i = 0; i < self.buttonTexts.length; i++) {
if (self.buttonTexts[i]) self.buttonTexts[i].destroy();
}
for (var i = 0; i < self.miracleIcons.length; i++) {
if (self.miracleIcons[i]) self.miracleIcons[i].destroy();
}
self.buttons = [];
self.buttonTexts = [];
self.miracleIcons = [];
// Add title
var titleText = new Text2('STORED MIRACLES - CLICK TO USE', {
size: 70,
fill: 0xFFD700
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 0;
titleText.y = -300;
self.addChild(titleText);
// Add miracle count
var countText = new Text2('(' + storedMiracles.length + '/' + maxStoredMiracles + ')', {
size: 50,
fill: 0xFFFF00
});
countText.anchor.set(0.5, 0.5);
countText.x = 0;
countText.y = -250;
self.addChild(countText);
// Create buttons for each stored miracle
var startY = -150;
var buttonWidth = 600;
var buttonHeight = 80;
for (var i = 0; i < storedMiracles.length; i++) {
var miracleType = storedMiracles[i];
var button = LK.getAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x4444ff,
width: buttonWidth,
height: buttonHeight
});
button.x = 0;
button.y = startY + i * 100;
button.miracleType = miracleType;
button.miracleIndex = i;
self.addChild(button);
self.buttons.push(button);
// Create miracle icon
var miracleIcon = createMiracleIcon(miracleType);
miracleIcon.x = -200;
miracleIcon.y = startY + i * 100;
self.addChild(miracleIcon);
self.miracleIcons.push(miracleIcon);
// Create button text
var buttonText = new Text2(miracleType.toUpperCase(), {
size: 40,
fill: 0xffffff
});
buttonText.anchor.set(0.5, 0.5);
buttonText.x = 0;
buttonText.y = startY + i * 100;
self.addChild(buttonText);
self.buttonTexts.push(buttonText);
}
// Add activate all button
var activateAllButton = LK.getAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xff6600,
width: 450,
height: 80
});
activateAllButton.x = 0;
activateAllButton.y = startY + storedMiracles.length * 100 + 50;
activateAllButton.actionType = 'activateAll';
self.addChild(activateAllButton);
self.buttons.push(activateAllButton);
var activateAllText = new Text2('ACTIVATE ALL', {
size: 40,
fill: 0xffffff
});
activateAllText.anchor.set(0.5, 0.5);
activateAllText.x = 0;
activateAllText.y = startY + storedMiracles.length * 100 + 50;
self.addChild(activateAllText);
self.buttonTexts.push(activateAllText);
// Add movement freedom button
var movementButton = LK.getAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x00aa00,
width: 400,
height: 80
});
movementButton.x = 0;
movementButton.y = startY + storedMiracles.length * 100 + 100;
movementButton.actionType = 'freeMovement';
self.addChild(movementButton);
self.buttons.push(movementButton);
var movementText = new Text2('FREE MOVEMENT', {
size: 40,
fill: 0xffffff
});
movementText.anchor.set(0.5, 0.5);
movementText.x = 0;
movementText.y = startY + storedMiracles.length * 100 + 100;
self.addChild(movementText);
self.buttonTexts.push(movementText);
// Add close button
var closeButton = LK.getAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xff4444,
width: 200,
height: 60
});
closeButton.x = 0;
closeButton.y = startY + storedMiracles.length * 100 + 200;
closeButton.actionType = 'close';
self.addChild(closeButton);
self.buttons.push(closeButton);
var closeText = new Text2('CLOSE', {
size: 30,
fill: 0xffffff
});
closeText.anchor.set(0.5, 0.5);
closeText.x = 0;
closeText.y = startY + storedMiracles.length * 100 + 200;
self.addChild(closeText);
self.buttonTexts.push(closeText);
};
self.show = function () {
self.isVisible = true;
self.visible = true;
self.alpha = 0;
self.scaleX = 0.8;
self.scaleY = 0.8;
// Remove gamePaused = true to keep enemies spawning
self.createMiracleButtons();
tween(self, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 300
});
};
self.hide = function () {
self.isVisible = false;
// Remove gamePaused = false since game is not paused
tween(self, {
alpha: 0,
scaleX: 0.8,
scaleY: 0.8
}, {
duration: 300,
onFinish: function onFinish() {
self.visible = false;
}
});
};
self.down = function (x, y, obj) {
if (!self.isVisible) return;
// Convert screen coordinates to local menu coordinates
var localX = x - self.x;
var localY = y - self.y;
for (var i = 0; i < self.buttons.length; i++) {
var button = self.buttons[i];
var dx = localX - button.x;
var dy = localY - button.y;
var buttonWidth = button.actionType === 'close' ? 100 : button.actionType === 'freeMovement' ? 200 : button.actionType === 'activateAll' ? 225 : 300;
var buttonHeight = button.actionType === 'close' ? 30 : 40;
if (Math.abs(dx) <= buttonWidth && Math.abs(dy) <= buttonHeight) {
if (button.actionType === 'close') {
self.hide();
} else if (button.actionType === 'freeMovement') {
self.hide();
// Teleport hero away from base
var teleportX = Math.random() * (2048 - 200) + 100;
var teleportY = Math.random() * (2732 - 400) + 200;
// Ensure not too close to base
while (Math.sqrt((teleportX - heroBase.x) * (teleportX - heroBase.x) + (teleportY - heroBase.y) * (teleportY - heroBase.y)) < 300) {
teleportX = Math.random() * (2048 - 200) + 100;
teleportY = Math.random() * (2732 - 400) + 200;
}
hero.x = teleportX;
hero.y = teleportY;
LK.getSound('teleport').play();
} else if (button.actionType === 'activateAll') {
// Activate all stored miracles
for (var j = storedMiracles.length - 1; j >= 0; j--) {
useStoredMiracle(j);
}
self.hide();
// Teleport hero away from base
var teleportX = Math.random() * (2048 - 200) + 100;
var teleportY = Math.random() * (2732 - 400) + 200;
// Ensure not too close to base
while (Math.sqrt((teleportX - heroBase.x) * (teleportX - heroBase.x) + (teleportY - heroBase.y) * (teleportY - heroBase.y)) < 300) {
teleportX = Math.random() * (2048 - 200) + 100;
teleportY = Math.random() * (2732 - 400) + 200;
}
hero.x = teleportX;
hero.y = teleportY;
LK.getSound('teleport').play();
} else if (button.miracleType) {
// Use stored miracle
useStoredMiracle(button.miracleIndex);
self.hide();
// Teleport hero away from base
var teleportX = Math.random() * (2048 - 200) + 100;
var teleportY = Math.random() * (2732 - 400) + 200;
// Ensure not too close to base
while (Math.sqrt((teleportX - heroBase.x) * (teleportX - heroBase.x) + (teleportY - heroBase.y) * (teleportY - heroBase.y)) < 300) {
teleportX = Math.random() * (2048 - 200) + 100;
teleportY = Math.random() * (2732 - 400) + 200;
}
hero.x = teleportX;
hero.y = teleportY;
LK.getSound('teleport').play();
}
break;
}
}
};
self.alpha = 0;
self.scaleX = 0.8;
self.scaleY = 0.8;
return self;
});
var MiracleToken = Container.expand(function () {
var self = Container.call(this);
var tokenGraphics;
self.type = 'speed'; // speed, shield, rapidFire, freeze, explosion, healing
self.bobOffset = Math.random() * Math.PI * 2;
self.startY = 0;
self.setTokenType = function (type) {
self.type = type;
if (type === 'freeze') {
tokenGraphics = self.attachAsset('freezeToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'explosion') {
tokenGraphics = self.attachAsset('explosionToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'healing') {
tokenGraphics = self.attachAsset('healingToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'hypercharge') {
tokenGraphics = self.attachAsset('hyperchargeToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'teleport') {
tokenGraphics = self.attachAsset('teleportToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'invisibility') {
tokenGraphics = self.attachAsset('invisibilityToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'multiShot') {
tokenGraphics = self.attachAsset('multiShotToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'timeSlow') {
tokenGraphics = self.attachAsset('timeSlowToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'timeStop') {
tokenGraphics = self.attachAsset('timeStopToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'timeRewind') {
tokenGraphics = self.attachAsset('timeRewindToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'lifeSteal') {
tokenGraphics = self.attachAsset('lifeStealToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'berserker') {
tokenGraphics = self.attachAsset('berserkerToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'magnet') {
tokenGraphics = self.attachAsset('magnetToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'reflect') {
tokenGraphics = self.attachAsset('reflectToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'phoenix') {
tokenGraphics = self.attachAsset('phoenixToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'vampire') {
tokenGraphics = self.attachAsset('vampireToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'godMode') {
tokenGraphics = self.attachAsset('godModeToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'shadowStrike') {
tokenGraphics = self.attachAsset('shadowStrikeToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'necromancy') {
tokenGraphics = self.attachAsset('necromancyToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'aura') {
tokenGraphics = self.attachAsset('auraToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'chainLightning') {
tokenGraphics = self.attachAsset('chainLightningToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'summon') {
tokenGraphics = self.attachAsset('summonToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'meteor') {
tokenGraphics = self.attachAsset('meteorToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'berserkAura') {
tokenGraphics = self.attachAsset('berserkAuraToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'dimensionRift') {
tokenGraphics = self.attachAsset('dimensionRiftToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'divineBlast') {
tokenGraphics = self.attachAsset('divineBlastToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'apocalypse') {
tokenGraphics = self.attachAsset('apocalypseToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'titanShield') {
tokenGraphics = self.attachAsset('titanShieldToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'berserkRage') {
tokenGraphics = self.attachAsset('berserkRageToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'lightningStorm') {
tokenGraphics = self.attachAsset('lightningStormToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'bloodRain') {
tokenGraphics = self.attachAsset('bloodRainToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else {
tokenGraphics = self.attachAsset('miracleToken', {
anchorX: 0.5,
anchorY: 0.5
});
}
};
// Initialize with default token
self.setTokenType('speed');
self.update = function () {
// Bobbing animation
self.y = self.startY + Math.sin(LK.ticks * 0.1 + self.bobOffset) * 10;
// Rotate
tokenGraphics.rotation += 0.05;
};
return self;
});
var Tiger = Container.expand(function () {
var self = Container.call(this);
var tigerGraphics = self.attachAsset('tiger', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3.5;
self.damage = 55;
self.health = 140;
self.maxHealth = 140;
self.prowlTimer = 0;
self.isStealthed = false;
self.takeDamage = function (damage) {
self.health -= damage;
tween(tigerGraphics, {
tint: 0xff0000
}, {
duration: 100
});
tween(tigerGraphics, {
tint: 0xffffff
}, {
duration: 100
});
if (self.health <= 0) {
return true;
}
return false;
};
self.update = function () {
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.prowlTimer++;
if (self.prowlTimer > 120 && !self.isStealthed) {
self.isStealthed = true;
self.prowlTimer = 0;
tigerGraphics.alpha = 0.3;
tween(self, {
x: hero.x + dx / distance * 200,
y: hero.y + dy / distance * 200
}, {
duration: 800,
onFinish: function onFinish() {
self.isStealthed = false;
tigerGraphics.alpha = 1.0;
}
});
} else if (!self.isStealthed) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
}
};
return self;
});
var TitanBear = Container.expand(function () {
var self = Container.call(this);
var titanGraphics = self.attachAsset('bear', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.5,
scaleY: 2.5
});
titanGraphics.tint = 0x8B0000; // Dark red tint
self.speed = 0.8;
self.damage = 40;
self.health = 150;
self.maxHealth = 150;
self.earthQuakeTimer = 0;
self.roarTimer = 0;
self.isBoss = true;
self.takeDamage = function (damage) {
self.health -= damage;
createBloodSplatter(self.x, self.y, Math.min(damage / 8, 20));
tween(titanGraphics, {
tint: 0xff0000
}, {
duration: 150
});
tween(titanGraphics, {
tint: 0x8B0000
}, {
duration: 150
});
if (self.health <= 0) {
createBloodSplatter(self.x, self.y, 25);
return true;
}
return false;
};
self.update = function () {
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.earthQuakeTimer++;
self.roarTimer++;
// Earthquake attack every 8 seconds
if (self.earthQuakeTimer > 480) {
self.earthQuakeTimer = 0;
// Screen shake effect
tween(game, {
x: game.x + 15
}, {
duration: 100
});
tween(game, {
x: game.x - 15
}, {
duration: 100
});
tween(game, {
x: game.x
}, {
duration: 100
});
// Damage hero if close
if (distance < 400) {
hero.takeDamage(50);
LK.effects.flashScreen(0x8B4513, 600);
}
}
// Intimidating roar every 5 seconds
if (self.roarTimer > 300) {
self.roarTimer = 0;
LK.effects.flashScreen(0x8B0000, 400);
// Slow down hero temporarily
var originalSpeed = hero.speed;
hero.speed *= 0.5;
LK.setTimeout(function () {
hero.speed = originalSpeed;
}, 2000);
}
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
var UltiOptiMegaToken = Container.expand(function () {
var self = Container.call(this);
var tokenGraphics = self.attachAsset('ultioptimegaToken', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'ultioptimega';
self.bobOffset = Math.random() * Math.PI * 2;
self.startY = 0;
// Enhanced visual effects
tokenGraphics.tint = 0x9900ff; // Purple tint
self.particleTimer = 0;
self.update = function () {
// Enhanced bobbing animation with pulsing effect
self.y = self.startY + Math.sin(LK.ticks * 0.15 + self.bobOffset) * 15;
// Pulsing scale animation
var scale = 1 + Math.sin(LK.ticks * 0.1) * 0.3;
tokenGraphics.scaleX = scale;
tokenGraphics.scaleY = scale;
// Faster rotation
tokenGraphics.rotation += 0.1;
// Create particle effects around token
self.particleTimer++;
if (self.particleTimer > 10) {
self.particleTimer = 0;
createBloodSplatter(self.x + (Math.random() - 0.5) * 60, self.y + (Math.random() - 0.5) * 60, 3);
}
};
return self;
});
var Wolf = Container.expand(function () {
var self = Container.call(this);
var wolfGraphics = self.attachAsset('wolf', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3.2;
self.damage = 50;
self.health = 110;
self.maxHealth = 110;
self.packTimer = 0;
self.howlTimer = 0;
self.lastTrailX = 0;
self.lastTrailY = 0;
self.trailTimer = 0;
self.isWounded = false;
self.takeDamage = function (damage) {
self.health -= damage;
self.isWounded = true;
// Create blood trail when damaged
createBloodTrail(self.x, self.y);
tween(wolfGraphics, {
tint: 0xff0000
}, {
duration: 100
});
tween(wolfGraphics, {
tint: 0xffffff
}, {
duration: 100
});
if (self.health <= 0) {
return true;
}
return false;
};
self.update = function () {
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.howlTimer++;
if (self.howlTimer > 150) {
self.howlTimer = 0;
for (var i = 0; i < enemies.length; i++) {
var otherEnemy = enemies[i];
if (otherEnemy !== self && otherEnemy.type === 'wolf') {
var dist = Math.sqrt((otherEnemy.x - self.x) * (otherEnemy.x - self.x) + (otherEnemy.y - self.y) * (otherEnemy.y - self.y));
if (dist < 200) {
otherEnemy.speed = Math.min(otherEnemy.speed * 1.2, 5.0);
}
}
}
}
// Create blood trail if wounded and moving
if (self.isWounded) {
self.trailTimer++;
if (self.trailTimer > 8) {
// Create trail every 8 frames
var moveDistance = Math.sqrt((self.x - self.lastTrailX) * (self.x - self.lastTrailX) + (self.y - self.lastTrailY) * (self.y - self.lastTrailY));
if (moveDistance > 15) {
createBloodTrail(self.x, self.y);
self.lastTrailX = self.x;
self.lastTrailY = self.y;
self.trailTimer = 0;
}
}
}
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22 // Forest green background
});
/****
* Game Code
****/
// Sound effects
// UI elements
// Projectiles and power-ups
// Farm animal enemies
// Hero character
// Game state variables
var hero;
var enemies = [];
var bullets = [];
var miracleTokens = [];
var gameState = 'playing'; // playing, gameOver
var currentWave = 1;
var enemiesInWave = 3;
var enemiesSpawned = 0;
var waveSpawnTimer = 0;
var nextWaveTimer = 0;
var miracleTokenCount = 0;
var lastAutoShoot = 0;
var dragNode = null;
var frozenEnemies = [];
var freezeDuration = 0;
var heroBase;
var baseBullets = [];
var bossSpawned = false;
var bloodParticles = [];
var bloodTrails = [];
var miracleMenu;
var controlledAnimal = null;
var controlledAnimalType = '';
var controlledAnimalDuration = 0;
var bossLevels = [1000, 2500, 5000, 8000, 12000];
var currentBossLevel = 0;
var erdo = null;
var erdoLastActivated = 0;
var erdoCooldown = 15000; // 15 seconds cooldown between activations
var erdoRevivalAvailable = false;
var heroRevivalShots = 0;
var heroRevivalShotCooldown = 0;
// UI elements
var healthBar;
var healthBarBg;
var scoreTxt;
var waveTxt;
var miracleCountTxt;
// Initialize UI
function initializeUI() {
// Health bar background (dark background)
healthBarBg = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0,
tint: 0x333333,
width: 250,
height: 30
});
// Health bar foreground (actual health)
healthBar = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0,
tint: 0x00ff00,
width: 240,
height: 25
});
// Health bar border/frame
var healthBarFrame = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0,
tint: 0xffffff,
width: 250,
height: 30
});
LK.gui.topLeft.addChild(healthBarBg);
LK.gui.topLeft.addChild(healthBar);
LK.gui.topLeft.addChild(healthBarFrame);
healthBarBg.x = 120;
healthBarBg.y = 20;
healthBar.x = 125;
healthBar.y = 22.5;
healthBarFrame.x = 120;
healthBarFrame.y = 20;
// Make frame just an outline
healthBarFrame.alpha = 0.8;
// Score text
scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Wave text
waveTxt = new Text2('Wave: 1', {
size: 50,
fill: 0xFFFF00
});
waveTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(waveTxt);
waveTxt.x = -20;
waveTxt.y = 20;
// Miracle token count
miracleCountTxt = new Text2('Miracles: 0', {
size: 45,
fill: 0xFFD700
});
miracleCountTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(miracleCountTxt);
miracleCountTxt.x = -20;
miracleCountTxt.y = 80;
}
// Initialize hero
function initializeHero() {
hero = game.addChild(new Hero());
hero.x = 2048 / 2;
hero.y = 2732 / 2;
}
// Spawn enemy
function spawnEnemy() {
// Don't spawn enemies during evil erdo battle
if (evilErdoBattleActive) return;
var enemy;
var rand = Math.random();
// Count current bosses to limit to maximum 1 to prevent crashes
var currentBossCount = 0;
for (var i = 0; i < enemies.length; i++) {
if (enemies[i].isBoss || enemies[i].isOmega) {
currentBossCount++;
}
}
// Check if boss should spawn at different levels - much more reduced frequency
var shouldSpawnBoss = false;
var bossType = 'hyperChicken';
// Only spawn boss if we have no bosses currently
if (currentBossCount === 0) {
// Significantly increase boss spawn thresholds for much less frequent bosses
var reducedBossLevels = [2000, 4500, 7500, 12000, 18000, 25000, 35000, 50000, 70000, 100000];
for (var b = 0; b < reducedBossLevels.length; b++) {
if (LK.getScore() >= reducedBossLevels[b] && currentBossLevel <= b) {
shouldSpawnBoss = true;
currentBossLevel = b + 1;
// More boss variety including wind and magma bosses
var bossTypes = ['hyperChicken', 'omegaSheep', 'omegaCow', 'omegaChicken', 'omegaPig', 'hyperCow', 'hyperSheep', 'windBoss', 'magmaBoss', 'titanBear'];
bossType = bossTypes[b % bossTypes.length];
break;
}
}
// Drastically reduce random boss spawn chance
if (!shouldSpawnBoss && currentWave >= 8) {
var bossChance = Math.min(0.015 + currentWave * 0.002, 0.04);
if (Math.random() < bossChance) {
shouldSpawnBoss = true;
var omegaTypes = ['omegaSheep', 'omegaCow', 'omegaChicken', 'omegaPig', 'windBoss', 'magmaBoss', 'titanBear'];
bossType = omegaTypes[Math.floor(Math.random() * omegaTypes.length)];
}
}
}
if (shouldSpawnBoss) {
enemy = new Enemy(bossType);
// Trigger wind event when wind boss spawns
if (bossType === 'windBoss') {
LK.getSound('windevent').play();
windEventActive = true;
windEventDuration = 30000; // 30 seconds
}
// Trigger magma event when magma boss spawns
if (bossType === 'magmaBoss') {
LK.playMusic('magma_event');
magmaEventActive = true;
magmaEventDuration = 15000; // 15 seconds - reduced from 30
}
// Special spawning for Titan Bear
if (bossType === 'titanBear') {
enemy = new TitanBear();
LK.effects.flashScreen(0x8B0000, 800);
}
} else if (currentWave <= 2) {
enemy = new Enemy('sheep');
} else if (currentWave <= 4) {
if (rand < 0.7) {
enemy = new Enemy('sheep');
} else {
enemy = new Enemy('chicken');
}
} else {
// More aggressive spawn distribution with higher chance of stronger enemies
if (rand < 0.05) {
enemy = new Enemy('sheep');
} else if (rand < 0.10) {
enemy = new Enemy('chicken');
} else if (rand < 0.15) {
enemy = new Enemy('cow');
} else if (rand < 0.20) {
enemy = new Enemy('chick');
} else if (rand < 0.25) {
enemy = new Enemy('snake');
} else if (rand < 0.30) {
enemy = new Enemy('mouse');
} else if (rand < 0.35) {
enemy = new Enemy('pig');
} else if (rand < 0.40) {
enemy = new Enemy('goat');
} else if (rand < 0.45) {
enemy = new Enemy('duck');
} else if (rand < 0.50) {
enemy = new Enemy('rabbit');
} else if (rand < 0.65) {
enemy = new Enemy('hyperSheep');
} else if (rand < 0.80) {
enemy = new Enemy('hyperCow');
} else if (rand < 0.90) {
enemy = new Enemy('hyperChicken');
} else if (rand < 0.93) {
// Add new violent animal types
enemy = new Lion();
} else if (rand < 0.96) {
enemy = new Tiger();
} else if (rand < 0.98) {
enemy = new Wolf();
} else if (rand < 0.995) {
enemy = new Bear();
} else {
enemy = new Elephant();
}
}
// Spawn from random edge
var side = Math.floor(Math.random() * 4);
if (side === 0) {
// Top
enemy.x = Math.random() * 2048;
enemy.y = -50;
} else if (side === 1) {
// Right
enemy.x = 2048 + 50;
enemy.y = Math.random() * 2732;
} else if (side === 2) {
// Bottom
enemy.x = Math.random() * 2048;
enemy.y = 2732 + 50;
} else {
// Left
enemy.x = -50;
enemy.y = Math.random() * 2732;
}
enemies.push(enemy);
game.addChild(enemy);
}
// Create bullet towards nearest enemy
function shootAtNearestEnemy() {
if (enemies.length === 0) return;
var nearestEnemy = null;
var nearestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - hero.x;
var dy = enemy.y - hero.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < nearestDistance) {
nearestDistance = distance;
nearestEnemy = enemy;
}
}
if (nearestEnemy) {
if (hero.explosiveShotMode) {
// Fire 3 explosive bullets in spread pattern
for (var i = -1; i <= 1; i++) {
var bullet = new ExplosiveBullet();
bullet.x = hero.x;
bullet.y = hero.y;
var angle = Math.atan2(nearestEnemy.y - hero.y, nearestEnemy.x - hero.x) + i * 0.25;
var targetX = hero.x + Math.cos(angle) * 500;
var targetY = hero.y + Math.sin(angle) * 500;
bullet.setTarget(targetX, targetY);
bullets.push(bullet);
game.addChild(bullet);
}
} else if (hero.multiShotMode) {
// Fire 3 bullets in spread pattern
for (var i = -1; i <= 1; i++) {
var bullet = new Bullet();
bullet.x = hero.x;
bullet.y = hero.y;
var angle = Math.atan2(nearestEnemy.y - hero.y, nearestEnemy.x - hero.x) + i * 0.3;
var targetX = hero.x + Math.cos(angle) * 500;
var targetY = hero.y + Math.sin(angle) * 500;
bullet.setTarget(targetX, targetY);
bullets.push(bullet);
game.addChild(bullet);
}
} else {
var bullet = new Bullet();
bullet.x = hero.x;
bullet.y = hero.y;
bullet.setTarget(nearestEnemy.x, nearestEnemy.y);
bullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
}
}
// Create blood splatter effect
function createBloodSplatter(x, y, intensity) {
// Drastically limit blood particles to prevent crashes
if (bloodParticles.length > 20) return;
intensity = intensity || 3;
// Significantly reduce intensity to prevent memory overflow
intensity = Math.min(intensity, 4);
// Only create blood effects every few frames to reduce load
if (LK.ticks % 3 !== 0) return;
for (var i = 0; i < intensity; i++) {
var blood = new BloodParticle();
blood.x = x + (Math.random() - 0.5) * 40;
blood.y = y + (Math.random() - 0.5) * 40;
// Reduce velocity variation
blood.velocityX = (Math.random() - 0.5) * 12;
blood.velocityY = (Math.random() - 0.5) * 12;
// Much shorter life to free memory faster
blood.life = 30;
blood.maxLife = 30;
bloodParticles.push(blood);
game.addChild(blood);
}
// Remove screen shake to reduce processing
}
// Create blood trail effect
function createBloodTrail(x, y) {
// Drastically limit blood trails to prevent crashes
if (bloodTrails.length > 15) return;
// Only create trails every few frames to reduce load
if (LK.ticks % 5 !== 0) return;
var trail = new BloodTrail();
trail.x = x + (Math.random() - 0.5) * 10;
trail.y = y + (Math.random() - 0.5) * 10;
bloodTrails.push(trail);
game.addChild(trail);
}
// Create miracle token
function createMiracleToken(x, y) {
var token = new MiracleToken();
token.x = x;
token.y = y;
token.startY = y;
var rand = Math.random();
if (rand < 0.05) {
token.setTokenType('speed');
} else if (rand < 0.10) {
token.setTokenType('shield');
} else if (rand < 0.15) {
token.setTokenType('rapidFire');
} else if (rand < 0.20) {
token.setTokenType('freeze');
} else if (rand < 0.25) {
token.setTokenType('explosion');
} else if (rand < 0.30) {
token.setTokenType('healing');
} else if (rand < 0.35) {
token.setTokenType('hypercharge');
} else if (rand < 0.40) {
token.setTokenType('teleport');
} else if (rand < 0.45) {
token.setTokenType('invisibility');
} else if (rand < 0.50) {
token.setTokenType('multiShot');
} else if (rand < 0.55) {
token.setTokenType('timeSlow');
} else if (rand < 0.60) {
token.setTokenType('timeStop');
} else if (rand < 0.65) {
token.setTokenType('timeRewind');
} else if (rand < 0.70) {
token.setTokenType('lifeSteal');
} else if (rand < 0.75) {
token.setTokenType('berserker');
} else if (rand < 0.80) {
token.setTokenType('magnet');
} else if (rand < 0.85) {
token.setTokenType('reflect');
} else if (rand < 0.90) {
token.setTokenType('phoenix');
} else if (rand < 0.87) {
token.setTokenType('vampire');
} else if (rand < 0.885) {
token.setTokenType('shadowStrike');
} else if (rand < 0.90) {
token.setTokenType('necromancy');
} else if (rand < 0.915) {
token.setTokenType('aura');
} else if (rand < 0.93) {
token.setTokenType('chainLightning');
} else if (rand < 0.945) {
token.setTokenType('summon');
} else if (rand < 0.96) {
token.setTokenType('meteor');
} else if (rand < 0.975) {
token.setTokenType('berserkAura');
} else if (rand < 0.987) {
token.setTokenType('dimensionRift');
} else if (rand < 0.995) {
token.setTokenType('divineBlast');
} else if (rand < 0.997) {
token.setTokenType('apocalypse');
} else if (rand < 0.9975) {
token.setTokenType('titanShield');
} else if (rand < 0.998) {
token.setTokenType('berserkRage');
} else if (rand < 0.9985) {
token.setTokenType('lightningStorm');
} else if (rand < 0.999) {
token.setTokenType('bloodRain');
} else {
token.setTokenType('godMode');
}
miracleTokens.push(token);
game.addChild(token);
}
// Freeze all enemies
function freezeEnemies() {
freezeDuration = 3000; // 3 seconds
for (var i = 0; i < enemies.length; i++) {
enemies[i].frozenSpeed = enemies[i].speed;
enemies[i].speed = 0;
enemies[i].isFrozen = true;
// Visual effect - tint blue
tween(enemies[i], {
tint: 0x0088ff
}, {
duration: 200
});
}
}
// Explode nearby enemies
function explodeNearbyEnemies() {
var explosionRadius = 200;
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var dx = enemy.x - hero.x;
var dy = enemy.y - hero.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= explosionRadius) {
// Create explosion effect
LK.effects.flashObject(enemy, 0xff4400, 300);
var enemyDied = enemy.takeDamage(50);
if (enemyDied) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
}
}
}
// Revival explosion effect
function createRevivalExplosion() {
var explosionRadius = 300;
// Create massive visual explosion
LK.effects.flashScreen(0xffaa00, 1000);
// Create blood splatters around hero
for (var i = 0; i < 20; i++) {
createBloodSplatter(hero.x + (Math.random() - 0.5) * 200, hero.y + (Math.random() - 0.5) * 200, 15);
}
// Damage and freeze nearby enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var dx = enemy.x - hero.x;
var dy = enemy.y - hero.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= explosionRadius) {
// Damage enemy
var enemyDied = enemy.takeDamage(30);
if (enemyDied) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Freeze enemy for 8 seconds
enemy.frozenSpeed = enemy.speed;
enemy.speed = 0;
enemy.isFrozen = true;
enemy.freezeTimer = 8000; // 8 seconds
tween(enemy, {
tint: 0x0088ff
}, {
duration: 200
});
}
}
}
// Handle move events
function handleMove(x, y, obj) {
if (gameState !== 'playing' || gamePaused) return;
if (dragNode) {
// Keep hero within bounds
dragNode.x = Math.max(40, Math.min(2048 - 40, x));
dragNode.y = Math.max(40, Math.min(2732 - 40, y));
}
// Control animal if active
if (controlledAnimal && !dragNode) {
controlledAnimal.x = Math.max(40, Math.min(2048 - 40, x));
controlledAnimal.y = Math.max(40, Math.min(2732 - 40, y));
}
}
// Touch/mouse events
game.move = handleMove;
game.down = function (x, y, obj) {
// Handle revival button click first
if (gameState === 'revivalOption' && handleRevivalClick(x, y)) {
return;
}
// Handle miracle menu clicks
if (miracleMenu.isVisible) {
miracleMenu.down(x, y, obj);
return;
}
// Handle storage UI clicks
if (handleStorageClick(x, y)) {
return;
}
if (gameState !== 'playing' || gamePaused) return;
dragNode = hero;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Initialize base
function initializeBase() {
heroBase = game.addChild(new HeroBase());
heroBase.x = 2048 / 2;
heroBase.y = 2732 - 200;
heroBase.initializeTurrets();
}
// Initialize game
initializeUI();
initializeHero();
initializeBase();
// Initialize miracle storage
loadStoredMiracles();
updateStoredMiraclesUI();
// Initialize miracle menu
miracleMenu = game.addChild(new MiracleMenu());
miracleMenu.x = 2048 / 2;
miracleMenu.y = 2732 / 2;
// Initialize Erdo helper
erdo = game.addChild(new Erdo());
// Initialize Evil Erdo
evilErdo = game.addChild(new EvilErdo());
// Play farm war music
LK.playMusic('farm_war');
// Main game update loop
game.update = function () {
if (gameState !== 'playing') return;
// Update hero
hero.update();
// Update controlled animal
if (controlledAnimal) {
controlledAnimal.update();
controlledAnimalDuration -= 16.67;
if (controlledAnimalDuration <= 0) {
controlledAnimal.destroy();
controlledAnimal = null;
controlledAnimalType = '';
}
}
// Create controlled animal if type selected
if (controlledAnimalType !== '' && controlledAnimal === null) {
controlledAnimal = game.addChild(new ControlledAnimal(controlledAnimalType));
controlledAnimal.x = heroBase.x;
controlledAnimal.y = heroBase.y - 50;
}
// Update base
heroBase.update();
// Check if hero is in safe zone
var heroInSafeZone = heroBase.isHeroInSafeZone(hero.x, hero.y);
// Base interaction system - access stored miracles when in base
if (heroInSafeZone) {
// Show miracle menu when entering base
if (!miracleMenu.isVisible) {
miracleMenu.show();
}
// Show stored miracles UI with enhanced visibility
if (storedMiracles.length > 0) {
for (var i = 0; i < storedMiraclesUI.length; i++) {
if (storedMiraclesUI[i]) {
storedMiraclesUI[i].alpha = 1.0;
storedMiraclesUI[i].scaleX = 1.2;
storedMiraclesUI[i].scaleY = 1.2;
}
}
// Add pulsing effect to indicate availability
if (storageText) {
storageText.alpha = 0.8 + Math.sin(LK.ticks * 0.1) * 0.2;
storageText.setText('STORED MIRACLES - CLICK TO USE (' + storedMiracles.length + '/' + maxStoredMiracles + ')');
}
}
} else {
// Hide miracle menu when leaving base
if (miracleMenu.isVisible) {
miracleMenu.hide();
}
// Reset UI when not in base
for (var i = 0; i < storedMiraclesUI.length; i++) {
if (storedMiraclesUI[i]) {
storedMiraclesUI[i].alpha = 0.7;
storedMiraclesUI[i].scaleX = 0.7;
storedMiraclesUI[i].scaleY = 0.7;
}
}
if (storageText) {
storageText.alpha = 1.0;
storageText.setText('STORED MIRACLES (' + storedMiracles.length + '/' + maxStoredMiracles + ')');
}
}
// Update freeze duration
if (freezeDuration > 0) {
freezeDuration -= 16.67; // Approximately 60fps
if (freezeDuration <= 0) {
// Unfreeze all enemies
for (var i = 0; i < enemies.length; i++) {
if (enemies[i].isFrozen) {
enemies[i].speed = enemies[i].frozenSpeed;
enemies[i].isFrozen = false;
// Remove blue tint
tween(enemies[i], {
tint: 0xffffff
}, {
duration: 200
});
}
}
}
}
// Update health bar
var healthPercent = hero.health / hero.maxHealth;
healthBar.width = 240 * healthPercent;
// Update health bar color based on health percentage
if (healthPercent > 0.6) {
healthBar.tint = 0x00ff00; // Green
} else if (healthPercent > 0.3) {
healthBar.tint = 0xffff00; // Yellow
} else {
healthBar.tint = 0xff0000; // Red
}
// Add pulsing effect when health is low
if (healthPercent <= 0.25) {
var pulseAlpha = 0.5 + Math.sin(LK.ticks * 0.2) * 0.3;
healthBar.alpha = pulseAlpha;
} else {
healthBar.alpha = 1.0;
}
// Activate Erdo when hero health is low
if (healthPercent <= 0.3 && !erdo.isActive && LK.ticks - erdoLastActivated > erdoCooldown / 16.67) {
erdo.activate();
erdoLastActivated = LK.ticks;
erdoRevivalAvailable = true;
}
// Update Erdo
if (erdo) {
erdo.update();
}
// Update Evil Erdo
if (evilErdo && evilErdoBattleActive) {
evilErdo.update();
// Check if evil erdo is defeated
if (evilErdo.health <= 0 && evilErdoBattleActive) {
evilErdoBattleActive = false;
evilErdo.visible = false;
evilErdo.isActive = false;
// Grant massive score bonus
LK.setScore(LK.getScore() + 1000);
scoreTxt.setText('Score: ' + LK.getScore());
// Create victory explosion
createBloodSplatter(evilErdo.x, evilErdo.y, 50);
LK.effects.flashScreen(0xFFD700, 1500);
// Grant hero powerful temporary abilities
hero.hasShield = true;
hero.shieldDuration = 10000;
hero.explosiveShotMode = true;
hero.explosiveShotDuration = 15000;
hero.rapidShootCooldown = 100;
hero.shootCooldown = hero.rapidShootCooldown;
LK.getSound('powerUp').play();
}
}
// Handle revival 5-shot system
if (heroRevivalShots > 0) {
heroRevivalShotCooldown -= 16.67;
if (heroRevivalShotCooldown <= 0) {
// Shoot 5 bullets in spread pattern
for (var i = -2; i <= 2; i++) {
var bullet = new Bullet();
bullet.x = hero.x;
bullet.y = hero.y;
var angle = Math.atan2(-1, 0) + i * 0.4; // Spread upward
var targetX = hero.x + Math.cos(angle) * 500;
var targetY = hero.y + Math.sin(angle) * 500;
bullet.setTarget(targetX, targetY);
bullet.speed = 12;
bullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
heroRevivalShots--;
heroRevivalShotCooldown = 700; // 0.7 seconds between shots
}
} else {
// Auto shoot
if (LK.ticks - lastAutoShoot > hero.shootCooldown / 16.67) {
shootAtNearestEnemy();
lastAutoShoot = LK.ticks;
}
}
// Wave spawning - limit enemies to prevent crashes (not during evil erdo battle)
if (!evilErdoBattleActive && enemiesSpawned < enemiesInWave && enemies.length < 30) {
waveSpawnTimer++;
if (waveSpawnTimer >= 45) {
// Spawn every 0.75 seconds - slower to reduce load
spawnEnemy();
// Reduce multiple enemy spawning
if (currentWave >= 8 && enemies.length < 20) {
spawnEnemy();
}
if (currentWave >= 15 && enemies.length < 15) {
spawnEnemy();
}
enemiesSpawned++;
waveSpawnTimer = 0;
}
}
// Check for next wave
if (enemiesSpawned >= enemiesInWave && enemies.length === 0) {
nextWaveTimer++;
if (nextWaveTimer >= 120) {
// 2 second delay
currentWave++;
enemiesInWave = 3 + currentWave;
enemiesSpawned = 0;
nextWaveTimer = 0;
waveTxt.setText('Wave: ' + currentWave);
}
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
// Handle revival freeze timer
if (enemy.freezeTimer !== undefined && enemy.freezeTimer > 0) {
enemy.freezeTimer -= 16.67;
if (enemy.freezeTimer <= 0) {
enemy.speed = enemy.frozenSpeed;
enemy.isFrozen = false;
enemy.freezeTimer = undefined;
tween(enemy, {
tint: 0xffffff
}, {
duration: 200
});
}
}
// Apply time effects to enemy movement
if (!timeStopActive) {
var originalSpeed = enemy.speed;
enemy.speed *= timeSlowFactor;
enemy.update();
enemy.speed = originalSpeed;
}
// Check collision with controlled animal
if (controlledAnimal && enemy.intersects(controlledAnimal) && enemy.type !== controlledAnimal.type) {
var animalDied = controlledAnimal.takeDamage(enemy.damage);
if (animalDied) {
controlledAnimal.destroy();
controlledAnimal = null;
controlledAnimalType = '';
controlledAnimalDuration = 0;
}
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with evil erdo
if (evilErdoBattleActive && evilErdo.intersects(hero) && !hero.invisibilityMode && !heroInSafeZone) {
var heroDied = hero.takeDamage(evilErdo.damage);
if (heroDied) {
gameState = 'gameOver';
LK.showGameOver();
return;
}
LK.effects.flashScreen(0x800080, 300);
}
// Check collision with hero (only if not in safe zone)
if (!evilErdoBattleActive && enemy.intersects(hero) && !hero.invisibilityMode && !heroInSafeZone) {
var heroDied = hero.takeDamage(enemy.damage);
if (heroDied) {
if (erdoRevivalAvailable) {
// Show revival option instead of immediate game over
gameState = 'revivalOption';
showRevivalButton();
return;
} else {
gameState = 'gameOver';
LK.showGameOver();
return;
}
}
// Remove enemy after collision
enemy.destroy();
enemies.splice(i, 1);
LK.effects.flashScreen(0xff0000, 500);
continue;
}
// Remove enemies that are too far off screen
if (enemy.x < -200 || enemy.x > 2248 || enemy.y < -200 || enemy.y > 2932) {
enemy.destroy();
enemies.splice(i, 1);
}
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
bullet.update();
// Check collision with evil erdo first
if (evilErdoBattleActive && bullet.intersects(evilErdo)) {
var evilErdoDied = evilErdo.takeDamage(bullet.damage);
bullet.destroy();
bullets.splice(i, 1);
if (evilErdoDied) {
// Evil erdo defeated - handled in main update loop
}
continue;
}
// Check collision with enemies
var hitEnemy = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Check if it's an explosive bullet
if (bullet.explode) {
bullet.explode(); // Trigger explosion effect
}
var enemyDied = enemy.takeDamage(bullet.damage);
// Life steal and vampire healing
if (hero.lifeStealMode || hero.vampireMode) {
var healAmount = Math.min(bullet.damage * 0.15, 8);
hero.health = Math.min(hero.health + healAmount, hero.maxHealth);
LK.effects.flashObject(hero, 0x00ff00, 100);
}
if (enemyDied) {
// Additional vampire healing on kill
if (hero.vampireMode) {
hero.health = Math.min(hero.health + 20, hero.maxHealth);
}
// Create UltiOptiMega token when boss is killed
if (enemy.isBoss || enemy.isOmega) {
var ultiToken = new UltiOptiMegaToken();
ultiToken.x = enemy.x;
ultiToken.y = enemy.y;
ultiToken.startY = enemy.y;
miracleTokens.push(ultiToken);
game.addChild(ultiToken);
LK.effects.flashScreen(0x9900ff, 800);
// End magma event when magma boss is killed
if (enemy.type === 'magmaBoss' && magmaEventActive) {
magmaEventActive = false;
magmaEventDuration = 0;
// Restore normal music
LK.playMusic('farm_war');
}
}
// Create miracle token chance
if (Math.random() < 0.55) {
// 55% chance
createMiracleToken(enemy.x, enemy.y);
}
var scoreIncrease = enemy.isBoss ? 100 : 10;
LK.setScore(LK.getScore() + scoreIncrease);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(j, 1);
LK.getSound('enemyHit').play();
}
bullet.destroy();
bullets.splice(i, 1);
hitEnemy = true;
break;
}
}
if (hitEnemy) continue;
// Remove bullets that are off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
}
}
// Update base bullets
for (var i = baseBullets.length - 1; i >= 0; i--) {
var bullet = baseBullets[i];
bullet.update();
// Check collision with enemies
var hitEnemy = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
var enemyDied = enemy.takeDamage(bullet.damage);
if (enemyDied) {
// Create miracle token chance
if (Math.random() < 0.3) {
createMiracleToken(enemy.x, enemy.y);
}
var scoreIncrease = enemy.isBoss ? 100 : 10;
LK.setScore(LK.getScore() + scoreIncrease);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(j, 1);
LK.getSound('enemyHit').play();
}
bullet.destroy();
baseBullets.splice(i, 1);
hitEnemy = true;
break;
}
}
if (hitEnemy) continue;
// Remove bullets that are off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
baseBullets.splice(i, 1);
}
}
// Update blood particles - cleanup aggressively
for (var i = bloodParticles.length - 1; i >= 0; i--) {
var blood = bloodParticles[i];
blood.update();
if (blood.life <= 0) {
blood.destroy();
bloodParticles.splice(i, 1);
}
}
// Force cleanup if too many particles
if (bloodParticles.length > 25) {
for (var i = 0; i < 10; i++) {
if (bloodParticles[i]) {
bloodParticles[i].destroy();
bloodParticles.splice(i, 1);
}
}
}
// Update blood trails - cleanup aggressively
for (var i = bloodTrails.length - 1; i >= 0; i--) {
var trail = bloodTrails[i];
trail.update();
if (trail.life <= 0) {
trail.destroy();
bloodTrails.splice(i, 1);
}
}
// Force cleanup if too many trails
if (bloodTrails.length > 20) {
for (var i = 0; i < 5; i++) {
if (bloodTrails[i]) {
bloodTrails[i].destroy();
bloodTrails.splice(i, 1);
}
}
}
// Update miracle tokens
for (var i = miracleTokens.length - 1; i >= 0; i--) {
var token = miracleTokens[i];
token.update();
// Check collision with hero
if (token.intersects(hero)) {
miracleTokenCount++;
miracleCountTxt.setText('Miracles: ' + miracleTokenCount);
// Check if storage is available and hero is holding down
if (dragNode && storedMiracles.length < maxStoredMiracles) {
// Store the miracle instead of using it
var stored = addMiracleToStorage(token.type);
if (stored) {
LK.getSound('tokenCollect').play();
token.destroy();
miracleTokens.splice(i, 1);
continue;
}
}
// Activate power-up immediately
activateMiraclePower(token.type);
LK.getSound('tokenCollect').play();
token.destroy();
miracleTokens.splice(i, 1);
}
}
// Handle special miracle effects
if (hero.magnetMode) {
// Attract nearby miracle tokens
for (var i = 0; i < miracleTokens.length; i++) {
var token = miracleTokens[i];
var dx = hero.x - token.x;
var dy = hero.y - token.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 200 && distance > 0) {
token.x += dx / distance * 8;
token.y += dy / distance * 8;
}
}
}
// Handle phoenix revival
if (hero.phoenixMode && hero.health <= 0) {
hero.health = hero.maxHealth;
hero.phoenixMode = false;
hero.phoenixDuration = 0;
createRevivalExplosion();
LK.effects.flashObject(hero, 0xFF6347, 1000);
}
// Handle reflect damage
if (hero.reflectMode) {
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.intersects(hero)) {
var enemyDied = enemy.takeDamage(enemy.damage);
if (enemyDied) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
LK.effects.flashObject(enemy, 0x9932CC, 200);
}
}
}
// Handle shadow strike - teleport behind enemies and deal massive damage
if (hero.shadowStrikeMode && LK.ticks % 180 === 0 && enemies.length > 0) {
var targetEnemy = enemies[Math.floor(Math.random() * enemies.length)];
hero.x = targetEnemy.x + 80;
hero.y = targetEnemy.y + 80;
var enemyDied = targetEnemy.takeDamage(100);
if (enemyDied) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
targetEnemy.destroy();
enemies.splice(enemies.indexOf(targetEnemy), 1);
}
LK.effects.flashObject(hero, 0x2f1b69, 300);
}
// Handle necromancy - revive dead enemies as allies
if (hero.necromancyMode && LK.ticks % 300 === 0) {
for (var i = 0; i < 2; i++) {
var reviveBuddy = game.addChild(new ControlledAnimal('sheep'));
reviveBuddy.x = hero.x + (Math.random() - 0.5) * 200;
reviveBuddy.y = hero.y + (Math.random() - 0.5) * 200;
reviveBuddy.health = 200;
reviveBuddy.damage = 50;
}
}
// Handle aura - heal hero and boost nearby allies
if (hero.auraMode && LK.ticks % 60 === 0) {
hero.health = Math.min(hero.health + 5, hero.maxHealth);
if (controlledAnimal) {
controlledAnimal.health = Math.min(controlledAnimal.health + 10, controlledAnimal.maxHealth);
}
LK.effects.flashObject(hero, 0xffd43b, 100);
}
// Handle chain lightning - damage multiple enemies in chain
if (hero.chainLightningMode && LK.ticks % 120 === 0 && enemies.length > 0) {
var lightningTargets = enemies.slice(0, Math.min(5, enemies.length));
for (var i = 0; i < lightningTargets.length; i++) {
var enemy = lightningTargets[i];
var enemyDied = enemy.takeDamage(60);
if (enemyDied) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(enemies.indexOf(enemy), 1);
}
LK.effects.flashObject(enemy, 0x4a90e2, 200);
}
}
// Handle summon - spawn protective creatures
if (hero.summonMode && LK.ticks % 600 === 0) {
for (var i = 0; i < 3; i++) {
var summonedCreature = game.addChild(new ControlledAnimal('chicken'));
summonedCreature.x = hero.x + Math.cos(i * 2.09) * 100;
summonedCreature.y = hero.y + Math.sin(i * 2.09) * 100;
summonedCreature.health = 150;
summonedCreature.damage = 40;
}
}
// Handle meteor - random devastating strikes from sky
if (hero.meteorMode && LK.ticks % 180 === 0) {
var meteorX = Math.random() * 2048;
var meteorY = Math.random() * 2732;
var meteorRadius = 150;
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var dx = enemy.x - meteorX;
var dy = enemy.y - meteorY;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= meteorRadius) {
var enemyDied = enemy.takeDamage(120);
if (enemyDied) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
}
}
LK.effects.flashScreen(0xd0021b, 200);
createBloodSplatter(meteorX, meteorY, 20);
}
// Handle berserk aura - boost all allies damage and speed
if (hero.berserkAuraMode && LK.ticks % 90 === 0) {
if (controlledAnimal) {
controlledAnimal.speed = Math.min(controlledAnimal.speed * 1.1, 8);
controlledAnimal.damage = Math.min(controlledAnimal.damage * 1.1, 80);
}
LK.effects.flashObject(hero, 0xf5a623, 150);
}
// Handle dimension rift - teleport enemies to random locations
if (hero.dimensionRiftMode && LK.ticks % 240 === 0) {
for (var i = 0; i < Math.min(3, enemies.length); i++) {
var enemy = enemies[i];
enemy.x = Math.random() * 2048;
enemy.y = Math.random() * 2732;
LK.effects.flashObject(enemy, 0x9013fe, 300);
}
}
// Handle divine blast - massive holy damage to all enemies
if (hero.divineBlastMode && LK.ticks % 300 === 0) {
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var enemyDied = enemy.takeDamage(80);
if (enemyDied) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
LK.effects.flashObject(enemy, 0xffffff, 500);
}
LK.effects.flashScreen(0xffffff, 300);
}
// Handle apocalypse - screen-wide devastation
if (hero.apocalypseMode && LK.ticks % 360 === 0) {
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var enemyDied = enemy.takeDamage(150);
if (enemyDied) {
LK.setScore(LK.getScore() + 15);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
}
LK.effects.flashScreen(0x000000, 800);
createBloodSplatter(2048 / 2, 2732 / 2, 30);
}
// Handle lightning storm - continuous lightning strikes
if (hero.lightningStormMode && LK.ticks % 60 === 0) {
for (var i = 0; i < 3; i++) {
var lightningX = Math.random() * 2048;
var lightningY = Math.random() * 2732;
var lightningRadius = 100;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
var dx = enemy.x - lightningX;
var dy = enemy.y - lightningY;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= lightningRadius) {
var enemyDied = enemy.takeDamage(90);
if (enemyDied) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(j, 1);
}
}
}
LK.effects.flashScreen(0xffff00, 150);
}
}
// Handle blood rain - constant damage to all enemies
if (hero.bloodRainMode && LK.ticks % 90 === 0) {
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var enemyDied = enemy.takeDamage(35);
if (enemyDied) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
createBloodSplatter(enemy.x, enemy.y, 8);
}
LK.effects.flashScreen(0x8b0000, 100);
}
// Handle void walker - phase through enemies and deal damage
if (hero.voidWalkerMode && LK.ticks % 30 === 0) {
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var dx = hero.x - enemy.x;
var dy = hero.y - enemy.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 150) {
var enemyDied = enemy.takeDamage(200);
if (enemyDied) {
LK.setScore(LK.getScore() + 15);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
LK.effects.flashObject(enemy, 0x1a0033, 200);
}
}
}
// Handle cosmic rage - screen-wide devastation with cosmic energy
if (hero.cosmicRageMode && LK.ticks % 120 === 0) {
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var enemyDied = enemy.takeDamage(300);
if (enemyDied) {
LK.setScore(LK.getScore() + 20);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
LK.effects.flashObject(enemy, 0xff0099, 300);
}
LK.effects.flashScreen(0xff0099, 300);
createBloodSplatter(2048 / 2, 2732 / 2, 40);
}
// Handle soul harvest - drain life from all enemies
if (hero.soulHarvestMode && LK.ticks % 90 === 0) {
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var soulDrain = Math.min(enemy.health * 0.1, 50);
enemy.takeDamage(soulDrain);
hero.health = Math.min(hero.health + soulDrain * 0.5, hero.maxHealth);
LK.effects.flashObject(enemy, 0x660066, 150);
}
LK.effects.flashObject(hero, 0x00ff00, 100);
}
// Handle elemental fury - constant elemental explosions
if (hero.elementalFuryMode && LK.ticks % 45 === 0) {
for (var i = 0; i < 8; i++) {
var elementX = Math.random() * 2048;
var elementY = Math.random() * 2732;
var elementRadius = 180;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
var dx = enemy.x - elementX;
var dy = enemy.y - elementY;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= elementRadius) {
var enemyDied = enemy.takeDamage(150);
if (enemyDied) {
LK.setScore(LK.getScore() + 15);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(j, 1);
}
}
}
LK.effects.flashScreen(0xff6600, 100);
createBloodSplatter(elementX, elementY, 25);
}
}
// Handle quantum leap - teleport and create quantum explosions
if (hero.quantumLeapMode && LK.ticks % 180 === 0) {
// Teleport to random location
hero.x = Math.random() * 1800 + 124;
hero.y = Math.random() * 2400 + 166;
// Create quantum explosion at new location
var quantumRadius = 250;
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var dx = enemy.x - hero.x;
var dy = enemy.y - hero.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= quantumRadius) {
var enemyDied = enemy.takeDamage(250);
if (enemyDied) {
LK.setScore(LK.getScore() + 20);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
}
}
LK.effects.flashScreen(0x00ff99, 400);
createBloodSplatter(hero.x, hero.y, 35);
}
// Handle dragon breath - continuous fire streams
if (hero.dragonBreathMode && LK.ticks % 30 === 0) {
var breathAngle = LK.ticks * 0.1;
for (var i = 0; i < 12; i++) {
var angle = breathAngle + i * (Math.PI * 2 / 12);
var breathX = hero.x + Math.cos(angle) * 200;
var breathY = hero.y + Math.sin(angle) * 200;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
var dx = enemy.x - breathX;
var dy = enemy.y - breathY;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= 80) {
var enemyDied = enemy.takeDamage(120);
if (enemyDied) {
LK.setScore(LK.getScore() + 15);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(j, 1);
}
LK.effects.flashObject(enemy, 0xff3300, 150);
}
}
createBloodSplatter(breathX, breathY, 8);
}
}
// Handle arcane storm - magical energy waves
if (hero.arcaneStormMode && LK.ticks % 75 === 0) {
var waveRadius = LK.ticks % 600 * 2;
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var dx = enemy.x - hero.x;
var dy = enemy.y - hero.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (Math.abs(distance - waveRadius) <= 50) {
var enemyDied = enemy.takeDamage(180);
if (enemyDied) {
LK.setScore(LK.getScore() + 15);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
LK.effects.flashObject(enemy, 0x9933ff, 200);
}
}
}
// Handle galaxy collapse - pull all enemies to center and crush
if (hero.galaxyCollapseMode && LK.ticks % 120 === 0) {
var centerX = 2048 / 2;
var centerY = 2732 / 2;
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var dx = centerX - enemy.x;
var dy = centerY - enemy.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
// Pull enemies towards center
enemy.x += dx / distance * 15;
enemy.y += dy / distance * 15;
}
// Damage enemies near center
if (distance < 200) {
var enemyDied = enemy.takeDamage(400);
if (enemyDied) {
LK.setScore(LK.getScore() + 25);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
}
}
LK.effects.flashScreen(0x000066, 200);
createBloodSplatter(centerX, centerY, 50);
}
// Handle infinity mode - omnipotent destruction
if (hero.infinityMode && LK.ticks % 60 === 0) {
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var enemyDied = enemy.takeDamage(500);
if (enemyDied) {
LK.setScore(LK.getScore() + 30);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
LK.effects.flashObject(enemy, 0xffffff, 400);
}
LK.effects.flashScreen(0xffffff, 150);
createBloodSplatter(hero.x, hero.y, 60);
}
// Handle omega destruction - ultimate annihilation
if (hero.omegaDestructionMode && LK.ticks % 90 === 0) {
// Instantly kill all enemies on screen
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
LK.setScore(LK.getScore() + 50);
createBloodSplatter(enemy.x, enemy.y, 5);
enemy.destroy();
enemies.splice(i, 1);
}
LK.effects.flashScreen(0xff0000, 100);
// Reduce blood rain to prevent crashes
for (var i = 0; i < 5; i++) {
createBloodSplatter(Math.random() * 2048, Math.random() * 2732, 3);
}
}
// Handle wind event duration
if (windEventActive) {
windEventDuration -= 16.67;
if (windEventDuration <= 0) {
windEventActive = false;
}
// Create wind effects during event
if (LK.ticks % 120 === 0) {
// Push all enemies in swirling pattern
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
if (enemy.type !== 'windBoss') {
var windAngle = LK.ticks * 0.05;
enemy.x += Math.cos(windAngle) * 30;
enemy.y += Math.sin(windAngle) * 30;
// Keep enemies in bounds
enemy.x = Math.max(0, Math.min(2048, enemy.x));
enemy.y = Math.max(0, Math.min(2732, enemy.y));
}
}
}
}
// Handle magma event duration
if (magmaEventActive) {
magmaEventDuration -= 16.67;
if (magmaEventDuration <= 0) {
magmaEventActive = false;
// Restore normal music
LK.playMusic('farm_war');
}
// Create magma effects during event - much more reduced frequency and intensity
if (LK.ticks % 1200 === 0) {
// Create only 1 lava burst to prevent crashes
var lavaX = Math.random() * 2048;
var lavaY = Math.random() * 2732;
createBloodSplatter(lavaX, lavaY, 3);
LK.effects.flashScreen(0xff4500, 50);
}
}
};
var bossSpawned = false;
var timeSlowFactor = 1.0;
var timeStopActive = false;
var gamePaused = false;
// Revival system variables
var revivalButton = null;
var revivalButtonText = null;
var evilErdo = null;
var evilErdoBattleActive = false;
// Show revival button function
function showRevivalButton() {
if (revivalButton) return; // Button already exists
// Create revival button
revivalButton = LK.getAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x00ff00,
width: 300,
height: 80
});
revivalButton.x = 2048 / 2;
revivalButton.y = 2732 / 2 + 100;
revivalButton.visible = true;
game.addChild(revivalButton);
// Create revival button text
revivalButtonText = new Text2('REVIVE WITH ERDO', {
size: 40,
fill: 0xffffff
});
revivalButtonText.anchor.set(0.5, 0.5);
revivalButtonText.x = 2048 / 2;
revivalButtonText.y = 2732 / 2 + 100;
revivalButtonText.visible = true;
game.addChild(revivalButtonText);
}
// Hide revival button function
function hideRevivalButton() {
if (revivalButton) {
revivalButton.destroy();
revivalButton = null;
}
if (revivalButtonText) {
revivalButtonText.destroy();
revivalButtonText = null;
}
}
// Handle revival button click
function handleRevivalClick(x, y) {
if (!revivalButton || gameState !== 'revivalOption') return false;
var dx = x - revivalButton.x;
var dy = y - revivalButton.y;
if (Math.abs(dx) <= 150 && Math.abs(dy) <= 40) {
// Revival clicked
hero.health = hero.maxHealth;
heroRevivalShots = 5;
heroRevivalShotCooldown = 0;
erdoRevivalAvailable = false;
erdo.deactivate();
erdoLastActivated = LK.ticks;
createRevivalExplosion();
LK.effects.flashObject(hero, 0x00ff00, 500);
hideRevivalButton();
gameState = 'playing';
// Spawn evil erdo boss fight
if (evilErdo) {
evilErdo.activate();
}
return true;
}
return false;
}
// Wind and magma event variables
var windEventActive = false;
var windEventDuration = 0;
var magmaEventActive = false;
var magmaEventDuration = 0;
// Miracle storage system
var storedMiracles = [];
var maxStoredMiracles = 5;
// Load stored miracles from storage
function loadStoredMiracles() {
storedMiracles = storage.storedMiracles || [];
}
// Save stored miracles to storage
function saveStoredMiracles() {
storage.storedMiracles = storedMiracles;
}
// Add miracle to storage
function addMiracleToStorage(miracleType) {
if (storedMiracles.length < maxStoredMiracles) {
storedMiracles.push(miracleType);
saveStoredMiracles();
updateStoredMiraclesUI();
return true;
}
return false;
}
// Use stored miracle
function useStoredMiracle(index) {
if (index >= 0 && index < storedMiracles.length) {
var miracleType = storedMiracles[index];
activateMiraclePower(miracleType, true); // Pass true to indicate from storage
storedMiracles.splice(index, 1);
saveStoredMiracles();
updateStoredMiraclesUI();
return true;
}
return false;
}
// Activate miracle power by type
function activateMiraclePower(type, fromStorage) {
var isFromStorage = fromStorage || false;
var durationMultiplier = isFromStorage ? 2.5 : 1.0; // 2.5x duration when used from storage
if (type === 'speed') {
hero.activateSpeedBoost();
if (isFromStorage) {
// Extended speed boost duration
LK.setTimeout(function () {
hero.speed = hero.normalSpeed;
}, 7500); // 7.5 seconds instead of 3
}
} else if (type === 'shield') {
hero.activateShield();
if (isFromStorage) {
hero.shieldDuration = 12500; // 12.5 seconds instead of 5
}
} else if (type === 'rapidFire') {
hero.activateRapidFire();
if (isFromStorage) {
hero.rapidFireDuration = 10000; // 10 seconds instead of 4
}
} else if (type === 'freeze') {
hero.activateFreeze();
} else if (type === 'explosion') {
hero.activateExplosion();
} else if (type === 'healing') {
hero.activateHealing();
if (isFromStorage) {
// Enhanced healing when used from storage
hero.health = Math.min(hero.health + 20, hero.maxHealth);
}
} else if (type === 'hypercharge') {
hero.activateHypercharge();
if (isFromStorage) {
hero.hyperhargeDuration = 20000; // 20 seconds instead of 8
}
} else if (type === 'teleport') {
hero.activateTeleport();
} else if (type === 'invisibility') {
hero.activateInvisibility();
if (isFromStorage) {
hero.invisibilityDuration = 12500; // 12.5 seconds instead of 5
}
} else if (type === 'multiShot') {
hero.activateMultiShot();
if (isFromStorage) {
hero.multiShotDuration = 15000; // 15 seconds instead of 6
}
} else if (type === 'timeSlow') {
hero.activateTimeSlow();
if (isFromStorage) {
hero.timeSlowDuration = 20000; // 20 seconds instead of 8
}
} else if (type === 'timeStop') {
hero.activateTimeStop();
if (isFromStorage) {
hero.timeStopDuration = 7500; // 7.5 seconds instead of 3
}
} else if (type === 'timeRewind') {
hero.activateTimeRewind();
if (isFromStorage) {
hero.timeRewindDuration = 12500; // 12.5 seconds instead of 5
}
} else if (type === 'lifeSteal') {
hero.activateLifeSteal();
if (isFromStorage) {
hero.lifeStealDuration = 25000; // 25 seconds instead of 10
}
} else if (type === 'berserker') {
hero.activateBerserker();
if (isFromStorage) {
hero.berserkerDuration = 20000; // 20 seconds instead of 8
}
} else if (type === 'magnet') {
hero.activateMagnet();
if (isFromStorage) {
hero.magnetDuration = 30000; // 30 seconds instead of 12
}
} else if (type === 'reflect') {
hero.activateReflect();
if (isFromStorage) {
hero.reflectDuration = 15000; // 15 seconds instead of 6
}
} else if (type === 'phoenix') {
hero.activatePhoenix();
if (isFromStorage) {
hero.phoenixDuration = 37500; // 37.5 seconds instead of 15
}
} else if (type === 'vampire') {
hero.activateVampire();
if (isFromStorage) {
hero.vampireDuration = 25000; // 25 seconds instead of 10
}
} else if (type === 'godMode') {
hero.activateGodMode();
if (isFromStorage) {
hero.godModeDuration = 5000; // 5 seconds instead of 2
}
} else if (type === 'shadowStrike') {
hero.activateShadowStrike();
if (isFromStorage) {
hero.shadowStrikeDuration = 20000; // 20 seconds instead of 8
}
} else if (type === 'necromancy') {
hero.activateNecromancy();
if (isFromStorage) {
hero.necromancyDuration = 30000; // 30 seconds instead of 12
}
} else if (type === 'aura') {
hero.activateAura();
if (isFromStorage) {
hero.auraDuration = 25000; // 25 seconds instead of 10
}
} else if (type === 'chainLightning') {
hero.activateChainLightning();
if (isFromStorage) {
hero.chainLightningDuration = 15000; // 15 seconds instead of 6
}
} else if (type === 'summon') {
hero.activateSummon();
if (isFromStorage) {
hero.summonDuration = 37500; // 37.5 seconds instead of 15
}
} else if (type === 'meteor') {
hero.activateMeteor();
if (isFromStorage) {
hero.meteorDuration = 20000; // 20 seconds instead of 8
}
} else if (type === 'berserkAura') {
hero.activateBerserkAura();
if (isFromStorage) {
hero.berserkAuraDuration = 25000; // 25 seconds instead of 10
}
} else if (type === 'dimensionRift') {
hero.activateDimensionRift();
if (isFromStorage) {
hero.dimensionRiftDuration = 17500; // 17.5 seconds instead of 7
}
} else if (type === 'divineBlast') {
hero.activateDivineBlast();
if (isFromStorage) {
hero.divineBlastDuration = 12500; // 12.5 seconds instead of 5
}
} else if (type === 'divineBlast') {
hero.activateDivineBlast();
} else if (type === 'apocalypse') {
hero.activateApocalypse();
if (isFromStorage) {
hero.apocalypseDuration = 15000; // 15 seconds instead of 6
}
} else if (type === 'titanShield') {
hero.activateTitanShield();
if (isFromStorage) {
hero.titanShieldDuration = 30000; // 30 seconds instead of 12
}
} else if (type === 'berserkRage') {
hero.activateBerserkRage();
if (isFromStorage) {
hero.berserkRageDuration = 20000; // 20 seconds instead of 8
}
} else if (type === 'lightningStorm') {
hero.activateLightningStorm();
if (isFromStorage) {
hero.lightningStormDuration = 25000; // 25 seconds instead of 10
}
} else if (type === 'bloodRain') {
hero.activateBloodRain();
if (isFromStorage) {
hero.bloodRainDuration = 37500; // 37.5 seconds instead of 15
}
} else if (type === 'ultioptimega') {
var ultraAbilities = ['voidWalker', 'cosmicRage', 'soulHarvest', 'timeDistortion', 'elementalFury', 'quantumLeap', 'dragonBreath', 'arcaneStorm', 'plasmaBurst', 'galaxyCollapse', 'infinity', 'omegaDestruction'];
var selectedAbility = ultraAbilities[Math.floor(Math.random() * ultraAbilities.length)];
if (selectedAbility === 'voidWalker') {
hero.activateVoidWalker();
if (isFromStorage) hero.voidWalkerDuration = 50000; // 50 seconds instead of 20
} else if (selectedAbility === 'cosmicRage') {
hero.activateCosmicRage();
if (isFromStorage) hero.cosmicRageDuration = 45000; // 45 seconds instead of 18
} else if (selectedAbility === 'soulHarvest') {
hero.activateSoulHarvest();
if (isFromStorage) hero.soulHarvestDuration = 62500; // 62.5 seconds instead of 25
} else if (selectedAbility === 'timeDistortion') {
hero.activateTimeDistortion();
if (isFromStorage) hero.timeDistortionDuration = 37500; // 37.5 seconds instead of 15
} else if (selectedAbility === 'elementalFury') {
hero.activateElementalFury();
if (isFromStorage) hero.elementalFuryDuration = 55000; // 55 seconds instead of 22
} else if (selectedAbility === 'quantumLeap') {
hero.activateQuantumLeap();
if (isFromStorage) hero.quantumLeapDuration = 50000; // 50 seconds instead of 20
} else if (selectedAbility === 'dragonBreath') {
hero.activateDragonBreath();
if (isFromStorage) hero.dragonBreathDuration = 40000; // 40 seconds instead of 16
} else if (selectedAbility === 'arcaneStorm') {
hero.activateArcaneStorm();
if (isFromStorage) hero.arcaneStormDuration = 60000; // 60 seconds instead of 24
} else if (selectedAbility === 'plasmaBurst') {
hero.activatePlasmaBurst();
if (isFromStorage) hero.plasmaBurstDuration = 35000; // 35 seconds instead of 14
} else if (selectedAbility === 'galaxyCollapse') {
hero.activateGalaxyCollapse();
if (isFromStorage) hero.galaxyCollapseDuration = 30000; // 30 seconds instead of 12
} else if (selectedAbility === 'infinity') {
hero.activateInfinity();
if (isFromStorage) hero.infinityDuration = 25000; // 25 seconds instead of 10
} else if (selectedAbility === 'omegaDestruction') {
hero.activateOmegaDestruction();
if (isFromStorage) hero.omegaDestructionDuration = 20000; // 20 seconds instead of 8
}
LK.effects.flashScreen(0x9900ff, 1000);
}
// Enhanced visual effect when used from storage
if (isFromStorage) {
LK.effects.flashScreen(0x00ff00, 500);
LK.effects.flashObject(hero, 0x00ff00, 800);
}
}
// Storage UI elements
var storedMiraclesUI = [];
var storageText = null;
// Update stored miracles UI
function updateStoredMiraclesUI() {
// Initialize storedMiraclesUI if undefined
if (!storedMiraclesUI) {
storedMiraclesUI = [];
}
// Clear existing UI
for (var i = 0; i < storedMiraclesUI.length; i++) {
if (storedMiraclesUI[i]) {
storedMiraclesUI[i].destroy();
}
}
storedMiraclesUI = [];
if (storageText) {
storageText.destroy();
}
// Create storage title
storageText = new Text2('STORED MIRACLES (' + storedMiracles.length + '/' + maxStoredMiracles + ')', {
size: 35,
fill: 0xFFD700
});
storageText.anchor.set(0, 0);
LK.gui.topLeft.addChild(storageText);
storageText.x = 20;
storageText.y = 140;
// Create stored miracle icons
for (var i = 0; i < storedMiracles.length; i++) {
var miracleType = storedMiracles[i];
var miracleIcon = createMiracleIcon(miracleType);
miracleIcon.x = 20 + i * 60;
miracleIcon.y = 180;
miracleIcon.storageIndex = i;
LK.gui.topLeft.addChild(miracleIcon);
storedMiraclesUI.push(miracleIcon);
}
}
// Create miracle icon for storage UI
function createMiracleIcon(type) {
var icon;
if (type === 'freeze') {
icon = LK.getAsset('freezeToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'explosion') {
icon = LK.getAsset('explosionToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'healing') {
icon = LK.getAsset('healingToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'hypercharge') {
icon = LK.getAsset('hyperchargeToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'teleport') {
icon = LK.getAsset('teleportToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'invisibility') {
icon = LK.getAsset('invisibilityToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'multiShot') {
icon = LK.getAsset('multiShotToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'timeSlow') {
icon = LK.getAsset('timeSlowToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'timeStop') {
icon = LK.getAsset('timeStopToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'timeRewind') {
icon = LK.getAsset('timeRewindToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'lifeSteal') {
icon = LK.getAsset('lifeStealToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'berserker') {
icon = LK.getAsset('berserkerToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'magnet') {
icon = LK.getAsset('magnetToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'reflect') {
icon = LK.getAsset('reflectToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'phoenix') {
icon = LK.getAsset('phoenixToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'vampire') {
icon = LK.getAsset('vampireToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'godMode') {
icon = LK.getAsset('godModeToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else if (type === 'ultioptimega') {
icon = LK.getAsset('ultioptimegaToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
} else {
icon = LK.getAsset('miracleToken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
}
return icon;
}
// Handle storage UI clicks
function handleStorageClick(x, y) {
if (gameState !== 'playing' || gamePaused) return false;
// Check if hero is in base safe zone
var heroInSafeZone = heroBase.isHeroInSafeZone(hero.x, hero.y);
if (!heroInSafeZone) {
return false; // Can only use stored miracles when in base
}
for (var i = 0; i < storedMiraclesUI.length; i++) {
var icon = storedMiraclesUI[i];
if (icon && icon.storageIndex !== undefined) {
var iconGlobalPos = LK.gui.topLeft.toGlobal(icon.position);
var dx = x - iconGlobalPos.x;
var dy = y - iconGlobalPos.y;
if (Math.abs(dx) <= 25 && Math.abs(dy) <= 25) {
useStoredMiracle(icon.storageIndex);
return true;
}
}
}
return false;
}
// UI elements
var healthBar;
mega star. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
bullet. In-Game asset. 2d. High contrast. No shadows
chicken. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
cow but square. In-Game asset. 2d. High contrast. No shadows
sheep but square. In-Game asset. 2d. High contrast. No shadows
star shield. In-Game asset. 2d. High contrast. No shadows
random miracle token. In-Game asset. 2d. High contrast. No shadows
chick. In-Game asset. 2d. High contrast. No shadows
snake but square. In-Game asset. 2d. High contrast. No shadows
donduruculuk gücü veren token. In-Game asset. 2d. High contrast. No shadows
şifa tokeni. In-Game asset. 2d. High contrast. No shadows
bomba token. In-Game asset. 2d. High contrast. No shadows
mause but square. In-Game asset. 2d. High contrast. No shadows
magic eye. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
prickly cube. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
only empty button. In-Game asset. 2d. High contrast. No shadows
hyper chicken but square. In-Game asset. 2d. High contrast. No shadows
no text egg menu. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat