/**** 
* Classes
****/ 
// Define the BackgroundContainer class
var BackgroundContainer = Container.expand(function () {
	var self = Container.call(this);
	var backgroundGraphics1 = self.attachAsset('background', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2048 / 2732,
		scaleY: 2732 / 2732
	});
	backgroundGraphics1.x = 2048 / 2;
	backgroundGraphics1.y = 2732 / 2;
	var backgroundGraphics2 = self.attachAsset('background', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2048 / 2732,
		scaleY: 2732 / 2732
	});
	backgroundGraphics2.x = 2048 / 2;
	backgroundGraphics2.y = -2732 / 2;
	self.backgroundGraphics1 = backgroundGraphics1;
	self.backgroundGraphics2 = backgroundGraphics2;
	self.update = function () {
		if (gameStarted) {
			self.backgroundGraphics1.y -= backgroundSpeed;
			self.backgroundGraphics2.y -= backgroundSpeed;
			backgroundSpeed += backgroundAcceleration;
		}
		// Ensure backgrounds stay within bounds after jump movement
		if (self.backgroundGraphics1.y > 2732 / 2) {
			self.backgroundGraphics1.y = self.backgroundGraphics2.y - 2732;
		}
		if (self.backgroundGraphics2.y > 2732 / 2) {
			self.backgroundGraphics2.y = self.backgroundGraphics1.y - 2732;
		}
		if (self.backgroundGraphics1.y <= -2732 / 2) {
			self.backgroundGraphics1.y = self.backgroundGraphics2.y + 2732;
		}
		if (self.backgroundGraphics2.y <= -2732 / 2) {
			self.backgroundGraphics2.y = self.backgroundGraphics1.y + 2732;
		}
	};
	return self;
});
var Booster = Container.expand(function () {
	var self = Container.call(this);
	var boosterGraphics = self.attachAsset('booster', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = boosterGraphics.width;
	self.height = boosterGraphics.height;
	self.speed = 2;
	self.update = function () {
		self.speed += 0.05; // Acceleration
		self.y += self.speed;
		if (self.y > 2732 + self.height / 2) {
			self.destroy();
		}
	};
	return self;
});
// Define the Coin class
var Coin = Container.expand(function () {
	var self = Container.call(this);
	var coinGraphics = self.attachAsset('coin', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = coinGraphics.width;
	self.height = coinGraphics.height;
	self.speed = 2;
	self.animationFrames = [LK.getAsset('coin', {
		anchorX: 0.5,
		anchorY: 0.5
	}), LK.getAsset('coin_2', {
		anchorX: 0.5,
		anchorY: 0.5
	}), LK.getAsset('coin_3', {
		anchorX: 0.5,
		anchorY: 0.5
	}), LK.getAsset('coin_2', {
		anchorX: 0.5,
		anchorY: 0.5
	})];
	self.currentFrame = 0;
	self.frameDuration = 144; // 300 milliseconds per frame
	self.lastFrameChange = Date.now();
	self.update = function () {
		self.speed += 0.05; // Acceleration
		self.y += self.speed;
		// Handle animation frame change
		if (Date.now() - self.lastFrameChange >= self.frameDuration) {
			self.currentFrame = (self.currentFrame + 1) % self.animationFrames.length;
			self.removeChildAt(0);
			self.addChild(self.animationFrames[self.currentFrame]);
			self.lastFrameChange = Date.now();
		}
		if (self.y > 2732 + self.height / 2) {
			self.destroy();
		}
	};
	return self;
});
// Define the ForegroundContainer class
var ForegroundContainer = Container.expand(function () {
	var self = Container.call(this);
	return self;
});
// Define the MidgroundContainer class
var MidgroundContainer = Container.expand(function () {
	var self = Container.call(this);
	return self;
});
// Define the Obstacle class
var Obstacle = Container.expand(function () {
	var self = Container.call(this);
	var obstacleGraphics = self.attachAsset('obstacle', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = obstacleGraphics.width;
	self.height = obstacleGraphics.height;
	self.speed = 5;
	self.rotationSpeed = Math.random() < 0.5 ? 0.03 : -0.03; // Randomly decide rotation direction
	self.update = function () {
		self.speed += 0.2; // Acceleration
		self.y += self.speed;
		self.rotation += self.rotationSpeed; // Add rotation
		if (self.y > 2732 + self.height / 2) {
			self.destroy();
		}
	};
	return self;
});
var Platform = Container.expand(function () {
	var self = Container.call(this);
	var platformGraphics = self.attachAsset('platform', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = platformGraphics.width;
	self.height = platformGraphics.height;
	self.update = function () {
		if (gameStarted) {
			self.y += 30;
			if (self.y > 2732 + self.height / 2) {
				self.destroy();
			}
		}
	};
	return self;
});
//<Assets used in the game will automatically appear here>
// Define the Player class
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	playerGraphics.visible = false;
	var playerIdleGraphics = self.attachAsset('player_idle', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	playerIdleGraphics.visible = true;
	self.playerWidth = playerGraphics.width;
	self.playerHeight = playerGraphics.height;
	self.playerIdleWidth = playerIdleGraphics.width;
	self.playerIdleHeight = playerIdleGraphics.height;
	self.speed = playerHorizontalSpeed;
	self.slidingSpeed = playerSlidingSpeed; // Add sliding speed property
	self.direction = 1; // 1: right, -1: left
	self.isTouchingWall = true; // true: player is touching a wall, false: player is in mid air
	self.update = function () {
		if (gameStarted) {
			if (!self.isBlinking) {
				self.alpha = self.immune > 0 ? 0.5 : 1;
			}
			if (self.direction === -1 && self.x > self.playerWidth / 2 - 60) {
				self.x -= self.speed;
				if (self.x <= self.playerWidth / 2 - 60) {
					self.x = self.playerWidth / 2 - 60; // Prevent the player from going past the left edge of the screen
					self.isTouchingWall = true;
					playerGraphics.scale.x = -1; // Flip the player's x axis
				}
			} else if (self.direction === 1 && self.x < 2048 - self.playerWidth / 2 + 60) {
				self.x += self.speed;
				if (self.x >= 2048 - self.playerWidth / 2 + 60) {
					self.x = 2048 - self.playerWidth / 2 + 60; // Prevent the player from going past the right edge of the screen
					self.isTouchingWall = true;
					playerGraphics.scale.x = 1; // Flip the player's x axis back to its original state
				}
			}
			self.y += self.verticalSpeed; // Apply the vertical speed to the player's position
			if (self.y < 0) {
				// Prevent the player from going off the top of the screen
				self.y = 0;
				self.verticalSpeed = 0;
			}
			// Removed game over check in the player update method
			if (self.isTouchingWall) {
				// Reset the vertical speed and apply the sliding speed when the player touches a wall
				self.verticalSpeed = 0;
				self.slidingSpeed += playerSlidingAcceleration;
				self.y += self.slidingSpeed;
			}
		}
	};
	self.immune = false; // Add a new property to the player to make it immune to spikes
	self.isBlinking = false; // Add a new property to manage the blinking state
	self.jump = function () {
		if (self.isTouchingWall) {
			if (!gameStarted) {
				gameStarted = true;
				firstJump = true; // Set the firstJump flag to true after the first jump
			}
			self.direction *= -1;
			self.verticalSpeed = -playerVerticalJumpSpeed; // Set the vertical speed when jumping
			self.slidingSpeed = playerSlidingSpeed; // Reset the sliding speed
			self.isTouchingWall = false;
			playerGraphics.visible = true;
			playerIdleGraphics.visible = false;
			// Move backgrounds down by 200 pixels
			backgroundContainer.backgroundGraphics1.y += 300;
			backgroundContainer.backgroundGraphics2.y += 300;
			// Move forest down by 100 pixels
			forest.y += 300;
			// Reset background speed
			backgroundSpeed = initialBackgroundSpeed;
			// Move all spikes down by 500 pixels
			for (var i = 0; i < spikes.length; i++) {
				spikes[i].y += spikeMovement;
			}
			// Reset the spikes' upwards movement speed
			spikeUpwardsMovement = spikeSpeed;
			self.immune++; // Increment immunity to spikes after jumping
			LK.setTimeout(function () {
				// Set a timeout to remove the immunity after half a second
				self.immune--;
			}, 100);
			spawnObstacle(); // Spawn a new obstacle whenever the player jumps
		}
	};
	return self;
});
// Define the Spike class
var Spike = Container.expand(function () {
	var self = Container.call(this);
	var spikeGraphics = self.attachAsset('spikes', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = spikeGraphics.width;
	self.height = spikeGraphics.height;
	self.hasMoved = false; // Add hasMoved flag
	self.update = function () {
		if (self.y > 2732 + self.height / 2 + 500) {
			self.destroy();
		}
		if (player.isTouchingWall) {
			self.y -= spikeSpeed;
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x7abde6 //Init game with new background color
});
/**** 
* Game Code
****/ 
// Function to check score and start spike intervals
function checkAndStartSpikes() {
	if (LK.getScore() >= scoreThreshold && !spikeInterval && gameStarted) {
		spikeInterval = LK.setInterval(spawnSpike, spikeIntervalTime);
	}
}
// Declare global variables for background speed and acceleration
var initialBackgroundSpeed = 1;
var backgroundSpeed = initialBackgroundSpeed;
var backgroundAcceleration = 0.02;
var firstJump = false; // Flag to track the first jump
// Declare a global variable to track if the game has started
var gameStarted = false;
// Initialize BackgroundContainer, MidgroundContainer, and ForegroundContainer
var backgroundContainer = game.addChild(new BackgroundContainer());
var midgroundContainer = game.addChild(new MidgroundContainer());
var foregroundContainer = game.addChild(new ForegroundContainer());
var playerVerticalJumpSpeed = 20;
// Declare global variables for player's horizontal, vertical and sliding speed
var playerHorizontalSpeed = 80;
var playerSlidingSpeed = 1;
var playerSlidingAcceleration = 0.02;
// Declare a global variable to track if the game has started
var gameStarted = false;
// Declare global variables for the spikes movement, their upwards movement and their acceleration
var spikeMovement = 500;
var spikeUpwardsMovement = 10;
var spikeAcceleration = 0.02;
// Declare global variables for spike interval and score threshold
var spikeIntervalTime = 15000;
var scoreThreshold = 10;
// Initialize player
var player = foregroundContainer.addChild(new Player());
player.immune = 0; // Add a new property to the player to make it immune to spikes
// Add forest asset to the midground container
var forest = LK.getAsset('forest', {
	anchorX: 0.5,
	anchorY: 0,
	scaleX: 1,
	scaleY: 1,
	x: 2048 / 2,
	y: 2732 / 2
});
midgroundContainer.addChild(forest);
// Initialize platform and place it below the player_idle
var platform = midgroundContainer.addChild(new Platform());
platform.x = 2048 / 2;
platform.y = 2732 - 500 + player.playerIdleHeight / 2 + platform.height / 2;
// Initialize coins array
var coins = [];
// Track the number of coin arrays generated
var coinArrayCounter = 0;
// Initialize spikes array
var spikes = [];
// Set the direction at the start of the game
var spikePlacementFlag = Math.random() < 0.5 ? true : false;
// Initialize the first spike (Removed initial spike generation)
player.verticalSpeed = 0;
player.x = 2048 / 2;
player.y = 2732 - 430;
// Initialize obstacles array
var obstacles = [];
// Function to spawn coins instead of obstacles
function spawnObstacle() {
	if (gameStarted) {
		var coin = new Coin();
		coin.x = Math.random() * (2048 - 800) + 400; // Add padding to the coin spawner
		coin.y = -coin.height / 2;
		coins.push(coin);
		game.addChild(coin);
	}
}
// Function to spawn coins
function spawnCoins() {
	// Define the 18 available spots
	var spots = [];
	for (var i = 0; i < 3; i++) {
		for (var j = 0; j < 6; j++) {
			spots.push({
				x: j * (150 + 100) + 400,
				y: i * (150 + 50) - 500
			});
		}
	}
	// Shuffle the spots array
	for (var i = spots.length - 1; i > 0; i--) {
		var j = Math.floor(Math.random() * (i + 1));
		var temp = spots[i];
		spots[i] = spots[j];
		spots[j] = temp;
	}
	// Generate a random number of coins (between 4 and 9) in random spots
	var numCoins = Math.floor(Math.random() * 8) + 5;
	for (var i = 0; i < numCoins; i++) {
		var coin = new Coin();
		coin.x = spots[i].x;
		coin.y = spots[i].y;
		coins.push(coin);
		game.addChild(coin);
	}
	// Increment the coin array counter
	coinArrayCounter++;
	// Add extra coin to a random spot every 5 coin array generations
	if (coinArrayCounter % 5 === 0) {
		var extraCoin = new Coin();
		// Find an empty spot for the extra coin
		var emptySpots = spots.slice(numCoins); // Get the remaining spots after placing coins
		var randomEmptySpot = Math.floor(Math.random() * emptySpots.length);
		extraCoin.x = emptySpots[randomEmptySpot].x;
		extraCoin.y = emptySpots[randomEmptySpot].y;
		coins.push(extraCoin);
		game.addChild(extraCoin);
	}
}
// Function to spawn coins instead of spikes
function spawnSpike() {
	var coin = new Coin();
	coin.x = spikePlacementFlag ? 150 : 2048 - 150; // Place coin near walls
	coin.y = -coin.height / 2;
	coins.push(coin);
	game.addChild(coin);
	spikePlacementFlag = !spikePlacementFlag; // Flip the flag after each coin placement
}
// Initialize score text
var scoreTxt = new Text2('0', {
	size: 150,
	fill: 0xFFFFFF,
	stroke: 0x000000,
	strokeThickness: 15
});
scoreTxt.anchor.set(0.5, 0); // Sets anchor to the center of the top edge of the text.
scoreTxt.y -= 950; // Move the score 500 pixels higher
LK.gui.center.addChild(scoreTxt); // Add the score text to the GUI overlay.
// Set interval to spawn spikes and coins
var coinInterval;
var spikeInterval;
checkAndStartSpikes();
// Handle touch events
game.down = function (x, y, obj) {
	if (!gameStarted) {
		gameStarted = true;
		player.direction = Math.random() < 0.5 ? -1 : 1;
		LK.playMusic('background_music');
		// Spawn coins immediately after the first jump
		spawnCoins();
		// Start generating coins after the set interval
		coinInterval = LK.setInterval(spawnCoins, 3500);
		// Start generating spikes after the score threshold
		checkAndStartSpikes();
	}
	player.jump();
	// Play a sound effect when the player jumps
	LK.getSound('jump').play();
	LK.getSound('jumping').play();
};
game.up = function (x, y, obj) {
	// No operations needed here
};
// Update game logic
game.update = function () {
	if (gameStarted) {
		backgroundContainer.update();
		player.update();
		if (player.y > 2732 - player.height / 2) {
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
		}
		platform.update();
		forest.y -= 2; // Move the forest upwards by 1 pixel
		if (forest.y < -forest.height) {
			forest.destroy();
		}
		// Obstacles converted to coins - no collision detection needed
		for (var i = coins.length - 1; i >= 0; i--) {
			coins[i].update();
			if (coins[i].y > 2732 + coins[i].height / 2) {
				coins[i].destroy();
				coins.splice(i, 1);
			}
			if (player.intersects(coins[i])) {
				LK.setScore(LK.getScore() + 1);
				scoreTxt.setText(LK.getScore());
				LK.getSound('coin').play();
				coins[i].destroy();
				coins.splice(i, 1);
				spawnObstacle();
				checkAndStartSpikes();
			}
		}
		// Spikes converted to coins - no collision detection needed
	}
};
var spikeSpeed = 3; ===================================================================
--- original.js
+++ change.js
@@ -339,16 +339,16 @@
 player.x = 2048 / 2;
 player.y = 2732 - 430;
 // Initialize obstacles array
 var obstacles = [];
-// Function to spawn obstacles
+// Function to spawn coins instead of obstacles
 function spawnObstacle() {
 	if (gameStarted) {
-		var obstacle = new Obstacle();
-		obstacle.x = Math.random() * (2048 - 800) + 400; // Add padding to the enemy spawner
-		obstacle.y = -obstacle.height / 2;
-		obstacles.push(obstacle);
-		game.addChild(obstacle);
+		var coin = new Coin();
+		coin.x = Math.random() * (2048 - 800) + 400; // Add padding to the coin spawner
+		coin.y = -coin.height / 2;
+		coins.push(coin);
+		game.addChild(coin);
 	}
 }
 // Function to spawn coins
 function spawnCoins() {
@@ -379,38 +379,34 @@
 		game.addChild(coin);
 	}
 	// Increment the coin array counter
 	coinArrayCounter++;
-	// Add booster to a random spot every 5 coin array generations
+	// Add extra coin to a random spot every 5 coin array generations
 	if (coinArrayCounter % 5 === 0) {
-		var booster = new Booster();
-		// Find an empty spot for the booster
+		var extraCoin = new Coin();
+		// Find an empty spot for the extra coin
 		var emptySpots = spots.slice(numCoins); // Get the remaining spots after placing coins
 		var randomEmptySpot = Math.floor(Math.random() * emptySpots.length);
-		booster.x = emptySpots[randomEmptySpot].x;
-		booster.y = emptySpots[randomEmptySpot].y;
-		coins.push(booster);
-		game.addChild(booster);
+		extraCoin.x = emptySpots[randomEmptySpot].x;
+		extraCoin.y = emptySpots[randomEmptySpot].y;
+		coins.push(extraCoin);
+		game.addChild(extraCoin);
 	}
 }
-// Function to spawn spikes
+// Function to spawn coins instead of spikes
 function spawnSpike() {
-	var spike = new Spike();
-	spike.x = spikePlacementFlag ? spike.width / 2 : 2048 - spike.width / 2; // Attach to the wall based on the flag
-	spike.y = -spike.height / 2;
-	if (spike.x === 2048 - spike.width / 2) {
-		// If the spike is on the right wall
-		spike.scale.x = -1; // Flip the spike on its x axis
-	}
-	spikes.push(spike);
-	game.addChild(spike);
-	spikePlacementFlag = !spikePlacementFlag; // Flip the flag after each spike placement
+	var coin = new Coin();
+	coin.x = spikePlacementFlag ? 150 : 2048 - 150; // Place coin near walls
+	coin.y = -coin.height / 2;
+	coins.push(coin);
+	game.addChild(coin);
+	spikePlacementFlag = !spikePlacementFlag; // Flip the flag after each coin placement
 }
 // Initialize score text
 var scoreTxt = new Text2('0', {
 	size: 150,
-	fill: "#ffffff",
-	stroke: "#000000",
+	fill: 0xFFFFFF,
+	stroke: 0x000000,
 	strokeThickness: 15
 });
 scoreTxt.anchor.set(0.5, 0); // Sets anchor to the center of the top edge of the text.
 scoreTxt.y -= 950; // Move the score 500 pixels higher
@@ -453,62 +449,25 @@
 		forest.y -= 2; // Move the forest upwards by 1 pixel
 		if (forest.y < -forest.height) {
 			forest.destroy();
 		}
-		for (var i = obstacles.length - 1; i >= 0; i--) {
-			obstacles[i].update();
-			if (player.intersects(obstacles[i]) && player.immune <= 0) {
-				LK.effects.flashScreen(0xff0000, 1000);
-				LK.showGameOver();
-			}
-		}
+		// Obstacles converted to coins - no collision detection needed
 		for (var i = coins.length - 1; i >= 0; i--) {
 			coins[i].update();
 			if (coins[i].y > 2732 + coins[i].height / 2) {
 				coins[i].destroy();
 				coins.splice(i, 1);
 			}
 			if (player.intersects(coins[i])) {
-				if (coins[i] instanceof Booster) {
-					player.immune++;
-					player.alpha = 0.5;
-					player.isBlinking = false;
-					LK.getSound('booster').play(); // Play booster sound effect
-					LK.getSound('invisible').play(); // Play invisible sound effect
-					// Start the immunity and blinking timer
-					var immunityDuration = 4600; // 5 seconds of transparency
-					var blinkingDuration = 2400; // 2 seconds of blinking
-					var blinkingInterval = 200; // Toggle alpha every 200 ms
-					// Set timeout for the transparency period
-					LK.setTimeout(function () {
-						player.isBlinking = true;
-						var blinkTimer = LK.setInterval(function () {
-							player.alpha = player.alpha === 0.5 ? 1 : 0.5;
-						}, blinkingInterval);
-						// Set timeout for the blinking period
-						LK.setTimeout(function () {
-							LK.clearInterval(blinkTimer);
-							player.immune--;
-							player.alpha = 1;
-							player.isBlinking = false;
-						}, blinkingDuration);
-					}, immunityDuration);
-				} else {
-					LK.setScore(LK.getScore() + 1);
-					scoreTxt.setText(LK.getScore());
-					LK.getSound('coin').play();
-				}
+				LK.setScore(LK.getScore() + 1);
+				scoreTxt.setText(LK.getScore());
+				LK.getSound('coin').play();
 				coins[i].destroy();
 				coins.splice(i, 1);
 				spawnObstacle();
 				checkAndStartSpikes();
 			}
 		}
-		for (var i = spikes.length - 1; i >= 0; i--) {
-			if (player.intersects(spikes[i]) && player.immune <= 0) {
-				LK.effects.flashScreen(0xff0000, 1000);
-				LK.showGameOver();
-			}
-		}
+		// Spikes converted to coins - no collision detection needed
 	}
 };
 var spikeSpeed = 3;
\ No newline at end of file
 8-bit pixel shuriken. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
 
 8-bit pixelated background of a minimalist cloudy sky. keep it simple with a light blue sky of a single color and a few pixelated clouds scattered around. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
 
 
 8-bit pixelated wooden stump. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
 
 8-bit pixelated invisibility potion powerup. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.