/**** 
* Classes
****/ 
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5; // Bullet movement speed
	// Update method called every game tick
	self.update = function () {
		self.y += self.speed;
	};
});
// EnemyBullet class representing the enemy's bullets
var EnemyBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5; // Bullet movement speed
	self.direction = 'down'; // Bullet direction
	// Update method called every game tick
	self.update = function () {
		if (self.direction === 'down') {
			self.y += self.speed;
		}
	};
});
var Menu = Container.expand(function () {
	var self = Container.call(this);
	var menuGraphics = self.attachAsset('Cube_bullet_hell_icon', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Create a start button
	var startButton = self.attachAsset('Start_button', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		// Increase size horizontally
		scaleY: 2 // Increase size vertically
	});
	startButton.y = 500; // Position further below the icon
	self.addChild(startButton);
	// Add event listener for the start button
	startButton.down = function () {
		self.visible = false; // Hide the menu
		game.startGame(); // Start the game
	};
});
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
// Player class representing the player character
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 10; // Player movement speed
	self.lives = 3; // Player lives
	// Method to move the player
	self.move = function (x, y) {
		self.x = x;
		self.y = y;
	};
	// Method to shoot a bullet
	self.shoot = function () {
		var bulletUp = new PlayerBullet();
		bulletUp.x = self.x;
		bulletUp.y = self.y;
		bulletUp.direction = 'up';
		game.addChild(bulletUp);
		playerBullets.push(bulletUp);
		var bulletDown = new PlayerBullet();
		bulletDown.x = self.x;
		bulletDown.y = self.y;
		bulletDown.direction = 'down';
		game.addChild(bulletDown);
		playerBullets.push(bulletDown);
		var bulletLeft = new PlayerBullet();
		bulletLeft.x = self.x;
		bulletLeft.y = self.y;
		bulletLeft.direction = 'left';
		game.addChild(bulletLeft);
		playerBullets.push(bulletLeft);
		var bulletRight = new PlayerBullet();
		bulletRight.x = self.x;
		bulletRight.y = self.y;
		bulletRight.direction = 'right';
		game.addChild(bulletRight);
		playerBullets.push(bulletRight);
		var bulletUpLeft = new PlayerBullet();
		bulletUpLeft.x = self.x;
		bulletUpLeft.y = self.y;
		bulletUpLeft.direction = 'up-left';
		game.addChild(bulletUpLeft);
		playerBullets.push(bulletUpLeft);
		var bulletUpRight = new PlayerBullet();
		bulletUpRight.x = self.x;
		bulletUpRight.y = self.y;
		bulletUpRight.direction = 'up-right';
		game.addChild(bulletUpRight);
		playerBullets.push(bulletUpRight);
		var bulletDownLeft = new PlayerBullet();
		bulletDownLeft.x = self.x;
		bulletDownLeft.y = self.y;
		bulletDownLeft.direction = 'down-left';
		game.addChild(bulletDownLeft);
		playerBullets.push(bulletDownLeft);
		var bulletDownRight = new PlayerBullet();
		bulletDownRight.x = self.x;
		bulletDownRight.y = self.y;
		bulletDownRight.direction = 'down-right';
		game.addChild(bulletDownRight);
		playerBullets.push(bulletDownRight);
	};
});
// PlayerBullet class representing the player's bullets
var PlayerBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -5; // Bullet movement speed
	self.direction = 'up'; // Bullet direction
	// Update method called every game tick
	self.update = function () {
		if (self.direction === 'up') {
			self.y += self.speed;
		} else if (self.direction === 'down') {
			self.y -= self.speed;
		} else if (self.direction === 'left') {
			self.x -= self.speed;
		} else if (self.direction === 'right') {
			self.x += self.speed;
		} else if (self.direction === 'up-left') {
			self.y += self.speed;
			self.x -= self.speed;
		} else if (self.direction === 'up-right') {
			self.y += self.speed;
			self.x += self.speed;
		} else if (self.direction === 'down-left') {
			self.y -= self.speed;
			self.x -= self.speed;
		} else if (self.direction === 'down-right') {
			self.y -= self.speed;
			self.x += self.speed;
		}
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000 //Init game with black background
});
/**** 
* Game Code
****/ 
// Function to update heart icons based on player lives
function updateHearts() {
	// Clear existing hearts
	LK.gui.topRight.removeChildren();
	// Add heart icons based on the number of lives
	for (var i = 0; i < player.lives; i++) {
		var heartIcon = LK.getAsset('Heart_icon', {
			anchorX: 0.5,
			anchorY: 0.5
		});
		heartIcon.x = -50 * i; // Position hearts with some spacing
		LK.gui.topRight.addChild(heartIcon);
	}
}
var menu = new Menu();
menu.x = 2048 / 2;
menu.y = 2732 / 2;
game.addChild(menu);
// Define player in the global scope
var player;
// Function to start the game
game.startGame = function () {
	// Display "Ready? Set Go!" sequence
	var readyText = new Text2('Ready?', {
		size: 200,
		fill: 0xFFFFFF
	});
	readyText.anchor.set(0.5, 0.5);
	readyText.x = 2048 / 2;
	readyText.y = 2732 / 2;
	game.addChild(readyText);
	LK.getSound('Ready').play(); // Moved here to play immediately
	LK.setTimeout(function () {
		readyText.setText('Set');
		LK.getSound('Beep').play();
		LK.setTimeout(function () {
			readyText.setText('Go!');
			LK.getSound('Go').play();
			LK.setTimeout(function () {
				game.removeChild(readyText);
				// Initialize player
				player = new Player();
				player.x = 2048 / 2;
				player.y = 2732 - 200;
				game.addChild(player);
				updateHearts(); // Display hearts when the game starts
			}, 1000);
		}, 1000);
	}, 1000);
};
// Variable to track player's score
var playerScore = 0;
var scoreTxt = new Text2('Score: 0', {
	size: 100,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var bullets = [];
var playerBullets = [];
var enemyBullets = [];
// Function to spawn bullets
function spawnBullet() {
	var bullet = new EnemyBullet();
	bullet.x = Math.random() * (2048 - 400) + 200;
	bullet.y = -50; // Start above the screen
	enemyBullets.push(bullet);
	game.addChild(bullet);
}
// Game update function
game.update = function () {
	// Update bullets
	for (var i = bullets.length - 1; i >= 0; i--) {
		var bullet = bullets[i];
		bullet.update();
		// Check if bullet is off-screen
		if (bullet.y > 2732) {
			bullet.destroy();
			bullets.splice(i, 1);
			playerScore += 1; // Increase score by 1
			scoreTxt.setText('Score: ' + playerScore); // Update score display
		}
		// Check for collision with player
		if (bullet.intersects(player)) {
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
		}
	}
	// Spawn a new bullet every 30 ticks
	// Update player bullets
	for (var i = playerBullets.length - 1; i >= 0; i--) {
		var bullet = playerBullets[i];
		bullet.update();
		// Check if bullet is off-screen
		if (bullet.y < 0 || bullet.y > 2732 || bullet.x < 0 || bullet.x > 2048) {
			bullet.destroy();
			playerBullets.splice(i, 1);
		}
	}
	// Update enemy bullets
	for (var i = enemyBullets.length - 1; i >= 0; i--) {
		var bullet = enemyBullets[i];
		bullet.update();
		// Check if bullet is off-screen
		if (bullet.y > 2732) {
			if (playerScore >= 100 && playerScore < 200) {
				bullet.speed += 2; // Increase bullet speed
			} else if (playerScore >= 200) {
				bullet.speed += 5; // Double bullet speed after 200 points
			}
			bullet.destroy();
			enemyBullets.splice(i, 1);
			if (player) {
				// Ensure player has spawned
				playerScore += 1; // Increase score by 1
				scoreTxt.setText('Score: ' + playerScore); // Update score display
				if (playerScore === 100) {
					var speedUpText = new Text2('Bullets Speed Up!', {
						size: 150,
						fill: 0xFF0000
					});
					speedUpText.anchor.set(0.5, 0.5);
					speedUpText.x = 2048 / 2;
					speedUpText.y = 2732 / 2;
					game.addChild(speedUpText);
					LK.setTimeout(function () {
						game.removeChild(speedUpText);
					}, 2000);
				}
			}
		}
		// Check for collision with player
		if (bullet.intersects(player)) {
			LK.effects.flashScreen(0xff0000, 1000);
			player.lives -= 1;
			LK.getSound('Hit').play();
			bullet.destroy(); // Remove the bullet upon collision
			enemyBullets.splice(i, 1); // Remove bullet from array
			updateHearts(); // Update hearts when player loses a life
			if (player.lives <= 0) {
				LK.showGameOver();
			}
		}
	}
	// Spawn a new enemy bullet every 10 ticks
	if (LK.ticks % 10 === 0) {
		spawnBullet();
	}
};
// Handle player movement
game.move = function (x, y, obj) {
	if (player) {
		player.move(x, y);
		// Check if player is touching the screen border
		var touchingBorder = player.x <= 0 || player.x >= 2048 || player.y <= 0 || player.y >= 2732;
		// If player is touching the border, reset score
		if (touchingBorder) {
			playerScore = 0;
			scoreTxt.setText('Score: ' + playerScore);
		}
	}
};
game.down = function (x, y, obj) {
	// player.shoot();
}; /**** 
* Classes
****/ 
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5; // Bullet movement speed
	// Update method called every game tick
	self.update = function () {
		self.y += self.speed;
	};
});
// EnemyBullet class representing the enemy's bullets
var EnemyBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5; // Bullet movement speed
	self.direction = 'down'; // Bullet direction
	// Update method called every game tick
	self.update = function () {
		if (self.direction === 'down') {
			self.y += self.speed;
		}
	};
});
var Menu = Container.expand(function () {
	var self = Container.call(this);
	var menuGraphics = self.attachAsset('Cube_bullet_hell_icon', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Create a start button
	var startButton = self.attachAsset('Start_button', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		// Increase size horizontally
		scaleY: 2 // Increase size vertically
	});
	startButton.y = 500; // Position further below the icon
	self.addChild(startButton);
	// Add event listener for the start button
	startButton.down = function () {
		self.visible = false; // Hide the menu
		game.startGame(); // Start the game
	};
});
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
// Player class representing the player character
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 10; // Player movement speed
	self.lives = 3; // Player lives
	// Method to move the player
	self.move = function (x, y) {
		self.x = x;
		self.y = y;
	};
	// Method to shoot a bullet
	self.shoot = function () {
		var bulletUp = new PlayerBullet();
		bulletUp.x = self.x;
		bulletUp.y = self.y;
		bulletUp.direction = 'up';
		game.addChild(bulletUp);
		playerBullets.push(bulletUp);
		var bulletDown = new PlayerBullet();
		bulletDown.x = self.x;
		bulletDown.y = self.y;
		bulletDown.direction = 'down';
		game.addChild(bulletDown);
		playerBullets.push(bulletDown);
		var bulletLeft = new PlayerBullet();
		bulletLeft.x = self.x;
		bulletLeft.y = self.y;
		bulletLeft.direction = 'left';
		game.addChild(bulletLeft);
		playerBullets.push(bulletLeft);
		var bulletRight = new PlayerBullet();
		bulletRight.x = self.x;
		bulletRight.y = self.y;
		bulletRight.direction = 'right';
		game.addChild(bulletRight);
		playerBullets.push(bulletRight);
		var bulletUpLeft = new PlayerBullet();
		bulletUpLeft.x = self.x;
		bulletUpLeft.y = self.y;
		bulletUpLeft.direction = 'up-left';
		game.addChild(bulletUpLeft);
		playerBullets.push(bulletUpLeft);
		var bulletUpRight = new PlayerBullet();
		bulletUpRight.x = self.x;
		bulletUpRight.y = self.y;
		bulletUpRight.direction = 'up-right';
		game.addChild(bulletUpRight);
		playerBullets.push(bulletUpRight);
		var bulletDownLeft = new PlayerBullet();
		bulletDownLeft.x = self.x;
		bulletDownLeft.y = self.y;
		bulletDownLeft.direction = 'down-left';
		game.addChild(bulletDownLeft);
		playerBullets.push(bulletDownLeft);
		var bulletDownRight = new PlayerBullet();
		bulletDownRight.x = self.x;
		bulletDownRight.y = self.y;
		bulletDownRight.direction = 'down-right';
		game.addChild(bulletDownRight);
		playerBullets.push(bulletDownRight);
	};
});
// PlayerBullet class representing the player's bullets
var PlayerBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -5; // Bullet movement speed
	self.direction = 'up'; // Bullet direction
	// Update method called every game tick
	self.update = function () {
		if (self.direction === 'up') {
			self.y += self.speed;
		} else if (self.direction === 'down') {
			self.y -= self.speed;
		} else if (self.direction === 'left') {
			self.x -= self.speed;
		} else if (self.direction === 'right') {
			self.x += self.speed;
		} else if (self.direction === 'up-left') {
			self.y += self.speed;
			self.x -= self.speed;
		} else if (self.direction === 'up-right') {
			self.y += self.speed;
			self.x += self.speed;
		} else if (self.direction === 'down-left') {
			self.y -= self.speed;
			self.x -= self.speed;
		} else if (self.direction === 'down-right') {
			self.y -= self.speed;
			self.x += self.speed;
		}
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000 //Init game with black background
});
/**** 
* Game Code
****/ 
// Function to update heart icons based on player lives
function updateHearts() {
	// Clear existing hearts
	LK.gui.topRight.removeChildren();
	// Add heart icons based on the number of lives
	for (var i = 0; i < player.lives; i++) {
		var heartIcon = LK.getAsset('Heart_icon', {
			anchorX: 0.5,
			anchorY: 0.5
		});
		heartIcon.x = -50 * i; // Position hearts with some spacing
		LK.gui.topRight.addChild(heartIcon);
	}
}
var menu = new Menu();
menu.x = 2048 / 2;
menu.y = 2732 / 2;
game.addChild(menu);
// Define player in the global scope
var player;
// Function to start the game
game.startGame = function () {
	// Display "Ready? Set Go!" sequence
	var readyText = new Text2('Ready?', {
		size: 200,
		fill: 0xFFFFFF
	});
	readyText.anchor.set(0.5, 0.5);
	readyText.x = 2048 / 2;
	readyText.y = 2732 / 2;
	game.addChild(readyText);
	LK.getSound('Ready').play(); // Moved here to play immediately
	LK.setTimeout(function () {
		readyText.setText('Set');
		LK.getSound('Beep').play();
		LK.setTimeout(function () {
			readyText.setText('Go!');
			LK.getSound('Go').play();
			LK.setTimeout(function () {
				game.removeChild(readyText);
				// Initialize player
				player = new Player();
				player.x = 2048 / 2;
				player.y = 2732 - 200;
				game.addChild(player);
				updateHearts(); // Display hearts when the game starts
			}, 1000);
		}, 1000);
	}, 1000);
};
// Variable to track player's score
var playerScore = 0;
var scoreTxt = new Text2('Score: 0', {
	size: 100,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var bullets = [];
var playerBullets = [];
var enemyBullets = [];
// Function to spawn bullets
function spawnBullet() {
	var bullet = new EnemyBullet();
	bullet.x = Math.random() * (2048 - 400) + 200;
	bullet.y = -50; // Start above the screen
	enemyBullets.push(bullet);
	game.addChild(bullet);
}
// Game update function
game.update = function () {
	// Update bullets
	for (var i = bullets.length - 1; i >= 0; i--) {
		var bullet = bullets[i];
		bullet.update();
		// Check if bullet is off-screen
		if (bullet.y > 2732) {
			bullet.destroy();
			bullets.splice(i, 1);
			playerScore += 1; // Increase score by 1
			scoreTxt.setText('Score: ' + playerScore); // Update score display
		}
		// Check for collision with player
		if (bullet.intersects(player)) {
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
		}
	}
	// Spawn a new bullet every 30 ticks
	// Update player bullets
	for (var i = playerBullets.length - 1; i >= 0; i--) {
		var bullet = playerBullets[i];
		bullet.update();
		// Check if bullet is off-screen
		if (bullet.y < 0 || bullet.y > 2732 || bullet.x < 0 || bullet.x > 2048) {
			bullet.destroy();
			playerBullets.splice(i, 1);
		}
	}
	// Update enemy bullets
	for (var i = enemyBullets.length - 1; i >= 0; i--) {
		var bullet = enemyBullets[i];
		bullet.update();
		// Check if bullet is off-screen
		if (bullet.y > 2732) {
			if (playerScore >= 100 && playerScore < 200) {
				bullet.speed += 2; // Increase bullet speed
			} else if (playerScore >= 200) {
				bullet.speed += 5; // Double bullet speed after 200 points
			}
			bullet.destroy();
			enemyBullets.splice(i, 1);
			if (player) {
				// Ensure player has spawned
				playerScore += 1; // Increase score by 1
				scoreTxt.setText('Score: ' + playerScore); // Update score display
				if (playerScore === 100) {
					var speedUpText = new Text2('Bullets Speed Up!', {
						size: 150,
						fill: 0xFF0000
					});
					speedUpText.anchor.set(0.5, 0.5);
					speedUpText.x = 2048 / 2;
					speedUpText.y = 2732 / 2;
					game.addChild(speedUpText);
					LK.setTimeout(function () {
						game.removeChild(speedUpText);
					}, 2000);
				}
			}
		}
		// Check for collision with player
		if (bullet.intersects(player)) {
			LK.effects.flashScreen(0xff0000, 1000);
			player.lives -= 1;
			LK.getSound('Hit').play();
			bullet.destroy(); // Remove the bullet upon collision
			enemyBullets.splice(i, 1); // Remove bullet from array
			updateHearts(); // Update hearts when player loses a life
			if (player.lives <= 0) {
				LK.showGameOver();
			}
		}
	}
	// Spawn a new enemy bullet every 10 ticks
	if (LK.ticks % 10 === 0) {
		spawnBullet();
	}
};
// Handle player movement
game.move = function (x, y, obj) {
	if (player) {
		player.move(x, y);
		// Check if player is touching the screen border
		var touchingBorder = player.x <= 0 || player.x >= 2048 || player.y <= 0 || player.y >= 2732;
		// If player is touching the border, reset score
		if (touchingBorder) {
			playerScore = 0;
			scoreTxt.setText('Score: ' + playerScore);
		}
	}
};
game.down = function (x, y, obj) {
	// player.shoot();
};
:quality(85)/https://cdn.frvr.ai/679a9a289fac75cf14173363.png%3F3) 
 Cube. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/679a9c129fac75cf1417337c.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/679bf1df6d4a9a00c2ea7fae.png%3F3) 
 Cube bullet hell icon. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
:quality(85)/https://cdn.frvr.ai/679bf2906d4a9a00c2ea7fc4.png%3F3) 
 Start_button. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/679d1195f1bec1b24bcb5536.png%3F3) 
 Heart_icon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows