/**** 
* Classes
****/ 
// Bulb class to represent the bulb on the tree
var Bulb = Container.expand(function () {
	var self = Container.call(this);
	var bulbGraphics = self.attachAsset('bulb', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
// Car class to represent the car
var Car = Container.expand(function () {
	var self = Container.call(this);
	var carGraphics = self.attachAsset('car', {
		anchorX: 0.5,
		anchorY: -0.333
	});
});
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
// Road class to represent the road
var Road = Container.expand(function () {
	var self = Container.call(this);
	var roadGraphics = self.attachAsset('road', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: -50
	});
	self.speed = 4;
	self.update = function () {
		if (self.speed !== 0) {
			// Only update position if speed is not zero
			self.y += self.speed;
			if (self.y > 2732) {
				self.y = -50 / 4; // Decrease the distance between two roads to half the current distance
			}
		}
		self.lastY = self.y; // Track last Y position for optimization
	};
});
// SteeringWheel class to represent the steering wheel
var SteeringWheel = Container.expand(function () {
	var self = Container.call(this);
	var steeringWheelGraphics = self.attachAsset('steeringWheel', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.down = function (x, y, obj) {
		if (obj.target === self) {
			dragNode = self; // Set the steering wheel as the node to be dragged
			drifting = true; // Set the drifting variable to true
			LK.playMusic('drift', {
				loop: true
			}); // Play the drift sound in loop
		}
	};
});
// Tree class to represent the pine tree
var Tree = Container.expand(function () {
	var self = Container.call(this);
	var treeGraphics = self.attachAsset('tree', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.lightsOn = false;
	self.speed = 4;
	// Function to turn on the lights
	self.turnOnLights = function () {
		if (!self.lightsOn) {
			self.lightsOn = true;
			LK.effects.flashObject(self, 0xffff00, 1000); // Flash the tree with yellow light
		}
	};
	self.update = function () {
		if (self.speed !== 0) {
			// Only update position if speed is not zero
			self.y += self.speed;
			if (self.y > 2732) {
				self.y = -50 / 4; // Decrease the distance between two trees to half the current distance
				self.lightsOn = false;
			}
		}
		self.lastY = self.y; // Track last Y position for optimization
		// Add a bulb to the tree only if the car has completed a round around the tree and the lights are not already on
		if (roundCompleted && !self.lightsOn && car.y < self.y) {
			// Delay the first tree by 3 seconds
			LK.setTimeout(function () {
				var bulb = self.addChild(new Bulb());
				bulb.x = 0;
				bulb.y = 0;
				self.lightsOn = true; // Set the lightsOn variable to true
				roundCompleted = false; // Reset the 'roundCompleted' variable
			}, 3000);
		}
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000 //Init game with black background 
});
/**** 
* Game Code
****/ 
game.move = function (x, y, obj) {
	if (dragNode) {
		var angle = Math.atan2(y - steeringWheel.y, x - steeringWheel.x); // Calculate angle between steering wheel and current mouse position
		steeringWheel.rotation = angle - Math.PI / 2; // Adjust steering wheel rotation to face the drag direction correctly
	}
};
var road = game.addChild(new Road());
road.x = 1024;
road.y = 1366;
var tree; // Define tree in the global scope
LK.setTimeout(function () {
	tree = game.addChild(new Tree());
	tree.x = 1024;
	tree.y = -tree.height;
}, 2000);
// Define dragNode in the global scope
var dragNode = null;
// Define a variable to track if the car is drifting or not
var drifting = false;
// Define a variable to track if the car has completed a round around the tree
var roundCompleted = false;
// Create an instance of the car and add it to the game
var car = game.addChild(new Car());
car.x = 1024;
car.y = 1366 + 444 - 200;
// Add the steering wheel to the game
var steeringWheel = game.addChild(new SteeringWheel());
steeringWheel.x = 0 + steeringWheel.width / 2;
steeringWheel.y = 2732 - steeringWheel.height / 2;
// Update function for the game
game.update = function () {
	// Syncronise the car rotation to the steeringWheel rotation if the car is drifting
	if (drifting) {
		car.rotation = steeringWheel.rotation;
		// Check if the car has completed a round around the tree
		if (tree && car.y <= tree.y + tree.height && car.y >= tree.y - tree.height && car.x <= tree.x + tree.width && car.x >= tree.x - tree.width) {
			roundCompleted = true;
		}
	}
	if (tree) {
		tree.update();
	}
	// Collision detection between car and tree
	if (car.lastWasIntersecting === false && car.intersects(tree)) {
		// Handle collision event, e.g., stop the car or trigger an effect
		LK.effects.flashScreen(0xff0000, 1000); // Flash screen red for 1 second
		road.speed = 0; // Stop the road movement
		tree.speed = 0; // Stop the tree movement
		drifting = false; // Stop the car from drifting
		LK.stopMusic(); // Stop the drift sound
		LK.showGameOver(); // Trigger game over
	}
	// Update last known intersection state
	car.lastWasIntersecting = car.intersects(tree);
	road.update();
	car.lastX = car.x; // Track last X position for optimization
	car.lastY = car.y; // Track last Y position for optimization
	car.lastWasIntersecting = false; // Initialize lastWasIntersecting for collision detection
};
// Event listeners for touch controls
game.down = function (x, y, obj) {
	if (obj.target === handbrake) {
		road.speed = 0; // Stop the road movement
		tree.speed = 0; // Stop the tree movement
		drifting = false; // Stop the car from drifting
		LK.stopMusic(); // Stop the drift sound
		road.lastY = road.y; // Track last Y position for road
		tree.lastY = tree.y; // Track last Y position for tree
	}
};
// Add the handbrake to the game
var handbrake = game.addChild(LK.getAsset('handbrake', {
	anchorX: 0.5,
	anchorY: 0.5
}));
handbrake.x = 2048 - handbrake.width / 2;
handbrake.y = 2732 - handbrake.height / 2;
game.up = function (x, y, obj) {
	if (obj.target === handbrake) {
		road.speed = 4; // Resume the road movement
		tree.speed = 4; // Resume the tree movement
		drifting = true; // Allow the car to drift again
		LK.playMusic('drift', {
			loop: true
		}); // Play the drift sound in loop
		road.lastY = road.y; // Track last Y position for road
		tree.lastY = tree.y; // Track last Y position for tree
	} else if (obj.target === steeringWheel) {
		dragNode = null; // Stop the steering wheel rotation
	}
}; /**** 
* Classes
****/ 
// Bulb class to represent the bulb on the tree
var Bulb = Container.expand(function () {
	var self = Container.call(this);
	var bulbGraphics = self.attachAsset('bulb', {
		anchorX: 0.5,
		anchorY: 0.5
	});
});
// Car class to represent the car
var Car = Container.expand(function () {
	var self = Container.call(this);
	var carGraphics = self.attachAsset('car', {
		anchorX: 0.5,
		anchorY: -0.333
	});
});
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
// Road class to represent the road
var Road = Container.expand(function () {
	var self = Container.call(this);
	var roadGraphics = self.attachAsset('road', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: -50
	});
	self.speed = 4;
	self.update = function () {
		if (self.speed !== 0) {
			// Only update position if speed is not zero
			self.y += self.speed;
			if (self.y > 2732) {
				self.y = -50 / 4; // Decrease the distance between two roads to half the current distance
			}
		}
		self.lastY = self.y; // Track last Y position for optimization
	};
});
// SteeringWheel class to represent the steering wheel
var SteeringWheel = Container.expand(function () {
	var self = Container.call(this);
	var steeringWheelGraphics = self.attachAsset('steeringWheel', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.down = function (x, y, obj) {
		if (obj.target === self) {
			dragNode = self; // Set the steering wheel as the node to be dragged
			drifting = true; // Set the drifting variable to true
			LK.playMusic('drift', {
				loop: true
			}); // Play the drift sound in loop
		}
	};
});
// Tree class to represent the pine tree
var Tree = Container.expand(function () {
	var self = Container.call(this);
	var treeGraphics = self.attachAsset('tree', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.lightsOn = false;
	self.speed = 4;
	// Function to turn on the lights
	self.turnOnLights = function () {
		if (!self.lightsOn) {
			self.lightsOn = true;
			LK.effects.flashObject(self, 0xffff00, 1000); // Flash the tree with yellow light
		}
	};
	self.update = function () {
		if (self.speed !== 0) {
			// Only update position if speed is not zero
			self.y += self.speed;
			if (self.y > 2732) {
				self.y = -50 / 4; // Decrease the distance between two trees to half the current distance
				self.lightsOn = false;
			}
		}
		self.lastY = self.y; // Track last Y position for optimization
		// Add a bulb to the tree only if the car has completed a round around the tree and the lights are not already on
		if (roundCompleted && !self.lightsOn && car.y < self.y) {
			// Delay the first tree by 3 seconds
			LK.setTimeout(function () {
				var bulb = self.addChild(new Bulb());
				bulb.x = 0;
				bulb.y = 0;
				self.lightsOn = true; // Set the lightsOn variable to true
				roundCompleted = false; // Reset the 'roundCompleted' variable
			}, 3000);
		}
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000 //Init game with black background 
});
/**** 
* Game Code
****/ 
game.move = function (x, y, obj) {
	if (dragNode) {
		var angle = Math.atan2(y - steeringWheel.y, x - steeringWheel.x); // Calculate angle between steering wheel and current mouse position
		steeringWheel.rotation = angle - Math.PI / 2; // Adjust steering wheel rotation to face the drag direction correctly
	}
};
var road = game.addChild(new Road());
road.x = 1024;
road.y = 1366;
var tree; // Define tree in the global scope
LK.setTimeout(function () {
	tree = game.addChild(new Tree());
	tree.x = 1024;
	tree.y = -tree.height;
}, 2000);
// Define dragNode in the global scope
var dragNode = null;
// Define a variable to track if the car is drifting or not
var drifting = false;
// Define a variable to track if the car has completed a round around the tree
var roundCompleted = false;
// Create an instance of the car and add it to the game
var car = game.addChild(new Car());
car.x = 1024;
car.y = 1366 + 444 - 200;
// Add the steering wheel to the game
var steeringWheel = game.addChild(new SteeringWheel());
steeringWheel.x = 0 + steeringWheel.width / 2;
steeringWheel.y = 2732 - steeringWheel.height / 2;
// Update function for the game
game.update = function () {
	// Syncronise the car rotation to the steeringWheel rotation if the car is drifting
	if (drifting) {
		car.rotation = steeringWheel.rotation;
		// Check if the car has completed a round around the tree
		if (tree && car.y <= tree.y + tree.height && car.y >= tree.y - tree.height && car.x <= tree.x + tree.width && car.x >= tree.x - tree.width) {
			roundCompleted = true;
		}
	}
	if (tree) {
		tree.update();
	}
	// Collision detection between car and tree
	if (car.lastWasIntersecting === false && car.intersects(tree)) {
		// Handle collision event, e.g., stop the car or trigger an effect
		LK.effects.flashScreen(0xff0000, 1000); // Flash screen red for 1 second
		road.speed = 0; // Stop the road movement
		tree.speed = 0; // Stop the tree movement
		drifting = false; // Stop the car from drifting
		LK.stopMusic(); // Stop the drift sound
		LK.showGameOver(); // Trigger game over
	}
	// Update last known intersection state
	car.lastWasIntersecting = car.intersects(tree);
	road.update();
	car.lastX = car.x; // Track last X position for optimization
	car.lastY = car.y; // Track last Y position for optimization
	car.lastWasIntersecting = false; // Initialize lastWasIntersecting for collision detection
};
// Event listeners for touch controls
game.down = function (x, y, obj) {
	if (obj.target === handbrake) {
		road.speed = 0; // Stop the road movement
		tree.speed = 0; // Stop the tree movement
		drifting = false; // Stop the car from drifting
		LK.stopMusic(); // Stop the drift sound
		road.lastY = road.y; // Track last Y position for road
		tree.lastY = tree.y; // Track last Y position for tree
	}
};
// Add the handbrake to the game
var handbrake = game.addChild(LK.getAsset('handbrake', {
	anchorX: 0.5,
	anchorY: 0.5
}));
handbrake.x = 2048 - handbrake.width / 2;
handbrake.y = 2732 - handbrake.height / 2;
game.up = function (x, y, obj) {
	if (obj.target === handbrake) {
		road.speed = 4; // Resume the road movement
		tree.speed = 4; // Resume the tree movement
		drifting = true; // Allow the car to drift again
		LK.playMusic('drift', {
			loop: true
		}); // Play the drift sound in loop
		road.lastY = road.y; // Track last Y position for road
		tree.lastY = tree.y; // Track last Y position for tree
	} else if (obj.target === steeringWheel) {
		dragNode = null; // Stop the steering wheel rotation
	}
};