Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'ReferenceError: math is not defined' in or related to this line: 'lastNightFilterDistance = math.floor(distanceTraveled / 100);' Line Number: 2028
Code edit (1 edits merged)
Please save this source code
User prompt
add and remove objnightfilter every 100 distance
User prompt
play snd_drone when objdrone is destroyed
Code edit (3 edits merged)
Please save this source code
User prompt
lower a little bit obj laser
Code edit (1 edits merged)
Please save this source code
User prompt
instantiate objnightfilter above objcity with an transparency of 80%
User prompt
when the hero is dashing and intersecting with objspikey, not just dashing
User prompt
When the hero is dashing and intersects with multiple `ObjSPIKEY` instances simultaneously, all of those instances will be destroyed and play snd_spikey
User prompt
can you check for: 3. **Game Events**: Certain game events or mechanics might trigger the destruction of multiple `ObjSPIKEY` instances at once. For example, a power-up or special ability might destroy all `ObjSPIKEY` instances within a certain radius or on the screen.
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'on')' in or related to this line: 'self.on('destroy', function () {' Line Number: 2193
User prompt
when objspikeys custom collision is destroyed play snd_spikey
User prompt
objspikeys custom collision alpha should be at 25%
User prompt
objspikeys alpha should be at 25%
User prompt
objspikeys custom collision should be black
User prompt
objspikeys custom collision should be dark purple
User prompt
sometimes objspikey is invisible, fix it
User prompt
1. **Collision with Hero**: If the `ObjSPIKEY` intersects with the `hero` and the `hero` is dashing, the `ObjSPIKEY` is destroyed, and the `snd_spikey` sound is played.
User prompt
play snd_spikey when objspikey is destroyed
User prompt
play snd_sphere when objsphere is instantiated
User prompt
play sndwindup when objwindup is instantiated
User prompt
play sndsphere when objsphere is instantiated
User prompt
play snd_enemy when objlaser is instantiated
/**** * Classes ****/ var BootText = Container.expand(function (text) { var self = Container.call(this); var bootText = self.addChild(new Text2(text, { size: 150, fill: "#FFFFFF", fontWeight: 'bolder', stroke: "#000000", // Black outline strokeThickness: 5 // Thickness of the outline })); bootText.anchor.set(0.5, 0); self.alpha = 0; self.fadeIn = function () { if (self.alpha < 1) { self.alpha += 0.05; } }; self.fadeOut = function () { if (self.alpha > 0) { self.alpha -= 0.05; } else { self.destroy(); } }; }); var EnemyMiddleRight = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.x = game.width + 200; self.y = game.height / 2; self.alpha = 0; self.fadeInInterval = LK.setInterval(function () { self.alpha += 0.05; if (self.alpha >= 1) { LK.clearInterval(self.fadeInInterval); } }, 16); // Approximately 60 FPS self.animate = function () { var targetX = game.width - 100; self.animationInterval = LK.setInterval(function () { if (self.x > targetX) { self.x -= animationSpeed; } else { LK.clearInterval(self.animationInterval); // Execute Attack Pattern A first self.attackPatternA(); // Reverse animation after Attack Pattern A and B LK.setTimeout(function () { self.reverseAnimation(); }, 16000); // Execute reverseAnimation after Attack Pattern B } }, 16); // Approximately 60 FPS }; self.reverseAnimation = function () { var startX = game.width + 200; self.animationInterval = LK.setInterval(function () { if (self.x < startX) { self.x += animationSpeed; } else { LK.clearInterval(self.animationInterval); self.fadeOutInterval = LK.setInterval(function () { self.alpha -= 0.05; if (self.alpha <= 0) { LK.clearInterval(self.fadeOutInterval); self.visible = false; randomEvent = ""; // Reset random event eventTxt.setText('Event: None'); // Update event text isEventOngoing = false; // Set event status to false LK.getSound('snd_powerup').play(); // Play snd_powerup sound LK.getSound('snd_nice').play(); // Play snd_nice sound destroyAllObjs(); // Destroy all instances of ObjGO, ObjRALLY, ObjJUMP, ObjACCELERATE var originalIncrement = 1 / 60; var acceleratedIncrement = 1 / 15; distanceTraveledIncrement = acceleratedIncrement; var originalParallaxSpeed = parallax.speed; parallax.speed *= 5; var shakeAmplitude = 10; var shakeDuration = 100; var originalX = game.x; var originalY = game.y; var shakeInterval = LK.setInterval(function () { game.x = originalX + (Math.random() - 0.5) * shakeAmplitude; game.y = originalY + (Math.random() - 0.5) * shakeAmplitude; }, shakeDuration); LK.effects.flashScreen(0xffffff, 5000); // Flash screen for 5 seconds var objRush = LK.getAsset('objRush', { anchorX: 0.5, anchorY: 0.5 }); objRush.x = game.width / 2; objRush.y = game.height / 2; objRush.alpha = 0; // Start with alpha 0 for fade in effect game.addChild(objRush); // Fade in effect var fadeInInterval = LK.setInterval(function () { objRush.alpha += 0.05; if (objRush.alpha >= 1) { LK.clearInterval(fadeInInterval); // Start fade out effect after 3 seconds LK.setTimeout(function () { var fadeOutInterval = LK.setInterval(function () { objRush.alpha -= 0.05; if (objRush.alpha <= 0) { LK.clearInterval(fadeOutInterval); objRush.destroy(); } }, 50); // Approximately 20 FPS LK.setTimeout(function () { distanceTraveledIncrement = originalIncrement; parallax.speed = originalParallaxSpeed; LK.clearInterval(shakeInterval); game.x = originalX; game.y = originalY; LK.clearInterval(shakeInterval); game.x = originalX; game.y = originalY; }, 5000); // Reset to normal after 5 seconds }, 3000); } }, 50); // Approximately 20 FPS distanceTraveled += 100; // Increase distanceTraveled by 100 units } }, 16); // Approximately 60 FPS } }, 16); // Approximately 60 FPS }; self.attackPatternA = function () { // Define Attack Pattern A behavior here console.log("Executing Attack Pattern A"); // Instantiate objwindup in the center of the enemy objWindup = LK.getAsset('objwindup', { anchorX: 0.5, anchorY: 0.5 }); LK.getSound('snd_windup').play(); objWindup.x = self.x - objWindup.width / 2 - 100; objWindup.y = self.y - objWindup.height / 2 + 400; game.addChild(objWindup); // Add fast rotation to objwindup objWindup.update = function () { objWindup.rotation += 0.2; // Adjust the rotation speed as needed }; // Keep objwindup visible for 3 seconds LK.setTimeout(function () { // Replace objwindup with objlaser objWindup.destroy(); var objLaser = new ObjLaser(); objLaser.x = self.x - objLaser.width / 2 - 175; objLaser.y = self.y - objLaser.height / 2 + 450; game.addChild(objLaser); game.addChild(objLaser); // Ensure objLaser is added to the game LK.getSound('snd_enemy').play(); // Play snd_enemy sound // Add shake effect to objlaser var shakeAmplitude = 12; // Amplitude of the shake var shakeDuration = 100; // Duration of each shake in milliseconds var originalX = objLaser.x; var originalY = objLaser.y; var shakeInterval = LK.setInterval(function () { objLaser.x = originalX + (Math.random() - 0.75) * shakeAmplitude; objLaser.y = originalY + (Math.random() - 0.75) * shakeAmplitude; }, shakeDuration); LK.getSound('snd_enemy').play(); // Play snd_enemy sound // Keep objlaser visible for 5 seconds LK.setTimeout(function () { objLaser.destroy(); // Wait 1 second before starting attack pattern B LK.setTimeout(function () { self.attackPatternB(); }, 1000); }, 3000); }, 2000); }; self.attackPatternB = function () { console.log("Executing Attack Pattern B"); var duration = 12000; // 12 seconds var interval = 3000; // 3 seconds var startTime = Date.now(); var spawnSphere = function spawnSphere() { if (Date.now() - startTime >= duration) { LK.clearInterval(spawnInterval); return; } var objSphere = LK.getAsset('objsphere', { anchorX: 0.5, anchorY: 0.5 }); LK.getSound('snd_sphere').play(); objSphere.x = self.x - 300 + (Math.random() - 0.5) * 50; // Reduce randomness to X movement objSphere.y = self.y - 225 + (Math.random() - 0.5) * 50; // Add slight randomness to Y movement game.addChild(objSphere); var amplitude = 50; // Increase amplitude for a wider vertical arc var frequency = 0.01; // Adjust frequency for smoother movement var direction = Math.random() < 0.5 ? 1 : -1; objSphere.update = function () { objSphere.x -= 10; // Accelerate the negative x movement objSphere.y += Math.sin(objSphere.x * frequency) * (amplitude / 2) * direction; if (objSphere.x < -objSphere.width) { objSphere.destroy(); } // Remove pulsating effect // Ensure objSphere stays within the vertical boundaries of the playspace if (objSphere.y < 0) { objSphere.y = 0; } else if (objSphere.y > game.height - objSphere.height) { objSphere.y = game.height - objSphere.height; } // Move towards the y position of hero if (objSphere.y < hero.y) { objSphere.y += 2; // Adjust speed as needed } else if (objSphere.y > hero.y) { objSphere.y -= 2; // Adjust speed as needed } // Check for collision with hero if (objSphere.intersects(hero)) { LK.effects.flashScreen(0xff0000, 1000); // Flash screen red for 1 second LK.showGameOver(); // Trigger game over } }; game.addChild(objSphere); }; var spawnInterval = LK.setInterval(spawnSphere, interval); }; }); var Hero = Container.expand(function () { var self = Container.call(this); self.createDashTrail = function () { var trailCount = 10; var flashDuration = 50; // Duration for each flash for (var i = 0; i < trailCount; i++) { LK.setTimeout(function () { var trailParticle = new Particle(); trailParticle.x = self.x; trailParticle.y = self.y; game.addChild(trailParticle); var neonColors = [0x39ff14, 0xff073a, 0x00ffff, 0xffff00, 0xff00ff]; var randomColor = neonColors[Math.floor(Math.random() * neonColors.length)]; LK.effects.flashObject(trailParticle, randomColor, flashDuration); }, i * 50); } }; var heroGraphics = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 30; // Initialize jetfuel in the center of hero var jetfuel = self.attachAsset('jetfuel', { anchorX: 0.5, anchorY: 0.5 }); jetfuel.x = -50; jetfuel.y = 50; self.addChildAt(jetfuel, 0); // Set interval to flip jetfuel's visual on the x alignment every 0.5 seconds self.jetfuelInterval = LK.setInterval(function () { jetfuel.scale.x *= -1; }, 250); self.on('destroy', function () { eventTxt.setText('Event: None'); randomEvent = ""; LK.clearInterval(self.jetfuelInterval); }); self.dashSpeed = game.width / 2 / 30; // 1/2 of the screen over 0.5 seconds at 60FPS self.dashBackSpeed = self.dashSpeed / 2; // Accelerated return at half of the dash speed self.dashStartTime = 0; // Time when the dash started self.gravity = 1; self.isDashing = false; self.initialX = 200; self.animateToPosition = function () { var targetY = Math.max(2732 / 2, 300); var targetX = self.initialX; var animationSpeed = 10; if (!self.animationStarted) { self.animationDelay = LK.setTimeout(function () { self.animationStarted = true; }, 3000); self.animationStarted = false; } if (self.animationStarted) { if (self.y < targetY) { self.y += animationSpeed; } if (self.x < targetX) { self.x += animationSpeed; } if (self.y >= targetY && self.x >= targetX) { gameStarted = true; // Start the game once the hero reaches the initial position initializeScoreDisplay(); startObstacleGeneration(); } } }; self.dash = function () { if (!self.isDashing && LK.ticks - self.holdStartTime >= 60 && self.x === self.initialX) { self.isDashing = true; self.dashStartTime = LK.ticks; // Save the start time of the dash self.savedX = self.x; // Save the current x position self.dashTargetX = self.x + game.width / 3 * 2; // Set the target X position for the dash, now twice as long // Apply dash effect self.createDashTrail(); self.stopFlashing(); } }; self.isGravityFlipped = false; self.flipGravity = function () { if (!self.isDashing) { self.isGravityFlipped = !self.isGravityFlipped; self.gravity *= -1; } }; self._move_migrated = function () { if (self.isHolding && LK.ticks - self.holdStartTime >= 60 && LK.ticks - self.dashStartTime > 6) { self.dash(); } if (self.isDashing) { if (self.x < self.dashTargetX) { self.x += self.dashSpeed; // Check for collision with obstacles for (var i = obstacles.length - 1; i >= 0; i--) { if (self.intersects(obstacles[i])) { var explosion = new ParticleExplosion(obstacles[i].x, obstacles[i].y); game.addChild(explosion); if (obstacles[i] instanceof ObjGO) { heroGround.moveToCenterX(); var explosion = new ParticleExplosion(obstacles[i].x, obstacles[i].y); game.addChild(explosion); var explosion = new ParticleExplosion(obstacles[i].x, obstacles[i].y); game.addChild(explosion); LK.getSound('snd_powerup').play(); // Play snd_powerup sound handleCollisionWithObj(); // Call handleCollisionWithObj when colliding with ObjGO } else if (obstacles[i] instanceof ObjRALLY) { heroGround.moveToInitialPosition(); var initialHeroGroundX = heroGround.x; var initialHeroGroundY = heroGround.y; LK.getSound('snd_powerup').play(); // Play snd_powerup sound handleCollisionWithObj(); // Call handleCollisionWithObj when colliding with ObjRALLY } else if (obstacles[i] instanceof ObjJUMP) { brother(); LK.getSound('snd_powerup').play(); // Play snd_powerup sound handleCollisionWithObj(); // Call handleCollisionWithObj when colliding with ObjJUMP if (heroGround.idleSpeechBubble) { heroGround.idleSpeechBubble.visible = false; LK.setTimeout(function () { if (heroGround.idleSpeechBubble) { heroGround.idleSpeechBubble.visible = true; } }, 5000); } } else if (obstacles[i] instanceof ObjACCELERATE) { var explosion = new ParticleExplosion(obstacles[i].x, obstacles[i].y); game.addChild(explosion); LK.getSound('snd_powerup').play(); // Play snd_powerup sound LK.getSound('snd_letsgo').play(); // Play snd_letsgo sound destroyAllObjs(); // Destroy all instances of ObjGO, ObjRALLY, and ObjJUMP // Temporarily increase distanceTraveled increment var originalIncrement = 1 / 60; var acceleratedIncrement = 1 / 15; distanceTraveledIncrement = acceleratedIncrement; // Temporarily increase parallax speed var originalParallaxSpeed = parallax.speed; parallax.speed *= 5; // Add screen shake and flash effect var shakeAmplitude = 10; var shakeDuration = 100; var originalX = game.x; var originalY = game.y; var shakeInterval = LK.setInterval(function () { game.x = originalX + (Math.random() - 0.5) * shakeAmplitude; game.y = originalY + (Math.random() - 0.5) * shakeAmplitude; }, shakeDuration); LK.effects.flashScreen(0xffffff, 5000); // Flash screen for 5 seconds // Instantiate objrush in the center of the playspace for 3 seconds with fade in and fade out effect var objRush = LK.getAsset('objRush', { anchorX: 0.5, anchorY: 0.5 }); objRush.x = game.width / 2; objRush.y = game.height / 2; objRush.alpha = 0; // Start with alpha 0 for fade in effect game.addChild(objRush); // Fade in effect var fadeInInterval = LK.setInterval(function () { objRush.alpha += 0.05; if (objRush.alpha >= 1) { LK.clearInterval(fadeInInterval); // Start fade out effect after 3 seconds LK.setTimeout(function () { var fadeOutInterval = LK.setInterval(function () { objRush.alpha -= 0.05; if (objRush.alpha <= 0) { LK.clearInterval(fadeOutInterval); objRush.destroy(); } }, 50); // Approximately 20 FPS }, 3000); } }, 50); // Approximately 20 FPS LK.setTimeout(function () { distanceTraveledIncrement = originalIncrement; parallax.speed = originalParallaxSpeed; LK.clearInterval(shakeInterval); game.x = originalX; game.y = originalY; }, 5000); // Reset to normal after 5 seconds } if (obstacles[i]) { obstacles[i].destroy(); obstacles.splice(i, 1); } } } } else { self.isDashing = false; self.dashTargetX = null; // Clear the dash target position // Remove dash effect self.tint = 0xffffff; } } // Gradually move back to the initial position after dashing // Resume normal movement after reaching saved x position if (!self.isDashing && self.dashTargetX === null && self.x !== self.savedX) { var moveBack = self.savedX < self.x ? -self.dashBackSpeed : self.dashBackSpeed; self.x += moveBack; // Clamp the hero's x position to the savedX to prevent overshooting if (Math.abs(self.x - self.savedX) < Math.abs(moveBack)) { self.x = self.savedX; } } // Stop vertical movement while holding down if (!self.isHolding && !self.isDashing) { self.y += self.speed * self.gravity; var boundaryPadding = 300; // Adjust this value to set the top boundary padding if (self.y < boundaryPadding) { self.y = boundaryPadding; } if (self.y > game.height - 800) { self.y = game.height - 800; } } // Removed game over condition when hero leaves the screen horizontally // Generate particle trail if (LK.ticks % 5 == 0 && !self.isHolding) { var particle = new Particle(); particle.x = self.x; particle.y = self.y; game.addChildAt(particle, 0); particle.visible = true; // Ensure the particle is visible } }; self.isHolding = false; self.holdStartTime = 0; self.startFlashing = function () { if (!self.flashInterval && !self.isDashing) { self.flashInterval = LK.setInterval(function () { self.scale.set(self.scale.x === 1 ? 1.5 : 1); self.tint = self.tint === 0x0000ff ? 0x00ffff : 0x0000ff; // Transition between blue and cyan }, 100); // Pulse every 100ms } }; self.stopFlashing = function () { if (self.flashInterval) { LK.clearInterval(self.flashInterval); self.flashInterval = null; self.visible = true; // Ensure hero is visible after stopping flash self.tint = 0x9a3986; // Reset color to default self.scale.set(1); // Reset scale to default } }; self.onHold = function () { if (!self.isHolding && !self.isDashing && !self.isDashing) { self.isHolding = true; self.holdStartTime = LK.ticks; self.startFlashing(); } }; self.onRelease = function () { if (self.isHolding && !self.isDashing) { self.dash(); } self.isHolding = false; self.holdStartTime = 0; self.stopFlashing(); }; }); var Hero_Ground = Container.expand(function () { var self = Container.call(this); var heroGroundGraphics = self.attachAsset('heroGround', { anchorX: 0.5, anchorY: 0.5 }); var heroGroundGraphicsB = self.attachAsset('heroGroundB', { anchorX: 0.5, anchorY: 0.5 }); heroGroundGraphicsB.visible = false; self.addChild(heroGroundGraphicsB); // Set interval to switch between heroGround and heroGroundB every 0.5 seconds self.heroGroundInterval = LK.setInterval(function () { heroGroundGraphics.visible = !heroGroundGraphics.visible; heroGroundGraphicsB.visible = !heroGroundGraphicsB.visible; }, 250); self.on('destroy', function () { LK.clearInterval(self.heroGroundInterval); if (self.interpolationInterval) { LK.clearInterval(self.interpolationInterval); } }); self.speed = 20; self.gravity = 1; self.isJumping = false; self.jumpSpeed = -20; self.jumpVelocity = 0; self.initialY = 200; self._update_migrated = function () { if (self.isJumping) { self.y += self.jumpSpeed; self.jumpSpeed += self.gravity; } if (self.y > game.floorLevel) { self.y = game.floorLevel; self.isJumping = false; } }; self.moveToCenterX = function () { if (self.isMovingToCenter || self.isMovingToInitial) { return; } // Prevent multiple calls self.isMovingToCenter = true; // Set flag to indicate movement in progress isHeroGroundMoving = true; var targetX = game.width / 2 + 700; var interpolationSpeed = 15; // Adjust this value to control the speed of interpolation self.interpolationInterval = LK.setInterval(function () { if (Math.abs(self.x - targetX) < interpolationSpeed) { self.x = targetX; LK.clearInterval(self.interpolationInterval); self.isMovingToCenter = false; // Reset flag when movement is complete isHeroGroundMoving = false; // Replace movingSpeechBubble with idleSpeechBubble if (self.movingSpeechBubble) { self.movingSpeechBubble.destroy(); self.movingSpeechBubble = null; } self.idleSpeechBubble = LK.getAsset('idleSpeechBubble', { anchorX: 0.5, anchorY: 0.5 }); self.addChild(self.idleSpeechBubble); self.idleSpeechBubble.x = self.width / 2 - 20; self.idleSpeechBubble.y = -self.idleSpeechBubble.height / 2 - 125; } else { self.x += self.x < targetX ? interpolationSpeed : -interpolationSpeed; } }, 16); // Approximately 60 FPS // Replace idleSpeechBubble with movingSpeechBubble if (self.idleSpeechBubble) { self.idleSpeechBubble.destroy(); self.idleSpeechBubble = null; } // Ensure only one moving speech bubble is active at a time if (game.activeMovingSpeechBubble) { game.activeMovingSpeechBubble.destroy(); } self.movingSpeechBubble = LK.getAsset('movingSpeechBubble', { anchorX: 0.5, anchorY: 0.5 }); self.addChild(self.movingSpeechBubble); self.movingSpeechBubble.x = self.width / 2 + 10; self.movingSpeechBubble.y = -self.movingSpeechBubble.height / 2 - 125; game.activeMovingSpeechBubble = self.movingSpeechBubble; }; self._move_migrated = function () { if (self.isJumping) { self.y += self.jumpVelocity; self.jumpVelocity += self.gravity; if (self.y >= self.initialY) { self.y = self.initialY; self.isJumping = false; } } else { self.y += self.gravity; if (self.y > game.height - self.height / 2) { self.y = game.height - self.height / 2; } } }; self.moveToInitialPosition = function () { if (self.isMovingToInitial || self.isMovingToCenter) { return; } // Prevent multiple calls var targetX = heroGround.initialX; if (Math.abs(self.x - targetX) < interpolationSpeed) { return; // Already at the initial position, do nothing } self.isMovingToInitial = true; // Set flag to indicate movement in progress isHeroGroundMoving = true; var interpolationSpeed = 15; // Adjust this value to control the speed of interpolation self.interpolationInterval = LK.setInterval(function () { if (Math.abs(self.x - targetX) < interpolationSpeed) { self.x = targetX; LK.clearInterval(self.interpolationInterval); self.isMovingToInitial = false; // Reset flag when movement is complete isHeroGroundMoving = false; // Replace movingSpeechBubble with idleSpeechBubble if (self.movingSpeechBubble) { self.movingSpeechBubble.destroy(); self.movingSpeechBubble = null; } self.idleSpeechBubble = LK.getAsset('idleSpeechBubble', { anchorX: 0.5, anchorY: 0.5 }); self.addChild(self.idleSpeechBubble); self.idleSpeechBubble.x = self.width / 2 - 20; self.idleSpeechBubble.y = -self.idleSpeechBubble.height / 2 - 125; } else { self.x += self.x < targetX ? interpolationSpeed : -interpolationSpeed; } }, 16); // Approximately 60 FPS // Replace idleSpeechBubble with movingSpeechBubble if (self.idleSpeechBubble) { self.idleSpeechBubble.destroy(); self.idleSpeechBubble = null; } // Ensure only one moving speech bubble is active at a time if (game.activeMovingSpeechBubble) { game.activeMovingSpeechBubble.destroy(); } self.movingSpeechBubble = LK.getAsset('movingSpeechBubble', { anchorX: 0.5, anchorY: 0.5 }); self.addChild(self.movingSpeechBubble); self.movingSpeechBubble.x = self.width / 2 + 10; self.movingSpeechBubble.y = -self.movingSpeechBubble.height / 2 - 125; game.activeMovingSpeechBubble = self.movingSpeechBubble; }; }); var ObjACCELERATE = Container.expand(function () { var self = Container.call(this); var objACCELERATEGraphics = self.attachAsset('objAccelerate', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -4 - Math.random() * 3; self.alpha = 1; // Ensure objspikey is always visible self._move_migrated = function () { self.x += self.speed; if (self.x < -self.width) { self.x = game.width; var minY = 400; var maxY = game.height / 2 + 200; self.y = minY + Math.random() * (maxY - minY); } // Add hover effect self.y += Math.sin(LK.ticks / 10) * 2; }; }); var ObjCar = Container.expand(function () { var self = Container.call(this); var objCarGraphics = self.attachAsset('objcar', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -15; self.update = function () { // Check for collision with hero if (self.intersects(hero)) { LK.effects.flashScreen(0xff0000, 1000); // Flash screen red for 1 second LK.showGameOver(); // Trigger game over } // Check for collision with hero or heroGround if (self.intersects(hero) || self.intersects(heroGround)) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } self.x += self.speed; if (self.x < -self.width) { self.destroy(); isEventOngoing = false; eventTxt.setText('Event: None'); randomEvent = ""; distanceTraveled += 100; // Trigger acceleration effects LK.getSound('snd_powerup').play(); // Play snd_powerup sound LK.getSound('snd_nice').play(); // Play snd_nice sound destroyAllObjs(); // Destroy all instances of ObjGO, ObjRALLY, and ObjJUMP // Temporarily increase distanceTraveled increment var originalIncrement = 1 / 60; var acceleratedIncrement = 1 / 15; distanceTraveledIncrement = acceleratedIncrement; // Temporarily increase parallax speed var originalParallaxSpeed = parallax.speed; parallax.speed *= 5; // Add screen shake and flash effect var shakeAmplitude = 10; var shakeDuration = 100; var originalX = game.x; var originalY = game.y; var shakeInterval = LK.setInterval(function () { game.x = originalX + (Math.random() - 0.5) * shakeAmplitude; game.y = originalY + (Math.random() - 0.5) * shakeAmplitude; }, shakeDuration); LK.effects.flashScreen(0xffffff, 5000); // Flash screen for 5 seconds // Instantiate objrush in the center of the playspace for 3 seconds with fade in and fade out effect var objRush = LK.getAsset('objRush', { anchorX: 0.5, anchorY: 0.5 }); objRush.x = game.width / 2; objRush.y = game.height / 2; objRush.alpha = 0; // Start with alpha 0 for fade in effect game.addChild(objRush); // Fade in effect var fadeInInterval = LK.setInterval(function () { objRush.alpha += 0.05; if (objRush.alpha >= 1) { LK.clearInterval(fadeInInterval); // Start fade out effect after 3 seconds LK.setTimeout(function () { var fadeOutInterval = LK.setInterval(function () { objRush.alpha -= 0.05; if (objRush.alpha <= 0) { LK.clearInterval(fadeOutInterval); objRush.destroy(); } }, 50); // Approximately 20 FPS }, 3000); } }, 50); // Approximately 20 FPS LK.setTimeout(function () { distanceTraveledIncrement = originalIncrement; parallax.speed = originalParallaxSpeed; LK.clearInterval(shakeInterval); game.x = originalX; game.y = originalY; }, 5000); // Reset to normal after 5 seconds } if (!self.honkPlayed) { self.honkPlayed = true; LK.setTimeout(function () { LK.getSound('snd_carhonk').play(); }, 500); } // Check for collision with hero or heroGround if (self.intersects(hero) || self.intersects(heroGround)) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } }; }); var ObjData = Container.expand(function () { var self = Container.call(this); var objDataGraphics = self.attachAsset('objData', { anchorX: 0.5, anchorY: 0.5 }); // No speed property to ensure ObjData objects are static self._move_migrated = function () { self.y += Math.sin(LK.ticks / 10) * 2; // Add hover effect }; }); var ObjDrone = Container.expand(function () { var self = Container.call(this); var objDroneGraphics = self.attachAsset('objDrone', { anchorX: 0.5, anchorY: 0.5 }); self.erraticMovementInterval = LK.setInterval(function () { self.x += (Math.random() - 0.5) * 10; self.y += (Math.random() - 0.5) * 10; }, 100); self.relocationInterval = LK.setInterval(function () { var targetX = game.width / 2 + Math.random() * (game.width / 2); var targetY = Math.random() * game.height; var moveSpeed = 25; // Adjust this value to control the movement speed var moveInterval = LK.setInterval(function () { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < moveSpeed) { self.x = targetX; self.y = targetY; LK.clearInterval(moveInterval); } else { self.x += dx / distance * moveSpeed; self.y += dy / distance * moveSpeed; } }, 16); // Approximately 60 FPS }, 2000); self.countdownStarted = false; self.on('destroy', function () { LK.clearInterval(self.erraticMovementInterval); LK.clearInterval(self.relocationInterval); LK.clearInterval(catchTimerInterval); game.removeChild(catchTimerTxt); }); }); var ObjEvents = Container.expand(function () { var self = Container.call(this); var objEventsGraphics = self.attachAsset('objEvents', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -4 - Math.random() * 3; self._move_migrated = function () { self.x += self.speed; if (self.x < -self.width) { self.x = game.width + self.width; self.y = game.height - heroGround.height / 2 - 50; } if (eventTxt && eventTxt.text === 'Event: None') { self.x = game.width + self.width; self.y = game.height - heroGround.height / 2 - 50; } }; }); var ObjGO = Container.expand(function () { var self = Container.call(this); var objGOGraphics = self.attachAsset('objGO', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -4 - Math.random() * 3; self.spawnTime = LK.ticks; self._move_migrated = function () { self.x += self.speed; if (self.x < -self.width) { self.x = game.width; var minY = 400; var maxY = game.height / 2 + 200; self.y = minY + Math.random() * (maxY - minY); return; return; return; } // Add hover effect self.y += Math.sin(LK.ticks / 10) * 2; }; }); var ObjJUMP = Container.expand(function () { var self = Container.call(this); var objJUMPGraphics = self.attachAsset('objJUMP', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -4 - Math.random() * 3; self._move_migrated = function () { self.x += self.speed; if (self.x < -self.width) { self.x = game.width; var heroYMin = Math.max(hero.y - hero.height / 2, 0); var heroYMax = Math.min(hero.y + hero.height / 2, game.height); self.y = heroYMin + Math.random() * (heroYMax - heroYMin); } // Add hover effect self.y += Math.sin(LK.ticks / 10) * 2; }; }); var ObjLaser = Container.expand(function () { var self = Container.call(this); var laserGraphics = self.attachAsset('objlaser', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { // Check for collision with hero if (self.intersects(hero)) { LK.effects.flashScreen(0xff0000, 1000); // Flash screen red for 1 second LK.showGameOver(); // Trigger game over } }; }); var ObjRALLY = Container.expand(function () { var self = Container.call(this); var objRALLYGraphics = self.attachAsset('objRALLY', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -5; self._move_migrated = function () { self.x += self.speed; if (self.x < -self.width) { self.x = game.width; var heroYMin = Math.max(hero.y - hero.height / 2, 0); var heroYMax = Math.min(hero.y + hero.height / 2, game.height); self.y = heroYMin + Math.random() * (heroYMax - heroYMin); } // Add hover effect self.y += Math.sin(LK.ticks / 10) * 2; }; }); var ObjSPIKEY = Container.expand(function () { var self = Container.call(this); var objSPIKEYGraphics = self.attachAsset('objspikey', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -4 - Math.random() * 3; self.spawnTime = LK.ticks; self.collisionObject = self.addChild(new ObjSPIKEYCollision()); self.collisionObject.x = 0; self.collisionObject.y = 0; self._move_migrated = function () { self.x += self.speed; if (self.x < -self.width) { self.x = game.width; var minY = 400; var maxY = game.height / 2 + 200; self.y = minY + Math.random() * (maxY - minY); } // Add hover effect self.y += Math.sin(LK.ticks / 10) * 2; // Add rotation effect self.rotation -= 0.05; // Add scaling effect var scaleFactor = 0.85 + Math.abs(Math.sin(LK.ticks / 60) * 0.25); // Scale between 0.85 and 1.10 self.scale.set(scaleFactor); if (self.collisionObject.intersects(hero)) { if (hero.isDashing) { var explosion = new ParticleExplosion(self.x, self.y); game.addChild(explosion); self.destroy(); } else { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } else if (self.collisionObject.intersects(heroGround)) { if (isHeroGroundMoving) { var explosion = new ParticleExplosion(self.x, self.y); game.addChild(explosion); LK.getSound('snd_spikey').play(); self.destroy(); } else { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } }; }); var ObjSPIKEYCollision = Container.expand(function () { var self = Container.call(this); var collisionGraphics = self.attachAsset('smallCircle', { anchorX: 0.5, anchorY: 0.5 }); collisionGraphics.width = 50; // Adjust the width to further reduce collision size collisionGraphics.height = 50; // Adjust the height to further reduce collision size collisionGraphics.alpha = 1; // Ensure collision object is always visible collisionGraphics.tint = 0x4B0082; // Set collision object color to dark purple }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -5; self._move_migrated = function () { self.x += self.speed; if (self.x < -self.width) { self.x = game.width; var heroYMin = Math.max(hero.y - hero.height / 2, 0); var heroYMax = Math.min(hero.y + hero.height / 2, game.height); self.y = heroYMin + Math.random() * (heroYMax - heroYMin); } }; }); var Parallax = Container.expand(function () { var self = Container.call(this); var bgGraphics = self.attachAsset('background', { anchorX: 0.5, anchorY: 0.5 }); bgGraphics.x = game.width / 2; bgGraphics.y = game.height - bgGraphics.height / 2; self.speed = -3; self._move_migrated = function () { bgGraphics.x += self.speed; if (!self.bgGraphics2) { self.bgGraphics2 = self.attachAsset('background', { anchorX: 0.5, anchorY: 0.5 }); self.bgGraphics2.x = bgGraphics.x + bgGraphics.width; self.bgGraphics2.y = game.height - self.bgGraphics2.height / 2; self.addChildAt(self.bgGraphics2, 1); // Ensure bgGraphics2 is behind bgGraphics } self.bgGraphics2.x += self.speed; if (bgGraphics.x <= -bgGraphics.width / 2) { bgGraphics.x = self.bgGraphics2.x + bgGraphics.width; } if (self.bgGraphics2.x <= -self.bgGraphics2.width / 2) { self.bgGraphics2.x = bgGraphics.x + bgGraphics.width; } }; }); // Call the function every 15 seconds; var ParallaxCity = Container.expand(function () { var self = Container.call(this); var cityGraphics = self.attachAsset('objcity', { anchorX: 0.5, anchorY: 0.5 }); cityGraphics.x = game.width / 2; cityGraphics.y = game.height / 2; self.speed = -3; self._move_migrated = function () { cityGraphics.x += self.speed; if (!self.cityGraphics2) { self.cityGraphics2 = self.attachAsset('objcity', { anchorX: 0.5, anchorY: 0.5 }); self.cityGraphics2.x = cityGraphics.x + cityGraphics.width; self.cityGraphics2.y = game.height / 2; self.addChildAt(self.cityGraphics2, 1); // Ensure cityGraphics2 is behind cityGraphics } self.cityGraphics2.x += self.speed; if (cityGraphics.x <= -cityGraphics.width / 2) { cityGraphics.x = self.cityGraphics2.x + cityGraphics.width; } if (self.cityGraphics2.x <= -self.cityGraphics2.width / 2) { self.cityGraphics2.x = cityGraphics.x + cityGraphics.width; } }; }); var Particle = Container.expand(function () { var self = Container.call(this); var particleGraphics = self.attachAsset('particle', { anchorX: 0.5, anchorY: 0.5 }); var neonColors = [0x39ff14, 0xff073a, 0x00ffff, 0xffff00, 0xff00ff]; particleGraphics.tint = neonColors[Math.floor(Math.random() * neonColors.length)]; self.alpha = 1.0; self.fadeOut = function () { self.alpha -= 0.05; if (self.alpha <= 0) { if (self) { self.destroy(); } } }; }); var Particle2 = Container.expand(function () { var self = Container.call(this); var particleGraphics = self.attachAsset('particle2', { anchorX: 0.5, anchorY: 0.5 }); var neonColors = [0x39ff14, 0xff073a, 0x00ffff, 0xffff00, 0xff00ff]; particleGraphics.tint = neonColors[Math.floor(Math.random() * neonColors.length)]; self.alpha = 1.0; self.fadeOut = function () { self.alpha -= 0.05; if (self.alpha <= 0) { if (self) { self.destroy(); } } }; }); var ParticleExplosion = Container.expand(function (x, y) { var self = Container.call(this); var particles = []; var particleCount = 20; var speedRange = 20; // Further increased speed range for more exaggerated movement var neonColors = [0x39ff14, 0xff073a, 0x00ffff, 0xffff00, 0xff00ff]; for (var i = 0; i < particleCount; i++) { var particle = new Particle2(); particle.x = x; particle.y = y; particle.vx = (Math.random() - 0.5) * speedRange; particle.vy = (Math.random() - 0.5) * speedRange; particle.rotationSpeed = (Math.random() - 0.5) * 0.2; // Further increased rotation speed for more exaggerated movement particle.tint = neonColors[Math.floor(Math.random() * neonColors.length)]; particles.push(particle); self.addChild(particle); } self.update = function () { for (var i = particles.length - 1; i >= 0; i--) { particles[i].x += particles[i].vx; particles[i].y += particles[i].vy; particles[i].rotation += particles[i].rotationSpeed; // Apply rotation particles[i].alpha -= 0.02; if (particles[i].alpha <= 0) { if (particles[i]) { particles[i].destroy(); particles.splice(i, 1); } } } if (particles.length === 0) { self.destroy(); } }; }); var objLaser = Container.expand(function () { var self = Container.call(this); var laserGraphics = self.attachAsset('objlaser', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { // Check for collision with hero if (self.intersects(hero)) { LK.effects.flashScreen(0xff0000, 1000); // Flash screen red for 1 second LK.showGameOver(); // Trigger game over } }; game.addChild(self); // Ensure objLaser is added to the game }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ var collectCounterTxt = new Text2('0' + "/10", { size: 75, fill: "#add8e6", // Light blue color stroke: "#000000", strokeThickness: 2, fontWeight: 'bolder' }); collectCounterTxt.anchor.set(0.5, 0); collectCounterTxt.x = game.width - 300; collectCounterTxt.y = 100; var collectTimerTxt = new Text2('20.0', { size: 75, fill: "#ffcccb", // Pink color stroke: "#000000", strokeThickness: 2, fontWeight: 'bolder' // Make the text bolder }); collectTimerTxt.anchor.set(0.5, 0); collectTimerTxt.x = game.width / 2; collectTimerTxt.y = 100; var collectTimer = 20.0; var collectTimerInterval; var randomEvent = ""; var catchTimer = 15.0; var catchTimerTxt = new Text2(catchTimer.toString(), { size: 75, fill: "#ffcccb", // Pink color stroke: "#000000", strokeThickness: 2, fontWeight: 'bolder' }); catchTimerTxt.anchor.set(0.5, 0); catchTimerTxt.x = game.width / 2; catchTimerTxt.y = 100; var catchTimerInterval; var objDataCounter = 0; var objWindup = null; var objWindup = null; var objDataArray = []; var isEventOngoing = false; var generateObjEvents = function generateObjEvents() { if (isEventOngoing || obstacles.some(function (obstacle) { return obstacle instanceof ObjEvents; })) { return; } LK.setTimeout(function () { var objEvents = new ObjEvents(); objEvents.x = game.width + objEvents.width; objEvents.y = game.height - heroGround.height / 2 - 50; obstacles.push(objEvents); game.addChild(objEvents); }, 500 + Math.random() * 2000); }; var generateObjSPIKEY = function generateObjSPIKEY() { if (obstacles.filter(function (obstacle) { return obstacle instanceof ObjSPIKEY; }).length >= 1) { return; } LK.setTimeout(function () { var objSPIKEY = new ObjSPIKEY(); objSPIKEY.x = game.width; var spawnChance = Math.random(); if (spawnChance < 0.75) { // 75% chance to spawn on the y and x Axis of hero, but outside the playspace objSPIKEY.x = game.width + objSPIKEY.width; objSPIKEY.y = hero.y; } else { // 25% chance to spawn on hero ground, but outside the playspace objSPIKEY.x = game.width + objSPIKEY.width; objSPIKEY.y = heroGround.y; } // Ensure objSPIKEY does not spawn too close to other objects for (var i = 0; i < obstacles.length; i++) { if (Math.abs(obstacles[i].x - objSPIKEY.x) < 600) { objSPIKEY.x = obstacles[i].x + 600; } if (Math.abs(obstacles[i].y - objSPIKEY.y) < 600) { objSPIKEY.y = Math.random() < 0.5 ? obstacles[i].y - 600 : obstacles[i].y + 600; } } obstacles.push(objSPIKEY); game.addChild(objSPIKEY); }, 500 + Math.random() * 2000); }; var objSPIKEYGenerationInterval = LK.setInterval(generateObjSPIKEY, 8000); var generateObjACCELERATE = function generateObjACCELERATE() { if (obstacles.filter(function (obstacle) { return obstacle instanceof ObjACCELERATE; }).length >= 1) { return; } // Removed minimum delay of 60 ticks for ObjACCELERATE spawning LK.setTimeout(function () { var objACCELERATE = new ObjACCELERATE(); objACCELERATE.x = game.width; var minY = 300; // Top boundary var maxY = game.height / 2; // Adjusted bottom boundary to avoid spawning near the bottom of the playspace objACCELERATE.y = minY + Math.random() * (maxY - minY); // Ensure objACCELERATE does not spawn too close to other objects for (var i = 0; i < obstacles.length; i++) { if (Math.abs(obstacles[i].x - objACCELERATE.x) < 600) { objACCELERATE.x = obstacles[i].x + 600; } } obstacles.push(objACCELERATE); game.addChild(objACCELERATE); }, 500 + Math.random() * 2000); }; var isHeroGroundAttached = false; var isHeroGroundMoving = false; var collisionCounter = 0; // Initialize the collision counter var brother = function brother() { if (isHeroGroundAttached || isHeroGroundMoving) { return; } isHeroGroundAttached = true; heroGround.x = hero.x; heroGround.y = hero.y + hero.height / 2 + heroGround.height / 2; var originalX = heroGround.x; var originalY = heroGround.y; var attachInterval = LK.setInterval(function () { heroGround.x = hero.x; heroGround.y = hero.y + hero.height / 2 + heroGround.height / 2 - 125; }, 16); // Update position every frame (approximately 60 FPS) LK.setTimeout(function () { LK.clearInterval(attachInterval); heroGround.x = hero.x; heroGround.y = game.height - heroGround.height / 2 - 50; isHeroGroundAttached = false; }, 5000); // Detach after 5 seconds }; // Function to handle collision and update the counter function handleCollisionWithObj() { collisionCounter += 1; console.log("handleCollisionWithObj called, collisionCounter:", collisionCounter); if (collisionCounter >= 1) { destroyAllObjs(); isEventOngoing = true; } } function generateObjData() { LK.setTimeout(function () { for (var i = 0; i < 10; i++) { (function (index) { LK.setTimeout(function () { var objData = new ObjData(); var minX = 300; var maxX = game.width - 300; objData.x = minX + Math.random() * (maxX - minX); // Ensure ObjData objects are instantiated within the playspace with a 300-pixel boundary var minY = 300; var maxY = game.height - 300; // Ensure objData spawns within the vertical boundaries with a 300-pixel boundary objData.y = minY + Math.random() * (maxY - minY); objData.y = minY + Math.random() * (maxY - minY); objDataArray.push(objData); game.addChild(objData); // Ensure ObjData objects are instantiated on the correct layer }, index * 300); // Spread instantiation over 3 seconds })(i); } }, 1000); // Delay instantiation by 1 second } // Function to destroy all instances of ObjGO, ObjRALLY, and ObjJUMP function destroyAllObjs() { for (var i = obstacles.length - 1; i >= 0; i--) { if (obstacles[i] instanceof ObjGO || obstacles[i] instanceof ObjRALLY || obstacles[i] instanceof ObjJUMP || obstacles[i] instanceof ObjACCELERATE) { if (obstacles[i]) { var explosion = new ParticleExplosion(obstacles[i].x, obstacles[i].y); game.addChild(explosion); obstacles[i].destroy(); obstacles.splice(i, 1); } } } } var generateObjJUMP = function generateObjJUMP() { if (obstacles.filter(function (obstacle) { return obstacle instanceof ObjJUMP; }).length >= 2) { return; } // Add delay to avoid two ObjJUMP spawning on top of each other // Removed minimum delay of 60 ticks for ObjGO spawning LK.setTimeout(function () { var objJUMP = new ObjJUMP(); objJUMP.x = game.width; var minY = 300; // Top boundary var maxY = game.height / 2; // Adjusted bottom boundary to avoid spawning near the bottom of the playspace objJUMP.y = minY + Math.random() * (maxY - minY); // Ensure objJUMP does not spawn too close to other objects for (var i = 0; i < obstacles.length; i++) { if (Math.abs(obstacles[i].x - objJUMP.x) < 600) { objJUMP.x = obstacles[i].x + 600; } } obstacles.push(objJUMP); game.addChild(objJUMP); }, 500 + Math.random() * 2000); }; function startBootSequence() { var bootTexts = ['Work together to...', 'clear events and...', 'reach the furthest distance...']; var currentBootTextIndex = 0; var bootTextY = game.height / 2 - 250; var displayBootText = function displayBootText() { var bootText = new BootText(bootTexts[currentBootTextIndex]); bootText.x = game.width / 2 + 50; bootText.y = bootTextY + currentBootTextIndex * 150; game.addChild(bootText); var fadeInInterval = LK.setInterval(function () { bootText.fadeIn(); if (bootText.alpha === 1) { LK.setTimeout(function () { bootText.fadeOut(); LK.setTimeout(function () { var help2 = LK.getAsset('obj_help2', { anchorX: 0.5, anchorY: 0.5 }); help2.x = game.width / 2; help2.y = game.height / 2 - 100; game.addChild(help2); var help = LK.getAsset('obj_help1', { anchorX: 0.5, anchorY: 0.5 }); help.x = game.width / 2; help.y = game.height / 2 + 100; game.addChild(help); LK.setTimeout(function () { help2.destroy(); help.destroy(); }, 8000); }, 3000); }, 300); } }, 60); bootText.on('destroy', function () { LK.clearInterval(fadeInInterval); }); currentBootTextIndex++; if (currentBootTextIndex < bootTexts.length) { LK.setTimeout(displayBootText, 1000); } else { // Instantiate help2 and help after boottext } }; displayBootText(); } var eventTxt = null; activeMovingSpeechBubble = null, enemies = [], obstacles = [], parallax = null, score = 0, distanceTraveled = 0, distanceTraveledIncrement = 1 / 60, isGameOver = false, gameStarted = false; var generateObstacle = function generateObstacle() { if (obstacles.filter(function (obstacle) { return obstacle instanceof Obstacle; }).length >= 1) { return; } // Add delay to avoid two Obstacle spawning on top of each other // Removed minimum delay of 60 ticks for ObjRALLY spawning LK.setTimeout(function () { var obstacle = new Obstacle(); obstacle.x = game.width; var minY = 400; // Minimum Y position var maxY = game.height / 2 + 200; // Maximum Y position if (hero.x >= 0 && hero.x <= game.width) { var heroYMin = Math.max(hero.y - hero.height / 2, minY); // Ensure obstacle spawns within the top boundary of the hero var heroYMax = Math.min(hero.y + hero.height / 2, maxY); // Ensure obstacle spawns within the bottom boundary of the hero var randomOffset = (Math.random() - 0.5) * hero.height * 2; // Augmented random offset within 2 times the hero's height obstacle.y = hero.y + randomOffset; // Ensure obstacle stays within the game boundaries var obstacleHalfHeight = obstacle.height / 2; obstacle.y = Math.max(obstacleHalfHeight, Math.min(game.height - obstacleHalfHeight, obstacle.y)); } else { obstacle.y = minY + Math.random() * (maxY - minY); // Spawn obstacle anywhere within the boundaries if hero is off screen } obstacles.push(obstacle); game.addChild(obstacle); }, 500 + Math.random() * 2000); }; var generateObjGO = function generateObjGO() { if (obstacles.filter(function (obstacle) { return obstacle instanceof ObjGO; }).length >= 1) { return; } // Add delay to avoid two ObjGO spawning on top of each other // Removed minimum delay of 60 ticks for ObjJUMP spawning LK.setTimeout(function () { var objGO = new ObjGO(); objGO.x = game.width; var minY = 300; // Top boundary var maxY = game.height / 2; // Adjusted bottom boundary to avoid spawning near the bottom of the playspace objGO.y = minY + Math.random() * (maxY - minY); // Ensure objGO does not spawn too close to other objects for (var i = 0; i < obstacles.length; i++) { if (Math.abs(obstacles[i].x - objGO.x) < 600) { objGO.x = obstacles[i].x + 600; } } obstacles.push(objGO); game.addChild(objGO); }, 500 + Math.random() * 2000); }; var generateObjRALLY = function generateObjRALLY() { if (obstacles.filter(function (obstacle) { return obstacle instanceof ObjRALLY; }).length >= 1) { return; } // Add delay to avoid two ObjRALLY spawning on top of each other if (obstacles.length > 0) { var lastObstacle = obstacles[obstacles.length - 1]; if (LK.ticks - lastObstacle.spawnTime < 60) { return; } } LK.setTimeout(function () { var objRALLY = new ObjRALLY(); objRALLY.x = game.width; var minY = 300; // Top boundary var maxY = game.height / 2; // Adjusted bottom boundary to avoid spawning near the bottom of the playspace objRALLY.y = minY + Math.random() * (maxY - minY); // Ensure objRALLY does not spawn too close to other objects for (var i = 0; i < obstacles.length; i++) { if (Math.abs(obstacles[i].x - objRALLY.x) < 600) { objRALLY.x = obstacles[i].x + 600; } } obstacles.push(objRALLY); game.addChild(objRALLY); }, 500 + Math.random() * 2000); }; var obstacleGenerationInterval; function startObstacleGeneration() { obstacleGenerationInterval = LK.setInterval(generateObstacle, 2000); var objGOGenerationInterval = LK.setInterval(generateObjGO, 1500); var objRALLYGenerationInterval = LK.setInterval(generateObjRALLY, 2000); var objACCELERATEGenerationInterval = LK.setInterval(generateObjACCELERATE, 8000); var objJUMPGenerationInterval = LK.setInterval(generateObjJUMP, 2000); var objEventsGenerationInterval = LK.setInterval(generateObjEvents, 10000); LK.on('gameOver', function () { LK.clearInterval(collectTimerInterval); game.removeChild(collectTimerTxt); LK.clearInterval(catchTimerInterval); game.removeChild(catchTimerTxt); LK.clearInterval(objJUMPGenerationInterval); LK.clearInterval(obstacleGenerationInterval); LK.clearInterval(objGOGenerationInterval); LK.clearInterval(objRALLYGenerationInterval); LK.clearInterval(objJUMPGenerationInterval); LK.clearInterval(objACCELERATEGenerationInterval); LK.clearInterval(objEventsGenerationInterval); LK.clearInterval(objSPIKEYGenerationInterval); isEventOngoing = false; }); } parallax = game.addChild(new Parallax()); var originalParallaxSpeed = parallax.speed; var parallaxSpeedIncrement = 0.05; // Speed increment per second var parallaxSpeedUpdateInterval = 500; // Update interval in milliseconds LK.setInterval(function () { parallax.speed -= parallaxSpeedIncrement; }, parallaxSpeedUpdateInterval); var distanceTxt; function initializeScoreDisplay() { // Remove BootText from the screen var bootTexts = game.children.filter(function (child) { return child instanceof BootText; }); for (var i = 0; i < bootTexts.length; i++) { bootTexts[i].destroy(); } // Initialize score display distanceTxt = new Text2('Distance: 0', { size: 75, fill: "#ffffff", stroke: "#ffffff", strokeThickness: 2, fontWeight: 'bolder' // Make the text bolder }); distanceTxt.anchor.set(0.5, 0); distanceTxt.x = game.width / 2; // Center the distance text horizontally game.addChild(distanceTxt); // Add event text display in the upper right corner eventTxt = new Text2('Event: None', { size: 75, fill: "#ffffff", stroke: "#ffffff", strokeThickness: 2, fontWeight: 'bolder' // Make the text bolder }); eventTxt.anchor.set(1, 0); // Anchor to the top right corner eventTxt.x = game.width - 50; // Position it 50 pixels from the right edge eventTxt.y = distanceTxt.y; // Align it with the distance text game.addChild(eventTxt); } hero = game.addChild(new Hero()); var heroGround = game.addChild(new Hero_Ground()); var objGroundTrail = LK.getAsset('objGroundTrail', { anchorX: 0.5, anchorY: 0.5 }); heroGround.addChildAt(objGroundTrail, 0); objGroundTrail.rotation = -Math.PI / 4; // Rotate 45 degrees to the left objGroundTrail.x = heroGround.width / 2 - 200; objGroundTrail.y = heroGround.height / 2 - 125; // Add shake effect to objGroundTrail var shakeAmplitude = 5; // Amplitude of the shake var shakeDuration = 100; // Duration of each shake in milliseconds var originalX = objGroundTrail.x; var originalY = objGroundTrail.y; var shakeInterval = LK.setInterval(function () { objGroundTrail.x = originalX + (Math.random() - 0.5) * shakeAmplitude; objGroundTrail.y = originalY + (Math.random() - 0.5) * shakeAmplitude; }, shakeDuration); heroGround.idleSpeechBubble = LK.getAsset('idleSpeechBubble', { anchorX: 0.5, anchorY: 0.5 }); heroGround.addChild(heroGround.idleSpeechBubble); heroGround.idleSpeechBubble.x = heroGround.width / 2 + 20; heroGround.idleSpeechBubble.y = -heroGround.idleSpeechBubble.height / 2 - 125; heroGround.initialX = hero.x + 175; heroGround.x = -heroGround.width; heroGround.y = game.height - heroGround.height / 2 - 50; hero.x = -100; hero.y = -100; startBootSequence(); // Instantiate help2 and help when the game starts var help2 = LK.getAsset('obj_help2', { anchorX: 0.5, anchorY: 0.5 }); help2.x = game.width / 2 - 350; help2.y = game.height / 2 + 700; game.addChild(help2); var help = LK.getAsset('obj_help1', { anchorX: 0.5, anchorY: 0.5 }); help.x = game.width / 2 + 450; help.y = game.height / 2 + 700; game.addChild(help); LK.setTimeout(function () { help2.destroy(); help.destroy(); }, 5375); LK.playMusic('SynthwaveMusic', { loop: true }); LK.setTimeout(function () { heroGround.moveToInitialPosition(); }, 3000); // Start animation after 3 seconds // Play snd_announcer sound 5 second after the game starts LK.setTimeout(function () { LK.getSound('snd_announcer').play(); }, 5000); LK.on('tick', function () { if (!gameStarted) { hero.animateToPosition(); return; // Skip the rest of the game logic until the animation is complete } parallax._move_migrated(); // Ensure objwindup update method is called every tick if (objWindup && typeof objWindup.update === 'function') { objWindup.update(); } if (objLaser && typeof objLaser.update === 'function') { objLaser.update(); } parallaxCity._move_migrated(); if (hero.visible) { hero._move_migrated(); } else if (heroGround.visible) { heroGround._move_migrated(); } for (var i = 0; i < enemies.length; i++) { enemies[i]._move_migrated(); } for (var i = obstacles.length - 1; i >= 0; i--) { if (obstacles[i] && typeof obstacles[i]._move_migrated === 'function') { obstacles[i]._move_migrated(); } if (obstacles[i] instanceof ObjDrone || obstacles[i] instanceof ObjCar) { obstacles[i].update(); } if (obstacles[i] instanceof ObjEvents && heroGround.intersects(obstacles[i])) { console.log("heroGround intersected with ObjEvents at position:", { x: obstacles[i].x, y: obstacles[i].y }); var explosion = new ParticleExplosion(obstacles[i].x, obstacles[i].y); game.addChild(explosion); LK.getSound('snd_walkie').play(); // Play snd_walkie sound obstacles[i].destroy(); obstacles.splice(i, 1); handleCollisionWithObj(); // Ensure event text is displayed var events = distanceTraveled <= 200 ? ['Avoid', 'Collect'] : ['Catch', 'Survive']; //set the random event randomEvent = "Survive"; //randomEvent = events[Math.floor(Math.random() * events.length)]; //set the event text once an event type has been selected. eventTxt.setText('Event: ' + randomEvent); console.log("Random event selected:", randomEvent); if (randomEvent === 'Collect') { collectTimer = 20; var checkObjDataActive = LK.setInterval(function () { if (objDataArray.length > 0) { collectTimerTxt.setText(collectTimer.toString()); game.addChild(collectTimerTxt); collectTimerInterval = LK.setInterval(function () { collectTimer -= 0.1; collectTimerTxt.setText(collectTimer.toFixed(1).toString()); if (collectTimer <= 0) { LK.clearInterval(collectTimerInterval); LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } }, 100); LK.clearInterval(checkObjDataActive); } }, 100); // Add text that says "Collect the data before the time runs out!" var objCollectSign = LK.getAsset('objcollectsign', { anchorX: 0.5, anchorY: 0.5 }); objCollectSign.x = game.width / 2; objCollectSign.y = game.height / 2; // Center the sign vertically objCollectSign.alpha = 0; // Start with alpha 0 for fade in effect game.addChild(objCollectSign); // Fade in effect var fadeInInterval = LK.setInterval(function () { objCollectSign.alpha += 0.05; if (objCollectSign.alpha >= 1) { LK.clearInterval(fadeInInterval); // Start fade out effect after 2 seconds LK.setTimeout(function () { var fadeOutInterval = LK.setInterval(function () { objCollectSign.alpha -= 0.05; if (objCollectSign.alpha <= 0) { LK.clearInterval(fadeOutInterval); objCollectSign.destroy(); generateObjData(); // Start spawning objdata after fade out } }, 60); }, 2000); } }, 60); var checkObjDataActiveForCounter = LK.setInterval(function () { if (objDataArray.length > 0) { game.addChild(collectCounterTxt); LK.clearInterval(checkObjDataActiveForCounter); } }, 100); } else if (randomEvent === 'Avoid') { // Instantiate objcarsign in the center of the playspace var objCarSign = LK.getAsset('objcarsign', { anchorX: 0.5, anchorY: 0.5 }); objCarSign.x = game.width / 2; objCarSign.y = game.height / 2; objCarSign.alpha = 0; // Start with alpha 0 for fade in effect game.addChild(objCarSign); // Fade in effect var fadeInInterval = LK.setInterval(function () { objCarSign.alpha += 0.05; if (objCarSign.alpha >= 1) { LK.clearInterval(fadeInInterval); // Start fade out effect after 2 seconds LK.setTimeout(function () { var fadeOutInterval = LK.setInterval(function () { objCarSign.alpha -= 0.05; if (objCarSign.alpha <= 0) { LK.clearInterval(fadeOutInterval); objCarSign.destroy(); // Randomly select a position for objheadlights var positions = [{ x: game.width - 100, y: 800 }, // Upper right { x: game.width - 100, y: game.height - 400 } // Bottom right ]; var randomPosition = positions[Math.floor(Math.random() * positions.length)]; // Instantiate objheadlights at the selected position var objHeadlights = LK.getAsset('objheadlights', { anchorX: 0.5, anchorY: 0.5 }); objHeadlights.x = randomPosition.x; objHeadlights.y = randomPosition.y; objHeadlights.alpha = 0; // Start with alpha 0 for fade in effect game.addChild(objHeadlights); // Fade in effect var fadeInInterval = LK.setInterval(function () { objHeadlights.alpha += 0.05; if (objHeadlights.alpha >= 1) { LK.clearInterval(fadeInInterval); // Start fade out effect after 2 seconds LK.setTimeout(function () { var fadeOutInterval = LK.setInterval(function () { objHeadlights.alpha -= 0.05; if (objHeadlights.alpha <= 0) { LK.clearInterval(fadeOutInterval); objHeadlights.destroy(); // Instantiate objcar at the same position as objheadlights var objCar = new ObjCar(); objCar.x = objHeadlights.x; objCar.y = objHeadlights.y; game.addChild(objCar); } }, 60); // Approximately 16.67 FPS }, 2000); } }, 60); // Approximately 16.67 FPS } }, 60); // Approximately 16.67 FPS }, 2000); } }, 60); // Approximately 16.67 FPS } //catch event else if (randomEvent === 'Catch') { // Instantiate the banner in the center of the playspace var objCatch = LK.getAsset('objCatch', { anchorX: 0.5, anchorY: 0.5 }); objCatch.x = game.width / 2; objCatch.y = game.height / 2; objCatch.alpha = 0; // Start with alpha 0 for fade in effect game.addChild(objCatch); // Fade in effect var fadeInInterval = LK.setInterval(function () { objCatch.alpha += 0.05; if (objCatch.alpha >= 1) { LK.clearInterval(fadeInInterval); // Start fade out effect after 2 seconds LK.setTimeout(function () { var fadeOutInterval = LK.setInterval(function () { objCatch.alpha -= 0.05; if (objCatch.alpha <= 0) { LK.clearInterval(fadeOutInterval); objCatch.destroy(); } }, 50); // Approximately 20 FPS }, 2000); } }, 50); // Approximately 20 FPS //set the timer catchTimer = 15.0; catchTimerTxt.setText(catchTimer.toString()); game.addChild(catchTimerTxt); LK.setTimeout(function () { catchTimerInterval = LK.setInterval(function () { catchTimer -= 0.1; catchTimerTxt.setText(catchTimer.toFixed(1).toString()); if (catchTimer <= 0) { LK.clearInterval(catchTimerInterval); LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } }, 100); }, 2000); // Start countdown after 2 seconds (fade out duration) //instantiate the drone LK.setTimeout(function () { // Spawn objdrone anywhere on the right portion of the screen var objDrone = new ObjDrone(); objDrone.x = game.width - Math.random() * (game.width / 4); objDrone.y = Math.random() * game.height; game.addChild(objDrone); }, 2000); // Start spawning objdrone after 2 seconds (fade out duration) } else if (randomEvent === 'Survive') { // Instantiate objsurvivesign in the center of the playspace var objSurviveSign = LK.getAsset('objsurvivesign', { anchorX: 0.5, anchorY: 0.5 }); objSurviveSign.x = game.width / 2; objSurviveSign.y = game.height / 2; objSurviveSign.alpha = 0; // Start with alpha 0 for fade in effect game.addChild(objSurviveSign); // Fade in effect var fadeInInterval = LK.setInterval(function () { objSurviveSign.alpha += 0.05; if (objSurviveSign.alpha >= 1) { LK.clearInterval(fadeInInterval); // Start fade out effect after 2 seconds LK.setTimeout(function () { var fadeOutInterval = LK.setInterval(function () { objSurviveSign.alpha -= 0.05; if (objSurviveSign.alpha <= 0) { LK.clearInterval(fadeOutInterval); objSurviveSign.destroy(); // Spawn EnemyMiddleRight after objSurviveSign fades out if (enemySpawnedCount === 0) { enemyMiddleRight = new EnemyMiddleRight(); } var enemies = [enemyMiddleRight]; var selectedEnemies = [enemies[enemySpawnedCount % enemies.length]]; selectedEnemies.forEach(function (enemy) { game.addChild(enemy); enemy.animate(); }); enemySpawnedCount += selectedEnemies.length; LK.setTimeout(function () { selectedEnemies.forEach(function (enemy) { enemy.destroy(); }); if (enemySpawnedCount >= enemies.length) { enemySpawnedCount = 0; // Reset the count to restart the sequence } }, 30000); // Destroy the enemies after 30 seconds } }, 60); }, 2000); } }, 60); } //here add the other event settings } for (var j = objDataArray.length - 1; j >= 0; j--) { if (objDataArray[j] && typeof objDataArray[j]._move_migrated === 'function') { objDataArray[j]._move_migrated(); } if (hero.intersects(objDataArray[j]) || heroGround.intersects(objDataArray[j])) { objDataCounter += 1; console.log("ObjData collected, objDataCounter:", objDataCounter); collectCounterTxt.setText(objDataCounter.toString() + "/10"); LK.getSound('snd_dataacquire').play(); // Play snd_dataacquire sound objDataArray[j].destroy(); objDataArray.splice(j, 1); if (objDataCounter >= 10) { LK.clearInterval(collectTimerInterval); game.removeChild(collectTimerTxt); console.log("Collect event completed"); isEventOngoing = false; objDataCounter = 0; collectCounterTxt.setText(objDataCounter.toString() + "/10"); game.removeChild(collectCounterTxt); eventTxt.setText('Event: None'); randomEvent = ""; distanceTraveled += 100; // Add 100 to the distance // Trigger acceleration effects LK.getSound('snd_powerup').play(); // Play snd_powerup sound LK.getSound('snd_nice').play(); // Play snd_nice sound destroyAllObjs(); // Destroy all instances of ObjGO, ObjRALLY, and ObjJUMP // Temporarily increase distanceTraveled increment var originalIncrement = 1 / 60; var acceleratedIncrement = 1 / 15; distanceTraveledIncrement = acceleratedIncrement; // Temporarily increase parallax speed var originalParallaxSpeed = parallax.speed; parallax.speed *= 5; // Add screen shake and flash effect var shakeAmplitude = 10; var shakeDuration = 100; var originalX = game.x; var originalY = game.y; var shakeInterval = LK.setInterval(function () { game.x = originalX + (Math.random() - 0.5) * shakeAmplitude; game.y = originalY + (Math.random() - 0.5) * shakeAmplitude; }, shakeDuration); LK.effects.flashScreen(0xffffff, 5000); // Flash screen for 5 seconds // Instantiate objrush in the center of the playspace for 3 seconds with fade in and fade out effect var objRush = LK.getAsset('objRush', { anchorX: 0.5, anchorY: 0.5 }); objRush.x = game.width / 2; objRush.y = game.height / 2; objRush.alpha = 0; // Start with alpha 0 for fade in effect game.addChild(objRush); // Fade in effect var fadeInInterval = LK.setInterval(function () { objRush.alpha += 0.05; if (objRush.alpha >= 1) { LK.clearInterval(fadeInInterval); // Start fade out effect after 3 seconds LK.setTimeout(function () { var fadeOutInterval = LK.setInterval(function () { objRush.alpha -= 0.05; if (objRush.alpha <= 0) { LK.clearInterval(fadeOutInterval); objRush.destroy(); } }, 50); // Approximately 20 FPS }, 3000); } }, 50); // Approximately 20 FPS LK.setTimeout(function () { distanceTraveledIncrement = originalIncrement; parallax.speed = originalParallaxSpeed; LK.clearInterval(shakeInterval); game.x = originalX; game.y = originalY; }, 5000); // Reset to normal after 5 seconds } } } } var particles = game.children.filter(function (child) { return child instanceof Particle; }); for (var i = 0; i < particles.length; i++) { if (particles[i] instanceof ParticleExplosion) { particles[i].update(); } else { particles[i].fadeOut(); } } if (!isGameOver) { distanceTraveled += distanceTraveledIncrement; distanceTxt.setText('Distance: ' + Math.floor(distanceTraveled).toString()); } if (isGameOver) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } }); game.on('down', function (x, y, obj) { if (hero.visible) { hero.flipGravity(); hero.onHold(); } }); game.on('up', function (x, y, obj) { hero.onRelease(); }); Hero_Ground.prototype.moveToInitialPosition = function () { if (this.isMovingToInitial) { return; } // Prevent multiple calls this.isMovingToInitial = true; // Set flag to indicate movement in progress // Set initial position outside the play space this.x = -this.width; this.y = game.height - this.height / 2 - 100; var targetX = hero.x + 175; var interpolationSpeed = hero.speed; // Match hero's speed this.interpolationInterval = LK.setInterval(function () { if (Math.abs(this.x - targetX) < interpolationSpeed) { this.x = targetX; LK.clearInterval(this.interpolationInterval); this.isMovingToInitial = false; // Reset flag when movement is complete // Replace movingSpeechBubble with idleSpeechBubble if (this.movingSpeechBubble) { this.movingSpeechBubble.destroy(); this.movingSpeechBubble = null; } this.idleSpeechBubble = LK.getAsset('idleSpeechBubble', { anchorX: 0.5, anchorY: 0.5 }); this.addChild(this.idleSpeechBubble); this.idleSpeechBubble.x = this.width / 2 - 20; this.idleSpeechBubble.y = -this.idleSpeechBubble.height / 2 - 125; } else { this.x += this.x < targetX ? interpolationSpeed : -interpolationSpeed; } }.bind(this), 16); // Approximately 60 FPS // Replace idleSpeechBubble with movingSpeechBubble if (this.idleSpeechBubble) { this.idleSpeechBubble.destroy(); this.idleSpeechBubble = null; } // Ensure only one moving speech bubble is active at a time if (game.activeMovingSpeechBubble) { game.activeMovingSpeechBubble.destroy(); } this.movingSpeechBubble = LK.getAsset('movingSpeechBubble', { anchorX: 0.5, anchorY: 0.5 }); this.addChild(this.movingSpeechBubble); this.movingSpeechBubble.x = this.width / 2 + 10; this.movingSpeechBubble.y = -this.movingSpeechBubble.height / 2 - 125; game.activeMovingSpeechBubble = this.movingSpeechBubble; }; var animationSpeed = 2; // Define animationSpeed in the global scope var enemyMiddleRight; var enemySpawnedCount = 0; function selectAndAnimateEnemy() { if (eventTxt && eventTxt.text && eventTxt.text.includes('Survive')) { if (enemySpawnedCount === 0) { enemyMiddleRight = new EnemyMiddleRight(); } var enemies = [enemyMiddleRight]; var selectedEnemies = [enemies[enemySpawnedCount % enemies.length]]; selectedEnemies.forEach(function (enemy) { game.addChild(enemy); enemy.animate(); }); enemySpawnedCount += selectedEnemies.length; LK.setTimeout(function () { selectedEnemies.forEach(function (enemy) { enemy.destroy(); }); if (enemySpawnedCount >= enemies.length) { enemySpawnedCount = 0; // Reset the count to restart the sequence } }, 30000); // Destroy the enemies after 30 seconds } } LK.setInterval(selectAndAnimateEnemy, 15000); var parallaxCity = game.addChildAt(new ParallaxCity(), 0); var generateObjSPIKEY = function generateObjSPIKEY() { if (obstacles.filter(function (obstacle) { return obstacle instanceof ObjSPIKEY; }).length >= 1) { return; } LK.setTimeout(function () { var objSPIKEY = new ObjSPIKEY(); objSPIKEY.x = game.width; var spawnChance = Math.random(); if (spawnChance < 0.75) { // 75% chance to spawn on the y and x Axis of hero, but outside the playspace objSPIKEY.x = game.width + objSPIKEY.width; objSPIKEY.y = hero.y; } else { // 25% chance to spawn on hero ground, but outside the playspace objSPIKEY.x = game.width + objSPIKEY.width; objSPIKEY.y = heroGround.y; } // Ensure objSPIKEY does not spawn too close to other objects for (var i = 0; i < obstacles.length; i++) { if (Math.abs(obstacles[i].x - objSPIKEY.x) < 600) { objSPIKEY.x = obstacles[i].x + 600; } if (Math.abs(obstacles[i].y - objSPIKEY.y) < 600) { objSPIKEY.y = Math.random() < 0.5 ? obstacles[i].y - 600 : obstacles[i].y + 600; } } obstacles.push(objSPIKEY); game.addChild(objSPIKEY); }, 500 + Math.random() * 2000); }; ObjDrone.prototype.update = function () { // Check for collision with hero or heroGround if (this.intersects(hero) || this.intersects(heroGround)) { this.destroy(); catchTimer = 15.0; LK.clearInterval(catchTimerInterval); game.removeChild(catchTimerTxt); isEventOngoing = false; eventTxt.setText('Event: None'); randomEvent = ""; distanceTraveled += 100; LK.getSound('snd_powerup').play(); LK.getSound('snd_nice').play(); destroyAllObjs(); var originalIncrement = 1 / 60; var acceleratedIncrement = 1 / 15; distanceTraveledIncrement = acceleratedIncrement; var originalParallaxSpeed = parallax.speed; parallax.speed *= 5; var shakeAmplitude = 10; var shakeDuration = 100; var originalX = game.x; var originalY = game.y; var shakeInterval = LK.setInterval(function () { game.x = originalX + (Math.random() - 0.5) * shakeAmplitude; game.y = originalY + (Math.random() - 0.5) * shakeAmplitude; }, shakeDuration); LK.effects.flashScreen(0xffffff, 5000); var objRush = LK.getAsset('objRush', { anchorX: 0.5, anchorY: 0.5 }); objRush.x = game.width / 2; objRush.y = game.height / 2; objRush.alpha = 0; game.addChild(objRush); var fadeInInterval = LK.setInterval(function () { objRush.alpha += 0.05; if (objRush.alpha >= 1) { LK.clearInterval(fadeInInterval); LK.setTimeout(function () { var fadeOutInterval = LK.setInterval(function () { objRush.alpha -= 0.05; if (objRush.alpha <= 0) { LK.clearInterval(fadeOutInterval); objRush.destroy(); } }, 50); }, 3000); } }, 50); LK.setTimeout(function () { distanceTraveledIncrement = originalIncrement; parallax.speed = originalParallaxSpeed; LK.clearInterval(shakeInterval); game.x = originalX; game.y = originalY; }, 5000); } };
===================================================================
--- original.js
+++ change.js
@@ -952,8 +952,9 @@
});
collisionGraphics.width = 50; // Adjust the width to further reduce collision size
collisionGraphics.height = 50; // Adjust the height to further reduce collision size
collisionGraphics.alpha = 1; // Ensure collision object is always visible
+ collisionGraphics.tint = 0x4B0082; // Set collision object color to dark purple
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
2d cyberpunk particle of a dash ability. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
blue jetfuel. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art speech bubble that says "?" neon color. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art speech bubble that says "Go" neon color. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art speech bubble that says "Ok" neon color.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a bubble a wing inside in neon color.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art bubble with 2 fast foward arrows neon color. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Gray Cyber neon lit logo of the word Rush. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
side profile of a flying car in the art style of a 16 bit neon cyberpunk game. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
retro cyberpunk datadisk in neon colors. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
retro cyberpunk pole flag in neon colors with the words 'events' on it.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
retro sign that says "Hold to Dash" in neon colors. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
retro sign that says "Tap to Move" in neon colors.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
retro sign that says "catch" with an flying drone symbol in neon colors.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
retro flying drone in neon colors.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
retro sign that says "Survive" with an face symbol in neon colors... Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
neon colored cyberpunk round electricity. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
SynthwaveMusic
Music
snd_letsgo
Sound effect
snd_announcer
Sound effect
snd_powerup
Sound effect
snd_dataacquire
Sound effect
snd_walkie
Sound effect
snd_nice
Sound effect
snd_carhonk
Sound effect
snd_enemy
Sound effect
snd_sphere
Sound effect
snd_windup
Sound effect
snd_spikey
Sound effect
snd_drone
Sound effect