/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
// Enemy
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	self.type = 1; // 1,2,3
	self.hp = 1;
	self.shootTimer = 0;
	self.pattern = 0; // 0: straight, 1: sine, 2: zigzag
	self.baseX = 0;
	self.baseY = 0;
	self.t = 0;
	self.speed = 4;
	self.scoreValue = 10;
	self.asset = null;
	self.init = function (type, pattern) {
		self.type = type;
		self.pattern = pattern;
		if (type === 1) {
			self.asset = self.attachAsset('enemy1', {
				anchorX: 0.5,
				anchorY: 0.5
			});
			self.hp = 1;
			self.scoreValue = 10;
		} else if (type === 2) {
			self.asset = self.attachAsset('enemy2', {
				anchorX: 0.5,
				anchorY: 0.5
			});
			self.hp = 2;
			self.scoreValue = 20;
		} else if (type === 3) {
			self.asset = self.attachAsset('enemy3', {
				anchorX: 0.5,
				anchorY: 0.5
			});
			self.hp = 3;
			self.scoreValue = 40;
		}
		self.width = self.asset.width;
		self.height = self.asset.height;
		self.baseX = self.x;
		self.baseY = self.y;
		self.t = 0;
		self.shootTimer = 0;
		self.speed = 4 + type;
	};
	self.update = function () {
		self.t += 1;
		// Movement patterns
		if (self.pattern === 0) {
			// Straight down
			self.y += self.speed;
		} else if (self.pattern === 1) {
			// Sine wave
			self.y += self.speed;
			self.x = self.baseX + Math.sin(self.t / 20) * 180;
		} else if (self.pattern === 2) {
			// Zigzag
			self.y += self.speed;
			self.x = self.baseX + (self.t % 60 < 30 ? -80 : 80);
		}
	};
	// Flash when hit
	self.flash = function () {
		tween(self.asset, {
			tint: 0xffffff
		}, {
			duration: 80,
			onFinish: function onFinish() {
				tween(self.asset, {
					tint: self.type === 1 ? 0xff3b3b : self.type === 2 ? 0xffe14d : 0x7bff7b
				}, {
					duration: 120
				});
			}
		});
	};
	return self;
});
// Enemy Bullet
var EnemyBullet = Container.expand(function () {
	var self = Container.call(this);
	var bullet = self.attachAsset('enemyBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 18;
	self.dx = 0;
	self.dy = 1;
	self.update = function () {
		self.x += self.dx * self.speed;
		self.y += self.dy * self.speed;
	};
	return self;
});
// Player Bullet
var PlayerBullet = Container.expand(function () {
	var self = Container.call(this);
	var bullet = self.attachAsset('playerBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -32;
	self.update = function () {
		self.y += self.speed;
	};
	return self;
});
// Player Ship
var PlayerShip = Container.expand(function () {
	var self = Container.call(this);
	var ship = self.attachAsset('playerShip', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = ship.width;
	self.height = ship.height;
	self.speed = 22;
	self.shootCooldown = 0;
	self.powerLevel = 1; // 1: single, 2: double, 3: triple
	self.invincible = 0; // frames left of invincibility
	// Flash when hit
	self.flash = function () {
		tween(ship, {
			tint: 0xffff00
		}, {
			duration: 100,
			onFinish: function onFinish() {
				tween(ship, {
					tint: 0x33c1ff
				}, {
					duration: 200
				});
			}
		});
	};
	return self;
});
// Powerup
var Powerup = Container.expand(function () {
	var self = Container.call(this);
	// 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi
	self.type = 1;
	self.asset = self.attachAsset('powerup', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Color tint for each powerup type for visual feedback
	var tints = [0xffffff,
	// fallback
	0x33c1ff,
	// 1: power (blue)
	0xffe14d,
	// 2: shield (yellow)
	0x7bff7b,
	// 3: rapid (green)
	0xff3b3b,
	// 4: slowmo (red)
	0xff7bf7,
	// 5: bomb (pink)
	0x7b7bff,
	// 6: score (purple)
	0x00ffff,
	// 7: shrink (cyan)
	0xffa500,
	// 8: expand (orange)
	0x00ff00,
	// 9: reflect (lime)
	0xffffff // 10: multi (white)
	];
	self.setType = function (type) {
		self.type = type;
		if (type >= 1 && type <= 10) {
			self.asset.tint = tints[type];
		} else {
			self.asset.tint = 0xffffff;
		}
	};
	self.update = function () {
		self.y += 10;
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000
});
/**** 
* Game Code
****/ 
// Game state variables
// Ship (player)
// Enemy types
// Bullets
// Powerup
// Sounds
// Music
var player = null;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerups = [];
var dragNode = null;
var lastMoveX = 0;
var lastMoveY = 0;
var scoreTxt = null;
var level = 1;
var waveTimer = 0;
var nextPowerupScore = 30;
var gameOver = false;
var lastIntersecting = false;
var invincibleTimer = 0;
// Powerup effect timers
// On player
// rapidFire: frames left of rapid fire
// shrink: frames left of shrink
// expand: frames left of expand
// reflect: frames left of reflect
PlayerShip.prototype.rapidFire = 0;
PlayerShip.prototype.shrink = 0;
PlayerShip.prototype.expand = 0;
PlayerShip.prototype.reflect = 0;
// On game
game.slowmo = 0;
// Set background color
game.setBackgroundColor(0x0a0a1a);
// Score display
scoreTxt = new Text2('0', {
	size: 120,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Initialize player
player = new PlayerShip();
player.x = 2048 / 2;
player.y = 2732 - 200;
game.addChild(player);
// Start music
LK.playMusic('bgmusic');
// Touch controls
game.down = function (x, y, obj) {
	// Only allow drag if touch is on lower 1/3 of screen
	if (y > 2732 * 0.6) {
		dragNode = player;
		lastMoveX = x;
		lastMoveY = y;
	}
};
game.up = function (x, y, obj) {
	dragNode = null;
};
function handleMove(x, y, obj) {
	if (dragNode === player) {
		// Clamp to screen
		var minX = player.width / 2 + 20;
		var maxX = 2048 - player.width / 2 - 20;
		var minY = 2732 * 0.6;
		var maxY = 2732 - player.height / 2 - 20;
		player.x = Math.max(minX, Math.min(maxX, x));
		player.y = Math.max(minY, Math.min(maxY, y));
	}
}
game.move = handleMove;
// Fire player bullets
function firePlayerBullets() {
	if (player.shootCooldown > 0) return;
	var b;
	if (player.powerLevel === 1) {
		b = new PlayerBullet();
		b.x = player.x;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
	} else if (player.powerLevel === 2) {
		b = new PlayerBullet();
		b.x = player.x - 32;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
		b = new PlayerBullet();
		b.x = player.x + 32;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
	} else if (player.powerLevel >= 3) {
		b = new PlayerBullet();
		b.x = player.x;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
		b = new PlayerBullet();
		b.x = player.x - 48;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
		b = new PlayerBullet();
		b.x = player.x + 48;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
	}
	LK.getSound('shoot').play();
	player.shootCooldown = 10; // frames
}
// Spawn enemy wave
function spawnWave() {
	var n = 4 + Math.floor(level * 0.7);
	var margin = 180;
	var spacing = (2048 - margin * 2) / (n - 1);
	var y0 = -100;
	for (var i = 0; i < n; i++) {
		var e = new Enemy();
		// Evolve enemy types and patterns as level increases
		var type = 1;
		var pattern = 0;
		if (level >= 3 && Math.random() < 0.4) type = 2;
		if (level >= 7 && Math.random() < 0.25) type = 3;
		if (level >= 2 && Math.random() < 0.3) pattern = 1;
		if (level >= 5 && Math.random() < 0.2) pattern = 2;
		e.init(type, pattern);
		e.x = margin + i * spacing;
		e.y = y0 - Math.random() * 120;
		e.baseX = e.x;
		e.baseY = e.y;
		enemies.push(e);
		game.addChild(e);
	}
}
// Spawn powerup
function spawnPowerup() {
	var p = new Powerup();
	p.x = 200 + Math.random() * (2048 - 400);
	p.y = -60;
	// Randomly assign one of 10 powerup types, weighted for early game
	var type = 1;
	if (level < 3) {
		// Early: mostly power/shield
		type = Math.random() < 0.7 ? 1 : 2;
	} else if (level < 6) {
		// Add rapid, slowmo, bomb
		var r = Math.random();
		if (r < 0.4) type = 1;else if (r < 0.6) type = 2;else if (r < 0.75) type = 3;else if (r < 0.9) type = 4;else type = 5;
	} else {
		// All types possible
		type = 1 + Math.floor(Math.random() * 10);
	}
	if (typeof p.setType === "function") {
		p.setType(type);
	} else {
		p.type = type;
	}
	powerups.push(p);
	game.addChild(p);
}
// Main update loop
game.update = function () {
	if (gameOver) return;
	// Player shooting
	if (player.shootCooldown > 0) player.shootCooldown--;
	// Rapid fire powerup
	if (player.rapidFire > 0) {
		player.rapidFire--;
		if (LK.ticks % 3 === 0) firePlayerBullets();
		if (player.rapidFire === 0) {
			// End rapid fire
		}
	} else {
		if (LK.ticks % 6 === 0) firePlayerBullets();
	}
	// Player invincibility
	if (player.invincible > 0) {
		player.invincible--;
		if (player.invincible === 0) {
			tween(player, {
				alpha: 1
			}, {
				duration: 200
			});
		}
	}
	// Shrink/Expand powerup
	if (player.shrink > 0) {
		player.shrink--;
		if (player.shrink === 0) {
			tween(player, {
				scaleX: 1,
				scaleY: 1
			}, {
				duration: 200
			});
		}
	}
	if (player.expand > 0) {
		player.expand--;
		if (player.expand === 0) {
			tween(player, {
				scaleX: 1,
				scaleY: 1
			}, {
				duration: 200
			});
		}
	}
	// Slowmo powerup
	if (game.slowmo > 0) {
		game.slowmo--;
	}
	// Update player bullets
	for (var i = playerBullets.length - 1; i >= 0; i--) {
		var b = playerBullets[i];
		b.update();
		if (b.y < -60) {
			b.destroy();
			playerBullets.splice(i, 1);
			continue;
		}
		// Collision with enemies
		for (var j = enemies.length - 1; j >= 0; j--) {
			var e = enemies[j];
			if (b.intersects(e)) {
				e.hp--;
				e.flash();
				if (e.hp <= 0) {
					LK.setScore(LK.getScore() + e.scoreValue);
					scoreTxt.setText(LK.getScore());
					LK.getSound('explosion').play();
					e.destroy();
					enemies.splice(j, 1);
				}
				b.destroy();
				playerBullets.splice(i, 1);
				break;
			}
		}
	}
	// Update enemies
	for (var i = enemies.length - 1; i >= 0; i--) {
		var e = enemies[i];
		// Slowmo: enemies move slower
		if (game.slowmo > 0) {
			if (LK.ticks % 2 === 0) {
				e.update();
			}
		} else {
			e.update();
		}
		// Enemy shoots
		if (level >= 2 && LK.ticks % (60 - Math.min(level * 2, 40)) === 0 && Math.random() < 0.5) {
			var eb = new EnemyBullet();
			eb.x = e.x;
			eb.y = e.y + e.height / 2 + 10;
			// Aim at player
			var dx = player.x - e.x;
			var dy = player.y - e.y;
			var len = Math.sqrt(dx * dx + dy * dy);
			if (len > 0) {
				eb.dx = dx / len;
				eb.dy = dy / len;
			}
			enemyBullets.push(eb);
			game.addChild(eb);
			LK.getSound('enemyShoot').play();
		}
		// Remove if off screen
		if (e.y > 2732 + 100) {
			e.destroy();
			enemies.splice(i, 1);
		}
	}
	// Update enemy bullets
	for (var i = enemyBullets.length - 1; i >= 0; i--) {
		var eb = enemyBullets[i];
		// Slowmo: bullets move slower
		if (game.slowmo > 0) {
			if (LK.ticks % 2 === 0) {
				eb.update();
			}
		} else {
			eb.update();
		}
		if (eb.y > 2732 + 60 || eb.x < -60 || eb.x > 2048 + 60) {
			eb.destroy();
			enemyBullets.splice(i, 1);
			continue;
		}
		// Collision with player
		if (player.invincible === 0 && eb.intersects(player)) {
			// Reflect powerup: reflect enemy bullets upward
			if (player.reflect > 0) {
				eb.dy = -Math.abs(eb.dy);
				eb.dx = eb.dx;
				continue;
			}
			player.flash();
			player.invincible = 60;
			tween(player, {
				alpha: 0.5
			}, {
				duration: 100
			});
			LK.effects.flashScreen(0xff0000, 400);
			LK.showGameOver();
			gameOver = true;
			return;
		}
	}
	// Update powerups
	for (var i = powerups.length - 1; i >= 0; i--) {
		var p = powerups[i];
		p.update();
		if (p.y > 2732 + 60) {
			p.destroy();
			powerups.splice(i, 1);
			continue;
		}
		// Collision with player
		if (p.intersects(player)) {
			LK.getSound('powerup').play();
			// 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi
			if (p.type === 1) {
				// Power up: increase powerLevel
				if (player.powerLevel < 3) player.powerLevel++;
			} else if (p.type === 2) {
				// Shield: invincibility
				player.invincible = 180;
				tween(player, {
					alpha: 0.5
				}, {
					duration: 100
				});
			} else if (p.type === 3) {
				// Rapid fire: reduce shootCooldown for 8 seconds
				player.rapidFire = 480; // frames
			} else if (p.type === 4) {
				// Slowmo: slow all enemies for 6 seconds
				game.slowmo = 360;
			} else if (p.type === 5) {
				// Bomb: destroy all enemies on screen
				for (var j = enemies.length - 1; j >= 0; j--) {
					LK.setScore(LK.getScore() + enemies[j].scoreValue);
					enemies[j].destroy();
					enemies.splice(j, 1);
				}
				scoreTxt.setText(LK.getScore());
				LK.effects.flashScreen(0xffffff, 400);
			} else if (p.type === 6) {
				// Score: +100 points
				LK.setScore(LK.getScore() + 100);
				scoreTxt.setText(LK.getScore());
			} else if (p.type === 7) {
				// Shrink: shrink player for 10 seconds
				player.shrink = 600;
				tween(player, {
					scaleX: 0.6,
					scaleY: 0.6
				}, {
					duration: 200
				});
			} else if (p.type === 8) {
				// Expand: expand player for 10 seconds
				player.expand = 600;
				tween(player, {
					scaleX: 1.5,
					scaleY: 1.5
				}, {
					duration: 200
				});
			} else if (p.type === 9) {
				// Reflect: reflect enemy bullets for 8 seconds
				player.reflect = 480;
			} else if (p.type === 10) {
				// Multi: all effects for 3 seconds (except bomb/score)
				player.rapidFire = 180;
				player.invincible = 180;
				player.reflect = 180;
				player.shrink = 180;
				tween(player, {
					scaleX: 0.6,
					scaleY: 0.6
				}, {
					duration: 200
				});
				game.slowmo = 180;
			}
			p.destroy();
			powerups.splice(i, 1);
		}
	}
	// Spawn new wave if all enemies gone
	if (enemies.length === 0 && waveTimer <= 0) {
		spawnWave();
		level++;
		waveTimer = 60;
	}
	if (waveTimer > 0) waveTimer--;
	// Spawn powerup at score milestones
	if (LK.getScore() >= nextPowerupScore) {
		spawnPowerup();
		nextPowerupScore += 40 + Math.floor(level * 10);
	}
}; /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
// Enemy
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	self.type = 1; // 1,2,3
	self.hp = 1;
	self.shootTimer = 0;
	self.pattern = 0; // 0: straight, 1: sine, 2: zigzag
	self.baseX = 0;
	self.baseY = 0;
	self.t = 0;
	self.speed = 4;
	self.scoreValue = 10;
	self.asset = null;
	self.init = function (type, pattern) {
		self.type = type;
		self.pattern = pattern;
		if (type === 1) {
			self.asset = self.attachAsset('enemy1', {
				anchorX: 0.5,
				anchorY: 0.5
			});
			self.hp = 1;
			self.scoreValue = 10;
		} else if (type === 2) {
			self.asset = self.attachAsset('enemy2', {
				anchorX: 0.5,
				anchorY: 0.5
			});
			self.hp = 2;
			self.scoreValue = 20;
		} else if (type === 3) {
			self.asset = self.attachAsset('enemy3', {
				anchorX: 0.5,
				anchorY: 0.5
			});
			self.hp = 3;
			self.scoreValue = 40;
		}
		self.width = self.asset.width;
		self.height = self.asset.height;
		self.baseX = self.x;
		self.baseY = self.y;
		self.t = 0;
		self.shootTimer = 0;
		self.speed = 4 + type;
	};
	self.update = function () {
		self.t += 1;
		// Movement patterns
		if (self.pattern === 0) {
			// Straight down
			self.y += self.speed;
		} else if (self.pattern === 1) {
			// Sine wave
			self.y += self.speed;
			self.x = self.baseX + Math.sin(self.t / 20) * 180;
		} else if (self.pattern === 2) {
			// Zigzag
			self.y += self.speed;
			self.x = self.baseX + (self.t % 60 < 30 ? -80 : 80);
		}
	};
	// Flash when hit
	self.flash = function () {
		tween(self.asset, {
			tint: 0xffffff
		}, {
			duration: 80,
			onFinish: function onFinish() {
				tween(self.asset, {
					tint: self.type === 1 ? 0xff3b3b : self.type === 2 ? 0xffe14d : 0x7bff7b
				}, {
					duration: 120
				});
			}
		});
	};
	return self;
});
// Enemy Bullet
var EnemyBullet = Container.expand(function () {
	var self = Container.call(this);
	var bullet = self.attachAsset('enemyBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 18;
	self.dx = 0;
	self.dy = 1;
	self.update = function () {
		self.x += self.dx * self.speed;
		self.y += self.dy * self.speed;
	};
	return self;
});
// Player Bullet
var PlayerBullet = Container.expand(function () {
	var self = Container.call(this);
	var bullet = self.attachAsset('playerBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -32;
	self.update = function () {
		self.y += self.speed;
	};
	return self;
});
// Player Ship
var PlayerShip = Container.expand(function () {
	var self = Container.call(this);
	var ship = self.attachAsset('playerShip', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = ship.width;
	self.height = ship.height;
	self.speed = 22;
	self.shootCooldown = 0;
	self.powerLevel = 1; // 1: single, 2: double, 3: triple
	self.invincible = 0; // frames left of invincibility
	// Flash when hit
	self.flash = function () {
		tween(ship, {
			tint: 0xffff00
		}, {
			duration: 100,
			onFinish: function onFinish() {
				tween(ship, {
					tint: 0x33c1ff
				}, {
					duration: 200
				});
			}
		});
	};
	return self;
});
// Powerup
var Powerup = Container.expand(function () {
	var self = Container.call(this);
	// 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi
	self.type = 1;
	self.asset = self.attachAsset('powerup', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Color tint for each powerup type for visual feedback
	var tints = [0xffffff,
	// fallback
	0x33c1ff,
	// 1: power (blue)
	0xffe14d,
	// 2: shield (yellow)
	0x7bff7b,
	// 3: rapid (green)
	0xff3b3b,
	// 4: slowmo (red)
	0xff7bf7,
	// 5: bomb (pink)
	0x7b7bff,
	// 6: score (purple)
	0x00ffff,
	// 7: shrink (cyan)
	0xffa500,
	// 8: expand (orange)
	0x00ff00,
	// 9: reflect (lime)
	0xffffff // 10: multi (white)
	];
	self.setType = function (type) {
		self.type = type;
		if (type >= 1 && type <= 10) {
			self.asset.tint = tints[type];
		} else {
			self.asset.tint = 0xffffff;
		}
	};
	self.update = function () {
		self.y += 10;
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000
});
/**** 
* Game Code
****/ 
// Game state variables
// Ship (player)
// Enemy types
// Bullets
// Powerup
// Sounds
// Music
var player = null;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerups = [];
var dragNode = null;
var lastMoveX = 0;
var lastMoveY = 0;
var scoreTxt = null;
var level = 1;
var waveTimer = 0;
var nextPowerupScore = 30;
var gameOver = false;
var lastIntersecting = false;
var invincibleTimer = 0;
// Powerup effect timers
// On player
// rapidFire: frames left of rapid fire
// shrink: frames left of shrink
// expand: frames left of expand
// reflect: frames left of reflect
PlayerShip.prototype.rapidFire = 0;
PlayerShip.prototype.shrink = 0;
PlayerShip.prototype.expand = 0;
PlayerShip.prototype.reflect = 0;
// On game
game.slowmo = 0;
// Set background color
game.setBackgroundColor(0x0a0a1a);
// Score display
scoreTxt = new Text2('0', {
	size: 120,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Initialize player
player = new PlayerShip();
player.x = 2048 / 2;
player.y = 2732 - 200;
game.addChild(player);
// Start music
LK.playMusic('bgmusic');
// Touch controls
game.down = function (x, y, obj) {
	// Only allow drag if touch is on lower 1/3 of screen
	if (y > 2732 * 0.6) {
		dragNode = player;
		lastMoveX = x;
		lastMoveY = y;
	}
};
game.up = function (x, y, obj) {
	dragNode = null;
};
function handleMove(x, y, obj) {
	if (dragNode === player) {
		// Clamp to screen
		var minX = player.width / 2 + 20;
		var maxX = 2048 - player.width / 2 - 20;
		var minY = 2732 * 0.6;
		var maxY = 2732 - player.height / 2 - 20;
		player.x = Math.max(minX, Math.min(maxX, x));
		player.y = Math.max(minY, Math.min(maxY, y));
	}
}
game.move = handleMove;
// Fire player bullets
function firePlayerBullets() {
	if (player.shootCooldown > 0) return;
	var b;
	if (player.powerLevel === 1) {
		b = new PlayerBullet();
		b.x = player.x;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
	} else if (player.powerLevel === 2) {
		b = new PlayerBullet();
		b.x = player.x - 32;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
		b = new PlayerBullet();
		b.x = player.x + 32;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
	} else if (player.powerLevel >= 3) {
		b = new PlayerBullet();
		b.x = player.x;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
		b = new PlayerBullet();
		b.x = player.x - 48;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
		b = new PlayerBullet();
		b.x = player.x + 48;
		b.y = player.y - player.height / 2 - 10;
		playerBullets.push(b);
		game.addChild(b);
	}
	LK.getSound('shoot').play();
	player.shootCooldown = 10; // frames
}
// Spawn enemy wave
function spawnWave() {
	var n = 4 + Math.floor(level * 0.7);
	var margin = 180;
	var spacing = (2048 - margin * 2) / (n - 1);
	var y0 = -100;
	for (var i = 0; i < n; i++) {
		var e = new Enemy();
		// Evolve enemy types and patterns as level increases
		var type = 1;
		var pattern = 0;
		if (level >= 3 && Math.random() < 0.4) type = 2;
		if (level >= 7 && Math.random() < 0.25) type = 3;
		if (level >= 2 && Math.random() < 0.3) pattern = 1;
		if (level >= 5 && Math.random() < 0.2) pattern = 2;
		e.init(type, pattern);
		e.x = margin + i * spacing;
		e.y = y0 - Math.random() * 120;
		e.baseX = e.x;
		e.baseY = e.y;
		enemies.push(e);
		game.addChild(e);
	}
}
// Spawn powerup
function spawnPowerup() {
	var p = new Powerup();
	p.x = 200 + Math.random() * (2048 - 400);
	p.y = -60;
	// Randomly assign one of 10 powerup types, weighted for early game
	var type = 1;
	if (level < 3) {
		// Early: mostly power/shield
		type = Math.random() < 0.7 ? 1 : 2;
	} else if (level < 6) {
		// Add rapid, slowmo, bomb
		var r = Math.random();
		if (r < 0.4) type = 1;else if (r < 0.6) type = 2;else if (r < 0.75) type = 3;else if (r < 0.9) type = 4;else type = 5;
	} else {
		// All types possible
		type = 1 + Math.floor(Math.random() * 10);
	}
	if (typeof p.setType === "function") {
		p.setType(type);
	} else {
		p.type = type;
	}
	powerups.push(p);
	game.addChild(p);
}
// Main update loop
game.update = function () {
	if (gameOver) return;
	// Player shooting
	if (player.shootCooldown > 0) player.shootCooldown--;
	// Rapid fire powerup
	if (player.rapidFire > 0) {
		player.rapidFire--;
		if (LK.ticks % 3 === 0) firePlayerBullets();
		if (player.rapidFire === 0) {
			// End rapid fire
		}
	} else {
		if (LK.ticks % 6 === 0) firePlayerBullets();
	}
	// Player invincibility
	if (player.invincible > 0) {
		player.invincible--;
		if (player.invincible === 0) {
			tween(player, {
				alpha: 1
			}, {
				duration: 200
			});
		}
	}
	// Shrink/Expand powerup
	if (player.shrink > 0) {
		player.shrink--;
		if (player.shrink === 0) {
			tween(player, {
				scaleX: 1,
				scaleY: 1
			}, {
				duration: 200
			});
		}
	}
	if (player.expand > 0) {
		player.expand--;
		if (player.expand === 0) {
			tween(player, {
				scaleX: 1,
				scaleY: 1
			}, {
				duration: 200
			});
		}
	}
	// Slowmo powerup
	if (game.slowmo > 0) {
		game.slowmo--;
	}
	// Update player bullets
	for (var i = playerBullets.length - 1; i >= 0; i--) {
		var b = playerBullets[i];
		b.update();
		if (b.y < -60) {
			b.destroy();
			playerBullets.splice(i, 1);
			continue;
		}
		// Collision with enemies
		for (var j = enemies.length - 1; j >= 0; j--) {
			var e = enemies[j];
			if (b.intersects(e)) {
				e.hp--;
				e.flash();
				if (e.hp <= 0) {
					LK.setScore(LK.getScore() + e.scoreValue);
					scoreTxt.setText(LK.getScore());
					LK.getSound('explosion').play();
					e.destroy();
					enemies.splice(j, 1);
				}
				b.destroy();
				playerBullets.splice(i, 1);
				break;
			}
		}
	}
	// Update enemies
	for (var i = enemies.length - 1; i >= 0; i--) {
		var e = enemies[i];
		// Slowmo: enemies move slower
		if (game.slowmo > 0) {
			if (LK.ticks % 2 === 0) {
				e.update();
			}
		} else {
			e.update();
		}
		// Enemy shoots
		if (level >= 2 && LK.ticks % (60 - Math.min(level * 2, 40)) === 0 && Math.random() < 0.5) {
			var eb = new EnemyBullet();
			eb.x = e.x;
			eb.y = e.y + e.height / 2 + 10;
			// Aim at player
			var dx = player.x - e.x;
			var dy = player.y - e.y;
			var len = Math.sqrt(dx * dx + dy * dy);
			if (len > 0) {
				eb.dx = dx / len;
				eb.dy = dy / len;
			}
			enemyBullets.push(eb);
			game.addChild(eb);
			LK.getSound('enemyShoot').play();
		}
		// Remove if off screen
		if (e.y > 2732 + 100) {
			e.destroy();
			enemies.splice(i, 1);
		}
	}
	// Update enemy bullets
	for (var i = enemyBullets.length - 1; i >= 0; i--) {
		var eb = enemyBullets[i];
		// Slowmo: bullets move slower
		if (game.slowmo > 0) {
			if (LK.ticks % 2 === 0) {
				eb.update();
			}
		} else {
			eb.update();
		}
		if (eb.y > 2732 + 60 || eb.x < -60 || eb.x > 2048 + 60) {
			eb.destroy();
			enemyBullets.splice(i, 1);
			continue;
		}
		// Collision with player
		if (player.invincible === 0 && eb.intersects(player)) {
			// Reflect powerup: reflect enemy bullets upward
			if (player.reflect > 0) {
				eb.dy = -Math.abs(eb.dy);
				eb.dx = eb.dx;
				continue;
			}
			player.flash();
			player.invincible = 60;
			tween(player, {
				alpha: 0.5
			}, {
				duration: 100
			});
			LK.effects.flashScreen(0xff0000, 400);
			LK.showGameOver();
			gameOver = true;
			return;
		}
	}
	// Update powerups
	for (var i = powerups.length - 1; i >= 0; i--) {
		var p = powerups[i];
		p.update();
		if (p.y > 2732 + 60) {
			p.destroy();
			powerups.splice(i, 1);
			continue;
		}
		// Collision with player
		if (p.intersects(player)) {
			LK.getSound('powerup').play();
			// 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi
			if (p.type === 1) {
				// Power up: increase powerLevel
				if (player.powerLevel < 3) player.powerLevel++;
			} else if (p.type === 2) {
				// Shield: invincibility
				player.invincible = 180;
				tween(player, {
					alpha: 0.5
				}, {
					duration: 100
				});
			} else if (p.type === 3) {
				// Rapid fire: reduce shootCooldown for 8 seconds
				player.rapidFire = 480; // frames
			} else if (p.type === 4) {
				// Slowmo: slow all enemies for 6 seconds
				game.slowmo = 360;
			} else if (p.type === 5) {
				// Bomb: destroy all enemies on screen
				for (var j = enemies.length - 1; j >= 0; j--) {
					LK.setScore(LK.getScore() + enemies[j].scoreValue);
					enemies[j].destroy();
					enemies.splice(j, 1);
				}
				scoreTxt.setText(LK.getScore());
				LK.effects.flashScreen(0xffffff, 400);
			} else if (p.type === 6) {
				// Score: +100 points
				LK.setScore(LK.getScore() + 100);
				scoreTxt.setText(LK.getScore());
			} else if (p.type === 7) {
				// Shrink: shrink player for 10 seconds
				player.shrink = 600;
				tween(player, {
					scaleX: 0.6,
					scaleY: 0.6
				}, {
					duration: 200
				});
			} else if (p.type === 8) {
				// Expand: expand player for 10 seconds
				player.expand = 600;
				tween(player, {
					scaleX: 1.5,
					scaleY: 1.5
				}, {
					duration: 200
				});
			} else if (p.type === 9) {
				// Reflect: reflect enemy bullets for 8 seconds
				player.reflect = 480;
			} else if (p.type === 10) {
				// Multi: all effects for 3 seconds (except bomb/score)
				player.rapidFire = 180;
				player.invincible = 180;
				player.reflect = 180;
				player.shrink = 180;
				tween(player, {
					scaleX: 0.6,
					scaleY: 0.6
				}, {
					duration: 200
				});
				game.slowmo = 180;
			}
			p.destroy();
			powerups.splice(i, 1);
		}
	}
	// Spawn new wave if all enemies gone
	if (enemies.length === 0 && waveTimer <= 0) {
		spawnWave();
		level++;
		waveTimer = 60;
	}
	if (waveTimer > 0) waveTimer--;
	// Spawn powerup at score milestones
	if (LK.getScore() >= nextPowerupScore) {
		spawnPowerup();
		nextPowerupScore += 40 + Math.floor(level * 10);
	}
};
:quality(85)/https://cdn.frvr.ai/68385f1bb4eb8c1cfb16ce8c.png%3F3) 
 Make me a Spacelnvaders InfinityGene EVO character. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/68386037b4eb8c1cfb16ce9c.png%3F3) 
 Make a Spacelnvaders InfinityGene EVO enemy character. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/68386b68b4eb8c1cfb16ceb3.png%3F3) 
 Make this blue and green
:quality(85)/https://cdn.frvr.ai/68386bbeb4eb8c1cfb16cec2.png%3F3) 
 Make this red and purple
:quality(85)/https://cdn.frvr.ai/68386c2ab4eb8c1cfb16cedb.png%3F3) 
 Bana uzay gemisinin mermisini 2d pixel cΜ§iz. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/68386d39b4eb8c1cfb16cef2.png%3F3)