/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
// Coin
var Coin = Container.expand(function () {
	var self = Container.call(this);
	var coin = self.attachAsset('coin', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = coin.width;
	self.height = coin.height;
	self.speed = 28;
	self.lane = 1;
	self.update = function () {
		self.y += self.speed;
	};
	return self;
});
// Enemy Car
var EnemyCar = Container.expand(function () {
	var self = Container.call(this);
	var car = self.attachAsset('enemyCar', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = car.width;
	self.height = car.height;
	self.speed = 28 + Math.random() * 8;
	self.lane = 1;
	self.update = function () {
		self.y += self.speed;
	};
	return self;
});
// Player Car
var PlayerCar = Container.expand(function () {
	var self = Container.call(this);
	var car = self.attachAsset('playerCar', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = car.width;
	self.height = car.height;
	self.lane = 1; // 0: left, 1: center, 2: right
	self.invincible = false;
	self.update = function () {
		// No movement here; handled by input
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x222222
});
/**** 
* Game Code
****/ 
// Road and lanes setup
// Button assets for Start and Choose Car
var roadWidth = 900;
var laneCount = 3;
var laneWidth = roadWidth / laneCount;
var roadX = (2048 - roadWidth) / 2;
var roadY = 0;
// --- Car Selection and Start Menu ---
var carAssetIds = ['playerCar',
// default
'car2', 'car3', 'car4', 'car5', 'car6', 'car7', 'car8'];
// Register 7 more car assets (simple colored boxes for now)
// Store selected car index (default 0)
var selectedCarIndex = 0;
// Overlay containers for menu and car select
var startMenuOverlay = new Container();
var carSelectOverlay = new Container();
// --- Start Menu UI ---
var titleTxt = new Text2('Turbo Car 2', {
	size: 180,
	fill: "#fff"
});
titleTxt.anchor.set(0.5, 0.5);
titleTxt.x = 2048 / 2;
titleTxt.y = 600;
var startBtn = LK.getAsset('startBtnImg', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 1000
});
var startBtnLabel = new Text2('Start', {
	size: 90,
	fill: "#222"
});
startBtnLabel.anchor.set(0.5, 0.5);
startBtnLabel.x = 0;
startBtnLabel.y = 0;
// Move button labels in front of the button images
var chooseCarBtn = LK.getAsset('chooseCarBtnImg', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 1200
});
var chooseCarBtnLabel = new Text2('Choose a Car', {
	size: 70,
	fill: "#222"
});
chooseCarBtnLabel.anchor.set(0.5, 0.5);
chooseCarBtnLabel.x = chooseCarBtn.x;
chooseCarBtnLabel.y = chooseCarBtn.y;
var startBtn = LK.getAsset('startBtnImg', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 1000
});
var startBtnLabel = new Text2('Start', {
	size: 90,
	fill: "#222"
});
startBtnLabel.anchor.set(0.5, 0.5);
startBtnLabel.x = startBtn.x;
startBtnLabel.y = startBtn.y;
startMenuOverlay.addChild(titleTxt);
startMenuOverlay.addChild(startBtn);
startMenuOverlay.addChild(startBtnLabel);
startMenuOverlay.addChild(chooseCarBtn);
startMenuOverlay.addChild(chooseCarBtnLabel);
game.addChild(startMenuOverlay);
// --- Car Selection UI ---
var carSelectTitle = new Text2('Select Your Car', {
	size: 120,
	fill: "#fff"
});
carSelectTitle.anchor.set(0.5, 0.5);
carSelectTitle.x = 2048 / 2;
carSelectTitle.y = 400;
carSelectOverlay.addChild(carSelectTitle);
var carIcons = [];
var carIconY = 800;
var carIconSpacing = 220;
var carIconStartX = 2048 / 2 - (carAssetIds.length - 1) * carIconSpacing / 2;
for (var i = 0; i < carAssetIds.length; i++) {
	var carIcon = LK.getAsset(carAssetIds[i], {
		anchorX: 0.5,
		anchorY: 0.5,
		x: carIconStartX + i * carIconSpacing,
		y: carIconY,
		scaleX: 0.7,
		scaleY: 0.7
	});
	// Highlight border for selected
	carIcon._border = null;
	(function (idx, icon) {
		icon.down = function () {
			// Remove highlight from all
			for (var j = 0; j < carIcons.length; j++) {
				if (carIcons[j]._border) {
					carIcons[j]._border.destroy();
					carIcons[j]._border = null;
				}
			}
			// Add highlight
			var border = LK.getAsset('lane', {
				anchorX: 0.5,
				anchorY: 0.5,
				x: 0,
				y: 0,
				width: icon.width * 1.1,
				height: icon.height * 1.1,
				color: 0xffff00
			});
			// Ensure border is behind the car icon (so nothing gray covers the car)
			icon.addChildAt(border, 0);
			icon._border = border;
			selectedCarIndex = idx;
			// Animate icon to grow a little when selected
			tween(icon, {
				scaleX: 0.9,
				scaleY: 0.9
			}, {
				duration: 180,
				easing: tween.cubicOut
			});
			// Shrink all other icons back to normal
			for (var j = 0; j < carIcons.length; j++) {
				if (carIcons[j] !== icon) {
					tween(carIcons[j], {
						scaleX: 0.7,
						scaleY: 0.7
					}, {
						duration: 180,
						easing: tween.cubicOut
					});
				}
			}
		};
	})(i, carIcon);
	carIcons.push(carIcon);
	carSelectOverlay.addChild(carIcon);
}
// Preselect first car
carIcons[0].down();
// Confirm button
var confirmBtn = new Text2('Confirm', {
	size: 100,
	fill: "#fff"
});
confirmBtn.anchor.set(0.5, 0.5);
confirmBtn.x = 2048 / 2;
confirmBtn.y = carIconY + 300;
carSelectOverlay.addChild(confirmBtn);
// --- Menu Button Handlers ---
startBtn.down = function () {
	// Remove overlays, start game
	if (startMenuOverlay.parent) startMenuOverlay.destroy();
	if (carSelectOverlay.parent) carSelectOverlay.destroy();
	startGame();
};
chooseCarBtn.down = function () {
	if (startMenuOverlay.parent) startMenuOverlay.destroy();
	game.addChild(carSelectOverlay);
};
confirmBtn.down = function () {
	if (carSelectOverlay.parent) carSelectOverlay.destroy();
	game.addChild(startMenuOverlay);
};
// --- Game Start Logic ---
function startGame() {
	// Road background
	var road = LK.getAsset('road', {
		anchorX: 0,
		anchorY: 0,
		x: roadX,
		y: roadY
	});
	game.addChild(road);
	// Lane markers removed
	// Player car
	player = new PlayerCar();
	player.x = roadX + laneWidth * 1.5;
	player.y = 2732 - 400;
	player.setCarAsset(carAssetIds[selectedCarIndex]);
	game.addChild(player);
	// Score and fuel UI
	score = 0;
	distance = 0;
	coinsCollected = 0;
	scoreTxt = new Text2('Score: 0', {
		size: 90,
		fill: "#fff"
	});
	scoreTxt.anchor.set(1, 0); // top right
	scoreTxt.x = 2048 - 100;
	scoreTxt.y = 20;
	LK.gui.top.addChild(scoreTxt);
	// Timer to update score every second
	scoreUpdateTimer = LK.setInterval(function () {
		scoreTxt.setText('Score: ' + score);
	}, 1000);
	// Lane positions
	lanePositions = [roadX + laneWidth * 0.5, roadX + laneWidth * 1.5, roadX + laneWidth * 2.5];
}
// Defensive: ensure lanePositions is always defined before game.update runs
if (typeof lanePositions === "undefined") {
	lanePositions = [roadX + laneWidth * 0.5, roadX + laneWidth * 1.5, roadX + laneWidth * 2.5];
}
// --- Patch PlayerCar to allow dynamic car asset ---
PlayerCar.prototype.setCarAsset = function (assetId) {
	// Remove old asset
	while (this.children.length) this.removeChild(this.children[0]);
	var car = this.attachAsset(assetId, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	this.width = car.width;
	this.height = car.height;
};
// --- Start with menu, not game ---
var player, score, distance, coinsCollected, scoreTxt, scoreUpdateTimer, lanePositions;
// Touch controls
// Use square placeholder assets for left/right buttons (replace 'leftBtnSquare' and 'rightBtnSquare' with your asset ids when available)
var leftBtn = LK.getAsset('leftBtnSquare', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 200,
	y: -250
});
LK.gui.bottomLeft.addChild(leftBtn);
var rightBtn = LK.getAsset('rightBtnSquare', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: -200,
	y: -250
});
LK.gui.bottomRight.addChild(rightBtn);
// Control handlers
leftBtn.down = function () {
	if (typeof player !== "undefined" && player && typeof player.lane !== "undefined" && player.lane > 0) {
		player.lane--;
		tween(player, {
			x: lanePositions[player.lane]
		}, {
			duration: 120,
			easing: tween.cubicOut
		});
	}
};
rightBtn.down = function () {
	if (typeof player !== "undefined" && player && typeof player.lane !== "undefined" && player.lane < laneCount - 1) {
		player.lane++;
		tween(player, {
			x: lanePositions[player.lane]
		}, {
			duration: 120,
			easing: tween.cubicOut
		});
	}
};
// Touch drag to move car left/right
var dragStartX = null;
var dragStartLane = null;
game.down = function (x, y, obj) {
	if (x > roadX && x < roadX + roadWidth && y > 2732 - 700) {
		dragStartX = x;
		dragStartLane = player.lane;
	}
};
game.move = function (x, y, obj) {
	if (dragStartX !== null) {
		var dx = x - dragStartX;
		if (Math.abs(dx) > laneWidth * 0.7) {
			if (dx < 0 && player.lane > 0) {
				player.lane--;
				tween(player, {
					x: lanePositions[player.lane]
				}, {
					duration: 120,
					easing: tween.cubicOut
				});
				dragStartX = x;
				dragStartLane = player.lane;
			} else if (dx > 0 && player.lane < laneCount - 1) {
				player.lane++;
				tween(player, {
					x: lanePositions[player.lane]
				}, {
					duration: 120,
					easing: tween.cubicOut
				});
				dragStartX = x;
				dragStartLane = player.lane;
			}
		}
	}
};
game.up = function (x, y, obj) {
	dragStartX = null;
	dragStartLane = null;
};
// Game objects
var enemies = [];
var coins = [];
// Spawning timers
var enemySpawnTick = 0;
var coinSpawnTick = 0;
// Main game update
game.update = function () {
	// Pause all game logic if car selection overlay is visible
	if (carSelectOverlay.parent) {
		return;
	}
	// Distance
	distance += 1;
	// Update UI
	score = Math.floor(distance / 5) + coinsCollected * 10;
	if (score >= 999) {
		// Stop the score update timer
		if (typeof scoreUpdateTimer !== "undefined") LK.clearInterval(scoreUpdateTimer);
		// Show Congratulations overlay
		var congratsTxt = new Text2('Congratulations', {
			size: 180,
			fill: 0xFFD600
		});
		congratsTxt.anchor.set(0.5, 0.5);
		congratsTxt.x = 2048 / 2;
		congratsTxt.y = 900;
		var playAgainBtn = new Text2('Play Again', {
			size: 120,
			fill: "#fff"
		});
		playAgainBtn.anchor.set(0.5, 0.5);
		playAgainBtn.x = 2048 / 2;
		playAgainBtn.y = 1200;
		// Overlay container
		var overlay = new Container();
		overlay.addChild(congratsTxt);
		overlay.addChild(playAgainBtn);
		game.addChild(overlay);
		playAgainBtn.down = function () {
			// Remove overlay and restart game
			overlay.destroy();
			LK.showGameOver(); // Triggers game reset
		};
		// Pause game logic
		game.update = function () {};
		return;
	}
	// Spawn enemy cars
	enemySpawnTick++;
	if (enemySpawnTick > 38 + Math.random() * 18) {
		enemySpawnTick = 0;
		var enemy = new EnemyCar();
		enemy.lane = Math.floor(Math.random() * laneCount);
		enemy.x = lanePositions[enemy.lane];
		enemy.y = -200;
		enemies.push(enemy);
		game.addChild(enemy);
	}
	// Spawn coins
	coinSpawnTick++;
	if (coinSpawnTick > 80 + Math.random() * 60) {
		coinSpawnTick = 0;
		var coin = new Coin();
		coin.lane = Math.floor(Math.random() * laneCount);
		coin.x = lanePositions[coin.lane];
		coin.y = -120;
		coins.push(coin);
		game.addChild(coin);
	}
	// Update enemies
	for (var i = enemies.length - 1; i >= 0; i--) {
		var e = enemies[i];
		e.update();
		if (e.y > 2732 + 200) {
			e.destroy();
			enemies.splice(i, 1);
			continue;
		}
		// Collision with player
		if (e.intersects(player)) {
			// Turbo Car 2 (enemyCar) hit! Player must dodge it.
			LK.effects.flashObject(player, 0xff0000, 600);
			LK.effects.flashScreen(0xff0000, 800);
			LK.showGameOver();
			return;
		}
	}
	// Update coins
	for (var i = coins.length - 1; i >= 0; i--) {
		var c = coins[i];
		c.update();
		if (c.y > 2732 + 120) {
			c.destroy();
			coins.splice(i, 1);
			continue;
		}
		if (c.intersects(player)) {
			coinsCollected++;
			score = Math.floor(distance / 5) + coinsCollected * 10;
			scoreTxt.setText('Score: ' + score);
			LK.effects.flashObject(player, 0xFFD600, 300);
			c.destroy();
			coins.splice(i, 1);
			continue;
		}
	}
};
// Center UI elements
// scoreTxt is always at top right, do not move it to center
// Prevent UI from overlapping top left menu
// (already handled by not placing anything at gui.topLeft or at x < 100, y < 100) /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
// Coin
var Coin = Container.expand(function () {
	var self = Container.call(this);
	var coin = self.attachAsset('coin', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = coin.width;
	self.height = coin.height;
	self.speed = 28;
	self.lane = 1;
	self.update = function () {
		self.y += self.speed;
	};
	return self;
});
// Enemy Car
var EnemyCar = Container.expand(function () {
	var self = Container.call(this);
	var car = self.attachAsset('enemyCar', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = car.width;
	self.height = car.height;
	self.speed = 28 + Math.random() * 8;
	self.lane = 1;
	self.update = function () {
		self.y += self.speed;
	};
	return self;
});
// Player Car
var PlayerCar = Container.expand(function () {
	var self = Container.call(this);
	var car = self.attachAsset('playerCar', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = car.width;
	self.height = car.height;
	self.lane = 1; // 0: left, 1: center, 2: right
	self.invincible = false;
	self.update = function () {
		// No movement here; handled by input
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x222222
});
/**** 
* Game Code
****/ 
// Road and lanes setup
// Button assets for Start and Choose Car
var roadWidth = 900;
var laneCount = 3;
var laneWidth = roadWidth / laneCount;
var roadX = (2048 - roadWidth) / 2;
var roadY = 0;
// --- Car Selection and Start Menu ---
var carAssetIds = ['playerCar',
// default
'car2', 'car3', 'car4', 'car5', 'car6', 'car7', 'car8'];
// Register 7 more car assets (simple colored boxes for now)
// Store selected car index (default 0)
var selectedCarIndex = 0;
// Overlay containers for menu and car select
var startMenuOverlay = new Container();
var carSelectOverlay = new Container();
// --- Start Menu UI ---
var titleTxt = new Text2('Turbo Car 2', {
	size: 180,
	fill: "#fff"
});
titleTxt.anchor.set(0.5, 0.5);
titleTxt.x = 2048 / 2;
titleTxt.y = 600;
var startBtn = LK.getAsset('startBtnImg', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 1000
});
var startBtnLabel = new Text2('Start', {
	size: 90,
	fill: "#222"
});
startBtnLabel.anchor.set(0.5, 0.5);
startBtnLabel.x = 0;
startBtnLabel.y = 0;
// Move button labels in front of the button images
var chooseCarBtn = LK.getAsset('chooseCarBtnImg', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 1200
});
var chooseCarBtnLabel = new Text2('Choose a Car', {
	size: 70,
	fill: "#222"
});
chooseCarBtnLabel.anchor.set(0.5, 0.5);
chooseCarBtnLabel.x = chooseCarBtn.x;
chooseCarBtnLabel.y = chooseCarBtn.y;
var startBtn = LK.getAsset('startBtnImg', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 1000
});
var startBtnLabel = new Text2('Start', {
	size: 90,
	fill: "#222"
});
startBtnLabel.anchor.set(0.5, 0.5);
startBtnLabel.x = startBtn.x;
startBtnLabel.y = startBtn.y;
startMenuOverlay.addChild(titleTxt);
startMenuOverlay.addChild(startBtn);
startMenuOverlay.addChild(startBtnLabel);
startMenuOverlay.addChild(chooseCarBtn);
startMenuOverlay.addChild(chooseCarBtnLabel);
game.addChild(startMenuOverlay);
// --- Car Selection UI ---
var carSelectTitle = new Text2('Select Your Car', {
	size: 120,
	fill: "#fff"
});
carSelectTitle.anchor.set(0.5, 0.5);
carSelectTitle.x = 2048 / 2;
carSelectTitle.y = 400;
carSelectOverlay.addChild(carSelectTitle);
var carIcons = [];
var carIconY = 800;
var carIconSpacing = 220;
var carIconStartX = 2048 / 2 - (carAssetIds.length - 1) * carIconSpacing / 2;
for (var i = 0; i < carAssetIds.length; i++) {
	var carIcon = LK.getAsset(carAssetIds[i], {
		anchorX: 0.5,
		anchorY: 0.5,
		x: carIconStartX + i * carIconSpacing,
		y: carIconY,
		scaleX: 0.7,
		scaleY: 0.7
	});
	// Highlight border for selected
	carIcon._border = null;
	(function (idx, icon) {
		icon.down = function () {
			// Remove highlight from all
			for (var j = 0; j < carIcons.length; j++) {
				if (carIcons[j]._border) {
					carIcons[j]._border.destroy();
					carIcons[j]._border = null;
				}
			}
			// Add highlight
			var border = LK.getAsset('lane', {
				anchorX: 0.5,
				anchorY: 0.5,
				x: 0,
				y: 0,
				width: icon.width * 1.1,
				height: icon.height * 1.1,
				color: 0xffff00
			});
			// Ensure border is behind the car icon (so nothing gray covers the car)
			icon.addChildAt(border, 0);
			icon._border = border;
			selectedCarIndex = idx;
			// Animate icon to grow a little when selected
			tween(icon, {
				scaleX: 0.9,
				scaleY: 0.9
			}, {
				duration: 180,
				easing: tween.cubicOut
			});
			// Shrink all other icons back to normal
			for (var j = 0; j < carIcons.length; j++) {
				if (carIcons[j] !== icon) {
					tween(carIcons[j], {
						scaleX: 0.7,
						scaleY: 0.7
					}, {
						duration: 180,
						easing: tween.cubicOut
					});
				}
			}
		};
	})(i, carIcon);
	carIcons.push(carIcon);
	carSelectOverlay.addChild(carIcon);
}
// Preselect first car
carIcons[0].down();
// Confirm button
var confirmBtn = new Text2('Confirm', {
	size: 100,
	fill: "#fff"
});
confirmBtn.anchor.set(0.5, 0.5);
confirmBtn.x = 2048 / 2;
confirmBtn.y = carIconY + 300;
carSelectOverlay.addChild(confirmBtn);
// --- Menu Button Handlers ---
startBtn.down = function () {
	// Remove overlays, start game
	if (startMenuOverlay.parent) startMenuOverlay.destroy();
	if (carSelectOverlay.parent) carSelectOverlay.destroy();
	startGame();
};
chooseCarBtn.down = function () {
	if (startMenuOverlay.parent) startMenuOverlay.destroy();
	game.addChild(carSelectOverlay);
};
confirmBtn.down = function () {
	if (carSelectOverlay.parent) carSelectOverlay.destroy();
	game.addChild(startMenuOverlay);
};
// --- Game Start Logic ---
function startGame() {
	// Road background
	var road = LK.getAsset('road', {
		anchorX: 0,
		anchorY: 0,
		x: roadX,
		y: roadY
	});
	game.addChild(road);
	// Lane markers removed
	// Player car
	player = new PlayerCar();
	player.x = roadX + laneWidth * 1.5;
	player.y = 2732 - 400;
	player.setCarAsset(carAssetIds[selectedCarIndex]);
	game.addChild(player);
	// Score and fuel UI
	score = 0;
	distance = 0;
	coinsCollected = 0;
	scoreTxt = new Text2('Score: 0', {
		size: 90,
		fill: "#fff"
	});
	scoreTxt.anchor.set(1, 0); // top right
	scoreTxt.x = 2048 - 100;
	scoreTxt.y = 20;
	LK.gui.top.addChild(scoreTxt);
	// Timer to update score every second
	scoreUpdateTimer = LK.setInterval(function () {
		scoreTxt.setText('Score: ' + score);
	}, 1000);
	// Lane positions
	lanePositions = [roadX + laneWidth * 0.5, roadX + laneWidth * 1.5, roadX + laneWidth * 2.5];
}
// Defensive: ensure lanePositions is always defined before game.update runs
if (typeof lanePositions === "undefined") {
	lanePositions = [roadX + laneWidth * 0.5, roadX + laneWidth * 1.5, roadX + laneWidth * 2.5];
}
// --- Patch PlayerCar to allow dynamic car asset ---
PlayerCar.prototype.setCarAsset = function (assetId) {
	// Remove old asset
	while (this.children.length) this.removeChild(this.children[0]);
	var car = this.attachAsset(assetId, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	this.width = car.width;
	this.height = car.height;
};
// --- Start with menu, not game ---
var player, score, distance, coinsCollected, scoreTxt, scoreUpdateTimer, lanePositions;
// Touch controls
// Use square placeholder assets for left/right buttons (replace 'leftBtnSquare' and 'rightBtnSquare' with your asset ids when available)
var leftBtn = LK.getAsset('leftBtnSquare', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 200,
	y: -250
});
LK.gui.bottomLeft.addChild(leftBtn);
var rightBtn = LK.getAsset('rightBtnSquare', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: -200,
	y: -250
});
LK.gui.bottomRight.addChild(rightBtn);
// Control handlers
leftBtn.down = function () {
	if (typeof player !== "undefined" && player && typeof player.lane !== "undefined" && player.lane > 0) {
		player.lane--;
		tween(player, {
			x: lanePositions[player.lane]
		}, {
			duration: 120,
			easing: tween.cubicOut
		});
	}
};
rightBtn.down = function () {
	if (typeof player !== "undefined" && player && typeof player.lane !== "undefined" && player.lane < laneCount - 1) {
		player.lane++;
		tween(player, {
			x: lanePositions[player.lane]
		}, {
			duration: 120,
			easing: tween.cubicOut
		});
	}
};
// Touch drag to move car left/right
var dragStartX = null;
var dragStartLane = null;
game.down = function (x, y, obj) {
	if (x > roadX && x < roadX + roadWidth && y > 2732 - 700) {
		dragStartX = x;
		dragStartLane = player.lane;
	}
};
game.move = function (x, y, obj) {
	if (dragStartX !== null) {
		var dx = x - dragStartX;
		if (Math.abs(dx) > laneWidth * 0.7) {
			if (dx < 0 && player.lane > 0) {
				player.lane--;
				tween(player, {
					x: lanePositions[player.lane]
				}, {
					duration: 120,
					easing: tween.cubicOut
				});
				dragStartX = x;
				dragStartLane = player.lane;
			} else if (dx > 0 && player.lane < laneCount - 1) {
				player.lane++;
				tween(player, {
					x: lanePositions[player.lane]
				}, {
					duration: 120,
					easing: tween.cubicOut
				});
				dragStartX = x;
				dragStartLane = player.lane;
			}
		}
	}
};
game.up = function (x, y, obj) {
	dragStartX = null;
	dragStartLane = null;
};
// Game objects
var enemies = [];
var coins = [];
// Spawning timers
var enemySpawnTick = 0;
var coinSpawnTick = 0;
// Main game update
game.update = function () {
	// Pause all game logic if car selection overlay is visible
	if (carSelectOverlay.parent) {
		return;
	}
	// Distance
	distance += 1;
	// Update UI
	score = Math.floor(distance / 5) + coinsCollected * 10;
	if (score >= 999) {
		// Stop the score update timer
		if (typeof scoreUpdateTimer !== "undefined") LK.clearInterval(scoreUpdateTimer);
		// Show Congratulations overlay
		var congratsTxt = new Text2('Congratulations', {
			size: 180,
			fill: 0xFFD600
		});
		congratsTxt.anchor.set(0.5, 0.5);
		congratsTxt.x = 2048 / 2;
		congratsTxt.y = 900;
		var playAgainBtn = new Text2('Play Again', {
			size: 120,
			fill: "#fff"
		});
		playAgainBtn.anchor.set(0.5, 0.5);
		playAgainBtn.x = 2048 / 2;
		playAgainBtn.y = 1200;
		// Overlay container
		var overlay = new Container();
		overlay.addChild(congratsTxt);
		overlay.addChild(playAgainBtn);
		game.addChild(overlay);
		playAgainBtn.down = function () {
			// Remove overlay and restart game
			overlay.destroy();
			LK.showGameOver(); // Triggers game reset
		};
		// Pause game logic
		game.update = function () {};
		return;
	}
	// Spawn enemy cars
	enemySpawnTick++;
	if (enemySpawnTick > 38 + Math.random() * 18) {
		enemySpawnTick = 0;
		var enemy = new EnemyCar();
		enemy.lane = Math.floor(Math.random() * laneCount);
		enemy.x = lanePositions[enemy.lane];
		enemy.y = -200;
		enemies.push(enemy);
		game.addChild(enemy);
	}
	// Spawn coins
	coinSpawnTick++;
	if (coinSpawnTick > 80 + Math.random() * 60) {
		coinSpawnTick = 0;
		var coin = new Coin();
		coin.lane = Math.floor(Math.random() * laneCount);
		coin.x = lanePositions[coin.lane];
		coin.y = -120;
		coins.push(coin);
		game.addChild(coin);
	}
	// Update enemies
	for (var i = enemies.length - 1; i >= 0; i--) {
		var e = enemies[i];
		e.update();
		if (e.y > 2732 + 200) {
			e.destroy();
			enemies.splice(i, 1);
			continue;
		}
		// Collision with player
		if (e.intersects(player)) {
			// Turbo Car 2 (enemyCar) hit! Player must dodge it.
			LK.effects.flashObject(player, 0xff0000, 600);
			LK.effects.flashScreen(0xff0000, 800);
			LK.showGameOver();
			return;
		}
	}
	// Update coins
	for (var i = coins.length - 1; i >= 0; i--) {
		var c = coins[i];
		c.update();
		if (c.y > 2732 + 120) {
			c.destroy();
			coins.splice(i, 1);
			continue;
		}
		if (c.intersects(player)) {
			coinsCollected++;
			score = Math.floor(distance / 5) + coinsCollected * 10;
			scoreTxt.setText('Score: ' + score);
			LK.effects.flashObject(player, 0xFFD600, 300);
			c.destroy();
			coins.splice(i, 1);
			continue;
		}
	}
};
// Center UI elements
// scoreTxt is always at top right, do not move it to center
// Prevent UI from overlapping top left menu
// (already handled by not placing anything at gui.topLeft or at x < 100, y < 100)
:quality(85)/https://cdn.frvr.ai/683694c254647d6c59547ae4.png%3F3) 
 Make me a coin 2d pixel. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/683695dd54647d6c59547af3.png%3F3) 
 Draw 2d pixel car top view Red. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/6836963654647d6c59547afe.png%3F3) 
 Draw 2d pixel car top view Blue. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/68370c2013e58e39d8f92cdc.png%3F3) 
 draw a left facing 2d pixel game button. Yellow. Like this ▶️. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/68370de6026bcba281868b19.png%3F3) 
 Try to do this photo again
:quality(85)/https://cdn.frvr.ai/68370e1f026bcba281868b25.png%3F3) 
 Do this again but green
:quality(85)/https://cdn.frvr.ai/683b527bfa33db3c293081e9.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/683b533dfa33db3c29308206.png%3F3) 
 Without background
:quality(85)/https://cdn.frvr.ai/683b55bffa33db3c29308238.png%3F3) 
 Without background
:quality(85)/https://cdn.frvr.ai/683b570efa33db3c29308281.png%3F3) 
 Without background
:quality(85)/https://cdn.frvr.ai/683b584cfa33db3c293082af.png%3F3) 
 Without background
:quality(85)/https://cdn.frvr.ai/683b59e9fa33db3c293082da.png%3F3) 
 Without background
:quality(85)/https://cdn.frvr.ai/683b5a9afa33db3c293082ee.png%3F3) 
 Without background
:quality(85)/https://cdn.frvr.ai/683b5bacfa33db3c2930830c.png%3F3) 
 Without background
:quality(85)/https://cdn.frvr.ai/683b5c38fa33db3c29308323.png%3F3) 
 Without background
:quality(85)/https://cdn.frvr.ai/683b5ea3fa33db3c29308387.png%3F3) 
 Make this pixel 2d