User prompt
7 mucize ekle
User prompt
0.7 snde bir olsun
User prompt
erdo gidince 15 sn boyunca kalkan extradan 3lü patlayan mermi 5li normal mermiyi 0.2 snde bir atar ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
erdo ile canlan çalışmıyo yine ölüyorum tekrar oyna yazıyo ama altında canlan tuşu yok bide erdo diye varlıklarda nesne yok
User prompt
sadece düşmanlara ateş etcek erdo yoksa oyun kasıyo ama her canlıya aynı anda bide tekrar oynanın altında erdo varken ölmeme rağmen canlan tuşu yok onu ekle
User prompt
erdo bi karakter olacak canın azalınca rasgele bi yönden ortaya doğru hareket edip ortada tüm düşmanlara aynı anada 15 sn boyunca çok hızlı mermi yağdırcak ölürsen ve erdo var ise tekrar oynanın altına erdo ile canlana basıp hayata tam can ile dönersin yeniden canlanırken dev bi patlama yaparsın etrafındakilerin canı azalır ve 8 sn donarlar sende 5li mermi atarsın ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Erdo diye yardımcı karakter ekle canın azken gelir ve her yöne çok hızlı mermi fırlatır
User prompt
daha çok spawn olsunlar ve daha çok kan daha çok vahşet ve daha çok boss ve omega ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
kan izleri ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
oyuna kan ekle
User prompt
Please fix the bug: 'HeroBase is not defined' in or related to this line: 'heroBase = game.addChild(new HeroBase());' Line Number: 1742
User prompt
o baseyi kaldır ve yeni hayvanlar ve yeni 6 mucize ekle
User prompt
baseye girince menü açılıyo ve oyun donuyo menüye dair herşeyi yok et dedim
User prompt
AMAAAAN MENÜYÜ KALDIR GİTSİN
User prompt
menü açıkken hareket kapansın oyun dursun sadece menüden birini seçince devam etsin
User prompt
menü tüm ekranı kaplasın ve çalışsın lütfen
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var localPos = self.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 151
User prompt
baseye girince bi menü açılsın o menüden seçtiğimiz hayvan türünü 1 dk liğine kontrol edip kendi türlerine düşman etme ekle yeni hayvanlar ve omege hayvanlar ekle bossun olduğu levelleri arttır ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
daha da güçlendir hayvanları ama daha çok mucize ekle zman mucizesi vb. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
hipertavuk artık boss olacak skor 1000 küsürlerde gelcek canı çok olacak bide base yap bizim basemiz orası güvenli orda hayvanlar akumayabileceğimizz çıkabilirca basen bize destek olup hayvanlara saldıracaklar ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
hiper hayvan ekle hiperşarj ekle yeni mucizeler ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
geliştir oyunu yeni miraculouslar yeni tip hayvanlar civciv yılan fare vb.
Code edit (1 edits merged)
Please save this source code
User prompt
Miraculous Farm Defense
Initial prompt
3d oyun yap fps oyunu koyun inek tavuk gibi düşmanlarla savaşıyoz muzize uğur böceğindeki mucizeleri kullanıyoruz veya hayvanları öldürerek elde ediyoruz
/**** * 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