/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
var Boss = Container.expand(function () {
	var self = Container.call(this);
	var bossGraphics = self.attachAsset('boss', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 250;
	self.maxHealth = 250;
	self.shootTimer = 0;
	self.shootInterval = 90; // 1.5 seconds at 60fps
	self.moveTimer = 0;
	self.moveDirection = 1;
	self.baseY = self.y;
	self.update = function () {
		// Boss movement pattern
		self.moveTimer++;
		self.y = self.baseY + Math.sin(self.moveTimer * 0.02) * 1300;
		// Shooting pattern
		self.shootTimer++;
		if (self.shootTimer >= self.shootInterval) {
			self.shoot();
			self.shootTimer = 0;
		}
		// Flash when hit
		if (self.hitFlash > 0) {
			self.hitFlash--;
			bossGraphics.tint = self.hitFlash % 10 < 5 ? 0xff0000 : 0xffffff;
		} else {
			bossGraphics.tint = 0xffffff;
		}
	};
	self.hitFlash = 0;
	self.shoot = function () {
		LK.getSound('bossShoot').play();
		// Create three boss bullets in spread pattern
		for (var i = 0; i < 3; i++) {
			var bullet = new BossBullet();
			bullet.x = self.x - 150;
			bullet.y = self.y;
			// Calculate direction to player
			var deltaX = player.x - bullet.x;
			var deltaY = player.y - bullet.y;
			var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
			var speed = 12;
			// Add spread angle (-20 degrees for first bullet, 0 degrees for second bullet, +20 degrees for third bullet)
			var spreadAngle = i === 0 ? -0.35 : i === 1 ? 0 : 0.35; // -20, 0, and +20 degrees in radians
			var baseAngle = Math.atan2(deltaY, deltaX);
			var finalAngle = baseAngle + spreadAngle;
			bullet.speedX = Math.cos(finalAngle) * speed;
			bullet.speedY = Math.sin(finalAngle) * speed;
			bossBullets.push(bullet);
			game.addChild(bullet);
		}
		// Flash effect
		tween(bossGraphics, {
			scaleX: 1.2,
			scaleY: 1.2
		}, {
			duration: 100,
			onFinish: function onFinish() {
				tween(bossGraphics, {
					scaleX: 1,
					scaleY: 1
				}, {
					duration: 100
				});
			}
		});
	};
	self.takeDamage = function () {
		self.health--;
		self.hitFlash = 30;
		LK.getSound('hit').play();
		if (self.health <= 0) {
			// Level up instead of winning
			currentLevel++;
			score += 100; // Bonus for completing level
			LK.setScore(score);
			// Spawn new boss with increased difficulty
			self.destroy();
			spawnNewBoss();
		}
	};
	return self;
});
var BossBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bossBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speedX = 0;
	self.speedY = 0;
	self.lifetime = 0;
	self.maxLifetime = 600;
	self.update = function () {
		self.x += self.speedX;
		self.y += self.speedY;
		self.lifetime++;
		if (self.lifetime >= self.maxLifetime || self.x < -50) {
			self.shouldDestroy = true;
		}
	};
	return self;
});
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 12;
	self.lifetime = 0;
	self.maxLifetime = 300; // 5 seconds at 60fps
	self.update = function () {
		self.x += self.speed;
		self.lifetime++;
		if (self.lifetime >= self.maxLifetime || self.x > 2200) {
			self.shouldDestroy = true;
		}
	};
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.velocityY = 0;
	self.gravity = 0.8;
	self.jumpPower = -15;
	self.isGrounded = false;
	self.isDead = false;
	self.moveSpeed = 6;
	self.shootCooldown = 0;
	self.lastGrounded = false;
	self.jumpsRemaining = 7;
	self.maxJumps = 7;
	self.update = function () {
		// Apply gravity
		if (!self.isGrounded) {
			self.velocityY += self.gravity;
		}
		// Apply vertical movement
		self.y += self.velocityY;
		// Ground collision detection
		self.isGrounded = false;
		// Ground floor collision
		if (self.y > 2600) {
			self.y = 2600;
			self.velocityY = 0;
			self.isGrounded = true;
		}
		// Landing sound effect
		if (!self.lastGrounded && self.isGrounded && self.velocityY >= 0) {
			LK.getSound('jump').play();
		}
		self.lastGrounded = self.isGrounded;
		// Boundary checking
		if (self.x < 30) self.x = 30;
		if (self.x > 800) self.x = 800; // Keep player on left side of screen
		if (self.y < 30) self.y = 30;
		// Reduce shoot cooldown
		if (self.shootCooldown > 0) {
			self.shootCooldown--;
		}
		// Auto-shooting
		if (self.shootCooldown <= 0) {
			self.shoot();
		}
	};
	self.jump = function () {
		self.velocityY = self.jumpPower;
		self.isGrounded = false;
		LK.getSound('jump').play();
	};
	self.shoot = function () {
		if (self.shootCooldown <= 0) {
			var bullet = new Bullet();
			bullet.x = self.x + 30;
			bullet.y = self.y;
			bullets.push(bullet);
			game.addChild(bullet);
			self.shootCooldown = 15; // Quarter second cooldown
			LK.getSound('shoot').play();
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87ceeb
});
/**** 
* Game Code
****/ 
var player;
var boss;
var bullets = [];
var bossBullets = [];
var score = 0;
var scrollSpeed = 2;
var gameStarted = false;
var currentLevel = 1;
// UI elements
var scoreTxt = new Text2('Score: 0', {
	size: 80,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var healthTxt = new Text2('Boss Health: 20', {
	size: 60,
	fill: 0xFF0000
});
healthTxt.anchor.set(0, 0);
healthTxt.x = 120;
healthTxt.y = 20;
LK.gui.topLeft.addChild(healthTxt);
var levelTxt = new Text2('Level: 1', {
	size: 60,
	fill: 0x00FF00
});
levelTxt.anchor.set(1, 0);
levelTxt.x = 2048 - 120;
levelTxt.y = 20;
LK.gui.topRight.addChild(levelTxt);
// Initialize game objects
function initializeGame() {
	// Add background
	var background = game.addChild(LK.getAsset('background', {
		anchorX: 0,
		anchorY: 0,
		x: 0,
		y: 0
	}));
	// Create player
	player = game.addChild(new Player());
	player.x = 200;
	player.y = 2500;
	// Create boss using spawn function
	spawnNewBoss();
	// Start background music
	LK.playMusic('gameMusic');
	gameStarted = true;
}
// Touch controls for jumping and shooting
var jumpPressed = false;
var shootPressed = false;
game.down = function (x, y, obj) {
	if (!gameStarted || player.isDead) return;
	// Allow jumping from anywhere on screen
	if (!jumpPressed) {
		player.jump();
		jumpPressed = true;
	}
};
game.up = function (x, y, obj) {
	jumpPressed = false;
	shootPressed = false;
};
// Main game update
game.update = function () {
	if (!gameStarted || player.isDead) return;
	// Update bullets
	for (var i = bullets.length - 1; i >= 0; i--) {
		var bullet = bullets[i];
		if (bullet.shouldDestroy) {
			bullet.destroy();
			bullets.splice(i, 1);
			continue;
		}
		// Check bullet vs boss collision
		if (bullet.intersects(boss)) {
			boss.takeDamage();
			bullet.destroy();
			bullets.splice(i, 1);
			score += 10;
			LK.setScore(score);
		}
	}
	// Update boss bullets
	for (var i = bossBullets.length - 1; i >= 0; i--) {
		var bossBullet = bossBullets[i];
		if (bossBullet.shouldDestroy) {
			bossBullet.destroy();
			bossBullets.splice(i, 1);
			continue;
		}
		// Check boss bullet vs player collision
		if (bossBullet.intersects(player) && !player.isDead) {
			player.isDead = true;
			// Player death effect
			LK.effects.flashScreen(0xff0000, 1000);
			tween(player, {
				scaleX: 2,
				scaleY: 2,
				alpha: 0
			}, {
				duration: 1000,
				easing: tween.easeOut,
				onFinish: function onFinish() {
					LK.showGameOver();
				}
			});
		}
	}
	// Update UI
	scoreTxt.setText('Score: ' + score);
	if (boss && boss.health !== undefined) {
		healthTxt.setText('Boss Health: ' + boss.health);
	}
	levelTxt.setText('Level: ' + currentLevel);
	// Check if player falls off screen
	if (player.y > 2800) {
		player.isDead = true;
		LK.effects.flashScreen(0xff0000, 1000);
		LK.showGameOver();
	}
};
// Spawn new boss with level-based difficulty
function spawnNewBoss() {
	boss = game.addChild(new Boss());
	boss.x = 1700;
	boss.y = 1000;
	boss.baseY = boss.y;
	// Set boss health to 250 hits
	boss.maxHealth = 250;
	boss.health = boss.maxHealth;
	boss.shootInterval = Math.max(30, 90 - (currentLevel - 1) * 10); // Faster shooting, minimum 0.5 seconds
}
// Initialize the game
initializeGame();
; /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
var Boss = Container.expand(function () {
	var self = Container.call(this);
	var bossGraphics = self.attachAsset('boss', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 250;
	self.maxHealth = 250;
	self.shootTimer = 0;
	self.shootInterval = 90; // 1.5 seconds at 60fps
	self.moveTimer = 0;
	self.moveDirection = 1;
	self.baseY = self.y;
	self.update = function () {
		// Boss movement pattern
		self.moveTimer++;
		self.y = self.baseY + Math.sin(self.moveTimer * 0.02) * 1300;
		// Shooting pattern
		self.shootTimer++;
		if (self.shootTimer >= self.shootInterval) {
			self.shoot();
			self.shootTimer = 0;
		}
		// Flash when hit
		if (self.hitFlash > 0) {
			self.hitFlash--;
			bossGraphics.tint = self.hitFlash % 10 < 5 ? 0xff0000 : 0xffffff;
		} else {
			bossGraphics.tint = 0xffffff;
		}
	};
	self.hitFlash = 0;
	self.shoot = function () {
		LK.getSound('bossShoot').play();
		// Create three boss bullets in spread pattern
		for (var i = 0; i < 3; i++) {
			var bullet = new BossBullet();
			bullet.x = self.x - 150;
			bullet.y = self.y;
			// Calculate direction to player
			var deltaX = player.x - bullet.x;
			var deltaY = player.y - bullet.y;
			var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
			var speed = 12;
			// Add spread angle (-20 degrees for first bullet, 0 degrees for second bullet, +20 degrees for third bullet)
			var spreadAngle = i === 0 ? -0.35 : i === 1 ? 0 : 0.35; // -20, 0, and +20 degrees in radians
			var baseAngle = Math.atan2(deltaY, deltaX);
			var finalAngle = baseAngle + spreadAngle;
			bullet.speedX = Math.cos(finalAngle) * speed;
			bullet.speedY = Math.sin(finalAngle) * speed;
			bossBullets.push(bullet);
			game.addChild(bullet);
		}
		// Flash effect
		tween(bossGraphics, {
			scaleX: 1.2,
			scaleY: 1.2
		}, {
			duration: 100,
			onFinish: function onFinish() {
				tween(bossGraphics, {
					scaleX: 1,
					scaleY: 1
				}, {
					duration: 100
				});
			}
		});
	};
	self.takeDamage = function () {
		self.health--;
		self.hitFlash = 30;
		LK.getSound('hit').play();
		if (self.health <= 0) {
			// Level up instead of winning
			currentLevel++;
			score += 100; // Bonus for completing level
			LK.setScore(score);
			// Spawn new boss with increased difficulty
			self.destroy();
			spawnNewBoss();
		}
	};
	return self;
});
var BossBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bossBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speedX = 0;
	self.speedY = 0;
	self.lifetime = 0;
	self.maxLifetime = 600;
	self.update = function () {
		self.x += self.speedX;
		self.y += self.speedY;
		self.lifetime++;
		if (self.lifetime >= self.maxLifetime || self.x < -50) {
			self.shouldDestroy = true;
		}
	};
	return self;
});
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 12;
	self.lifetime = 0;
	self.maxLifetime = 300; // 5 seconds at 60fps
	self.update = function () {
		self.x += self.speed;
		self.lifetime++;
		if (self.lifetime >= self.maxLifetime || self.x > 2200) {
			self.shouldDestroy = true;
		}
	};
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.velocityY = 0;
	self.gravity = 0.8;
	self.jumpPower = -15;
	self.isGrounded = false;
	self.isDead = false;
	self.moveSpeed = 6;
	self.shootCooldown = 0;
	self.lastGrounded = false;
	self.jumpsRemaining = 7;
	self.maxJumps = 7;
	self.update = function () {
		// Apply gravity
		if (!self.isGrounded) {
			self.velocityY += self.gravity;
		}
		// Apply vertical movement
		self.y += self.velocityY;
		// Ground collision detection
		self.isGrounded = false;
		// Ground floor collision
		if (self.y > 2600) {
			self.y = 2600;
			self.velocityY = 0;
			self.isGrounded = true;
		}
		// Landing sound effect
		if (!self.lastGrounded && self.isGrounded && self.velocityY >= 0) {
			LK.getSound('jump').play();
		}
		self.lastGrounded = self.isGrounded;
		// Boundary checking
		if (self.x < 30) self.x = 30;
		if (self.x > 800) self.x = 800; // Keep player on left side of screen
		if (self.y < 30) self.y = 30;
		// Reduce shoot cooldown
		if (self.shootCooldown > 0) {
			self.shootCooldown--;
		}
		// Auto-shooting
		if (self.shootCooldown <= 0) {
			self.shoot();
		}
	};
	self.jump = function () {
		self.velocityY = self.jumpPower;
		self.isGrounded = false;
		LK.getSound('jump').play();
	};
	self.shoot = function () {
		if (self.shootCooldown <= 0) {
			var bullet = new Bullet();
			bullet.x = self.x + 30;
			bullet.y = self.y;
			bullets.push(bullet);
			game.addChild(bullet);
			self.shootCooldown = 15; // Quarter second cooldown
			LK.getSound('shoot').play();
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87ceeb
});
/**** 
* Game Code
****/ 
var player;
var boss;
var bullets = [];
var bossBullets = [];
var score = 0;
var scrollSpeed = 2;
var gameStarted = false;
var currentLevel = 1;
// UI elements
var scoreTxt = new Text2('Score: 0', {
	size: 80,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var healthTxt = new Text2('Boss Health: 20', {
	size: 60,
	fill: 0xFF0000
});
healthTxt.anchor.set(0, 0);
healthTxt.x = 120;
healthTxt.y = 20;
LK.gui.topLeft.addChild(healthTxt);
var levelTxt = new Text2('Level: 1', {
	size: 60,
	fill: 0x00FF00
});
levelTxt.anchor.set(1, 0);
levelTxt.x = 2048 - 120;
levelTxt.y = 20;
LK.gui.topRight.addChild(levelTxt);
// Initialize game objects
function initializeGame() {
	// Add background
	var background = game.addChild(LK.getAsset('background', {
		anchorX: 0,
		anchorY: 0,
		x: 0,
		y: 0
	}));
	// Create player
	player = game.addChild(new Player());
	player.x = 200;
	player.y = 2500;
	// Create boss using spawn function
	spawnNewBoss();
	// Start background music
	LK.playMusic('gameMusic');
	gameStarted = true;
}
// Touch controls for jumping and shooting
var jumpPressed = false;
var shootPressed = false;
game.down = function (x, y, obj) {
	if (!gameStarted || player.isDead) return;
	// Allow jumping from anywhere on screen
	if (!jumpPressed) {
		player.jump();
		jumpPressed = true;
	}
};
game.up = function (x, y, obj) {
	jumpPressed = false;
	shootPressed = false;
};
// Main game update
game.update = function () {
	if (!gameStarted || player.isDead) return;
	// Update bullets
	for (var i = bullets.length - 1; i >= 0; i--) {
		var bullet = bullets[i];
		if (bullet.shouldDestroy) {
			bullet.destroy();
			bullets.splice(i, 1);
			continue;
		}
		// Check bullet vs boss collision
		if (bullet.intersects(boss)) {
			boss.takeDamage();
			bullet.destroy();
			bullets.splice(i, 1);
			score += 10;
			LK.setScore(score);
		}
	}
	// Update boss bullets
	for (var i = bossBullets.length - 1; i >= 0; i--) {
		var bossBullet = bossBullets[i];
		if (bossBullet.shouldDestroy) {
			bossBullet.destroy();
			bossBullets.splice(i, 1);
			continue;
		}
		// Check boss bullet vs player collision
		if (bossBullet.intersects(player) && !player.isDead) {
			player.isDead = true;
			// Player death effect
			LK.effects.flashScreen(0xff0000, 1000);
			tween(player, {
				scaleX: 2,
				scaleY: 2,
				alpha: 0
			}, {
				duration: 1000,
				easing: tween.easeOut,
				onFinish: function onFinish() {
					LK.showGameOver();
				}
			});
		}
	}
	// Update UI
	scoreTxt.setText('Score: ' + score);
	if (boss && boss.health !== undefined) {
		healthTxt.setText('Boss Health: ' + boss.health);
	}
	levelTxt.setText('Level: ' + currentLevel);
	// Check if player falls off screen
	if (player.y > 2800) {
		player.isDead = true;
		LK.effects.flashScreen(0xff0000, 1000);
		LK.showGameOver();
	}
};
// Spawn new boss with level-based difficulty
function spawnNewBoss() {
	boss = game.addChild(new Boss());
	boss.x = 1700;
	boss.y = 1000;
	boss.baseY = boss.y;
	// Set boss health to 250 hits
	boss.maxHealth = 250;
	boss.health = boss.maxHealth;
	boss.shootInterval = Math.max(30, 90 - (currentLevel - 1) * 10); // Faster shooting, minimum 0.5 seconds
}
// Initialize the game
initializeGame();
;
 monglkey king raja kera di atas awan kinton menyerang dengan tongkat sakti. side scroller image. In-Game asset. 2d. High contrast. No shadows
 erlang shen. the sun wukong enemy. side scroller image. atack with fire In-Game asset. 2d. High contrast. No shadows
 dari jauh terlihat istana langit di atas awan luas versi fantasy china. In-Game asset. 2d. High contrast. No shadows