User prompt
wave 1 i geçemiyorum yeterince zombie yok
User prompt
roketlere zombilere çarpınca patlamaya sebep olur
User prompt
Please fix the bug: 'Timeout.tick error: self.getChildByName is not a function' in or related to this line: 'if (self.getChildByName('shieldEffect')) {' Line Number: 409
User prompt
wave arası süre 5 saniye olsun
User prompt
legendary chest asla spawnlanmaz
User prompt
wave başlayınca rastgele shieldcreate ya da rocket efekti ver
User prompt
oyunun süresini 9999 saniyeden 7 saniyeye çek ve legendary chest spawn olmasın
User prompt
chest açıldıktan sonra yok olur
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highscore: 0, weaponLevel: 1 }); /**** * Classes ****/ var Barrel = Container.expand(function (x, y) { var self = Container.call(this); var barrelGraphic = self.attachAsset('barrel', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.update = function () { for (var i = bullets.length - 1; i >= 0; i--) { if (bullets[i].intersects(self)) { bullets[i].destroy(); bullets.splice(i, 1); self.explode(); return true; } } return false; }; self.explode = function () { // Check for zombies in explosion area LK.getSound('explode').play(); zombies.forEach(function (zombie) { if (zombie.intersects(self)) { if (zombie.takeDamage(100)) { // Inflict damage to zombie and check if it dies zombies.splice(zombies.indexOf(zombie), 1); // Remove zombie from the array if it dies zombie.destroy(); // Destroy the zombie } } }); var explosion = LK.getAsset('explosionEffect', { anchorX: 0.5, anchorY: 0.5, x: self.x, y: self.y }); game.addChild(explosion); tween(explosion, {}, { duration: 500, onFinish: function onFinish() { explosion.destroy(); } }); self.destroy(); }; return self; }); var Bomb = Container.expand(function (x, y) { var self = Container.call(this); var bombGraphic = self.attachAsset('smallBomb', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.explode = function () { // Check for player in red area LK.getSound('explode').play(); if (player.intersects(self)) { player.takeDamage(100); // Inflict damage to player } // Check for zombies in red area zombies.forEach(function (zombie) { if (zombie.intersects(self)) { if (zombie.takeDamage(100)) { // Inflict damage to zombie and check if it dies zombies.splice(zombies.indexOf(zombie), 1); // Remove zombie from the array if it dies zombie.destroy(); // Destroy the zombie } } }); // Check for crates in red area obstacles.forEach(function (obstacle) { if (obstacle.type === 'crate' && obstacle.intersects(self)) { obstacle.destroy(); // Destroy the crate obstacles.splice(obstacles.indexOf(obstacle), 1); // Remove crate from the array } }); // Add explosion effect var explosion = LK.getAsset('explosionEffect', { anchorX: 0.5, anchorY: 0.5, x: self.x, y: self.y }); game.addChild(explosion); tween(explosion, {}, { duration: 500, onFinish: function onFinish() { explosion.destroy(); } }); self.destroy(); // Remove bomb after explosion }; return self; }); var Bullet = Container.expand(function (startX, startY, targetX, targetY, damage) { var self = Container.call(this); var bulletGraphic = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 15; self.damage = damage || 10; // Calculate direction vector var dx = targetX - startX; var dy = targetY - startY; var distance = Math.sqrt(dx * dx + dy * dy); self.vx = dx / distance * self.speed; self.vy = dy / distance * self.speed; self.x = startX; self.y = startY; self.update = function () { self.x += self.vx; self.y += self.vy; bulletGraphic.rotation = Math.atan2(self.vy, self.vx); // Check if bullet is out of bounds if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) { return true; // Remove bullet } // Check proximity to barrels for (var i = 0; i < obstacles.length; i++) { if (obstacles[i] instanceof Barrel && Math.abs(self.x - obstacles[i].x) < 50 && Math.abs(self.y - obstacles[i].y) < 50) { return true; // Remove bullet } } // Check proximity to zombies for (var j = 0; j < zombies.length; j++) { if (Math.abs(self.x - zombies[j].x) < 50 && Math.abs(self.y - zombies[j].y) < 50) { return true; // Remove bullet } } return false; }; return self; }); var Missile = Container.expand(function (startX, startY, targetX, targetY, damage) { var self = Container.call(this); var missileGraphic = self.attachAsset('missile', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.damage = damage || 20; var dx = targetX - startX; var dy = targetY - startY; var distance = Math.sqrt(dx * dx + dy * dy); self.vx = dx / distance * self.speed; self.vy = dy / distance * self.speed; self.x = startX; self.y = startY; self.update = function () { self.x += self.vx; self.y += self.vy; missileGraphic.rotation = Math.atan2(self.vy, self.vx); if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) { return true; } return false; }; return self; }); var Obstacle = Container.expand(function (x, y, type) { var self = Container.call(this); var obstacleGraphic = self.attachAsset(type === 'stone' ? 'stone' : type === 'crate' ? 'crate' : 'bush', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.type = type; // Store the type of obstacle self.update = function () { // Check for bullet collision with crate if (self.type === 'crate') { for (var i = bullets.length - 1; i >= 0; i--) { if (bullets[i].intersects(self)) { // Display bullet effect at the point of impact var bulletEffect = LK.getAsset('bulleteffect', { anchorX: 0.5, anchorY: 0.5, x: bullets[i].x, y: bullets[i].y }); game.addChild(bulletEffect); tween(bulletEffect, {}, { duration: 200, onFinish: function onFinish() { bulletEffect.destroy(); } }); bullets[i].destroy(); bullets.splice(i, 1); // 50% chance to drop a pickup when crate is destroyed if (Math.random() < 0.5) { spawnPickup(self.x, self.y); } self.destroy(); return true; // Remove crate } } } return false; }; self.spawnPickup = spawnPickup; // Make spawnPickup accessible return self; }); var Pickup = Container.expand(function (x, y, type) { var self = Container.call(this); var pickupGraphic = self.attachAsset(type === 'health' ? 'healthPack' : 'ammoBox', { anchorX: 0.5, anchorY: 0.5 }); self.type = type; // 'health' or 'ammo' self.x = x; self.y = y; self.lifespan = 10000; // milliseconds until pickup disappears self.creationTime = Date.now(); self.update = function () { // Make pickup pulse var age = Date.now() - self.creationTime; var pulse = Math.sin(age / 200) * 0.2 + 1; self.scale.set(pulse, pulse); // Check if pickup should expire if (age > self.lifespan) { return true; // Remove pickup } return false; }; self.collect = function (player) { LK.getSound('pickup').play(); if (self.type === 'health') { player.heal(25); } else if (self.type === 'ammo') { player.ammo = player.maxAmmo; } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerWalkingGraphic = self.attachAsset('player1', { // Walking animation anchorX: 0.5, anchorY: 0.5 }); var playerIdleGraphic = self.attachAsset('player', { // Idle animation anchorX: 0.5, anchorY: 0.5 }); playerIdleGraphic.visible = true; // Start with idle animation playerWalkingGraphic.visible = false; // Hide walking animation initially self.health = 100; self.maxHealth = 100; self.ammo = 30; self.maxAmmo = 30; self.reloadTime = 1000; // milliseconds self.isReloading = false; self.speed = 7; self.weaponLevel = storage.weaponLevel || 0.5; // Reduced initial weapon level self.bulletDamage = 10 * self.weaponLevel; // Adjusted bullet damage to prevent one-hit kills in wave 1 self.lastShotTime = 0; self.shootDelay = 300; // milliseconds between shots self.moveTowards = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); // Play walking sound if player is moving if (distance > 0) { LK.getSound('walk').play(); if (!self.walkingTimeout) { self.walkingTimeout = LK.setTimeout(function () { playerWalkingGraphic.visible = true; // Show walking animation playerIdleGraphic.visible = false; // Hide idle animation }, 2000); } } else { playerWalkingGraphic.visible = false; // Hide walking animation playerIdleGraphic.visible = true; // Show idle animation if (self.walkingTimeout) { LK.clearTimeout(self.walkingTimeout); self.walkingTimeout = null; } } if (distance > self.speed) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } else { self.x = targetX; self.y = targetY; } // Keep player within bounds self.x = Math.max(50, Math.min(2048 - 50, self.x)); self.y = Math.max(50, Math.min(2732 - 50, self.y)); }; self.shoot = function (targetX, targetY) { var currentTime = Date.now(); if (!self.infiniteAmmo && self.ammo <= 0) { self.reload(); return null; } if (self.isReloading) { return null; } if (currentTime - self.lastShotTime < self.shootDelay) { return null; } self.lastShotTime = currentTime; self.ammo--; LK.getSound('shoot').play(); LK.getSound('shoot').play(); // Switch to player2 appearance when shooting playerIdleGraphic.visible = false; playerWalkingGraphic.visible = false; var playerShootingGraphic = self.attachAsset('player2', { anchorX: 0.5, anchorY: 0.5 }); self.addChild(playerShootingGraphic); // Revert back to idle or walking appearance after shooting LK.setTimeout(function () { playerShootingGraphic.destroy(); if (self.vx !== 0 || self.vy !== 0) { playerWalkingGraphic.visible = true; } else { playerIdleGraphic.visible = true; } }, self.shootDelay); // 25% chance for a critical hit var criticalHit = Math.random() < 0.25; var damage = criticalHit ? self.bulletDamage * 2 : self.bulletDamage; var bullet = new Bullet(self.x, self.y, targetX, targetY, damage); // Removed critical effect display return bullet; }; self.reload = function () { if (!self.isReloading && self.ammo < self.maxAmmo) { self.isReloading = true; LK.setTimeout(function () { self.ammo = self.maxAmmo; self.isReloading = false; }, self.reloadTime); } }; self.takeDamage = function (damage) { if (self.children.some(function (child) { return child.name === 'shieldEffect'; })) { // If shield is active, prevent damage return false; } LK.getSound('playerHit').play(); LK.effects.flashObject(self, 0xff0000, 300); self.health -= damage; if (self.health <= 0) { self.health = 0; return true; // player died } return false; // player still alive }; self.heal = function (amount) { self.health = Math.min(self.maxHealth, self.health + amount); }; self.upgradeWeapon = function () { self.weaponLevel++; self.bulletDamage = 10 * self.weaponLevel; storage.weaponLevel = self.weaponLevel; }; self.activateMissileMode = function () { var originalShoot = self.shoot; // Store the original shoot function self.missileMode = true; self.shoot = function (targetX, targetY) { var currentTime = Date.now(); if (!self.infiniteAmmo && self.ammo <= 0) { self.reload(); return null; } if (self.isReloading) { return null; } if (currentTime - self.lastShotTime < self.shootDelay) { return null; } self.lastShotTime = currentTime; self.ammo--; LK.getSound('shoot').play(); var missile = new Missile(self.x, self.y, targetX, targetY, self.bulletDamage); return missile; }; LK.setTimeout(function () { self.missileMode = false; self.shoot = originalShoot; }, 20000); // Missile mode lasts for 20 seconds }; self.activateShield = function () { // Logic to activate shield console.log("Shield activated for player!"); var shieldGraphic = self.attachAsset('shieldEffect', { anchorX: 0.5, anchorY: 0.5 }); shieldGraphic.alpha = 0.5; // Make the shield semi-transparent self.addChild(shieldGraphic); // Add shield effect next to health bar var shieldBar = LK.getAsset('shieldEffect', { anchorX: 0, anchorY: 0.5 }); LK.gui.bottomLeft.addChild(shieldBar); shieldBar.x = healthBar.x + healthBar.width + 10; shieldBar.y = healthBar.y; // Add shield countdown text next to shield effect var shieldCountdownText = new Text2('20', { size: 40, fill: 0xFFFFFF }); shieldCountdownText.anchor.set(0, 0.5); LK.gui.bottomLeft.addChild(shieldCountdownText); shieldCountdownText.x = shieldBar.x + shieldBar.width + 10; shieldCountdownText.y = shieldBar.y; var countdown = 20; var countdownInterval = LK.setInterval(function () { countdown--; shieldCountdownText.setText(countdown.toString()); if (countdown <= 0) { LK.clearInterval(countdownInterval); shieldBar.destroy(); shieldCountdownText.destroy(); } }, 1000); // Remove shield after 20 seconds LK.setTimeout(function () { shieldGraphic.destroy(); }, 20000); }; return self; }); var ShieldChest = Container.expand(function (x, y) { var self = Container.call(this); var shieldChestGraphic = self.attachAsset('shieldchest', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.update = function () { // Make shield chest pulse var age = Date.now() - self.creationTime; var pulse = Math.sin(age / 200) * 0.2 + 1; self.scale.set(pulse, pulse); return false; }; self.collect = function (player) { LK.getSound('pickup').play(); // Display 'Shield Activated' text on screen var shieldText = new Text2('Shield Activated', { size: 150, fill: 0x000000 }); shieldText.anchor.set(0.5, 0.5); shieldText.x = 2048 / 2; shieldText.y = 2732 / 4; // Position higher on the screen game.addChild(shieldText); tween(shieldText, { alpha: 0 }, { duration: 4000, onFinish: function onFinish() { shieldText.destroy(); } }); player.activateShield(); // Display countdown timer for shield effect var shieldCountdownText = new Text2('20', { size: 60, fill: 0xFFFFFF }); shieldCountdownText.anchor.set(1, 1); shieldCountdownText.x = 2048; shieldCountdownText.y = 2732; LK.gui.bottomRight.addChild(shieldCountdownText); // Display shield effect text in the bottom left corner var shieldEffectText = new Text2('Shield Active', { size: 60, fill: 0xFFFFFF }); shieldEffectText.anchor.set(0, 1); shieldEffectText.x = 20; shieldEffectText.y = 2732; LK.gui.bottomLeft.addChild(shieldEffectText); var countdown = 20; var countdownInterval = LK.setInterval(function () { countdown--; shieldCountdownText.setText(countdown.toString()); if (countdown <= 0) { LK.clearInterval(countdownInterval); shieldCountdownText.destroy(); shieldEffectText.destroy(); // Remove shield effect text } }, 1000); self.destroy(); }; return self; }); var Upgrader = Container.expand(function (x, y) { var self = Container.call(this); var upgraderGraphic = self.attachAsset('Upgrade', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.update = function () { // Make upgrader pulse var age = Date.now() - self.creationTime; var pulse = Math.sin(age / 200) * 0.2 + 1; self.scale.set(pulse, pulse); return false; }; self.collect = function (player) { LK.getSound('pickup').play(); // Display 'Rocket Upgrade' text on screen var rocketUpgradeText = new Text2('Rocket Upgrade', { size: 150, fill: 0x000000 }); rocketUpgradeText.anchor.set(0.5, 0.5); rocketUpgradeText.x = 2048 / 2; rocketUpgradeText.y = 2732 / 4; // Position higher on the screen game.addChild(rocketUpgradeText); tween(rocketUpgradeText, { alpha: 0 }, { duration: 4000, onFinish: function onFinish() { rocketUpgradeText.destroy(); } }); player.activateMissileMode(); self.destroy(); }; return self; }); var Zombie = Container.expand(function (x, y, health, speed, damage) { var self = Container.call(this); var zombieGraphic = self.attachAsset('zombie', { anchorX: 0.5, anchorY: 0.5 }); // Add health bar background var healthBarBg = LK.getAsset('healthBarBg', { anchorX: 0.5, anchorY: 1.0, x: 0, y: -zombieGraphic.height / 2 - 10, scaleX: 0.5, // Reduce the width of the health bar background scaleY: 0.5 // Reduce the height of the health bar background }); self.addChild(healthBarBg); // Add health bar var healthBar = LK.getAsset('healthBar', { anchorX: 0.5, anchorY: 1.0, x: 0, y: -zombieGraphic.height / 2 - 10, scaleX: 0.5, // Reduce the width of the health bar scaleY: 0.5 // Reduce the height of the health bar }); self.addChild(healthBar); self.health = health || 30; self.maxHealth = self.health; self.speed = speed || 3; // Increased speed for regular zombies self.damage = damage || 10; self.attackCooldown = 1000; // milliseconds self.lastAttackTime = 0; self.x = x; self.y = y; self.moveTowards = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; self.attack = function (player) { var currentTime = Date.now(); if (currentTime - self.lastAttackTime >= self.attackCooldown) { self.lastAttackTime = currentTime; return player.takeDamage(self.damage); } return false; }; self.takeDamage = function (damage) { self.health -= damage; // Update health bar scale var healthPercentage = self.health / self.maxHealth; healthBar.scale.x = healthPercentage; // Flash zombie when hit LK.effects.flashObject(self, 0xff0000, 200); LK.getSound('zombieHit').play(); // Change color based on health percentage var healthPercentage = self.health / self.maxHealth; var green = Math.floor(204 * healthPercentage); zombieGraphic.tint = 0 << 16 | green << 8 | 0; if (self.health <= 0) { if (damage > player.bulletDamage) { // Check if it was a critical hit var criticalEffect = LK.getAsset('criticalEffect', { anchorX: 0.5, anchorY: 0.5, x: self.x, y: self.y }); game.addChild(criticalEffect); tween(criticalEffect, {}, { // Use tween to extend the duration duration: 500, // Extend duration to 500ms onFinish: function onFinish() { criticalEffect.destroy(); } }); } // 20% chance to trigger infinite ammo power-up if (Math.random() < 0.2) { player.infiniteAmmo = true; LK.setTimeout(function () { player.infiniteAmmo = false; }, 10000); // 10 seconds duration } // Remove health bar healthBar.destroy(); healthBarBg.destroy(); // Add dead zombie appearance var deadZombie = LK.getAsset('deathzombie', { anchorX: 0.5, anchorY: 0.5, x: self.x, y: self.y }); game.addChild(deadZombie); tween(deadZombie, {}, { duration: 2000, onFinish: function onFinish() { deadZombie.destroy(); } }); return true; // zombie died } return false; // zombie still alive }; return self; }); var SludgeZombie = Zombie.expand(function (x, y, health, speed, damage) { var self = Zombie.call(this, x, y, health, speed, damage); self.removeChild(self.getChildAt(0)); // Remove the default zombie graphic var sludgeZombieGraphic = self.attachAsset('slimeZombie', { anchorX: 0.5, anchorY: 0.5 }); self.speed = speed || 1.5; // Set speed for sludge zombies self.health = health || 40; // Set health for sludge zombies self.damage = damage || 10; // Set damage for sludge zombies // Override takeDamage to spawn new zombies upon death var originalTakeDamage = self.takeDamage; self.takeDamage = function (damage) { var died = originalTakeDamage.call(self, damage); if (died) { for (var i = 0; i < 3; i++) { var newZombie = new Zombie(self.x + Math.random() * 50 - 25, self.y + Math.random() * 50 - 25, 20, 1, 5); zombies.push(newZombie); game.addChild(newZombie); } } return died; }; return self; }); var SlimeZombie = Zombie.expand(function (x, y, health, speed, damage) { var self = Zombie.call(this, x, y, health, speed, damage); self.removeChild(self.getChildAt(0)); // Remove the default zombie graphic var slimeZombieGraphic = self.attachAsset('zombie', { anchorX: 0.5, anchorY: 0.5 }); self.speed = speed || 1.0; // Set speed for slime zombies self.health = health || 30; // Set health for slime zombies self.damage = damage || 5; // Set damage for slime zombies // Override takeDamage to spawn new zombies upon death var originalTakeDamage = self.takeDamage; self.takeDamage = function (damage) { var died = originalTakeDamage.call(self, damage); if (died) { for (var i = 0; i < 3; i++) { var newZombie = new Zombie(self.x + Math.random() * 50 - 25, self.y + Math.random() * 50 - 25, 10, 0.5, 2); zombies.push(newZombie); game.addChild(newZombie); } } return died; }; return self; }); var SkeletonZombie = Zombie.expand(function (x, y, health, speed, damage) { var self = Zombie.call(this, x, y, health, speed, damage); self.removeChild(self.getChildAt(0)); // Remove the default zombie graphic var skeletonZombieGraphic = self.attachAsset('skeletonZombie', { anchorX: 0.5, anchorY: 0.5 }); self.speed = speed || 2.5; // Set speed for skeleton zombies self.health = health || 100; // Increase health for skeleton zombies to prevent one-hit kills self.damage = damage || 15; // Set damage for skeleton zombies return self; }); var FastZombie = Zombie.expand(function (x, y, health, speed, damage) { var self = Zombie.call(this, x, y, health, speed, damage); self.removeChild(self.getChildAt(0)); // Remove the default zombie graphic var fastZombieGraphic = self.attachAsset('fastZombie', { anchorX: 0.5, anchorY: 0.5 }); self.speed = speed || 600; // Further increased speed for fast zombies return self; }); var BossZombie = Zombie.expand(function (x, y, waveNumber) { var self = Zombie.call(this, x, y, bossHealth, bossSpeed, bossDamage); // Calculate boss stats based on wave number var bossHealth = Math.max(5000, 5000 + waveNumber * 500); // Ensure minimum health of 5000 var bossSpeed = 12.0 + waveNumber * 1.5; // Significantly increase base speed and scaling factor for boss var bossDamage = 50 + waveNumber * 10; // Replace the zombie graphic with a boss graphic self.removeChild(self.getChildAt(0)); // Remove the zombie graphic var bossGraphic = self.attachAsset('bossZombie', { anchorX: 0.5, anchorY: 0.5 }); self.scoreValue = 100; // More points for killing a boss return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ function spawnSlimeZombie(health, speed, damage) { var edge = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left var x, y; switch (edge) { case 0: x = Math.random() * 2048; y = -100; break; case 1: x = 2048 + 100; y = Math.random() * 2732; break; case 2: x = Math.random() * 2048; y = 2732 + 100; break; case 3: x = -100; y = Math.random() * 2732; break; } var slimeZombie = new SlimeZombie(x, y, health, speed, damage); zombies.push(slimeZombie); game.addChild(slimeZombie); } function spawnSludgeZombie(health, speed, damage) { var edge = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left var x, y; switch (edge) { case 0: x = Math.random() * 2048; y = -100; break; case 1: x = 2048 + 100; y = Math.random() * 2732; break; case 2: x = Math.random() * 2048; y = 2732 + 100; break; case 3: x = -100; y = Math.random() * 2732; break; } var sludgeZombie = new SludgeZombie(x, y, health, speed, damage); zombies.push(sludgeZombie); game.addChild(sludgeZombie); } function spawnSkeletonZombie(health, speed, damage) { var edge = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left var x, y; switch (edge) { case 0: x = Math.random() * 2048; y = -100; break; case 1: x = 2048 + 100; y = Math.random() * 2732; break; case 2: x = Math.random() * 2048; y = 2732 + 100; break; case 3: x = -100; y = Math.random() * 2732; break; } var skeletonZombie = new SkeletonZombie(x, y, health, speed, damage); zombies.push(skeletonZombie); game.addChild(skeletonZombie); } function spawnFastZombie(health, speed, damage) { var edge = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left var x, y; switch (edge) { case 0: x = Math.random() * 2048; y = -100; break; case 1: x = 2048 + 100; y = Math.random() * 2732; break; case 2: x = Math.random() * 2048; y = 2732 + 100; break; case 3: x = -100; y = Math.random() * 2732; break; } var fastZombie = new FastZombie(x, y, health, speed, damage); zombies.push(fastZombie); game.addChild(fastZombie); } // Game state variables var player; var legendaryChest; // Define legendaryChest in the global scope var obstacles = []; var bullets = []; var bulletHitZombies = {}; // Use a plain object to track which zombies have been hit by which bullets var zombies = []; var missiles = []; var pickups = []; var wave = 1; var zombiesKilled = 0; var score = 0; var gameStartTime; var waveStartTime; var isWaveActive = false; var targetPosition = { x: 0, y: 0 }; var isGameOver = false; // UI elements var scoreText; var waveText; var healthBar; var healthBarBg; var ammoBar; var ammoBarBg; var gameStatusText; var maxScoreText; // Declare maxScoreText in the global scope function initGame() { // Reset game state wave = 1; zombiesKilled = 0; score = 0; bullets = []; zombies = []; pickups = []; isWaveActive = false; isGameOver = false; gameStartTime = Date.now(); // Set background var background = LK.getAsset('backgroundImage', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 }); game.addChild(background); background.zIndex = -1; // Ensure the background is rendered behind other elements // Play background music LK.playMusic('Ozone', { fade: { start: 0, end: 0.3, duration: 1000 } }); // Create player at center of screen player = new Player(); player.infiniteAmmo = false; // Initialize infinite ammo property player.x = 2048 / 2; player.y = 2732 / 2; // Add max score display maxScoreText = new Text2('Max Score: ' + storage.highscore, { size: 40, fill: 0xFFFFFF }); maxScoreText.anchor.set(0.5, 0); LK.gui.top.addChild(maxScoreText); maxScoreText.x = 0; maxScoreText.y = 80; if (player) { player.lastX = player.x; // Initialize lastX for tracking player.lastY = player.y; // Initialize lastY for tracking } game.addChild(player); // Add obstacles var obstacles = []; // Add barrels at random positions for (var i = 0; i < 5; i++) { var randomX = Math.random() * 2048; var randomY = Math.random() * 2732; var barrel = new Barrel(randomX, randomY); obstacles.push(barrel); game.addChild(barrel); } // Create an object at the right corner of the screen var rightCornerObject = LK.getAsset('crate', { anchorX: 1.0, anchorY: 0.5, x: 2048, y: 1366 }); game.addChild(rightCornerObject); // Add an abandoned car to the top-right corner of the screen var abandonedCarTopRight = LK.getAsset('abandonedCar', { anchorX: 1.0, anchorY: 0.0, x: 2048, y: 0 }); game.addChild(abandonedCarTopRight); abandonedCarTopRight.zIndex = 1; // Ensure the car is rendered in front of the background // Add abandoned cars to their original positions for (var i = 0; i < 3; i++) { var randomX = Math.random() * 2048; var randomY = Math.random() * 2732; var abandonedCar = LK.getAsset('abandonedCar', { anchorX: 0.5, anchorY: 0.5, x: randomX, y: randomY }); game.addChild(abandonedCar); abandonedCar.zIndex = 1; // Ensure the car is rendered in front of the background } // Add decorative elements to the corners obstacles.push(new Obstacle(150, 150, 'bush')); // Near top-left corner obstacles.push(new Obstacle(1898, 150, 'bush')); // Near top-right corner obstacles.push(new Obstacle(150, 2582, 'bush')); // Near bottom-left corner obstacles.push(new Obstacle(1898, 2582, 'bush')); // Near bottom-right corner obstacles.push(new Obstacle(150, 150, 'crate')); // Near top-left corner obstacles.push(new Obstacle(1898, 150, 'crate')); // Near top-right corner obstacles.push(new Obstacle(150, 2582, 'crate')); // Near bottom-left corner obstacles.push(new Obstacle(1898, 2582, 'crate')); // Near bottom-right corner obstacles.push(new Barrel(200, 200)); // Near top-left corner obstacles.push(new Barrel(1848, 200)); // Near top-right corner obstacles.push(new Barrel(200, 2432)); // Near bottom-left corner obstacles.push(new Barrel(1848, 2432)); // Near bottom-right corner // Add more bushes for (var i = 0; i < 50; i++) { // Increased from 20 to 50 for more bushes var randomX = Math.random() * 2048; var randomY = Math.random() * 2732; obstacles.push(new Obstacle(randomX, randomY, 'bush')); } // Add small stone patterns for (var i = 0; i < 100; i++) { // Increased from 50 to 100 for more stones var randomX = Math.random() * 2048; var randomY = Math.random() * 2732; obstacles.push(new Obstacle(randomX, randomY, 'stone')); } // Add more crate obstacles at random positions for (var i = 0; i < 10; i++) { var randomX = Math.random() * 2048; var randomY = Math.random() * 2732; obstacles.push(new Obstacle(randomX, randomY, 'crate')); } obstacles.forEach(function (obstacle) { game.addChild(obstacle); }); // Initialize UI createUI(); // Start first wave startWave(); } function createUI() { // Score text scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); scoreText.x = 0; scoreText.y = 20; // Wave text waveText = new Text2('Wave: 1', { size: 60, fill: 0xFFFFFF }); waveText.anchor.set(0, 0); LK.gui.topLeft.addChild(waveText); waveText.x = 20; waveText.y = 20; // Game status text (wave start, game over, etc.) gameStatusText = new Text2('', { size: 100, fill: 0xFFFFFF }); gameStatusText.anchor.set(0.5, 0.5); LK.gui.center.addChild(gameStatusText); gameStatusText.alpha = 0; // Adjust gameStatusText position to be slightly below the wave text gameStatusText.y = waveText.y + 70; // Health bar background healthBarBg = LK.getAsset('healthBarBg', { anchorX: 0, anchorY: 0.5 }); LK.gui.bottomLeft.addChild(healthBarBg); healthBarBg.x = 20; healthBarBg.y = -50; // Health bar healthBar = LK.getAsset('healthBar', { anchorX: 0, anchorY: 0.5 }); LK.gui.bottomLeft.addChild(healthBar); healthBar.x = 20; healthBar.y = -50; // Ammo bar background ammoBarBg = LK.getAsset('ammoBarBg', { anchorX: 0, anchorY: 0.5 }); LK.gui.bottomLeft.addChild(ammoBarBg); ammoBarBg.x = 20; ammoBarBg.y = -100; // Ammo bar ammoBar = LK.getAsset('ammoBar', { anchorX: 0, anchorY: 0.5 }); LK.gui.bottomLeft.addChild(ammoBar); ammoBar.x = 20; ammoBar.y = -100; // Game status text (wave start, game over, etc.) gameStatusText = new Text2('', { size: 100, fill: 0xFFFFFF }); gameStatusText.anchor.set(0.5, 0.5); LK.gui.center.addChild(gameStatusText); gameStatusText.alpha = 0; } function updateUI() { // Update score scoreText.setText('Score: ' + score); // Update player name and score display player.getChildAt(0).text = 'Player ' + (Math.floor(Math.random() * 1000) + 1) + ' | Score: ' + score; // Update max score display maxScoreText.setText('Max Score: ' + storage.highscore); // Update wave waveText.setText('Wave: ' + wave); // Update health bar var healthPercent = player.health / player.maxHealth; healthBar.scale.x = healthPercent; // Update ammo bar var ammoPercent = player.ammo / player.maxAmmo; ammoBar.scale.x = ammoPercent; // Change ammo bar color when reloading if (player.isReloading) { ammoBar.tint = 0xff6600; } else { ammoBar.tint = 0xcc9900; } } function startWave() { waveStartTime = Date.now(); isWaveActive = false; // Display countdown before wave starts var countdown = 7; gameStatusText.setText('Wave ' + wave + ' in ' + countdown); gameStatusText.alpha = 1; var countdownInterval = LK.setInterval(function () { countdown--; if (countdown > 0) { gameStatusText.setText('Wave ' + wave + ' in ' + countdown); } else { LK.clearInterval(countdownInterval); isWaveActive = true; gameStatusText.setText('WAVE ' + wave); tween(gameStatusText, { alpha: 0 }, { duration: 1500, easing: tween.easeIn }); LK.getSound('newWave').play(); // Randomly spawn a ShieldChest or Upgrader if (Math.random() < 0.5) { var shieldChest = new ShieldChest(Math.random() * 2048, Math.random() * 2732); game.addChild(shieldChest); pickups.push(shieldChest); } else { var upgrader = new Upgrader(Math.random() * 2048, Math.random() * 2732); game.addChild(upgrader); pickups.push(upgrader); } } }, 1000); // Spawn zombies based on wave number var zombieCount = wave === 1 ? 5 : wave === 2 ? 3 : wave === 3 ? 4 : 5 + wave * 2; // Reduced zombie count for first three waves var zombieHealth = wave === 1 ? 20 : wave === 2 ? 25 : wave === 3 ? 30 : 30 + wave * 5; // Reduced health for first three waves var zombieSpeed = wave === 1 ? 1.0 : wave === 2 ? 1.1 : wave === 3 ? 1.2 : 2 + wave * 0.1; // Reduced speed for first three waves var zombieDamage = wave === 1 ? 3 : wave === 2 ? 4 : wave === 3 ? 5 : 10 + wave * 2; // Reduced damage for first three waves // Schedule zombie spawns over time // Delay zombie spawning until countdown is complete var spawnInterval = LK.setInterval(function () { if (isWaveActive && zombies.length < zombieCount) { if (wave >= 3 && Math.random() < 0.3 + wave * 0.05) { // Increase chance to spawn a sludge zombie as waves progress spawnSludgeZombie(zombieHealth, zombieSpeed, zombieDamage); } else if (Math.random() < 0.2 - wave * 0.01) { // Decrease chance to spawn a skeleton zombie initially, but increase as waves progress spawnSkeletonZombie(zombieHealth, zombieSpeed, zombieDamage); } else if (Math.random() < 0.2) { // 20% chance to spawn a fast zombie spawnFastZombie(zombieHealth, zombieSpeed * 2, zombieDamage); // Double the speed for fast zombies } else { spawnZombie(zombieHealth, zombieSpeed, zombieDamage); } } else if (zombies.length >= zombieCount) { LK.clearInterval(spawnInterval); } }, 500); // Spawn a boss every 5 waves if (wave % 5 === 0) { LK.setTimeout(function () { spawnBossZombie(); }, 5000); } } function spawnZombie(health, speed, damage) { var edge = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left var x, y; switch (edge) { case 0: // top x = Math.random() * 2048; y = -100; break; case 1: // right x = 2048 + 100; y = Math.random() * 2732; break; case 2: // bottom x = Math.random() * 2048; y = 2732 + 100; break; case 3: // left x = -100; y = Math.random() * 2732; break; } var zombie = new Zombie(x, y, health, speed, damage); zombies.push(zombie); game.addChild(zombie); } function spawnBossZombie() { // Spawn boss at a random edge var edge = Math.floor(Math.random() * 4); var x, y; switch (edge) { case 0: // top x = Math.random() * 2048; y = -150; break; case 1: // right x = 2048 + 150; y = Math.random() * 2732; break; case 2: // bottom x = Math.random() * 2048; y = 2732 + 150; break; case 3: // left x = -150; y = Math.random() * 2732; break; } var boss = new BossZombie(x, y, wave); zombies.push(boss); game.addChild(boss); // Play boss appear sound LK.getSound('bossAppear').play(); // Show boss alert gameStatusText.setText('BOSS ZOMBIE APPEARED!'); gameStatusText.alpha = 1; tween(gameStatusText, { alpha: 0 }, { duration: 2000, easing: tween.easeIn }); } function spawnPickup(x, y) { // 30% chance for health, 70% for ammo var type = Math.random() < 0.3 ? 'health' : 'ammo'; var pickup = new Pickup(x, y, type); pickups.push(pickup); game.addChild(pickup); } function checkWaveCompletion() { if (isWaveActive && zombies.length === 0 && !isGameOver && zombiesKilled >= 3 + wave) { isWaveActive = false; // Display wave complete message gameStatusText.setText('WAVE ' + wave + ' COMPLETE!'); gameStatusText.alpha = 1; // Give player a weapon upgrade every 3 waves if (wave % 3 === 0) { player.upgradeWeapon(); // Show upgrade message LK.setTimeout(function () { gameStatusText.setText('WEAPON UPGRADED!'); }, 2000); } // Spawn crates as objects after wave completion for (var i = 0; i < 5; i++) { var randomX = Math.random() * 2048; var randomY = Math.random() * 2732; var crate = new Obstacle(randomX, randomY, 'crate'); obstacles.push(crate); game.addChild(crate); } // Spawn barrels at the end of each wave for (var i = 0; i < 3; i++) { var randomX = Math.random() * 2048; var randomY = Math.random() * 2732; var barrel = new Barrel(randomX, randomY); obstacles.push(barrel); game.addChild(barrel); } // Start next wave after a 5-second delay LK.setTimeout(function () { wave++; gameStatusText.alpha = 0; startWave(); }, 5000); } } // Event handling game.down = function (x, y) { if (isGameOver) { return; } targetPosition.x = x; targetPosition.y = y; // Player shoots at clicked position var bullet = player.shoot(x, y); if (bullet) { bullets.push(bullet); game.addChild(bullet); } }; game.move = function (x, y) { targetPosition.x = x; targetPosition.y = y; }; game.up = function () { // Not needed for this game }; // Main game update loop game.update = function () { if (isGameOver) { return; } // Check for player collision with obstacles obstacles.forEach(function (obstacle) { if (player.intersects(obstacle) && obstacle.type !== 'crate') { // Prevent player from moving through the obstacle, except crates player.x = player.lastX; player.y = player.lastY; } }); // Update player movement if (player) { player.lastX = player.x; // Track lastX before moving player.lastY = player.y; // Track lastY before moving player.moveTowards(targetPosition.x, targetPosition.y); // Check if player is near the legendary chest if (!player.nearLegendaryChest && player.intersects(legendaryChest)) { player.nearLegendaryChest = true; player.legendaryChestTimer = Date.now(); } else if (player.nearLegendaryChest && !player.intersects(legendaryChest)) { player.nearLegendaryChest = false; player.legendaryChestTimer = null; } // Open the legendary chest if the player stands next to it for 3 seconds if (player.nearLegendaryChest && Date.now() - player.legendaryChestTimer >= 3000) { // Logic to open the chest console.log("Legendary chest opened!"); legendaryChest.destroy(); legendaryChest = null; // Set legendaryChest to null after destroying it // Change appearance to legendary2 var legendary2 = LK.getAsset('legendary2', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, visible: true // Make legendary2 visible }); game.addChild(legendary2); // Randomly decide to spawn an upgrader or shield chest if (Math.random() < 0.5) { var upgrader = new Upgrader(2048 / 2, 2732 / 2); game.addChild(upgrader); pickups.push(upgrader); } else { var shieldChest = new ShieldChest(2048 / 2, 2732 / 2); game.addChild(shieldChest); pickups.push(shieldChest); } player.nearLegendaryChest = false; player.legendaryChestTimer = null; } // Regenerate health slowly if not at max health if (player.health < player.maxHealth) { player.health = Math.min(player.maxHealth, player.health + 0.05); // Regenerate 0.05 health per update } } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var shouldRemove = bullets[i].update(); if (shouldRemove) { bullets[i].destroy(); bullets.splice(i, 1); continue; } // Check bullet collision with zombies for (var j = zombies.length - 1; j >= 0; j--) { if (bullets[i] && bullets[i].intersects(zombies[j])) { // Display bullet effect at the point of impact var bulletEffect = LK.getAsset('bulleteffect', { anchorX: 0.5, anchorY: 0.5, x: bullets[i].x, y: bullets[i].y }); game.addChild(bulletEffect); tween(bulletEffect, {}, { duration: 200, onFinish: function onFinish() { bulletEffect.destroy(); } }); // Check if this bullet has already hit this zombie if (!bulletHitZombies[bullets[i]]) { bulletHitZombies[bullets[i]] = []; } if (!bulletHitZombies[bullets[i]].includes(zombies[j])) { bulletHitZombies[bullets[i]].push(zombies[j]); var zombieDied = zombies[j].takeDamage(bullets[i].damage); // Remove bullet after hit bullets[i].destroy(); bullets.splice(i, 1); if (zombieDied) { // Increase score and zombie kill counter var scoreToAdd = zombies[j] instanceof BossZombie ? 100 : 10; score += scoreToAdd; zombiesKilled++; // Chance to drop pickup if (Math.random() < 0.3) { spawnPickup(zombies[j].x, zombies[j].y); } // Remove zombie zombies[j].destroy(); zombies.splice(j, 1); } break; } } } } // Update obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var shouldRemove = obstacles[i].update(); if (shouldRemove) { obstacles[i].destroy(); obstacles.splice(i, 1); } } // Update zombies for (var i = zombies.length - 1; i >= 0; i--) { // Move zombie towards player zombies[i].moveTowards(player.x, player.y); // Check if zombie reached player if (zombies[i].intersects(player)) { var playerDied = zombies[i].attack(player); if (playerDied) { handleGameOver(); } } } for (var i = pickups.length - 1; i >= 0; i--) { var shouldRemove = pickups[i].update(); if (shouldRemove) { pickups[i].destroy(); pickups.splice(i, 1); continue; } // Check if player collects pickup if (player.intersects(pickups[i])) { pickups[i].collect(player); pickups[i].destroy(); pickups.splice(i, 1); } } // Update UI updateUI(); // Spawn bomb in red area every 10 seconds, only if wave is active if (isWaveActive && LK.ticks % 600 === 0) { var bombX = Math.random() * 2048; var bombY = Math.random() * 2732; var bomb = new Bomb(bombX, bombY); game.addChild(bomb); // Trigger explosion after 3 seconds LK.setTimeout(function () { bomb.explode(); }, 3000); } // Check if wave is complete checkWaveCompletion(); // Auto-reload when empty and not already reloading if (player.ammo === 0 && !player.isReloading) { player.reload(); } }; function handleGameOver() { isGameOver = true; // Fade out background music LK.playMusic('gameMusic', { fade: { start: 0.3, end: 0, duration: 1000 } }); // Update high score if needed if (score > storage.highscore) { storage.highscore = score; } // Show score in game over dialog LK.setScore(score); // Show game over screen after a short delay LK.setTimeout(function () { LK.showGameOver(); }, 1000); } initGame(); // Start the game immediately
===================================================================
--- original.js
+++ change.js
@@ -355,9 +355,11 @@
}, self.reloadTime);
}
};
self.takeDamage = function (damage) {
- if (self.getChildByName('shieldEffect')) {
+ if (self.children.some(function (child) {
+ return child.name === 'shieldEffect';
+ })) {
// If shield is active, prevent damage
return false;
}
LK.getSound('playerHit').play();