/**** 
* 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 = 20; // Increased speed for player bullets
	self.direction = 1; // 1 for right, -1 for left
	self.update = function () {
		self.x += self.speed * self.direction;
	};
	return self;
});
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 1;
	self.shootTimer = 0;
	self.shootInterval = 150; // Fixed interval of 2.5 seconds at 60 FPS
	self.hit = function () {
		self.health--;
		LK.getSound('hit').play();
		// Flash red when hit
		LK.effects.flashObject(self, 0xffffff, 300);
		if (self.health <= 0) {
			return true; // Enemy is dead
		}
		return false; // Enemy is still alive
	};
	self.update = function () {
		self.shootTimer++;
		if (self.shootTimer >= self.shootInterval) {
			self.shootTimer = 0;
			return true; // Ready to shoot
		}
		return false; // Not ready to shoot
	};
	return self;
});
var Platform = Container.expand(function () {
	var self = Container.call(this);
	var platformGraphics = self.attachAsset('platform', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('masterChief', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.facingDirection = 1; // 1 for right, -1 for left
	self.shoot = function () {
		LK.getSound('shoot').play();
		return true;
	};
	self.update = function () {
		// Ensure player stays within screen bounds
		if (self.x < 0) {
			self.x = 0;
		} else if (self.x > 2048) {
			self.x = 2048;
		}
	};
	self.flip = function (direction) {
		if (direction !== self.facingDirection) {
			self.facingDirection = direction;
			playerGraphics.scaleX = direction;
		}
	};
	self.down = function (x, y, obj) {
		// Handle player touch/click events
		if (self.shoot()) {
			// Create a storm of bullets
			for (var angle = -Math.PI / 8; angle <= Math.PI / 8; angle += Math.PI / 8) {
				for (var offset = -1.5; offset <= 1.5; offset += 1) {
					var bullet = new Bullet();
					bullet.x = self.x + offset * 10; // Offset for four lines
					bullet.y = self.y;
					bullet.direction = self.facingDirection;
					bullet.speed = 20; // Set bullet speed
					bullet.angle = angle; // Set bullet angle for spread
					bullet.update = function () {
						this.x += this.speed * Math.cos(this.angle) * this.direction;
						this.y += this.speed * Math.sin(this.angle);
					};
					playerBullets.push(bullet);
					game.addChild(bullet);
				}
			}
			return true;
		}
		return false;
	};
	self.jump = function () {
		if (!self.jumping || self.jumpCount < 10) {
			if (!self.jumping) {
				self.jumpCount = 0; // Initialize jump count
			}
			self.jumpCount++;
			self.jumping = true;
			var initialY = self.y;
			var jumpHeight = 200;
			var jumpDuration = 30; // frames
			var jumpSpeed = jumpHeight / (jumpDuration / 2);
			self.jumpTimer = 0;
			self.update = function () {
				if (self.jumping) {
					self.jumpTimer++;
					if (self.jumpTimer <= jumpDuration / 2) {
						self.y -= jumpSpeed;
					} else if (self.jumpTimer <= jumpDuration) {
						self.y += jumpSpeed;
					} else {
						self.jumping = false;
						self.jumpCount = 0; // Reset jump count when player lands
						self.y = initialY;
					}
				}
				// Ensure player stays within screen bounds
				if (self.x < 0) {
					self.x = 0;
				} else if (self.x > 2048) {
					self.x = 2048;
				}
			};
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000 // Keep background color black
});
/**** 
* Game Code
****/ 
// Add background feature
var background = LK.getAsset('backgroundImage', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 2732 / 2
});
game.addChild(background);
// Game variables
var player;
var playerPlatform;
var enemyPlatforms = [];
var enemies = [];
var playerBullets = [];
var enemyBullets = [];
var ammoBar;
var ammoBarBg;
var waveNumber = 1;
var score = 0;
var waveText;
var scoreText;
var enemiesRemaining = 0;
var gameActive = true;
var startSwipeX; // Initialize startSwipeX
var startSwipeY; // Initialize startSwipeY
// Initialize the game
function initGame() {
	// Create player platform
	playerPlatform = game.addChild(new Platform());
	playerPlatform.x = 2048 / 2;
	playerPlatform.y = 2732 - 200;
	// Create player
	player = game.addChild(new Player());
	player.x = playerPlatform.x;
	player.y = playerPlatform.y - 80;
	// Create wave text
	waveText = new Text2('Wave: ' + waveNumber, {
		size: 50,
		fill: 0xFFFFFF
	});
	waveText.anchor.set(1, 0);
	LK.gui.topRight.addChild(waveText);
	waveText.x = -20;
	waveText.y = 20;
	// Create score text
	scoreText = new Text2('Score: ' + score, {
		size: 50,
		fill: 0xFFFFFF
	});
	scoreText.anchor.set(1, 0);
	LK.gui.topRight.addChild(scoreText);
	scoreText.x = -20;
	scoreText.y = 80;
	// Start the first wave
	startWave();
	// Play background music
	LK.playMusic('bgMusic');
}
function startWave() {
	// Clear any remaining enemies and platforms
	for (var i = enemies.length - 1; i >= 0; i--) {
		enemies[i].destroy();
		enemies.splice(i, 1);
	}
	for (var i = enemyPlatforms.length - 1; i >= 0; i--) {
		enemyPlatforms[i].destroy();
		enemyPlatforms.splice(i, 1);
	}
	// Update wave text
	waveText.setText('Wave: ' + waveNumber);
	// Number of enemies based on wave
	enemiesRemaining = Math.min(3 + waveNumber, 10);
	// Create enemy platforms and enemies
	for (var i = 0; i < enemiesRemaining; i++) {
		// Create platform at random positions
		var platform = game.addChild(new Platform());
		platform.x = Math.random() * (2048 - 400) + 200; // Random x position away from edges
		platform.y = Math.random() * (2732 - 800) + 300; // Random y position not too high or low
		// Ensure platforms aren't too close to player
		var distToPlayer = Math.sqrt(Math.pow(platform.x - playerPlatform.x, 2) + Math.pow(platform.y - playerPlatform.y, 2));
		if (distToPlayer < 500) {
			platform.x = platform.x > playerPlatform.x ? platform.x + 500 : platform.x - 500;
			platform.y = platform.y > playerPlatform.y ? platform.y + 200 : platform.y - 200;
		}
		// Create enemy on platform
		var enemy = game.addChild(new Enemy());
		enemy.x = platform.x;
		enemy.y = platform.y - 60;
		enemyPlatforms.push(platform);
		enemies.push(enemy);
	}
}
// Touch event on game area
game.down = function (x, y, obj) {
	if (!gameActive) {
		return;
	}
	startSwipeX = x;
	startSwipeY = y;
};
game.move = function (x, y, obj) {
	if (!gameActive) {
		return;
	}
	if (startSwipeY !== undefined) {
		if (y < startSwipeY - 50) {
			player.y -= 40; // Move player up faster
			startSwipeY = y;
		} else if (y > startSwipeY + 50) {
			player.y += 40; // Move player down faster
			startSwipeY = y;
		}
	}
	if (startSwipeX !== undefined) {
		if (x > startSwipeX + 50) {
			player.x += 40; // Move player right faster
			startSwipeX = x;
			player.flip(1); // Face right
			player.shoot(); // Shoot right
		} else if (x < startSwipeX - 50) {
			player.x -= 40; // Move player left faster
			startSwipeX = x;
			player.flip(-1); // Face left
			player.shoot(); // Shoot left
		}
	}
};
game.up = function (x, y, obj) {
	startSwipeX = undefined;
	startSwipeY = undefined;
};
// Main game update loop
game.update = function () {
	if (!gameActive) {
		return;
	}
	// Update player
	player.update();
	// Automatic shooting logic
	if (LK.ticks % 42 === 0) {
		// Shoot every 60 frames (1 second at 60 FPS)
		// Shoot every 30 frames
		if (player.shoot()) {
			// Create bullet
			var bullet = new Bullet();
			bullet.x = player.x;
			bullet.y = player.y;
			bullet.direction = player.facingDirection;
			playerBullets.push(bullet);
			game.addChild(bullet);
		}
	}
	// Update bullets
	updateBullets();
	// Update enemies
	updateEnemies();
	if (enemies.length === 0 && enemiesRemaining === 0) {
		waveNumber++;
		startWave();
	}
};
function updateBullets() {
	// Update player bullets
	for (var i = playerBullets.length - 1; i >= 0; i--) {
		var bullet = playerBullets[i];
		// Check if bullet is off screen
		if (bullet.x < -50 || bullet.x > 2048 + 50) {
			bullet.destroy();
			playerBullets.splice(i, 1);
			continue;
		}
		// Check for collisions with enemies
		for (var j = enemies.length - 1; j >= 0; j--) {
			var enemy = enemies[j];
			if (bullet.intersects(enemy)) {
				// Enemy hit
				var isDead = enemy.hit();
				bullet.destroy();
				playerBullets.splice(i, 1);
				if (isDead) {
					// Enemy killed
					LK.getSound('enemyDeath').play();
					enemy.destroy();
					enemies.splice(j, 1);
					enemiesRemaining--;
					// Increase score
					score += 100;
					scoreText.setText('Score: ' + score);
				}
				break;
			}
		}
	}
	// Update enemy bullets
	for (var i = enemyBullets.length - 1; i >= 0; i--) {
		var bullet = enemyBullets[i];
		// Check if bullet is off screen
		if (bullet.x < -50 || bullet.x > 2048 + 50) {
			bullet.destroy();
			enemyBullets.splice(i, 1);
			continue;
		}
		// Check for collision with player
		if (bullet.intersects(player)) {
			bullet.destroy();
			enemyBullets.splice(i, 1);
			// Player hit - game over
			gameActive = false;
			LK.effects.flashScreen(0xff0000, 1000);
			LK.setScore(score);
			LK.showGameOver();
		}
	}
}
function updateEnemies() {
	for (var i = 0; i < enemies.length; i++) {
		var enemy = enemies[i];
		var readyToShoot = enemy.update();
		// Add horizontal movement for enemies
		if (enemy.lastX === undefined) {
			enemy.lastX = enemy.x;
		} // Initialize lastX for tracking changes on X
		enemy.x += enemy.speed * enemy.direction;
		// Check if enemy reached the screen edges and reverse direction
		if (enemy.x <= 0 || enemy.x >= 2048) {
			enemy.direction *= -1; // Reverse direction
		}
		// Make enemy face the player
		var direction = enemy.x > player.x ? -1 : 1;
		if (direction === -1) {
			enemy.scale.x = -1;
		} else {
			enemy.scale.x = 1;
		}
		enemy.lastX = enemy.x; // Update lastX
		// Enemy shoots
		if (readyToShoot) {
			var bullet = new Bullet();
			bullet.x = enemy.x;
			bullet.y = enemy.y;
			// Direction toward player
			bullet.direction = direction;
			enemyBullets.push(bullet);
			game.addChild(bullet);
			LK.getSound('shoot').play(); // Play shooting sound
		}
	}
}
// 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 = 20; // Increased speed for player bullets
	self.direction = 1; // 1 for right, -1 for left
	self.update = function () {
		self.x += self.speed * self.direction;
	};
	return self;
});
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 1;
	self.shootTimer = 0;
	self.shootInterval = 150; // Fixed interval of 2.5 seconds at 60 FPS
	self.hit = function () {
		self.health--;
		LK.getSound('hit').play();
		// Flash red when hit
		LK.effects.flashObject(self, 0xffffff, 300);
		if (self.health <= 0) {
			return true; // Enemy is dead
		}
		return false; // Enemy is still alive
	};
	self.update = function () {
		self.shootTimer++;
		if (self.shootTimer >= self.shootInterval) {
			self.shootTimer = 0;
			return true; // Ready to shoot
		}
		return false; // Not ready to shoot
	};
	return self;
});
var Platform = Container.expand(function () {
	var self = Container.call(this);
	var platformGraphics = self.attachAsset('platform', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('masterChief', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.facingDirection = 1; // 1 for right, -1 for left
	self.shoot = function () {
		LK.getSound('shoot').play();
		return true;
	};
	self.update = function () {
		// Ensure player stays within screen bounds
		if (self.x < 0) {
			self.x = 0;
		} else if (self.x > 2048) {
			self.x = 2048;
		}
	};
	self.flip = function (direction) {
		if (direction !== self.facingDirection) {
			self.facingDirection = direction;
			playerGraphics.scaleX = direction;
		}
	};
	self.down = function (x, y, obj) {
		// Handle player touch/click events
		if (self.shoot()) {
			// Create a storm of bullets
			for (var angle = -Math.PI / 8; angle <= Math.PI / 8; angle += Math.PI / 8) {
				for (var offset = -1.5; offset <= 1.5; offset += 1) {
					var bullet = new Bullet();
					bullet.x = self.x + offset * 10; // Offset for four lines
					bullet.y = self.y;
					bullet.direction = self.facingDirection;
					bullet.speed = 20; // Set bullet speed
					bullet.angle = angle; // Set bullet angle for spread
					bullet.update = function () {
						this.x += this.speed * Math.cos(this.angle) * this.direction;
						this.y += this.speed * Math.sin(this.angle);
					};
					playerBullets.push(bullet);
					game.addChild(bullet);
				}
			}
			return true;
		}
		return false;
	};
	self.jump = function () {
		if (!self.jumping || self.jumpCount < 10) {
			if (!self.jumping) {
				self.jumpCount = 0; // Initialize jump count
			}
			self.jumpCount++;
			self.jumping = true;
			var initialY = self.y;
			var jumpHeight = 200;
			var jumpDuration = 30; // frames
			var jumpSpeed = jumpHeight / (jumpDuration / 2);
			self.jumpTimer = 0;
			self.update = function () {
				if (self.jumping) {
					self.jumpTimer++;
					if (self.jumpTimer <= jumpDuration / 2) {
						self.y -= jumpSpeed;
					} else if (self.jumpTimer <= jumpDuration) {
						self.y += jumpSpeed;
					} else {
						self.jumping = false;
						self.jumpCount = 0; // Reset jump count when player lands
						self.y = initialY;
					}
				}
				// Ensure player stays within screen bounds
				if (self.x < 0) {
					self.x = 0;
				} else if (self.x > 2048) {
					self.x = 2048;
				}
			};
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000 // Keep background color black
});
/**** 
* Game Code
****/ 
// Add background feature
var background = LK.getAsset('backgroundImage', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 2732 / 2
});
game.addChild(background);
// Game variables
var player;
var playerPlatform;
var enemyPlatforms = [];
var enemies = [];
var playerBullets = [];
var enemyBullets = [];
var ammoBar;
var ammoBarBg;
var waveNumber = 1;
var score = 0;
var waveText;
var scoreText;
var enemiesRemaining = 0;
var gameActive = true;
var startSwipeX; // Initialize startSwipeX
var startSwipeY; // Initialize startSwipeY
// Initialize the game
function initGame() {
	// Create player platform
	playerPlatform = game.addChild(new Platform());
	playerPlatform.x = 2048 / 2;
	playerPlatform.y = 2732 - 200;
	// Create player
	player = game.addChild(new Player());
	player.x = playerPlatform.x;
	player.y = playerPlatform.y - 80;
	// Create wave text
	waveText = new Text2('Wave: ' + waveNumber, {
		size: 50,
		fill: 0xFFFFFF
	});
	waveText.anchor.set(1, 0);
	LK.gui.topRight.addChild(waveText);
	waveText.x = -20;
	waveText.y = 20;
	// Create score text
	scoreText = new Text2('Score: ' + score, {
		size: 50,
		fill: 0xFFFFFF
	});
	scoreText.anchor.set(1, 0);
	LK.gui.topRight.addChild(scoreText);
	scoreText.x = -20;
	scoreText.y = 80;
	// Start the first wave
	startWave();
	// Play background music
	LK.playMusic('bgMusic');
}
function startWave() {
	// Clear any remaining enemies and platforms
	for (var i = enemies.length - 1; i >= 0; i--) {
		enemies[i].destroy();
		enemies.splice(i, 1);
	}
	for (var i = enemyPlatforms.length - 1; i >= 0; i--) {
		enemyPlatforms[i].destroy();
		enemyPlatforms.splice(i, 1);
	}
	// Update wave text
	waveText.setText('Wave: ' + waveNumber);
	// Number of enemies based on wave
	enemiesRemaining = Math.min(3 + waveNumber, 10);
	// Create enemy platforms and enemies
	for (var i = 0; i < enemiesRemaining; i++) {
		// Create platform at random positions
		var platform = game.addChild(new Platform());
		platform.x = Math.random() * (2048 - 400) + 200; // Random x position away from edges
		platform.y = Math.random() * (2732 - 800) + 300; // Random y position not too high or low
		// Ensure platforms aren't too close to player
		var distToPlayer = Math.sqrt(Math.pow(platform.x - playerPlatform.x, 2) + Math.pow(platform.y - playerPlatform.y, 2));
		if (distToPlayer < 500) {
			platform.x = platform.x > playerPlatform.x ? platform.x + 500 : platform.x - 500;
			platform.y = platform.y > playerPlatform.y ? platform.y + 200 : platform.y - 200;
		}
		// Create enemy on platform
		var enemy = game.addChild(new Enemy());
		enemy.x = platform.x;
		enemy.y = platform.y - 60;
		enemyPlatforms.push(platform);
		enemies.push(enemy);
	}
}
// Touch event on game area
game.down = function (x, y, obj) {
	if (!gameActive) {
		return;
	}
	startSwipeX = x;
	startSwipeY = y;
};
game.move = function (x, y, obj) {
	if (!gameActive) {
		return;
	}
	if (startSwipeY !== undefined) {
		if (y < startSwipeY - 50) {
			player.y -= 40; // Move player up faster
			startSwipeY = y;
		} else if (y > startSwipeY + 50) {
			player.y += 40; // Move player down faster
			startSwipeY = y;
		}
	}
	if (startSwipeX !== undefined) {
		if (x > startSwipeX + 50) {
			player.x += 40; // Move player right faster
			startSwipeX = x;
			player.flip(1); // Face right
			player.shoot(); // Shoot right
		} else if (x < startSwipeX - 50) {
			player.x -= 40; // Move player left faster
			startSwipeX = x;
			player.flip(-1); // Face left
			player.shoot(); // Shoot left
		}
	}
};
game.up = function (x, y, obj) {
	startSwipeX = undefined;
	startSwipeY = undefined;
};
// Main game update loop
game.update = function () {
	if (!gameActive) {
		return;
	}
	// Update player
	player.update();
	// Automatic shooting logic
	if (LK.ticks % 42 === 0) {
		// Shoot every 60 frames (1 second at 60 FPS)
		// Shoot every 30 frames
		if (player.shoot()) {
			// Create bullet
			var bullet = new Bullet();
			bullet.x = player.x;
			bullet.y = player.y;
			bullet.direction = player.facingDirection;
			playerBullets.push(bullet);
			game.addChild(bullet);
		}
	}
	// Update bullets
	updateBullets();
	// Update enemies
	updateEnemies();
	if (enemies.length === 0 && enemiesRemaining === 0) {
		waveNumber++;
		startWave();
	}
};
function updateBullets() {
	// Update player bullets
	for (var i = playerBullets.length - 1; i >= 0; i--) {
		var bullet = playerBullets[i];
		// Check if bullet is off screen
		if (bullet.x < -50 || bullet.x > 2048 + 50) {
			bullet.destroy();
			playerBullets.splice(i, 1);
			continue;
		}
		// Check for collisions with enemies
		for (var j = enemies.length - 1; j >= 0; j--) {
			var enemy = enemies[j];
			if (bullet.intersects(enemy)) {
				// Enemy hit
				var isDead = enemy.hit();
				bullet.destroy();
				playerBullets.splice(i, 1);
				if (isDead) {
					// Enemy killed
					LK.getSound('enemyDeath').play();
					enemy.destroy();
					enemies.splice(j, 1);
					enemiesRemaining--;
					// Increase score
					score += 100;
					scoreText.setText('Score: ' + score);
				}
				break;
			}
		}
	}
	// Update enemy bullets
	for (var i = enemyBullets.length - 1; i >= 0; i--) {
		var bullet = enemyBullets[i];
		// Check if bullet is off screen
		if (bullet.x < -50 || bullet.x > 2048 + 50) {
			bullet.destroy();
			enemyBullets.splice(i, 1);
			continue;
		}
		// Check for collision with player
		if (bullet.intersects(player)) {
			bullet.destroy();
			enemyBullets.splice(i, 1);
			// Player hit - game over
			gameActive = false;
			LK.effects.flashScreen(0xff0000, 1000);
			LK.setScore(score);
			LK.showGameOver();
		}
	}
}
function updateEnemies() {
	for (var i = 0; i < enemies.length; i++) {
		var enemy = enemies[i];
		var readyToShoot = enemy.update();
		// Add horizontal movement for enemies
		if (enemy.lastX === undefined) {
			enemy.lastX = enemy.x;
		} // Initialize lastX for tracking changes on X
		enemy.x += enemy.speed * enemy.direction;
		// Check if enemy reached the screen edges and reverse direction
		if (enemy.x <= 0 || enemy.x >= 2048) {
			enemy.direction *= -1; // Reverse direction
		}
		// Make enemy face the player
		var direction = enemy.x > player.x ? -1 : 1;
		if (direction === -1) {
			enemy.scale.x = -1;
		} else {
			enemy.scale.x = 1;
		}
		enemy.lastX = enemy.x; // Update lastX
		// Enemy shoots
		if (readyToShoot) {
			var bullet = new Bullet();
			bullet.x = enemy.x;
			bullet.y = enemy.y;
			// Direction toward player
			bullet.direction = direction;
			enemyBullets.push(bullet);
			game.addChild(bullet);
			LK.getSound('shoot').play(); // Play shooting sound
		}
	}
}
// Initialize the game
initGame();
:quality(85)/https://cdn.frvr.ai/67f075198a558e287b7fe3d2.png%3F3) 
 anime landscape deep jungle amazon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67f076c58a558e287b7fe3ef.png%3F3) 
 jungle soldier stand shoot the target right direction. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67f077bd8a558e287b7fe403.png%3F3) 
 jungle soldier stand shoot the target right direction. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67f07c978a558e287b7fe44d.png%3F3) 
 jungle grass. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows