/**** 
* Classes
****/ 
var Ground = Container.expand(function (x) {
	var self = Container.call(this);
	var groundGraphics = self.attachAsset('ground', {
		anchorX: 0,
		anchorY: 0
	});
	self.x = x;
	self.y = 2440;
	self.scrollSpeed = -8;
	self.update = function () {
		self.x += self.scrollSpeed;
	};
	return self;
});
var Obstacle = Container.expand(function (type, x, y) {
	var self = Container.call(this);
	self.type = type;
	var obstacleGraphics;
	if (type === 'spike') {
		obstacleGraphics = self.attachAsset('spike', {
			anchorX: 0.5,
			anchorY: 1.0
		});
	} else if (type === 'block') {
		obstacleGraphics = self.attachAsset('block', {
			anchorX: 0.5,
			anchorY: 1.0
		});
	}
	self.x = x;
	self.y = y;
	self.scrollSpeed = -8;
	self.update = function () {
		self.x += self.scrollSpeed;
	};
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 1.0
	});
	self.velocityY = 0;
	self.onGround = false;
	self.jumpPower = -25;
	self.gravity = 1.2;
	self.groundY = 2400;
	self.jump = function () {
		if (self.onGround) {
			self.velocityY = self.jumpPower;
			self.onGround = false;
			LK.getSound('jump').play();
		}
	};
	self.update = function () {
		// Apply gravity
		self.velocityY += self.gravity;
		self.y += self.velocityY;
		// Ground collision
		if (self.y >= self.groundY) {
			self.y = self.groundY;
			self.velocityY = 0;
			self.onGround = true;
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB
});
/**** 
* Game Code
****/ 
var player;
var obstacles = [];
var grounds = [];
var currentLevel = 1;
var gameRunning = false;
var levelStartX = 0;
var nextObstacleX = 2500;
// Level data - obstacles defined as [type, xOffset, yOffset]
var levelData = {
	1: [
	// Easy start section
	['spike', 2500, 2400], ['spike', 2800, 2400], ['block', 3200, 2320], ['spike', 3600, 2400], ['spike', 4000, 2400], ['block', 4400, 2240], ['spike', 4800, 2400], ['block', 5200, 2320], ['spike', 5600, 2400], ['spike', 6000, 2400],
	// Middle section - introducing patterns
	['block', 6500, 2320], ['spike', 6900, 2400], ['spike', 7200, 2400], ['block', 7600, 2240], ['spike', 8000, 2400], ['block', 8400, 2320], ['spike', 8800, 2400], ['spike', 9100, 2400], ['block', 9500, 2320], ['spike', 9900, 2400], ['spike', 10300, 2400], ['block', 10700, 2240], ['spike', 11100, 2400], ['block', 11500, 2320], ['spike', 11900, 2400],
	// Extended section with gaps
	['spike', 12400, 2400], ['block', 12800, 2320], ['spike', 13200, 2400], ['spike', 13600, 2400], ['block', 14000, 2240], ['spike', 14400, 2400], ['block', 14800, 2320], ['spike', 15200, 2400], ['spike', 15600, 2400], ['block', 16000, 2320], ['spike', 16400, 2400], ['spike', 16800, 2400], ['block', 17200, 2240], ['spike', 17600, 2400], ['block', 18000, 2320],
	// Final stretch
	['spike', 18400, 2400], ['spike', 18700, 2400], ['block', 19100, 2320], ['spike', 19500, 2400], ['spike', 19900, 2400]],
	2: [
	// Intermediate difficulty start
	['spike', 2500, 2400], ['block', 2800, 2320], ['spike', 3000, 2400], ['block', 3400, 2240], ['block', 3600, 2320], ['spike', 4000, 2400], ['spike', 4200, 2400], ['block', 4600, 2160], ['spike', 5000, 2400], ['block', 5400, 2320], ['spike', 5800, 2400], ['block', 6200, 2240], ['spike', 6600, 2400], ['spike', 6900, 2400],
	// More complex patterns
	['block', 7300, 2320], ['block', 7500, 2240], ['spike', 7900, 2400], ['spike', 8200, 2400], ['block', 8600, 2160], ['spike', 9000, 2400], ['block', 9400, 2320], ['spike', 9800, 2400], ['block', 10200, 2240], ['spike', 10600, 2400], ['spike', 10900, 2400], ['block', 11300, 2320], ['spike', 11700, 2400], ['block', 12100, 2160], ['spike', 12500, 2400],
	// Challenging middle section
	['block', 12900, 2240], ['block', 13100, 2320], ['spike', 13500, 2400], ['spike', 13800, 2400], ['block', 14200, 2160], ['spike', 14600, 2400], ['spike', 14900, 2400], ['block', 15300, 2320], ['spike', 15700, 2400], ['block', 16100, 2240], ['spike', 16500, 2400], ['block', 16900, 2160], ['spike', 17300, 2400], ['spike', 17600, 2400], ['block', 18000, 2320],
	// Extended finale
	['spike', 18400, 2400], ['block', 18800, 2240], ['spike', 19200, 2400], ['spike', 19500, 2400], ['block', 19900, 2320], ['spike', 20300, 2400], ['spike', 20600, 2400], ['block', 21000, 2160], ['spike', 21400, 2400], ['spike', 21800, 2400]],
	3: [
	// Hard difficulty start
	['spike', 2500, 2400], ['block', 2700, 2320], ['spike', 2900, 2400], ['block', 3200, 2240], ['spike', 3500, 2400], ['block', 3700, 2160], ['spike', 4000, 2400], ['spike', 4200, 2400], ['block', 4500, 2320], ['block', 4700, 2240], ['spike', 5100, 2400], ['block', 5400, 2160], ['spike', 5800, 2400], ['spike', 6100, 2400],
	// Dense obstacle patterns
	['block', 6400, 2320], ['spike', 6700, 2400], ['block', 7000, 2240], ['spike', 7300, 2400], ['block', 7600, 2160], ['spike', 7900, 2400], ['spike', 8200, 2400], ['block', 8500, 2320], ['spike', 8800, 2400], ['block', 9100, 2240], ['spike', 9400, 2400], ['block', 9700, 2160], ['spike', 10000, 2400], ['spike', 10300, 2400], ['block', 10600, 2320],
	// Very challenging section
	['spike', 10900, 2400], ['block', 11200, 2240], ['block', 11400, 2160], ['spike', 11700, 2400], ['spike', 12000, 2400], ['block', 12300, 2320], ['spike', 12600, 2400], ['block', 12900, 2240], ['spike', 13200, 2400], ['block', 13500, 2160], ['spike', 13800, 2400], ['spike', 14100, 2400], ['block', 14400, 2320], ['spike', 14700, 2400], ['block', 15000, 2240],
	// Expert level obstacles
	['spike', 15300, 2400], ['block', 15600, 2160], ['spike', 15900, 2400], ['spike', 16200, 2400], ['block', 16500, 2320], ['spike', 16800, 2400], ['block', 17100, 2240], ['spike', 17400, 2400], ['block', 17700, 2160], ['spike', 18000, 2400], ['spike', 18300, 2400], ['block', 18600, 2320], ['spike', 18900, 2400], ['block', 19200, 2240], ['spike', 19500, 2400],
	// Final gauntlet
	['block', 19800, 2160], ['spike', 20100, 2400], ['spike', 20400, 2400], ['block', 20700, 2320], ['spike', 21000, 2400], ['block', 21300, 2240], ['spike', 21600, 2400], ['spike', 21900, 2400], ['block', 22200, 2160], ['spike', 22500, 2400], ['spike', 22800, 2400], ['block', 23100, 2320], ['spike', 23400, 2400], ['spike', 23700, 2400]]
};
// UI Elements
var levelText = new Text2('Level 1', {
	size: 80,
	fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
levelText.y = 100;
function initializeLevel() {
	// Clear existing obstacles and grounds
	for (var i = obstacles.length - 1; i >= 0; i--) {
		obstacles[i].destroy();
		obstacles.splice(i, 1);
	}
	for (var j = grounds.length - 1; j >= 0; j--) {
		grounds[j].destroy();
		grounds.splice(j, 1);
	}
	// Create player
	if (player) {
		player.destroy();
	}
	player = game.addChild(new Player());
	player.x = 300;
	player.y = 2400;
	// Create ground tiles
	for (var g = 0; g < 80; g++) {
		var ground = game.addChild(new Ground(g * 100));
		grounds.push(ground);
	}
	// Create obstacles for current level
	var levelObstacles = levelData[currentLevel];
	if (levelObstacles) {
		for (var o = 0; o < levelObstacles.length; o++) {
			var obstacleData = levelObstacles[o];
			var obstacle = game.addChild(new Obstacle(obstacleData[0], obstacleData[1], obstacleData[2]));
			obstacles.push(obstacle);
		}
	}
	gameRunning = true;
	levelText.setText('Level ' + currentLevel);
}
function restartLevel() {
	LK.getSound('death').play();
	LK.effects.flashScreen(0xFF0000, 500);
	LK.setTimeout(function () {
		initializeLevel();
	}, 600);
}
function nextLevel() {
	currentLevel++;
	if (currentLevel > 3) {
		LK.showYouWin();
		return;
	}
	LK.setTimeout(function () {
		initializeLevel();
	}, 1000);
}
function checkLevelComplete() {
	var furthestObstacle = 0;
	for (var i = 0; i < obstacles.length; i++) {
		if (obstacles[i].x > furthestObstacle) {
			furthestObstacle = obstacles[i].x;
		}
	}
	// If player has passed all obstacles
	if (player.x > furthestObstacle + 200) {
		gameRunning = false;
		nextLevel();
	}
}
// Initialize first level
initializeLevel();
game.down = function (x, y, obj) {
	if (gameRunning && player) {
		player.jump();
	}
};
game.update = function () {
	if (!gameRunning) return;
	// Check for collisions
	for (var i = obstacles.length - 1; i >= 0; i--) {
		var obstacle = obstacles[i];
		if (player.intersects(obstacle)) {
			gameRunning = false;
			restartLevel();
			return;
		}
		// Remove obstacles that are off screen
		if (obstacle.x < -200) {
			obstacle.destroy();
			obstacles.splice(i, 1);
		}
	}
	// Remove ground tiles that are off screen and add new ones
	for (var j = grounds.length - 1; j >= 0; j--) {
		var ground = grounds[j];
		if (ground.x < -200) {
			ground.destroy();
			grounds.splice(j, 1);
		}
	}
	// Add new ground tiles as needed
	while (grounds.length < 80) {
		var lastGround = grounds[grounds.length - 1];
		var newX = lastGround ? lastGround.x + 100 : 7800;
		var newGround = game.addChild(new Ground(newX));
		grounds.push(newGround);
	}
	checkLevelComplete();
}; /**** 
* Classes
****/ 
var Ground = Container.expand(function (x) {
	var self = Container.call(this);
	var groundGraphics = self.attachAsset('ground', {
		anchorX: 0,
		anchorY: 0
	});
	self.x = x;
	self.y = 2440;
	self.scrollSpeed = -8;
	self.update = function () {
		self.x += self.scrollSpeed;
	};
	return self;
});
var Obstacle = Container.expand(function (type, x, y) {
	var self = Container.call(this);
	self.type = type;
	var obstacleGraphics;
	if (type === 'spike') {
		obstacleGraphics = self.attachAsset('spike', {
			anchorX: 0.5,
			anchorY: 1.0
		});
	} else if (type === 'block') {
		obstacleGraphics = self.attachAsset('block', {
			anchorX: 0.5,
			anchorY: 1.0
		});
	}
	self.x = x;
	self.y = y;
	self.scrollSpeed = -8;
	self.update = function () {
		self.x += self.scrollSpeed;
	};
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 1.0
	});
	self.velocityY = 0;
	self.onGround = false;
	self.jumpPower = -25;
	self.gravity = 1.2;
	self.groundY = 2400;
	self.jump = function () {
		if (self.onGround) {
			self.velocityY = self.jumpPower;
			self.onGround = false;
			LK.getSound('jump').play();
		}
	};
	self.update = function () {
		// Apply gravity
		self.velocityY += self.gravity;
		self.y += self.velocityY;
		// Ground collision
		if (self.y >= self.groundY) {
			self.y = self.groundY;
			self.velocityY = 0;
			self.onGround = true;
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB
});
/**** 
* Game Code
****/ 
var player;
var obstacles = [];
var grounds = [];
var currentLevel = 1;
var gameRunning = false;
var levelStartX = 0;
var nextObstacleX = 2500;
// Level data - obstacles defined as [type, xOffset, yOffset]
var levelData = {
	1: [
	// Easy start section
	['spike', 2500, 2400], ['spike', 2800, 2400], ['block', 3200, 2320], ['spike', 3600, 2400], ['spike', 4000, 2400], ['block', 4400, 2240], ['spike', 4800, 2400], ['block', 5200, 2320], ['spike', 5600, 2400], ['spike', 6000, 2400],
	// Middle section - introducing patterns
	['block', 6500, 2320], ['spike', 6900, 2400], ['spike', 7200, 2400], ['block', 7600, 2240], ['spike', 8000, 2400], ['block', 8400, 2320], ['spike', 8800, 2400], ['spike', 9100, 2400], ['block', 9500, 2320], ['spike', 9900, 2400], ['spike', 10300, 2400], ['block', 10700, 2240], ['spike', 11100, 2400], ['block', 11500, 2320], ['spike', 11900, 2400],
	// Extended section with gaps
	['spike', 12400, 2400], ['block', 12800, 2320], ['spike', 13200, 2400], ['spike', 13600, 2400], ['block', 14000, 2240], ['spike', 14400, 2400], ['block', 14800, 2320], ['spike', 15200, 2400], ['spike', 15600, 2400], ['block', 16000, 2320], ['spike', 16400, 2400], ['spike', 16800, 2400], ['block', 17200, 2240], ['spike', 17600, 2400], ['block', 18000, 2320],
	// Final stretch
	['spike', 18400, 2400], ['spike', 18700, 2400], ['block', 19100, 2320], ['spike', 19500, 2400], ['spike', 19900, 2400]],
	2: [
	// Intermediate difficulty start
	['spike', 2500, 2400], ['block', 2800, 2320], ['spike', 3000, 2400], ['block', 3400, 2240], ['block', 3600, 2320], ['spike', 4000, 2400], ['spike', 4200, 2400], ['block', 4600, 2160], ['spike', 5000, 2400], ['block', 5400, 2320], ['spike', 5800, 2400], ['block', 6200, 2240], ['spike', 6600, 2400], ['spike', 6900, 2400],
	// More complex patterns
	['block', 7300, 2320], ['block', 7500, 2240], ['spike', 7900, 2400], ['spike', 8200, 2400], ['block', 8600, 2160], ['spike', 9000, 2400], ['block', 9400, 2320], ['spike', 9800, 2400], ['block', 10200, 2240], ['spike', 10600, 2400], ['spike', 10900, 2400], ['block', 11300, 2320], ['spike', 11700, 2400], ['block', 12100, 2160], ['spike', 12500, 2400],
	// Challenging middle section
	['block', 12900, 2240], ['block', 13100, 2320], ['spike', 13500, 2400], ['spike', 13800, 2400], ['block', 14200, 2160], ['spike', 14600, 2400], ['spike', 14900, 2400], ['block', 15300, 2320], ['spike', 15700, 2400], ['block', 16100, 2240], ['spike', 16500, 2400], ['block', 16900, 2160], ['spike', 17300, 2400], ['spike', 17600, 2400], ['block', 18000, 2320],
	// Extended finale
	['spike', 18400, 2400], ['block', 18800, 2240], ['spike', 19200, 2400], ['spike', 19500, 2400], ['block', 19900, 2320], ['spike', 20300, 2400], ['spike', 20600, 2400], ['block', 21000, 2160], ['spike', 21400, 2400], ['spike', 21800, 2400]],
	3: [
	// Hard difficulty start
	['spike', 2500, 2400], ['block', 2700, 2320], ['spike', 2900, 2400], ['block', 3200, 2240], ['spike', 3500, 2400], ['block', 3700, 2160], ['spike', 4000, 2400], ['spike', 4200, 2400], ['block', 4500, 2320], ['block', 4700, 2240], ['spike', 5100, 2400], ['block', 5400, 2160], ['spike', 5800, 2400], ['spike', 6100, 2400],
	// Dense obstacle patterns
	['block', 6400, 2320], ['spike', 6700, 2400], ['block', 7000, 2240], ['spike', 7300, 2400], ['block', 7600, 2160], ['spike', 7900, 2400], ['spike', 8200, 2400], ['block', 8500, 2320], ['spike', 8800, 2400], ['block', 9100, 2240], ['spike', 9400, 2400], ['block', 9700, 2160], ['spike', 10000, 2400], ['spike', 10300, 2400], ['block', 10600, 2320],
	// Very challenging section
	['spike', 10900, 2400], ['block', 11200, 2240], ['block', 11400, 2160], ['spike', 11700, 2400], ['spike', 12000, 2400], ['block', 12300, 2320], ['spike', 12600, 2400], ['block', 12900, 2240], ['spike', 13200, 2400], ['block', 13500, 2160], ['spike', 13800, 2400], ['spike', 14100, 2400], ['block', 14400, 2320], ['spike', 14700, 2400], ['block', 15000, 2240],
	// Expert level obstacles
	['spike', 15300, 2400], ['block', 15600, 2160], ['spike', 15900, 2400], ['spike', 16200, 2400], ['block', 16500, 2320], ['spike', 16800, 2400], ['block', 17100, 2240], ['spike', 17400, 2400], ['block', 17700, 2160], ['spike', 18000, 2400], ['spike', 18300, 2400], ['block', 18600, 2320], ['spike', 18900, 2400], ['block', 19200, 2240], ['spike', 19500, 2400],
	// Final gauntlet
	['block', 19800, 2160], ['spike', 20100, 2400], ['spike', 20400, 2400], ['block', 20700, 2320], ['spike', 21000, 2400], ['block', 21300, 2240], ['spike', 21600, 2400], ['spike', 21900, 2400], ['block', 22200, 2160], ['spike', 22500, 2400], ['spike', 22800, 2400], ['block', 23100, 2320], ['spike', 23400, 2400], ['spike', 23700, 2400]]
};
// UI Elements
var levelText = new Text2('Level 1', {
	size: 80,
	fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
levelText.y = 100;
function initializeLevel() {
	// Clear existing obstacles and grounds
	for (var i = obstacles.length - 1; i >= 0; i--) {
		obstacles[i].destroy();
		obstacles.splice(i, 1);
	}
	for (var j = grounds.length - 1; j >= 0; j--) {
		grounds[j].destroy();
		grounds.splice(j, 1);
	}
	// Create player
	if (player) {
		player.destroy();
	}
	player = game.addChild(new Player());
	player.x = 300;
	player.y = 2400;
	// Create ground tiles
	for (var g = 0; g < 80; g++) {
		var ground = game.addChild(new Ground(g * 100));
		grounds.push(ground);
	}
	// Create obstacles for current level
	var levelObstacles = levelData[currentLevel];
	if (levelObstacles) {
		for (var o = 0; o < levelObstacles.length; o++) {
			var obstacleData = levelObstacles[o];
			var obstacle = game.addChild(new Obstacle(obstacleData[0], obstacleData[1], obstacleData[2]));
			obstacles.push(obstacle);
		}
	}
	gameRunning = true;
	levelText.setText('Level ' + currentLevel);
}
function restartLevel() {
	LK.getSound('death').play();
	LK.effects.flashScreen(0xFF0000, 500);
	LK.setTimeout(function () {
		initializeLevel();
	}, 600);
}
function nextLevel() {
	currentLevel++;
	if (currentLevel > 3) {
		LK.showYouWin();
		return;
	}
	LK.setTimeout(function () {
		initializeLevel();
	}, 1000);
}
function checkLevelComplete() {
	var furthestObstacle = 0;
	for (var i = 0; i < obstacles.length; i++) {
		if (obstacles[i].x > furthestObstacle) {
			furthestObstacle = obstacles[i].x;
		}
	}
	// If player has passed all obstacles
	if (player.x > furthestObstacle + 200) {
		gameRunning = false;
		nextLevel();
	}
}
// Initialize first level
initializeLevel();
game.down = function (x, y, obj) {
	if (gameRunning && player) {
		player.jump();
	}
};
game.update = function () {
	if (!gameRunning) return;
	// Check for collisions
	for (var i = obstacles.length - 1; i >= 0; i--) {
		var obstacle = obstacles[i];
		if (player.intersects(obstacle)) {
			gameRunning = false;
			restartLevel();
			return;
		}
		// Remove obstacles that are off screen
		if (obstacle.x < -200) {
			obstacle.destroy();
			obstacles.splice(i, 1);
		}
	}
	// Remove ground tiles that are off screen and add new ones
	for (var j = grounds.length - 1; j >= 0; j--) {
		var ground = grounds[j];
		if (ground.x < -200) {
			ground.destroy();
			grounds.splice(j, 1);
		}
	}
	// Add new ground tiles as needed
	while (grounds.length < 80) {
		var lastGround = grounds[grounds.length - 1];
		var newX = lastGround ? lastGround.x + 100 : 7800;
		var newGround = game.addChild(new Ground(newX));
		grounds.push(newGround);
	}
	checkLevelComplete();
};