/**** 
* Classes
****/ 
// Coin class representing coins for the penguin to pick
var Coin = Container.expand(function () {
	var self = Container.call(this);
	var coinGraphics = self.attachAsset('coin', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -5;
	self.value = 10;
	self.update = function () {
		self.x += self.speed;
		self.y += Math.sin(self.x / 100) * 10; // Add a sine wave movement to the y position
		if (self.x < -100) {
			self.destroy();
		}
	};
});
// HighCoin class representing higher coins for the penguin to pick
var HighCoin = Coin.expand(function () {
	var self = Coin.call(this);
	if (self) {
		self.value = 5;
	}
});
// Level2Obstacle class representing level 2 obstacles on the path
var Level2Obstacle = Container.expand(function () {
	var self = Container.call(this);
	var obstacleGraphics = self.attachAsset('obstacle', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -7; // Increase speed for level 2
	self.update = function () {
		self.x += self.speed;
		if (self.x < -100) {
			self.destroy();
		}
	};
});
// Obstacle class representing obstacles on the path
var Obstacle = Container.expand(function () {
	var self = Container.call(this);
	var obstacleGraphics = self.attachAsset('obstacle', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -5;
	self.update = function () {
		self.x += self.speed;
		if (self.x < -100) {
			self.destroy();
		}
	};
});
//<Assets used in the game will automatically appear here>
// Penguin class representing the player character
var Penguin = Container.expand(function () {
	var self = Container.call(this);
	var penguinGraphics = self.attachAsset('penguin', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5;
	self.jumpHeight = 55;
	self.isJumping = false;
	self.update = function () {
		if (self.isJumping) {
			self.y -= self.speed;
			if (self.y <= self.jumpHeight) {
				self.isJumping = false;
				self.jumpHeight = Math.random() * 200; // Randomize jump height between 0 and 200
			}
		} else if (self.y < 2732 / 2) {
			self.y += self.speed;
		}
	};
	self.jump = function () {
		if (!self.isJumping) {
			self.isJumping = true;
		}
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000080 // Set the background color to navy blue to represent underwater
});
/**** 
* Game Code
****/ 
// Add the ocean as the background
var ocean = game.addChild(LK.getAsset('Ocean', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 2732 / 2
}));
// Set initial ocean wave direction
ocean.waveDirection = 1;
// Initialize game variables
var penguin = game.addChild(new Penguin());
penguin.x = 2048 / 2;
penguin.y = 2732 / 2;
var obstacles = [];
var coins = [];
var score = 0;
var scoreTxt = new Text2('0', {
	size: 100,
	fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var alternate = false;
// Function to handle game updates
game.update = function () {
	// Animate the ocean to give the illusion of underwater waves
	ocean.y += ocean.waveDirection;
	if (ocean.y > 2732 / 2 + 5 || ocean.y < 2732 / 2 - 5) {
		ocean.waveDirection *= -1;
	}
	penguin.update();
	for (var i = obstacles.length - 1; i >= 0; i--) {
		obstacles[i].update();
		if (penguin.intersects(obstacles[i])) {
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
		}
	}
	if (LK.ticks % 60 == 0) {
		var newObstacle = new Obstacle();
		newObstacle.x = 2048;
		newObstacle.y = alternate ? 2732 / 3 : 2732 / 2;
		obstacles.push(newObstacle);
		game.addChild(newObstacle);
		alternate = !alternate;
	}
	// Add level 2 obstacles every 90 ticks
	if (LK.ticks % 90 == 0) {
		var newLevel2Obstacle = new Level2Obstacle();
		newLevel2Obstacle.x = 2048;
		newLevel2Obstacle.y = alternate ? 2732 / 2 : 2732 / 3;
		obstacles.push(newLevel2Obstacle);
		game.addChild(newLevel2Obstacle);
	}
	// Add coins every 90 ticks
	if (LK.ticks % 90 == 0) {
		var newCoin = alternate ? new HighCoin() : new Coin();
		newCoin.x = 2048;
		newCoin.y = alternate ? 2732 / 3 : 2732 / 2; // Position coins near the pingos
		coins.push(newCoin);
		game.addChild(newCoin);
	}
	// Update the score when the penguin picks a coin
	for (var i = coins.length - 1; i >= 0; i--) {
		if (penguin.intersects(coins[i])) {
			score += coins[i].value;
			coins[i].destroy();
			coins.splice(i, 1);
		}
	}
	scoreTxt.setText(score);
};
// Event listener for touch down to make the penguin jump
game.down = function (x, y, obj) {
	penguin.jump();
};
// Change the color of the background once the player hits 50 points
if (score >= 50) {
	game.setBackgroundColor(0x00FFFF); // Change the background color to blue
}
// Increase the speed of the obstacles and the coins once the user collects points worth 100 points
if (score >= 100) {
	for (var i = 0; i < obstacles.length; i++) {
		obstacles[i].speed += 2;
	}
	for (var i = 0; i < coins.length; i++) {
		coins[i].speed += 2;
	}
}
// End the game when the player reaches 500 points
if (score >= 500) {
	LK.showGameOver();
} /**** 
* Classes
****/ 
// Coin class representing coins for the penguin to pick
var Coin = Container.expand(function () {
	var self = Container.call(this);
	var coinGraphics = self.attachAsset('coin', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -5;
	self.value = 10;
	self.update = function () {
		self.x += self.speed;
		self.y += Math.sin(self.x / 100) * 10; // Add a sine wave movement to the y position
		if (self.x < -100) {
			self.destroy();
		}
	};
});
// HighCoin class representing higher coins for the penguin to pick
var HighCoin = Coin.expand(function () {
	var self = Coin.call(this);
	if (self) {
		self.value = 5;
	}
});
// Level2Obstacle class representing level 2 obstacles on the path
var Level2Obstacle = Container.expand(function () {
	var self = Container.call(this);
	var obstacleGraphics = self.attachAsset('obstacle', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -7; // Increase speed for level 2
	self.update = function () {
		self.x += self.speed;
		if (self.x < -100) {
			self.destroy();
		}
	};
});
// Obstacle class representing obstacles on the path
var Obstacle = Container.expand(function () {
	var self = Container.call(this);
	var obstacleGraphics = self.attachAsset('obstacle', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -5;
	self.update = function () {
		self.x += self.speed;
		if (self.x < -100) {
			self.destroy();
		}
	};
});
//<Assets used in the game will automatically appear here>
// Penguin class representing the player character
var Penguin = Container.expand(function () {
	var self = Container.call(this);
	var penguinGraphics = self.attachAsset('penguin', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5;
	self.jumpHeight = 55;
	self.isJumping = false;
	self.update = function () {
		if (self.isJumping) {
			self.y -= self.speed;
			if (self.y <= self.jumpHeight) {
				self.isJumping = false;
				self.jumpHeight = Math.random() * 200; // Randomize jump height between 0 and 200
			}
		} else if (self.y < 2732 / 2) {
			self.y += self.speed;
		}
	};
	self.jump = function () {
		if (!self.isJumping) {
			self.isJumping = true;
		}
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000080 // Set the background color to navy blue to represent underwater
});
/**** 
* Game Code
****/ 
// Add the ocean as the background
var ocean = game.addChild(LK.getAsset('Ocean', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 2732 / 2
}));
// Set initial ocean wave direction
ocean.waveDirection = 1;
// Initialize game variables
var penguin = game.addChild(new Penguin());
penguin.x = 2048 / 2;
penguin.y = 2732 / 2;
var obstacles = [];
var coins = [];
var score = 0;
var scoreTxt = new Text2('0', {
	size: 100,
	fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var alternate = false;
// Function to handle game updates
game.update = function () {
	// Animate the ocean to give the illusion of underwater waves
	ocean.y += ocean.waveDirection;
	if (ocean.y > 2732 / 2 + 5 || ocean.y < 2732 / 2 - 5) {
		ocean.waveDirection *= -1;
	}
	penguin.update();
	for (var i = obstacles.length - 1; i >= 0; i--) {
		obstacles[i].update();
		if (penguin.intersects(obstacles[i])) {
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
		}
	}
	if (LK.ticks % 60 == 0) {
		var newObstacle = new Obstacle();
		newObstacle.x = 2048;
		newObstacle.y = alternate ? 2732 / 3 : 2732 / 2;
		obstacles.push(newObstacle);
		game.addChild(newObstacle);
		alternate = !alternate;
	}
	// Add level 2 obstacles every 90 ticks
	if (LK.ticks % 90 == 0) {
		var newLevel2Obstacle = new Level2Obstacle();
		newLevel2Obstacle.x = 2048;
		newLevel2Obstacle.y = alternate ? 2732 / 2 : 2732 / 3;
		obstacles.push(newLevel2Obstacle);
		game.addChild(newLevel2Obstacle);
	}
	// Add coins every 90 ticks
	if (LK.ticks % 90 == 0) {
		var newCoin = alternate ? new HighCoin() : new Coin();
		newCoin.x = 2048;
		newCoin.y = alternate ? 2732 / 3 : 2732 / 2; // Position coins near the pingos
		coins.push(newCoin);
		game.addChild(newCoin);
	}
	// Update the score when the penguin picks a coin
	for (var i = coins.length - 1; i >= 0; i--) {
		if (penguin.intersects(coins[i])) {
			score += coins[i].value;
			coins[i].destroy();
			coins.splice(i, 1);
		}
	}
	scoreTxt.setText(score);
};
// Event listener for touch down to make the penguin jump
game.down = function (x, y, obj) {
	penguin.jump();
};
// Change the color of the background once the player hits 50 points
if (score >= 50) {
	game.setBackgroundColor(0x00FFFF); // Change the background color to blue
}
// Increase the speed of the obstacles and the coins once the user collects points worth 100 points
if (score >= 100) {
	for (var i = 0; i < obstacles.length; i++) {
		obstacles[i].speed += 2;
	}
	for (var i = 0; i < coins.length; i++) {
		coins[i].speed += 2;
	}
}
// End the game when the player reaches 500 points
if (score >= 500) {
	LK.showGameOver();
}