/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var AICar = Container.expand(function () {
	var self = Container.call(this);
	var carGraphics = self.attachAsset('aiCar', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.lane = 0;
	self.speed = 0;
	self.active = true;
	self.init = function (lane, yPos, speed) {
		self.lane = lane || Math.floor(Math.random() * 5);
		self.y = yPos || -300;
		self.x = 400 + self.lane * 300;
		self.speed = speed || Math.random() * 3 + 2;
		self.active = true;
		return self;
	};
	self.update = function () {
		if (!self.active) {
			return;
		}
		self.y += self.speed * gameSpeed;
		// If car is off screen, mark for removal
		if (self.y > 2832) {
			self.active = false;
			overtakeCount += 1;
			LK.setScore(LK.getScore() + 10);
			LK.getSound('overtake').play();
		}
	};
	return self;
});
var PlayerCar = Container.expand(function () {
	var self = Container.call(this);
	var carGraphics = self.attachAsset('car', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.lane = 2; // Middle lane (0-indexed: 0, 1, 2, 3, 4)
	self.speed = 5;
	self.canMove = true;
	self.currentBoost = 0;
	self.maxBoost = 100;
	self.moveToLane = function (lane) {
		if (!self.canMove) {
			return;
		}
		if (lane >= 0 && lane <= 4 && lane !== self.lane) {
			self.canMove = false;
			var targetX = 400 + lane * 300;
			tween(self, {
				x: targetX
			}, {
				duration: 300,
				easing: tween.easeOut,
				onFinish: function onFinish() {
					self.lane = lane;
					self.canMove = true;
				}
			});
		}
	};
	self.applyBoost = function () {
		if (self.currentBoost > 0) {
			gameSpeed = baseGameSpeed * 1.5;
			self.currentBoost -= 1;
			if (self.currentBoost <= 0) {
				gameSpeed = baseGameSpeed;
			}
		}
	};
	self.crash = function () {
		LK.getSound('crash').play();
		self.canMove = false;
		LK.effects.flashObject(self, 0xff0000, 500);
		gameSpeed = baseGameSpeed * 0.3;
		LK.setTimeout(function () {
			self.canMove = true;
			gameSpeed = baseGameSpeed;
		}, 1500);
	};
	return self;
});
var TrackElement = Container.expand(function () {
	var self = Container.call(this);
	self.type = 'line'; // 'line', 'boost', 'obstacle'
	self.active = true;
	self.init = function (type, lane, yPos) {
		self.type = type || 'line';
		self.active = true;
		var assetId = 'trackLine';
		if (type === 'boost') {
			assetId = 'speedBoost';
		} else if (type === 'obstacle') {
			assetId = 'obstacle';
		}
		var elementGraphics = self.attachAsset(assetId, {
			anchorX: 0.5,
			anchorY: 0.5
		});
		self.lane = lane || 0;
		var x = self.type === 'line' ? 250 + lane * 300 : 400 + lane * 300;
		self.x = x;
		self.y = yPos || -100;
		return self;
	};
	self.update = function () {
		if (!self.active) {
			return;
		}
		self.y += 7 * gameSpeed;
		// If element is off screen, mark for removal
		if (self.y > 2832) {
			self.active = false;
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x008800
});
/**** 
* Game Code
****/ 
// Game variables
var gameStarted = false;
var baseGameSpeed = 1.0;
var gameSpeed = baseGameSpeed;
var lastUpdate = Date.now();
var trackPosition = 0;
var spawnCounter = 0;
var difficultyLevel = 1;
var overtakeCount = 0;
var distanceTraveled = 0;
var raceTarget = 1000; // meters to complete the race
// Track configuration
var trackWidth = 1500;
var trackHeight = 2732;
var laneCount = 5;
var laneWidth = 300;
// Game elements
var player;
var trackElements = [];
var aiCars = [];
// UI elements
var scoreTxt;
var speedTxt;
var boostTxt;
var distanceTxt;
// Initialize game
function initGame() {
	// Set background
	game.setBackgroundColor(0x005500);
	// Create the track
	createTrack();
	// Create player car
	player = new PlayerCar();
	player.x = 400 + player.lane * 300; // Position in middle lane
	player.y = 2200; // Position near bottom of screen
	game.addChild(player);
	// Initialize UI
	createUI();
	// Start game
	gameStarted = true;
	LK.playMusic('raceMusic');
	LK.getSound('engine').play();
}
function createTrack() {
	// Create track background (lanes)
	for (var i = 0; i < laneCount; i++) {
		var lane = LK.getAsset('trackLane', {
			anchorX: 0.5,
			anchorY: 0.5,
			alpha: 0.7
		});
		lane.x = 400 + i * 300;
		lane.y = 1366; // Middle of screen
		lane.height = trackHeight;
		game.addChild(lane);
	}
	// Create initial track lines
	for (var i = 0; i < 15; i++) {
		for (var j = 0; j < laneCount - 1; j++) {
			var line = new TrackElement().init('line', j, i * 200);
			trackElements.push(line);
			game.addChild(line);
		}
	}
}
function createUI() {
	// Score display
	scoreTxt = new Text2('Score: 0', {
		size: 60,
		fill: 0xFFFFFF
	});
	scoreTxt.anchor.set(0, 0);
	LK.gui.topRight.addChild(scoreTxt);
	scoreTxt.x = -300; // Offset from right edge
	// Speed display
	speedTxt = new Text2('Speed: 100 km/h', {
		size: 60,
		fill: 0xFFFFFF
	});
	speedTxt.anchor.set(0, 0);
	LK.gui.topRight.addChild(speedTxt);
	speedTxt.x = -300; // Offset from right edge
	speedTxt.y = 70; // Below score
	// Boost display
	boostTxt = new Text2('Boost: 0%', {
		size: 60,
		fill: 0xFFFFFF
	});
	boostTxt.anchor.set(0, 0);
	LK.gui.topRight.addChild(boostTxt);
	boostTxt.x = -300; // Offset from right edge
	boostTxt.y = 140; // Below speed
	// Distance display
	distanceTxt = new Text2('Distance: 0m / ' + raceTarget + 'm', {
		size: 60,
		fill: 0xFFFFFF
	});
	distanceTxt.anchor.set(0.5, 0);
	LK.gui.top.addChild(distanceTxt);
	distanceTxt.y = 70; // Below top
}
function updateUI() {
	scoreTxt.setText('Score: ' + LK.getScore());
	speedTxt.setText('Speed: ' + Math.floor(100 * gameSpeed) + ' km/h');
	boostTxt.setText('Boost: ' + player.currentBoost + '%');
	distanceTxt.setText('Distance: ' + Math.floor(distanceTraveled) + 'm / ' + raceTarget + 'm');
}
function spawnTrackElements() {
	spawnCounter++;
	// Spawn track lines
	if (spawnCounter % 20 === 0) {
		for (var j = 0; j < laneCount - 1; j++) {
			var line = new TrackElement().init('line', j, -100);
			trackElements.push(line);
			game.addChild(line);
		}
	}
	// Spawn boost (less frequent)
	if (spawnCounter % 180 === 0) {
		var boostLane = Math.floor(Math.random() * laneCount);
		var boost = new TrackElement().init('boost', boostLane, -100);
		trackElements.push(boost);
		game.addChild(boost);
	}
	// Spawn obstacles (frequency increases with difficulty)
	if (spawnCounter % Math.max(100 - difficultyLevel * 10, 30) === 0) {
		var obstacleLane = Math.floor(Math.random() * laneCount);
		var obstacle = new TrackElement().init('obstacle', obstacleLane, -100);
		trackElements.push(obstacle);
		game.addChild(obstacle);
	}
	// Spawn AI cars
	if (spawnCounter % Math.max(120 - difficultyLevel * 15, 40) === 0) {
		var aiLane = Math.floor(Math.random() * laneCount);
		// Don't spawn in same lane too often
		if (aiCars.length > 0) {
			var lastCar = aiCars[aiCars.length - 1];
			if (lastCar.lane === aiLane && lastCar.y > -1000) {
				aiLane = (aiLane + 1) % laneCount;
			}
		}
		var aiSpeed = Math.random() * 2 + 2 + difficultyLevel * 0.3;
		var ai = new AICar().init(aiLane, -300, aiSpeed);
		aiCars.push(ai);
		game.addChild(ai);
	}
}
function checkCollisions() {
	// Check player collisions with AI cars
	for (var i = 0; i < aiCars.length; i++) {
		var car = aiCars[i];
		if (car.active && player.lane === car.lane) {
			// Check vertical collision
			var playerTop = player.y - player.height / 2;
			var playerBottom = player.y + player.height / 2;
			var carTop = car.y - car.height / 2;
			var carBottom = car.y + car.height / 2;
			if (playerTop < carBottom && playerBottom > carTop) {
				player.crash();
				car.active = false; // Remove the AI car
				LK.setScore(Math.max(0, LK.getScore() - 50)); // Penalty
				break;
			}
		}
	}
	// Check player collisions with track elements
	for (var i = 0; i < trackElements.length; i++) {
		var element = trackElements[i];
		if (element.active && element.type !== 'line') {
			// Only check boost and obstacle elements
			if (player.lane === element.lane) {
				// Check vertical collision
				var playerTop = player.y - player.height / 3; // Smaller collision area
				var playerBottom = player.y + player.height / 3;
				var elementTop = element.y - element.height / 2;
				var elementBottom = element.y + element.height / 2;
				if (playerTop < elementBottom && playerBottom > elementTop) {
					if (element.type === 'boost') {
						// Collect boost
						player.currentBoost = Math.min(player.maxBoost, player.currentBoost + 25);
						LK.getSound('boost').play();
						LK.setScore(LK.getScore() + 20);
					} else if (element.type === 'obstacle') {
						// Hit obstacle
						player.crash();
						LK.setScore(Math.max(0, LK.getScore() - 30));
					}
					element.active = false;
					break;
				}
			}
		}
	}
}
function cleanupInactiveElements() {
	// Clean up track elements
	for (var i = trackElements.length - 1; i >= 0; i--) {
		if (!trackElements[i].active) {
			trackElements[i].destroy();
			trackElements.splice(i, 1);
		}
	}
	// Clean up AI cars
	for (var i = aiCars.length - 1; i >= 0; i--) {
		if (!aiCars[i].active) {
			aiCars[i].destroy();
			aiCars.splice(i, 1);
		}
	}
}
function updateDifficulty() {
	// Increase difficulty based on distance traveled
	difficultyLevel = 1 + Math.floor(distanceTraveled / 200);
	// Cap difficulty at level 10
	if (difficultyLevel > 10) {
		difficultyLevel = 10;
	}
	// Store high score
	if (LK.getScore() > (storage.highScore || 0)) {
		storage.highScore = LK.getScore();
	}
	// Check win condition
	if (distanceTraveled >= raceTarget) {
		LK.showYouWin();
	}
}
// Input handling
game.down = function (x, y, obj) {
	if (!gameStarted) {
		initGame();
		return;
	}
	// Determine tap position and move accordingly
	if (x < 1024) {
		// Left half of screen
		// Move left
		player.moveToLane(Math.max(0, player.lane - 1));
	} else {
		// Right half of screen
		// Move right
		player.moveToLane(Math.min(4, player.lane + 1));
	}
};
// Apply boost on move up
game.up = function (x, y, obj) {
	if (gameStarted && y > 2000) {
		// Only trigger boost for taps in bottom area
		player.applyBoost();
	}
};
// Main game loop
game.update = function () {
	if (!gameStarted) {
		return;
	}
	// Calculate delta time
	var now = Date.now();
	var deltaTime = now - lastUpdate;
	lastUpdate = now;
	// Update distance traveled
	distanceTraveled += deltaTime / 1000 * gameSpeed * 50;
	// Update track elements
	spawnTrackElements();
	// Update all active track elements
	for (var i = 0; i < trackElements.length; i++) {
		trackElements[i].update();
	}
	// Update all active AI cars
	for (var i = 0; i < aiCars.length; i++) {
		aiCars[i].update();
	}
	// Check for collisions
	checkCollisions();
	// Clean up inactive elements
	cleanupInactiveElements();
	// Update difficulty
	updateDifficulty();
	// Update UI
	updateUI();
};
// Initialize the start screen
function initStartScreen() {
	game.setBackgroundColor(0x005500);
	var titleText = new Text2('Formula Speed', {
		size: 120,
		fill: 0xFFFFFF
	});
	titleText.anchor.set(0.5, 0.5);
	titleText.x = 1024;
	titleText.y = 900;
	game.addChild(titleText);
	var subtitleText = new Text2('Grand Prix Challenge', {
		size: 80,
		fill: 0xFFFFFF
	});
	subtitleText.anchor.set(0.5, 0.5);
	subtitleText.x = 1024;
	subtitleText.y = 1020;
	game.addChild(subtitleText);
	var instructionText = new Text2('Tap Left/Right to Change Lanes\nTap Bottom to Use Boost', {
		size: 60,
		fill: 0xFFFFFF
	});
	instructionText.anchor.set(0.5, 0.5);
	instructionText.x = 1024;
	instructionText.y = 1200;
	game.addChild(instructionText);
	// Show high score if available
	if (storage.highScore) {
		var highScoreText = new Text2('High Score: ' + storage.highScore, {
			size: 60,
			fill: 0xFFFFFF
		});
		highScoreText.anchor.set(0.5, 0.5);
		highScoreText.x = 1024;
		highScoreText.y = 1300;
		game.addChild(highScoreText);
	}
	var startText = new Text2('Tap Anywhere to Start', {
		size: 70,
		fill: 0xFFFFFF
	});
	startText.anchor.set(0.5, 0.5);
	startText.x = 1024;
	startText.y = 1450;
	game.addChild(startText);
	// Create a demo car
	var demoCar = LK.getAsset('car', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 1024,
		y: 1700
	});
	game.addChild(demoCar);
	// Animate the demo car
	var _animateDemoCar = function animateDemoCar() {
		tween(demoCar, {
			y: 1650
		}, {
			duration: 1000,
			easing: tween.easeInOut,
			onFinish: function onFinish() {
				tween(demoCar, {
					y: 1750
				}, {
					duration: 1000,
					easing: tween.easeInOut,
					onFinish: _animateDemoCar
				});
			}
		});
	};
	_animateDemoCar();
}
// Start with the intro screen
initStartScreen(); /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var AICar = Container.expand(function () {
	var self = Container.call(this);
	var carGraphics = self.attachAsset('aiCar', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.lane = 0;
	self.speed = 0;
	self.active = true;
	self.init = function (lane, yPos, speed) {
		self.lane = lane || Math.floor(Math.random() * 5);
		self.y = yPos || -300;
		self.x = 400 + self.lane * 300;
		self.speed = speed || Math.random() * 3 + 2;
		self.active = true;
		return self;
	};
	self.update = function () {
		if (!self.active) {
			return;
		}
		self.y += self.speed * gameSpeed;
		// If car is off screen, mark for removal
		if (self.y > 2832) {
			self.active = false;
			overtakeCount += 1;
			LK.setScore(LK.getScore() + 10);
			LK.getSound('overtake').play();
		}
	};
	return self;
});
var PlayerCar = Container.expand(function () {
	var self = Container.call(this);
	var carGraphics = self.attachAsset('car', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.lane = 2; // Middle lane (0-indexed: 0, 1, 2, 3, 4)
	self.speed = 5;
	self.canMove = true;
	self.currentBoost = 0;
	self.maxBoost = 100;
	self.moveToLane = function (lane) {
		if (!self.canMove) {
			return;
		}
		if (lane >= 0 && lane <= 4 && lane !== self.lane) {
			self.canMove = false;
			var targetX = 400 + lane * 300;
			tween(self, {
				x: targetX
			}, {
				duration: 300,
				easing: tween.easeOut,
				onFinish: function onFinish() {
					self.lane = lane;
					self.canMove = true;
				}
			});
		}
	};
	self.applyBoost = function () {
		if (self.currentBoost > 0) {
			gameSpeed = baseGameSpeed * 1.5;
			self.currentBoost -= 1;
			if (self.currentBoost <= 0) {
				gameSpeed = baseGameSpeed;
			}
		}
	};
	self.crash = function () {
		LK.getSound('crash').play();
		self.canMove = false;
		LK.effects.flashObject(self, 0xff0000, 500);
		gameSpeed = baseGameSpeed * 0.3;
		LK.setTimeout(function () {
			self.canMove = true;
			gameSpeed = baseGameSpeed;
		}, 1500);
	};
	return self;
});
var TrackElement = Container.expand(function () {
	var self = Container.call(this);
	self.type = 'line'; // 'line', 'boost', 'obstacle'
	self.active = true;
	self.init = function (type, lane, yPos) {
		self.type = type || 'line';
		self.active = true;
		var assetId = 'trackLine';
		if (type === 'boost') {
			assetId = 'speedBoost';
		} else if (type === 'obstacle') {
			assetId = 'obstacle';
		}
		var elementGraphics = self.attachAsset(assetId, {
			anchorX: 0.5,
			anchorY: 0.5
		});
		self.lane = lane || 0;
		var x = self.type === 'line' ? 250 + lane * 300 : 400 + lane * 300;
		self.x = x;
		self.y = yPos || -100;
		return self;
	};
	self.update = function () {
		if (!self.active) {
			return;
		}
		self.y += 7 * gameSpeed;
		// If element is off screen, mark for removal
		if (self.y > 2832) {
			self.active = false;
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x008800
});
/**** 
* Game Code
****/ 
// Game variables
var gameStarted = false;
var baseGameSpeed = 1.0;
var gameSpeed = baseGameSpeed;
var lastUpdate = Date.now();
var trackPosition = 0;
var spawnCounter = 0;
var difficultyLevel = 1;
var overtakeCount = 0;
var distanceTraveled = 0;
var raceTarget = 1000; // meters to complete the race
// Track configuration
var trackWidth = 1500;
var trackHeight = 2732;
var laneCount = 5;
var laneWidth = 300;
// Game elements
var player;
var trackElements = [];
var aiCars = [];
// UI elements
var scoreTxt;
var speedTxt;
var boostTxt;
var distanceTxt;
// Initialize game
function initGame() {
	// Set background
	game.setBackgroundColor(0x005500);
	// Create the track
	createTrack();
	// Create player car
	player = new PlayerCar();
	player.x = 400 + player.lane * 300; // Position in middle lane
	player.y = 2200; // Position near bottom of screen
	game.addChild(player);
	// Initialize UI
	createUI();
	// Start game
	gameStarted = true;
	LK.playMusic('raceMusic');
	LK.getSound('engine').play();
}
function createTrack() {
	// Create track background (lanes)
	for (var i = 0; i < laneCount; i++) {
		var lane = LK.getAsset('trackLane', {
			anchorX: 0.5,
			anchorY: 0.5,
			alpha: 0.7
		});
		lane.x = 400 + i * 300;
		lane.y = 1366; // Middle of screen
		lane.height = trackHeight;
		game.addChild(lane);
	}
	// Create initial track lines
	for (var i = 0; i < 15; i++) {
		for (var j = 0; j < laneCount - 1; j++) {
			var line = new TrackElement().init('line', j, i * 200);
			trackElements.push(line);
			game.addChild(line);
		}
	}
}
function createUI() {
	// Score display
	scoreTxt = new Text2('Score: 0', {
		size: 60,
		fill: 0xFFFFFF
	});
	scoreTxt.anchor.set(0, 0);
	LK.gui.topRight.addChild(scoreTxt);
	scoreTxt.x = -300; // Offset from right edge
	// Speed display
	speedTxt = new Text2('Speed: 100 km/h', {
		size: 60,
		fill: 0xFFFFFF
	});
	speedTxt.anchor.set(0, 0);
	LK.gui.topRight.addChild(speedTxt);
	speedTxt.x = -300; // Offset from right edge
	speedTxt.y = 70; // Below score
	// Boost display
	boostTxt = new Text2('Boost: 0%', {
		size: 60,
		fill: 0xFFFFFF
	});
	boostTxt.anchor.set(0, 0);
	LK.gui.topRight.addChild(boostTxt);
	boostTxt.x = -300; // Offset from right edge
	boostTxt.y = 140; // Below speed
	// Distance display
	distanceTxt = new Text2('Distance: 0m / ' + raceTarget + 'm', {
		size: 60,
		fill: 0xFFFFFF
	});
	distanceTxt.anchor.set(0.5, 0);
	LK.gui.top.addChild(distanceTxt);
	distanceTxt.y = 70; // Below top
}
function updateUI() {
	scoreTxt.setText('Score: ' + LK.getScore());
	speedTxt.setText('Speed: ' + Math.floor(100 * gameSpeed) + ' km/h');
	boostTxt.setText('Boost: ' + player.currentBoost + '%');
	distanceTxt.setText('Distance: ' + Math.floor(distanceTraveled) + 'm / ' + raceTarget + 'm');
}
function spawnTrackElements() {
	spawnCounter++;
	// Spawn track lines
	if (spawnCounter % 20 === 0) {
		for (var j = 0; j < laneCount - 1; j++) {
			var line = new TrackElement().init('line', j, -100);
			trackElements.push(line);
			game.addChild(line);
		}
	}
	// Spawn boost (less frequent)
	if (spawnCounter % 180 === 0) {
		var boostLane = Math.floor(Math.random() * laneCount);
		var boost = new TrackElement().init('boost', boostLane, -100);
		trackElements.push(boost);
		game.addChild(boost);
	}
	// Spawn obstacles (frequency increases with difficulty)
	if (spawnCounter % Math.max(100 - difficultyLevel * 10, 30) === 0) {
		var obstacleLane = Math.floor(Math.random() * laneCount);
		var obstacle = new TrackElement().init('obstacle', obstacleLane, -100);
		trackElements.push(obstacle);
		game.addChild(obstacle);
	}
	// Spawn AI cars
	if (spawnCounter % Math.max(120 - difficultyLevel * 15, 40) === 0) {
		var aiLane = Math.floor(Math.random() * laneCount);
		// Don't spawn in same lane too often
		if (aiCars.length > 0) {
			var lastCar = aiCars[aiCars.length - 1];
			if (lastCar.lane === aiLane && lastCar.y > -1000) {
				aiLane = (aiLane + 1) % laneCount;
			}
		}
		var aiSpeed = Math.random() * 2 + 2 + difficultyLevel * 0.3;
		var ai = new AICar().init(aiLane, -300, aiSpeed);
		aiCars.push(ai);
		game.addChild(ai);
	}
}
function checkCollisions() {
	// Check player collisions with AI cars
	for (var i = 0; i < aiCars.length; i++) {
		var car = aiCars[i];
		if (car.active && player.lane === car.lane) {
			// Check vertical collision
			var playerTop = player.y - player.height / 2;
			var playerBottom = player.y + player.height / 2;
			var carTop = car.y - car.height / 2;
			var carBottom = car.y + car.height / 2;
			if (playerTop < carBottom && playerBottom > carTop) {
				player.crash();
				car.active = false; // Remove the AI car
				LK.setScore(Math.max(0, LK.getScore() - 50)); // Penalty
				break;
			}
		}
	}
	// Check player collisions with track elements
	for (var i = 0; i < trackElements.length; i++) {
		var element = trackElements[i];
		if (element.active && element.type !== 'line') {
			// Only check boost and obstacle elements
			if (player.lane === element.lane) {
				// Check vertical collision
				var playerTop = player.y - player.height / 3; // Smaller collision area
				var playerBottom = player.y + player.height / 3;
				var elementTop = element.y - element.height / 2;
				var elementBottom = element.y + element.height / 2;
				if (playerTop < elementBottom && playerBottom > elementTop) {
					if (element.type === 'boost') {
						// Collect boost
						player.currentBoost = Math.min(player.maxBoost, player.currentBoost + 25);
						LK.getSound('boost').play();
						LK.setScore(LK.getScore() + 20);
					} else if (element.type === 'obstacle') {
						// Hit obstacle
						player.crash();
						LK.setScore(Math.max(0, LK.getScore() - 30));
					}
					element.active = false;
					break;
				}
			}
		}
	}
}
function cleanupInactiveElements() {
	// Clean up track elements
	for (var i = trackElements.length - 1; i >= 0; i--) {
		if (!trackElements[i].active) {
			trackElements[i].destroy();
			trackElements.splice(i, 1);
		}
	}
	// Clean up AI cars
	for (var i = aiCars.length - 1; i >= 0; i--) {
		if (!aiCars[i].active) {
			aiCars[i].destroy();
			aiCars.splice(i, 1);
		}
	}
}
function updateDifficulty() {
	// Increase difficulty based on distance traveled
	difficultyLevel = 1 + Math.floor(distanceTraveled / 200);
	// Cap difficulty at level 10
	if (difficultyLevel > 10) {
		difficultyLevel = 10;
	}
	// Store high score
	if (LK.getScore() > (storage.highScore || 0)) {
		storage.highScore = LK.getScore();
	}
	// Check win condition
	if (distanceTraveled >= raceTarget) {
		LK.showYouWin();
	}
}
// Input handling
game.down = function (x, y, obj) {
	if (!gameStarted) {
		initGame();
		return;
	}
	// Determine tap position and move accordingly
	if (x < 1024) {
		// Left half of screen
		// Move left
		player.moveToLane(Math.max(0, player.lane - 1));
	} else {
		// Right half of screen
		// Move right
		player.moveToLane(Math.min(4, player.lane + 1));
	}
};
// Apply boost on move up
game.up = function (x, y, obj) {
	if (gameStarted && y > 2000) {
		// Only trigger boost for taps in bottom area
		player.applyBoost();
	}
};
// Main game loop
game.update = function () {
	if (!gameStarted) {
		return;
	}
	// Calculate delta time
	var now = Date.now();
	var deltaTime = now - lastUpdate;
	lastUpdate = now;
	// Update distance traveled
	distanceTraveled += deltaTime / 1000 * gameSpeed * 50;
	// Update track elements
	spawnTrackElements();
	// Update all active track elements
	for (var i = 0; i < trackElements.length; i++) {
		trackElements[i].update();
	}
	// Update all active AI cars
	for (var i = 0; i < aiCars.length; i++) {
		aiCars[i].update();
	}
	// Check for collisions
	checkCollisions();
	// Clean up inactive elements
	cleanupInactiveElements();
	// Update difficulty
	updateDifficulty();
	// Update UI
	updateUI();
};
// Initialize the start screen
function initStartScreen() {
	game.setBackgroundColor(0x005500);
	var titleText = new Text2('Formula Speed', {
		size: 120,
		fill: 0xFFFFFF
	});
	titleText.anchor.set(0.5, 0.5);
	titleText.x = 1024;
	titleText.y = 900;
	game.addChild(titleText);
	var subtitleText = new Text2('Grand Prix Challenge', {
		size: 80,
		fill: 0xFFFFFF
	});
	subtitleText.anchor.set(0.5, 0.5);
	subtitleText.x = 1024;
	subtitleText.y = 1020;
	game.addChild(subtitleText);
	var instructionText = new Text2('Tap Left/Right to Change Lanes\nTap Bottom to Use Boost', {
		size: 60,
		fill: 0xFFFFFF
	});
	instructionText.anchor.set(0.5, 0.5);
	instructionText.x = 1024;
	instructionText.y = 1200;
	game.addChild(instructionText);
	// Show high score if available
	if (storage.highScore) {
		var highScoreText = new Text2('High Score: ' + storage.highScore, {
			size: 60,
			fill: 0xFFFFFF
		});
		highScoreText.anchor.set(0.5, 0.5);
		highScoreText.x = 1024;
		highScoreText.y = 1300;
		game.addChild(highScoreText);
	}
	var startText = new Text2('Tap Anywhere to Start', {
		size: 70,
		fill: 0xFFFFFF
	});
	startText.anchor.set(0.5, 0.5);
	startText.x = 1024;
	startText.y = 1450;
	game.addChild(startText);
	// Create a demo car
	var demoCar = LK.getAsset('car', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 1024,
		y: 1700
	});
	game.addChild(demoCar);
	// Animate the demo car
	var _animateDemoCar = function animateDemoCar() {
		tween(demoCar, {
			y: 1650
		}, {
			duration: 1000,
			easing: tween.easeInOut,
			onFinish: function onFinish() {
				tween(demoCar, {
					y: 1750
				}, {
					duration: 1000,
					easing: tween.easeInOut,
					onFinish: _animateDemoCar
				});
			}
		});
	};
	_animateDemoCar();
}
// Start with the intro screen
initStartScreen();