/**** 
* 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)
 Make me a coin 2d pixel. In-Game asset. 2d. High contrast. No shadows
 Draw 2d pixel car top view Red. In-Game asset. 2d. High contrast. No shadows
 Draw 2d pixel car top view Blue. In-Game asset. 2d. High contrast. No shadows
 draw a left facing 2d pixel game button. Yellow. Like this ▶️. In-Game asset. 2d. High contrast. No shadows
 Try to do this photo again
 Do this again but green
 
 Without background
 Without background
 Without background
 Without background
 Without background
 Without background
 Without background
 Without background
 Make this pixel 2d