User prompt
The game crashes when you get nitro, fix it ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
The menu screen freezes after a while fix it ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
The text on the menu should swing slowly from left to right like this ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
drifti geri ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
remove drift
User prompt
Also, let the menu look stylish and the in-game gameplay look fluid and let the drift logic come. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Increase in-game car speed by 11 percent
User prompt
Don't let the gas pedal be in play
User prompt
Click on playercar6 31 times get it 11 times faster than normal ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
pedal out of play
User prompt
push the gas pedal down
User prompt
Step down on the accelerator pedal Step down on the accelerator pedal
User prompt
make gas button visible
User prompt
Let there be a separate button, let it be the gas button.
User prompt
Let it be a logic to step on the gas and accelerate as you step on the gas.
User prompt
Please fix the bug: 'ReferenceError: comboTimeWindow is not defined' in or related to this line: 'if (LK.ticks - lastComboTime > comboTimeWindow && comboCount > 0) {' Line Number: 1641
User prompt
Please fix the bug: 'ReferenceError: comboTimeWindow is not defined' in or related to this line: 'if (LK.ticks - lastComboTime > comboTimeWindow && comboCount > 0) {' Line Number: 1643
User prompt
Please fix the bug: 'ReferenceError: comboTxt is not defined' in or related to this line: 'if (comboTxt) {' Line Number: 1645
User prompt
Reduce normal speeds by 30 percent
User prompt
add features that will make the game betterü ↪💡 Consider importing and using the following plugins: @upit/tween.v1, @upit/storage.v1
User prompt
enemycar4 remove
User prompt
INCREASE NORMAL SPEED OF VEHICLES BY 65 PERCENT
User prompt
BOOST WITH NITRO MAKE THE CAR A LOT MORE ACCELERATOR ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
adding songs to the game
User prompt
PUT A GOOD SONG BACK
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Bomb = Container.expand(function () {
var self = Container.call(this);
var bombGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
// Make bomb look dangerous with dark red tint and smaller size
bombGraphics.tint = 0x660000;
bombGraphics.scaleX = 0.6;
bombGraphics.scaleY = 0.6;
self.speed = 12;
self.targetLane = 1;
self.rotationSpeed = 0.3;
self.pulseScale = 1;
self.pulseDirection = 1;
self.update = function () {
self.speed = 12 * gameSpeed;
self.y += self.speed;
// Move towards target lane (player's position when thrown)
var targetX = 324 + self.targetLane * 400;
var diff = targetX - self.x;
if (Math.abs(diff) > 10) {
self.x += diff * 0.1;
}
// Spinning and pulsing animation for danger effect
bombGraphics.rotation += self.rotationSpeed;
self.pulseScale += self.pulseDirection * 0.05;
if (self.pulseScale > 1.3) {
self.pulseDirection = -1;
} else if (self.pulseScale < 0.8) {
self.pulseDirection = 1;
}
bombGraphics.scaleX = 0.6 * self.pulseScale;
bombGraphics.scaleY = 0.6 * self.pulseScale;
};
return self;
});
var Bomber = Container.expand(function () {
var self = Container.call(this);
var bomberGraphics = self.attachAsset('bomberPerson', {
anchorX: 0.5,
anchorY: 0.5
});
// Make bomber distinct with darker brown color and human-like proportions
bomberGraphics.scaleX = 0.8;
bomberGraphics.scaleY = 0.9;
self.speed = 6;
self.lane = 0;
self.throwTimer = 0;
self.throwInterval = 120; // Throw bomb every 2 seconds
self.hasThrown = false;
self.update = function () {
var difficultyMultiplier = 1 + distanceTraveled / 10000;
self.speed = 6 * gameSpeed * difficultyMultiplier;
self.y += self.speed;
// Throw bomb when close to player
self.throwTimer++;
if (!self.hasThrown && self.throwTimer >= self.throwInterval && self.y > 500 && self.y < 1800) {
self.throwBomb();
self.hasThrown = true;
}
// Add slight bobbing motion
bomberGraphics.rotation = Math.sin(LK.ticks * 0.03) * 0.1;
};
self.throwBomb = function () {
var bomb = game.addChild(new Bomb());
bomb.x = self.x;
bomb.y = self.y + 50;
bomb.targetLane = playerCar.currentLane;
bomb.speed = 12 * gameSpeed;
bombs.push(bomb);
};
return self;
});
var Cup = Container.expand(function () {
var self = Container.call(this);
var cupGraphics = self.attachAsset('cup', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.rotationSpeed = 0.15;
self.pulseScale = 1;
self.pulseDirection = 1;
self.update = function () {
self.speed = 8 * gameSpeed;
self.y += self.speed;
cupGraphics.rotation += self.rotationSpeed;
// Enhanced pulsing effect with sparkle
self.pulseScale += self.pulseDirection * 0.04;
if (self.pulseScale > 1.6) {
self.pulseDirection = -1;
} else if (self.pulseScale < 0.8) {
self.pulseDirection = 1;
}
cupGraphics.scaleX = self.pulseScale;
cupGraphics.scaleY = self.pulseScale;
// Enhanced golden effect with sparkle animation
var sparkleIntensity = 0.8 + Math.sin(LK.ticks * 0.15) * 0.2;
cupGraphics.alpha = sparkleIntensity;
// Alternating between bright gold and white for sparkle effect
if (Math.sin(LK.ticks * 0.1) > 0.7) {
cupGraphics.tint = 0xFFFFFF; // Bright white sparkle
} else {
cupGraphics.tint = 0xFFD700; // Rich gold
}
};
return self;
});
var EnemyCar = Container.expand(function (carType) {
var self = Container.call(this);
var assetId = carType || 'enemyCar1';
var carGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.lane = 0;
self.update = function () {
// Progressive speed increase with difficulty
var difficultyMultiplier = 1 + distanceTraveled / 8000; // Enemies get faster over time
self.speed = 8 * gameSpeed * difficultyMultiplier;
self.y += self.speed;
// Add subtle bobbing motion for visual interest
carGraphics.rotation = Math.sin(LK.ticks * 0.05) * 0.02;
};
return self;
});
var EnemyCar4 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('enemyCar3', {
anchorX: 0.5,
anchorY: 0.5
});
// Cyberpunk design with neon aesthetic
carGraphics.tint = 0x00FFFF; // Neon cyan base
carGraphics.scaleX = 1.8; // Massive and intimidating
carGraphics.scaleY = 1.8;
self.speed = 22; // Lightning fast
self.lane = 0;
self.aiState = 'hunting'; // 'hunting', 'attacking', 'retreating', 'cloaked'
self.huntingTimer = 0;
self.attackingTimer = 0;
self.cloakTimer = 0;
self.phaseShiftCooldown = 0;
self.energyLevel = 100; // Energy for special abilities
self.energyRegenRate = 0.5;
self.hyperChargeActive = false;
self.hyperChargeTimer = 0;
self.plasmaTrailPhase = 0;
self.quantumDistortion = 0;
self.neuralNetworkTimer = 0;
self.predictedPlayerLane = 1;
self.aggroLevel = 0; // Builds up over time
self.lastPlayerX = 0;
self.lastPlayerY = 0;
self.teleportCharges = 3;
self.teleportRechargeTimer = 0;
// Create advanced particle systems
self.plasmaParticles = [];
self.quantumParticles = [];
self.energyTrails = [];
// Plasma energy system - 12 particles for intense effect
for (var i = 0; i < 12; i++) {
var plasmaParticle = self.addChild(LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.08,
scaleY: 0.08
}));
plasmaParticle.tint = 0xFF0080;
plasmaParticle.alpha = 0.9;
plasmaParticle.orbitRadius = 80 + Math.random() * 60;
plasmaParticle.orbitSpeed = 0.15 + Math.random() * 0.25;
plasmaParticle.orbitPhase = Math.random() * Math.PI * 2;
plasmaParticle.energyType = Math.random() < 0.5 ? 'plasma' : 'quantum';
self.plasmaParticles.push(plasmaParticle);
}
// Quantum distortion field - 6 larger particles
for (var q = 0; q < 6; q++) {
var quantumParticle = self.addChild(LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.15,
scaleY: 0.15
}));
quantumParticle.tint = 0x8000FF;
quantumParticle.alpha = 0.6;
quantumParticle.orbitRadius = 120 + Math.random() * 80;
quantumParticle.orbitSpeed = 0.08 + Math.random() * 0.12;
quantumParticle.orbitPhase = Math.random() * Math.PI * 2;
quantumParticle.pulsePhase = Math.random() * Math.PI * 2;
self.quantumParticles.push(quantumParticle);
}
// Energy trail system - 8 trailing particles
for (var t = 0; t < 8; t++) {
var trailParticle = self.addChild(LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.12,
scaleY: 0.12
}));
trailParticle.tint = 0x00FFFF;
trailParticle.alpha = 0.7;
trailParticle.trailIndex = t;
trailParticle.x = 0;
trailParticle.y = t * 25;
self.energyTrails.push(trailParticle);
}
self.update = function () {
// Cyberpunk AI with extreme intelligence
var difficultyMultiplier = 2.5 + distanceTraveled / 2500;
self.speed = 22 * gameSpeed * difficultyMultiplier;
self.y += self.speed;
// Advanced neural network tracking
self.neuralNetworkTimer++;
if (playerCar && self.neuralNetworkTimer % 10 === 0) {
// Predict player movement based on velocity and patterns
var playerVelocityX = playerCar.x - self.lastPlayerX;
var playerVelocityY = playerCar.y - self.lastPlayerY;
self.predictedPlayerLane = Math.round((playerCar.x + playerVelocityX * 30 - 324) / 400);
self.predictedPlayerLane = Math.max(0, Math.min(3, self.predictedPlayerLane));
self.lastPlayerX = playerCar.x;
self.lastPlayerY = playerCar.y;
}
// Energy regeneration and management
self.energyLevel = Math.min(100, self.energyLevel + self.energyRegenRate);
// Teleport charges regeneration
self.teleportRechargeTimer++;
if (self.teleportRechargeTimer > 600 && self.teleportCharges < 3) {
self.teleportCharges++;
self.teleportRechargeTimer = 0;
}
// Aggression level builds over time and proximity to player
self.aggroLevel = Math.min(100, self.aggroLevel + 0.1);
if (playerCar) {
var distanceToPlayer = Math.abs(self.y - playerCar.y);
if (distanceToPlayer < 600) {
self.aggroLevel = Math.min(100, self.aggroLevel + 0.5);
}
}
// Advanced AI state machine
if (self.aiState === 'hunting') {
self.huntingTimer++;
// Intelligent stalking behavior
if (playerCar && self.huntingTimer > 60) {
var playerDistance = Math.abs(self.y - playerCar.y);
if (playerDistance < 800 && self.energyLevel > 50) {
self.aiState = 'attacking';
self.attackingTimer = 0;
LK.effects.flashScreen(0xFF0080, 200);
}
}
} else if (self.aiState === 'attacking') {
self.attackingTimer++;
// Hyper-aggressive assault mode
if (self.attackingTimer > 180 || self.energyLevel < 20) {
self.aiState = 'retreating';
} else if (self.teleportCharges > 0 && Math.random() < 0.05) {
// Tactical teleportation
self.performTeleport();
}
} else if (self.aiState === 'retreating') {
// Temporary retreat to recharge
if (self.energyLevel > 70) {
self.aiState = 'cloaked';
self.cloakTimer = 0;
}
} else if (self.aiState === 'cloaked') {
self.cloakTimer++;
if (self.cloakTimer > 120) {
self.aiState = 'hunting';
self.huntingTimer = 0;
}
}
// Quantum lane shifting with predictive AI
if (self.aiState === 'attacking' && Math.random() < 0.12) {
var targetLane;
if (Math.random() < 0.85) {
// 85% chance to use AI prediction
targetLane = self.predictedPlayerLane;
// Advanced blocking strategy
if (Math.random() < 0.6) {
var blockingLanes = [self.predictedPlayerLane - 1, self.predictedPlayerLane, self.predictedPlayerLane + 1];
targetLane = blockingLanes[Math.floor(Math.random() * blockingLanes.length)];
targetLane = Math.max(0, Math.min(3, targetLane));
}
} else {
targetLane = Math.floor(Math.random() * 4);
}
var targetX = 324 + targetLane * 400;
// Quantum phase shift effect
if (self.energyLevel > 30) {
self.x = targetX;
self.energyLevel -= 15;
LK.effects.flashObject(self, 0xFFFFFF, 400);
LK.effects.flashScreen(0x8000FF, 100);
}
}
// Hypercharge mode activation
self.hyperChargeTimer++;
if (self.hyperChargeTimer > 400 && self.energyLevel > 80 && Math.random() < 0.04) {
self.hyperChargeActive = !self.hyperChargeActive;
self.hyperChargeTimer = 0;
if (self.hyperChargeActive) {
self.energyLevel -= 40;
LK.effects.flashScreen(0xFF00FF, 600);
carGraphics.scaleX = 2.4;
carGraphics.scaleY = 2.4;
} else {
carGraphics.scaleX = 1.8;
carGraphics.scaleY = 1.8;
}
}
// Quantum distortion effects
self.quantumDistortion += 0.25;
self.plasmaTrailPhase += 0.2;
// Update plasma particle system
for (var p = 0; p < self.plasmaParticles.length; p++) {
var particle = self.plasmaParticles[p];
particle.orbitPhase += particle.orbitSpeed;
var orbitMultiplier = self.hyperChargeActive ? 1.5 : 1;
var x = Math.cos(particle.orbitPhase) * particle.orbitRadius * orbitMultiplier;
var y = Math.sin(particle.orbitPhase) * particle.orbitRadius * 0.6 * orbitMultiplier;
particle.x = x;
particle.y = y;
// Dynamic particle effects based on AI state
if (self.aiState === 'attacking') {
particle.tint = 0xFF0040; // Aggressive red-pink
particle.alpha = 0.9 + Math.sin(LK.ticks * 0.3 + p) * 0.1;
} else if (self.aiState === 'cloaked') {
particle.tint = 0x4000FF; // Stealth purple
particle.alpha = 0.3 + Math.sin(LK.ticks * 0.15 + p) * 0.2;
} else {
particle.tint = particle.energyType === 'plasma' ? 0xFF0080 : 0x00FFFF;
particle.alpha = 0.7 + Math.sin(LK.ticks * 0.2 + p) * 0.3;
}
}
// Update quantum distortion field
for (var q = 0; q < self.quantumParticles.length; q++) {
var qParticle = self.quantumParticles[q];
qParticle.orbitPhase += qParticle.orbitSpeed;
qParticle.pulsePhase += 0.1;
var distortionRadius = qParticle.orbitRadius + Math.sin(self.quantumDistortion + q) * 30;
var x = Math.cos(qParticle.orbitPhase) * distortionRadius;
var y = Math.sin(qParticle.orbitPhase) * distortionRadius * 0.4;
qParticle.x = x;
qParticle.y = y;
var pulseIntensity = Math.sin(qParticle.pulsePhase) * 0.4;
qParticle.alpha = 0.4 + pulseIntensity;
qParticle.scaleX = 0.15 + pulseIntensity * 0.1;
qParticle.scaleY = 0.15 + pulseIntensity * 0.1;
// Color based on energy level
if (self.energyLevel > 70) {
qParticle.tint = 0x8000FF; // High energy purple
} else if (self.energyLevel > 40) {
qParticle.tint = 0x4080FF; // Medium energy blue
} else {
qParticle.tint = 0x2040FF; // Low energy dark blue
}
}
// Update energy trail system
for (var t = 0; t < self.energyTrails.length; t++) {
var trail = self.energyTrails[t];
// Create trailing effect behind the car
trail.y = trail.trailIndex * 30 + Math.sin(self.plasmaTrailPhase + t * 0.5) * 15;
trail.alpha = 0.8 - trail.trailIndex * 0.1;
trail.scaleX = 0.12 - trail.trailIndex * 0.01;
trail.scaleY = 0.12 - trail.trailIndex * 0.01;
// Color cycling for trail
var trailHue = (LK.ticks * 0.05 + t * 0.2) % 1;
if (trailHue < 0.33) {
trail.tint = 0x00FFFF; // Cyan
} else if (trailHue < 0.66) {
trail.tint = 0xFF00FF; // Magenta
} else {
trail.tint = 0xFFFF00; // Yellow
}
}
// Cyberpunk visual effects
var rotationIntensity = self.hyperChargeActive ? 2.5 : 1;
carGraphics.rotation = Math.sin(LK.ticks * 0.18) * 0.4 * rotationIntensity + Math.cos(LK.ticks * 0.12) * 0.25;
// Advanced color cycling system
var stateColorMultiplier = 1;
if (self.aiState === 'attacking') {
stateColorMultiplier = 1.5;
} else if (self.aiState === 'cloaked') {
stateColorMultiplier = 0.5;
}
// Complex color transitions
var colorPhase = (LK.ticks * 0.1 + self.aggroLevel * 0.01) % (Math.PI * 2);
if (Math.random() < 0.08 * stateColorMultiplier) {
carGraphics.tint = 0xFFFFFF; // Bright flash
} else if (Math.random() < 0.15) {
carGraphics.tint = 0xFF0080; // Neon pink
} else if (Math.random() < 0.25) {
carGraphics.tint = 0x8000FF; // Electric purple
} else if (Math.random() < 0.4) {
carGraphics.tint = 0x0080FF; // Cyber blue
} else {
carGraphics.tint = 0x00FFFF; // Default cyan
}
// Dynamic alpha and scale effects
var intensityPulse = 0.6 + Math.sin(LK.ticks * 0.15) * 0.4;
var aggroPulse = 1 + self.aggroLevel / 100 * 0.3;
carGraphics.alpha = Math.max(0.4, intensityPulse * stateColorMultiplier);
// Scale effects based on state
var baseScale = self.hyperChargeActive ? 2.4 : 1.8;
var dynamicPulse = 1 + Math.sin(LK.ticks * 0.14) * 0.12;
carGraphics.scaleX = baseScale * dynamicPulse * aggroPulse;
carGraphics.scaleY = baseScale * dynamicPulse * aggroPulse;
// Quantum shockwave attacks
if (self.aiState === 'attacking' && Math.random() < 0.02) {
LK.effects.flashScreen(0x8000FF, 300);
// Drain some energy for attack
self.energyLevel = Math.max(0, self.energyLevel - 10);
}
};
// Special ability: Quantum teleportation
self.performTeleport = function () {
if (self.teleportCharges > 0) {
self.teleportCharges--;
// Teleport to strategic position near player
if (playerCar) {
var teleportLane = self.predictedPlayerLane;
// Sometimes teleport to blocking position
if (Math.random() < 0.6) {
var blockingOptions = [teleportLane - 1, teleportLane + 1];
teleportLane = blockingOptions[Math.floor(Math.random() * blockingOptions.length)];
teleportLane = Math.max(0, Math.min(3, teleportLane));
}
self.x = 324 + teleportLane * 400;
self.y = playerCar.y - 400; // Appear ahead of player
}
// Massive teleport effect
LK.effects.flashScreen(0xFF00FF, 500);
LK.effects.flashObject(self, 0xFFFFFF, 600);
self.energyLevel = Math.max(0, self.energyLevel - 25);
}
};
return self;
});
var Explosion = Container.expand(function () {
var self = Container.call(this);
self.particles = [];
self.lifeTime = 0;
self.maxLifeTime = 60; // 1 second at 60fps
// Create enhanced explosion particles with more variety
for (var i = 0; i < 20; i++) {
var particle = self.addChild(LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.2 + Math.random() * 0.4,
scaleY: 0.2 + Math.random() * 0.4
}));
// More vibrant explosion colors
var colors = [0xFF1100, 0xFF4400, 0xFF6600, 0xFF8800, 0xFFAA00, 0xFFCC00, 0xFFFF00, 0xFFFFFF];
particle.tint = colors[Math.floor(Math.random() * colors.length)];
particle.vx = (Math.random() - 0.5) * 30;
particle.vy = (Math.random() - 0.5) * 30;
particle.gravity = 0.3 + Math.random() * 0.4;
particle.friction = 0.92 + Math.random() * 0.06;
particle.rotationSpeed = (Math.random() - 0.5) * 0.3;
self.particles.push(particle);
}
self.update = function () {
self.lifeTime++;
// Update particles with enhanced physics
for (var i = 0; i < self.particles.length; i++) {
var particle = self.particles[i];
particle.x += particle.vx;
particle.y += particle.vy;
particle.vy += particle.gravity;
particle.vx *= particle.friction;
particle.vy *= particle.friction;
// Add rotation to particles
particle.rotation += particle.rotationSpeed;
// Enhanced fade out with size reduction
var fadeProgress = self.lifeTime / self.maxLifeTime;
particle.alpha = 1 - fadeProgress;
particle.scaleX *= 0.98;
particle.scaleY *= 0.98;
// Color intensity decreases over time
if (fadeProgress > 0.5) {
var intensity = 1 - (fadeProgress - 0.5) * 2;
particle.tint = particle.tint & 0xFFFFFF * intensity;
}
}
// Destroy explosion when done
if (self.lifeTime >= self.maxLifeTime) {
self.destroy();
}
};
return self;
});
var Nitro = Container.expand(function () {
var self = Container.call(this);
var nitroGraphics = self.attachAsset('nitro', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.rotationSpeed = 0.2;
self.pulseScale = 1;
self.pulseDirection = 1;
self.update = function () {
self.y += self.speed;
nitroGraphics.rotation += self.rotationSpeed;
// Enhanced pulsing effect with electric blue glow
self.pulseScale += self.pulseDirection * 0.03;
if (self.pulseScale > 1.5) {
self.pulseDirection = -1;
} else if (self.pulseScale < 0.7) {
self.pulseDirection = 1;
}
nitroGraphics.scaleX = self.pulseScale;
nitroGraphics.scaleY = self.pulseScale;
// Electric blue glow effect with lightning-like intensity changes
var electricIntensity = 0.6 + Math.sin(LK.ticks * 0.2) * 0.4;
nitroGraphics.alpha = electricIntensity;
// Bright electric blue with occasional white flashes
if (Math.random() < 0.1) {
nitroGraphics.tint = 0xFFFFFF; // White flash
} else {
nitroGraphics.tint = 0x00BFFF; // Electric blue
}
};
return self;
});
var Pedestrian = Container.expand(function () {
var self = Container.call(this);
var pedestrianGraphics = self.attachAsset('pedestrian', {
anchorX: 0.5,
anchorY: 0.5
});
// Make pedestrian look different from bomber with varied appearances
var appearances = [{
tint: 0xFF6B6B,
scaleX: 0.6,
scaleY: 0.9
},
// Red shirt, tall
{
tint: 0x4ECDC4,
scaleX: 0.8,
scaleY: 0.7
},
// Teal shirt, short
{
tint: 0xFFE66D,
scaleX: 0.7,
scaleY: 0.8
},
// Yellow shirt, medium
{
tint: 0xA8E6CF,
scaleX: 0.75,
scaleY: 0.85
},
// Green shirt, medium-tall
{
tint: 0xFF8B94,
scaleX: 0.65,
scaleY: 0.75
},
// Pink shirt, small
{
tint: 0xB4A7D6,
scaleX: 0.9,
scaleY: 0.6
} // Purple shirt, wide
];
var appearance = appearances[Math.floor(Math.random() * appearances.length)];
pedestrianGraphics.tint = appearance.tint;
pedestrianGraphics.scaleX = appearance.scaleX;
pedestrianGraphics.scaleY = appearance.scaleY;
self.speed = 6;
self.lane = 0;
self.jumpPhase = 'waiting'; // 'waiting', 'jumping', 'crossing'
self.jumpTimer = 0;
self.jumpInterval = 180; // 3 seconds to decide to jump
self.targetLane = Math.floor(Math.random() * 4); // Target lane to reach
self.crossingSpeed = 3;
self.update = function () {
var difficultyMultiplier = 1 + distanceTraveled / 10000;
self.speed = 6 * gameSpeed * difficultyMultiplier;
self.y += self.speed;
// Handle jumping behavior
self.jumpTimer++;
if (self.jumpPhase === 'waiting' && self.jumpTimer >= self.jumpInterval && self.y > 500 && self.y < 1800) {
// Start jumping onto road
self.jumpPhase = 'jumping';
self.jumpTimer = 0;
}
if (self.jumpPhase === 'jumping') {
// Move toward target lane
var targetX = 324 + self.targetLane * 400;
var diff = targetX - self.x;
if (Math.abs(diff) > 20) {
self.x += diff * 0.08;
} else {
self.jumpPhase = 'crossing';
}
}
if (self.jumpPhase === 'crossing') {
// Cross the road randomly
if (Math.random() < 0.02) {
self.targetLane = Math.floor(Math.random() * 4);
}
var targetX = 324 + self.targetLane * 400;
var diff = targetX - self.x;
self.x += diff * 0.05;
}
// Add walking animation
pedestrianGraphics.rotation = Math.sin(LK.ticks * 0.1) * 0.1;
};
return self;
});
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.35;
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
// Jump finished
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
// Calculate jump arc (parabolic motion)
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100;
carGraphics.y = -jumpHeight;
// Add rotation during jump
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.2;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
// Add slow dramatic turn effect when switching lanes
tween(carGraphics, {
rotation: direction * 0.4
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 600,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PlayerCar2 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar2', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.42; // Much faster lane switching speed
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100;
carGraphics.y = -jumpHeight;
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.25;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
// Add slow dramatic turn effect when switching lanes with different rotation
tween(carGraphics, {
rotation: direction * 0.5
}, {
duration: 900,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 700,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PlayerCar3 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar3', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.38; // Faster lane switching speed
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100;
carGraphics.y = -jumpHeight;
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.15;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
// Add slow dramatic turn effect when switching lanes
tween(carGraphics, {
rotation: direction * 0.3
}, {
duration: 750,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 550,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PlayerCar4 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar4', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.35; // Standard lane switching speed like other cars
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100; // Standard jump height
carGraphics.y = -jumpHeight;
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.2;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
// Standard turn effect like other cars
tween(carGraphics, {
rotation: direction * 0.4
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 600,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PlayerCar5 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar5', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.75; // Much faster lane switching speed
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100;
carGraphics.y = -jumpHeight;
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.3;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
tween(carGraphics, {
rotation: direction * 0.35
}, {
duration: 700,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 500,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PlayerCar6 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar6', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.85; // Very fast lane switching speed
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100;
carGraphics.y = -jumpHeight;
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.1;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
tween(carGraphics, {
rotation: direction * 0.6
}, {
duration: 1000,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 800,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.rotationSpeed = 0.1;
self.update = function () {
self.speed = 8 * gameSpeed;
self.y += self.speed;
powerUpGraphics.rotation += self.rotationSpeed;
// Enhanced visual effects with glow pulsing
var glowIntensity = 0.7 + Math.sin(LK.ticks * 0.1) * 0.3;
powerUpGraphics.alpha = glowIntensity;
// Add rainbow tint cycling for more appealing visuals
var hue = LK.ticks * 0.05 % (Math.PI * 2);
var r = Math.floor(Math.sin(hue) * 127 + 128);
var g = Math.floor(Math.sin(hue + Math.PI * 2 / 3) * 127 + 128);
var b = Math.floor(Math.sin(hue + Math.PI * 4 / 3) * 127 + 128);
powerUpGraphics.tint = r << 16 | g << 8 | b;
};
return self;
});
var Ramp = Container.expand(function () {
var self = Container.call(this);
// Create ramp visual using multiple road line assets
var rampBase = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 8,
scaleY: 2
});
rampBase.tint = 0x888888;
var rampTop = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 1,
y: -20
});
rampTop.tint = 0xAAAAA;
self.speed = 8;
self.lane = 0;
self.update = function () {
self.speed = 8 * gameSpeed;
self.y += self.speed;
// Add slight glow effect
rampBase.alpha = 0.8 + Math.sin(LK.ticks * 0.1) * 0.2;
};
return self;
});
var RoadLine = Container.expand(function () {
var self = Container.call(this);
var lineGraphics = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.speed = 8 * gameSpeed;
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2c3e50
});
/****
* Game Code
****/
// Game state management
var gameState = 'menu'; // 'menu', 'playing', 'gameOver'
var menuElements = [];
var bestDistance = 0;
// Load best score from storage
function loadBestScore() {
var saved = storage.bestDistance;
if (saved !== undefined) {
bestDistance = saved;
}
}
// Save best score to storage
function saveBestScore() {
storage.bestDistance = bestDistance;
}
// Start menu creation
function createStartMenu() {
// Simple road background - just a few lines for context
for (var i = 0; i < 8; i++) {
for (var lane = 0; lane < 4; lane++) {
var menuLine = LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
x: 624 + lane * 400,
y: i * 250 + 300
});
menuLine.alpha = 0.2;
game.addChild(menuLine);
menuElements.push(menuLine);
}
}
// Clean title - big and centered
var titleText = new Text2('HIGHWAY RUSH', {
size: 160,
fill: '#FFD700',
stroke: '#000000',
strokeThickness: 6
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 600;
game.addChild(titleText);
menuElements.push(titleText);
// Best score display - simple and clear
var bestScoreText = new Text2('Best: ' + bestDistance + 'm', {
size: 70,
fill: '#FFFFFF',
stroke: '#000000',
strokeThickness: 4
});
bestScoreText.anchor.set(0.5, 0.5);
bestScoreText.x = 1024;
bestScoreText.y = 750;
game.addChild(bestScoreText);
menuElements.push(bestScoreText);
// Car selection section - clean and organized
var carSelectionText = new Text2('Choose Car:', {
size: 60,
fill: '#FFFFFF',
stroke: '#000000',
strokeThickness: 3
});
carSelectionText.anchor.set(0.5, 0.5);
carSelectionText.x = 1024;
carSelectionText.y = 950;
game.addChild(carSelectionText);
menuElements.push(carSelectionText);
// Car selection buttons - moved to the left
var car1Button = LK.getAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5,
x: 224,
y: 1150,
scaleX: 1.0,
scaleY: 1.0
});
game.addChild(car1Button);
menuElements.push(car1Button);
var car2Button = LK.getAsset('playerCar2', {
anchorX: 0.5,
anchorY: 0.5,
x: 524,
y: 1150,
scaleX: 1.0,
scaleY: 1.0
});
game.addChild(car2Button);
menuElements.push(car2Button);
var car3Button = LK.getAsset('playerCar3', {
anchorX: 0.5,
anchorY: 0.5,
x: 824,
y: 1150,
scaleX: 1.0,
scaleY: 1.0
});
game.addChild(car3Button);
menuElements.push(car3Button);
// Add playerCar4 button (initially hidden if not unlocked)
var car4Button = LK.getAsset('playerCar4', {
anchorX: 0.5,
anchorY: 0.5,
x: 1124,
y: 1150,
scaleX: 1.0,
scaleY: 1.0,
tint: 0x00FFFF
});
game.addChild(car4Button);
menuElements.push(car4Button);
// Add playerCar5 button
var car5Button = LK.getAsset('playerCar5', {
anchorX: 0.5,
anchorY: 0.5,
x: 1424,
y: 1150,
scaleX: 1.0,
scaleY: 1.0
});
game.addChild(car5Button);
menuElements.push(car5Button);
// Add playerCar6 button
var car6Button = LK.getAsset('playerCar6', {
anchorX: 0.5,
anchorY: 0.5,
x: 1724,
y: 1150,
scaleX: 1.0,
scaleY: 1.0
});
game.addChild(car6Button);
menuElements.push(car6Button);
// Selection indicator
selectionIndicator = LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 8,
scaleY: 0.8,
x: selectedCarType === 0 ? 224 : selectedCarType === 1 ? 524 : selectedCarType === 2 ? 824 : selectedCarType === 3 ? 1124 : selectedCarType === 4 ? 1424 : 1724,
y: 1280
});
selectionIndicator.tint = 0xFFD700;
game.addChild(selectionIndicator);
menuElements.push(selectionIndicator);
// Instructions - simple and clear
var instructionsText = new Text2('Swipe to change lanes • Avoid traffic • Collect power-ups', {
size: 50,
fill: '#CCCCCC',
stroke: '#000000',
strokeThickness: 2
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 1024;
instructionsText.y = 1450;
game.addChild(instructionsText);
menuElements.push(instructionsText);
// Simple START BUTTON at bottom
var startButton = LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 20,
scaleY: 3,
x: 1024,
y: 2400
});
startButton.tint = 0x00BB00;
game.addChild(startButton);
menuElements.push(startButton);
// START text
var startButtonText = new Text2('START', {
size: 100,
fill: '#FFFFFF',
stroke: '#000000',
strokeThickness: 5
});
startButtonText.anchor.set(0.5, 0.5);
startButtonText.x = 1024;
startButtonText.y = 2400;
game.addChild(startButtonText);
menuElements.push(startButtonText);
// Store button references for animations
var buttonElements = {
button: startButton,
text: startButtonText
};
// Initialize selection visual state
updateCarSelection();
// Simple animations - just gentle pulsing
tween(titleText, {
scaleX: 1.05,
scaleY: 1.05
}, {
duration: 2000,
yoyo: true,
repeat: -1
});
// Simple button animations
tween(buttonElements.button, {
scaleX: 21,
scaleY: 3.2
}, {
duration: 1500,
yoyo: true,
repeat: -1
});
tween(buttonElements.text, {
scaleX: 1.05,
scaleY: 1.05
}, {
duration: 1500,
yoyo: true,
repeat: -1
});
}
function removeStartMenu() {
for (var i = 0; i < menuElements.length; i++) {
menuElements[i].destroy();
}
menuElements = [];
}
function startGame() {
gameState = 'playing';
removeStartMenu();
loadBestScore();
initializeGameplay();
// Reset tap counter after starting game
car1TapCount = 0;
car2TapCount = 0;
car3TapCount = 0;
}
function initializeGameplay() {
// Initialize all game variables
gameSpeed = 1;
spawnTimer = 0;
spawnRate = 120;
lineSpawnTimer = 0;
powerUpSpawnTimer = 0;
nitroSpawnTimer = 0;
cupSpawnTimer = 0;
bomberSpawnTimer = 0;
rampSpawnTimer = 0;
pedestrianSpawnTimer = 0;
playerJumping = false;
jumpStartTime = 0;
jumpHeight = 0;
// Check if car1 was tapped 10 times for secret unlock
if (selectedCarType === 0 && car1TapCount >= 10) {
distanceTraveled = 2000;
gameSpeed = 1 + distanceTraveled / 7000 + Math.pow(distanceTraveled / 15000, 1.5);
gameSpeed = Math.min(gameSpeed, 4);
// Flash screen to indicate secret unlock
LK.effects.flashScreen(0x00ff00, 500);
} else if (selectedCarType === 1 && car2TapCount >= 10) {
// Trophy road mode - start with lots of trophies
distanceTraveled = 0;
// Flash screen golden to indicate trophy road
LK.effects.flashScreen(0xFFD700, 1000);
// Set flag for trophy road mode
trophyRoadMode = true;
} else {
distanceTraveled = 0;
}
nitroEffect = false;
nitroEndTime = 0;
hasShield = false;
trophyRoadMode = false;
rapModeActive = false;
rapModeTimer = 0;
playerCar4Unlocked = true;
// Reset score
LK.setScore(0);
// Add enhanced road background
var roadBackground = game.addChild(LK.getAsset('roadCenter', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
}));
roadBackground.alpha = 0.8;
// Add road side markers
var leftSide = game.addChild(LK.getAsset('roadSide', {
anchorX: 0.5,
anchorY: 0.5,
x: 200,
y: 1366
}));
var rightSide = game.addChild(LK.getAsset('roadSide', {
anchorX: 0.5,
anchorY: 0.5,
x: 1848,
y: 1366
}));
// Update UI texts with English
scoreTxt.setText('Distance: ' + Math.floor(distanceTraveled));
bestScoreTxt.setText('Best: ' + bestDistance);
speedTxt.setText('Speed: ' + gameSpeed.toFixed(1) + 'x');
// Reinitialize player car to ensure it's properly set up
initializePlayerCar();
// Start background music
LK.playMusic('bgmusic');
}
// Initialize best score system
loadBestScore();
// Create start menu on game load
createStartMenu();
// Car selection variable
var selectedCarType = 0; // 0 for PlayerCar, 1 for PlayerCar2, 2 for PlayerCar3
var playerCar;
var selectionIndicator;
var car1TapCount = 0; // Track taps on playercar1 for secret unlock
var car2TapCount = 0; // Track taps on playercar2 for trophy road
var car3TapCount = 0; // Track taps on playercar3 for secret message
// Update car selection visual state
function updateCarSelection() {
if (selectionIndicator) {
selectionIndicator.x = selectedCarType === 0 ? 224 : selectedCarType === 1 ? 524 : selectedCarType === 2 ? 824 : selectedCarType === 3 ? 1124 : selectedCarType === 4 ? 1424 : 1724;
}
// Check if car 3 is unlocked
var car3Unlocked = bestDistance >= 2000;
// Update car button tints if they exist
if (menuElements.length > 0) {
for (var i = 0; i < menuElements.length; i++) {
var element = menuElements[i];
if (element.x === 624 && element.y === 1650) {
element.tint = selectedCarType === 0 ? 0xFFD700 : 0xFFFFFF;
} else if (element.x === 1024 && element.y === 1650) {
element.tint = selectedCarType === 1 ? 0xFFD700 : 0xFFFFFF;
} else if (element.x === 1424 && element.y === 1650) {
if (car3Unlocked) {
element.tint = selectedCarType === 2 ? 0xFFD700 : 0xFFFFFF;
} else {
element.tint = 0x666666; // Gray out locked car
element.alpha = 0.5;
}
}
}
}
}
// Initialize player car based on selection
function initializePlayerCar() {
if (playerCar) {
playerCar.destroy();
}
if (selectedCarType === 0) {
playerCar = game.addChild(new PlayerCar());
} else if (selectedCarType === 1) {
playerCar = game.addChild(new PlayerCar2());
} else if (selectedCarType === 2) {
playerCar = game.addChild(new PlayerCar3());
} else if (selectedCarType === 3) {
playerCar = game.addChild(new PlayerCar4());
} else if (selectedCarType === 4) {
playerCar = game.addChild(new PlayerCar5());
} else if (selectedCarType === 5) {
playerCar = game.addChild(new PlayerCar6());
}
playerCar.x = 324 + 400; // Lane 1
playerCar.y = 2200;
}
// Initialize the first car
initializePlayerCar();
var enemyCars = [];
var powerUps = [];
var roadLines = [];
var nitros = [];
var cups = [];
var bombers = [];
var bombs = [];
var ramps = [];
var pedestrians = [];
var playerJumping = false;
var jumpStartTime = 0;
var jumpDuration = 60; // 1 second at 60fps
var jumpHeight = 0;
var gameSpeed = 1;
var spawnTimer = 0;
var spawnRate = 120;
var lineSpawnTimer = 0;
var powerUpSpawnTimer = 0;
var nitroSpawnTimer = 0;
var cupSpawnTimer = 0;
var bomberSpawnTimer = 0;
var rampSpawnTimer = 0;
var pedestrianSpawnTimer = 0;
var distanceTraveled = 0;
var nitroEffect = false;
var nitroEndTime = 0;
var hasShield = false;
var trophyRoadMode = false;
var rapModeActive = false;
var rapModeTimer = 0;
var rapModeCheckInterval = 600; // Check every 10 seconds (600 ticks at 60fps)
var playerCar4Unlocked = true;
// Create initial road lines
for (var i = 0; i < 20; i++) {
for (var lane = 0; lane < 4; lane++) {
var line = game.addChild(new RoadLine());
line.x = 524 + lane * 400; // Between lanes
line.y = i * 150 - 200;
roadLines.push(line);
}
}
// UI Elements
var scoreTxt = new Text2('Distance: 0', {
size: 80,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 4
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var bestScoreTxt = new Text2('Best: ' + bestDistance, {
size: 60,
fill: 0xFFD700,
stroke: 0x000000,
strokeThickness: 3
});
bestScoreTxt.anchor.set(0.5, 0);
bestScoreTxt.y = 90;
LK.gui.top.addChild(bestScoreTxt);
var speedTxt = new Text2('Speed: 1x', {
size: 60,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 3
});
speedTxt.anchor.set(1, 1);
speedTxt.x = -20;
speedTxt.y = -20;
LK.gui.bottomRight.addChild(speedTxt);
// Touch controls
var touchStartX = 0;
var touchStartTime = 0;
game.down = function (x, y, obj) {
if (gameState === 'menu') {
// Check car selection buttons
if (y >= 1050 && y <= 1250) {
if (x >= 124 && x <= 324) {
// Car 1 selected
selectedCarType = 0;
car1TapCount++; // Increment tap counter
updateCarSelection();
initializePlayerCar();
return;
} else if (x >= 424 && x <= 624) {
// Car 2 selected
selectedCarType = 1;
car2TapCount++; // Increment tap counter for car2
updateCarSelection();
initializePlayerCar();
return;
} else if (x >= 724 && x <= 924) {
// Car 3 selected - check if unlocked
if (bestDistance >= 2000) {
selectedCarType = 2;
car3TapCount++; // Increment tap counter for car3
// Check if tapped 10 times for secret message
if (car3TapCount >= 10) {
// Display "Thank you Yavuz Abi" in score area
scoreTxt.setText('Thank you Yavuz Abi');
// Flash screen to indicate special message
LK.effects.flashScreen(0xFFD700, 1000);
}
updateCarSelection();
initializePlayerCar();
} else {
// Car 3 is locked, flash red to indicate requirement
LK.effects.flashScreen(0xff0000, 300);
}
return;
} else if (x >= 1024 && x <= 1224) {
// Car 4 selected - check if unlocked
if (playerCar4Unlocked) {
selectedCarType = 3;
updateCarSelection();
initializePlayerCar();
} else {
// Car 4 is locked, flash purple to indicate requirement
LK.effects.flashScreen(0x9932CC, 300);
}
return;
} else if (x >= 1324 && x <= 1524) {
// Car 5 selected
selectedCarType = 4;
updateCarSelection();
initializePlayerCar();
return;
} else if (x >= 1624 && x <= 1824) {
// Car 6 selected
selectedCarType = 5;
updateCarSelection();
initializePlayerCar();
return;
}
}
// Check for start button tap at bottom - expanded touch area for better UX
if (y >= 2150 && y <= 2650 && x >= 500 && x <= 1548) {
startGame();
return;
}
}
touchStartX = x;
touchStartTime = LK.ticks;
};
game.up = function (x, y, obj) {
if (gameState !== 'playing') return;
var touchEndX = x;
var swipeDistance = touchEndX - touchStartX;
var touchDuration = LK.ticks - touchStartTime;
// Detect swipe or tap
if (Math.abs(swipeDistance) > 100 && touchDuration < 30) {
// Swipe detected
if (swipeDistance > 0) {
playerCar.switchLane(1); // Swipe right
} else {
playerCar.switchLane(-1); // Swipe left
}
} else if (touchDuration < 15) {
// Quick tap - determine direction based on screen side
if (x > 1024) {
playerCar.switchLane(1); // Right side tap
} else {
playerCar.switchLane(-1); // Left side tap
}
}
};
function spawnEnemyCar() {
var lane = Math.floor(Math.random() * 4);
var enemy;
// 20% chance to spawn the new powerful EnemyCar4 at higher distances
if (distanceTraveled > 3000 && Math.random() < 0.2) {
enemy = game.addChild(new EnemyCar4());
enemy.x = 324 + lane * 400;
enemy.y = -100;
enemy.lane = lane;
enemy.speed = 12 * gameSpeed;
} else {
var carTypes = ['enemyCar1', 'enemyCar2', 'enemyCar3'];
var carType = carTypes[Math.floor(Math.random() * carTypes.length)];
enemy = game.addChild(new EnemyCar(carType));
enemy.x = 324 + lane * 400;
enemy.y = -100;
enemy.lane = lane;
enemy.speed = 8 * gameSpeed;
}
enemyCars.push(enemy);
}
function spawnPowerUp() {
// Reduce spawn chance as difficulty increases
var spawnChance = Math.max(0.1, 0.3 - distanceTraveled / 25000); // Decreases from 30% to 10%
if (Math.random() < spawnChance) {
var lane = Math.floor(Math.random() * 4);
var powerUp = game.addChild(new PowerUp());
powerUp.x = 324 + lane * 400;
powerUp.y = -100;
powerUp.speed = 8 * gameSpeed;
powerUps.push(powerUp);
}
}
function spawnNitro() {
// Significantly reduce spawn chance as difficulty increases
var spawnChance = Math.max(0.05, 0.2 - distanceTraveled / 20000); // Decreases from 20% to 5%
if (Math.random() < spawnChance) {
var lane = Math.floor(Math.random() * 4);
var nitro = game.addChild(new Nitro());
nitro.x = 324 + lane * 400;
nitro.y = -100;
nitro.speed = 8 * gameSpeed;
nitros.push(nitro);
}
}
function spawnCup() {
// Check if trophy road mode is active
if (trophyRoadMode) {
// In trophy road mode, spawn many cups (trophies)
var spawnChance = 0.8; // Very high spawn chance for trophies
if (Math.random() < spawnChance) {
// Spawn multiple cups across different lanes
for (var trophyLane = 0; trophyLane < 4; trophyLane++) {
if (Math.random() < 0.7) {
// 70% chance per lane
var cup = game.addChild(new Cup());
cup.x = 324 + trophyLane * 400;
cup.y = -100 - trophyLane * 150; // Stagger them vertically
cup.speed = 8 * gameSpeed;
cups.push(cup);
}
}
}
} else {
// Normal spawn chance for cups
var spawnChance = Math.max(0.03, 0.15 - distanceTraveled / 30000); // Decreases from 15% to 3%
if (Math.random() < spawnChance) {
var lane = Math.floor(Math.random() * 4);
var cup = game.addChild(new Cup());
cup.x = 324 + lane * 400;
cup.y = -100;
cup.speed = 8 * gameSpeed;
cups.push(cup);
}
}
}
function spawnRamp() {
// Spawn ramps occasionally to help player jump over obstacles
var spawnChance = Math.max(0.05, 0.15 - distanceTraveled / 20000); // Decreases from 15% to 5%
if (Math.random() < spawnChance) {
var lane = Math.floor(Math.random() * 4);
var ramp = game.addChild(new Ramp());
ramp.x = 324 + lane * 400;
ramp.y = -100;
ramp.lane = lane;
ramp.speed = 8 * gameSpeed;
ramps.push(ramp);
}
}
function spawnPedestrian() {
// Increased spawn chance for pedestrians by 80% more (from 25.92% to 46.66%)
var spawnChance = Math.max(0.1555, 0.4666 - distanceTraveled / 30000); // Decreases from 46.66% to 15.55%
if (Math.random() < spawnChance) {
// Spawn from sides of the road
var startSide = Math.random() < 0.5 ? 0 : 1; // 0 = left, 1 = right
var pedestrian = game.addChild(new Pedestrian());
pedestrian.x = startSide === 0 ? 124 : 1924; // Start from road sides
pedestrian.y = -100;
pedestrian.lane = startSide === 0 ? 0 : 3; // Start lane
pedestrian.speed = 6 * gameSpeed;
pedestrians.push(pedestrian);
}
}
function spawnBomber() {
// Moderate spawn chance for bombers
var spawnChance = Math.max(0.08, 0.25 - distanceTraveled / 25000); // Decreases from 25% to 8%
if (Math.random() < spawnChance) {
var lane = Math.floor(Math.random() * 4);
var bomber = game.addChild(new Bomber());
bomber.x = 324 + lane * 400;
bomber.y = -100;
bomber.lane = lane;
bomber.speed = 6 * gameSpeed;
bombers.push(bomber);
}
}
game.update = function () {
// Only update game logic when playing
if (gameState !== 'playing') return;
// PlayerCar4 is now available from the start - no unlock required
// Check for rap mode activation
rapModeTimer++;
if (rapModeTimer >= rapModeCheckInterval) {
// 80% chance to activate rap mode every 10 seconds - rap appears frequently now!
if (Math.random() < 0.8 && !rapModeActive) {
rapModeActive = true;
// Flash screen with hip-hop colors (purple/gold)
LK.effects.flashScreen(0x9932CC, 800);
// Change UI text to rap style
scoreTxt.setText('Yo Distance: ' + Math.floor(distanceTraveled) + ' meters!');
speedTxt.setText('Speed Flow: ' + gameSpeed.toFixed(1) + 'x');
// Rap mode lasts for 5 seconds
LK.setTimeout(function () {
rapModeActive = false;
// Reset UI text to normal
scoreTxt.setText('Distance: ' + Math.floor(distanceTraveled));
speedTxt.setText('Speed: ' + gameSpeed.toFixed(1) + 'x');
LK.effects.flashScreen(0x00FFFF, 400);
}, 5000);
}
rapModeTimer = 0;
}
// Update distance and speed with accelerated progression
distanceTraveled += gameSpeed;
var lastGameSpeed = gameSpeed;
// More aggressive speed scaling for increased difficulty
gameSpeed = 1 + distanceTraveled / 7000 + Math.pow(distanceTraveled / 15000, 1.5);
gameSpeed = Math.min(gameSpeed, 4); // Cap maximum speed to keep game playable
// Update UI text based on rap mode
if (rapModeActive) {
scoreTxt.setText('Yo Distance: ' + Math.floor(distanceTraveled) + ' meters!');
bestScoreTxt.setText('Best Flow: ' + bestDistance);
speedTxt.setText('Speed Flow: ' + gameSpeed.toFixed(1) + 'x');
} else {
scoreTxt.setText('Distance: ' + Math.floor(distanceTraveled));
bestScoreTxt.setText('Best: ' + bestDistance);
speedTxt.setText('Speed: ' + gameSpeed.toFixed(1) + 'x');
}
// Add pulsing effect when speed increases
if (gameSpeed > lastGameSpeed + 0.1) {
tween(speedTxt, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(speedTxt, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeIn
});
}
});
}
// Spawn enemies with progressive difficulty
spawnTimer++;
var adjustedSpawnRate = Math.max(30, spawnRate - Math.floor(distanceTraveled / 500)); // More aggressive spawn rate reduction
if (spawnTimer >= adjustedSpawnRate / gameSpeed) {
spawnEnemyCar();
spawnTimer = 0;
// Multiple enemy spawning at higher difficulty
if (distanceTraveled > 5000 && Math.random() < 0.3) {
spawnEnemyCar(); // 30% chance for double spawn after 5000 distance
}
if (distanceTraveled > 10000 && Math.random() < 0.2) {
spawnEnemyCar(); // Additional spawn chance after 10000 distance
}
}
// Spawn power-ups with reduced frequency at higher difficulty
powerUpSpawnTimer++;
var powerUpInterval = Math.max(200, 300 + Math.floor(distanceTraveled / 200)); // Longer intervals as distance increases
if (powerUpSpawnTimer >= powerUpInterval / gameSpeed) {
spawnPowerUp();
powerUpSpawnTimer = 0;
}
// Spawn nitro with increased rarity at higher difficulty
nitroSpawnTimer++;
var nitroInterval = Math.max(400, 600 + Math.floor(distanceTraveled / 150)); // Much longer intervals as distance increases
if (nitroSpawnTimer >= nitroInterval / gameSpeed) {
spawnNitro();
nitroSpawnTimer = 0;
}
// Spawn cups with very rare frequency
cupSpawnTimer++;
var cupInterval = Math.max(800, 1200 + Math.floor(distanceTraveled / 100)); // Very long intervals
if (cupSpawnTimer >= cupInterval / gameSpeed) {
spawnCup();
cupSpawnTimer = 0;
}
// Spawn bombers periodically
bomberSpawnTimer++;
var bomberInterval = Math.max(300, 500 + Math.floor(distanceTraveled / 200)); // Moderate intervals
if (bomberSpawnTimer >= bomberInterval / gameSpeed) {
spawnBomber();
bomberSpawnTimer = 0;
}
// Spawn ramps periodically
rampSpawnTimer++;
var rampInterval = Math.max(600, 800 + Math.floor(distanceTraveled / 300)); // Long intervals for ramps
if (rampSpawnTimer >= rampInterval / gameSpeed) {
spawnRamp();
rampSpawnTimer = 0;
}
// Spawn pedestrians occasionally
pedestrianSpawnTimer++;
var pedestrianInterval = Math.max(700, 1000 + Math.floor(distanceTraveled / 250)); // Moderate intervals
if (pedestrianSpawnTimer >= pedestrianInterval / gameSpeed) {
spawnPedestrian();
pedestrianSpawnTimer = 0;
}
// Check nitro effect end
if (nitroEffect && LK.ticks >= nitroEndTime) {
nitroEffect = false;
tween(playerCar, {
scaleX: 1,
scaleY: 1
}, {
duration: 300
});
}
// Spawn road lines
lineSpawnTimer++;
if (lineSpawnTimer >= 25) {
for (var lane = 0; lane < 4; lane++) {
var line = game.addChild(new RoadLine());
line.x = 524 + lane * 400;
line.y = -100;
line.speed = 8 * gameSpeed;
roadLines.push(line);
}
lineSpawnTimer = 0;
}
// Update and check power-ups
for (var j = powerUps.length - 1; j >= 0; j--) {
var powerUp = powerUps[j];
// Remove off-screen power-ups
if (powerUp.y > 2800) {
powerUp.destroy();
powerUps.splice(j, 1);
continue;
}
// Check collection
if (powerUp.intersects(playerCar)) {
LK.setScore(LK.getScore() + 50);
LK.getSound('collect').play();
LK.effects.flashObject(powerUp, 0xffffff, 200);
// Add smooth scale-out effect before destroying
tween(powerUp, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
powerUp.destroy();
}
});
powerUps.splice(j, 1);
}
}
// Update and check nitros
for (var n = nitros.length - 1; n >= 0; n--) {
var nitro = nitros[n];
// Remove off-screen nitros
if (nitro.y > 2800) {
nitro.destroy();
nitros.splice(n, 1);
continue;
}
// Check collection
if (nitro.intersects(playerCar)) {
LK.setScore(LK.getScore() + 100);
LK.getSound('collect').play();
// Activate nitro effect
nitroEffect = true;
nitroEndTime = LK.ticks + 300; // 5 seconds at 60fps
tween(playerCar, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 300
});
LK.effects.flashScreen(0x00ff00, 500);
// Add smooth scale-out effect for nitro
tween(nitro, {
scaleX: 3,
scaleY: 3,
alpha: 0
}, {
duration: 400,
easing: tween.elasticOut,
onFinish: function onFinish() {
nitro.destroy();
}
});
nitros.splice(n, 1);
}
}
// Update and check cups
for (var c = cups.length - 1; c >= 0; c--) {
var cup = cups[c];
// Remove off-screen cups
if (cup.y > 2800) {
cup.destroy();
cups.splice(c, 1);
continue;
}
// Check collection
if (cup.intersects(playerCar)) {
hasShield = true;
LK.setScore(LK.getScore() + 150);
LK.getSound('collect').play();
LK.effects.flashScreen(0xFFD700, 400);
// Visual feedback for shield activation
tween(playerCar, {
tint: 0xFFD700
}, {
duration: 200,
onFinish: function onFinish() {
tween(playerCar, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
// Add smooth scale-out effect for cup
tween(cup, {
scaleX: 3,
scaleY: 3,
alpha: 0
}, {
duration: 300,
easing: tween.elasticOut,
onFinish: function onFinish() {
cup.destroy();
}
});
cups.splice(c, 1);
}
}
// Update and check bombers
for (var b = bombers.length - 1; b >= 0; b--) {
var bomber = bombers[b];
// Remove off-screen bombers
if (bomber.y > 2800) {
bomber.destroy();
bombers.splice(b, 1);
continue;
}
// Check collision with player
if (bomber.intersects(playerCar)) {
// Always crush/kill the bomber person on collision
LK.setScore(LK.getScore() + 300);
LK.getSound('collect').play();
LK.effects.flashScreen(0x00ff00, 300);
// Create explosion at bomber position
var explosion = game.addChild(new Explosion());
explosion.x = bomber.x;
explosion.y = bomber.y;
// Destroy the bomber
bomber.destroy();
bombers.splice(b, 1);
continue;
}
}
// Update and check bombs
for (var bomb = bombs.length - 1; bomb >= 0; bomb--) {
var bombObj = bombs[bomb];
// Remove off-screen bombs
if (bombObj.y > 2800) {
bombObj.destroy();
bombs.splice(bomb, 1);
continue;
}
// Check collision with player
if (bombObj.intersects(playerCar)) {
if (hasShield) {
// Player has shield from cup - destroy bomb instead
hasShield = false;
LK.setScore(LK.getScore() + 200);
LK.getSound('collect').play();
LK.effects.flashScreen(0x00ff00, 300);
// Create explosion at bomb position
var explosion = game.addChild(new Explosion());
explosion.x = bombObj.x;
explosion.y = bombObj.y;
// Destroy the bomb
bombObj.destroy();
bombs.splice(bomb, 1);
continue;
} else {
// Normal collision - game over with bigger explosion
var explosion = game.addChild(new Explosion());
explosion.x = playerCar.x;
explosion.y = playerCar.y;
// Create additional explosion for bomb impact
var bombExplosion = game.addChild(new Explosion());
bombExplosion.x = bombObj.x;
bombExplosion.y = bombObj.y;
tween(playerCar, {
scaleX: 0,
scaleY: 0,
rotation: Math.PI * 2,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut
});
if (distanceTraveled > bestDistance) {
bestDistance = Math.floor(distanceTraveled);
bestScoreTxt.setText('Best: ' + bestDistance);
saveBestScore();
}
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
}
// Update and check ramps
for (var r = ramps.length - 1; r >= 0; r--) {
var ramp = ramps[r];
// Remove off-screen ramps
if (ramp.y > 2800) {
ramp.destroy();
ramps.splice(r, 1);
continue;
}
// Check if player hits ramp to initiate jump
if (ramp.intersects(playerCar) && !playerJumping) {
playerJumping = true;
jumpStartTime = LK.ticks;
LK.setScore(LK.getScore() + 75); // Bonus for using ramp
LK.getSound('collect').play();
// Flash effect for ramp activation
LK.effects.flashScreen(0x00AAFF, 300);
// Scale out ramp effect
tween(ramp, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 400,
onFinish: function onFinish() {
ramp.destroy();
}
});
ramps.splice(r, 1);
continue;
}
}
// Update and check pedestrians
for (var p = pedestrians.length - 1; p >= 0; p--) {
var pedestrian = pedestrians[p];
// Remove off-screen pedestrians
if (pedestrian.y > 2800) {
pedestrian.destroy();
pedestrians.splice(p, 1);
continue;
}
// Check collision with player
if (pedestrian.intersects(playerCar)) {
if (hasShield) {
// Player has shield - save pedestrian and get bonus
hasShield = false;
LK.setScore(LK.getScore() + 250);
LK.getSound('collect').play();
LK.effects.flashScreen(0x00ff00, 300);
// Create sparkle effect for saving pedestrian
var explosion = game.addChild(new Explosion());
explosion.x = pedestrian.x;
explosion.y = pedestrian.y;
// Destroy the pedestrian (saved)
pedestrian.destroy();
pedestrians.splice(p, 1);
continue;
} else {
// Normal collision - game over
var explosion = game.addChild(new Explosion());
explosion.x = playerCar.x;
explosion.y = playerCar.y;
tween(playerCar, {
scaleX: 0,
scaleY: 0,
rotation: Math.PI * 2,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut
});
if (distanceTraveled > bestDistance) {
bestDistance = Math.floor(distanceTraveled);
bestScoreTxt.setText('Best: ' + bestDistance);
saveBestScore();
}
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
}
// Collision detection with enemies - skip if jumping high enough
for (var i = enemyCars.length - 1; i >= 0; i--) {
var enemy = enemyCars[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
// Remove off-screen enemies
if (enemy.lastY < 2800 && enemy.y >= 2800) {
enemy.destroy();
enemyCars.splice(i, 1);
continue;
}
// Check collision with player - but not if jumping high enough
if (enemy.intersects(playerCar) && (!playerJumping || jumpHeight < 50)) {
if (hasShield) {
// Player has shield from cup - destroy enemy instead
hasShield = false;
LK.setScore(LK.getScore() + 200);
LK.getSound('collect').play();
LK.effects.flashScreen(0x00ff00, 300);
// Create explosion at enemy position
var explosion = game.addChild(new Explosion());
explosion.x = enemy.x;
explosion.y = enemy.y;
// Destroy the enemy
enemy.destroy();
enemyCars.splice(i, 1);
continue;
} else {
// Normal collision - game over
// Create explosion at collision point
var explosion = game.addChild(new Explosion());
explosion.x = playerCar.x;
explosion.y = playerCar.y;
// Make player car explode with tween effect
tween(playerCar, {
scaleX: 0,
scaleY: 0,
rotation: Math.PI * 2,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut
});
// Update best score if needed
if (distanceTraveled > bestDistance) {
bestDistance = Math.floor(distanceTraveled);
bestScoreTxt.setText('Best: ' + bestDistance);
saveBestScore();
}
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
} else if (playerJumping && jumpHeight >= 50) {
// Player jumped over enemy - bonus points!
if (!enemy.jumpedOver) {
LK.setScore(LK.getScore() + 150);
LK.getSound('dodge').play();
enemy.jumpedOver = true; // Mark to prevent multiple bonuses
}
}
// Check for near miss (score bonus)
var distanceFromPlayer = Math.abs(enemy.x - playerCar.x);
if (enemy.y > playerCar.y - 150 && enemy.y < playerCar.y + 150 && distanceFromPlayer < 200 && distanceFromPlayer > 150) {
if (!enemy.nearMissScored) {
LK.setScore(LK.getScore() + 10);
LK.getSound('dodge').play();
enemy.nearMissScored = true;
}
}
enemy.lastY = enemy.y;
}
// Update road lines
for (var k = roadLines.length - 1; k >= 0; k--) {
var line = roadLines[k];
// Remove off-screen lines
if (line.y > 2800) {
line.destroy();
roadLines.splice(k, 1);
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Bomb = Container.expand(function () {
var self = Container.call(this);
var bombGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
// Make bomb look dangerous with dark red tint and smaller size
bombGraphics.tint = 0x660000;
bombGraphics.scaleX = 0.6;
bombGraphics.scaleY = 0.6;
self.speed = 12;
self.targetLane = 1;
self.rotationSpeed = 0.3;
self.pulseScale = 1;
self.pulseDirection = 1;
self.update = function () {
self.speed = 12 * gameSpeed;
self.y += self.speed;
// Move towards target lane (player's position when thrown)
var targetX = 324 + self.targetLane * 400;
var diff = targetX - self.x;
if (Math.abs(diff) > 10) {
self.x += diff * 0.1;
}
// Spinning and pulsing animation for danger effect
bombGraphics.rotation += self.rotationSpeed;
self.pulseScale += self.pulseDirection * 0.05;
if (self.pulseScale > 1.3) {
self.pulseDirection = -1;
} else if (self.pulseScale < 0.8) {
self.pulseDirection = 1;
}
bombGraphics.scaleX = 0.6 * self.pulseScale;
bombGraphics.scaleY = 0.6 * self.pulseScale;
};
return self;
});
var Bomber = Container.expand(function () {
var self = Container.call(this);
var bomberGraphics = self.attachAsset('bomberPerson', {
anchorX: 0.5,
anchorY: 0.5
});
// Make bomber distinct with darker brown color and human-like proportions
bomberGraphics.scaleX = 0.8;
bomberGraphics.scaleY = 0.9;
self.speed = 6;
self.lane = 0;
self.throwTimer = 0;
self.throwInterval = 120; // Throw bomb every 2 seconds
self.hasThrown = false;
self.update = function () {
var difficultyMultiplier = 1 + distanceTraveled / 10000;
self.speed = 6 * gameSpeed * difficultyMultiplier;
self.y += self.speed;
// Throw bomb when close to player
self.throwTimer++;
if (!self.hasThrown && self.throwTimer >= self.throwInterval && self.y > 500 && self.y < 1800) {
self.throwBomb();
self.hasThrown = true;
}
// Add slight bobbing motion
bomberGraphics.rotation = Math.sin(LK.ticks * 0.03) * 0.1;
};
self.throwBomb = function () {
var bomb = game.addChild(new Bomb());
bomb.x = self.x;
bomb.y = self.y + 50;
bomb.targetLane = playerCar.currentLane;
bomb.speed = 12 * gameSpeed;
bombs.push(bomb);
};
return self;
});
var Cup = Container.expand(function () {
var self = Container.call(this);
var cupGraphics = self.attachAsset('cup', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.rotationSpeed = 0.15;
self.pulseScale = 1;
self.pulseDirection = 1;
self.update = function () {
self.speed = 8 * gameSpeed;
self.y += self.speed;
cupGraphics.rotation += self.rotationSpeed;
// Enhanced pulsing effect with sparkle
self.pulseScale += self.pulseDirection * 0.04;
if (self.pulseScale > 1.6) {
self.pulseDirection = -1;
} else if (self.pulseScale < 0.8) {
self.pulseDirection = 1;
}
cupGraphics.scaleX = self.pulseScale;
cupGraphics.scaleY = self.pulseScale;
// Enhanced golden effect with sparkle animation
var sparkleIntensity = 0.8 + Math.sin(LK.ticks * 0.15) * 0.2;
cupGraphics.alpha = sparkleIntensity;
// Alternating between bright gold and white for sparkle effect
if (Math.sin(LK.ticks * 0.1) > 0.7) {
cupGraphics.tint = 0xFFFFFF; // Bright white sparkle
} else {
cupGraphics.tint = 0xFFD700; // Rich gold
}
};
return self;
});
var EnemyCar = Container.expand(function (carType) {
var self = Container.call(this);
var assetId = carType || 'enemyCar1';
var carGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.lane = 0;
self.update = function () {
// Progressive speed increase with difficulty
var difficultyMultiplier = 1 + distanceTraveled / 8000; // Enemies get faster over time
self.speed = 8 * gameSpeed * difficultyMultiplier;
self.y += self.speed;
// Add subtle bobbing motion for visual interest
carGraphics.rotation = Math.sin(LK.ticks * 0.05) * 0.02;
};
return self;
});
var EnemyCar4 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('enemyCar3', {
anchorX: 0.5,
anchorY: 0.5
});
// Cyberpunk design with neon aesthetic
carGraphics.tint = 0x00FFFF; // Neon cyan base
carGraphics.scaleX = 1.8; // Massive and intimidating
carGraphics.scaleY = 1.8;
self.speed = 22; // Lightning fast
self.lane = 0;
self.aiState = 'hunting'; // 'hunting', 'attacking', 'retreating', 'cloaked'
self.huntingTimer = 0;
self.attackingTimer = 0;
self.cloakTimer = 0;
self.phaseShiftCooldown = 0;
self.energyLevel = 100; // Energy for special abilities
self.energyRegenRate = 0.5;
self.hyperChargeActive = false;
self.hyperChargeTimer = 0;
self.plasmaTrailPhase = 0;
self.quantumDistortion = 0;
self.neuralNetworkTimer = 0;
self.predictedPlayerLane = 1;
self.aggroLevel = 0; // Builds up over time
self.lastPlayerX = 0;
self.lastPlayerY = 0;
self.teleportCharges = 3;
self.teleportRechargeTimer = 0;
// Create advanced particle systems
self.plasmaParticles = [];
self.quantumParticles = [];
self.energyTrails = [];
// Plasma energy system - 12 particles for intense effect
for (var i = 0; i < 12; i++) {
var plasmaParticle = self.addChild(LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.08,
scaleY: 0.08
}));
plasmaParticle.tint = 0xFF0080;
plasmaParticle.alpha = 0.9;
plasmaParticle.orbitRadius = 80 + Math.random() * 60;
plasmaParticle.orbitSpeed = 0.15 + Math.random() * 0.25;
plasmaParticle.orbitPhase = Math.random() * Math.PI * 2;
plasmaParticle.energyType = Math.random() < 0.5 ? 'plasma' : 'quantum';
self.plasmaParticles.push(plasmaParticle);
}
// Quantum distortion field - 6 larger particles
for (var q = 0; q < 6; q++) {
var quantumParticle = self.addChild(LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.15,
scaleY: 0.15
}));
quantumParticle.tint = 0x8000FF;
quantumParticle.alpha = 0.6;
quantumParticle.orbitRadius = 120 + Math.random() * 80;
quantumParticle.orbitSpeed = 0.08 + Math.random() * 0.12;
quantumParticle.orbitPhase = Math.random() * Math.PI * 2;
quantumParticle.pulsePhase = Math.random() * Math.PI * 2;
self.quantumParticles.push(quantumParticle);
}
// Energy trail system - 8 trailing particles
for (var t = 0; t < 8; t++) {
var trailParticle = self.addChild(LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.12,
scaleY: 0.12
}));
trailParticle.tint = 0x00FFFF;
trailParticle.alpha = 0.7;
trailParticle.trailIndex = t;
trailParticle.x = 0;
trailParticle.y = t * 25;
self.energyTrails.push(trailParticle);
}
self.update = function () {
// Cyberpunk AI with extreme intelligence
var difficultyMultiplier = 2.5 + distanceTraveled / 2500;
self.speed = 22 * gameSpeed * difficultyMultiplier;
self.y += self.speed;
// Advanced neural network tracking
self.neuralNetworkTimer++;
if (playerCar && self.neuralNetworkTimer % 10 === 0) {
// Predict player movement based on velocity and patterns
var playerVelocityX = playerCar.x - self.lastPlayerX;
var playerVelocityY = playerCar.y - self.lastPlayerY;
self.predictedPlayerLane = Math.round((playerCar.x + playerVelocityX * 30 - 324) / 400);
self.predictedPlayerLane = Math.max(0, Math.min(3, self.predictedPlayerLane));
self.lastPlayerX = playerCar.x;
self.lastPlayerY = playerCar.y;
}
// Energy regeneration and management
self.energyLevel = Math.min(100, self.energyLevel + self.energyRegenRate);
// Teleport charges regeneration
self.teleportRechargeTimer++;
if (self.teleportRechargeTimer > 600 && self.teleportCharges < 3) {
self.teleportCharges++;
self.teleportRechargeTimer = 0;
}
// Aggression level builds over time and proximity to player
self.aggroLevel = Math.min(100, self.aggroLevel + 0.1);
if (playerCar) {
var distanceToPlayer = Math.abs(self.y - playerCar.y);
if (distanceToPlayer < 600) {
self.aggroLevel = Math.min(100, self.aggroLevel + 0.5);
}
}
// Advanced AI state machine
if (self.aiState === 'hunting') {
self.huntingTimer++;
// Intelligent stalking behavior
if (playerCar && self.huntingTimer > 60) {
var playerDistance = Math.abs(self.y - playerCar.y);
if (playerDistance < 800 && self.energyLevel > 50) {
self.aiState = 'attacking';
self.attackingTimer = 0;
LK.effects.flashScreen(0xFF0080, 200);
}
}
} else if (self.aiState === 'attacking') {
self.attackingTimer++;
// Hyper-aggressive assault mode
if (self.attackingTimer > 180 || self.energyLevel < 20) {
self.aiState = 'retreating';
} else if (self.teleportCharges > 0 && Math.random() < 0.05) {
// Tactical teleportation
self.performTeleport();
}
} else if (self.aiState === 'retreating') {
// Temporary retreat to recharge
if (self.energyLevel > 70) {
self.aiState = 'cloaked';
self.cloakTimer = 0;
}
} else if (self.aiState === 'cloaked') {
self.cloakTimer++;
if (self.cloakTimer > 120) {
self.aiState = 'hunting';
self.huntingTimer = 0;
}
}
// Quantum lane shifting with predictive AI
if (self.aiState === 'attacking' && Math.random() < 0.12) {
var targetLane;
if (Math.random() < 0.85) {
// 85% chance to use AI prediction
targetLane = self.predictedPlayerLane;
// Advanced blocking strategy
if (Math.random() < 0.6) {
var blockingLanes = [self.predictedPlayerLane - 1, self.predictedPlayerLane, self.predictedPlayerLane + 1];
targetLane = blockingLanes[Math.floor(Math.random() * blockingLanes.length)];
targetLane = Math.max(0, Math.min(3, targetLane));
}
} else {
targetLane = Math.floor(Math.random() * 4);
}
var targetX = 324 + targetLane * 400;
// Quantum phase shift effect
if (self.energyLevel > 30) {
self.x = targetX;
self.energyLevel -= 15;
LK.effects.flashObject(self, 0xFFFFFF, 400);
LK.effects.flashScreen(0x8000FF, 100);
}
}
// Hypercharge mode activation
self.hyperChargeTimer++;
if (self.hyperChargeTimer > 400 && self.energyLevel > 80 && Math.random() < 0.04) {
self.hyperChargeActive = !self.hyperChargeActive;
self.hyperChargeTimer = 0;
if (self.hyperChargeActive) {
self.energyLevel -= 40;
LK.effects.flashScreen(0xFF00FF, 600);
carGraphics.scaleX = 2.4;
carGraphics.scaleY = 2.4;
} else {
carGraphics.scaleX = 1.8;
carGraphics.scaleY = 1.8;
}
}
// Quantum distortion effects
self.quantumDistortion += 0.25;
self.plasmaTrailPhase += 0.2;
// Update plasma particle system
for (var p = 0; p < self.plasmaParticles.length; p++) {
var particle = self.plasmaParticles[p];
particle.orbitPhase += particle.orbitSpeed;
var orbitMultiplier = self.hyperChargeActive ? 1.5 : 1;
var x = Math.cos(particle.orbitPhase) * particle.orbitRadius * orbitMultiplier;
var y = Math.sin(particle.orbitPhase) * particle.orbitRadius * 0.6 * orbitMultiplier;
particle.x = x;
particle.y = y;
// Dynamic particle effects based on AI state
if (self.aiState === 'attacking') {
particle.tint = 0xFF0040; // Aggressive red-pink
particle.alpha = 0.9 + Math.sin(LK.ticks * 0.3 + p) * 0.1;
} else if (self.aiState === 'cloaked') {
particle.tint = 0x4000FF; // Stealth purple
particle.alpha = 0.3 + Math.sin(LK.ticks * 0.15 + p) * 0.2;
} else {
particle.tint = particle.energyType === 'plasma' ? 0xFF0080 : 0x00FFFF;
particle.alpha = 0.7 + Math.sin(LK.ticks * 0.2 + p) * 0.3;
}
}
// Update quantum distortion field
for (var q = 0; q < self.quantumParticles.length; q++) {
var qParticle = self.quantumParticles[q];
qParticle.orbitPhase += qParticle.orbitSpeed;
qParticle.pulsePhase += 0.1;
var distortionRadius = qParticle.orbitRadius + Math.sin(self.quantumDistortion + q) * 30;
var x = Math.cos(qParticle.orbitPhase) * distortionRadius;
var y = Math.sin(qParticle.orbitPhase) * distortionRadius * 0.4;
qParticle.x = x;
qParticle.y = y;
var pulseIntensity = Math.sin(qParticle.pulsePhase) * 0.4;
qParticle.alpha = 0.4 + pulseIntensity;
qParticle.scaleX = 0.15 + pulseIntensity * 0.1;
qParticle.scaleY = 0.15 + pulseIntensity * 0.1;
// Color based on energy level
if (self.energyLevel > 70) {
qParticle.tint = 0x8000FF; // High energy purple
} else if (self.energyLevel > 40) {
qParticle.tint = 0x4080FF; // Medium energy blue
} else {
qParticle.tint = 0x2040FF; // Low energy dark blue
}
}
// Update energy trail system
for (var t = 0; t < self.energyTrails.length; t++) {
var trail = self.energyTrails[t];
// Create trailing effect behind the car
trail.y = trail.trailIndex * 30 + Math.sin(self.plasmaTrailPhase + t * 0.5) * 15;
trail.alpha = 0.8 - trail.trailIndex * 0.1;
trail.scaleX = 0.12 - trail.trailIndex * 0.01;
trail.scaleY = 0.12 - trail.trailIndex * 0.01;
// Color cycling for trail
var trailHue = (LK.ticks * 0.05 + t * 0.2) % 1;
if (trailHue < 0.33) {
trail.tint = 0x00FFFF; // Cyan
} else if (trailHue < 0.66) {
trail.tint = 0xFF00FF; // Magenta
} else {
trail.tint = 0xFFFF00; // Yellow
}
}
// Cyberpunk visual effects
var rotationIntensity = self.hyperChargeActive ? 2.5 : 1;
carGraphics.rotation = Math.sin(LK.ticks * 0.18) * 0.4 * rotationIntensity + Math.cos(LK.ticks * 0.12) * 0.25;
// Advanced color cycling system
var stateColorMultiplier = 1;
if (self.aiState === 'attacking') {
stateColorMultiplier = 1.5;
} else if (self.aiState === 'cloaked') {
stateColorMultiplier = 0.5;
}
// Complex color transitions
var colorPhase = (LK.ticks * 0.1 + self.aggroLevel * 0.01) % (Math.PI * 2);
if (Math.random() < 0.08 * stateColorMultiplier) {
carGraphics.tint = 0xFFFFFF; // Bright flash
} else if (Math.random() < 0.15) {
carGraphics.tint = 0xFF0080; // Neon pink
} else if (Math.random() < 0.25) {
carGraphics.tint = 0x8000FF; // Electric purple
} else if (Math.random() < 0.4) {
carGraphics.tint = 0x0080FF; // Cyber blue
} else {
carGraphics.tint = 0x00FFFF; // Default cyan
}
// Dynamic alpha and scale effects
var intensityPulse = 0.6 + Math.sin(LK.ticks * 0.15) * 0.4;
var aggroPulse = 1 + self.aggroLevel / 100 * 0.3;
carGraphics.alpha = Math.max(0.4, intensityPulse * stateColorMultiplier);
// Scale effects based on state
var baseScale = self.hyperChargeActive ? 2.4 : 1.8;
var dynamicPulse = 1 + Math.sin(LK.ticks * 0.14) * 0.12;
carGraphics.scaleX = baseScale * dynamicPulse * aggroPulse;
carGraphics.scaleY = baseScale * dynamicPulse * aggroPulse;
// Quantum shockwave attacks
if (self.aiState === 'attacking' && Math.random() < 0.02) {
LK.effects.flashScreen(0x8000FF, 300);
// Drain some energy for attack
self.energyLevel = Math.max(0, self.energyLevel - 10);
}
};
// Special ability: Quantum teleportation
self.performTeleport = function () {
if (self.teleportCharges > 0) {
self.teleportCharges--;
// Teleport to strategic position near player
if (playerCar) {
var teleportLane = self.predictedPlayerLane;
// Sometimes teleport to blocking position
if (Math.random() < 0.6) {
var blockingOptions = [teleportLane - 1, teleportLane + 1];
teleportLane = blockingOptions[Math.floor(Math.random() * blockingOptions.length)];
teleportLane = Math.max(0, Math.min(3, teleportLane));
}
self.x = 324 + teleportLane * 400;
self.y = playerCar.y - 400; // Appear ahead of player
}
// Massive teleport effect
LK.effects.flashScreen(0xFF00FF, 500);
LK.effects.flashObject(self, 0xFFFFFF, 600);
self.energyLevel = Math.max(0, self.energyLevel - 25);
}
};
return self;
});
var Explosion = Container.expand(function () {
var self = Container.call(this);
self.particles = [];
self.lifeTime = 0;
self.maxLifeTime = 60; // 1 second at 60fps
// Create enhanced explosion particles with more variety
for (var i = 0; i < 20; i++) {
var particle = self.addChild(LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.2 + Math.random() * 0.4,
scaleY: 0.2 + Math.random() * 0.4
}));
// More vibrant explosion colors
var colors = [0xFF1100, 0xFF4400, 0xFF6600, 0xFF8800, 0xFFAA00, 0xFFCC00, 0xFFFF00, 0xFFFFFF];
particle.tint = colors[Math.floor(Math.random() * colors.length)];
particle.vx = (Math.random() - 0.5) * 30;
particle.vy = (Math.random() - 0.5) * 30;
particle.gravity = 0.3 + Math.random() * 0.4;
particle.friction = 0.92 + Math.random() * 0.06;
particle.rotationSpeed = (Math.random() - 0.5) * 0.3;
self.particles.push(particle);
}
self.update = function () {
self.lifeTime++;
// Update particles with enhanced physics
for (var i = 0; i < self.particles.length; i++) {
var particle = self.particles[i];
particle.x += particle.vx;
particle.y += particle.vy;
particle.vy += particle.gravity;
particle.vx *= particle.friction;
particle.vy *= particle.friction;
// Add rotation to particles
particle.rotation += particle.rotationSpeed;
// Enhanced fade out with size reduction
var fadeProgress = self.lifeTime / self.maxLifeTime;
particle.alpha = 1 - fadeProgress;
particle.scaleX *= 0.98;
particle.scaleY *= 0.98;
// Color intensity decreases over time
if (fadeProgress > 0.5) {
var intensity = 1 - (fadeProgress - 0.5) * 2;
particle.tint = particle.tint & 0xFFFFFF * intensity;
}
}
// Destroy explosion when done
if (self.lifeTime >= self.maxLifeTime) {
self.destroy();
}
};
return self;
});
var Nitro = Container.expand(function () {
var self = Container.call(this);
var nitroGraphics = self.attachAsset('nitro', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.rotationSpeed = 0.2;
self.pulseScale = 1;
self.pulseDirection = 1;
self.update = function () {
self.y += self.speed;
nitroGraphics.rotation += self.rotationSpeed;
// Enhanced pulsing effect with electric blue glow
self.pulseScale += self.pulseDirection * 0.03;
if (self.pulseScale > 1.5) {
self.pulseDirection = -1;
} else if (self.pulseScale < 0.7) {
self.pulseDirection = 1;
}
nitroGraphics.scaleX = self.pulseScale;
nitroGraphics.scaleY = self.pulseScale;
// Electric blue glow effect with lightning-like intensity changes
var electricIntensity = 0.6 + Math.sin(LK.ticks * 0.2) * 0.4;
nitroGraphics.alpha = electricIntensity;
// Bright electric blue with occasional white flashes
if (Math.random() < 0.1) {
nitroGraphics.tint = 0xFFFFFF; // White flash
} else {
nitroGraphics.tint = 0x00BFFF; // Electric blue
}
};
return self;
});
var Pedestrian = Container.expand(function () {
var self = Container.call(this);
var pedestrianGraphics = self.attachAsset('pedestrian', {
anchorX: 0.5,
anchorY: 0.5
});
// Make pedestrian look different from bomber with varied appearances
var appearances = [{
tint: 0xFF6B6B,
scaleX: 0.6,
scaleY: 0.9
},
// Red shirt, tall
{
tint: 0x4ECDC4,
scaleX: 0.8,
scaleY: 0.7
},
// Teal shirt, short
{
tint: 0xFFE66D,
scaleX: 0.7,
scaleY: 0.8
},
// Yellow shirt, medium
{
tint: 0xA8E6CF,
scaleX: 0.75,
scaleY: 0.85
},
// Green shirt, medium-tall
{
tint: 0xFF8B94,
scaleX: 0.65,
scaleY: 0.75
},
// Pink shirt, small
{
tint: 0xB4A7D6,
scaleX: 0.9,
scaleY: 0.6
} // Purple shirt, wide
];
var appearance = appearances[Math.floor(Math.random() * appearances.length)];
pedestrianGraphics.tint = appearance.tint;
pedestrianGraphics.scaleX = appearance.scaleX;
pedestrianGraphics.scaleY = appearance.scaleY;
self.speed = 6;
self.lane = 0;
self.jumpPhase = 'waiting'; // 'waiting', 'jumping', 'crossing'
self.jumpTimer = 0;
self.jumpInterval = 180; // 3 seconds to decide to jump
self.targetLane = Math.floor(Math.random() * 4); // Target lane to reach
self.crossingSpeed = 3;
self.update = function () {
var difficultyMultiplier = 1 + distanceTraveled / 10000;
self.speed = 6 * gameSpeed * difficultyMultiplier;
self.y += self.speed;
// Handle jumping behavior
self.jumpTimer++;
if (self.jumpPhase === 'waiting' && self.jumpTimer >= self.jumpInterval && self.y > 500 && self.y < 1800) {
// Start jumping onto road
self.jumpPhase = 'jumping';
self.jumpTimer = 0;
}
if (self.jumpPhase === 'jumping') {
// Move toward target lane
var targetX = 324 + self.targetLane * 400;
var diff = targetX - self.x;
if (Math.abs(diff) > 20) {
self.x += diff * 0.08;
} else {
self.jumpPhase = 'crossing';
}
}
if (self.jumpPhase === 'crossing') {
// Cross the road randomly
if (Math.random() < 0.02) {
self.targetLane = Math.floor(Math.random() * 4);
}
var targetX = 324 + self.targetLane * 400;
var diff = targetX - self.x;
self.x += diff * 0.05;
}
// Add walking animation
pedestrianGraphics.rotation = Math.sin(LK.ticks * 0.1) * 0.1;
};
return self;
});
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.35;
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
// Jump finished
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
// Calculate jump arc (parabolic motion)
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100;
carGraphics.y = -jumpHeight;
// Add rotation during jump
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.2;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
// Add slow dramatic turn effect when switching lanes
tween(carGraphics, {
rotation: direction * 0.4
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 600,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PlayerCar2 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar2', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.42; // Much faster lane switching speed
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100;
carGraphics.y = -jumpHeight;
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.25;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
// Add slow dramatic turn effect when switching lanes with different rotation
tween(carGraphics, {
rotation: direction * 0.5
}, {
duration: 900,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 700,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PlayerCar3 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar3', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.38; // Faster lane switching speed
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100;
carGraphics.y = -jumpHeight;
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.15;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
// Add slow dramatic turn effect when switching lanes
tween(carGraphics, {
rotation: direction * 0.3
}, {
duration: 750,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 550,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PlayerCar4 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar4', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.35; // Standard lane switching speed like other cars
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100; // Standard jump height
carGraphics.y = -jumpHeight;
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.2;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
// Standard turn effect like other cars
tween(carGraphics, {
rotation: direction * 0.4
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 600,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PlayerCar5 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar5', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.75; // Much faster lane switching speed
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100;
carGraphics.y = -jumpHeight;
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.3;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
tween(carGraphics, {
rotation: direction * 0.35
}, {
duration: 700,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 500,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PlayerCar6 = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar6', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 400;
self.moveSpeed = 0.85; // Very fast lane switching speed
self.update = function () {
var targetX = self.getLaneX(self.targetLane);
var diff = targetX - self.x;
var adjustedMoveSpeed = self.moveSpeed * (1 + (gameSpeed - 1) * 0.5);
if (Math.abs(diff) > 5) {
self.x += diff * adjustedMoveSpeed;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
// Handle jumping animation
if (playerJumping) {
var jumpProgress = (LK.ticks - jumpStartTime) / jumpDuration;
if (jumpProgress >= 1) {
playerJumping = false;
jumpHeight = 0;
carGraphics.y = 0;
carGraphics.rotation = 0;
} else {
jumpHeight = Math.sin(jumpProgress * Math.PI) * 100;
carGraphics.y = -jumpHeight;
carGraphics.rotation = Math.sin(jumpProgress * Math.PI) * 0.1;
}
}
};
self.getLaneX = function (lane) {
return 324 + lane * self.laneWidth;
};
self.switchLane = function (direction) {
var newLane = self.targetLane + direction;
if (newLane >= 0 && newLane <= 3) {
self.targetLane = newLane;
tween(carGraphics, {
rotation: direction * 0.6
}, {
duration: 1000,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(carGraphics, {
rotation: 0
}, {
duration: 800,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.rotationSpeed = 0.1;
self.update = function () {
self.speed = 8 * gameSpeed;
self.y += self.speed;
powerUpGraphics.rotation += self.rotationSpeed;
// Enhanced visual effects with glow pulsing
var glowIntensity = 0.7 + Math.sin(LK.ticks * 0.1) * 0.3;
powerUpGraphics.alpha = glowIntensity;
// Add rainbow tint cycling for more appealing visuals
var hue = LK.ticks * 0.05 % (Math.PI * 2);
var r = Math.floor(Math.sin(hue) * 127 + 128);
var g = Math.floor(Math.sin(hue + Math.PI * 2 / 3) * 127 + 128);
var b = Math.floor(Math.sin(hue + Math.PI * 4 / 3) * 127 + 128);
powerUpGraphics.tint = r << 16 | g << 8 | b;
};
return self;
});
var Ramp = Container.expand(function () {
var self = Container.call(this);
// Create ramp visual using multiple road line assets
var rampBase = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 8,
scaleY: 2
});
rampBase.tint = 0x888888;
var rampTop = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 1,
y: -20
});
rampTop.tint = 0xAAAAA;
self.speed = 8;
self.lane = 0;
self.update = function () {
self.speed = 8 * gameSpeed;
self.y += self.speed;
// Add slight glow effect
rampBase.alpha = 0.8 + Math.sin(LK.ticks * 0.1) * 0.2;
};
return self;
});
var RoadLine = Container.expand(function () {
var self = Container.call(this);
var lineGraphics = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.speed = 8 * gameSpeed;
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2c3e50
});
/****
* Game Code
****/
// Game state management
var gameState = 'menu'; // 'menu', 'playing', 'gameOver'
var menuElements = [];
var bestDistance = 0;
// Load best score from storage
function loadBestScore() {
var saved = storage.bestDistance;
if (saved !== undefined) {
bestDistance = saved;
}
}
// Save best score to storage
function saveBestScore() {
storage.bestDistance = bestDistance;
}
// Start menu creation
function createStartMenu() {
// Simple road background - just a few lines for context
for (var i = 0; i < 8; i++) {
for (var lane = 0; lane < 4; lane++) {
var menuLine = LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
x: 624 + lane * 400,
y: i * 250 + 300
});
menuLine.alpha = 0.2;
game.addChild(menuLine);
menuElements.push(menuLine);
}
}
// Clean title - big and centered
var titleText = new Text2('HIGHWAY RUSH', {
size: 160,
fill: '#FFD700',
stroke: '#000000',
strokeThickness: 6
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 600;
game.addChild(titleText);
menuElements.push(titleText);
// Best score display - simple and clear
var bestScoreText = new Text2('Best: ' + bestDistance + 'm', {
size: 70,
fill: '#FFFFFF',
stroke: '#000000',
strokeThickness: 4
});
bestScoreText.anchor.set(0.5, 0.5);
bestScoreText.x = 1024;
bestScoreText.y = 750;
game.addChild(bestScoreText);
menuElements.push(bestScoreText);
// Car selection section - clean and organized
var carSelectionText = new Text2('Choose Car:', {
size: 60,
fill: '#FFFFFF',
stroke: '#000000',
strokeThickness: 3
});
carSelectionText.anchor.set(0.5, 0.5);
carSelectionText.x = 1024;
carSelectionText.y = 950;
game.addChild(carSelectionText);
menuElements.push(carSelectionText);
// Car selection buttons - moved to the left
var car1Button = LK.getAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5,
x: 224,
y: 1150,
scaleX: 1.0,
scaleY: 1.0
});
game.addChild(car1Button);
menuElements.push(car1Button);
var car2Button = LK.getAsset('playerCar2', {
anchorX: 0.5,
anchorY: 0.5,
x: 524,
y: 1150,
scaleX: 1.0,
scaleY: 1.0
});
game.addChild(car2Button);
menuElements.push(car2Button);
var car3Button = LK.getAsset('playerCar3', {
anchorX: 0.5,
anchorY: 0.5,
x: 824,
y: 1150,
scaleX: 1.0,
scaleY: 1.0
});
game.addChild(car3Button);
menuElements.push(car3Button);
// Add playerCar4 button (initially hidden if not unlocked)
var car4Button = LK.getAsset('playerCar4', {
anchorX: 0.5,
anchorY: 0.5,
x: 1124,
y: 1150,
scaleX: 1.0,
scaleY: 1.0,
tint: 0x00FFFF
});
game.addChild(car4Button);
menuElements.push(car4Button);
// Add playerCar5 button
var car5Button = LK.getAsset('playerCar5', {
anchorX: 0.5,
anchorY: 0.5,
x: 1424,
y: 1150,
scaleX: 1.0,
scaleY: 1.0
});
game.addChild(car5Button);
menuElements.push(car5Button);
// Add playerCar6 button
var car6Button = LK.getAsset('playerCar6', {
anchorX: 0.5,
anchorY: 0.5,
x: 1724,
y: 1150,
scaleX: 1.0,
scaleY: 1.0
});
game.addChild(car6Button);
menuElements.push(car6Button);
// Selection indicator
selectionIndicator = LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 8,
scaleY: 0.8,
x: selectedCarType === 0 ? 224 : selectedCarType === 1 ? 524 : selectedCarType === 2 ? 824 : selectedCarType === 3 ? 1124 : selectedCarType === 4 ? 1424 : 1724,
y: 1280
});
selectionIndicator.tint = 0xFFD700;
game.addChild(selectionIndicator);
menuElements.push(selectionIndicator);
// Instructions - simple and clear
var instructionsText = new Text2('Swipe to change lanes • Avoid traffic • Collect power-ups', {
size: 50,
fill: '#CCCCCC',
stroke: '#000000',
strokeThickness: 2
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 1024;
instructionsText.y = 1450;
game.addChild(instructionsText);
menuElements.push(instructionsText);
// Simple START BUTTON at bottom
var startButton = LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 20,
scaleY: 3,
x: 1024,
y: 2400
});
startButton.tint = 0x00BB00;
game.addChild(startButton);
menuElements.push(startButton);
// START text
var startButtonText = new Text2('START', {
size: 100,
fill: '#FFFFFF',
stroke: '#000000',
strokeThickness: 5
});
startButtonText.anchor.set(0.5, 0.5);
startButtonText.x = 1024;
startButtonText.y = 2400;
game.addChild(startButtonText);
menuElements.push(startButtonText);
// Store button references for animations
var buttonElements = {
button: startButton,
text: startButtonText
};
// Initialize selection visual state
updateCarSelection();
// Simple animations - just gentle pulsing
tween(titleText, {
scaleX: 1.05,
scaleY: 1.05
}, {
duration: 2000,
yoyo: true,
repeat: -1
});
// Simple button animations
tween(buttonElements.button, {
scaleX: 21,
scaleY: 3.2
}, {
duration: 1500,
yoyo: true,
repeat: -1
});
tween(buttonElements.text, {
scaleX: 1.05,
scaleY: 1.05
}, {
duration: 1500,
yoyo: true,
repeat: -1
});
}
function removeStartMenu() {
for (var i = 0; i < menuElements.length; i++) {
menuElements[i].destroy();
}
menuElements = [];
}
function startGame() {
gameState = 'playing';
removeStartMenu();
loadBestScore();
initializeGameplay();
// Reset tap counter after starting game
car1TapCount = 0;
car2TapCount = 0;
car3TapCount = 0;
}
function initializeGameplay() {
// Initialize all game variables
gameSpeed = 1;
spawnTimer = 0;
spawnRate = 120;
lineSpawnTimer = 0;
powerUpSpawnTimer = 0;
nitroSpawnTimer = 0;
cupSpawnTimer = 0;
bomberSpawnTimer = 0;
rampSpawnTimer = 0;
pedestrianSpawnTimer = 0;
playerJumping = false;
jumpStartTime = 0;
jumpHeight = 0;
// Check if car1 was tapped 10 times for secret unlock
if (selectedCarType === 0 && car1TapCount >= 10) {
distanceTraveled = 2000;
gameSpeed = 1 + distanceTraveled / 7000 + Math.pow(distanceTraveled / 15000, 1.5);
gameSpeed = Math.min(gameSpeed, 4);
// Flash screen to indicate secret unlock
LK.effects.flashScreen(0x00ff00, 500);
} else if (selectedCarType === 1 && car2TapCount >= 10) {
// Trophy road mode - start with lots of trophies
distanceTraveled = 0;
// Flash screen golden to indicate trophy road
LK.effects.flashScreen(0xFFD700, 1000);
// Set flag for trophy road mode
trophyRoadMode = true;
} else {
distanceTraveled = 0;
}
nitroEffect = false;
nitroEndTime = 0;
hasShield = false;
trophyRoadMode = false;
rapModeActive = false;
rapModeTimer = 0;
playerCar4Unlocked = true;
// Reset score
LK.setScore(0);
// Add enhanced road background
var roadBackground = game.addChild(LK.getAsset('roadCenter', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
}));
roadBackground.alpha = 0.8;
// Add road side markers
var leftSide = game.addChild(LK.getAsset('roadSide', {
anchorX: 0.5,
anchorY: 0.5,
x: 200,
y: 1366
}));
var rightSide = game.addChild(LK.getAsset('roadSide', {
anchorX: 0.5,
anchorY: 0.5,
x: 1848,
y: 1366
}));
// Update UI texts with English
scoreTxt.setText('Distance: ' + Math.floor(distanceTraveled));
bestScoreTxt.setText('Best: ' + bestDistance);
speedTxt.setText('Speed: ' + gameSpeed.toFixed(1) + 'x');
// Reinitialize player car to ensure it's properly set up
initializePlayerCar();
// Start background music
LK.playMusic('bgmusic');
}
// Initialize best score system
loadBestScore();
// Create start menu on game load
createStartMenu();
// Car selection variable
var selectedCarType = 0; // 0 for PlayerCar, 1 for PlayerCar2, 2 for PlayerCar3
var playerCar;
var selectionIndicator;
var car1TapCount = 0; // Track taps on playercar1 for secret unlock
var car2TapCount = 0; // Track taps on playercar2 for trophy road
var car3TapCount = 0; // Track taps on playercar3 for secret message
// Update car selection visual state
function updateCarSelection() {
if (selectionIndicator) {
selectionIndicator.x = selectedCarType === 0 ? 224 : selectedCarType === 1 ? 524 : selectedCarType === 2 ? 824 : selectedCarType === 3 ? 1124 : selectedCarType === 4 ? 1424 : 1724;
}
// Check if car 3 is unlocked
var car3Unlocked = bestDistance >= 2000;
// Update car button tints if they exist
if (menuElements.length > 0) {
for (var i = 0; i < menuElements.length; i++) {
var element = menuElements[i];
if (element.x === 624 && element.y === 1650) {
element.tint = selectedCarType === 0 ? 0xFFD700 : 0xFFFFFF;
} else if (element.x === 1024 && element.y === 1650) {
element.tint = selectedCarType === 1 ? 0xFFD700 : 0xFFFFFF;
} else if (element.x === 1424 && element.y === 1650) {
if (car3Unlocked) {
element.tint = selectedCarType === 2 ? 0xFFD700 : 0xFFFFFF;
} else {
element.tint = 0x666666; // Gray out locked car
element.alpha = 0.5;
}
}
}
}
}
// Initialize player car based on selection
function initializePlayerCar() {
if (playerCar) {
playerCar.destroy();
}
if (selectedCarType === 0) {
playerCar = game.addChild(new PlayerCar());
} else if (selectedCarType === 1) {
playerCar = game.addChild(new PlayerCar2());
} else if (selectedCarType === 2) {
playerCar = game.addChild(new PlayerCar3());
} else if (selectedCarType === 3) {
playerCar = game.addChild(new PlayerCar4());
} else if (selectedCarType === 4) {
playerCar = game.addChild(new PlayerCar5());
} else if (selectedCarType === 5) {
playerCar = game.addChild(new PlayerCar6());
}
playerCar.x = 324 + 400; // Lane 1
playerCar.y = 2200;
}
// Initialize the first car
initializePlayerCar();
var enemyCars = [];
var powerUps = [];
var roadLines = [];
var nitros = [];
var cups = [];
var bombers = [];
var bombs = [];
var ramps = [];
var pedestrians = [];
var playerJumping = false;
var jumpStartTime = 0;
var jumpDuration = 60; // 1 second at 60fps
var jumpHeight = 0;
var gameSpeed = 1;
var spawnTimer = 0;
var spawnRate = 120;
var lineSpawnTimer = 0;
var powerUpSpawnTimer = 0;
var nitroSpawnTimer = 0;
var cupSpawnTimer = 0;
var bomberSpawnTimer = 0;
var rampSpawnTimer = 0;
var pedestrianSpawnTimer = 0;
var distanceTraveled = 0;
var nitroEffect = false;
var nitroEndTime = 0;
var hasShield = false;
var trophyRoadMode = false;
var rapModeActive = false;
var rapModeTimer = 0;
var rapModeCheckInterval = 600; // Check every 10 seconds (600 ticks at 60fps)
var playerCar4Unlocked = true;
// Create initial road lines
for (var i = 0; i < 20; i++) {
for (var lane = 0; lane < 4; lane++) {
var line = game.addChild(new RoadLine());
line.x = 524 + lane * 400; // Between lanes
line.y = i * 150 - 200;
roadLines.push(line);
}
}
// UI Elements
var scoreTxt = new Text2('Distance: 0', {
size: 80,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 4
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var bestScoreTxt = new Text2('Best: ' + bestDistance, {
size: 60,
fill: 0xFFD700,
stroke: 0x000000,
strokeThickness: 3
});
bestScoreTxt.anchor.set(0.5, 0);
bestScoreTxt.y = 90;
LK.gui.top.addChild(bestScoreTxt);
var speedTxt = new Text2('Speed: 1x', {
size: 60,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 3
});
speedTxt.anchor.set(1, 1);
speedTxt.x = -20;
speedTxt.y = -20;
LK.gui.bottomRight.addChild(speedTxt);
// Touch controls
var touchStartX = 0;
var touchStartTime = 0;
game.down = function (x, y, obj) {
if (gameState === 'menu') {
// Check car selection buttons
if (y >= 1050 && y <= 1250) {
if (x >= 124 && x <= 324) {
// Car 1 selected
selectedCarType = 0;
car1TapCount++; // Increment tap counter
updateCarSelection();
initializePlayerCar();
return;
} else if (x >= 424 && x <= 624) {
// Car 2 selected
selectedCarType = 1;
car2TapCount++; // Increment tap counter for car2
updateCarSelection();
initializePlayerCar();
return;
} else if (x >= 724 && x <= 924) {
// Car 3 selected - check if unlocked
if (bestDistance >= 2000) {
selectedCarType = 2;
car3TapCount++; // Increment tap counter for car3
// Check if tapped 10 times for secret message
if (car3TapCount >= 10) {
// Display "Thank you Yavuz Abi" in score area
scoreTxt.setText('Thank you Yavuz Abi');
// Flash screen to indicate special message
LK.effects.flashScreen(0xFFD700, 1000);
}
updateCarSelection();
initializePlayerCar();
} else {
// Car 3 is locked, flash red to indicate requirement
LK.effects.flashScreen(0xff0000, 300);
}
return;
} else if (x >= 1024 && x <= 1224) {
// Car 4 selected - check if unlocked
if (playerCar4Unlocked) {
selectedCarType = 3;
updateCarSelection();
initializePlayerCar();
} else {
// Car 4 is locked, flash purple to indicate requirement
LK.effects.flashScreen(0x9932CC, 300);
}
return;
} else if (x >= 1324 && x <= 1524) {
// Car 5 selected
selectedCarType = 4;
updateCarSelection();
initializePlayerCar();
return;
} else if (x >= 1624 && x <= 1824) {
// Car 6 selected
selectedCarType = 5;
updateCarSelection();
initializePlayerCar();
return;
}
}
// Check for start button tap at bottom - expanded touch area for better UX
if (y >= 2150 && y <= 2650 && x >= 500 && x <= 1548) {
startGame();
return;
}
}
touchStartX = x;
touchStartTime = LK.ticks;
};
game.up = function (x, y, obj) {
if (gameState !== 'playing') return;
var touchEndX = x;
var swipeDistance = touchEndX - touchStartX;
var touchDuration = LK.ticks - touchStartTime;
// Detect swipe or tap
if (Math.abs(swipeDistance) > 100 && touchDuration < 30) {
// Swipe detected
if (swipeDistance > 0) {
playerCar.switchLane(1); // Swipe right
} else {
playerCar.switchLane(-1); // Swipe left
}
} else if (touchDuration < 15) {
// Quick tap - determine direction based on screen side
if (x > 1024) {
playerCar.switchLane(1); // Right side tap
} else {
playerCar.switchLane(-1); // Left side tap
}
}
};
function spawnEnemyCar() {
var lane = Math.floor(Math.random() * 4);
var enemy;
// 20% chance to spawn the new powerful EnemyCar4 at higher distances
if (distanceTraveled > 3000 && Math.random() < 0.2) {
enemy = game.addChild(new EnemyCar4());
enemy.x = 324 + lane * 400;
enemy.y = -100;
enemy.lane = lane;
enemy.speed = 12 * gameSpeed;
} else {
var carTypes = ['enemyCar1', 'enemyCar2', 'enemyCar3'];
var carType = carTypes[Math.floor(Math.random() * carTypes.length)];
enemy = game.addChild(new EnemyCar(carType));
enemy.x = 324 + lane * 400;
enemy.y = -100;
enemy.lane = lane;
enemy.speed = 8 * gameSpeed;
}
enemyCars.push(enemy);
}
function spawnPowerUp() {
// Reduce spawn chance as difficulty increases
var spawnChance = Math.max(0.1, 0.3 - distanceTraveled / 25000); // Decreases from 30% to 10%
if (Math.random() < spawnChance) {
var lane = Math.floor(Math.random() * 4);
var powerUp = game.addChild(new PowerUp());
powerUp.x = 324 + lane * 400;
powerUp.y = -100;
powerUp.speed = 8 * gameSpeed;
powerUps.push(powerUp);
}
}
function spawnNitro() {
// Significantly reduce spawn chance as difficulty increases
var spawnChance = Math.max(0.05, 0.2 - distanceTraveled / 20000); // Decreases from 20% to 5%
if (Math.random() < spawnChance) {
var lane = Math.floor(Math.random() * 4);
var nitro = game.addChild(new Nitro());
nitro.x = 324 + lane * 400;
nitro.y = -100;
nitro.speed = 8 * gameSpeed;
nitros.push(nitro);
}
}
function spawnCup() {
// Check if trophy road mode is active
if (trophyRoadMode) {
// In trophy road mode, spawn many cups (trophies)
var spawnChance = 0.8; // Very high spawn chance for trophies
if (Math.random() < spawnChance) {
// Spawn multiple cups across different lanes
for (var trophyLane = 0; trophyLane < 4; trophyLane++) {
if (Math.random() < 0.7) {
// 70% chance per lane
var cup = game.addChild(new Cup());
cup.x = 324 + trophyLane * 400;
cup.y = -100 - trophyLane * 150; // Stagger them vertically
cup.speed = 8 * gameSpeed;
cups.push(cup);
}
}
}
} else {
// Normal spawn chance for cups
var spawnChance = Math.max(0.03, 0.15 - distanceTraveled / 30000); // Decreases from 15% to 3%
if (Math.random() < spawnChance) {
var lane = Math.floor(Math.random() * 4);
var cup = game.addChild(new Cup());
cup.x = 324 + lane * 400;
cup.y = -100;
cup.speed = 8 * gameSpeed;
cups.push(cup);
}
}
}
function spawnRamp() {
// Spawn ramps occasionally to help player jump over obstacles
var spawnChance = Math.max(0.05, 0.15 - distanceTraveled / 20000); // Decreases from 15% to 5%
if (Math.random() < spawnChance) {
var lane = Math.floor(Math.random() * 4);
var ramp = game.addChild(new Ramp());
ramp.x = 324 + lane * 400;
ramp.y = -100;
ramp.lane = lane;
ramp.speed = 8 * gameSpeed;
ramps.push(ramp);
}
}
function spawnPedestrian() {
// Increased spawn chance for pedestrians by 80% more (from 25.92% to 46.66%)
var spawnChance = Math.max(0.1555, 0.4666 - distanceTraveled / 30000); // Decreases from 46.66% to 15.55%
if (Math.random() < spawnChance) {
// Spawn from sides of the road
var startSide = Math.random() < 0.5 ? 0 : 1; // 0 = left, 1 = right
var pedestrian = game.addChild(new Pedestrian());
pedestrian.x = startSide === 0 ? 124 : 1924; // Start from road sides
pedestrian.y = -100;
pedestrian.lane = startSide === 0 ? 0 : 3; // Start lane
pedestrian.speed = 6 * gameSpeed;
pedestrians.push(pedestrian);
}
}
function spawnBomber() {
// Moderate spawn chance for bombers
var spawnChance = Math.max(0.08, 0.25 - distanceTraveled / 25000); // Decreases from 25% to 8%
if (Math.random() < spawnChance) {
var lane = Math.floor(Math.random() * 4);
var bomber = game.addChild(new Bomber());
bomber.x = 324 + lane * 400;
bomber.y = -100;
bomber.lane = lane;
bomber.speed = 6 * gameSpeed;
bombers.push(bomber);
}
}
game.update = function () {
// Only update game logic when playing
if (gameState !== 'playing') return;
// PlayerCar4 is now available from the start - no unlock required
// Check for rap mode activation
rapModeTimer++;
if (rapModeTimer >= rapModeCheckInterval) {
// 80% chance to activate rap mode every 10 seconds - rap appears frequently now!
if (Math.random() < 0.8 && !rapModeActive) {
rapModeActive = true;
// Flash screen with hip-hop colors (purple/gold)
LK.effects.flashScreen(0x9932CC, 800);
// Change UI text to rap style
scoreTxt.setText('Yo Distance: ' + Math.floor(distanceTraveled) + ' meters!');
speedTxt.setText('Speed Flow: ' + gameSpeed.toFixed(1) + 'x');
// Rap mode lasts for 5 seconds
LK.setTimeout(function () {
rapModeActive = false;
// Reset UI text to normal
scoreTxt.setText('Distance: ' + Math.floor(distanceTraveled));
speedTxt.setText('Speed: ' + gameSpeed.toFixed(1) + 'x');
LK.effects.flashScreen(0x00FFFF, 400);
}, 5000);
}
rapModeTimer = 0;
}
// Update distance and speed with accelerated progression
distanceTraveled += gameSpeed;
var lastGameSpeed = gameSpeed;
// More aggressive speed scaling for increased difficulty
gameSpeed = 1 + distanceTraveled / 7000 + Math.pow(distanceTraveled / 15000, 1.5);
gameSpeed = Math.min(gameSpeed, 4); // Cap maximum speed to keep game playable
// Update UI text based on rap mode
if (rapModeActive) {
scoreTxt.setText('Yo Distance: ' + Math.floor(distanceTraveled) + ' meters!');
bestScoreTxt.setText('Best Flow: ' + bestDistance);
speedTxt.setText('Speed Flow: ' + gameSpeed.toFixed(1) + 'x');
} else {
scoreTxt.setText('Distance: ' + Math.floor(distanceTraveled));
bestScoreTxt.setText('Best: ' + bestDistance);
speedTxt.setText('Speed: ' + gameSpeed.toFixed(1) + 'x');
}
// Add pulsing effect when speed increases
if (gameSpeed > lastGameSpeed + 0.1) {
tween(speedTxt, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(speedTxt, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeIn
});
}
});
}
// Spawn enemies with progressive difficulty
spawnTimer++;
var adjustedSpawnRate = Math.max(30, spawnRate - Math.floor(distanceTraveled / 500)); // More aggressive spawn rate reduction
if (spawnTimer >= adjustedSpawnRate / gameSpeed) {
spawnEnemyCar();
spawnTimer = 0;
// Multiple enemy spawning at higher difficulty
if (distanceTraveled > 5000 && Math.random() < 0.3) {
spawnEnemyCar(); // 30% chance for double spawn after 5000 distance
}
if (distanceTraveled > 10000 && Math.random() < 0.2) {
spawnEnemyCar(); // Additional spawn chance after 10000 distance
}
}
// Spawn power-ups with reduced frequency at higher difficulty
powerUpSpawnTimer++;
var powerUpInterval = Math.max(200, 300 + Math.floor(distanceTraveled / 200)); // Longer intervals as distance increases
if (powerUpSpawnTimer >= powerUpInterval / gameSpeed) {
spawnPowerUp();
powerUpSpawnTimer = 0;
}
// Spawn nitro with increased rarity at higher difficulty
nitroSpawnTimer++;
var nitroInterval = Math.max(400, 600 + Math.floor(distanceTraveled / 150)); // Much longer intervals as distance increases
if (nitroSpawnTimer >= nitroInterval / gameSpeed) {
spawnNitro();
nitroSpawnTimer = 0;
}
// Spawn cups with very rare frequency
cupSpawnTimer++;
var cupInterval = Math.max(800, 1200 + Math.floor(distanceTraveled / 100)); // Very long intervals
if (cupSpawnTimer >= cupInterval / gameSpeed) {
spawnCup();
cupSpawnTimer = 0;
}
// Spawn bombers periodically
bomberSpawnTimer++;
var bomberInterval = Math.max(300, 500 + Math.floor(distanceTraveled / 200)); // Moderate intervals
if (bomberSpawnTimer >= bomberInterval / gameSpeed) {
spawnBomber();
bomberSpawnTimer = 0;
}
// Spawn ramps periodically
rampSpawnTimer++;
var rampInterval = Math.max(600, 800 + Math.floor(distanceTraveled / 300)); // Long intervals for ramps
if (rampSpawnTimer >= rampInterval / gameSpeed) {
spawnRamp();
rampSpawnTimer = 0;
}
// Spawn pedestrians occasionally
pedestrianSpawnTimer++;
var pedestrianInterval = Math.max(700, 1000 + Math.floor(distanceTraveled / 250)); // Moderate intervals
if (pedestrianSpawnTimer >= pedestrianInterval / gameSpeed) {
spawnPedestrian();
pedestrianSpawnTimer = 0;
}
// Check nitro effect end
if (nitroEffect && LK.ticks >= nitroEndTime) {
nitroEffect = false;
tween(playerCar, {
scaleX: 1,
scaleY: 1
}, {
duration: 300
});
}
// Spawn road lines
lineSpawnTimer++;
if (lineSpawnTimer >= 25) {
for (var lane = 0; lane < 4; lane++) {
var line = game.addChild(new RoadLine());
line.x = 524 + lane * 400;
line.y = -100;
line.speed = 8 * gameSpeed;
roadLines.push(line);
}
lineSpawnTimer = 0;
}
// Update and check power-ups
for (var j = powerUps.length - 1; j >= 0; j--) {
var powerUp = powerUps[j];
// Remove off-screen power-ups
if (powerUp.y > 2800) {
powerUp.destroy();
powerUps.splice(j, 1);
continue;
}
// Check collection
if (powerUp.intersects(playerCar)) {
LK.setScore(LK.getScore() + 50);
LK.getSound('collect').play();
LK.effects.flashObject(powerUp, 0xffffff, 200);
// Add smooth scale-out effect before destroying
tween(powerUp, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
powerUp.destroy();
}
});
powerUps.splice(j, 1);
}
}
// Update and check nitros
for (var n = nitros.length - 1; n >= 0; n--) {
var nitro = nitros[n];
// Remove off-screen nitros
if (nitro.y > 2800) {
nitro.destroy();
nitros.splice(n, 1);
continue;
}
// Check collection
if (nitro.intersects(playerCar)) {
LK.setScore(LK.getScore() + 100);
LK.getSound('collect').play();
// Activate nitro effect
nitroEffect = true;
nitroEndTime = LK.ticks + 300; // 5 seconds at 60fps
tween(playerCar, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 300
});
LK.effects.flashScreen(0x00ff00, 500);
// Add smooth scale-out effect for nitro
tween(nitro, {
scaleX: 3,
scaleY: 3,
alpha: 0
}, {
duration: 400,
easing: tween.elasticOut,
onFinish: function onFinish() {
nitro.destroy();
}
});
nitros.splice(n, 1);
}
}
// Update and check cups
for (var c = cups.length - 1; c >= 0; c--) {
var cup = cups[c];
// Remove off-screen cups
if (cup.y > 2800) {
cup.destroy();
cups.splice(c, 1);
continue;
}
// Check collection
if (cup.intersects(playerCar)) {
hasShield = true;
LK.setScore(LK.getScore() + 150);
LK.getSound('collect').play();
LK.effects.flashScreen(0xFFD700, 400);
// Visual feedback for shield activation
tween(playerCar, {
tint: 0xFFD700
}, {
duration: 200,
onFinish: function onFinish() {
tween(playerCar, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
// Add smooth scale-out effect for cup
tween(cup, {
scaleX: 3,
scaleY: 3,
alpha: 0
}, {
duration: 300,
easing: tween.elasticOut,
onFinish: function onFinish() {
cup.destroy();
}
});
cups.splice(c, 1);
}
}
// Update and check bombers
for (var b = bombers.length - 1; b >= 0; b--) {
var bomber = bombers[b];
// Remove off-screen bombers
if (bomber.y > 2800) {
bomber.destroy();
bombers.splice(b, 1);
continue;
}
// Check collision with player
if (bomber.intersects(playerCar)) {
// Always crush/kill the bomber person on collision
LK.setScore(LK.getScore() + 300);
LK.getSound('collect').play();
LK.effects.flashScreen(0x00ff00, 300);
// Create explosion at bomber position
var explosion = game.addChild(new Explosion());
explosion.x = bomber.x;
explosion.y = bomber.y;
// Destroy the bomber
bomber.destroy();
bombers.splice(b, 1);
continue;
}
}
// Update and check bombs
for (var bomb = bombs.length - 1; bomb >= 0; bomb--) {
var bombObj = bombs[bomb];
// Remove off-screen bombs
if (bombObj.y > 2800) {
bombObj.destroy();
bombs.splice(bomb, 1);
continue;
}
// Check collision with player
if (bombObj.intersects(playerCar)) {
if (hasShield) {
// Player has shield from cup - destroy bomb instead
hasShield = false;
LK.setScore(LK.getScore() + 200);
LK.getSound('collect').play();
LK.effects.flashScreen(0x00ff00, 300);
// Create explosion at bomb position
var explosion = game.addChild(new Explosion());
explosion.x = bombObj.x;
explosion.y = bombObj.y;
// Destroy the bomb
bombObj.destroy();
bombs.splice(bomb, 1);
continue;
} else {
// Normal collision - game over with bigger explosion
var explosion = game.addChild(new Explosion());
explosion.x = playerCar.x;
explosion.y = playerCar.y;
// Create additional explosion for bomb impact
var bombExplosion = game.addChild(new Explosion());
bombExplosion.x = bombObj.x;
bombExplosion.y = bombObj.y;
tween(playerCar, {
scaleX: 0,
scaleY: 0,
rotation: Math.PI * 2,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut
});
if (distanceTraveled > bestDistance) {
bestDistance = Math.floor(distanceTraveled);
bestScoreTxt.setText('Best: ' + bestDistance);
saveBestScore();
}
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
}
// Update and check ramps
for (var r = ramps.length - 1; r >= 0; r--) {
var ramp = ramps[r];
// Remove off-screen ramps
if (ramp.y > 2800) {
ramp.destroy();
ramps.splice(r, 1);
continue;
}
// Check if player hits ramp to initiate jump
if (ramp.intersects(playerCar) && !playerJumping) {
playerJumping = true;
jumpStartTime = LK.ticks;
LK.setScore(LK.getScore() + 75); // Bonus for using ramp
LK.getSound('collect').play();
// Flash effect for ramp activation
LK.effects.flashScreen(0x00AAFF, 300);
// Scale out ramp effect
tween(ramp, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 400,
onFinish: function onFinish() {
ramp.destroy();
}
});
ramps.splice(r, 1);
continue;
}
}
// Update and check pedestrians
for (var p = pedestrians.length - 1; p >= 0; p--) {
var pedestrian = pedestrians[p];
// Remove off-screen pedestrians
if (pedestrian.y > 2800) {
pedestrian.destroy();
pedestrians.splice(p, 1);
continue;
}
// Check collision with player
if (pedestrian.intersects(playerCar)) {
if (hasShield) {
// Player has shield - save pedestrian and get bonus
hasShield = false;
LK.setScore(LK.getScore() + 250);
LK.getSound('collect').play();
LK.effects.flashScreen(0x00ff00, 300);
// Create sparkle effect for saving pedestrian
var explosion = game.addChild(new Explosion());
explosion.x = pedestrian.x;
explosion.y = pedestrian.y;
// Destroy the pedestrian (saved)
pedestrian.destroy();
pedestrians.splice(p, 1);
continue;
} else {
// Normal collision - game over
var explosion = game.addChild(new Explosion());
explosion.x = playerCar.x;
explosion.y = playerCar.y;
tween(playerCar, {
scaleX: 0,
scaleY: 0,
rotation: Math.PI * 2,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut
});
if (distanceTraveled > bestDistance) {
bestDistance = Math.floor(distanceTraveled);
bestScoreTxt.setText('Best: ' + bestDistance);
saveBestScore();
}
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
}
// Collision detection with enemies - skip if jumping high enough
for (var i = enemyCars.length - 1; i >= 0; i--) {
var enemy = enemyCars[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
// Remove off-screen enemies
if (enemy.lastY < 2800 && enemy.y >= 2800) {
enemy.destroy();
enemyCars.splice(i, 1);
continue;
}
// Check collision with player - but not if jumping high enough
if (enemy.intersects(playerCar) && (!playerJumping || jumpHeight < 50)) {
if (hasShield) {
// Player has shield from cup - destroy enemy instead
hasShield = false;
LK.setScore(LK.getScore() + 200);
LK.getSound('collect').play();
LK.effects.flashScreen(0x00ff00, 300);
// Create explosion at enemy position
var explosion = game.addChild(new Explosion());
explosion.x = enemy.x;
explosion.y = enemy.y;
// Destroy the enemy
enemy.destroy();
enemyCars.splice(i, 1);
continue;
} else {
// Normal collision - game over
// Create explosion at collision point
var explosion = game.addChild(new Explosion());
explosion.x = playerCar.x;
explosion.y = playerCar.y;
// Make player car explode with tween effect
tween(playerCar, {
scaleX: 0,
scaleY: 0,
rotation: Math.PI * 2,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut
});
// Update best score if needed
if (distanceTraveled > bestDistance) {
bestDistance = Math.floor(distanceTraveled);
bestScoreTxt.setText('Best: ' + bestDistance);
saveBestScore();
}
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
} else if (playerJumping && jumpHeight >= 50) {
// Player jumped over enemy - bonus points!
if (!enemy.jumpedOver) {
LK.setScore(LK.getScore() + 150);
LK.getSound('dodge').play();
enemy.jumpedOver = true; // Mark to prevent multiple bonuses
}
}
// Check for near miss (score bonus)
var distanceFromPlayer = Math.abs(enemy.x - playerCar.x);
if (enemy.y > playerCar.y - 150 && enemy.y < playerCar.y + 150 && distanceFromPlayer < 200 && distanceFromPlayer > 150) {
if (!enemy.nearMissScored) {
LK.setScore(LK.getScore() + 10);
LK.getSound('dodge').play();
enemy.nearMissScored = true;
}
}
enemy.lastY = enemy.y;
}
// Update road lines
for (var k = roadLines.length - 1; k >= 0; k--) {
var line = roadLines[k];
// Remove off-screen lines
if (line.y > 2800) {
line.destroy();
roadLines.splice(k, 1);
}
}
};
pixel art ferrari bird's eye view. In-Game asset. 2d. High contrast. No shadows
pixel art tofaş bird's eye view. In-Game asset. 2d. High contrast. No shadows
pixel art Togg bird's eye view. In-Game asset. 2d. High contrast. No shadows
pixel art gas pedal bird's eye view. In-Game asset. 2d. High contrast. No shadows
pixel art nitro. In-Game asset. 2d. High contrast. No shadows
pixel art fantasy car bird's eye view. In-Game asset. 2d. High contrast. No shadows
pixel art straight line,. In-Game asset. 2d. High contrast. No shadows
Gold and Glory pixel art cup. In-Game asset. 2d. High contrast. No shadows
bugatti bolide pixel art bird's eye view. In-Game asset. 2d. High contrast. No shadows
BMW X6 pixel art bird's eye view. In-Game asset. 2d. High contrast. No shadows
pixel art joker. In-Game asset. 2d. High contrast. No shadows
düz sarı çizgi. In-Game asset. 2d. High contrast. No shadows
pixel art peter parker. In-Game asset. 2d. High contrast. No shadows
bird's eye pixel art motorcycle suzuki. In-Game asset. 2d. High contrast. No shadows