Code edit (4 edits merged)
Please save this source code
User prompt
add a global nbDecorations
Code edit (5 edits merged)
Please save this source code
User prompt
in Decoration update, also log y
Code edit (4 edits merged)
Please save this source code
User prompt
in decoration class reset(), log assetIndex and size
User prompt
pass i index to Decoration constructor and store it in an index property
User prompt
add a global array for decorations
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'TypeError: mainGraphics is undefined' in or related to this line: 'mainGraphics.width = startSize;' Line Number: 200
User prompt
Please fix the bug: 'TypeError: mainGraphics is undefined' in or related to this line: 'mainGraphics.width = startSize;' Line Number: 200
User prompt
Please fix the bug: 'TypeError: mainGraphics is undefined' in or related to this line: 'mainGraphics.width = startSize;' Line Number: 200
User prompt
Please fix the bug: 'ReferenceError: mainGraphics is not defined' in or related to this line: 'mainGraphics.width = startSize;' Line Number: 199
User prompt
Please fix the bug: 'ReferenceError: rand is not defined' in or related to this line: 'var leftStartX = baseLeftStartX - rand * xOffset / 2;' Line Number: 180
User prompt
ok apply this
User prompt
Please fix the bug: 'ReferenceError: mainGraphics is not defined' in or related to this line: 'mainGraphics.texture = LK.getAsset(randomAsset, {}).texture;' Line Number: 170
User prompt
I think calling self.attachAsset at each reset may not be performant, there should be a better way
Code edit (1 edits merged)
Please save this source code
User prompt
add a drop shadow to score text
Code edit (9 edits merged)
Please save this source code
User prompt
stop stipes update when isKilled
User prompt
when level == 1; make lampPost not visible
Code edit (1 edits merged)
Please save this source code
Code edit (5 edits merged)
Please save this source code
User prompt
replace if (self.y > roadTop + roadHeight) { self.y -= roadHeight; // Move stripe back to the top self.stripeGraphics.height = 0; // Reset height to initial value self.stripeGraphics.tint = 0xFFFFFF; // Reset tint to initial value } to place thestipe just before the stripe with lowest y
/**** 
* Classes
****/ 
// Assets will be automatically created and loaded during gameplay
// Coin class
var Coin = Container.expand(function () {
	var self = Container.call(this);
	var coinGraphics = self.attachAsset('coin1', {
		anchorX: 0.5,
		anchorY: 0.5,
		visible: currentCoinType == 0
	});
	var coinGraphics2 = self.attachAsset('coin2', {
		//'dollarsBundle'
		anchorX: 0.5,
		anchorY: 0.5,
		visible: currentCoinType == 1
	});
	var speed = 5;
	var startY = roadTop + 50;
	var endY = startY + roadHeight;
	var leftStartX = 1024 - 100;
	var leftEndX = 1024 - 650;
	var rightStartX = 1024 + 100;
	var rightEndX = 1024 + 650;
	var startSize = 2;
	var endSize = 140;
	coinGraphics.width = startSize;
	coinGraphics.height = startSize;
	coinGraphics2.width = startSize;
	coinGraphics2.height = startSize;
	self.pathIndex = 0;
	self.update = function () {
		// Road should animate even if the game hasn't started
		if (!isPlaying || isKilled) {
			return;
		}
		self.progress = Math.max(0, self.y - startY) / (endY - startY); // Update progress property
		coinGraphics.width = startSize + (endSize - startSize) * self.progress;
		coinGraphics.height = startSize + (endSize - startSize) * self.progress;
		coinGraphics2.width = startSize + (endSize - startSize) * self.progress;
		coinGraphics2.height = startSize + (endSize - startSize) * self.progress;
		var newSpeed = currentSpeed; // + 10 * self.progress;
		var tempSpeed = currentSpeed * 0.05 + currentSpeed * (self.progress * 3);
		newSpeed = tempSpeed;
		self.y += newSpeed;
		// Move innerLineLeft x progressively to innerLeftLineEndX
		if (self.pathIndex == 0 && self.x != leftEndX) {
			self.x = leftStartX + (leftEndX - leftStartX) * self.progress;
		}
		if (self.pathIndex == 2 && self.x != rightEndX) {
			self.x = rightStartX + (rightEndX - rightStartX) * self.progress;
		}
		if (self.y > endY + endSize / 2) {
			self.reset();
		}
		// Check for collision with player
		if (!player.isJumping && self.y > 2500 && self.y < 2732 && player.shadow.intersects(self)) {
			score += 1;
			coinsCollected += 1; // Increment coins collected counter
			if (currentLevel == 1) {
				scoreTxt.setText(score + "Β’");
			} else {
				scoreTxt.setText("$" + score);
			}
			LK.effects.flashObject(player, 0xffd700, 500); // Flash gold for 0.5 seconds
			self.reset();
			// Increase speed every 3 coins collected
			if (coinsCollected % nextCoinTypeThreshold === 0 && currentSpeed < maxSpeed) {
				currentSpeed += 3; // Increase speed by 3
			}
			if (coinsCollected >= nextCoinTypeThreshold) {
				currentCoinType = 1;
			}
		}
	};
	self.reset = function () {
		self.y = startY;
		self.progress = 0; // Initialize progress property
		coinGraphics.width = startSize;
		coinGraphics.height = startSize;
		coinGraphics2.width = startSize;
		coinGraphics2.height = startSize;
		self.pathIndex = Math.floor(Math.random() * 3);
		coinGraphics.visible = currentCoinType == 0;
		coinGraphics2.visible = currentCoinType == 1;
		if (self.pathIndex === 0) {
			self.x = leftStartX;
		} else if (self.pathIndex === 2) {
			self.x = rightStartX;
		} else {
			self.x = 1024;
		}
	};
});
// CoinAnimation class
var CoinAnimation = Container.expand(function () {
	var self = Container.call(this);
	var coinGraphics = self.attachAsset('coin1', {
		anchorX: 0.5,
		anchorY: 0.5,
		visible: currentCoinType == 0
	});
	var coinGraphics2 = self.attachAsset('coin2', {
		anchorX: 0.5,
		anchorY: 0.5,
		visible: currentCoinType == 1
	});
	// Initialize velocity and gravity
	self.vx = (Math.random() < 0.5 ? -1 : 1) * 5; // Random horizontal velocity
	self.vy = -15; // Initial vertical velocity
	self.gravity = 0.5; // Gravity effect
	self.update = function () {
		self.vy += self.gravity; // Apply gravity to vertical velocity
		self.x += self.vx; // Update horizontal position
		self.y += self.vy; // Update vertical position
		self.alpha -= 0.0035; // Fade out the coin
		if (currentCoinType == 0) {
			coinGraphics.alpha = 1;
			coinGraphics2.alpha = 0;
		} else if (currentCoinType == 1) {
			coinGraphics.alpha = 0;
			coinGraphics2.alpha = 1;
		}
		if (self.alpha <= 0) {
			self.destroy(); // Remove the coin when it becomes invisible
		}
	};
});
// Decoration class
var Decoration = Container.expand(function () {
	var self = Container.call(this);
	var assets = ['decoration_1_1', 'decoration_1_2'];
	self.assets = assets.map(function (assetId) {
		return self.attachAsset(assetId, {
			anchorX: 0.5,
			anchorY: 0.5,
			visible: false // Initially set all assets to invisible
		});
	});
	var speed = 5;
	var startY = roadTop + 50;
	var endY = startY + roadHeight;
	var xOffset = 2048;
	var baseLeftStartX = 780;
	var rand = Math.random();
	var leftStartX = baseLeftStartX - rand * xOffset / 2;
	var leftEndX = leftStartX - xOffset * (1 + rand);
	var baseRightStartX = 1280;
	var rightStartX = baseRightStartX + rand * xOffset / 2;
	var rightEndX = rightStartX + xOffset * (1 + rand);
	var assetWidthRatio = 1;
	var startSize, endSize;
	if (self.assetIndex == 0) {
		startSize = 3;
		endSize = 600;
		assetWidthRatio = 100 / 300;
	} else if (self.assetIndex == 1) {
		startSize = 1;
		endSize = 400;
	} else if (self.assetIndex == 2) {
		startSize = 2;
		endSize = 250;
	}
	var mainGraphics = self.assets[self.assetIndex];
	mainGraphics.width = startSize;
	mainGraphics.height = startSize;
	self.pathIndex = 0;
	self.update = function () {
		if (isKilled) {
			return;
		}
		var newTint = intensityHalf << 16 | intensityHalf << 8 | intensityHalf;
		mainGraphics.tint = newTint;
		self.progress = Math.max(0, self.y - startY) / (endY - startY); // Update progress property
		mainGraphics.height = startSize + (endSize - startSize) * self.progress;
		mainGraphics.width = mainGraphics.height * assetWidthRatio;
		var tempSpeed = currentSpeed * 0.05 + currentSpeed * (self.progress * 3);
		var newSpeed = currentSpeed; // + 10 * self.progress;
		newSpeed = tempSpeed * 1; // TEMP DEBUG !!!
		self.y += newSpeed;
		// Move innerLineLeft x progressively to innerLeftLineEndX
		if (self.pathIndex == 0 && self.x != leftEndX) {
			self.x = leftStartX + (leftEndX - leftStartX) * self.progress;
		}
		if (self.pathIndex == 1 && self.x != rightEndX) {
			self.x = rightStartX + (rightEndX - rightStartX) * self.progress;
		}
		if (self.y > endY + endSize / 2) {
			//self.y = -startSize; // Move obstacle back to the top
			self.reset();
		}
	};
	self.reset = function () {
		self.y = startY;
		rand = Math.random();
		self.progress = 0; // Initialize progress property
		self.assetIndex = Math.floor(Math.random() * self.assets.length);
		self.assets.forEach(function (asset, index) {
			asset.visible = index === self.assetIndex;
		});
		var mainGraphics = self.assets[self.assetIndex];
		mainGraphics.width = startSize;
		mainGraphics.height = startSize;
		leftStartX = baseLeftStartX - rand * xOffset / 2;
		leftEndX = leftStartX - xOffset * (1 + rand);
		rightStartX = baseRightStartX + rand * xOffset / 2;
		rightEndX = rightStartX + xOffset * (1 + rand);
		self.pathIndex = Math.floor(rand * 2);
		if (self.pathIndex === 0) {
			self.x = leftStartX;
		} else {
			self.x = rightStartX;
		}
	};
});
var Killer = Container.expand(function () {
	var self = Container.call(this);
	var assets = ['killer3'];
	self.assetIndex = Math.floor(Math.random() * assets.length);
	var randomAsset = assets[self.assetIndex];
	var killerGraphics = self.attachAsset(randomAsset, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	var speed = 5;
	var startY = roadTop - 1;
	var endY = startY + roadHeight;
	var leftStartX = 1024 - 100;
	var leftEndX = 1024 - 650;
	var rightStartX = 1024 + 100;
	var rightEndX = 1024 + 650;
	var startSize = 1;
	var endSize = 800;
	var assetHeightRatio = 500 / 400;
	killerGraphics.width = startSize;
	killerGraphics.height = startSize;
	self.pathIndex = 0;
	self.inactive = true;
	self.inactiveStartTime = Date.now();
	self.update = function () {
		if (!isPlaying) {
			return;
		}
		var currentTime = Date.now();
		if (self.inactive) {
			if (currentTime - self.inactiveStartTime >= killerDelay) {
				self.inactive = false;
			}
			return;
		}
		if (!isKilled && player && self.y > 2500 && self.y < 2732 && player.shadow.intersects(self)) {
			isKilled = true;
			player.visible = false;
			LK.effects.flashScreen(0xff0000, 1000);
			// Spawn MurderShape at player's last position
			var murderShape = new MurderShape();
			murderShape.x = player.x;
			murderShape.y = player.y;
			murderShape.fixPosition();
			game.addChildAt(murderShape, game.getChildIndex(road) + 1);
			return;
		}
		self.progress = Math.max(0, self.y - startY) / (endY - startY);
		killerGraphics.width = startSize + (endSize - startSize) * self.progress;
		debugTxt.setText(self.progress.toFixed(2));
		killerGraphics.height = assetHeightRatio * killerGraphics.width;
		var tempSpeed = currentSpeed * 0.5 + currentSpeed * (self.progress * 5);
		var newSpeed = currentSpeed * 5;
		newSpeed = tempSpeed * 1;
		self.y += newSpeed;
		if (self.pathIndex == 0 && self.x != leftEndX) {
			self.x = leftStartX + (leftEndX - leftStartX) * self.progress;
		}
		if (self.pathIndex == 2 && self.x != rightEndX) {
			self.x = rightStartX + (rightEndX - rightStartX) * self.progress;
		}
		if (self.y > endY + endSize / 2) {
			self.reset();
		}
	};
	self.reset = function () {
		self.y = startY;
		self.progress = 0;
		killerGraphics.width = startSize;
		killerGraphics.height = startSize;
		self.pathIndex = Math.floor(Math.random() * 3);
		if (self.pathIndex === 0) {
			self.x = leftStartX;
		} else if (self.pathIndex === 2) {
			self.x = rightStartX;
		} else {
			self.x = 1024;
		}
		self.inactive = true;
		self.inactiveStartTime = Date.now();
	};
});
var Landscape = Container.expand(function () {
	var self = Container.call(this);
	var landscapeGraphics = self.attachAsset('landscape2', {
		anchorX: 0.5,
		anchorY: 0.0
	});
	var gradientGraphics = self.attachAsset('gradient', {
		anchorX: 0.5,
		anchorY: 0.0,
		scaleY: -1,
		y: 1050,
		blendMode: 2,
		alpha: 0.5,
		tint: 0xFFFFFF,
		height: 10
	});
	self.x = 2048 / 2; // Center horizontally
	self.y = 0; // Position at the top
	self.update = function () {
		var newTint = intensityHalf << 16 | intensityHalf << 8 | intensityHalf;
		landscapeGraphics.tint = newTint; // Apply reduced tint to the road based on the intensity
		//debugTxt.setText(intensityHalf.toFixed(2));
	};
});
var MurderShape = Container.expand(function () {
	var self = Container.call(this);
	var murderShapeGraphics = self.attachAsset('murderShape', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.update = function () {
		// MurderShape does not need to update its position or behavior
	};
	self.fixPosition = function () {
		if (self.x < 600) {
			self.x += 150;
		} else if (self.x > 1400) {
			self.x -= 150;
		}
	};
});
// Obstacle class
var Obstacle = Container.expand(function () {
	var self = Container.call(this);
	var assets = ['obstacle1', 'obstacle2', 'obstacle3'];
	self.assetIndex = Math.floor(Math.random() * assets.length);
	var randomAsset = assets[self.assetIndex];
	var obstacleGraphics = self.attachAsset(randomAsset, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	var speed = 5;
	var startY = roadTop + 50;
	var endY = startY + roadHeight;
	var leftStartX = 1024 - 100;
	var leftEndX = 1024 - 650;
	var rightStartX = 1024 + 100;
	var rightEndX = 1024 + 650;
	var innerLeftLineStartX = -150;
	var innerLeftLineEndX = -390;
	var startSize, endSize;
	if (self.assetIndex == 0) {
		startSize = 3;
		endSize = 350;
	} else if (self.assetIndex == 1) {
		startSize = 1;
		endSize = 140;
	} else if (self.assetIndex == 2) {
		startSize = 2;
		endSize = 250;
	}
	obstacleGraphics.width = startSize;
	obstacleGraphics.height = startSize;
	self.pathIndex = 0;
	self.update = function () {
		if (!isPlaying || isKilled) {
			return;
		}
		// Check for collision with player
		var currentTime = Date.now();
		if (currentTime - lastObstacleHitTime > immunityDelay && player && !player.isJumping && self.y > 2500 && self.y < 2732 && player.shadow.intersects(self)) {
			lastObstacleHitTime = currentTime; // Update the last hit time
			// Make player flash red for 1 second
			LK.effects.flashObject(player, 0xff0000, 1000);
			// Add coin animation only if score is greater than 0
			if (score > 0) {
				var coinAnimation = new CoinAnimation();
				coinAnimation.x = player.x;
				coinAnimation.y = player.y;
				game.addChild(coinAnimation);
			}
			// Reduce score by 1
			score = Math.max(0, score - 1);
			if (currentLevel == 1) {
				scoreTxt.setText(score + "Β’");
			} else {
				scoreTxt.setText("$" + score);
			}
			console.log("Obstacle y:", self.y);
			// Reduce currentSpeed by a factor (e.g., 0.8)
			console.log("Old speed :", currentSpeed);
			currentSpeed = Math.max(10, Math.min(20, Math.round(currentSpeed * 0.8)));
			console.log("New speed :", currentSpeed);
		}
		self.progress = Math.max(0, self.y - startY) / (endY - startY); // Update progress property
		obstacleGraphics.width = startSize + (endSize - startSize) * self.progress;
		obstacleGraphics.height = startSize + (endSize - startSize) * self.progress;
		var tempSpeed = currentSpeed * 0.05 + currentSpeed * (self.progress * 3);
		var newSpeed = currentSpeed; // + 10 * self.progress;
		newSpeed = tempSpeed * 1; // TEMP DEBUG !!!
		self.y += newSpeed;
		// Move innerLineLeft x progressively to innerLeftLineEndX
		if (self.pathIndex == 0 && self.x != leftEndX) {
			self.x = leftStartX + (leftEndX - leftStartX) * self.progress;
		}
		if (self.pathIndex == 2 && self.x != rightEndX) {
			self.x = rightStartX + (rightEndX - rightStartX) * self.progress;
		}
		if (self.y > endY + endSize / 2) {
			//self.y = -startSize; // Move obstacle back to the top
			self.reset();
		}
	};
	self.reset = function () {
		self.y = startY;
		self.progress = 0; // Initialize progress property
		obstacleGraphics.width = startSize;
		obstacleGraphics.height = startSize;
		self.pathIndex = Math.floor(Math.random() * 3);
		if (self.pathIndex === 0) {
			self.x = leftStartX;
		} else if (self.pathIndex === 2) {
			self.x = rightStartX;
		} else {
			self.x = 1024;
		}
	};
});
// Player class
var Player = Container.expand(function () {
	var self = Container.call(this);
	self.shadow = self.attachAsset('shadow', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.isJumping = false; // Initialize isJumping to false
	self.shadow.alpha = 0.5; // Make the shadow semi-transparent
	self.shadow.y = 270; // Offset the shadow slightly below the player
	var playerGraphics1 = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: -5
	});
	var playerGraphics2 = self.attachAsset('player2', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: 5
	});
	playerGraphics2.visible = false; // Initially hide player2 asset
	var frame = 0;
	self.update = function () {
		if (!self.isJumping) {
			frame += Math.min(currentSpeed, 20); // Add a max limit to avoid optical effects
			if (frame >= 100) {
				frame = 0;
				// Swap frames every 10 game ticks
				var visible = playerGraphics1.visible;
				playerGraphics1.visible = !visible;
				playerGraphics2.visible = visible;
			}
		}
		self.jump = function () {
			if (!self.isJumping) {
				self.isJumping = true;
				var initialY = self.y;
				var initialShadowY = self.shadow.y;
				var jumpHeight = 300;
				var jumpDuration = 30;
				var jumpStep = jumpHeight / jumpDuration;
				var fallStep = jumpHeight / jumpDuration;
				var jumpStartTime = Date.now();
				var jumpInterval = LK.setInterval(function () {
					var elapsed = Date.now() - jumpStartTime;
					var progress = elapsed / (jumpDuration * 1000 / 60);
					if (progress < 1) {
						var easeProgress = Math.sin(progress * Math.PI / 2);
						self.y = initialY - jumpHeight * easeProgress;
						self.shadow.y = initialShadowY + jumpHeight * easeProgress; // Move shadow inversely
						self.shadow.width = 240 * (1 - 0.5 * easeProgress); // Reduce shadow width
						self.shadow.height = 100 * (1 - 0.5 * easeProgress); // Reduce shadow height
					} else {
						LK.clearInterval(jumpInterval);
						var fallStartTime = Date.now();
						var fallInterval = LK.setInterval(function () {
							var elapsed = Date.now() - fallStartTime;
							var progress = elapsed / (jumpDuration * 1000 / 60);
							if (progress < 1) {
								var easeProgress = Math.sin(progress * Math.PI / 2);
								self.y = initialY - jumpHeight + jumpHeight * easeProgress;
								self.shadow.y = initialShadowY + jumpHeight - jumpHeight * easeProgress; // Move shadow inversely
								self.shadow.width = 120 + 120 * easeProgress; // Reset shadow width
								self.shadow.height = 50 + 50 * easeProgress; // Reset shadow height
							} else {
								self.y = initialY;
								self.shadow.y = initialShadowY; // Reset shadow position
								self.isJumping = false;
								LK.clearInterval(fallInterval);
							}
						}, 1000 / 60);
					}
				}, 1000 / 60);
			}
		};
	};
});
// Road class
var Road = Container.expand(function () {
	var self = Container.call(this);
	var baseY = 750;
	var roadGraphics = self.attachAsset('triangle', {
		tint: 0x555555,
		// Initialize tint to white
		anchorX: 0.5,
		anchorY: 0,
		width: 2048,
		height: roadHeight,
		y: baseY
	});
	var speed = 5;
	var lineOffset = -150;
	// Inner lines
	var innerLineStartY = roadTop;
	var innerLineEndY = roadTop + roadHeight + 200;
	// Left
	var innerLeftLineStartX = -50;
	var innerLeftLineEndX = -412;
	var innerLeftLineStartW = 3;
	var innerLeftLineEndW = 80;
	var innerLeftLineStartH = 3;
	var innerLeftLineEndH = 500;
	var innerLeftLineStartR = 0.22; //0.075;
	var innerLeftLineEndR = 0.275;
	// Right
	var innerRightLineStartX = 50;
	var innerRightLineEndX = 412;
	var innerRightLineStartW = 3;
	var innerRightLineEndW = 80;
	var innerRightLineStartH = 3;
	var innerRightLineEndH = 500;
	var innerRightLineStartR = -0.22;
	var innerRightLineEndR = -0.275;
	// Lamp posts 
	// Left Lamp
	var leftLampStartX = -130;
	var leftLampEndX = -1600;
	var leftLampStartY = roadTop;
	var leftLampEndY = roadTop + roadHeight + 0; // Define leftLampEndY variable
	var leftLampStartH = 2;
	var leftLampEndH = 900;
	var leftLampWRatio = 1 / 3;
	// Right Lamp
	var rightLampStartX = 130;
	var rightLampEndX = 1600;
	var rightLampStartY = roadTop;
	var rightLampEndY = roadTop + roadHeight + 0; // Define leftLampEndY variable
	var rightLampStartH = 2;
	var rightLampEndH = 900;
	var rightLampWRatio = 1 / 3;
	var nbInnerLines = 6;
	var leftLine = self.attachAsset('triangle', {
		anchorX: 0.5,
		anchorY: 0,
		width: 100,
		height: 1950,
		rotation: 0.45
	});
	leftLine.x = lineOffset; // Position the left line on the left side of the road
	leftLine.y = roadTop + 45; // Center the left line vertically
	var rightLine = self.attachAsset('triangle', {
		anchorX: 0.5,
		anchorY: 0,
		width: 100,
		height: 1950,
		rotation: -0.45
	});
	rightLine.x = -lineOffset; // Position the right line on the right side of the road
	rightLine.y = roadTop + 45; // Center the right line vertically
	self.innerLeftLines = [];
	self.innerRightLines = [];
	self.leftLampPosts = [];
	self.rightLampPosts = [];
	for (var i = 0; i < nbInnerLines; i++) {
		var innerLineLeft = self.attachAsset('line', {
			anchorX: 0.5,
			anchorY: 0.5,
			width: innerLeftLineStartW,
			height: innerLeftLineStartH,
			rotation: innerLeftLineStartR,
			alpha: 1
		});
		innerLineLeft.x = innerLeftLineStartX;
		innerLineLeft.y = innerLineStartY - 0.1 * i * roadHeight / nbInnerLines;
		//console.log(i + " : " + innerLineStartY + " + " + i * roadHeight / nbInnerLines + " => " + innerLineLeft.y);
		innerLineLeft.progress = 0; // Initialize progress property
		self.innerLeftLines.push(innerLineLeft);
		var innerLineRight = self.attachAsset('line', {
			anchorX: 0.5,
			anchorY: 0.5,
			width: innerRightLineStartW,
			height: innerRightLineStartH,
			rotation: innerRightLineStartR,
			alpha: 1
		});
		innerLineRight.x = innerRightLineStartX;
		innerLineRight.y = innerLineStartY - 0.1 * i * roadHeight / nbInnerLines;
		innerLineRight.progress = 0; // Initialize progress property
		self.innerRightLines.push(innerLineRight);
		if (i % 2 == 0) {
			continue;
		}
		var leftLampPost = self.attachAsset('lampPost', {
			anchorX: 0.5,
			anchorY: 0.5,
			height: leftLampStartH,
			width: leftLampStartH * leftLampWRatio
		});
		var leftLampShadow = self.attachAsset('shadow', {
			anchorX: 0.5,
			anchorY: 0.5,
			width: leftLampPost.width * 0.8,
			height: leftLampPost.height * 0.1,
			y: leftLampPost.height * 0.5 + 10 // Offset shadow slightly below the lamp post
		});
		leftLampPost.addChild(leftLampShadow);
		leftLampPost.x = leftLampStartX;
		leftLampPost.y = leftLampStartY - (i - 1) * 40;
		self.addChild(leftLampPost);
		self.leftLampPosts.push(leftLampPost);
		var rightLampPost = self.attachAsset('lampPost', {
			anchorX: 0.5,
			anchorY: 0.5,
			scaleX: -1,
			height: rightLampStartH,
			width: rightLampStartH * rightLampWRatio
		});
		var rightLampShadow = self.attachAsset('shadow', {
			anchorX: 0.5,
			anchorY: 0.5,
			width: rightLampPost.width * 0.8,
			height: rightLampPost.height * 0.1,
			y: rightLampPost.height * 0.5 + 10 // Offset shadow slightly below the lamp post
		});
		rightLampPost.addChild(rightLampShadow);
		rightLampPost.x = rightLampStartX;
		rightLampPost.y = rightLampStartY - (i - 1) * 40;
		self.addChild(rightLampPost);
		self.rightLampPosts.push(rightLampPost);
	}
	self.update = function () {
		if (isKilled) {
			return;
		}
		var newTint = intensityHalf << 16 | intensityHalf << 8 | intensityHalf;
		//roadGraphics.tint = newTint; // Apply reduced tint to the road based on the intensity
		leftLine.tint = newTint;
		rightLine.tint = newTint;
		// Add any update logic for the road if needed
		for (var i = 0; i < self.innerLeftLines.length; i++) {
			innerLineLeft = self.innerLeftLines[i];
			innerLineLeft.tint = newTint;
			if (innerLineLeft.y > innerLineEndY) {
				self.resetInnerLine(innerLineLeft, true);
			} else {
				innerLineLeft.progress = Math.max(0, innerLineLeft.y - innerLineStartY) / (innerLineEndY - innerLineStartY); // Update progress property
			}
			var tempSpeed = currentSpeed * 0.05 + currentSpeed * (innerLineLeft.progress * 3);
			var newSpeed = currentSpeed; // + 10 * self.progress;
			newSpeed = tempSpeed * 1; // TEMP DEBUG !!!
			innerLineLeft.y += newSpeed;
			// Move innerLineLeft x progressively to innerLeftLineEndX
			if (innerLineLeft.x != innerLeftLineEndX) {
				innerLineLeft.x = innerLeftLineStartX + (innerLeftLineEndX - innerLeftLineStartX) * innerLineLeft.progress;
			}
			// Move innerLineLeft x progressively 
			if (innerLineLeft.rotation != innerLeftLineEndR) {
				//innerLineLeft.rotation = innerLeftLineStartR + (innerLeftLineEndR - innerLeftLineStartR) * innerLineLeft.progress;
			}
			// Move innerLineLeft x progressively 
			if (innerLineLeft.width != innerLeftLineEndW) {
				innerLineLeft.width = innerLeftLineStartW + (innerLeftLineEndW - innerLeftLineStartW) * innerLineLeft.progress;
			}
			// Move innerLineLeft x progressively
			if (innerLineLeft.height != innerLeftLineEndH) {
				innerLineLeft.height = innerLeftLineStartH + (innerLeftLineEndH - innerLeftLineStartH) * innerLineLeft.progress;
			}
		}
		for (var i = 0; i < self.innerRightLines.length; i++) {
			innerLineRight = self.innerRightLines[i];
			innerLineRight.tint = newTint;
			if (innerLineRight.y > innerLineEndY) {
				self.resetInnerLine(innerLineRight, false);
			} else {
				innerLineRight.progress = Math.max(0, innerLineRight.y - innerLineStartY) / (innerLineEndY - innerLineStartY);
			}
			var tempSpeed = currentSpeed * 0.05 + currentSpeed * (innerLineRight.progress * 3);
			var newSpeed = currentSpeed; // + 10 * self.progress;
			newSpeed = tempSpeed * 1; // TEMP DEBUG !!!
			innerLineRight.y += newSpeed;
			// Move innerLineRight x progressively to innerRightLineEndX
			if (innerLineRight.x != innerRightLineEndX) {
				innerLineRight.x = innerRightLineStartX + (innerRightLineEndX - innerRightLineStartX) * innerLineRight.progress;
			}
			// Move innerLineRight x progressively 
			if (innerLineRight.rotation != innerRightLineEndR) {
				//innerLineRight.rotation = innerRightLineStartR + (innerRightLineEndR - innerRightLineStartR) * innerLineRight.progress;
			}
			// Move innerLineRight x progressively 
			if (innerLineRight.width != innerRightLineEndW) {
				innerLineRight.width = innerRightLineStartW + (innerRightLineEndW - innerRightLineStartW) * innerLineRight.progress;
			}
			// Move innerLineRight x progressively 
			if (innerLineRight.height != innerRightLineEndH) {
				innerLineRight.height = innerRightLineStartH + (innerRightLineEndH - innerRightLineStartH) * innerLineRight.progress;
			}
		}
		// Lamp posts
		for (var i = 0; i < self.leftLampPosts.length; i++) {
			var leftLampPost = self.leftLampPosts[i];
			//leftLampPost.tint = newTint;
			var tempProgress = Math.max(0, leftLampPost.y - leftLampStartY) / (leftLampEndY - leftLampStartY);
			var tempSpeed = currentSpeed * 0.05 + currentSpeed * (tempProgress * 3);
			leftLampPost.y += tempSpeed;
			leftLampPost.visible = currentLevel !== 1; // Make lampPost not visible when level is 1
			if (leftLampPost.y > leftLampEndY) {
				leftLampPost.y = leftLampStartY;
				leftLampPost.x = leftLampStartX;
				leftLampPost.height = leftLampStartH;
			}
			leftLampPost.progress = Math.max(0, leftLampPost.y - leftLampStartY) / (leftLampEndY - leftLampStartY); // Update progress property
			leftLampPost.alpha = 0.75 + Math.min(0.25, leftLampPost.progress);
			if (i == 0) {
				//debugTxt.setText(leftLampPost.progress.toFixed(2));
			}
			if (leftLampPost.x != leftLampEndX) {
				leftLampPost.x = leftLampStartX + (leftLampEndX - leftLampStartX) * Math.min(1, leftLampPost.progress * 1);
			}
			if (leftLampPost.height != leftLampEndH) {
				leftLampPost.height = Math.min(1, leftLampPost.progress * 2) * leftLampEndH; // leftLampStartH + (leftLampEndH - leftLampStartH) * Math.min(1, leftLampPost.progress * 1);
				leftLampPost.width = leftLampPost.height * leftLampWRatio;
			}
		}
		for (var i = 0; i < self.rightLampPosts.length; i++) {
			var rightLampPost = self.rightLampPosts[i];
			var tempProgress = Math.max(0, rightLampPost.y - rightLampStartY) / (rightLampEndY - rightLampStartY);
			var tempSpeed = currentSpeed * 0.05 + currentSpeed * (tempProgress * 3);
			rightLampPost.y += tempSpeed;
			rightLampPost.visible = currentLevel !== 1; // Make right lampPost not visible when level is 1
			if (rightLampPost.y > rightLampEndY) {
				rightLampPost.y = rightLampStartY;
				rightLampPost.x = rightLampStartX;
				rightLampPost.height = rightLampStartH;
			}
			rightLampPost.progress = Math.max(0, rightLampPost.y - rightLampStartY) / (rightLampEndY - rightLampStartY);
			rightLampPost.alpha = 0.75 + Math.min(0.25, rightLampPost.progress);
			if (rightLampPost.x != rightLampEndX) {
				rightLampPost.x = rightLampStartX + (rightLampEndX - rightLampStartX) * rightLampPost.progress;
			}
			if (rightLampPost.height != leftLampEndH) {
				rightLampPost.height = rightLampStartH + (rightLampEndH - rightLampStartH) * Math.min(1, rightLampPost.progress * 2);
				rightLampPost.width = rightLampPost.height * rightLampWRatio;
			}
		}
	};
	self.resetInnerLine = function (innerLine, isLeft) {
		if (isLeft) {
			innerLine.x = innerLeftLineStartX;
			innerLine.rotation = innerLeftLineStartR;
			innerLine.width = innerLeftLineStartW;
			innerLine.height = innerLeftLineStartH;
		} else {
			innerLine.x = innerRightLineStartX;
			innerLine.rotation = innerRightLineStartR;
			innerLine.width = innerRightLineStartW;
			innerLine.height = innerRightLineStartH;
		}
		innerLine.y = innerLineStartY - 0.2 * roadHeight / nbInnerLines;
		innerLine.progress = 0; // Reset progress property
	};
});
var StartButton = Container.expand(function () {
	var self = Container.call(this);
	var buttonGraphics = self.attachAsset('startButton', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.interactive = true;
	self.buttonMode = true;
	self.on('down', function () {
		self.visible = false;
		isPlaying = true;
		scoreTxt.visible = true;
	});
});
var Stripe = Container.expand(function () {
	var self = Container.call(this);
	self.stripeGraphics = self.attachAsset('stripe1', {
		anchorX: 0,
		anchorY: 1,
		height: 1
	});
	self.progress = 0; // Initialize progress property
	self.update = function () {
		if (isKilled) {
			return;
		}
		self.progress = Math.max(0, self.y - roadTop) / roadHeight; // Update progress property
		var newTint = intensityHalf << 16 | intensityHalf << 8 | intensityHalf;
		self.stripeGraphics.tint = newTint;
		var tempSpeed = currentSpeed * 0.05 + currentSpeed * (self.progress * 3);
		self.y += tempSpeed;
		self.stripeGraphics.height = 400 * self.progress; // Adjust height based on progress
		if (self.y > roadTop + roadHeight) {
			self.y = roadTop;
			self.stripeGraphics.height = 0; // Reset height to initial value
			self.stripeGraphics.tint = 0xFFFFFF; // Reset tint to initial value
		}
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000 // Init game with black background
});
/**** 
* Game Code
****/ 
function _toConsumableArray(r) {
	return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
}
function _nonIterableSpread() {
	throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray(r, a) {
	if (r) {
		if ("string" == typeof r) {
			return _arrayLikeToArray(r, a);
		}
		var t = {}.toString.call(r).slice(8, -1);
		return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
	}
}
function _iterableToArray(r) {
	if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) {
		return Array.from(r);
	}
}
function _arrayWithoutHoles(r) {
	if (Array.isArray(r)) {
		return _arrayLikeToArray(r);
	}
}
function _arrayLikeToArray(r, a) {
	(null == a || a > r.length) && (a = r.length);
	for (var e = 0, n = Array(a); e < a; e++) {
		n[e] = r[e];
	}
	return n;
}
var stripes = [];
// Initialize arrays and variables
var currentLevel = 1;
var isPlaying = false;
var isKilled = false;
var killerDelay = 10000; // Delay in milliseconds before updating killer
var lastKillerUpdate = 0; // Timestamp of the last killer update
var currentCoinType = 0;
var nextCoinTypeThreshold = 10;
var isNight = false;
var roadHeight = 2000;
var roadTop = 1000; // ~= road.height/2 - baseY
var background;
var landscape1;
var nbStripes = 33;
var coins = [];
var obstacles = [];
var road;
var score = 0;
var scoreTxt;
var startX = 0;
var startY = 0;
var endX = 0;
var endY = 0;
var intensity = 0;
var intensityHalf = 0;
var leftLampPosts = [];
var rightLampPosts = [];
var leftDecorations = [];
var rightDecorationss = [];
var maxSpeed = 50; // Define a maximum speed limit
var currentSpeed = 10; //20; // Initialize currentSpeed
var coinsCollected = 0; // Initialize coins collected counter
var isIntersectingObstacle = false; // Flag to track if the player is currently intersecting an obstacle
var lastObstacleHitTime = 0; // Timestamp of the last obstacle hit
var immunityDelay = 500; // Immunity delay in milliseconds
var playerPositionIndex = 1; // Initialize player position index
// Define the three fixed x positions for the player
var playerPositions = [2048 / 5, 2048 / 2, 4 * 2048 / 5];
// Create player
var player;
var debugMarker;
var debugText;
var debugTxt;
function easeInOutQuad(t) {
	return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
}
function updateBackgroundColor() {
	var time = new Date().getTime() * 0.0002;
	intensity = Math.sin(time) * 127 + 128;
	var color = Math.max(32, intensity) << 16 | Math.max(32, intensity) << 8 | Math.max(32, intensity);
	background.tint = color;
	isNight = intensity < 128;
	intensityHalf = 128 + Math.floor(intensity * 0.5);
}
// Handle move events
game.down = function (x, y, obj) {
	if (!isPlaying) {
		return;
	}
	startX = x;
	startY = y;
};
game.up = function (x, y, obj) {
	if (isKilled) {
		LK.setTimeout(function () {
			LK.showGameOver();
		}, 500);
		return;
	}
	if (!isPlaying) {
		return;
	}
	endX = x;
	endY = y;
	var deltaX = endX - startX;
	var deltaY = endY - startY;
	if (Math.abs(deltaX) > Math.abs(deltaY)) {
		if (deltaX > 0) {
			// Swipe right
			if (playerPositionIndex < 2) {
				playerPositionIndex++;
			}
		} else {
			// Swipe left
			if (playerPositionIndex > 0) {
				playerPositionIndex--;
			}
		}
	} else {
		if (deltaY < 0) {
			// Swipe up
			player.jump();
		}
	}
	// Make the player move progressively to the next path
	var targetX = playerPositions[playerPositionIndex];
	var initialX = player.x;
	var moveDuration = 30;
	var moveStartTime = Date.now();
	var moveInterval = LK.setInterval(function () {
		var elapsed = Date.now() - moveStartTime;
		var progress = elapsed / (moveDuration * 1000 / 60);
		if (progress < 1) {
			var easeProgress = easeInOutQuad(progress);
			player.x = initialX + (targetX - initialX) * easeProgress;
		} else {
			player.x = targetX;
			LK.clearInterval(moveInterval);
		}
	}, 1000 / 60);
};
// Update game every tick
game.update = function () {
	updateBackgroundColor();
	if (!isPlaying || isKilled) {
		return;
	}
};
// Initialize game
function gameInitialize() {
	// Initialize arrays and variables
	// Attach the background asset to the game
	background = game.attachAsset('background1', {
		anchorX: 0.0,
		anchorY: 0.0
	});
	//background.y = -2000;
	game.addChild(background);
	// Add a series of Stripe instances to cover the bottom half of the screen
	for (var i = 0; i < nbStripes; i++) {
		var stripe = new Stripe();
		stripe.y = i === 0 ? roadTop : stripes[i - 1].y + stripes[i - 1].stripeGraphics.height; // Position stripe under the previous one using previous stripe y and height
		stripe.progress = Math.max(0, stripe.y - roadTop) / roadHeight; // Calculate progress
		stripes.push(stripe);
		game.addChild(stripe);
		stripe.stripeGraphics.height = 1 + 400 * stripe.progress; // Adjust height based on progress
		//console.log("Stripe ", i, " y=", stripe.y, " h=", stripe.stripeGraphics.height, " p=", stripe.progress);
	}
	// Create and attach a decoration instance to the game
	var newDecoration = new Decoration();
	newDecoration.reset();
	game.addChild(newDecoration);
	// Create and attach the road instance to the game
	road = game.addChild(new Road());
	road.x = 2048 / 2;
	road.y = 0;
	// Create and attach the landscape instance to the game
	var landscape = game.addChild(new Landscape());
	score = 0;
	scoreTxt = new Text2(currentLevel == 1 ? '0Β’' : '$0', {
		size: 150,
		fill: "#ffffff",
		dropShadow: true,
		dropShadowColor: "#000000",
		dropShadowBlur: 5,
		dropShadowDistance: 5
	});
	scoreTxt.anchor.set(0.5, 0);
	scoreTxt.visible = false;
	LK.gui.top.addChild(scoreTxt);
	coins = [];
	for (var i = 0; i < 5; i++) {
		var newCoin = new Coin();
		newCoin.reset();
		newCoin.y = roadTop - i * 50;
		coins.push(newCoin);
		game.addChild(newCoin);
	}
	// Create a variable to store the current player position index
	playerPositionIndex = 1;
	// Create and attach the obstacle instance to the game
	var newObstacle = new Obstacle();
	newObstacle.reset();
	obstacles.push(newObstacle);
	game.addChild(newObstacle);
	// Create and attach the killer instance to the game
	var newKiller = new Killer();
	newKiller.reset();
	obstacles.push(newKiller);
	game.addChild(newKiller);
	// Create player
	player = game.addChild(new Player());
	player.frame = 0;
	player.x = playerPositions[playerPositionIndex]; // Start at the center position
	player.y = 2732 - 300;
	// Attach a debugMarker asset to the game at position (1000, 0)
	debugMarker = game.attachAsset('debugMarker', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	debugMarker.x = 10;
	debugMarker.y = 2500;
	debugTxt = new Text2('Debug Info', {
		size: 50,
		fill: "#ff0000"
	});
	debugTxt.anchor.set(1, 1); // Set anchor to the bottom right corner
	LK.gui.bottomRight.addChild(debugTxt);
	var startButton = game.addChild(new StartButton());
	startButton.x = 2048 / 2;
	startButton.y = 2732 / 4;
	// TEMP DEBUG !!!
	startButton.width = 100;
	startButton.height = 100;
	isPlaying = false;
}
gameInitialize();
for (var i = 0; i < stripes.length; i++) {
	stripes[i].update();
} ===================================================================
--- original.js
+++ change.js
@@ -172,10 +172,10 @@
 		}
 		var newTint = intensityHalf << 16 | intensityHalf << 8 | intensityHalf;
 		mainGraphics.tint = newTint;
 		self.progress = Math.max(0, self.y - startY) / (endY - startY); // Update progress property
-		self.assets[self.assetIndex].height = startSize + (endSize - startSize) * self.progress;
-		self.assets[self.assetIndex].width = self.assets[self.assetIndex].height * assetWidthRatio;
+		mainGraphics.height = startSize + (endSize - startSize) * self.progress;
+		mainGraphics.width = mainGraphics.height * assetWidthRatio;
 		var tempSpeed = currentSpeed * 0.05 + currentSpeed * (self.progress * 3);
 		var newSpeed = currentSpeed; // + 10 * self.progress;
 		newSpeed = tempSpeed * 1; // TEMP DEBUG !!!
 		self.y += newSpeed;
@@ -198,10 +198,11 @@
 		self.assetIndex = Math.floor(Math.random() * self.assets.length);
 		self.assets.forEach(function (asset, index) {
 			asset.visible = index === self.assetIndex;
 		});
-		self.assets[self.assetIndex].width = startSize;
-		self.assets[self.assetIndex].height = startSize;
+		var mainGraphics = self.assets[self.assetIndex];
+		mainGraphics.width = startSize;
+		mainGraphics.height = startSize;
 		leftStartX = baseLeftStartX - rand * xOffset / 2;
 		leftEndX = leftStartX - xOffset * (1 + rand);
 		rightStartX = baseRightStartX + rand * xOffset / 2;
 		rightEndX = rightStartX + xOffset * (1 + rand);
:quality(85)/https://cdn.frvr.ai/66cb777cc36bc8152d8f8031.png%3F3) 
 Directly overhead, plumb view of a beggar heading top (we see his back).. Zenith view, directly overhead, plumb view. NOT PERSPECTIVE! Fantasy theme. Pixel art
:quality(85)/https://cdn.frvr.ai/66ccf14b9c4e45d382d11309.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66ce18e5423e03c81f87a015.png%3F3) 
 a traffic cone. video game sprite
:quality(85)/https://cdn.frvr.ai/66ce2581423e03c81f87a053.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66ce25c4423e03c81f87a056.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d0bbac423e03c81f87a179.png%3F3) 
 face view of a big start button in the shape of a dollar bill. video game style
:quality(85)/https://cdn.frvr.ai/66d1fc0e4c0bfbf86463ae2d.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d428c01a40feadd85fc2ad.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d42e241a40feadd85fc2e9.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d43f291a40feadd85fc37b.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d490b11a40feadd85fc4af.png%3F3) 
 a tree. video game style
:quality(85)/https://cdn.frvr.ai/66d4d0c367ce33ddda304025.png%3F3) 
 a black garbage bag. video game style
:quality(85)/https://cdn.frvr.ai/66d4de00401d2c2487b96f5a.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d4e47c651049126fa096cc.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d4e4be401d2c2487b96f78.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d555bd651049126fa096f0.png%3F3) 
 Dollar bill. Perspective. video game sprite
:quality(85)/https://cdn.frvr.ai/66d6f447a3e8b4a4a4829fb3.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d844022a19586325bec80d.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d844362a19586325bec810.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d8c2645c7c6fbac545d122.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66d9373598ec289fd45d77b2.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66dd38dddaaa27ee3942c131.png%3F3) 
 perspective of a simple snake rolled up on itself.. video game sprite
:quality(85)/https://cdn.frvr.ai/66dd3a2bdaaa27ee3942c13e.png%3F3) 
 Ball of dry desert bushes. video game sprite
:quality(85)/https://cdn.frvr.ai/66dd3c02daaa27ee3942c154.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66ddb2e9bf754a83aa523fb1.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66ddb7aecc485d4eb466960b.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66de8560d88e3b2f9d0d34dd.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66e0a42193e17031e44d9902.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66e0a8f4ccaaa6aa21e29430.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66e2701b2345adf8f56be232.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66e271832345adf8f56be236.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66e271d62345adf8f56be241.png%3F3) 
 tractor. high definition video game sprite
:quality(85)/https://cdn.frvr.ai/66e272f12345adf8f56be257.png%3F3) 
 street ad billboard with 1 or 2 posts with "Get rich!" on it. high definition video game sprite
:quality(85)/https://cdn.frvr.ai/66e278682345adf8f56be29e.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66e27f5a2345adf8f56be2fe.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66e35a3953e2dd7786ae56f8.png%3F3) 
 a dog sleeping on a street. video game sprite
:quality(85)/https://cdn.frvr.ai/66e35caa53e2dd7786ae571a.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66e887ca939ae2c335f047d6.png%3F3) 
 desert bush. video game sprite
:quality(85)/https://cdn.frvr.ai/66f09079353aeac5eb1686c0.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66f09358353aeac5eb1686cc.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66f0985a353aeac5eb168728.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66f09a6c353aeac5eb16875a.png%3F3) 
 profile view of an empty motorcycle helmet. black with a white vertical central band and another thiner orange band on the center. NOT PERSPECTIVE!. Pixel art high definition
:quality(85)/https://cdn.frvr.ai/66f09bc6353aeac5eb16879c.png%3F3) 
 simple red and white magnet. video game style
:quality(85)/https://cdn.frvr.ai/66f0f3e0673e5ef9433cb9ac.png%3F3) 
 gold sign with a "X" and a "2". video game style
:quality(85)/https://cdn.frvr.ai/66f14bbd07176eca63330db8.png%3F3) 
 bgMusic
Music
coin_1
Sound effect
hit_1
Sound effect
hit_2
Sound effect
hit_3
Sound effect
levelWin_1
Sound effect
car_1
Sound effect
police_1
Sound effect
ambulance_1
Sound effect
accident_1
Sound effect
killed_1
Sound effect
jump_1
Sound effect
rip_1
Sound effect
bonus_take
Sound effect
bonus_approaching
Sound effect