/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
var EnemyCar = Container.expand(function () {
	var self = Container.call(this);
	var carTypes = ['enemyCar1', 'enemyCar2', 'enemyCar3', 'enemyCar4', 'enemyCar5', 'enemyCar6'];
	var randomType = carTypes[Math.floor(Math.random() * carTypes.length)];
	var carGraphics = self.attachAsset(randomType, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 8 + Math.random() * 6;
	self.update = function () {
		self.y += self.speed * gameSpeedMultiplier;
	};
	return self;
});
var PlayerCar = Container.expand(function () {
	var self = Container.call(this);
	var carGraphics = self.attachAsset('playerCar', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.targetX = 1024;
	self.update = function () {
		var diff = self.targetX - self.x;
		self.x += diff * 0.15;
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x34495e
});
/**** 
* Game Code
****/ 
var gameSpeedMultiplier = 1;
var enemyCars = [];
var lastSpawnTime = 0;
var spawnInterval = 1000;
var gameStartTime = LK.ticks;
var speedIncreaseInterval = 600;
var lastSpeedIncrease = 0;
// Create road background
var roadBg = game.addChild(LK.getAsset('road', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 1024,
	y: 1366,
	scaleY: 9
}));
// Create lane dividers
var lanes = [512, 1024, 1536];
for (var i = 0; i < lanes.length - 1; i++) {
	var laneDivider = game.addChild(LK.getAsset('lane', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: lanes[i] + (lanes[i + 1] - lanes[i]) / 2,
		y: 1366,
		alpha: 0.5
	}));
}
// Create player car
var player = game.addChild(new PlayerCar());
player.x = 1024;
player.y = 2400;
player.targetX = 1024;
// Create score display
var scoreTxt = new Text2('0', {
	size: 80,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Speed indicator
var speedTxt = new Text2('Speed: 1x', {
	size: 60,
	fill: 0xFFFFFF
});
speedTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(speedTxt);
var dragNode = null;
function handleMove(x, y, obj) {
	if (dragNode) {
		var lanes = [512, 1024, 1536];
		var closestLane = lanes[0];
		var minDistance = Math.abs(x - lanes[0]);
		for (var i = 1; i < lanes.length; i++) {
			var distance = Math.abs(x - lanes[i]);
			if (distance < minDistance) {
				minDistance = distance;
				closestLane = lanes[i];
			}
		}
		dragNode.targetX = closestLane;
	}
}
game.move = handleMove;
game.down = function (x, y, obj) {
	dragNode = player;
	handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
	dragNode = null;
};
function spawnEnemyCar() {
	var lanes = [512, 1024, 1536];
	var randomLane = lanes[Math.floor(Math.random() * lanes.length)];
	var enemyCar = new EnemyCar();
	enemyCar.x = randomLane;
	enemyCar.y = -100;
	enemyCar.lastY = enemyCar.y;
	enemyCar.lastIntersecting = false;
	enemyCars.push(enemyCar);
	game.addChild(enemyCar);
}
game.update = function () {
	var currentTime = LK.ticks;
	// Update score based on survival time
	var score = Math.floor((currentTime - gameStartTime) / 60);
	LK.setScore(score);
	scoreTxt.setText('Score: ' + LK.getScore());
	// Increase game speed every 10 seconds
	if (currentTime - lastSpeedIncrease > speedIncreaseInterval) {
		gameSpeedMultiplier += 0.3;
		lastSpeedIncrease = currentTime;
		speedTxt.setText('Speed: ' + gameSpeedMultiplier.toFixed(1) + 'x');
		// Decrease spawn interval to increase difficulty
		spawnInterval = Math.max(400, spawnInterval - 50);
	}
	// Spawn enemy cars
	if (currentTime - lastSpawnTime > spawnInterval / gameSpeedMultiplier) {
		spawnEnemyCar();
		lastSpawnTime = currentTime;
	}
	// Update enemy cars and check for collisions/cleanup
	for (var i = enemyCars.length - 1; i >= 0; i--) {
		var enemyCar = enemyCars[i];
		// Initialize last states if needed
		if (enemyCar.lastY === undefined) enemyCar.lastY = enemyCar.y;
		if (enemyCar.lastIntersecting === undefined) enemyCar.lastIntersecting = false;
		// Check if car went off screen
		if (enemyCar.lastY <= 2800 && enemyCar.y > 2800) {
			enemyCar.destroy();
			enemyCars.splice(i, 1);
			continue;
		}
		// Check for collision with player
		var currentIntersecting = enemyCar.intersects(player);
		if (!enemyCar.lastIntersecting && currentIntersecting) {
			// Collision detected!
			LK.getSound('crash').play();
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
			return;
		}
		// Update last states
		enemyCar.lastY = enemyCar.y;
		enemyCar.lastIntersecting = currentIntersecting;
	}
};
// Start background music
LK.playMusic('bgmusic'); /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
var EnemyCar = Container.expand(function () {
	var self = Container.call(this);
	var carTypes = ['enemyCar1', 'enemyCar2', 'enemyCar3', 'enemyCar4', 'enemyCar5', 'enemyCar6'];
	var randomType = carTypes[Math.floor(Math.random() * carTypes.length)];
	var carGraphics = self.attachAsset(randomType, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 8 + Math.random() * 6;
	self.update = function () {
		self.y += self.speed * gameSpeedMultiplier;
	};
	return self;
});
var PlayerCar = Container.expand(function () {
	var self = Container.call(this);
	var carGraphics = self.attachAsset('playerCar', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.targetX = 1024;
	self.update = function () {
		var diff = self.targetX - self.x;
		self.x += diff * 0.15;
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x34495e
});
/**** 
* Game Code
****/ 
var gameSpeedMultiplier = 1;
var enemyCars = [];
var lastSpawnTime = 0;
var spawnInterval = 1000;
var gameStartTime = LK.ticks;
var speedIncreaseInterval = 600;
var lastSpeedIncrease = 0;
// Create road background
var roadBg = game.addChild(LK.getAsset('road', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 1024,
	y: 1366,
	scaleY: 9
}));
// Create lane dividers
var lanes = [512, 1024, 1536];
for (var i = 0; i < lanes.length - 1; i++) {
	var laneDivider = game.addChild(LK.getAsset('lane', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: lanes[i] + (lanes[i + 1] - lanes[i]) / 2,
		y: 1366,
		alpha: 0.5
	}));
}
// Create player car
var player = game.addChild(new PlayerCar());
player.x = 1024;
player.y = 2400;
player.targetX = 1024;
// Create score display
var scoreTxt = new Text2('0', {
	size: 80,
	fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Speed indicator
var speedTxt = new Text2('Speed: 1x', {
	size: 60,
	fill: 0xFFFFFF
});
speedTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(speedTxt);
var dragNode = null;
function handleMove(x, y, obj) {
	if (dragNode) {
		var lanes = [512, 1024, 1536];
		var closestLane = lanes[0];
		var minDistance = Math.abs(x - lanes[0]);
		for (var i = 1; i < lanes.length; i++) {
			var distance = Math.abs(x - lanes[i]);
			if (distance < minDistance) {
				minDistance = distance;
				closestLane = lanes[i];
			}
		}
		dragNode.targetX = closestLane;
	}
}
game.move = handleMove;
game.down = function (x, y, obj) {
	dragNode = player;
	handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
	dragNode = null;
};
function spawnEnemyCar() {
	var lanes = [512, 1024, 1536];
	var randomLane = lanes[Math.floor(Math.random() * lanes.length)];
	var enemyCar = new EnemyCar();
	enemyCar.x = randomLane;
	enemyCar.y = -100;
	enemyCar.lastY = enemyCar.y;
	enemyCar.lastIntersecting = false;
	enemyCars.push(enemyCar);
	game.addChild(enemyCar);
}
game.update = function () {
	var currentTime = LK.ticks;
	// Update score based on survival time
	var score = Math.floor((currentTime - gameStartTime) / 60);
	LK.setScore(score);
	scoreTxt.setText('Score: ' + LK.getScore());
	// Increase game speed every 10 seconds
	if (currentTime - lastSpeedIncrease > speedIncreaseInterval) {
		gameSpeedMultiplier += 0.3;
		lastSpeedIncrease = currentTime;
		speedTxt.setText('Speed: ' + gameSpeedMultiplier.toFixed(1) + 'x');
		// Decrease spawn interval to increase difficulty
		spawnInterval = Math.max(400, spawnInterval - 50);
	}
	// Spawn enemy cars
	if (currentTime - lastSpawnTime > spawnInterval / gameSpeedMultiplier) {
		spawnEnemyCar();
		lastSpawnTime = currentTime;
	}
	// Update enemy cars and check for collisions/cleanup
	for (var i = enemyCars.length - 1; i >= 0; i--) {
		var enemyCar = enemyCars[i];
		// Initialize last states if needed
		if (enemyCar.lastY === undefined) enemyCar.lastY = enemyCar.y;
		if (enemyCar.lastIntersecting === undefined) enemyCar.lastIntersecting = false;
		// Check if car went off screen
		if (enemyCar.lastY <= 2800 && enemyCar.y > 2800) {
			enemyCar.destroy();
			enemyCars.splice(i, 1);
			continue;
		}
		// Check for collision with player
		var currentIntersecting = enemyCar.intersects(player);
		if (!enemyCar.lastIntersecting && currentIntersecting) {
			// Collision detected!
			LK.getSound('crash').play();
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
			return;
		}
		// Update last states
		enemyCar.lastY = enemyCar.y;
		enemyCar.lastIntersecting = currentIntersecting;
	}
};
// Start background music
LK.playMusic('bgmusic');