/**** 
* Classes
****/
// HeroBullet class representing the hero's projectiles
var HeroBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.createAsset('heroBullet', 'Hero Bullet', 0.5, 0.5);
	self.speed = -10;
	self.move = function () {
		if (!hero.isTimestopped || self.timestopActive) {
			self.y += self.speed;
			if (self.y < -self.height) {
				self.destroy();
			}
		}
	};
	self.timestopActive = false;
	self.activateTimestop = function () {
		self.timestopActive = true;
		LK.setTimeout(function () {
			self.timestopActive = false;
		}, 100);
	};
	self.isOffScreen = function () {
		return self.y < -self.height;
	};
});
// EnemyBullet class representing the enemy's projectiles
var EnemyBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet', 0.5, 0.5);
	self.speed = 5;
	self.move = function () {
		if (!hero.isTimestopped) {
			self.y += self.speed;
			if (self.y > game.height + self.height) {
				self.destroy();
			}
		}
	};
	self.isOffScreen = function () {
		return self.y > game.height + self.height;
	};
});
// Hero class representing the main character
var Hero = Container.expand(function () {
	var self = Container.call(this);
	self.shoot = function () {
		var bullets = [];
		for (var i = -1; i <= 1; i++) {
			var bullet = new HeroBullet();
			bullet.x = self.x + i * 20;
			bullet.y = self.y - self.height / 2;
			game.addChild(bullet);
			bullets.push(bullet);
		}
		return bullets;
	};
	var heroGraphics = self.createAsset('jojoHero', 'Main Hero', 0.5, 0.5);
	self.speed = 5;
	self.isTimestopped = false;
	self.timestopDuration = 3000; // Initial timestop duration
	self.timestopCooldown = 5000; // Cooldown duration in milliseconds
	self.timestopAvailable = true; // Flag to check if timestop is available
	self.move = function (direction) {
		if (self.isTimestopped) {
			return;
		}
		if (direction === 'left') {
			self.x -= self.speed;
		}
		if (direction === 'right') {
			self.x += self.speed;
		}
		if (direction === 'up') {
			self.y -= self.speed;
		}
		if (direction === 'down') {
			self.y += self.speed;
		}
	};
	self.timestop = function () {
		if (self.timestopAvailable) {
			self.isTimestopped = true;
			self.timestopAvailable = false;
			heroBullets.forEach(function (bullet) {
				bullet.activateTimestop();
			});
			self.timestopDuration += 100; // Increase duration by 0.1 seconds
			timestopDurationTxt.setText(self.timestopDuration.toString()); // Update the timestop duration display
			LK.setTimeout(function () {
				self.isTimestopped = false;
			}, self.timestopDuration);
			LK.setTimeout(function () {
				self.timestopAvailable = true;
			}, self.timestopCooldown);
		}
	};
});
// ShopButton class representing the button to open the shop
// Enemy class representing the adversaries
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.createAsset('jojoEnemy', 'Enemy Character', 0.5, 0.5);
	self.speed = 2;
	self.move = function () {
		if (hero.isTimestopped) {
			return;
		}
		self.y += self.speed;
	};
});
/**** 
* Initialize Game
****/
var game = new LK.Game({
	backgroundColor: 0x000000,
	// Init game with black background
	paused: false,
	enemySpawnRate: 120 // Initial spawn rate is now every 2 seconds (120 frames)
});
/**** 
* Game Code
****/
// Instantiate shop button and add it to the GUI
// Initialize hero
var hero = game.addChild(new Hero());
hero.x = game.width / 2;
hero.y = game.height - 100;
// Initialize enemies array
var enemies = [];
// Initialize hero bullets array
var heroBullets = [];
// Initialize score and currency
var score = 0;
var currency = 0; // New currency variable
var scoreTxt = new Text2(score.toString(), {
	size: 150,
	fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Add a new Text2 object to display the current timestop duration
var timestopDurationTxt = new Text2(hero.timestopDuration.toString(), {
	size: 150,
	fill: "#ffffff"
});
timestopDurationTxt.anchor.set(0.5, 0);
timestopDurationTxt.y = scoreTxt.height; // Position below the score
LK.gui.top.addChild(timestopDurationTxt);
// Add a new Text2 object to display the current currency
var currencyTxt = new Text2(currency.toString(), {
	size: 150,
	fill: "#ffffff"
});
currencyTxt.anchor.set(0.5, 0);
currencyTxt.y = timestopDurationTxt.y + timestopDurationTxt.height; // Position below the timestop duration
LK.gui.top.addChild(currencyTxt);
// Function to update score
function updateScore(value) {
	score += value;
	scoreTxt.setText(score.toString());
}
// Function to spawn enemies
function spawnEnemy() {
	var enemy = new Enemy();
	enemy.x = Math.random() * (game.width - enemy.width) + enemy.width / 2;
	enemy.y = -enemy.height;
	enemies.push(enemy);
	game.addChild(enemy);
}
// Event listener for 'down' events on the game area to allow the hero to shoot on left click
game.on('down', function (obj) {
	if (obj.event.button === 0 && !obj.event.ctrlKey && !obj.event.altKey && !game.paused && !hero.isTimestopped) {
		// Check if the left mouse button was clicked without any modifier keys and the game is not paused and hero is not timestopped
		var bullets = hero.shoot();
		heroBullets = heroBullets.concat(bullets);
	}
});
// Event listener for right-click events on the game area to trigger timestop
game.on('rightdown', function (obj) {
	hero.timestop();
});
// Event listener for the space key to toggle game pause
game.on('keydown', function (obj) {
	if (obj.event.key === ' ') {
		game.paused = !game.paused;
	}
});
// Event listener for touch move events on the game area
game.on('move', function (obj) {
	var pos = obj.event.getLocalPosition(game);
	hero.x = pos.x;
	hero.y = pos.y;
});
// Event listener for touch 'down' events to allow the hero to shoot
game.on('down', function (obj) {
	if (!game.paused && !hero.isTimestopped) {
		var bullets = hero.shoot();
		heroBullets = heroBullets.concat(bullets);
	}
});
// Main game loop
LK.on('tick', function () {
	if (game.paused) {
		return;
	}
	// Move hero based on touch input (handled by event listeners)
	// Move enemies
	for (var i = enemies.length - 1; i >= 0; i--) {
		enemies[i].move();
		// Check for collision with hero
		if (enemies[i].intersects(hero)) {
			LK.effects.flashScreen(0xff0000, 500);
			LK.showGameOver();
			return;
		}
		// Remove enemies that are off-screen
		if (enemies[i].y > game.height + enemies[i].height) {
			enemies[i].destroy();
			enemies.splice(i, 1);
			updateScore(-1);
		}
	}
	// Move hero bullets
	for (var b = heroBullets.length - 1; b >= 0; b--) {
		heroBullets[b].move();
		// Check for collision with enemies
		for (var e = enemies.length - 1; e >= 0; e--) {
			if (heroBullets[b].intersects(enemies[e])) {
				enemies[e].destroy();
				enemies.splice(e, 1);
				updateScore(1);
			}
		}
		// Remove bullets that are off-screen
		if (heroBullets[b].isOffScreen()) {
			heroBullets[b].destroy();
			heroBullets.splice(b, 1);
		}
	}
	// Spawn enemies at regular intervals
	if (LK.ticks % (60 * 2) === 0) {
		spawnEnemy();
	}
}); /**** 
* Classes
****/
// HeroBullet class representing the hero's projectiles
var HeroBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.createAsset('heroBullet', 'Hero Bullet', 0.5, 0.5);
	self.speed = -10;
	self.move = function () {
		if (!hero.isTimestopped || self.timestopActive) {
			self.y += self.speed;
			if (self.y < -self.height) {
				self.destroy();
			}
		}
	};
	self.timestopActive = false;
	self.activateTimestop = function () {
		self.timestopActive = true;
		LK.setTimeout(function () {
			self.timestopActive = false;
		}, 100);
	};
	self.isOffScreen = function () {
		return self.y < -self.height;
	};
});
// EnemyBullet class representing the enemy's projectiles
var EnemyBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet', 0.5, 0.5);
	self.speed = 5;
	self.move = function () {
		if (!hero.isTimestopped) {
			self.y += self.speed;
			if (self.y > game.height + self.height) {
				self.destroy();
			}
		}
	};
	self.isOffScreen = function () {
		return self.y > game.height + self.height;
	};
});
// Hero class representing the main character
var Hero = Container.expand(function () {
	var self = Container.call(this);
	self.shoot = function () {
		var bullets = [];
		for (var i = -1; i <= 1; i++) {
			var bullet = new HeroBullet();
			bullet.x = self.x + i * 20;
			bullet.y = self.y - self.height / 2;
			game.addChild(bullet);
			bullets.push(bullet);
		}
		return bullets;
	};
	var heroGraphics = self.createAsset('jojoHero', 'Main Hero', 0.5, 0.5);
	self.speed = 5;
	self.isTimestopped = false;
	self.timestopDuration = 3000; // Initial timestop duration
	self.timestopCooldown = 5000; // Cooldown duration in milliseconds
	self.timestopAvailable = true; // Flag to check if timestop is available
	self.move = function (direction) {
		if (self.isTimestopped) {
			return;
		}
		if (direction === 'left') {
			self.x -= self.speed;
		}
		if (direction === 'right') {
			self.x += self.speed;
		}
		if (direction === 'up') {
			self.y -= self.speed;
		}
		if (direction === 'down') {
			self.y += self.speed;
		}
	};
	self.timestop = function () {
		if (self.timestopAvailable) {
			self.isTimestopped = true;
			self.timestopAvailable = false;
			heroBullets.forEach(function (bullet) {
				bullet.activateTimestop();
			});
			self.timestopDuration += 100; // Increase duration by 0.1 seconds
			timestopDurationTxt.setText(self.timestopDuration.toString()); // Update the timestop duration display
			LK.setTimeout(function () {
				self.isTimestopped = false;
			}, self.timestopDuration);
			LK.setTimeout(function () {
				self.timestopAvailable = true;
			}, self.timestopCooldown);
		}
	};
});
// ShopButton class representing the button to open the shop
// Enemy class representing the adversaries
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.createAsset('jojoEnemy', 'Enemy Character', 0.5, 0.5);
	self.speed = 2;
	self.move = function () {
		if (hero.isTimestopped) {
			return;
		}
		self.y += self.speed;
	};
});
/**** 
* Initialize Game
****/
var game = new LK.Game({
	backgroundColor: 0x000000,
	// Init game with black background
	paused: false,
	enemySpawnRate: 120 // Initial spawn rate is now every 2 seconds (120 frames)
});
/**** 
* Game Code
****/
// Instantiate shop button and add it to the GUI
// Initialize hero
var hero = game.addChild(new Hero());
hero.x = game.width / 2;
hero.y = game.height - 100;
// Initialize enemies array
var enemies = [];
// Initialize hero bullets array
var heroBullets = [];
// Initialize score and currency
var score = 0;
var currency = 0; // New currency variable
var scoreTxt = new Text2(score.toString(), {
	size: 150,
	fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Add a new Text2 object to display the current timestop duration
var timestopDurationTxt = new Text2(hero.timestopDuration.toString(), {
	size: 150,
	fill: "#ffffff"
});
timestopDurationTxt.anchor.set(0.5, 0);
timestopDurationTxt.y = scoreTxt.height; // Position below the score
LK.gui.top.addChild(timestopDurationTxt);
// Add a new Text2 object to display the current currency
var currencyTxt = new Text2(currency.toString(), {
	size: 150,
	fill: "#ffffff"
});
currencyTxt.anchor.set(0.5, 0);
currencyTxt.y = timestopDurationTxt.y + timestopDurationTxt.height; // Position below the timestop duration
LK.gui.top.addChild(currencyTxt);
// Function to update score
function updateScore(value) {
	score += value;
	scoreTxt.setText(score.toString());
}
// Function to spawn enemies
function spawnEnemy() {
	var enemy = new Enemy();
	enemy.x = Math.random() * (game.width - enemy.width) + enemy.width / 2;
	enemy.y = -enemy.height;
	enemies.push(enemy);
	game.addChild(enemy);
}
// Event listener for 'down' events on the game area to allow the hero to shoot on left click
game.on('down', function (obj) {
	if (obj.event.button === 0 && !obj.event.ctrlKey && !obj.event.altKey && !game.paused && !hero.isTimestopped) {
		// Check if the left mouse button was clicked without any modifier keys and the game is not paused and hero is not timestopped
		var bullets = hero.shoot();
		heroBullets = heroBullets.concat(bullets);
	}
});
// Event listener for right-click events on the game area to trigger timestop
game.on('rightdown', function (obj) {
	hero.timestop();
});
// Event listener for the space key to toggle game pause
game.on('keydown', function (obj) {
	if (obj.event.key === ' ') {
		game.paused = !game.paused;
	}
});
// Event listener for touch move events on the game area
game.on('move', function (obj) {
	var pos = obj.event.getLocalPosition(game);
	hero.x = pos.x;
	hero.y = pos.y;
});
// Event listener for touch 'down' events to allow the hero to shoot
game.on('down', function (obj) {
	if (!game.paused && !hero.isTimestopped) {
		var bullets = hero.shoot();
		heroBullets = heroBullets.concat(bullets);
	}
});
// Main game loop
LK.on('tick', function () {
	if (game.paused) {
		return;
	}
	// Move hero based on touch input (handled by event listeners)
	// Move enemies
	for (var i = enemies.length - 1; i >= 0; i--) {
		enemies[i].move();
		// Check for collision with hero
		if (enemies[i].intersects(hero)) {
			LK.effects.flashScreen(0xff0000, 500);
			LK.showGameOver();
			return;
		}
		// Remove enemies that are off-screen
		if (enemies[i].y > game.height + enemies[i].height) {
			enemies[i].destroy();
			enemies.splice(i, 1);
			updateScore(-1);
		}
	}
	// Move hero bullets
	for (var b = heroBullets.length - 1; b >= 0; b--) {
		heroBullets[b].move();
		// Check for collision with enemies
		for (var e = enemies.length - 1; e >= 0; e--) {
			if (heroBullets[b].intersects(enemies[e])) {
				enemies[e].destroy();
				enemies.splice(e, 1);
				updateScore(1);
			}
		}
		// Remove bullets that are off-screen
		if (heroBullets[b].isOffScreen()) {
			heroBullets[b].destroy();
			heroBullets.splice(b, 1);
		}
	}
	// Spawn enemies at regular intervals
	if (LK.ticks % (60 * 2) === 0) {
		spawnEnemy();
	}
});