/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 15;
	self.directionX = 0;
	self.directionY = -1; // Default direction is up
	self.setDirection = function (dirX, dirY) {
		var length = Math.sqrt(dirX * dirX + dirY * dirY);
		if (length > 0) {
			self.directionX = dirX / length;
			self.directionY = dirY / length;
		}
	};
	self.update = function () {
		self.x += self.directionX * self.speed;
		self.y += self.directionY * self.speed;
	};
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 100;
	self.speed = 8;
	self.fireRate = 15; // Frames between shots
	self.fireCounter = 0;
	self.powerUpDuration = 300; // 5 seconds at 60fps
	self.speedBoostTimer = 0;
	self.fireRateBoostTimer = 0;
	self.takeDamage = function (amount) {
		self.health -= amount;
		if (self.health <= 0) {
			self.health = 0;
			return true; // Player died
		}
		// Flash player red when taking damage
		LK.effects.flashObject(self, 0xff0000, 300);
		LK.getSound('playerHit').play();
		return false; // Player still alive
	};
	self.applySpeedBoost = function () {
		self.speed = 16;
		self.speedBoostTimer = self.powerUpDuration;
		// Tint player to indicate boost
		tween(playerGraphics, {
			tint: 0x00ffff
		}, {
			duration: 300
		});
	};
	self.applyFireRateBoost = function () {
		self.fireRate = 5;
		self.fireRateBoostTimer = self.powerUpDuration;
		// Tint player to indicate boost
		tween(playerGraphics, {
			tint: 0xff9900
		}, {
			duration: 300
		});
	};
	self.update = function () {
		// Handle power-up timers
		if (self.speedBoostTimer > 0) {
			self.speedBoostTimer--;
			if (self.speedBoostTimer === 0) {
				self.speed = 8;
				tween(playerGraphics, {
					tint: 0xffffff
				}, {
					duration: 300
				});
			}
		}
		if (self.fireRateBoostTimer > 0) {
			self.fireRateBoostTimer--;
			if (self.fireRateBoostTimer === 0) {
				self.fireRate = 15;
				tween(playerGraphics, {
					tint: 0xffffff
				}, {
					duration: 300
				});
			}
		}
		// Keep player in bounds
		if (self.x < 50) {
			self.x = 50;
		}
		if (self.x > 2048 - 50) {
			self.x = 2048 - 50;
		}
		if (self.y < 50) {
			self.y = 50;
		}
		if (self.y > 2732 - 50) {
			self.y = 2732 - 50;
		}
		// Update fire counter
		if (self.fireCounter > 0) {
			self.fireCounter--;
		}
	};
	return self;
});
var PowerUp = Container.expand(function () {
	var self = Container.call(this);
	self.type = "health"; // Default type
	self.setup = function (type) {
		self.type = type;
		// Remove any existing children
		while (self.children.length > 0) {
			self.removeChild(self.children[0]);
		}
		// Attach appropriate asset based on type
		if (type === "health") {
			self.attachAsset('healthPack', {
				anchorX: 0.5,
				anchorY: 0.5
			});
		} else if (type === "speed") {
			self.attachAsset('speedBoost', {
				anchorX: 0.5,
				anchorY: 0.5
			});
		} else if (type === "fireRate") {
			self.attachAsset('fireRateBoost', {
				anchorX: 0.5,
				anchorY: 0.5
			});
		}
		// Make power-ups pulsate
		self.pulsateDirection = 1;
		return self;
	};
	self.update = function () {
		// Pulsate effect
		if (self.scale.x >= 1.2) {
			self.pulsateDirection = -0.01;
		} else if (self.scale.x <= 0.8) {
			self.pulsateDirection = 0.01;
		}
		self.scale.x += self.pulsateDirection;
		self.scale.y += self.pulsateDirection;
	};
	return self;
});
var Zombie = Container.expand(function () {
	var self = Container.call(this);
	var zombieGraphics = self.attachAsset('zombie', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 2;
	self.health = 3;
	self.takeDamage = function (amount) {
		self.health -= amount;
		// Flash zombie when hit
		LK.effects.flashObject(self, 0xff0000, 150);
		LK.getSound('zombieHit').play();
		return self.health <= 0;
	};
	self.setTarget = function (target) {
		self.target = target;
	};
	self.update = function () {
		if (!self.target) {
			return;
		}
		// Calculate direction to player
		var dx = self.target.x - self.x;
		var dy = self.target.y - self.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		if (distance > 0) {
			// Normalize and apply speed
			self.x += dx / distance * self.speed;
			self.y += dy / distance * self.speed;
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000,
	// Keep background color black
	backgroundImage: 'hh' // Set background image to 'hh'
});
/**** 
* Game Code
****/ 
// Game state variables
var player;
var zombies = [];
var bullets = [];
var powerUps = [];
var targetPosition = {
	x: 0,
	y: 0
};
var isShooting = false;
var gameActive = true;
var waveNumber = 1;
var zombiesKilled = 0;
var score = 0;
var nextWaveTimer = 0;
var powerUpSpawnTimer = 0;
// UI Elements
var scoreTxt;
var waveTxt;
var healthTxt;
// Initialize game
function initGame() {
	// Create player
	player = new Player();
	player.x = 2048 / 2;
	player.y = 2732 / 2;
	game.addChild(player);
	// Set initial target position to player position
	targetPosition.x = player.x;
	targetPosition.y = player.y;
	// Initialize UI
	setupUI();
	// Set score
	LK.setScore(0);
	// Start first wave
	spawnWave();
	// Start background music
	LK.playMusic('bgMusic', {
		loop: true,
		fade: {
			start: 0,
			end: 1,
			duration: 2000
		}
	});
}
function setupUI() {
	// Score text
	scoreTxt = new Text2('Score: 0', {
		size: 70,
		fill: 0xFFFFFF
	});
	scoreTxt.anchor.set(0, 0);
	LK.gui.topRight.addChild(scoreTxt);
	// Wave text
	waveTxt = new Text2('Wave: 1', {
		size: 70,
		fill: 0xFFFFFF
	});
	waveTxt.anchor.set(0.5, 0);
	LK.gui.top.addChild(waveTxt);
	// Health text
	healthTxt = new Text2('Health: 100', {
		size: 70,
		fill: 0xFFFFFF
	});
	healthTxt.anchor.set(1, 0);
	LK.gui.topLeft.addChild(healthTxt);
	// Position texts with some padding
	scoreTxt.x = -20; // Right align with padding
	scoreTxt.y = 20;
	waveTxt.y = 20;
	healthTxt.x = 120; // Left align with padding to avoid menu icon
	healthTxt.y = 20;
}
function spawnWave() {
	var zombiesToSpawn = 5 + waveNumber * 2;
	for (var i = 0; i < zombiesToSpawn; i++) {
		spawnZombie();
	}
	// Update wave text
	waveTxt.setText('Wave: ' + waveNumber);
	// Increase wave number for next wave
	waveNumber++;
}
function spawnZombie() {
	var zombie = new Zombie();
	// Determine spawn position (outside the visible area)
	var side = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left
	switch (side) {
		case 0:
			// top
			zombie.x = Math.random() * 2048;
			zombie.y = -100;
			break;
		case 1:
			// right
			zombie.x = 2048 + 100;
			zombie.y = Math.random() * 2732;
			break;
		case 2:
			// bottom
			zombie.x = Math.random() * 2048;
			zombie.y = 2732 + 100;
			break;
		case 3:
			// left
			zombie.x = -100;
			zombie.y = Math.random() * 2732;
			break;
	}
	// Set target to player
	zombie.setTarget(player);
	// Slightly randomize speed for variety
	zombie.speed = 2 + Math.random() * 0.5 * (waveNumber * 0.2);
	// Add to game and array
	game.addChild(zombie);
	zombies.push(zombie);
}
function spawnBullet() {
	if (player.fireCounter > 0) {
		return;
	}
	// Reset fire counter
	player.fireCounter = player.fireRate;
	// Create new bullet
	var bullet = new Bullet();
	bullet.x = player.x;
	bullet.y = player.y;
	// Set direction towards target
	var dx = targetPosition.x - player.x;
	var dy = targetPosition.y - player.y;
	bullet.setDirection(dx, dy);
	// Add to game and array
	game.addChild(bullet);
	bullets.push(bullet);
	// Play sound 
	LK.getSound('shoot').play();
}
function spawnPowerUp() {
	var powerUp = new PowerUp();
	// Randomly determine type
	var randomType = Math.floor(Math.random() * 3);
	var type;
	switch (randomType) {
		case 0:
			type = "health";
			break;
		case 1:
			type = "speed";
			break;
		case 2:
			type = "fireRate";
			break;
	}
	powerUp.setup(type);
	// Set random position (away from edges)
	powerUp.x = 100 + Math.random() * (2048 - 200);
	powerUp.y = 100 + Math.random() * (2732 - 200);
	// Add to game and array
	game.addChild(powerUp);
	powerUps.push(powerUp);
	// Reset spawn timer (10-15 seconds)
	powerUpSpawnTimer = 600 + Math.floor(Math.random() * 300);
}
function updateBullets() {
	for (var i = bullets.length - 1; i >= 0; i--) {
		var bullet = bullets[i];
		// Update bullet position
		bullet.update();
		// Check if bullet is off-screen
		if (bullet.x < -50 || bullet.x > 2048 + 50 || bullet.y < -50 || bullet.y > 2732 + 50) {
			bullet.destroy();
			bullets.splice(i, 1);
			continue;
		}
		// Check for collisions with zombies
		for (var j = zombies.length - 1; j >= 0; j--) {
			var zombie = zombies[j];
			if (bullet.intersects(zombie)) {
				// Damage zombie
				if (zombie.takeDamage(1)) {
					// Zombie died
					zombie.destroy();
					zombies.splice(j, 1);
					// Increase score
					zombiesKilled++;
					score += 10;
					LK.setScore(score);
					scoreTxt.setText('Score: ' + score);
				}
				// Remove bullet
				bullet.destroy();
				bullets.splice(i, 1);
				break;
			}
		}
	}
}
function updateZombies() {
	for (var i = zombies.length - 1; i >= 0; i--) {
		var zombie = zombies[i];
		// Update zombie movement
		zombie.update();
		// Check for collision with player
		if (zombie.intersects(player)) {
			if (player.takeDamage(10)) {
				// Player died
				gameOver();
				return;
			}
			// Update health text
			healthTxt.setText('Health: ' + player.health);
			// Remove zombie
			zombie.destroy();
			zombies.splice(i, 1);
		}
	}
	// Check if all zombies are cleared
	if (zombies.length === 0 && gameActive) {
		if (nextWaveTimer === 0) {
			nextWaveTimer = 180; // 3 seconds at 60fps
		}
	}
}
function updatePowerUps() {
	for (var i = powerUps.length - 1; i >= 0; i--) {
		var powerUp = powerUps[i];
		// Update power-up animation
		powerUp.update();
		// Check for collision with player
		if (powerUp.intersects(player)) {
			// Apply power-up effect
			if (powerUp.type === "health") {
				player.health = Math.min(100, player.health + 25);
				healthTxt.setText('Health: ' + player.health);
			} else if (powerUp.type === "speed") {
				player.applySpeedBoost();
			} else if (powerUp.type === "fireRate") {
				player.applyFireRateBoost();
			}
			// Play sound 
			LK.getSound('powerUp').play();
			// Remove power-up
			powerUp.destroy();
			powerUps.splice(i, 1);
		}
	}
}
function movePlayer() {
	if (!gameActive) {
		return;
	}
	var dx = targetPosition.x - player.x;
	var dy = targetPosition.y - player.y;
	var distance = Math.sqrt(dx * dx + dy * dy);
	if (distance > 5) {
		player.x += dx / distance * player.speed;
		player.y += dy / distance * player.speed;
	}
}
function gameOver() {
	gameActive = false;
	LK.showGameOver();
}
// Event handlers
game.down = function (x, y, obj) {
	if (!gameActive) {
		return;
	}
	targetPosition.x = x;
	targetPosition.y = y;
	isShooting = true;
};
game.move = function (x, y, obj) {
	if (!gameActive) {
		return;
	}
	targetPosition.x = x;
	targetPosition.y = y;
};
game.up = function (x, y, obj) {
	isShooting = false;
};
// Game update loop
game.update = function () {
	// Only update if game is active
	if (gameActive) {
		// Update player
		player.update();
		// Move player towards target
		movePlayer();
		// Handle shooting
		if (isShooting) {
			spawnBullet();
		}
		// Update game elements
		updateBullets();
		updateZombies();
		updatePowerUps();
		// Handle wave timer
		if (nextWaveTimer > 0) {
			nextWaveTimer--;
			if (nextWaveTimer === 0) {
				spawnWave();
			}
		}
		// Handle power-up spawn timer
		if (powerUpSpawnTimer > 0) {
			powerUpSpawnTimer--;
		} else {
			spawnPowerUp();
		}
	}
};
// Initialize the game
initGame(); /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 15;
	self.directionX = 0;
	self.directionY = -1; // Default direction is up
	self.setDirection = function (dirX, dirY) {
		var length = Math.sqrt(dirX * dirX + dirY * dirY);
		if (length > 0) {
			self.directionX = dirX / length;
			self.directionY = dirY / length;
		}
	};
	self.update = function () {
		self.x += self.directionX * self.speed;
		self.y += self.directionY * self.speed;
	};
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 100;
	self.speed = 8;
	self.fireRate = 15; // Frames between shots
	self.fireCounter = 0;
	self.powerUpDuration = 300; // 5 seconds at 60fps
	self.speedBoostTimer = 0;
	self.fireRateBoostTimer = 0;
	self.takeDamage = function (amount) {
		self.health -= amount;
		if (self.health <= 0) {
			self.health = 0;
			return true; // Player died
		}
		// Flash player red when taking damage
		LK.effects.flashObject(self, 0xff0000, 300);
		LK.getSound('playerHit').play();
		return false; // Player still alive
	};
	self.applySpeedBoost = function () {
		self.speed = 16;
		self.speedBoostTimer = self.powerUpDuration;
		// Tint player to indicate boost
		tween(playerGraphics, {
			tint: 0x00ffff
		}, {
			duration: 300
		});
	};
	self.applyFireRateBoost = function () {
		self.fireRate = 5;
		self.fireRateBoostTimer = self.powerUpDuration;
		// Tint player to indicate boost
		tween(playerGraphics, {
			tint: 0xff9900
		}, {
			duration: 300
		});
	};
	self.update = function () {
		// Handle power-up timers
		if (self.speedBoostTimer > 0) {
			self.speedBoostTimer--;
			if (self.speedBoostTimer === 0) {
				self.speed = 8;
				tween(playerGraphics, {
					tint: 0xffffff
				}, {
					duration: 300
				});
			}
		}
		if (self.fireRateBoostTimer > 0) {
			self.fireRateBoostTimer--;
			if (self.fireRateBoostTimer === 0) {
				self.fireRate = 15;
				tween(playerGraphics, {
					tint: 0xffffff
				}, {
					duration: 300
				});
			}
		}
		// Keep player in bounds
		if (self.x < 50) {
			self.x = 50;
		}
		if (self.x > 2048 - 50) {
			self.x = 2048 - 50;
		}
		if (self.y < 50) {
			self.y = 50;
		}
		if (self.y > 2732 - 50) {
			self.y = 2732 - 50;
		}
		// Update fire counter
		if (self.fireCounter > 0) {
			self.fireCounter--;
		}
	};
	return self;
});
var PowerUp = Container.expand(function () {
	var self = Container.call(this);
	self.type = "health"; // Default type
	self.setup = function (type) {
		self.type = type;
		// Remove any existing children
		while (self.children.length > 0) {
			self.removeChild(self.children[0]);
		}
		// Attach appropriate asset based on type
		if (type === "health") {
			self.attachAsset('healthPack', {
				anchorX: 0.5,
				anchorY: 0.5
			});
		} else if (type === "speed") {
			self.attachAsset('speedBoost', {
				anchorX: 0.5,
				anchorY: 0.5
			});
		} else if (type === "fireRate") {
			self.attachAsset('fireRateBoost', {
				anchorX: 0.5,
				anchorY: 0.5
			});
		}
		// Make power-ups pulsate
		self.pulsateDirection = 1;
		return self;
	};
	self.update = function () {
		// Pulsate effect
		if (self.scale.x >= 1.2) {
			self.pulsateDirection = -0.01;
		} else if (self.scale.x <= 0.8) {
			self.pulsateDirection = 0.01;
		}
		self.scale.x += self.pulsateDirection;
		self.scale.y += self.pulsateDirection;
	};
	return self;
});
var Zombie = Container.expand(function () {
	var self = Container.call(this);
	var zombieGraphics = self.attachAsset('zombie', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 2;
	self.health = 3;
	self.takeDamage = function (amount) {
		self.health -= amount;
		// Flash zombie when hit
		LK.effects.flashObject(self, 0xff0000, 150);
		LK.getSound('zombieHit').play();
		return self.health <= 0;
	};
	self.setTarget = function (target) {
		self.target = target;
	};
	self.update = function () {
		if (!self.target) {
			return;
		}
		// Calculate direction to player
		var dx = self.target.x - self.x;
		var dy = self.target.y - self.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		if (distance > 0) {
			// Normalize and apply speed
			self.x += dx / distance * self.speed;
			self.y += dy / distance * self.speed;
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000,
	// Keep background color black
	backgroundImage: 'hh' // Set background image to 'hh'
});
/**** 
* Game Code
****/ 
// Game state variables
var player;
var zombies = [];
var bullets = [];
var powerUps = [];
var targetPosition = {
	x: 0,
	y: 0
};
var isShooting = false;
var gameActive = true;
var waveNumber = 1;
var zombiesKilled = 0;
var score = 0;
var nextWaveTimer = 0;
var powerUpSpawnTimer = 0;
// UI Elements
var scoreTxt;
var waveTxt;
var healthTxt;
// Initialize game
function initGame() {
	// Create player
	player = new Player();
	player.x = 2048 / 2;
	player.y = 2732 / 2;
	game.addChild(player);
	// Set initial target position to player position
	targetPosition.x = player.x;
	targetPosition.y = player.y;
	// Initialize UI
	setupUI();
	// Set score
	LK.setScore(0);
	// Start first wave
	spawnWave();
	// Start background music
	LK.playMusic('bgMusic', {
		loop: true,
		fade: {
			start: 0,
			end: 1,
			duration: 2000
		}
	});
}
function setupUI() {
	// Score text
	scoreTxt = new Text2('Score: 0', {
		size: 70,
		fill: 0xFFFFFF
	});
	scoreTxt.anchor.set(0, 0);
	LK.gui.topRight.addChild(scoreTxt);
	// Wave text
	waveTxt = new Text2('Wave: 1', {
		size: 70,
		fill: 0xFFFFFF
	});
	waveTxt.anchor.set(0.5, 0);
	LK.gui.top.addChild(waveTxt);
	// Health text
	healthTxt = new Text2('Health: 100', {
		size: 70,
		fill: 0xFFFFFF
	});
	healthTxt.anchor.set(1, 0);
	LK.gui.topLeft.addChild(healthTxt);
	// Position texts with some padding
	scoreTxt.x = -20; // Right align with padding
	scoreTxt.y = 20;
	waveTxt.y = 20;
	healthTxt.x = 120; // Left align with padding to avoid menu icon
	healthTxt.y = 20;
}
function spawnWave() {
	var zombiesToSpawn = 5 + waveNumber * 2;
	for (var i = 0; i < zombiesToSpawn; i++) {
		spawnZombie();
	}
	// Update wave text
	waveTxt.setText('Wave: ' + waveNumber);
	// Increase wave number for next wave
	waveNumber++;
}
function spawnZombie() {
	var zombie = new Zombie();
	// Determine spawn position (outside the visible area)
	var side = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left
	switch (side) {
		case 0:
			// top
			zombie.x = Math.random() * 2048;
			zombie.y = -100;
			break;
		case 1:
			// right
			zombie.x = 2048 + 100;
			zombie.y = Math.random() * 2732;
			break;
		case 2:
			// bottom
			zombie.x = Math.random() * 2048;
			zombie.y = 2732 + 100;
			break;
		case 3:
			// left
			zombie.x = -100;
			zombie.y = Math.random() * 2732;
			break;
	}
	// Set target to player
	zombie.setTarget(player);
	// Slightly randomize speed for variety
	zombie.speed = 2 + Math.random() * 0.5 * (waveNumber * 0.2);
	// Add to game and array
	game.addChild(zombie);
	zombies.push(zombie);
}
function spawnBullet() {
	if (player.fireCounter > 0) {
		return;
	}
	// Reset fire counter
	player.fireCounter = player.fireRate;
	// Create new bullet
	var bullet = new Bullet();
	bullet.x = player.x;
	bullet.y = player.y;
	// Set direction towards target
	var dx = targetPosition.x - player.x;
	var dy = targetPosition.y - player.y;
	bullet.setDirection(dx, dy);
	// Add to game and array
	game.addChild(bullet);
	bullets.push(bullet);
	// Play sound 
	LK.getSound('shoot').play();
}
function spawnPowerUp() {
	var powerUp = new PowerUp();
	// Randomly determine type
	var randomType = Math.floor(Math.random() * 3);
	var type;
	switch (randomType) {
		case 0:
			type = "health";
			break;
		case 1:
			type = "speed";
			break;
		case 2:
			type = "fireRate";
			break;
	}
	powerUp.setup(type);
	// Set random position (away from edges)
	powerUp.x = 100 + Math.random() * (2048 - 200);
	powerUp.y = 100 + Math.random() * (2732 - 200);
	// Add to game and array
	game.addChild(powerUp);
	powerUps.push(powerUp);
	// Reset spawn timer (10-15 seconds)
	powerUpSpawnTimer = 600 + Math.floor(Math.random() * 300);
}
function updateBullets() {
	for (var i = bullets.length - 1; i >= 0; i--) {
		var bullet = bullets[i];
		// Update bullet position
		bullet.update();
		// Check if bullet is off-screen
		if (bullet.x < -50 || bullet.x > 2048 + 50 || bullet.y < -50 || bullet.y > 2732 + 50) {
			bullet.destroy();
			bullets.splice(i, 1);
			continue;
		}
		// Check for collisions with zombies
		for (var j = zombies.length - 1; j >= 0; j--) {
			var zombie = zombies[j];
			if (bullet.intersects(zombie)) {
				// Damage zombie
				if (zombie.takeDamage(1)) {
					// Zombie died
					zombie.destroy();
					zombies.splice(j, 1);
					// Increase score
					zombiesKilled++;
					score += 10;
					LK.setScore(score);
					scoreTxt.setText('Score: ' + score);
				}
				// Remove bullet
				bullet.destroy();
				bullets.splice(i, 1);
				break;
			}
		}
	}
}
function updateZombies() {
	for (var i = zombies.length - 1; i >= 0; i--) {
		var zombie = zombies[i];
		// Update zombie movement
		zombie.update();
		// Check for collision with player
		if (zombie.intersects(player)) {
			if (player.takeDamage(10)) {
				// Player died
				gameOver();
				return;
			}
			// Update health text
			healthTxt.setText('Health: ' + player.health);
			// Remove zombie
			zombie.destroy();
			zombies.splice(i, 1);
		}
	}
	// Check if all zombies are cleared
	if (zombies.length === 0 && gameActive) {
		if (nextWaveTimer === 0) {
			nextWaveTimer = 180; // 3 seconds at 60fps
		}
	}
}
function updatePowerUps() {
	for (var i = powerUps.length - 1; i >= 0; i--) {
		var powerUp = powerUps[i];
		// Update power-up animation
		powerUp.update();
		// Check for collision with player
		if (powerUp.intersects(player)) {
			// Apply power-up effect
			if (powerUp.type === "health") {
				player.health = Math.min(100, player.health + 25);
				healthTxt.setText('Health: ' + player.health);
			} else if (powerUp.type === "speed") {
				player.applySpeedBoost();
			} else if (powerUp.type === "fireRate") {
				player.applyFireRateBoost();
			}
			// Play sound 
			LK.getSound('powerUp').play();
			// Remove power-up
			powerUp.destroy();
			powerUps.splice(i, 1);
		}
	}
}
function movePlayer() {
	if (!gameActive) {
		return;
	}
	var dx = targetPosition.x - player.x;
	var dy = targetPosition.y - player.y;
	var distance = Math.sqrt(dx * dx + dy * dy);
	if (distance > 5) {
		player.x += dx / distance * player.speed;
		player.y += dy / distance * player.speed;
	}
}
function gameOver() {
	gameActive = false;
	LK.showGameOver();
}
// Event handlers
game.down = function (x, y, obj) {
	if (!gameActive) {
		return;
	}
	targetPosition.x = x;
	targetPosition.y = y;
	isShooting = true;
};
game.move = function (x, y, obj) {
	if (!gameActive) {
		return;
	}
	targetPosition.x = x;
	targetPosition.y = y;
};
game.up = function (x, y, obj) {
	isShooting = false;
};
// Game update loop
game.update = function () {
	// Only update if game is active
	if (gameActive) {
		// Update player
		player.update();
		// Move player towards target
		movePlayer();
		// Handle shooting
		if (isShooting) {
			spawnBullet();
		}
		// Update game elements
		updateBullets();
		updateZombies();
		updatePowerUps();
		// Handle wave timer
		if (nextWaveTimer > 0) {
			nextWaveTimer--;
			if (nextWaveTimer === 0) {
				spawnWave();
			}
		}
		// Handle power-up spawn timer
		if (powerUpSpawnTimer > 0) {
			powerUpSpawnTimer--;
		} else {
			spawnPowerUp();
		}
	}
};
// Initialize the game
initGame();
 a two d zombies \. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
 speed boast. Single Game Texture. In-Game asset. Blank background. High contrast. No shadows
 
 first aid. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
 fire boaster. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
 
 a two way road with houses upper view two d. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows