/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
var EnemyAircraft = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('enemyAircraft', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Set speed based on selected level
	if (selectedLevel === 1) {
		self.speed = 2 + Math.random() * 2; // Easy: 2-4
	} else if (selectedLevel === 2) {
		self.speed = 4 + Math.random() * 4; // Normal: 4-8
	} else {
		self.speed = 6 + Math.random() * 6; // Hard: 6-12
	}
	self.movePattern = Math.floor(Math.random() * 3); // 0: straight, 1: zigzag, 2: sine wave
	self.startX = 0;
	// Set fire rate based on selected level
	if (selectedLevel === 1) {
		self.fireRate = 60 + Math.random() * 60; // Easy: 60-120 ticks
	} else if (selectedLevel === 2) {
		self.fireRate = 30 + Math.random() * 30; // Normal: 30-60 ticks
	} else {
		self.fireRate = 15 + Math.random() * 30; // Hard: 15-45 ticks
	}
	self.lastFire = 0;
	self.update = function () {
		// Movement patterns
		if (self.movePattern === 0) {
			// Straight down
			self.y += self.speed;
		} else if (self.movePattern === 1) {
			// Zigzag pattern
			self.y += self.speed;
			self.x = self.startX + Math.sin(self.y * 0.01) * 100;
		} else if (self.movePattern === 2) {
			// Sine wave pattern
			self.y += self.speed;
			self.x = self.startX + Math.sin(self.y * 0.02) * 150;
		}
		// Fire bullets occasionally
		if (LK.ticks - self.lastFire >= self.fireRate) {
			self.fireBullet();
			self.lastFire = LK.ticks;
			self.fireRate = 60 + Math.random() * 60; // Randomize next fire time
		}
	};
	self.fireBullet = function () {
		var bullet = new EnemyBullet();
		bullet.x = self.x;
		bullet.y = self.y + 40;
		enemyBullets.push(bullet);
		game.addChild(bullet);
	};
	return self;
});
var EnemyBullet = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('enemyBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Set bullet speed based on selected level
	if (selectedLevel === 1) {
		self.speed = 4; // Easy
	} else if (selectedLevel === 2) {
		self.speed = 6; // Normal
	} else {
		self.speed = 8; // Hard
	}
	self.update = function () {
		self.y += self.speed;
	};
	return self;
});
var PlayerAircraft = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('playerAircraft', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 1;
	self.fireRate = 15; // Fire every 15 ticks
	self.lastFire = 0;
	self.bulletCount = 1;
	self.bulletScale = 1;
	self.update = function () {
		// Auto-fire bullets
		if (LK.ticks - self.lastFire >= self.fireRate) {
			self.fireBullet();
			self.lastFire = LK.ticks;
		}
	};
	self.fireBullet = function () {
		if (self.bulletCount === 1) {
			var bullet = new PlayerBullet();
			bullet.x = self.x;
			bullet.y = self.y - 50;
			bullet.scaleX = self.bulletScale;
			bullet.scaleY = self.bulletScale;
			playerBullets.push(bullet);
			game.addChild(bullet);
		} else if (self.bulletCount === 2) {
			for (var i = 0; i < 2; i++) {
				var bullet = new PlayerBullet();
				bullet.x = self.x + (i === 0 ? -30 : 30);
				bullet.y = self.y - 50;
				bullet.scaleX = self.bulletScale;
				bullet.scaleY = self.bulletScale;
				playerBullets.push(bullet);
				game.addChild(bullet);
			}
		} else {
			for (var i = 0; i < 3; i++) {
				var bullet = new PlayerBullet();
				bullet.x = self.x + (i === 0 ? -40 : i === 1 ? 0 : 40);
				bullet.y = self.y - 50;
				bullet.scaleX = self.bulletScale;
				bullet.scaleY = self.bulletScale;
				playerBullets.push(bullet);
				game.addChild(bullet);
			}
		}
		LK.getSound('shoot').play();
	};
	return self;
});
var PlayerBullet = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('playerBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -8;
	self.update = function () {
		self.y += self.speed;
	};
	return self;
});
var PowerUp = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('powerUp', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 3;
	self.rotationSpeed = 0.1;
	self.update = function () {
		self.y += self.speed;
		self.rotation += self.rotationSpeed;
	};
	return self;
});
var Star = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('star', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 1 + Math.random() * 3;
	self.twinkleSpeed = 0.02 + Math.random() * 0.03;
	self.baseAlpha = 0.3 + Math.random() * 0.7;
	self.update = function () {
		self.y += self.speed;
		// Twinkling effect
		graphics.alpha = self.baseAlpha + Math.sin(LK.ticks * self.twinkleSpeed) * 0.3;
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000011
});
/**** 
* Game Code
****/ 
// Game state
var gameState = 'menu'; // 'menu', 'levelSelect', 'playing', 'gameOver'
var menuContainer;
var levelSelectContainer;
var titleText;
var startButton;
var instructionsText;
var selectedLevel = 1;
var levelButtons = [];
// Game variables
var player;
var enemies = [];
var playerBullets = [];
var enemyBullets = [];
var powerUps = [];
var stars = [];
var enemySpawnRate = 80; // Reduced from 120 to 80 ticks for faster spawning
var powerUpSpawnRate = 900; // Increased from 600 to 900 ticks to make power-ups more rare
var difficultyTimer = 0;
var dragNode = null;
var playerLevel = 1;
var playerLives = 3;
// Create start menu
menuContainer = new Container();
game.addChild(menuContainer);
// Title
titleText = new Text2('SPACE FIGHTER', {
	size: 120,
	fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 800;
menuContainer.addChild(titleText);
// Start button (using power-up asset as button)
startButton = LK.getAsset('powerUp', {
	anchorX: 0.5,
	anchorY: 0.5
});
startButton.x = 1024;
startButton.y = 1400;
startButton.scaleX = 1.5;
startButton.scaleY = 1.5;
menuContainer.addChild(startButton);
// Credit text
var creditText = new Text2('by Muhammed Fatih Özdemir', {
	size: 50,
	fill: 0xCCCCCC
});
creditText.anchor.set(0.5, 0.5);
creditText.x = 1024;
creditText.y = 950;
menuContainer.addChild(creditText);
// Create level selection menu
levelSelectContainer = new Container();
game.addChild(levelSelectContainer);
levelSelectContainer.visible = false;
// Level select title
var levelSelectTitle = new Text2('SELECT LEVEL', {
	size: 100,
	fill: 0xFFFFFF
});
levelSelectTitle.anchor.set(0.5, 0.5);
levelSelectTitle.x = 1024;
levelSelectTitle.y = 600;
levelSelectContainer.addChild(levelSelectTitle);
// Level buttons
var levelNames = ['EASY', 'NORMAL', 'HARD'];
var levelDifficulties = ['Kolay', 'Orta', 'Zor'];
var levelColors = [0x00FF00, 0xFFFF00, 0xFF0000];
for (var l = 0; l < 3; l++) {
	var levelButton = new Container();
	// Button background
	var buttonBg = LK.getAsset('powerUp', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	buttonBg.tint = levelColors[l];
	buttonBg.scaleX = 1.5;
	buttonBg.scaleY = 1.5;
	levelButton.addChild(buttonBg);
	// Level name text
	var buttonText = new Text2(levelNames[l], {
		size: 60,
		fill: 0x000000
	});
	buttonText.anchor.set(0.5, 0.5);
	buttonText.x = -80;
	levelButton.addChild(buttonText);
	// Difficulty text in purple
	var difficultyText = new Text2(levelDifficulties[l], {
		size: 60,
		fill: 0x9932CC
	});
	difficultyText.anchor.set(0.5, 0.5);
	difficultyText.x = 80;
	levelButton.addChild(difficultyText);
	levelButton.x = 1024;
	levelButton.y = 1000 + l * 300;
	levelButton.levelIndex = l + 1;
	levelButton.difficultyText = difficultyText;
	levelButtons.push(levelButton);
	levelSelectContainer.addChild(levelButton);
}
// Back button for level select
var backButton = new Text2('BACK', {
	size: 60,
	fill: 0xCCCCCC
});
backButton.anchor.set(0.5, 0.5);
backButton.x = 1024;
backButton.y = 2200;
levelSelectContainer.addChild(backButton);
// Instructions
instructionsText = new Text2('TAP TO SELECT LEVEL\n\nDrag to move your ship\nCollect power-ups\nAvoid enemies', {
	size: 60,
	fill: 0xAAAAFF
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 1024;
instructionsText.y = 1800;
menuContainer.addChild(instructionsText);
// UI Setup
var scoreTxt = new Text2('Score: 0', {
	size: 60,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.visible = false; // Hide initially
var hearts = [];
for (var h = 0; h < 3; h++) {
	var heart = LK.getAsset('heart', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	heart.x = 150 + h * 80;
	heart.y = 60;
	heart.visible = false; // Hide initially
	hearts.push(heart);
	LK.gui.topLeft.addChild(heart);
}
// Initialize player (but don't add to game yet)
player = new PlayerAircraft();
player.x = 1024; // Center horizontally
player.y = 2400; // Near bottom of screen
// Start background music immediately when game loads
LK.playMusic('Uiacatminecraft', {
	volume: 0.5,
	loop: true
});
// Function to start the game
function startGame() {
	gameState = 'playing';
	menuContainer.visible = false;
	levelSelectContainer.visible = false;
	scoreTxt.visible = true;
	// Show hearts
	for (var h = 0; h < hearts.length; h++) {
		hearts[h].visible = true;
	}
	// Add player to game
	game.addChild(player);
	// Reset game variables
	LK.setScore(0);
	scoreTxt.setText('Score: 0');
	playerLives = 3;
	playerLevel = 1;
	difficultyTimer = 0;
	// Set difficulty based on selected level
	if (selectedLevel === 1) {
		// Easy
		enemySpawnRate = 120;
		powerUpSpawnRate = 600;
	} else if (selectedLevel === 2) {
		// Normal
		enemySpawnRate = 80;
		powerUpSpawnRate = 900;
	} else {
		// Hard
		enemySpawnRate = 50;
		powerUpSpawnRate = 1200;
	}
	// Reset player
	player.scaleX = 1;
	player.scaleY = 1;
	player.bulletCount = 1;
	player.bulletScale = 1;
	player.fireRate = 15;
	player.x = 1024;
	player.y = 2400;
	// Start background music with proper settings
	LK.playMusic('Uiacatminecraft', {
		volume: 0.5,
		loop: true
	});
}
// Function to show level select
function showLevelSelect() {
	gameState = 'levelSelect';
	menuContainer.visible = false;
	levelSelectContainer.visible = true;
}
// Function to go back to main menu
function showMainMenu() {
	gameState = 'menu';
	menuContainer.visible = true;
	levelSelectContainer.visible = false;
}
// Game input handlers
game.down = function (x, y, obj) {
	if (gameState === 'menu') {
		// Check if clicked on start button or anywhere to start level select
		showLevelSelect();
		return;
	}
	if (gameState === 'levelSelect') {
		// Check level button clicks
		for (var i = 0; i < levelButtons.length; i++) {
			var button = levelButtons[i];
			// Simple distance-based click detection
			var buttonY = 1000 + i * 300;
			if (Math.abs(x - 1024) < 150 && Math.abs(y - buttonY) < 100) {
				selectedLevel = button.levelIndex;
				// Quick feedback animation
				tween(button, {
					scaleX: 1.8,
					scaleY: 1.8
				}, {
					duration: 100,
					easing: tween.easeOut,
					onFinish: function onFinish() {
						tween(button, {
							scaleX: 1.5,
							scaleY: 1.5
						}, {
							duration: 100,
							easing: tween.easeIn,
							onFinish: function onFinish() {
								startGame();
							}
						});
					}
				});
				return;
			}
		}
		// Check back button click
		if (Math.abs(x - 1024) < 100 && Math.abs(y - 2200) < 50) {
			showMainMenu();
		}
		return;
	}
	if (gameState === 'playing') {
		dragNode = player;
		player.x = x;
		player.y = y;
	}
};
game.move = function (x, y, obj) {
	if (gameState === 'playing' && dragNode) {
		dragNode.x = Math.max(60, Math.min(1988, x)); // Keep within screen bounds
		dragNode.y = Math.max(200, Math.min(2600, y)); // Keep within reasonable bounds
	}
};
game.up = function (x, y, obj) {
	if (gameState === 'playing') {
		dragNode = null;
	}
};
// Spawn enemy aircraft
function spawnEnemy() {
	var enemy = new EnemyAircraft();
	enemy.x = 200 + Math.random() * 1648; // Random x position
	enemy.y = -50; // Start above screen
	enemy.startX = enemy.x;
	enemies.push(enemy);
	game.addChild(enemy);
}
// Spawn power-up
function spawnPowerUp() {
	var powerUp = new PowerUp();
	powerUp.x = 200 + Math.random() * 1648;
	powerUp.y = -50;
	powerUps.push(powerUp);
	game.addChild(powerUp);
}
// Spawn background elements
function spawnStar() {
	var star = new Star();
	star.x = Math.random() * 2048;
	star.y = -20;
	stars.push(star);
	game.addChild(star);
}
// Main game update loop
game.update = function () {
	// Menu state updates
	if (gameState === 'menu') {
		// Animate title color change every second (60 ticks)
		if (LK.ticks % 60 === 0) {
			var colors = [0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF];
			var randomColor = colors[Math.floor(Math.random() * colors.length)];
			titleText.tint = randomColor;
		}
		// Animate start button
		startButton.rotation += 0.05;
		startButton.scaleX = 1.5 + Math.sin(LK.ticks * 0.1) * 0.2;
		startButton.scaleY = 1.5 + Math.sin(LK.ticks * 0.1) * 0.2;
		// Spawn background stars even in menu
		if (LK.ticks % 20 === 0) {
			spawnStar();
		}
		// Update stars
		for (var i = stars.length - 1; i >= 0; i--) {
			var star = stars[i];
			if (star.lastY === undefined) star.lastY = star.y;
			if (star.lastY <= 2762 && star.y > 2762) {
				star.destroy();
				stars.splice(i, 1);
				continue;
			}
			star.lastY = star.y;
		}
		return;
	}
	// Level select state updates
	if (gameState === 'levelSelect') {
		// Animate level buttons
		for (var i = 0; i < levelButtons.length; i++) {
			var button = levelButtons[i];
			// Only rotate the button background, not the text
			button.children[0].rotation += 0.02;
			button.scaleX = 1.5 + Math.sin(LK.ticks * 0.05 + i) * 0.1;
			button.scaleY = 1.5 + Math.sin(LK.ticks * 0.05 + i) * 0.1;
		}
		// Spawn background stars in level select
		if (LK.ticks % 20 === 0) {
			spawnStar();
		}
		// Update stars
		for (var i = stars.length - 1; i >= 0; i--) {
			var star = stars[i];
			if (star.lastY === undefined) star.lastY = star.y;
			if (star.lastY <= 2762 && star.y > 2762) {
				star.destroy();
				stars.splice(i, 1);
				continue;
			}
			star.lastY = star.y;
		}
		return;
	}
	// Only run game logic when playing
	if (gameState !== 'playing') return;
	difficultyTimer++;
	// Increase difficulty over time
	if (difficultyTimer % 900 === 0) {
		// Every 15 seconds (reduced from 30)
		enemySpawnRate = Math.max(20, enemySpawnRate - 15); // More aggressive reduction
	}
	// Spawn enemies - sometimes spawn multiple at once
	if (LK.ticks % enemySpawnRate === 0) {
		spawnEnemy();
		// 30% chance to spawn a second enemy
		if (Math.random() < 0.3) {
			spawnEnemy();
		}
		// 10% chance for a third enemy after score 500
		if (LK.getScore() > 500 && Math.random() < 0.1) {
			spawnEnemy();
		}
	}
	// Spawn power-ups
	if (LK.ticks % powerUpSpawnRate === 0) {
		spawnPowerUp();
	}
	// Spawn background elements
	if (LK.ticks % 20 === 0) {
		spawnStar();
	}
	// Update and check player bullets
	for (var i = playerBullets.length - 1; i >= 0; i--) {
		var bullet = playerBullets[i];
		if (bullet.lastY === undefined) bullet.lastY = bullet.y;
		// Remove bullets that go off screen
		if (bullet.lastY >= -30 && bullet.y < -30) {
			bullet.destroy();
			playerBullets.splice(i, 1);
			continue;
		}
		// Check collision with enemies
		var hitEnemy = false;
		for (var e = enemies.length - 1; e >= 0; e--) {
			if (bullet.intersects(enemies[e])) {
				LK.setScore(LK.getScore() + 100);
				scoreTxt.setText('Score: ' + LK.getScore());
				// Flash effect on enemy hit
				LK.effects.flashObject(enemies[e], 0xFFFFFF, 200);
				LK.getSound('enemyHit').play();
				enemies[e].destroy();
				enemies.splice(e, 1);
				bullet.destroy();
				playerBullets.splice(i, 1);
				hitEnemy = true;
				break;
			}
		}
		if (hitEnemy) continue;
		bullet.lastY = bullet.y;
	}
	// Update and check enemy bullets
	for (var i = enemyBullets.length - 1; i >= 0; i--) {
		var bullet = enemyBullets[i];
		if (bullet.lastY === undefined) bullet.lastY = bullet.y;
		// Remove bullets that go off screen
		if (bullet.lastY <= 2762 && bullet.y > 2762) {
			bullet.destroy();
			enemyBullets.splice(i, 1);
			continue;
		}
		// Check collision with player
		if (bullet.intersects(player)) {
			playerLives--;
			// Remove a heart with tween animation
			if (hearts.length > 0) {
				var heartToRemove = hearts.pop();
				tween(heartToRemove, {
					alpha: 0,
					scaleX: 0,
					scaleY: 0
				}, {
					duration: 300,
					easing: tween.easeIn,
					onFinish: function onFinish() {
						heartToRemove.destroy();
					}
				});
			}
			LK.effects.flashObject(player, 0xFF0000, 500);
			bullet.destroy();
			enemyBullets.splice(i, 1);
			if (playerLives <= 0) {
				LK.effects.flashScreen(0xFF0000, 1000);
				LK.showGameOver();
				return;
			}
			continue;
		}
		bullet.lastY = bullet.y;
	}
	// Update and check enemies
	for (var i = enemies.length - 1; i >= 0; i--) {
		var enemy = enemies[i];
		if (enemy.lastY === undefined) enemy.lastY = enemy.y;
		// Remove enemies that go off screen
		if (enemy.lastY <= 2762 && enemy.y > 2762) {
			enemy.destroy();
			enemies.splice(i, 1);
			continue;
		}
		// Check collision with player
		if (enemy.intersects(player)) {
			playerLives--;
			// Remove a heart with tween animation
			if (hearts.length > 0) {
				var heartToRemove = hearts.pop();
				tween(heartToRemove, {
					alpha: 0,
					scaleX: 0,
					scaleY: 0
				}, {
					duration: 300,
					easing: tween.easeIn,
					onFinish: function onFinish() {
						heartToRemove.destroy();
					}
				});
			}
			LK.effects.flashObject(player, 0xFF0000, 500);
			enemy.destroy();
			enemies.splice(i, 1);
			if (playerLives <= 0) {
				LK.effects.flashScreen(0xFF0000, 1000);
				LK.showGameOver();
				return;
			}
			continue;
		}
		enemy.lastY = enemy.y;
	}
	// Update and check power-ups
	for (var i = powerUps.length - 1; i >= 0; i--) {
		var powerUp = powerUps[i];
		if (powerUp.lastY === undefined) powerUp.lastY = powerUp.y;
		// Remove power-ups that go off screen
		if (powerUp.lastY <= 2762 && powerUp.y > 2762) {
			powerUp.destroy();
			powerUps.splice(i, 1);
			continue;
		}
		// Check collision with player
		if (powerUp.intersects(player)) {
			LK.setScore(LK.getScore() + 50);
			scoreTxt.setText('Score: ' + LK.getScore());
			// Level up player
			playerLevel++;
			// Add one life
			playerLives++;
			// Create new heart
			var newHeart = LK.getAsset('heart', {
				anchorX: 0.5,
				anchorY: 0.5
			});
			newHeart.x = 150 + hearts.length * 80;
			newHeart.y = 60;
			newHeart.alpha = 0;
			newHeart.scaleX = 0;
			newHeart.scaleY = 0;
			hearts.push(newHeart);
			LK.gui.topLeft.addChild(newHeart);
			// Animate new heart appearing
			tween(newHeart, {
				alpha: 1,
				scaleX: 1,
				scaleY: 1
			}, {
				duration: 300,
				easing: tween.easeOut
			});
			// Scale up player aircraft
			tween(player, {
				scaleX: 1 + (playerLevel - 1) * 0.2,
				scaleY: 1 + (playerLevel - 1) * 0.2
			}, {
				duration: 500,
				easing: tween.easeOut
			});
			// Increase bullet count
			if (playerLevel === 2) {
				player.bulletCount = 2;
			} else if (playerLevel >= 3) {
				player.bulletCount = 3;
			}
			// Scale bullets
			player.bulletScale = 1 + (playerLevel - 1) * 0.3;
			// Reduce player fire rate for power-up effect
			player.fireRate = Math.max(5, player.fireRate - 2);
			LK.getSound('powerUpCollect').play();
			LK.effects.flashObject(player, 0x00FF00, 500);
			powerUp.destroy();
			powerUps.splice(i, 1);
			continue;
		}
		powerUp.lastY = powerUp.y;
	}
	// Update and clean up stars
	for (var i = stars.length - 1; i >= 0; i--) {
		var star = stars[i];
		if (star.lastY === undefined) star.lastY = star.y;
		if (star.lastY <= 2762 && star.y > 2762) {
			star.destroy();
			stars.splice(i, 1);
			continue;
		}
		star.lastY = star.y;
	}
}; /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
var EnemyAircraft = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('enemyAircraft', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Set speed based on selected level
	if (selectedLevel === 1) {
		self.speed = 2 + Math.random() * 2; // Easy: 2-4
	} else if (selectedLevel === 2) {
		self.speed = 4 + Math.random() * 4; // Normal: 4-8
	} else {
		self.speed = 6 + Math.random() * 6; // Hard: 6-12
	}
	self.movePattern = Math.floor(Math.random() * 3); // 0: straight, 1: zigzag, 2: sine wave
	self.startX = 0;
	// Set fire rate based on selected level
	if (selectedLevel === 1) {
		self.fireRate = 60 + Math.random() * 60; // Easy: 60-120 ticks
	} else if (selectedLevel === 2) {
		self.fireRate = 30 + Math.random() * 30; // Normal: 30-60 ticks
	} else {
		self.fireRate = 15 + Math.random() * 30; // Hard: 15-45 ticks
	}
	self.lastFire = 0;
	self.update = function () {
		// Movement patterns
		if (self.movePattern === 0) {
			// Straight down
			self.y += self.speed;
		} else if (self.movePattern === 1) {
			// Zigzag pattern
			self.y += self.speed;
			self.x = self.startX + Math.sin(self.y * 0.01) * 100;
		} else if (self.movePattern === 2) {
			// Sine wave pattern
			self.y += self.speed;
			self.x = self.startX + Math.sin(self.y * 0.02) * 150;
		}
		// Fire bullets occasionally
		if (LK.ticks - self.lastFire >= self.fireRate) {
			self.fireBullet();
			self.lastFire = LK.ticks;
			self.fireRate = 60 + Math.random() * 60; // Randomize next fire time
		}
	};
	self.fireBullet = function () {
		var bullet = new EnemyBullet();
		bullet.x = self.x;
		bullet.y = self.y + 40;
		enemyBullets.push(bullet);
		game.addChild(bullet);
	};
	return self;
});
var EnemyBullet = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('enemyBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Set bullet speed based on selected level
	if (selectedLevel === 1) {
		self.speed = 4; // Easy
	} else if (selectedLevel === 2) {
		self.speed = 6; // Normal
	} else {
		self.speed = 8; // Hard
	}
	self.update = function () {
		self.y += self.speed;
	};
	return self;
});
var PlayerAircraft = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('playerAircraft', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 1;
	self.fireRate = 15; // Fire every 15 ticks
	self.lastFire = 0;
	self.bulletCount = 1;
	self.bulletScale = 1;
	self.update = function () {
		// Auto-fire bullets
		if (LK.ticks - self.lastFire >= self.fireRate) {
			self.fireBullet();
			self.lastFire = LK.ticks;
		}
	};
	self.fireBullet = function () {
		if (self.bulletCount === 1) {
			var bullet = new PlayerBullet();
			bullet.x = self.x;
			bullet.y = self.y - 50;
			bullet.scaleX = self.bulletScale;
			bullet.scaleY = self.bulletScale;
			playerBullets.push(bullet);
			game.addChild(bullet);
		} else if (self.bulletCount === 2) {
			for (var i = 0; i < 2; i++) {
				var bullet = new PlayerBullet();
				bullet.x = self.x + (i === 0 ? -30 : 30);
				bullet.y = self.y - 50;
				bullet.scaleX = self.bulletScale;
				bullet.scaleY = self.bulletScale;
				playerBullets.push(bullet);
				game.addChild(bullet);
			}
		} else {
			for (var i = 0; i < 3; i++) {
				var bullet = new PlayerBullet();
				bullet.x = self.x + (i === 0 ? -40 : i === 1 ? 0 : 40);
				bullet.y = self.y - 50;
				bullet.scaleX = self.bulletScale;
				bullet.scaleY = self.bulletScale;
				playerBullets.push(bullet);
				game.addChild(bullet);
			}
		}
		LK.getSound('shoot').play();
	};
	return self;
});
var PlayerBullet = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('playerBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -8;
	self.update = function () {
		self.y += self.speed;
	};
	return self;
});
var PowerUp = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('powerUp', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 3;
	self.rotationSpeed = 0.1;
	self.update = function () {
		self.y += self.speed;
		self.rotation += self.rotationSpeed;
	};
	return self;
});
var Star = Container.expand(function () {
	var self = Container.call(this);
	var graphics = self.attachAsset('star', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 1 + Math.random() * 3;
	self.twinkleSpeed = 0.02 + Math.random() * 0.03;
	self.baseAlpha = 0.3 + Math.random() * 0.7;
	self.update = function () {
		self.y += self.speed;
		// Twinkling effect
		graphics.alpha = self.baseAlpha + Math.sin(LK.ticks * self.twinkleSpeed) * 0.3;
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000011
});
/**** 
* Game Code
****/ 
// Game state
var gameState = 'menu'; // 'menu', 'levelSelect', 'playing', 'gameOver'
var menuContainer;
var levelSelectContainer;
var titleText;
var startButton;
var instructionsText;
var selectedLevel = 1;
var levelButtons = [];
// Game variables
var player;
var enemies = [];
var playerBullets = [];
var enemyBullets = [];
var powerUps = [];
var stars = [];
var enemySpawnRate = 80; // Reduced from 120 to 80 ticks for faster spawning
var powerUpSpawnRate = 900; // Increased from 600 to 900 ticks to make power-ups more rare
var difficultyTimer = 0;
var dragNode = null;
var playerLevel = 1;
var playerLives = 3;
// Create start menu
menuContainer = new Container();
game.addChild(menuContainer);
// Title
titleText = new Text2('SPACE FIGHTER', {
	size: 120,
	fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 800;
menuContainer.addChild(titleText);
// Start button (using power-up asset as button)
startButton = LK.getAsset('powerUp', {
	anchorX: 0.5,
	anchorY: 0.5
});
startButton.x = 1024;
startButton.y = 1400;
startButton.scaleX = 1.5;
startButton.scaleY = 1.5;
menuContainer.addChild(startButton);
// Credit text
var creditText = new Text2('by Muhammed Fatih Özdemir', {
	size: 50,
	fill: 0xCCCCCC
});
creditText.anchor.set(0.5, 0.5);
creditText.x = 1024;
creditText.y = 950;
menuContainer.addChild(creditText);
// Create level selection menu
levelSelectContainer = new Container();
game.addChild(levelSelectContainer);
levelSelectContainer.visible = false;
// Level select title
var levelSelectTitle = new Text2('SELECT LEVEL', {
	size: 100,
	fill: 0xFFFFFF
});
levelSelectTitle.anchor.set(0.5, 0.5);
levelSelectTitle.x = 1024;
levelSelectTitle.y = 600;
levelSelectContainer.addChild(levelSelectTitle);
// Level buttons
var levelNames = ['EASY', 'NORMAL', 'HARD'];
var levelDifficulties = ['Kolay', 'Orta', 'Zor'];
var levelColors = [0x00FF00, 0xFFFF00, 0xFF0000];
for (var l = 0; l < 3; l++) {
	var levelButton = new Container();
	// Button background
	var buttonBg = LK.getAsset('powerUp', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	buttonBg.tint = levelColors[l];
	buttonBg.scaleX = 1.5;
	buttonBg.scaleY = 1.5;
	levelButton.addChild(buttonBg);
	// Level name text
	var buttonText = new Text2(levelNames[l], {
		size: 60,
		fill: 0x000000
	});
	buttonText.anchor.set(0.5, 0.5);
	buttonText.x = -80;
	levelButton.addChild(buttonText);
	// Difficulty text in purple
	var difficultyText = new Text2(levelDifficulties[l], {
		size: 60,
		fill: 0x9932CC
	});
	difficultyText.anchor.set(0.5, 0.5);
	difficultyText.x = 80;
	levelButton.addChild(difficultyText);
	levelButton.x = 1024;
	levelButton.y = 1000 + l * 300;
	levelButton.levelIndex = l + 1;
	levelButton.difficultyText = difficultyText;
	levelButtons.push(levelButton);
	levelSelectContainer.addChild(levelButton);
}
// Back button for level select
var backButton = new Text2('BACK', {
	size: 60,
	fill: 0xCCCCCC
});
backButton.anchor.set(0.5, 0.5);
backButton.x = 1024;
backButton.y = 2200;
levelSelectContainer.addChild(backButton);
// Instructions
instructionsText = new Text2('TAP TO SELECT LEVEL\n\nDrag to move your ship\nCollect power-ups\nAvoid enemies', {
	size: 60,
	fill: 0xAAAAFF
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 1024;
instructionsText.y = 1800;
menuContainer.addChild(instructionsText);
// UI Setup
var scoreTxt = new Text2('Score: 0', {
	size: 60,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.visible = false; // Hide initially
var hearts = [];
for (var h = 0; h < 3; h++) {
	var heart = LK.getAsset('heart', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	heart.x = 150 + h * 80;
	heart.y = 60;
	heart.visible = false; // Hide initially
	hearts.push(heart);
	LK.gui.topLeft.addChild(heart);
}
// Initialize player (but don't add to game yet)
player = new PlayerAircraft();
player.x = 1024; // Center horizontally
player.y = 2400; // Near bottom of screen
// Start background music immediately when game loads
LK.playMusic('Uiacatminecraft', {
	volume: 0.5,
	loop: true
});
// Function to start the game
function startGame() {
	gameState = 'playing';
	menuContainer.visible = false;
	levelSelectContainer.visible = false;
	scoreTxt.visible = true;
	// Show hearts
	for (var h = 0; h < hearts.length; h++) {
		hearts[h].visible = true;
	}
	// Add player to game
	game.addChild(player);
	// Reset game variables
	LK.setScore(0);
	scoreTxt.setText('Score: 0');
	playerLives = 3;
	playerLevel = 1;
	difficultyTimer = 0;
	// Set difficulty based on selected level
	if (selectedLevel === 1) {
		// Easy
		enemySpawnRate = 120;
		powerUpSpawnRate = 600;
	} else if (selectedLevel === 2) {
		// Normal
		enemySpawnRate = 80;
		powerUpSpawnRate = 900;
	} else {
		// Hard
		enemySpawnRate = 50;
		powerUpSpawnRate = 1200;
	}
	// Reset player
	player.scaleX = 1;
	player.scaleY = 1;
	player.bulletCount = 1;
	player.bulletScale = 1;
	player.fireRate = 15;
	player.x = 1024;
	player.y = 2400;
	// Start background music with proper settings
	LK.playMusic('Uiacatminecraft', {
		volume: 0.5,
		loop: true
	});
}
// Function to show level select
function showLevelSelect() {
	gameState = 'levelSelect';
	menuContainer.visible = false;
	levelSelectContainer.visible = true;
}
// Function to go back to main menu
function showMainMenu() {
	gameState = 'menu';
	menuContainer.visible = true;
	levelSelectContainer.visible = false;
}
// Game input handlers
game.down = function (x, y, obj) {
	if (gameState === 'menu') {
		// Check if clicked on start button or anywhere to start level select
		showLevelSelect();
		return;
	}
	if (gameState === 'levelSelect') {
		// Check level button clicks
		for (var i = 0; i < levelButtons.length; i++) {
			var button = levelButtons[i];
			// Simple distance-based click detection
			var buttonY = 1000 + i * 300;
			if (Math.abs(x - 1024) < 150 && Math.abs(y - buttonY) < 100) {
				selectedLevel = button.levelIndex;
				// Quick feedback animation
				tween(button, {
					scaleX: 1.8,
					scaleY: 1.8
				}, {
					duration: 100,
					easing: tween.easeOut,
					onFinish: function onFinish() {
						tween(button, {
							scaleX: 1.5,
							scaleY: 1.5
						}, {
							duration: 100,
							easing: tween.easeIn,
							onFinish: function onFinish() {
								startGame();
							}
						});
					}
				});
				return;
			}
		}
		// Check back button click
		if (Math.abs(x - 1024) < 100 && Math.abs(y - 2200) < 50) {
			showMainMenu();
		}
		return;
	}
	if (gameState === 'playing') {
		dragNode = player;
		player.x = x;
		player.y = y;
	}
};
game.move = function (x, y, obj) {
	if (gameState === 'playing' && dragNode) {
		dragNode.x = Math.max(60, Math.min(1988, x)); // Keep within screen bounds
		dragNode.y = Math.max(200, Math.min(2600, y)); // Keep within reasonable bounds
	}
};
game.up = function (x, y, obj) {
	if (gameState === 'playing') {
		dragNode = null;
	}
};
// Spawn enemy aircraft
function spawnEnemy() {
	var enemy = new EnemyAircraft();
	enemy.x = 200 + Math.random() * 1648; // Random x position
	enemy.y = -50; // Start above screen
	enemy.startX = enemy.x;
	enemies.push(enemy);
	game.addChild(enemy);
}
// Spawn power-up
function spawnPowerUp() {
	var powerUp = new PowerUp();
	powerUp.x = 200 + Math.random() * 1648;
	powerUp.y = -50;
	powerUps.push(powerUp);
	game.addChild(powerUp);
}
// Spawn background elements
function spawnStar() {
	var star = new Star();
	star.x = Math.random() * 2048;
	star.y = -20;
	stars.push(star);
	game.addChild(star);
}
// Main game update loop
game.update = function () {
	// Menu state updates
	if (gameState === 'menu') {
		// Animate title color change every second (60 ticks)
		if (LK.ticks % 60 === 0) {
			var colors = [0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF];
			var randomColor = colors[Math.floor(Math.random() * colors.length)];
			titleText.tint = randomColor;
		}
		// Animate start button
		startButton.rotation += 0.05;
		startButton.scaleX = 1.5 + Math.sin(LK.ticks * 0.1) * 0.2;
		startButton.scaleY = 1.5 + Math.sin(LK.ticks * 0.1) * 0.2;
		// Spawn background stars even in menu
		if (LK.ticks % 20 === 0) {
			spawnStar();
		}
		// Update stars
		for (var i = stars.length - 1; i >= 0; i--) {
			var star = stars[i];
			if (star.lastY === undefined) star.lastY = star.y;
			if (star.lastY <= 2762 && star.y > 2762) {
				star.destroy();
				stars.splice(i, 1);
				continue;
			}
			star.lastY = star.y;
		}
		return;
	}
	// Level select state updates
	if (gameState === 'levelSelect') {
		// Animate level buttons
		for (var i = 0; i < levelButtons.length; i++) {
			var button = levelButtons[i];
			// Only rotate the button background, not the text
			button.children[0].rotation += 0.02;
			button.scaleX = 1.5 + Math.sin(LK.ticks * 0.05 + i) * 0.1;
			button.scaleY = 1.5 + Math.sin(LK.ticks * 0.05 + i) * 0.1;
		}
		// Spawn background stars in level select
		if (LK.ticks % 20 === 0) {
			spawnStar();
		}
		// Update stars
		for (var i = stars.length - 1; i >= 0; i--) {
			var star = stars[i];
			if (star.lastY === undefined) star.lastY = star.y;
			if (star.lastY <= 2762 && star.y > 2762) {
				star.destroy();
				stars.splice(i, 1);
				continue;
			}
			star.lastY = star.y;
		}
		return;
	}
	// Only run game logic when playing
	if (gameState !== 'playing') return;
	difficultyTimer++;
	// Increase difficulty over time
	if (difficultyTimer % 900 === 0) {
		// Every 15 seconds (reduced from 30)
		enemySpawnRate = Math.max(20, enemySpawnRate - 15); // More aggressive reduction
	}
	// Spawn enemies - sometimes spawn multiple at once
	if (LK.ticks % enemySpawnRate === 0) {
		spawnEnemy();
		// 30% chance to spawn a second enemy
		if (Math.random() < 0.3) {
			spawnEnemy();
		}
		// 10% chance for a third enemy after score 500
		if (LK.getScore() > 500 && Math.random() < 0.1) {
			spawnEnemy();
		}
	}
	// Spawn power-ups
	if (LK.ticks % powerUpSpawnRate === 0) {
		spawnPowerUp();
	}
	// Spawn background elements
	if (LK.ticks % 20 === 0) {
		spawnStar();
	}
	// Update and check player bullets
	for (var i = playerBullets.length - 1; i >= 0; i--) {
		var bullet = playerBullets[i];
		if (bullet.lastY === undefined) bullet.lastY = bullet.y;
		// Remove bullets that go off screen
		if (bullet.lastY >= -30 && bullet.y < -30) {
			bullet.destroy();
			playerBullets.splice(i, 1);
			continue;
		}
		// Check collision with enemies
		var hitEnemy = false;
		for (var e = enemies.length - 1; e >= 0; e--) {
			if (bullet.intersects(enemies[e])) {
				LK.setScore(LK.getScore() + 100);
				scoreTxt.setText('Score: ' + LK.getScore());
				// Flash effect on enemy hit
				LK.effects.flashObject(enemies[e], 0xFFFFFF, 200);
				LK.getSound('enemyHit').play();
				enemies[e].destroy();
				enemies.splice(e, 1);
				bullet.destroy();
				playerBullets.splice(i, 1);
				hitEnemy = true;
				break;
			}
		}
		if (hitEnemy) continue;
		bullet.lastY = bullet.y;
	}
	// Update and check enemy bullets
	for (var i = enemyBullets.length - 1; i >= 0; i--) {
		var bullet = enemyBullets[i];
		if (bullet.lastY === undefined) bullet.lastY = bullet.y;
		// Remove bullets that go off screen
		if (bullet.lastY <= 2762 && bullet.y > 2762) {
			bullet.destroy();
			enemyBullets.splice(i, 1);
			continue;
		}
		// Check collision with player
		if (bullet.intersects(player)) {
			playerLives--;
			// Remove a heart with tween animation
			if (hearts.length > 0) {
				var heartToRemove = hearts.pop();
				tween(heartToRemove, {
					alpha: 0,
					scaleX: 0,
					scaleY: 0
				}, {
					duration: 300,
					easing: tween.easeIn,
					onFinish: function onFinish() {
						heartToRemove.destroy();
					}
				});
			}
			LK.effects.flashObject(player, 0xFF0000, 500);
			bullet.destroy();
			enemyBullets.splice(i, 1);
			if (playerLives <= 0) {
				LK.effects.flashScreen(0xFF0000, 1000);
				LK.showGameOver();
				return;
			}
			continue;
		}
		bullet.lastY = bullet.y;
	}
	// Update and check enemies
	for (var i = enemies.length - 1; i >= 0; i--) {
		var enemy = enemies[i];
		if (enemy.lastY === undefined) enemy.lastY = enemy.y;
		// Remove enemies that go off screen
		if (enemy.lastY <= 2762 && enemy.y > 2762) {
			enemy.destroy();
			enemies.splice(i, 1);
			continue;
		}
		// Check collision with player
		if (enemy.intersects(player)) {
			playerLives--;
			// Remove a heart with tween animation
			if (hearts.length > 0) {
				var heartToRemove = hearts.pop();
				tween(heartToRemove, {
					alpha: 0,
					scaleX: 0,
					scaleY: 0
				}, {
					duration: 300,
					easing: tween.easeIn,
					onFinish: function onFinish() {
						heartToRemove.destroy();
					}
				});
			}
			LK.effects.flashObject(player, 0xFF0000, 500);
			enemy.destroy();
			enemies.splice(i, 1);
			if (playerLives <= 0) {
				LK.effects.flashScreen(0xFF0000, 1000);
				LK.showGameOver();
				return;
			}
			continue;
		}
		enemy.lastY = enemy.y;
	}
	// Update and check power-ups
	for (var i = powerUps.length - 1; i >= 0; i--) {
		var powerUp = powerUps[i];
		if (powerUp.lastY === undefined) powerUp.lastY = powerUp.y;
		// Remove power-ups that go off screen
		if (powerUp.lastY <= 2762 && powerUp.y > 2762) {
			powerUp.destroy();
			powerUps.splice(i, 1);
			continue;
		}
		// Check collision with player
		if (powerUp.intersects(player)) {
			LK.setScore(LK.getScore() + 50);
			scoreTxt.setText('Score: ' + LK.getScore());
			// Level up player
			playerLevel++;
			// Add one life
			playerLives++;
			// Create new heart
			var newHeart = LK.getAsset('heart', {
				anchorX: 0.5,
				anchorY: 0.5
			});
			newHeart.x = 150 + hearts.length * 80;
			newHeart.y = 60;
			newHeart.alpha = 0;
			newHeart.scaleX = 0;
			newHeart.scaleY = 0;
			hearts.push(newHeart);
			LK.gui.topLeft.addChild(newHeart);
			// Animate new heart appearing
			tween(newHeart, {
				alpha: 1,
				scaleX: 1,
				scaleY: 1
			}, {
				duration: 300,
				easing: tween.easeOut
			});
			// Scale up player aircraft
			tween(player, {
				scaleX: 1 + (playerLevel - 1) * 0.2,
				scaleY: 1 + (playerLevel - 1) * 0.2
			}, {
				duration: 500,
				easing: tween.easeOut
			});
			// Increase bullet count
			if (playerLevel === 2) {
				player.bulletCount = 2;
			} else if (playerLevel >= 3) {
				player.bulletCount = 3;
			}
			// Scale bullets
			player.bulletScale = 1 + (playerLevel - 1) * 0.3;
			// Reduce player fire rate for power-up effect
			player.fireRate = Math.max(5, player.fireRate - 2);
			LK.getSound('powerUpCollect').play();
			LK.effects.flashObject(player, 0x00FF00, 500);
			powerUp.destroy();
			powerUps.splice(i, 1);
			continue;
		}
		powerUp.lastY = powerUp.y;
	}
	// Update and clean up stars
	for (var i = stars.length - 1; i >= 0; i--) {
		var star = stars[i];
		if (star.lastY === undefined) star.lastY = star.y;
		if (star.lastY <= 2762 && star.y > 2762) {
			star.destroy();
			stars.splice(i, 1);
			continue;
		}
		star.lastY = star.y;
	}
};
:quality(85)/https://cdn.frvr.ai/685455c02469ce01f3eb21d4.png%3F3) 
 2D Düz bir savaş uçağı. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/685456312469ce01f3eb21e9.png%3F3) 
 Lazer Işını Mermisi Düz In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/6854566c2469ce01f3eb21f7.png%3F3) 
 Power Up Simgesi. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/685457002469ce01f3eb2200.png%3F3) 
 Enemy Plane. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/685458642469ce01f3eb220c.png%3F3) 
 Piksel Kalp Resmi. In-Game asset. 2d. High contrast. No shadows