/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var GasTank = Container.expand(function () {
	var self = Container.call(this);
	var tankGraphics = self.attachAsset('gasTank', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.gridX = 0;
	self.gridY = 0;
	self.collected = false;
	self.collect = function () {
		if (!self.collected) {
			self.collected = true;
			tween(self, {
				alpha: 0,
				scaleX: 1.5,
				scaleY: 1.5
			}, {
				duration: 300,
				onFinish: function onFinish() {
					self.visible = false;
				}
			});
			LK.getSound('collect').play();
			return true;
		}
		return false;
	};
	self.setPosition = function (x, y) {
		self.gridX = x;
		self.gridY = y;
		self.x = GRID_OFFSET_X + x * CELL_SIZE + CELL_SIZE / 2;
		self.y = GRID_OFFSET_Y + y * CELL_SIZE + CELL_SIZE / 2;
	};
	return self;
});
var GridCell = Container.expand(function () {
	var self = Container.call(this);
	var cellGraphics = self.attachAsset('gridCell', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 0.3
	});
	self.gridX = 0;
	self.gridY = 0;
	self.isEmpty = true;
	self.highlight = function (intensity) {
		tween(cellGraphics, {
			alpha: intensity
		}, {
			duration: 200
		});
	};
	self.resetHighlight = function () {
		tween(cellGraphics, {
			alpha: 0.3
		}, {
			duration: 200
		});
	};
	return self;
});
var HidingSpot = Container.expand(function () {
	var self = Container.call(this);
	var spotGraphics = self.attachAsset('gridCell', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 0.1,
		tint: 0x0000FF
	});
	self.gridX = 0;
	self.gridY = 0;
	self.highlight = function () {
		tween(spotGraphics, {
			alpha: 0.5,
			tint: 0x00AAFF
		}, {
			duration: 200
		});
	};
	self.resetHighlight = function () {
		tween(spotGraphics, {
			alpha: 0.1,
			tint: 0x0000FF
		}, {
			duration: 200
		});
	};
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.gridX = 0;
	self.gridY = 0;
	self.moveTo = function (x, y) {
		self.gridX = x;
		self.gridY = y;
		// Calculate actual screen position based on grid
		var targetX = GRID_OFFSET_X + x * CELL_SIZE + CELL_SIZE / 2;
		var targetY = GRID_OFFSET_Y + y * CELL_SIZE + CELL_SIZE / 2;
		tween(self, {
			x: targetX,
			y: targetY
		}, {
			duration: 200,
			easing: tween.easeOut,
			onFinish: function onFinish() {
				LK.getSound('move').play();
			}
		});
	};
	return self;
});
var Shark = Container.expand(function () {
	var self = Container.call(this);
	var sharkGraphics = self.attachAsset('shark', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.gridX = 9;
	self.gridY = 9;
	self.moveTo = function (x, y) {
		self.gridX = x;
		self.gridY = y;
		// Calculate actual screen position based on grid
		var targetX = GRID_OFFSET_X + x * CELL_SIZE + CELL_SIZE / 2;
		var targetY = GRID_OFFSET_Y + y * CELL_SIZE + CELL_SIZE / 2;
		tween(self, {
			x: targetX,
			y: targetY
		}, {
			duration: 300,
			easing: tween.bounceOut
		});
	};
	return self;
});
var Shark2 = Container.expand(function () {
	var self = Container.call(this);
	var sharkGraphics = self.attachAsset('shark', {
		anchorX: 0.5,
		anchorY: 0.5,
		tint: 0x0000FF // Blue tint to distinguish it
	});
	self.gridX = 0;
	self.gridY = 9;
	self.moveTo = function (x, y) {
		self.gridX = x;
		self.gridY = y;
		// Calculate actual screen position based on grid
		var targetX = GRID_OFFSET_X + x * CELL_SIZE + CELL_SIZE / 2;
		var targetY = GRID_OFFSET_Y + y * CELL_SIZE + CELL_SIZE / 2;
		tween(self, {
			x: targetX,
			y: targetY
		}, {
			duration: 300,
			easing: tween.bounceOut
		});
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000
});
/**** 
* Game Code
****/ 
// Constants
var GRID_SIZE = 10;
var CELL_SIZE = 204; // 2048 / 10 ~= 204
var GRID_OFFSET_X = (2048 - GRID_SIZE * CELL_SIZE) / 2;
var GRID_OFFSET_Y = (2732 - GRID_SIZE * CELL_SIZE) / 2;
var TOTAL_GAS_TANKS = 10;
// Game state variables
var grid = [];
var gridContainer = new Container();
var player;
var shark;
var shark2;
var gasTanks = [];
var collectedTanks = 0;
var gameActive = true;
var turnCount = 0;
var playerMoved = false;
var sharkHidden = false;
var shark2Hidden = false;
var sharkDisappearTurns = 0;
var shark2DisappearTurns = 0;
var sharkLastX = 0;
var sharkLastY = 0;
var shark2LastX = 0;
var shark2LastY = 0;
var hidingSpots = [];
var playerHiding = false;
var hideButtonActive = false;
var currentLevel = 1; // Start at level 1
// UI elements
var statusText = new Text2('Find the gas tanks!', {
	size: 50,
	fill: 0xFFFFFF
});
var scoreText = new Text2('Gas Tanks: 0/' + TOTAL_GAS_TANKS, {
	size: 50,
	fill: 0xFFFFFF
});
var warningText = new Text2('', {
	size: 60,
	fill: 0xFF0000
});
// Initialize grid
function initGrid() {
	var gridBackground = LK.getAsset('gridOutline', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 2048 / 2,
		y: 2732 / 2,
		width: CELL_SIZE * GRID_SIZE,
		height: CELL_SIZE * GRID_SIZE,
		alpha: 0.2
	});
	game.addChild(gridBackground);
	game.addChild(gridContainer);
	for (var y = 0; y < GRID_SIZE; y++) {
		grid[y] = [];
		for (var x = 0; x < GRID_SIZE; x++) {
			var cell = new GridCell();
			cell.x = GRID_OFFSET_X + x * CELL_SIZE + CELL_SIZE / 2;
			cell.y = GRID_OFFSET_Y + y * CELL_SIZE + CELL_SIZE / 2;
			cell.gridX = x;
			cell.gridY = y;
			gridContainer.addChild(cell);
			grid[y][x] = cell;
			// Cell clicks will be handled by game.down
			cell.down = function (x, y, obj) {
				// Let the game handle this via global click detection
			};
		}
	}
}
// Initialize player
function initPlayer() {
	player = new Player();
	player.gridX = 0;
	player.gridY = 0;
	player.x = GRID_OFFSET_X + player.gridX * CELL_SIZE + CELL_SIZE / 2;
	player.y = GRID_OFFSET_Y + player.gridY * CELL_SIZE + CELL_SIZE / 2;
	// Add click handler for player
	player.down = function (x, y, obj) {
		// Just a visual indication that player was clicked
		tween(player, {
			scaleX: 1.2,
			scaleY: 1.2
		}, {
			duration: 100,
			onFinish: function onFinish() {
				tween(player, {
					scaleX: 1,
					scaleY: 1
				}, {
					duration: 100
				});
			}
		});
	};
	game.addChild(player);
}
// Initialize shark
function initShark() {
	shark = new Shark();
	shark.gridX = 9;
	shark.gridY = 9;
	shark.x = GRID_OFFSET_X + shark.gridX * CELL_SIZE + CELL_SIZE / 2;
	shark.y = GRID_OFFSET_Y + shark.gridY * CELL_SIZE + CELL_SIZE / 2;
	game.addChild(shark);
	// Add second shark for level 3
	if (currentLevel === 3) {
		shark2 = new Shark2();
		shark2.gridX = 0;
		shark2.gridY = 9;
		shark2.x = GRID_OFFSET_X + shark2.gridX * CELL_SIZE + CELL_SIZE / 2;
		shark2.y = GRID_OFFSET_Y + shark2.gridY * CELL_SIZE + CELL_SIZE / 2;
		game.addChild(shark2);
	}
}
// Initialize gas tanks
function initGasTanks() {
	// Create a list of all possible positions
	var positions = [];
	for (var y = 0; y < GRID_SIZE; y++) {
		for (var x = 0; x < GRID_SIZE; x++) {
			// Avoid player and shark starting positions
			if (x === 0 && y === 0 || x === 9 && y === 9) {
				continue;
			}
			positions.push({
				x: x,
				y: y
			});
		}
	}
	// Shuffle the positions
	for (var i = positions.length - 1; i > 0; i--) {
		var j = Math.floor(Math.random() * (i + 1));
		var temp = positions[i];
		positions[i] = positions[j];
		positions[j] = temp;
	}
	// Place gas tanks
	for (var i = 0; i < TOTAL_GAS_TANKS; i++) {
		var pos = positions[i];
		var gasTank = new GasTank();
		gasTank.setPosition(pos.x, pos.y);
		gasTanks.push(gasTank);
		game.addChild(gasTank);
	}
}
// Initialize UI
function initUI() {
	statusText.anchor.set(0.5, 0);
	statusText.y = 50;
	statusText.x = 2048 / 2;
	LK.gui.top.addChild(statusText);
	scoreText.anchor.set(0, 0);
	scoreText.y = 50;
	scoreText.x = 50;
	LK.gui.topRight.addChild(scoreText);
	warningText.anchor.set(0.5, 1);
	warningText.y = -50;
	LK.gui.bottom.addChild(warningText);
	// Hide button removed
}
// Handle cell clicks for player movement
function handleCellClick(x, y) {
	if (!gameActive || playerMoved) return;
	// Check if the clicked cell is adjacent to the player
	var dx = Math.abs(x - player.gridX);
	var dy = Math.abs(y - player.gridY);
	if (dx === 1 && dy === 0 || dx === 0 && dy === 1) {
		movePlayer(x, y);
		playerMoved = true;
		// Schedule shark movement after player moves
		LK.setTimeout(function () {
			if (gameActive) {
				moveShark();
				checkCollisions();
				playerMoved = false;
			}
		}, 500);
	}
}
// Move player to new position
function movePlayer(x, y) {
	player.moveTo(x, y);
	// Check if player collected a gas tank
	for (var i = 0; i < gasTanks.length; i++) {
		var tank = gasTanks[i];
		if (!tank.collected && tank.gridX === x && tank.gridY === y) {
			if (tank.collect()) {
				collectedTanks++;
				updateScore();
				if (collectedTanks >= TOTAL_GAS_TANKS) {
					gameWon();
				}
			}
		}
	}
	turnCount++;
}
// Move shark towards player
function moveShark() {
	// Handle shark disappearance every 7 turns
	if (turnCount % 7 === 0 && turnCount > 0 && !sharkHidden) {
		sharkHidden = true;
		sharkDisappearTurns = currentLevel === 1 ? 3 : 2; // Level 1: 3 turns, Level 2/3: 2 turns
		sharkLastX = shark.gridX;
		sharkLastY = shark.gridY;
		shark.alpha = 0;
		statusText.setText("The shark disappeared!");
		warningText.setText("");
		return;
	}
	// Handle shark hidden state
	if (sharkHidden) {
		sharkDisappearTurns--;
		if (sharkDisappearTurns <= 0) {
			// Shark reappears
			sharkHidden = false;
			shark.alpha = 1;
			shark.moveTo(sharkLastX, sharkLastY);
			statusText.setText("The shark reappeared!");
			LK.getSound('warning').play();
			LK.effects.flashScreen(0xFF0000, 300);
			// Update warning based on distance
			updateWarning();
			return;
		}
		statusText.setText("Shark reappears in " + sharkDisappearTurns + " turns");
		return;
	}
	// Handle second shark in level 3
	if (currentLevel === 3 && shark2) {
		// Handle shark2 disappearance every 5 turns (different pattern than first shark)
		if (turnCount % 5 === 0 && turnCount > 0 && !shark2Hidden) {
			shark2Hidden = true;
			shark2DisappearTurns = 1; // Always 1 turn for second shark
			shark2LastX = shark2.gridX;
			shark2LastY = shark2.gridY;
			shark2.alpha = 0;
			// Don't overwrite main shark messages
			if (!sharkHidden) {
				statusText.setText("The blue shark disappeared!");
			}
		}
		// Handle shark2 hidden state
		if (shark2Hidden) {
			shark2DisappearTurns--;
			if (shark2DisappearTurns <= 0) {
				// Shark2 reappears
				shark2Hidden = false;
				shark2.alpha = 1;
				shark2.moveTo(shark2LastX, shark2LastY);
				if (!sharkHidden) {
					statusText.setText("The blue shark reappeared!");
					LK.getSound('warning').play();
					LK.effects.flashScreen(0x0000FF, 300);
				}
			}
		}
		// Move shark2 if it's visible
		if (!shark2Hidden) {
			if (playerHiding) {
				// Random movement for shark2 when player is hiding
				var directions = [{
					x: 1,
					y: 0
				}, {
					x: -1,
					y: 0
				}, {
					x: 0,
					y: 1
				}, {
					x: 0,
					y: -1
				}];
				var randomDir = directions[Math.floor(Math.random() * directions.length)];
				var newX = shark2.gridX + randomDir.x;
				var newY = shark2.gridY + randomDir.y;
				// Make sure we don't go out of bounds
				newX = Math.max(0, Math.min(GRID_SIZE - 1, newX));
				newY = Math.max(0, Math.min(GRID_SIZE - 1, newY));
				shark2.moveTo(newX, newY);
			} else {
				// Shark2 uses a different strategy - move diagonally when possible
				var dx = player.gridX - shark2.gridX;
				var dy = player.gridY - shark2.gridY;
				var newX = shark2.gridX;
				var newY = shark2.gridY;
				// Try to move diagonally when possible
				if (dx !== 0 && dy !== 0) {
					newX = shark2.gridX + (dx > 0 ? 1 : -1);
					newY = shark2.gridY + (dy > 0 ? 1 : -1);
				} else if (dx !== 0) {
					newX = shark2.gridX + (dx > 0 ? 1 : -1);
				} else if (dy !== 0) {
					newY = shark2.gridY + (dy > 0 ? 1 : -1);
				}
				// Make sure we don't go out of bounds
				newX = Math.max(0, Math.min(GRID_SIZE - 1, newX));
				newY = Math.max(0, Math.min(GRID_SIZE - 1, newY));
				shark2.moveTo(newX, newY);
			}
		}
	}
	// If player is hiding, move randomly
	if (playerHiding) {
		// Random movement
		var directions = [{
			x: 1,
			y: 0
		}, {
			x: -1,
			y: 0
		}, {
			x: 0,
			y: 1
		}, {
			x: 0,
			y: -1
		}];
		var randomDir = directions[Math.floor(Math.random() * directions.length)];
		var newX = shark.gridX + randomDir.x;
		var newY = shark.gridY + randomDir.y;
		// Make sure we don't go out of bounds
		newX = Math.max(0, Math.min(GRID_SIZE - 1, newX));
		newY = Math.max(0, Math.min(GRID_SIZE - 1, newY));
		shark.moveTo(newX, newY);
		updateWarning();
		return;
	}
	// Normal shark movement
	// Simple pathfinding - move toward player
	var dx = player.gridX - shark.gridX;
	var dy = player.gridY - shark.gridY;
	var newX = shark.gridX;
	var newY = shark.gridY;
	// First try to move horizontally or vertically
	if (Math.abs(dx) > Math.abs(dy)) {
		newX = shark.gridX + (dx > 0 ? 1 : -1);
	} else {
		newY = shark.gridY + (dy > 0 ? 1 : -1);
	}
	// Make sure we don't go out of bounds
	newX = Math.max(0, Math.min(GRID_SIZE - 1, newX));
	newY = Math.max(0, Math.min(GRID_SIZE - 1, newY));
	shark.moveTo(newX, newY);
	// Update warning based on distance
	updateWarning();
}
// Update warning message based on distance to shark
function updateWarning() {
	// Don't show warnings if both sharks are hidden in level 3
	if (sharkHidden && (currentLevel < 3 || shark2Hidden)) {
		warningText.setText("");
		return;
	}
	var distance = Math.abs(player.gridX - shark.gridX) + Math.abs(player.gridY - shark.gridY);
	// For level 3, check distance to second shark if it exists and is visible
	var distance2 = Infinity;
	if (currentLevel === 3 && shark2 && !shark2Hidden) {
		distance2 = Math.abs(player.gridX - shark2.gridX) + Math.abs(player.gridY - shark2.gridY);
		// Use the shorter distance for warning
		distance = Math.min(distance, distance2);
		// If the closer shark is the blue one, change the warning message
		if (distance2 < distance) {
			if (distance <= 1) {
				warningText.setText("BLUE SHARK RIGHT NEXT TO YOU!");
				if (warningText.style) warningText.style.fill = "#0000FF";
				LK.effects.flashScreen(0x0000FF, 300);
				return;
			}
		}
	}
	if (distance <= 1) {
		warningText.setText("IT'S RIGHT NEXT TO YOU!");
		if (warningText.style) warningText.style.fill = "#FF0000";
		LK.effects.flashScreen(0xFF0000, 300);
	} else if (distance <= 3) {
		warningText.setText("You can hear it breathing...");
		if (warningText.style) warningText.style.fill = "#FF3300";
	} else if (distance <= 5) {
		warningText.setText("It's getting closer...");
		if (warningText.style) warningText.style.fill = "#FF6600";
	} else if (distance <= 8) {
		warningText.setText("Something is hunting you");
		if (warningText.style) warningText.style.fill = "#FFCC00";
	} else {
		warningText.setText("");
	}
}
// Check if shark caught player
function checkCollisions() {
	if (!sharkHidden && !playerHiding && shark.gridX === player.gridX && shark.gridY === player.gridY) {
		gameOver();
		return;
	}
	// Check if shark2 caught player in level 3
	if (currentLevel === 3 && shark2 && !shark2Hidden && !playerHiding && shark2.gridX === player.gridX && shark2.gridY === player.gridY) {
		statusText.setText("THE BLUE SHARK GOT YOU!");
		gameOver();
	}
}
// Update score display
function updateScore() {
	scoreText.setText("Gas Tanks: " + collectedTanks + "/" + TOTAL_GAS_TANKS);
}
// Game over
function gameOver() {
	gameActive = false;
	statusText.setText("THE SHARK GOT YOU!");
	if (statusText.style) statusText.style.fill = "#FF0000";
	LK.effects.flashScreen(0xFF0000, 1000);
	LK.getSound('Endofgame').play();
	LK.setTimeout(function () {
		LK.showGameOver();
	}, 1500);
}
// Game won
function gameWon() {
	if (currentLevel === 1) {
		// Advance to next level instead of showing win
		currentLevel = 2;
		statusText.setText("LEVEL COMPLETE! Starting Level 2...");
		if (statusText.style) statusText.style.fill = "#00FF00";
		LK.effects.flashScreen(0x00FF00, 1000);
		LK.getSound('Endofgame').play();
		LK.setTimeout(function () {
			resetForLevel2();
		}, 1500);
	} else if (currentLevel === 2) {
		// Advance to level 3
		currentLevel = 3;
		statusText.setText("LEVEL COMPLETE! Starting Level 3...");
		if (statusText.style) statusText.style.fill = "#00FF00";
		LK.effects.flashScreen(0x00FF00, 1000);
		LK.getSound('Endofgame').play();
		LK.setTimeout(function () {
			resetForLevel3();
		}, 1500);
	} else {
		// Final level complete
		gameActive = false;
		statusText.setText("YOU ESCAPED!");
		if (statusText.style) statusText.style.fill = "#00FF00";
		LK.effects.flashScreen(0x00FF00, 1000);
		LK.getSound('Endofgame').play();
		LK.setTimeout(function () {
			LK.showYouWin();
		}, 1500);
	}
}
// Initialize hiding spots
function initHidingSpots() {
	// Create random hiding spots (3-5 spots)
	var numSpots = 3 + Math.floor(Math.random() * 3);
	var positions = [];
	// Create a list of all possible positions
	for (var y = 0; y < GRID_SIZE; y++) {
		for (var x = 0; x < GRID_SIZE; x++) {
			// Avoid player and shark starting positions
			if (x === 0 && y === 0 || x === 9 && y === 9) {
				continue;
			}
			positions.push({
				x: x,
				y: y
			});
		}
	}
	// Shuffle the positions
	for (var i = positions.length - 1; i > 0; i--) {
		var j = Math.floor(Math.random() * (i + 1));
		var temp = positions[i];
		positions[i] = positions[j];
		positions[j] = temp;
	}
	// Place hiding spots
	for (var i = 0; i < numSpots; i++) {
		var pos = positions[i];
		var hidingSpot = new HidingSpot();
		hidingSpot.gridX = pos.x;
		hidingSpot.gridY = pos.y;
		hidingSpot.x = GRID_OFFSET_X + pos.x * CELL_SIZE + CELL_SIZE / 2;
		hidingSpot.y = GRID_OFFSET_Y + pos.y * CELL_SIZE + CELL_SIZE / 2;
		hidingSpots.push(hidingSpot);
		gridContainer.addChild(hidingSpot);
	}
}
// Highlight valid moves
function highlightValidMoves() {
	// Reset all highlights
	for (var y = 0; y < GRID_SIZE; y++) {
		for (var x = 0; x < GRID_SIZE; x++) {
			grid[y][x].resetHighlight();
		}
	}
	// Highlight hiding spots
	for (var i = 0; i < hidingSpots.length; i++) {
		var spot = hidingSpots[i];
		spot.resetHighlight();
		// If player is on a hiding spot, highlight it
		if (player.gridX === spot.gridX && player.gridY === spot.gridY) {
			spot.highlight();
		}
	}
	// Don't highlight moves when hiding
	if (playerHiding) {
		return;
	}
	// Highlight valid moves
	var directions = [{
		x: 1,
		y: 0
	}, {
		x: -1,
		y: 0
	}, {
		x: 0,
		y: 1
	}, {
		x: 0,
		y: -1
	}];
	for (var i = 0; i < directions.length; i++) {
		var newX = player.gridX + directions[i].x;
		var newY = player.gridY + directions[i].y;
		if (newX >= 0 && newX < GRID_SIZE && newY >= 0 && newY < GRID_SIZE) {
			grid[newY][newX].highlight(0.5);
		}
	}
}
// Initialize game
function initGame() {
	initGrid();
	initPlayer();
	initShark();
	initGasTanks();
	initHidingSpots();
	initUI();
	updateScore();
	highlightValidMoves();
	LK.playMusic('bgmusic');
}
// Start the game
initGame();
// Reset game state for level 2
function resetForLevel2() {
	// Clear existing game elements
	for (var i = 0; i < gasTanks.length; i++) {
		if (gasTanks[i].parent) {
			gasTanks[i].parent.removeChild(gasTanks[i]);
		}
	}
	for (var i = 0; i < hidingSpots.length; i++) {
		if (hidingSpots[i].parent) {
			hidingSpots[i].parent.removeChild(hidingSpots[i]);
		}
	}
	// Reset variables
	gasTanks = [];
	collectedTanks = 0;
	turnCount = 0;
	playerMoved = false;
	sharkHidden = false;
	sharkDisappearTurns = 0;
	hidingSpots = [];
	playerHiding = false;
	// Reset player and shark positions
	player.moveTo(0, 0);
	shark.moveTo(9, 9);
	shark.alpha = 1;
	// Initialize level 2 elements
	initGasTanks();
	initHidingSpots();
	// Update UI
	statusText.setText("LEVEL 2: The shark only disappears for 2 turns now!");
	if (statusText.style) statusText.style.fill = "#FFFFFF";
	updateScore();
	highlightValidMoves();
	// Re-enable gameplay
	gameActive = true;
}
// Reset game state for level 3
function resetForLevel3() {
	// Clear existing game elements
	for (var i = 0; i < gasTanks.length; i++) {
		if (gasTanks[i].parent) {
			gasTanks[i].parent.removeChild(gasTanks[i]);
		}
	}
	for (var i = 0; i < hidingSpots.length; i++) {
		if (hidingSpots[i].parent) {
			hidingSpots[i].parent.removeChild(hidingSpots[i]);
		}
	}
	// Reset variables
	gasTanks = [];
	collectedTanks = 0;
	turnCount = 0;
	playerMoved = false;
	sharkHidden = false;
	shark2Hidden = false;
	sharkDisappearTurns = 0;
	shark2DisappearTurns = 0;
	hidingSpots = [];
	playerHiding = false;
	// Reset player and shark positions
	player.moveTo(0, 0);
	shark.moveTo(9, 9);
	shark.alpha = 1;
	// Initialize level 3 elements
	initGasTanks();
	initHidingSpots();
	initShark(); // This will create the second shark
	// Update UI
	statusText.setText("LEVEL 3: Now there are TWO sharks hunting you!");
	if (statusText.style) statusText.style.fill = "#FFFFFF";
	updateScore();
	highlightValidMoves();
	// Re-enable gameplay
	gameActive = true;
}
// Game update loop
game.update = function () {
	// Highlight valid moves when player is able to move
	if (gameActive && !playerMoved) {
		highlightValidMoves();
	}
};
// Game event handlers
game.down = function (x, y, obj) {
	if (!gameActive || playerMoved || playerHiding) return;
	// Convert click coordinates to grid coordinates
	var gridX = Math.floor((x - GRID_OFFSET_X) / CELL_SIZE);
	var gridY = Math.floor((y - GRID_OFFSET_Y) / CELL_SIZE);
	// Check if click is within grid boundaries
	if (gridX >= 0 && gridX < GRID_SIZE && gridY >= 0 && gridY < GRID_SIZE) {
		// Check if the clicked cell is adjacent to the player
		var dx = Math.abs(gridX - player.gridX);
		var dy = Math.abs(gridY - player.gridY);
		if (dx === 1 && dy === 0 || dx === 0 && dy === 1) {
			// Highlight the clicked cell briefly
			grid[gridY][gridX].highlight(0.7);
			// Move player to the clicked cell
			movePlayer(gridX, gridY);
			playerMoved = true;
			// Schedule shark movement after player moves
			LK.setTimeout(function () {
				if (gameActive) {
					moveShark();
					checkCollisions();
					playerMoved = false;
					highlightValidMoves();
				}
			}, 500);
		}
	}
};
game.move = function (x, y, obj) {
	// For debugging purposes
	// console.log("Mouse position: " + x + ", " + y);
};
game.up = function (x, y, obj) {
	// No additional handling needed
}; /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var GasTank = Container.expand(function () {
	var self = Container.call(this);
	var tankGraphics = self.attachAsset('gasTank', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.gridX = 0;
	self.gridY = 0;
	self.collected = false;
	self.collect = function () {
		if (!self.collected) {
			self.collected = true;
			tween(self, {
				alpha: 0,
				scaleX: 1.5,
				scaleY: 1.5
			}, {
				duration: 300,
				onFinish: function onFinish() {
					self.visible = false;
				}
			});
			LK.getSound('collect').play();
			return true;
		}
		return false;
	};
	self.setPosition = function (x, y) {
		self.gridX = x;
		self.gridY = y;
		self.x = GRID_OFFSET_X + x * CELL_SIZE + CELL_SIZE / 2;
		self.y = GRID_OFFSET_Y + y * CELL_SIZE + CELL_SIZE / 2;
	};
	return self;
});
var GridCell = Container.expand(function () {
	var self = Container.call(this);
	var cellGraphics = self.attachAsset('gridCell', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 0.3
	});
	self.gridX = 0;
	self.gridY = 0;
	self.isEmpty = true;
	self.highlight = function (intensity) {
		tween(cellGraphics, {
			alpha: intensity
		}, {
			duration: 200
		});
	};
	self.resetHighlight = function () {
		tween(cellGraphics, {
			alpha: 0.3
		}, {
			duration: 200
		});
	};
	return self;
});
var HidingSpot = Container.expand(function () {
	var self = Container.call(this);
	var spotGraphics = self.attachAsset('gridCell', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 0.1,
		tint: 0x0000FF
	});
	self.gridX = 0;
	self.gridY = 0;
	self.highlight = function () {
		tween(spotGraphics, {
			alpha: 0.5,
			tint: 0x00AAFF
		}, {
			duration: 200
		});
	};
	self.resetHighlight = function () {
		tween(spotGraphics, {
			alpha: 0.1,
			tint: 0x0000FF
		}, {
			duration: 200
		});
	};
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.gridX = 0;
	self.gridY = 0;
	self.moveTo = function (x, y) {
		self.gridX = x;
		self.gridY = y;
		// Calculate actual screen position based on grid
		var targetX = GRID_OFFSET_X + x * CELL_SIZE + CELL_SIZE / 2;
		var targetY = GRID_OFFSET_Y + y * CELL_SIZE + CELL_SIZE / 2;
		tween(self, {
			x: targetX,
			y: targetY
		}, {
			duration: 200,
			easing: tween.easeOut,
			onFinish: function onFinish() {
				LK.getSound('move').play();
			}
		});
	};
	return self;
});
var Shark = Container.expand(function () {
	var self = Container.call(this);
	var sharkGraphics = self.attachAsset('shark', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.gridX = 9;
	self.gridY = 9;
	self.moveTo = function (x, y) {
		self.gridX = x;
		self.gridY = y;
		// Calculate actual screen position based on grid
		var targetX = GRID_OFFSET_X + x * CELL_SIZE + CELL_SIZE / 2;
		var targetY = GRID_OFFSET_Y + y * CELL_SIZE + CELL_SIZE / 2;
		tween(self, {
			x: targetX,
			y: targetY
		}, {
			duration: 300,
			easing: tween.bounceOut
		});
	};
	return self;
});
var Shark2 = Container.expand(function () {
	var self = Container.call(this);
	var sharkGraphics = self.attachAsset('shark', {
		anchorX: 0.5,
		anchorY: 0.5,
		tint: 0x0000FF // Blue tint to distinguish it
	});
	self.gridX = 0;
	self.gridY = 9;
	self.moveTo = function (x, y) {
		self.gridX = x;
		self.gridY = y;
		// Calculate actual screen position based on grid
		var targetX = GRID_OFFSET_X + x * CELL_SIZE + CELL_SIZE / 2;
		var targetY = GRID_OFFSET_Y + y * CELL_SIZE + CELL_SIZE / 2;
		tween(self, {
			x: targetX,
			y: targetY
		}, {
			duration: 300,
			easing: tween.bounceOut
		});
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000
});
/**** 
* Game Code
****/ 
// Constants
var GRID_SIZE = 10;
var CELL_SIZE = 204; // 2048 / 10 ~= 204
var GRID_OFFSET_X = (2048 - GRID_SIZE * CELL_SIZE) / 2;
var GRID_OFFSET_Y = (2732 - GRID_SIZE * CELL_SIZE) / 2;
var TOTAL_GAS_TANKS = 10;
// Game state variables
var grid = [];
var gridContainer = new Container();
var player;
var shark;
var shark2;
var gasTanks = [];
var collectedTanks = 0;
var gameActive = true;
var turnCount = 0;
var playerMoved = false;
var sharkHidden = false;
var shark2Hidden = false;
var sharkDisappearTurns = 0;
var shark2DisappearTurns = 0;
var sharkLastX = 0;
var sharkLastY = 0;
var shark2LastX = 0;
var shark2LastY = 0;
var hidingSpots = [];
var playerHiding = false;
var hideButtonActive = false;
var currentLevel = 1; // Start at level 1
// UI elements
var statusText = new Text2('Find the gas tanks!', {
	size: 50,
	fill: 0xFFFFFF
});
var scoreText = new Text2('Gas Tanks: 0/' + TOTAL_GAS_TANKS, {
	size: 50,
	fill: 0xFFFFFF
});
var warningText = new Text2('', {
	size: 60,
	fill: 0xFF0000
});
// Initialize grid
function initGrid() {
	var gridBackground = LK.getAsset('gridOutline', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 2048 / 2,
		y: 2732 / 2,
		width: CELL_SIZE * GRID_SIZE,
		height: CELL_SIZE * GRID_SIZE,
		alpha: 0.2
	});
	game.addChild(gridBackground);
	game.addChild(gridContainer);
	for (var y = 0; y < GRID_SIZE; y++) {
		grid[y] = [];
		for (var x = 0; x < GRID_SIZE; x++) {
			var cell = new GridCell();
			cell.x = GRID_OFFSET_X + x * CELL_SIZE + CELL_SIZE / 2;
			cell.y = GRID_OFFSET_Y + y * CELL_SIZE + CELL_SIZE / 2;
			cell.gridX = x;
			cell.gridY = y;
			gridContainer.addChild(cell);
			grid[y][x] = cell;
			// Cell clicks will be handled by game.down
			cell.down = function (x, y, obj) {
				// Let the game handle this via global click detection
			};
		}
	}
}
// Initialize player
function initPlayer() {
	player = new Player();
	player.gridX = 0;
	player.gridY = 0;
	player.x = GRID_OFFSET_X + player.gridX * CELL_SIZE + CELL_SIZE / 2;
	player.y = GRID_OFFSET_Y + player.gridY * CELL_SIZE + CELL_SIZE / 2;
	// Add click handler for player
	player.down = function (x, y, obj) {
		// Just a visual indication that player was clicked
		tween(player, {
			scaleX: 1.2,
			scaleY: 1.2
		}, {
			duration: 100,
			onFinish: function onFinish() {
				tween(player, {
					scaleX: 1,
					scaleY: 1
				}, {
					duration: 100
				});
			}
		});
	};
	game.addChild(player);
}
// Initialize shark
function initShark() {
	shark = new Shark();
	shark.gridX = 9;
	shark.gridY = 9;
	shark.x = GRID_OFFSET_X + shark.gridX * CELL_SIZE + CELL_SIZE / 2;
	shark.y = GRID_OFFSET_Y + shark.gridY * CELL_SIZE + CELL_SIZE / 2;
	game.addChild(shark);
	// Add second shark for level 3
	if (currentLevel === 3) {
		shark2 = new Shark2();
		shark2.gridX = 0;
		shark2.gridY = 9;
		shark2.x = GRID_OFFSET_X + shark2.gridX * CELL_SIZE + CELL_SIZE / 2;
		shark2.y = GRID_OFFSET_Y + shark2.gridY * CELL_SIZE + CELL_SIZE / 2;
		game.addChild(shark2);
	}
}
// Initialize gas tanks
function initGasTanks() {
	// Create a list of all possible positions
	var positions = [];
	for (var y = 0; y < GRID_SIZE; y++) {
		for (var x = 0; x < GRID_SIZE; x++) {
			// Avoid player and shark starting positions
			if (x === 0 && y === 0 || x === 9 && y === 9) {
				continue;
			}
			positions.push({
				x: x,
				y: y
			});
		}
	}
	// Shuffle the positions
	for (var i = positions.length - 1; i > 0; i--) {
		var j = Math.floor(Math.random() * (i + 1));
		var temp = positions[i];
		positions[i] = positions[j];
		positions[j] = temp;
	}
	// Place gas tanks
	for (var i = 0; i < TOTAL_GAS_TANKS; i++) {
		var pos = positions[i];
		var gasTank = new GasTank();
		gasTank.setPosition(pos.x, pos.y);
		gasTanks.push(gasTank);
		game.addChild(gasTank);
	}
}
// Initialize UI
function initUI() {
	statusText.anchor.set(0.5, 0);
	statusText.y = 50;
	statusText.x = 2048 / 2;
	LK.gui.top.addChild(statusText);
	scoreText.anchor.set(0, 0);
	scoreText.y = 50;
	scoreText.x = 50;
	LK.gui.topRight.addChild(scoreText);
	warningText.anchor.set(0.5, 1);
	warningText.y = -50;
	LK.gui.bottom.addChild(warningText);
	// Hide button removed
}
// Handle cell clicks for player movement
function handleCellClick(x, y) {
	if (!gameActive || playerMoved) return;
	// Check if the clicked cell is adjacent to the player
	var dx = Math.abs(x - player.gridX);
	var dy = Math.abs(y - player.gridY);
	if (dx === 1 && dy === 0 || dx === 0 && dy === 1) {
		movePlayer(x, y);
		playerMoved = true;
		// Schedule shark movement after player moves
		LK.setTimeout(function () {
			if (gameActive) {
				moveShark();
				checkCollisions();
				playerMoved = false;
			}
		}, 500);
	}
}
// Move player to new position
function movePlayer(x, y) {
	player.moveTo(x, y);
	// Check if player collected a gas tank
	for (var i = 0; i < gasTanks.length; i++) {
		var tank = gasTanks[i];
		if (!tank.collected && tank.gridX === x && tank.gridY === y) {
			if (tank.collect()) {
				collectedTanks++;
				updateScore();
				if (collectedTanks >= TOTAL_GAS_TANKS) {
					gameWon();
				}
			}
		}
	}
	turnCount++;
}
// Move shark towards player
function moveShark() {
	// Handle shark disappearance every 7 turns
	if (turnCount % 7 === 0 && turnCount > 0 && !sharkHidden) {
		sharkHidden = true;
		sharkDisappearTurns = currentLevel === 1 ? 3 : 2; // Level 1: 3 turns, Level 2/3: 2 turns
		sharkLastX = shark.gridX;
		sharkLastY = shark.gridY;
		shark.alpha = 0;
		statusText.setText("The shark disappeared!");
		warningText.setText("");
		return;
	}
	// Handle shark hidden state
	if (sharkHidden) {
		sharkDisappearTurns--;
		if (sharkDisappearTurns <= 0) {
			// Shark reappears
			sharkHidden = false;
			shark.alpha = 1;
			shark.moveTo(sharkLastX, sharkLastY);
			statusText.setText("The shark reappeared!");
			LK.getSound('warning').play();
			LK.effects.flashScreen(0xFF0000, 300);
			// Update warning based on distance
			updateWarning();
			return;
		}
		statusText.setText("Shark reappears in " + sharkDisappearTurns + " turns");
		return;
	}
	// Handle second shark in level 3
	if (currentLevel === 3 && shark2) {
		// Handle shark2 disappearance every 5 turns (different pattern than first shark)
		if (turnCount % 5 === 0 && turnCount > 0 && !shark2Hidden) {
			shark2Hidden = true;
			shark2DisappearTurns = 1; // Always 1 turn for second shark
			shark2LastX = shark2.gridX;
			shark2LastY = shark2.gridY;
			shark2.alpha = 0;
			// Don't overwrite main shark messages
			if (!sharkHidden) {
				statusText.setText("The blue shark disappeared!");
			}
		}
		// Handle shark2 hidden state
		if (shark2Hidden) {
			shark2DisappearTurns--;
			if (shark2DisappearTurns <= 0) {
				// Shark2 reappears
				shark2Hidden = false;
				shark2.alpha = 1;
				shark2.moveTo(shark2LastX, shark2LastY);
				if (!sharkHidden) {
					statusText.setText("The blue shark reappeared!");
					LK.getSound('warning').play();
					LK.effects.flashScreen(0x0000FF, 300);
				}
			}
		}
		// Move shark2 if it's visible
		if (!shark2Hidden) {
			if (playerHiding) {
				// Random movement for shark2 when player is hiding
				var directions = [{
					x: 1,
					y: 0
				}, {
					x: -1,
					y: 0
				}, {
					x: 0,
					y: 1
				}, {
					x: 0,
					y: -1
				}];
				var randomDir = directions[Math.floor(Math.random() * directions.length)];
				var newX = shark2.gridX + randomDir.x;
				var newY = shark2.gridY + randomDir.y;
				// Make sure we don't go out of bounds
				newX = Math.max(0, Math.min(GRID_SIZE - 1, newX));
				newY = Math.max(0, Math.min(GRID_SIZE - 1, newY));
				shark2.moveTo(newX, newY);
			} else {
				// Shark2 uses a different strategy - move diagonally when possible
				var dx = player.gridX - shark2.gridX;
				var dy = player.gridY - shark2.gridY;
				var newX = shark2.gridX;
				var newY = shark2.gridY;
				// Try to move diagonally when possible
				if (dx !== 0 && dy !== 0) {
					newX = shark2.gridX + (dx > 0 ? 1 : -1);
					newY = shark2.gridY + (dy > 0 ? 1 : -1);
				} else if (dx !== 0) {
					newX = shark2.gridX + (dx > 0 ? 1 : -1);
				} else if (dy !== 0) {
					newY = shark2.gridY + (dy > 0 ? 1 : -1);
				}
				// Make sure we don't go out of bounds
				newX = Math.max(0, Math.min(GRID_SIZE - 1, newX));
				newY = Math.max(0, Math.min(GRID_SIZE - 1, newY));
				shark2.moveTo(newX, newY);
			}
		}
	}
	// If player is hiding, move randomly
	if (playerHiding) {
		// Random movement
		var directions = [{
			x: 1,
			y: 0
		}, {
			x: -1,
			y: 0
		}, {
			x: 0,
			y: 1
		}, {
			x: 0,
			y: -1
		}];
		var randomDir = directions[Math.floor(Math.random() * directions.length)];
		var newX = shark.gridX + randomDir.x;
		var newY = shark.gridY + randomDir.y;
		// Make sure we don't go out of bounds
		newX = Math.max(0, Math.min(GRID_SIZE - 1, newX));
		newY = Math.max(0, Math.min(GRID_SIZE - 1, newY));
		shark.moveTo(newX, newY);
		updateWarning();
		return;
	}
	// Normal shark movement
	// Simple pathfinding - move toward player
	var dx = player.gridX - shark.gridX;
	var dy = player.gridY - shark.gridY;
	var newX = shark.gridX;
	var newY = shark.gridY;
	// First try to move horizontally or vertically
	if (Math.abs(dx) > Math.abs(dy)) {
		newX = shark.gridX + (dx > 0 ? 1 : -1);
	} else {
		newY = shark.gridY + (dy > 0 ? 1 : -1);
	}
	// Make sure we don't go out of bounds
	newX = Math.max(0, Math.min(GRID_SIZE - 1, newX));
	newY = Math.max(0, Math.min(GRID_SIZE - 1, newY));
	shark.moveTo(newX, newY);
	// Update warning based on distance
	updateWarning();
}
// Update warning message based on distance to shark
function updateWarning() {
	// Don't show warnings if both sharks are hidden in level 3
	if (sharkHidden && (currentLevel < 3 || shark2Hidden)) {
		warningText.setText("");
		return;
	}
	var distance = Math.abs(player.gridX - shark.gridX) + Math.abs(player.gridY - shark.gridY);
	// For level 3, check distance to second shark if it exists and is visible
	var distance2 = Infinity;
	if (currentLevel === 3 && shark2 && !shark2Hidden) {
		distance2 = Math.abs(player.gridX - shark2.gridX) + Math.abs(player.gridY - shark2.gridY);
		// Use the shorter distance for warning
		distance = Math.min(distance, distance2);
		// If the closer shark is the blue one, change the warning message
		if (distance2 < distance) {
			if (distance <= 1) {
				warningText.setText("BLUE SHARK RIGHT NEXT TO YOU!");
				if (warningText.style) warningText.style.fill = "#0000FF";
				LK.effects.flashScreen(0x0000FF, 300);
				return;
			}
		}
	}
	if (distance <= 1) {
		warningText.setText("IT'S RIGHT NEXT TO YOU!");
		if (warningText.style) warningText.style.fill = "#FF0000";
		LK.effects.flashScreen(0xFF0000, 300);
	} else if (distance <= 3) {
		warningText.setText("You can hear it breathing...");
		if (warningText.style) warningText.style.fill = "#FF3300";
	} else if (distance <= 5) {
		warningText.setText("It's getting closer...");
		if (warningText.style) warningText.style.fill = "#FF6600";
	} else if (distance <= 8) {
		warningText.setText("Something is hunting you");
		if (warningText.style) warningText.style.fill = "#FFCC00";
	} else {
		warningText.setText("");
	}
}
// Check if shark caught player
function checkCollisions() {
	if (!sharkHidden && !playerHiding && shark.gridX === player.gridX && shark.gridY === player.gridY) {
		gameOver();
		return;
	}
	// Check if shark2 caught player in level 3
	if (currentLevel === 3 && shark2 && !shark2Hidden && !playerHiding && shark2.gridX === player.gridX && shark2.gridY === player.gridY) {
		statusText.setText("THE BLUE SHARK GOT YOU!");
		gameOver();
	}
}
// Update score display
function updateScore() {
	scoreText.setText("Gas Tanks: " + collectedTanks + "/" + TOTAL_GAS_TANKS);
}
// Game over
function gameOver() {
	gameActive = false;
	statusText.setText("THE SHARK GOT YOU!");
	if (statusText.style) statusText.style.fill = "#FF0000";
	LK.effects.flashScreen(0xFF0000, 1000);
	LK.getSound('Endofgame').play();
	LK.setTimeout(function () {
		LK.showGameOver();
	}, 1500);
}
// Game won
function gameWon() {
	if (currentLevel === 1) {
		// Advance to next level instead of showing win
		currentLevel = 2;
		statusText.setText("LEVEL COMPLETE! Starting Level 2...");
		if (statusText.style) statusText.style.fill = "#00FF00";
		LK.effects.flashScreen(0x00FF00, 1000);
		LK.getSound('Endofgame').play();
		LK.setTimeout(function () {
			resetForLevel2();
		}, 1500);
	} else if (currentLevel === 2) {
		// Advance to level 3
		currentLevel = 3;
		statusText.setText("LEVEL COMPLETE! Starting Level 3...");
		if (statusText.style) statusText.style.fill = "#00FF00";
		LK.effects.flashScreen(0x00FF00, 1000);
		LK.getSound('Endofgame').play();
		LK.setTimeout(function () {
			resetForLevel3();
		}, 1500);
	} else {
		// Final level complete
		gameActive = false;
		statusText.setText("YOU ESCAPED!");
		if (statusText.style) statusText.style.fill = "#00FF00";
		LK.effects.flashScreen(0x00FF00, 1000);
		LK.getSound('Endofgame').play();
		LK.setTimeout(function () {
			LK.showYouWin();
		}, 1500);
	}
}
// Initialize hiding spots
function initHidingSpots() {
	// Create random hiding spots (3-5 spots)
	var numSpots = 3 + Math.floor(Math.random() * 3);
	var positions = [];
	// Create a list of all possible positions
	for (var y = 0; y < GRID_SIZE; y++) {
		for (var x = 0; x < GRID_SIZE; x++) {
			// Avoid player and shark starting positions
			if (x === 0 && y === 0 || x === 9 && y === 9) {
				continue;
			}
			positions.push({
				x: x,
				y: y
			});
		}
	}
	// Shuffle the positions
	for (var i = positions.length - 1; i > 0; i--) {
		var j = Math.floor(Math.random() * (i + 1));
		var temp = positions[i];
		positions[i] = positions[j];
		positions[j] = temp;
	}
	// Place hiding spots
	for (var i = 0; i < numSpots; i++) {
		var pos = positions[i];
		var hidingSpot = new HidingSpot();
		hidingSpot.gridX = pos.x;
		hidingSpot.gridY = pos.y;
		hidingSpot.x = GRID_OFFSET_X + pos.x * CELL_SIZE + CELL_SIZE / 2;
		hidingSpot.y = GRID_OFFSET_Y + pos.y * CELL_SIZE + CELL_SIZE / 2;
		hidingSpots.push(hidingSpot);
		gridContainer.addChild(hidingSpot);
	}
}
// Highlight valid moves
function highlightValidMoves() {
	// Reset all highlights
	for (var y = 0; y < GRID_SIZE; y++) {
		for (var x = 0; x < GRID_SIZE; x++) {
			grid[y][x].resetHighlight();
		}
	}
	// Highlight hiding spots
	for (var i = 0; i < hidingSpots.length; i++) {
		var spot = hidingSpots[i];
		spot.resetHighlight();
		// If player is on a hiding spot, highlight it
		if (player.gridX === spot.gridX && player.gridY === spot.gridY) {
			spot.highlight();
		}
	}
	// Don't highlight moves when hiding
	if (playerHiding) {
		return;
	}
	// Highlight valid moves
	var directions = [{
		x: 1,
		y: 0
	}, {
		x: -1,
		y: 0
	}, {
		x: 0,
		y: 1
	}, {
		x: 0,
		y: -1
	}];
	for (var i = 0; i < directions.length; i++) {
		var newX = player.gridX + directions[i].x;
		var newY = player.gridY + directions[i].y;
		if (newX >= 0 && newX < GRID_SIZE && newY >= 0 && newY < GRID_SIZE) {
			grid[newY][newX].highlight(0.5);
		}
	}
}
// Initialize game
function initGame() {
	initGrid();
	initPlayer();
	initShark();
	initGasTanks();
	initHidingSpots();
	initUI();
	updateScore();
	highlightValidMoves();
	LK.playMusic('bgmusic');
}
// Start the game
initGame();
// Reset game state for level 2
function resetForLevel2() {
	// Clear existing game elements
	for (var i = 0; i < gasTanks.length; i++) {
		if (gasTanks[i].parent) {
			gasTanks[i].parent.removeChild(gasTanks[i]);
		}
	}
	for (var i = 0; i < hidingSpots.length; i++) {
		if (hidingSpots[i].parent) {
			hidingSpots[i].parent.removeChild(hidingSpots[i]);
		}
	}
	// Reset variables
	gasTanks = [];
	collectedTanks = 0;
	turnCount = 0;
	playerMoved = false;
	sharkHidden = false;
	sharkDisappearTurns = 0;
	hidingSpots = [];
	playerHiding = false;
	// Reset player and shark positions
	player.moveTo(0, 0);
	shark.moveTo(9, 9);
	shark.alpha = 1;
	// Initialize level 2 elements
	initGasTanks();
	initHidingSpots();
	// Update UI
	statusText.setText("LEVEL 2: The shark only disappears for 2 turns now!");
	if (statusText.style) statusText.style.fill = "#FFFFFF";
	updateScore();
	highlightValidMoves();
	// Re-enable gameplay
	gameActive = true;
}
// Reset game state for level 3
function resetForLevel3() {
	// Clear existing game elements
	for (var i = 0; i < gasTanks.length; i++) {
		if (gasTanks[i].parent) {
			gasTanks[i].parent.removeChild(gasTanks[i]);
		}
	}
	for (var i = 0; i < hidingSpots.length; i++) {
		if (hidingSpots[i].parent) {
			hidingSpots[i].parent.removeChild(hidingSpots[i]);
		}
	}
	// Reset variables
	gasTanks = [];
	collectedTanks = 0;
	turnCount = 0;
	playerMoved = false;
	sharkHidden = false;
	shark2Hidden = false;
	sharkDisappearTurns = 0;
	shark2DisappearTurns = 0;
	hidingSpots = [];
	playerHiding = false;
	// Reset player and shark positions
	player.moveTo(0, 0);
	shark.moveTo(9, 9);
	shark.alpha = 1;
	// Initialize level 3 elements
	initGasTanks();
	initHidingSpots();
	initShark(); // This will create the second shark
	// Update UI
	statusText.setText("LEVEL 3: Now there are TWO sharks hunting you!");
	if (statusText.style) statusText.style.fill = "#FFFFFF";
	updateScore();
	highlightValidMoves();
	// Re-enable gameplay
	gameActive = true;
}
// Game update loop
game.update = function () {
	// Highlight valid moves when player is able to move
	if (gameActive && !playerMoved) {
		highlightValidMoves();
	}
};
// Game event handlers
game.down = function (x, y, obj) {
	if (!gameActive || playerMoved || playerHiding) return;
	// Convert click coordinates to grid coordinates
	var gridX = Math.floor((x - GRID_OFFSET_X) / CELL_SIZE);
	var gridY = Math.floor((y - GRID_OFFSET_Y) / CELL_SIZE);
	// Check if click is within grid boundaries
	if (gridX >= 0 && gridX < GRID_SIZE && gridY >= 0 && gridY < GRID_SIZE) {
		// Check if the clicked cell is adjacent to the player
		var dx = Math.abs(gridX - player.gridX);
		var dy = Math.abs(gridY - player.gridY);
		if (dx === 1 && dy === 0 || dx === 0 && dy === 1) {
			// Highlight the clicked cell briefly
			grid[gridY][gridX].highlight(0.7);
			// Move player to the clicked cell
			movePlayer(gridX, gridY);
			playerMoved = true;
			// Schedule shark movement after player moves
			LK.setTimeout(function () {
				if (gameActive) {
					moveShark();
					checkCollisions();
					playerMoved = false;
					highlightValidMoves();
				}
			}, 500);
		}
	}
};
game.move = function (x, y, obj) {
	// For debugging purposes
	// console.log("Mouse position: " + x + ", " + y);
};
game.up = function (x, y, obj) {
	// No additional handling needed
};