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
});
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
});
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._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);
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 = 0; // Set alpha to 0
});
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);
}
};
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