User prompt
Signals cannot cover other signals
User prompt
Avoid signals overlap in display
User prompt
Change signal colors to laser shine ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Add president asset to the game. Add it to the memecoins class in the game logic and in the map
User prompt
Add cat asset to the game. Add it to the memecoins class in the game logic and in the map
User prompt
Add volt asset to the game. Add it to the memecoins class in the game logic and in the map
User prompt
Add loki asset to the game. Add it to the memecoins class in the game logic and in the map
User prompt
Add Pepe asset to the game. Add it to the memecoins class in the game logic and in the map
User prompt
Increase distance between memecoins
User prompt
Make bigger distance between memecoins load
User prompt
When the player picks up the closest coin, the one behind her also disappears. Fix it
User prompt
When the player picks up the closest coin, the one behind her also disappears.
User prompt
The level difference between the signals is too large.
User prompt
each coin type appears once during a round and then the round starts again
User prompt
reverse the spin of the coins to the other direction
User prompt
Add Shib asset to the game. Add it to the memecoins class in the game logic and in the map
User prompt
Add dogmeme asset to the game. Add it to the memecoins class in the game logic and in the map
User prompt
Add more types of memecoin assets to the memecoin class
User prompt
Change signals long more diversify
User prompt
Ensure every signal line should be vertical.
User prompt
Change signals long a little bit more diversify
User prompt
Change signals long a little bit more diversify
User prompt
Add more types of memecoins to the memecoin class
User prompt
Ensure signals cannot overlaps player in the display order
User prompt
The distance between greensignals and redsignals in height is too much!!!
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Memecoin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('memecoin', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.active = true; self.collected = false; self.update = function () { if (!self.active) { return; } self.x -= self.speed; // Rotate coin coinGraphics.rotation += 0.03; // Remove when off screen if (self.x < -100) { self.active = false; } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.gravity = 0.5; self.jumpPower = -25; // Increased jump power from -15 to -25 self.isJumping = false; self.isDead = false; self.lastWasIntersecting = false; self.jump = function () { // Find if player is standing on a green signal var standingOnGreenSignal = signals.some(function (s) { return player && s.type === 'green' && player.intersects(s) && Math.abs(player.y - (s.y - 275)) < 10; }); if (!self.isDead && (self.vy === 0 || standingOnGreenSignal)) { self.vy = self.jumpPower; self.isJumping = true; LK.getSound('jump').play(); } }; self.update = function () { if (self.isDead) { return; } // Store last position for collision detection self.lastY = self.y; // Apply gravity self.vy += self.gravity; // Apply movement self.y += self.vy; // Track if player is jumping or falling self.isJumping = self.vy !== 0; // Ground collision detection if (self.y > 2732 - playerGraphics.height / 2) { // Bottom of screen self.y = 2732 - playerGraphics.height / 2; self.vy = 0; self.isJumping = false; } }; return self; }); var Shark = Container.expand(function () { var self = Container.call(this); var sharkGraphics = self.attachAsset('shark', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.direction = 1; self.centerY = 2732 - sharkGraphics.height / 2; self.update = function () { // Keep shark at constant y position self.y = self.centerY; // Check if player exists and has fallen to shark's height level if (player && player.y > 2732 - 350) { // Shark hunts player - move toward player position self.direction = player.x > self.x ? 1 : -1; self.speed = 8; // Increase speed when hunting // Set correct shark orientation based on direction sharkGraphics.scale.x = self.direction; } else { // Normal back-and-forth movement when player isn't at shark level self.speed = 5; // Check if shark reached boundaries and change direction if (self.x > 1800 && self.direction === 1) { self.direction = -1; sharkGraphics.scale.x = -1; } else if (self.x < 200 && self.direction === -1) { self.direction = 1; sharkGraphics.scale.x = 1; } } // Apply movement self.x += self.speed * self.direction; }; return self; }); var Signal = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'green'; var assetId = self.type === 'green' ? 'greenSignal' : 'redSignal'; var signalGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5, scaleX: 1 / 1.2, scaleY: 1 / 1.2 }); // Rotate signal by 90 degrees to the left signalGraphics.rotation = -Math.PI / 2; // -90 degrees in radians self.speed = 3.5; self.active = true; self.update = function () { if (!self.active) { return; } self.x -= self.speed; // Remove when off screen only if player is not jumping/falling // Make sure we keep signals visible while player is falling if (self.x < -200) { // Only deactivate if player doesn't exist or if player is not jumping/falling if (!player || !player.isJumping && player.vy <= 0) { self.active = false; } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x00142A }); /**** * Game Code ****/ // Game variables var player; var signals = []; var memecoins = []; var shark; var isGameActive = true; var gameSpeed = 1; var lastSignalTime = 0; var lastCoinTime = 0; var score = 0; var scoreIncrement = 0.1; var distanceTraveled = 0; // UI elements var scoreTxt; var highScoreTxt; // Initialize UI function initUI() { // Score text scoreTxt = new Text2('SCORE: 0', { size: 70, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); scoreTxt.y = 0; // High score text var highScore = storage.highScore || 0; highScoreTxt = new Text2('HIGH SCORE: ' + Math.floor(highScore), { size: 50, fill: 0xFFD700 }); highScoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(highScoreTxt); highScoreTxt.y = 80; } // Initialize game world function initGame() { isGameActive = true; score = 0; distanceTraveled = 0; gameSpeed = 1; // Create player at top left, ready to fall player = new Player(); player.x = 200; player.y = 100; player.vy = 5; // Start with downward velocity game.addChild(player); // Create shark shark = new Shark(); shark.y = 2732 - 100; game.addChild(shark); // Clear signals and coins clearEntities(); // Create initial signals that have already reached the left side var recentHeights = []; var heightThreshold = 60; // Increased threshold to better detect potential overlaps for (var i = 0; i < 44; i++) { var signalType = Math.random() < 0.5 ? 'green' : 'red'; // For signals that are lower than the previous, make them red // For signals that are higher than the previous, make them green var lastY = 1500; if (signals.length > 0) { lastY = signals[signals.length - 1].y; } var newY; var willBeHigher = Math.random() < 0.5; if (willBeHigher) { // More gradual ascent with varied height differences var heightDiff = 100 + Math.random() * 150; newY = lastY - heightDiff; signalType = 'green'; } else { // More gradual descent with varied height differences var heightDiff = 100 + Math.random() * 150; newY = lastY + heightDiff; signalType = 'red'; } // Check if this height is too similar to recent heights var isTooSimilar = recentHeights.length > 0 && recentHeights.some(function (height) { return Math.abs(newY - height) < heightThreshold; }); // If too similar, adjust the height to avoid repetition if (isTooSimilar) { if (signalType === 'green') { newY -= 100 + Math.random() * 80; // Increased offset for better separation } else { newY += 100 + Math.random() * 80; // Increased offset for better separation } } // Ensure signal stays within playable area newY = Math.max(800, Math.min(2200, newY)); // Store this height for future comparison recentHeights.push(newY); if (recentHeights.length > 10) { recentHeights.shift(); // Keep only last 10 heights } var signal = new Signal(signalType); // Position signals already at the left side of the screen signal.x = -150 + i * 50; // Distribute signals across the left edge signal.y = newY; signals.push(signal); // Make sure signals are placed behind the player if (player) { var playerIndex = game.getChildIndex(player); game.addChildAt(signal, playerIndex); } else { game.addChild(signal); } } // Start game music LK.playMusic('gameMusic'); } // Clear all entities function clearEntities() { for (var i = signals.length - 1; i >= 0; i--) { signals[i].destroy(); signals.splice(i, 1); } for (var i = memecoins.length - 1; i >= 0; i--) { memecoins[i].destroy(); memecoins.splice(i, 1); } } // Spawn signals function spawnSignal() { var currentTime = Date.now(); // Spawn signals at intervals that maintain consistent spacing regardless of score // At higher scores (1000+), we need to keep a minimum time between signals var baseInterval = 300; var minInterval = 150; var adjustedInterval = score > 1000 ? Math.max(minInterval, baseInterval / gameSpeed) : baseInterval / gameSpeed; if (currentTime - lastSignalTime > adjustedInterval) { // This ensures spacing remains consistent even at high scores var signal; var lastSignalY = 1500; // Default Y position if no signals exist // Get the Y position of the last signal to compare with if (signals.length > 0) { var lastSignal = signals[signals.length - 1]; lastSignalY = lastSignal.y; } // Calculate a new Y position var newY; var willBeHigher = Math.random() < 0.5; // 50% chance to go higher // Count consecutive red signals var redSignalCount = 0; // Find the last signal of each type for height comparison var lastGreenY = null; var lastRedY = null; // Track recent signal heights to prevent repetition var recentHeights = []; var heightThreshold = 60; // Increased threshold to detect potential overlaps better // Collect the last few signal heights for comparison for (var i = signals.length - 1; i >= Math.max(0, signals.length - 15); i--) { recentHeights.push(signals[i].y); } // Find the last green and red signal Y positions for (var i = signals.length - 1; i >= 0; i--) { if (signals[i].type === 'green' && lastGreenY === null) { lastGreenY = signals[i].y; } if (signals[i].type === 'red' && lastRedY === null) { lastRedY = signals[i].y; } if (lastGreenY !== null && lastRedY !== null) { break; } } for (var i = signals.length - 1; i >= Math.max(0, signals.length - 5); i--) { if (signals[i] && signals[i].type === 'red') { redSignalCount++; } else { break; } } // Force green signal if we've had 5 reds in a row if (redSignalCount >= 5) { // Force green signal (must be higher) but with more gradual ascent newY = lastSignalY - (100 + Math.random() * 150); signal = new Signal('green'); } else if (willBeHigher) { // This signal will be higher (ascending) // More gradual height difference for green signals var heightDiff = 80 + Math.random() * 120; // Reduced for more cascading effect if (lastGreenY !== null && Math.abs(lastSignalY - heightDiff - lastGreenY) > 200) { // Limit the maximum height change between signals of same color heightDiff = Math.min(heightDiff, 200); } newY = lastSignalY - heightDiff; // Higher signals must be green signal = new Signal('green'); } else { // This signal will be lower (descending) // More gradual height difference for red signals var heightDiff = 80 + Math.random() * 120; // Reduced for more cascading effect if (lastRedY !== null && Math.abs(lastSignalY + heightDiff - lastRedY) > 200) { // Limit the maximum height change between signals of same color heightDiff = Math.min(heightDiff, 200); } newY = lastSignalY + heightDiff; // Check if we would have too many consecutive red signals var wouldBeConsecutiveReds = redSignalCount + 1; if (wouldBeConsecutiveReds >= 5) { // Force this to be a green signal instead with gradual ascent newY = lastSignalY - (100 + Math.random() * 150); signal = new Signal('green'); } else { // Lower signals must be red signal = new Signal('red'); } } // Ensure signal stays within playable area newY = Math.max(800, Math.min(2200, newY)); // Additional check for signals that might be about to overlap (within 25px) var potentialOverlap = signals.filter(function (s) { // Only check signals that are still on screen or about to enter return s.active && s.x > -200 && s.x < 2300 && Math.abs(s.y - newY) < 25; }); // If there's potential overlap, adjust the Y position if (potentialOverlap.length > 0) { if (signal.type === 'green') { newY -= 100 + Math.random() * 50; // Move green signals higher } else { newY += 100 + Math.random() * 50; // Move red signals lower } // Re-check playable area boundaries newY = Math.max(800, Math.min(2200, newY)); } // Add height variation to signals and prevent consecutive similar heights if (signal.type === 'green') { // Green signals with cascading heights - increased variations var greenOffset = Math.random() * 50 + 10; // Check if this height is too similar to recent heights var isTooSimilar = recentHeights.some(function (height) { return Math.abs(newY - greenOffset - height) < heightThreshold; }); // If too similar, significantly increase the offset to ensure different height if (isTooSimilar) { greenOffset += 80 + Math.random() * 60; // Increased offset to prevent overlap } newY -= greenOffset; } else if (signal.type === 'red') { // Red signals with cascading heights - increased variations var redOffset = Math.random() * 50 + 10; // Check if this height is too similar to recent heights var isTooSimilar = recentHeights.some(function (height) { return Math.abs(newY + redOffset - height) < heightThreshold; }); // If too similar, significantly increase the offset to ensure different height if (isTooSimilar) { redOffset += 80 + Math.random() * 60; // Increased offset to prevent overlap } newY += redOffset; } signal.x = 2048 + 150; signal.y = newY; signals.push(signal); // Add signal behind the player to ensure correct display order if (player) { var playerIndex = game.getChildIndex(player); game.addChildAt(signal, playerIndex); } else { game.addChild(signal); } lastSignalTime = currentTime; } } // Spawn memecoins function spawnMemecoin() { var currentTime = Date.now(); // Spawn coins less frequently than signals - doubled interval from 3000 to 6000 if (currentTime - lastCoinTime > 6000 / gameSpeed) { // Find green signals that are still on screen (or about to enter) var greenSignals = signals.filter(function (signal) { return signal.type === 'green' && signal.x > -200 && signal.x < 2300; }); // Only spawn coin if we have green signals if (greenSignals.length > 0) { // Pick a random green signal var randomGreenSignal = greenSignals[Math.floor(Math.random() * greenSignals.length)]; var coin = new Memecoin(); coin.x = 2048 + 150; // Position coin above the green signal (50-150px higher) coin.y = randomGreenSignal.y - randomGreenSignal.width / 2 - 100 - Math.random() * 100; memecoins.push(coin); // Add coin behind the player to ensure correct display order if (player) { var playerIndex = game.getChildIndex(player); game.addChildAt(coin, playerIndex); } else { game.addChild(coin); } lastCoinTime = currentTime; } } } // Check collisions between player and signals/coins/shark function checkCollisions() { if (!isGameActive) { return; } // Check signal collisions for (var i = 0; i < signals.length; i++) { var signal = signals[i]; if (signal.active && player.intersects(signal)) { // Store previous intersection state var wasIntersecting = player.lastWasIntersecting; player.lastWasIntersecting = true; // Only handle collision if this is a new intersection if (!wasIntersecting) { // Check if player is above the signal and falling down // The signal is rotated 90 degrees left, so we need to detect its height properly // Signal's height is now its width because of the rotation var signalHeight = 50 / 1.2; // Original height divided by scale factor var signalWidth = 500 / 1.2; // Original width divided by scale factor var playerHeight = 150; // Player height // Calculate where the top of the signal is considering rotation if (player.y < signal.y - signalWidth / 2 && player.vy > 0) { if (signal.type === 'green') { // Land on green signals but don't automatically jump // Position player properly on top of the signal player.y = signal.y - signalWidth / 2 - playerHeight / 2; player.vy = 0; player.isJumping = false; } else if (signal.type === 'red') { // Pass through red signals, ignore collision // Don't land on red signals, continue falling player.vy += player.gravity; player.isJumping = true; } } } } else if (signal.active) { // If not intersecting this signal, reset lastWasIntersecting player.lastWasIntersecting = false; } } // Check memecoin collisions for (var i = 0; i < memecoins.length; i++) { var coin = memecoins[i]; if (coin.active && !coin.collected && player.intersects(coin)) { // Collect coin coin.collected = true; // Add points score += 50; scoreTxt.setText('SCORE: ' + Math.floor(score)); // Flash coin and remove LK.effects.flashObject(coin, 0xFFFFFF, 300); LK.getSound('coinCollect').play(); tween(coin, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 300, onFinish: function onFinish() { coin.active = false; } }); } } // Check shark collision if (player.y > 2732 - player.height && player.intersects(shark)) { // Game over if player touches shark gameOver(); } } // Clean up inactive entities function cleanupEntities() { // Remove inactive signals for (var i = signals.length - 1; i >= 0; i--) { // Only remove signals if player is not jumping or falling if (!signals[i].active) { // Add extra conditions to ensure we don't remove signals that player might need to land on if (!player || !player.isJumping && player.vy <= 0) { signals[i].destroy(); signals.splice(i, 1); } } } // Remove inactive coins for (var i = memecoins.length - 1; i >= 0; i--) { if (!memecoins[i].active) { memecoins[i].destroy(); memecoins.splice(i, 1); } } } // Game over function gameOver() { isGameActive = false; player.isDead = true; // Play crash sound LK.getSound('crash').play(); // Flash screen red LK.effects.flashScreen(0xFF0000, 500); // Update high score var highScore = storage.highScore || 0; if (score > highScore) { storage.highScore = score; highScoreTxt.setText('HIGH SCORE: ' + Math.floor(score)); } // Show game over after a short delay LK.setTimeout(function () { LK.showGameOver(); }, 800); } // Input handling game.down = function (x, y, obj) { // Jump when tapping/clicking player.jump(); }; // Main game update loop game.update = function () { if (!isGameActive) { return; } // Update score based on distance distanceTraveled += gameSpeed; score += scoreIncrement * gameSpeed; // Update score display occasionally to avoid text updates every frame if (Math.floor(score) % 5 === 0) { scoreTxt.setText('SCORE: ' + Math.floor(score)); } // Increase game speed gradually gameSpeed = 1 + distanceTraveled / 10000; // Spawn entities spawnSignal(); spawnMemecoin(); // Check collisions checkCollisions(); // Remove inactive entities cleanupEntities(); // Check if player fell off screen if (player.y > 2732 + 200) { gameOver(); } }; // Initialize UI and game initUI(); initGame(); // Track signal status globally game.onEntityDestroyed = function (entity) { // Keep track of destroyed entities if needed if (entity instanceof Signal && player) { // Keep signals around longer if player is falling or jumping if (player.isJumping || player.vy > 0) { // Return false to prevent deletion when player might need to land return false; } } return true; };
===================================================================
--- original.js
+++ change.js
@@ -207,61 +207,42 @@
// Clear signals and coins
clearEntities();
// Create initial signals that have already reached the left side
var recentHeights = [];
- var heightThreshold = 150; // Increased threshold for better staggering
- var baseY = 1500; // Starting Y position
- var lastSignalType = null;
+ var heightThreshold = 60; // Increased threshold to better detect potential overlaps
for (var i = 0; i < 44; i++) {
- // Force alternating signal types for better staggering
- var signalType;
- if (lastSignalType === 'green') {
- signalType = 'red';
- } else if (lastSignalType === 'red') {
- signalType = 'green';
- } else {
- signalType = Math.random() < 0.5 ? 'green' : 'red';
- }
- lastSignalType = signalType;
- var lastY = baseY;
+ var signalType = Math.random() < 0.5 ? 'green' : 'red';
+ // For signals that are lower than the previous, make them red
+ // For signals that are higher than the previous, make them green
+ var lastY = 1500;
if (signals.length > 0) {
lastY = signals[signals.length - 1].y;
}
var newY;
- // Create a zig-zag pattern with more pronounced height differences
- if (signalType === 'green') {
- // Green signals go higher with less extreme variation
- var heightDiff = 100 + Math.random() * 100;
+ var willBeHigher = Math.random() < 0.5;
+ if (willBeHigher) {
+ // More gradual ascent with varied height differences
+ var heightDiff = 100 + Math.random() * 150;
newY = lastY - heightDiff;
+ signalType = 'green';
} else {
- // Red signals go lower with less extreme variation
- var heightDiff = 100 + Math.random() * 100;
+ // More gradual descent with varied height differences
+ var heightDiff = 100 + Math.random() * 150;
newY = lastY + heightDiff;
+ signalType = 'red';
}
// Check if this height is too similar to recent heights
var isTooSimilar = recentHeights.length > 0 && recentHeights.some(function (height) {
return Math.abs(newY - height) < heightThreshold;
});
- // If too similar, adjust the height to avoid repetition, but with smaller offsets
+ // If too similar, adjust the height to avoid repetition
if (isTooSimilar) {
if (signalType === 'green') {
- newY -= 100 + Math.random() * 50; // Reduced offset for more moderate separation
+ newY -= 100 + Math.random() * 80; // Increased offset for better separation
} else {
- newY += 100 + Math.random() * 50; // Reduced offset for more moderate separation
+ newY += 100 + Math.random() * 80; // Increased offset for better separation
}
}
- // Secondary check - verify we don't overlap with ANY recent height
- var stillOverlapping = recentHeights.some(function (height) {
- return Math.abs(newY - height) < heightThreshold;
- });
- if (stillOverlapping) {
- // Apply additional vertical offset if still overlapping - with smaller offsets
- if (signalType === 'green') {
- newY -= 100;
- } else {
- newY += 100;
- }
- }
// Ensure signal stays within playable area
newY = Math.max(800, Math.min(2200, newY));
// Store this height for future comparison
recentHeights.push(newY);
@@ -272,9 +253,15 @@
// Position signals already at the left side of the screen
signal.x = -150 + i * 50; // Distribute signals across the left edge
signal.y = newY;
signals.push(signal);
- game.addChild(signal);
+ // Make sure signals are placed behind the player
+ if (player) {
+ var playerIndex = game.getChildIndex(player);
+ game.addChildAt(signal, playerIndex);
+ } else {
+ game.addChild(signal);
+ }
}
// Start game music
LK.playMusic('gameMusic');
}
@@ -307,20 +294,17 @@
lastSignalY = lastSignal.y;
}
// Calculate a new Y position
var newY;
- // Determine last signal type to force alternating pattern
- var lastSignalType = signals.length > 0 ? signals[signals.length - 1].type : null;
- // Track height differences for staggering
- var heightOffset = 250; // Base height difference between signals
+ var willBeHigher = Math.random() < 0.5; // 50% chance to go higher
// Count consecutive red signals
var redSignalCount = 0;
// Find the last signal of each type for height comparison
var lastGreenY = null;
var lastRedY = null;
// Track recent signal heights to prevent repetition
var recentHeights = [];
- var heightThreshold = 150; // Increased threshold for better staggering detection
+ var heightThreshold = 60; // Increased threshold to detect potential overlaps better
// Collect the last few signal heights for comparison
for (var i = signals.length - 1; i >= Math.max(0, signals.length - 15); i--) {
recentHeights.push(signals[i].y);
}
@@ -342,123 +326,97 @@
} else {
break;
}
}
- // Force alternating pattern for more staggered layout with smaller vertical differences
- if (redSignalCount >= 3 || lastSignalType === 'red') {
- // Force green signal with moderate height difference
- newY = lastSignalY - (heightOffset + Math.random() * 80);
+ // Force green signal if we've had 5 reds in a row
+ if (redSignalCount >= 5) {
+ // Force green signal (must be higher) but with more gradual ascent
+ newY = lastSignalY - (100 + Math.random() * 150);
signal = new Signal('green');
- } else if (lastSignalType === 'green') {
- // Force red signal with moderate height difference
- var heightDiff = heightOffset + Math.random() * 80; // Moderate height difference for staggering
- if (lastRedY !== null) {
- // Ensure we don't get too close to the last red signal
- var minDiff = 150;
- if (Math.abs(lastSignalY + heightDiff - lastRedY) < minDiff) {
- heightDiff += minDiff; // Add more height difference if too close
- }
+ } else if (willBeHigher) {
+ // This signal will be higher (ascending)
+ // More gradual height difference for green signals
+ var heightDiff = 80 + Math.random() * 120; // Reduced for more cascading effect
+ if (lastGreenY !== null && Math.abs(lastSignalY - heightDiff - lastGreenY) > 200) {
+ // Limit the maximum height change between signals of same color
+ heightDiff = Math.min(heightDiff, 200);
}
- newY = lastSignalY + heightDiff;
- signal = new Signal('red');
+ newY = lastSignalY - heightDiff;
+ // Higher signals must be green
+ signal = new Signal('green');
} else {
- // First signal or when we need more variety
- // 70% chance for green (upward) which encourages more up/down pattern
- if (Math.random() < 0.7) {
- // This signal will be higher (ascending) with moderate difference
- var heightDiff = heightOffset + Math.random() * 80; // Moderate height difference for staggering
- newY = lastSignalY - heightDiff;
+ // This signal will be lower (descending)
+ // More gradual height difference for red signals
+ var heightDiff = 80 + Math.random() * 120; // Reduced for more cascading effect
+ if (lastRedY !== null && Math.abs(lastSignalY + heightDiff - lastRedY) > 200) {
+ // Limit the maximum height change between signals of same color
+ heightDiff = Math.min(heightDiff, 200);
+ }
+ newY = lastSignalY + heightDiff;
+ // Check if we would have too many consecutive red signals
+ var wouldBeConsecutiveReds = redSignalCount + 1;
+ if (wouldBeConsecutiveReds >= 5) {
+ // Force this to be a green signal instead with gradual ascent
+ newY = lastSignalY - (100 + Math.random() * 150);
signal = new Signal('green');
} else {
- // This signal will be lower (descending) with moderate difference
- var heightDiff = heightOffset + Math.random() * 80; // Moderate height difference for staggering
- newY = lastSignalY + heightDiff;
- // Check if we would have too many consecutive red signals
- var wouldBeConsecutiveReds = redSignalCount + 1;
- if (wouldBeConsecutiveReds >= 3) {
- // Force green signal instead
- newY = lastSignalY - (heightOffset + Math.random() * 150);
- signal = new Signal('green');
- } else {
- signal = new Signal('red');
- }
+ // Lower signals must be red
+ signal = new Signal('red');
}
}
// Ensure signal stays within playable area
newY = Math.max(800, Math.min(2200, newY));
- // Additional check for signals that might be about to overlap (increase threshold to 100px)
+ // Additional check for signals that might be about to overlap (within 25px)
var potentialOverlap = signals.filter(function (s) {
// Only check signals that are still on screen or about to enter
- return s.active && s.x > -200 && s.x < 2300 && Math.abs(s.y - newY) < 100;
+ return s.active && s.x > -200 && s.x < 2300 && Math.abs(s.y - newY) < 25;
});
- // If there's potential overlap, adjust the Y position with smaller changes
+ // If there's potential overlap, adjust the Y position
if (potentialOverlap.length > 0) {
if (signal.type === 'green') {
- newY -= 100 + Math.random() * 50; // Move green signals moderately higher
+ newY -= 100 + Math.random() * 50; // Move green signals higher
} else {
- newY += 100 + Math.random() * 50; // Move red signals moderately lower
+ newY += 100 + Math.random() * 50; // Move red signals lower
}
// Re-check playable area boundaries
newY = Math.max(800, Math.min(2200, newY));
- // Verify we've resolved the overlap
- var stillOverlapping = signals.some(function (s) {
- return s.active && s.x > -200 && s.x < 2300 && Math.abs(s.y - newY) < 100;
- });
- // If still overlapping, try one more adjustment with smaller changes
- if (stillOverlapping) {
- if (signal.type === 'green') {
- newY -= 100;
- } else {
- newY += 100;
- }
- // Final boundary check
- newY = Math.max(800, Math.min(2200, newY));
- }
}
// Add height variation to signals and prevent consecutive similar heights
if (signal.type === 'green') {
- // Green signals with moderate height variations for better height distribution
- var greenOffset = Math.random() * 80 + 30; // Reduced base variation
+ // Green signals with cascading heights - increased variations
+ var greenOffset = Math.random() * 50 + 10;
// Check if this height is too similar to recent heights
var isTooSimilar = recentHeights.some(function (height) {
return Math.abs(newY - greenOffset - height) < heightThreshold;
});
- // If too similar, moderately increase the offset to ensure different height
+ // If too similar, significantly increase the offset to ensure different height
if (isTooSimilar) {
- greenOffset += 100 + Math.random() * 80; // Moderate offset for balanced staggering
+ greenOffset += 80 + Math.random() * 60; // Increased offset to prevent overlap
}
newY -= greenOffset;
- // Double-check after adjustment
- var stillTooSimilar = recentHeights.some(function (height) {
- return Math.abs(newY - height) < heightThreshold;
- });
- if (stillTooSimilar) {
- newY -= 200; // Apply larger additional offset if still too similar
- }
} else if (signal.type === 'red') {
- // Red signals with moderate height variations for better height distribution
- var redOffset = Math.random() * 80 + 30; // Reduced base variation
+ // Red signals with cascading heights - increased variations
+ var redOffset = Math.random() * 50 + 10;
// Check if this height is too similar to recent heights
var isTooSimilar = recentHeights.some(function (height) {
return Math.abs(newY + redOffset - height) < heightThreshold;
});
- // If too similar, moderately increase the offset to ensure different height
+ // If too similar, significantly increase the offset to ensure different height
if (isTooSimilar) {
- redOffset += 100 + Math.random() * 80; // Moderate offset for balanced staggering
+ redOffset += 80 + Math.random() * 60; // Increased offset to prevent overlap
}
newY += redOffset;
- // Double-check after adjustment
- var stillTooSimilar = recentHeights.some(function (height) {
- return Math.abs(newY - height) < heightThreshold;
- });
- if (stillTooSimilar) {
- newY += 200; // Apply larger additional offset if still too similar
- }
}
signal.x = 2048 + 150;
signal.y = newY;
signals.push(signal);
- game.addChild(signal);
+ // Add signal behind the player to ensure correct display order
+ if (player) {
+ var playerIndex = game.getChildIndex(player);
+ game.addChildAt(signal, playerIndex);
+ } else {
+ game.addChild(signal);
+ }
lastSignalTime = currentTime;
}
}
// Spawn memecoins
@@ -478,9 +436,15 @@
coin.x = 2048 + 150;
// Position coin above the green signal (50-150px higher)
coin.y = randomGreenSignal.y - randomGreenSignal.width / 2 - 100 - Math.random() * 100;
memecoins.push(coin);
- game.addChild(coin);
+ // Add coin behind the player to ensure correct display order
+ if (player) {
+ var playerIndex = game.getChildIndex(player);
+ game.addChildAt(coin, playerIndex);
+ } else {
+ game.addChild(coin);
+ }
lastCoinTime = currentTime;
}
}
}
Grey shark, sideview. In-Game asset. 2d. High contrast. No shadows
Golden Dogecoin
Golden memecoin with sunglasses
shiba inu golden memecoin
Golden memecoin with Pepe
Golden coin with Floki
Golden coin with volt
Golden coin with cute catface
Golden coin with Trump and 'WILL FIX IT' Text
Lightning line. In-Game asset. 2d. High contrast. No shadows