User prompt
There is a gap between foreground instances that grows as the game progresses. It happened after game speed was implemented. Is it possible that not all instances of foreground are moving at the same speed?
User prompt
Update the Foreground class with more precise positioning: var Foreground = Container.expand(function () { var self = Container.call(this); var foregroundGraphics = self.attachAsset('Foreground', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.baseX = 2048 / 2; // Store initial position self.update = function () { self.x -= self.speed * gameSpeed; if (self.x <= -self.width/2) { // Reset to exact position relative to initial setup self.x = Math.round(2048 + self.width/2); console.log('Reset to exact position:', self.x); } }; });
User prompt
Update the Foreground class: var Foreground = Container.expand(function () { var self = Container.call(this); var foregroundGraphics = self.attachAsset('Foreground', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.update = function () { self.x -= self.speed * gameSpeed; // Reset earlier, before it's fully off screen if (self.x <= -self.width/2) { // Changed from -self.width self.x = 2048 + self.width/2; // Position off right side console.log('Early reset to:', self.x); } }; });
User prompt
First, update how foregrounds are created - add references to each other: var foreground1 = new Foreground(); var foreground2 = new Foreground(); foreground1.other = foreground2; foreground2.other = foreground1; Then update the Foreground class: var Foreground = Container.expand(function () { var self = Container.call(this); var foregroundGraphics = self.attachAsset('Foreground', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.other = null; // Reference to other foreground piece self.update = function () { self.x -= self.speed * gameSpeed; if (self.x <= -self.width) { self.x = self.other.x + self.width; console.log('Reset based on other position:', self.x); } }; });
User prompt
Thereβs gaps appearing in foreground layer. Please fix refresh and spawning
User prompt
Update the Foreground class to account for gameSpeed in both movement and reset: var Foreground = Container.expand(function () { var self = Container.call(this); var foregroundGraphics = self.attachAsset('Foreground', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.update = function () { var moveAmount = self.speed * gameSpeed; self.x -= moveAmount; if (self.x <= -self.width) { // Position relative to current gameSpeed self.x = self.x + (self.width * 2); console.log('Reset with speed:', gameSpeed, 'New pos:', self.x); } }; });
User prompt
Update the Foreground class: var Foreground = Container.expand(function () { var self = Container.call(this); var foregroundGraphics = self.attachAsset('Foreground', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.update = function () { self.x -= self.speed * gameSpeed; // Wait until fully off screen left if (self.x <= -self.width) { // Position exactly two widths from old position self.x = self.x + (self.width * 2); console.log('Reset position:', self.x); } }; });
User prompt
Update the Foreground class: var Foreground = Container.expand(function () { var self = Container.call(this); var foregroundGraphics = self.attachAsset('Foreground', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.update = function () { self.x -= self.speed * gameSpeed; // Log position for debugging console.log('Foreground pos:', self.x, 'width:', self.width); // Reset when completely off screen if (self.x <= -(2048 + self.width/2)) { self.x = 2048 + self.width/2; console.log('Foreground reset to:', self.x); } }; });
User prompt
Modify just the Foreground update function: self.update = function () { self.x -= self.speed * gameSpeed; if (self.x <= -self.width) { self.x += self.width * 2; } };
User prompt
Make sure foreground is always the highest layer
User prompt
Update the Fish's Y position in the spawn code: currentObstacle.y = obstacleType === 'Duck' ? 2732 * 0.75 : obstacleType === 'Eagle' ? 2732 * 0.25 : 2732 * 0.85; // Changed from 0.90 to 0.85 for Fish
User prompt
Modify the jump splash effect with more splashes and higher movement: if (self.isJumping) { self.jumpTime += self.jumpSpeed; var jumpHeight = -Math.sin(self.jumpTime) * 600; self.y = self.jumpStartY + jumpHeight; // Generate bigger splash burst when jumping out if (self.jumpTime < 0.1) { // Only on first frame of jump var burstSplashes = Math.floor(Math.random() * 4) + 6; // 6-9 splashes (increased from 4-6) for (var i = 0; i < burstSplashes; i++) { var splash = new Splash(); splash.x = self.x + (Math.random() * graphics.width - graphics.width/2); splash.y = self.jumpStartY - (Math.random() * 200); // Make splashes go higher game.addChildAt(splash, game.getChildIndex(self) - 1); } } // Rest of existing jump code... }
User prompt
Add jump splash effects to Fish. Inside the jumping section: if (self.isJumping) { self.jumpTime += self.jumpSpeed; var jumpHeight = -Math.sin(self.jumpTime) * 600; self.y = self.jumpStartY + jumpHeight; // Generate splash burst when first jumping out if (self.jumpTime < 0.1) { // Only on first frame of jump var burstSplashes = Math.floor(Math.random() * 3) + 4; // 4-6 splashes for (var i = 0; i < burstSplashes; i++) { var splash = new Splash(); splash.x = self.x + (Math.random() * graphics.width - graphics.width/2); splash.y = self.jumpStartY; game.addChildAt(splash, game.getChildIndex(self) - 1); } } // Rest of existing jump code... }
User prompt
Fish layer should be below foreground layer
User prompt
Move the fish starting position up 3%
User prompt
Add underwater splash effects for Fish: 1. In the initial setup for Fish type: if (type === 'Fish') { self.speedX = -6; self.jumpSpeed = 0.05; self.isJumping = false; self.pauseTime = 0; self.lastSplashTime = Date.now(); // Add splash timer graphics.tint = 0x4444ff; graphics.alpha = 0.7; } 2. In the Fish update section, before the jump check: if (!self.isJumping && Date.now() - self.lastSplashTime >= 200) { // Generate every 200ms var numSplashes = Math.floor(Math.random() * 2) + 1; // 1-2 splashes for (var i = 0; i < numSplashes; i++) { var splash = new Splash(); splash.x = self.x + (Math.random() * graphics.width - graphics.width/2); // Random position along fish body splash.y = self.y; splash.tint = 0x4444ff; // Match fish's underwater tint game.addChildAt(splash, game.getChildIndex(self) - 1); } self.lastSplashTime = Date.now(); }
User prompt
Add tint transition during the jump: if (self.isJumping) { self.jumpTime += self.jumpSpeed; var jumpHeight = -Math.sin(self.jumpTime) * 600; self.y = self.jumpStartY + jumpHeight; // Change tint based on height above water if (self.y < self.jumpStartY - 50) { graphics.tint = 0xffffff; // Normal color above water graphics.alpha = 1.0; } else { graphics.tint = 0x4444ff; // Blue tint in water graphics.alpha = 0.7; } if (self.jumpTime > Math.PI) { Obstacle.lastDestroyTime = Date.now(); console.log("Fish destroyed after jump at " + Date.now()); currentObstacle = null; self.destroy(); } }
User prompt
Update the Fish speeds to have fast swimming but slower jumping: 1. In the initial setup: if (type === 'Fish') { self.speedX = -6; // Back to original fast swimming speed self.jumpSpeed = 0.05; // Slow jump speed control self.isJumping = false; self.pauseTime = 0; graphics.tint = 0x4444ff; graphics.alpha = 0.7; } 2. In the jumping section: if (self.isJumping) { self.jumpTime += self.jumpSpeed; // Use slower jumpSpeed var jumpHeight = -Math.sin(self.jumpTime) * 600; self.y = self.jumpStartY + jumpHeight; if (self.jumpTime > Math.PI) { Obstacle.lastDestroyTime = Date.now(); console.log("Fish destroyed after jump at " + Date.now()); currentObstacle = null; self.destroy(); } }
User prompt
Let's fix the Fish's speed and rotation. Update these parts: 1. In the initial setup where speed is defined, change the Fish speed: if (type === 'Fish') { self.speedX = -3; // Half of -6 for slower movement self.isJumping = false; self.pauseTime = 0; graphics.tint = 0x4444ff; graphics.alpha = 0.7; } 2. When the Fish starts to jump, change the rotation direction: if (self.pauseTime >= 1 && !self.isJumping) { graphics.alpha = 1; graphics.rotation = Math.PI/2; // Changed from -Math.PI/2 to rotate the other way self.isJumping = true; self.jumpStartY = self.y; self.jumpTime = 0; }
User prompt
Update the Fish's jump destroy section: if (self.isJumping) { self.jumpTime += 0.1; var jumpHeight = -Math.sin(self.jumpTime) * 600; self.y = self.jumpStartY + jumpHeight; if (self.jumpTime > Math.PI) { Obstacle.lastDestroyTime = Date.now(); console.log("Fish destroyed after jump at " + Date.now()); currentObstacle = null; // Add this line self.destroy(); } }
User prompt
Update the obstacle delays to include Fish: Obstacle.getRandomDelay = function (min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }; Obstacle.spawnDelay = 2500; // Default fallback Obstacle.respawnDelay = { Eagle: Obstacle.getRandomDelay(2000, 3000), Duck: Obstacle.getRandomDelay(2000, 3000), Fish: Obstacle.getRandomDelay(2000, 3000) // Add Fish delay }; Obstacle.lastDestroyTime = Date.now() - 5000;
User prompt
Modify only the jumping part of the existing Fish behavior: if (self.isJumping) { self.jumpTime += 0.1; var jumpHeight = -Math.sin(self.jumpTime) * 600; // Changed from 300 to 600 self.y = self.jumpStartY + jumpHeight; if (self.jumpTime > Math.PI) { self.destroy(); Obstacle.lastDestroyTime = Date.now(); // Added this line } }
User prompt
Add the jumping motion to the Fish: else if (type === 'Fish') { self.x += self.speedX; if (self.x <= coot.x && !self.isJumping) { self.speedX = 0; graphics.alpha = 0; self.pauseTime += 0.05; } if (self.pauseTime >= 1 && !self.isJumping) { graphics.alpha = 1; graphics.rotation = -Math.PI/2; self.isJumping = true; self.jumpStartY = self.y; self.jumpTime = 0; } // Add jumping motion if (self.isJumping) { self.jumpTime += 0.1; var jumpHeight = -Math.sin(self.jumpTime) * 300; self.y = self.jumpStartY + jumpHeight; if (self.jumpTime > Math.PI) { self.destroy(); } } if (self.x <= -self.width / 2) { self.destroy(); Obstacle.lastDestroyTime = Date.now(); } }
User prompt
Add the reappear logic after pause: else if (type === 'Fish') { self.x += self.speedX; if (self.x <= coot.x && !self.isJumping) { self.speedX = 0; graphics.alpha = 0; self.pauseTime += 0.05; } // Add this check for when to reappear if (self.pauseTime >= 1 && !self.isJumping) { graphics.alpha = 1; graphics.rotation = -Math.PI/2; self.isJumping = true; self.jumpStartY = self.y; self.jumpTime = 0; } if (self.x <= -self.width / 2) { self.destroy(); Obstacle.lastDestroyTime = Date.now(); } }
User prompt
Update the Fish behavior: else if (type === 'Fish') { self.x += self.speedX; if (self.x <= coot.x && !self.isJumping) { self.speedX = 0; graphics.alpha = 0; self.pauseTime += 0.05; // Just add this line } if (self.x <= -self.width / 2) { self.destroy(); Obstacle.lastDestroyTime = Date.now(); } }
/**** 
* Classes
****/ 
var CollisionBlock = Container.expand(function () {
	var self = Container.call(this);
	var collisionBlockGraphics = self.attachAsset('Collisionblock', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 0
	});
});
// Assets will be automatically created and loaded by the LK engine based on their usage in the code.
// Example assets: 'coot', 'obstacle', 'background'
// Class for the main character, the American coot
var Coot = Container.expand(function () {
	var self = Container.call(this);
	var cootGraphics = self.attachAsset('coot', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 6.5;
	self.jumpVelocity = 40; // Increased initial upward velocity for jump
	self.gravity = 1.0; // Gravity to apply during jump
	self.jumpHeight = 105;
	self.isJumping = false;
	self.isReturning = false; // New state to handle returning to top after diving
	self.update = function () {
		if (self.isJumping) {
			self.x += self.speed * 0.1 * gameSpeed;
			self.y -= self.jumpVelocity; // Move upwards with initial velocity
			self.jumpVelocity -= self.gravity; // Apply gravity to slow down ascent
			if (self.jumpVelocity <= 0) {
				self.isJumping = false; // Stop jumping when upward velocity is zero
				self.isFalling = true; // Start falling
			}
		} else if (self.isFalling) {
			self.y += self.gravity * 5; // Apply even more increased gravity to fall down faster
			if (self.y >= self.originalY) {
				self.y = self.originalY; // Ensure Coot doesn't go below original position
				self.isFalling = false; // Stop falling
				self.x = self.originalX; // Reset X position when jump completes
				self.jumpVelocity = 40; // Reset jump velocity for next jump
				self.isJumping = false; // Ensure jumping state is reset
				// Removed unnecessary isReturning reset in the falling state
			}
			// Remove wobble and water particles during falling
			cootGraphics.rotation = 0; // Reset rotation to remove wobble
		} else if (self.isDiving) {
			self.y += self.speed * 1.5;
			cootGraphics.alpha = Math.max(0.5, cootGraphics.alpha - 0.05); // Gradually decrease opacity
			cootGraphics.tint = 0x0000ff; // Change tint to blue
			if (self.y >= 2732 * 0.90) {
				self.y = 2732 * 0.90; // Ensure Coot doesn't go below this point
				self.isDiving = false; // Stop diving
				self.returnDelay = Date.now() + 1000; // 1 second delay using time
			}
		} else if (self.returnDelay > 0) {
			if (Date.now() >= self.returnDelay) {
				self.returnDelay = 0; // Reset returnDelay after it is used
				if (self.y >= 2732 * 0.90) {
					self.isReturning = true; // Start returning after delay
				}
			}
		} else if (self.isReturning) {
			self.y -= self.speed * 1.5; // Match surfacing speed with descent speed
			var transitionFactor = 1 - (self.y - self.originalY) / (2732 * 0.90 - self.originalY);
			cootGraphics.alpha = 0.5 + 0.5 * transitionFactor; // Smoothly increase opacity
			// Convert tint colors to RGB and interpolate
			var startTint = self.underwaterTint;
			var endTint = 0xffffff;
			var r = (startTint >> 16 & 0xff) + ((endTint >> 16 & 0xff) - (startTint >> 16 & 0xff)) * transitionFactor;
			var g = (startTint >> 8 & 0xff) + ((endTint >> 8 & 0xff) - (startTint >> 8 & 0xff)) * transitionFactor;
			var b = (startTint & 0xff) + ((endTint & 0xff) - (startTint & 0xff)) * transitionFactor;
			cootGraphics.tint = (r << 16) + (g << 8) + b; // Apply interpolated tint
			if (self.y <= self.originalY) {
				self.y = self.originalY;
				self.isReturning = false; // Reset returning state
				cootGraphics.alpha = 1.0; // Ensure opacity is fully reset
				cootGraphics.tint = 0xffffff; // Reset tint to normal color when fully surfaced
			}
			// Removed redundant isReturning block to ensure visual effects are not reset prematurely
			if (self.isReturning) {
				self.x += (self.originalX - self.x) * 0.1; // Gradually slide back to original X position
			}
		}
		// Add wobble effect to the coot while running
		if (!self.isJumping && !self.isDiving && !self.isReturning && !self.isFalling) {
			cootGraphics.rotation = Math.sin(LK.ticks / 10) * 0.1; // Add wobble effect when not jumping, diving, or returning
			// Generate 1-2 water splash particles every 60 ticks (1 second) only when not jumping, diving, or falling
			if (!self.isJumping && !self.isDiving && !self.isFalling && LK.ticks % 60 == 0) {
				var numParticles = Math.floor(Math.random() * 2) + 1;
				for (var i = 0; i < numParticles; i++) {
					var splashLeft = new Splash();
					splashLeft.x = self.x - cootGraphics.width / 2;
					splashLeft.y = self.y + cootGraphics.height / 2;
					game.addChildAt(splashLeft, game.getChildIndex(foreground1) - 1);
					var splashRight = new Splash();
					splashRight.x = self.x + cootGraphics.width / 2;
					splashRight.y = self.y + cootGraphics.height / 2;
					game.addChildAt(splashRight, game.getChildIndex(foreground1) - 1);
				}
			}
		}
	};
	self.isDiving = false;
	self.jump = function () {
		if (!self.isJumping && !self.isDiving && !self.isReturning) {
			self.isJumping = true;
			self.originalX = self.x;
			// Removed X position update from jump function
			self.isReturning = false; // Ensure returning state is reset when jumping
			self.originalY = self.y;
		}
	};
	self.dive = function () {
		if (!self.isJumping && !self.isDiving) {
			self.isDiving = true;
			self.returnDelay = Date.now() + 5000; // Set return delay to 5 seconds using time
			self.isReturning = false; // Ensure returning state is reset when diving
			self.underwaterTint = 0x4444ff; // Set initial underwater tint color
			// Removed duplicate isReturning = false line
			self.originalX = self.x;
			self.originalY = self.y;
			self.y += self.speed * 2; // Start diving downwards immediately with increased speed
			// Generate water splash particles
			var numParticles = Math.floor(Math.random() * 3) + 2; // Generate 2-4 particles
			for (var i = 0; i < numParticles; i++) {
				var splash = new Splash();
				splash.x = self.x;
				splash.y = self.y + cootGraphics.height / 2;
				game.addChildAt(splash, game.getChildIndex(foreground1) - 1);
			}
		}
	};
});
var EagleFeather = Container.expand(function () {
	var self = Container.call(this);
	var featherGraphics = self.attachAsset('Eaglefeather', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Initialize feather properties
	self.rotationSpeed = Math.random() * 0.02 - 0.01; // Random rotation speed
	self.driftX = Math.random() * 2 - 1; // Random sideways drift
	self.driftY = Math.random() * -1 - 0.5; // Upward drift
	self.fadeRate = 0.005; // Fade out rate
	self.update = function () {
		self.x += self.driftX * gameSpeed;
		self.y += self.driftY * gameSpeed;
		featherGraphics.rotation += self.rotationSpeed;
		featherGraphics.alpha -= self.fadeRate;
		// Destroy feather when fully faded
		if (featherGraphics.alpha <= 0) {
			self.destroy();
		}
	};
});
// Class for the foreground
var Foreground = Container.expand(function () {
	var self = Container.call(this);
	var foregroundGraphics = self.attachAsset('Foreground', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5;
	self.update = function () {
		self.x -= self.speed * gameSpeed;
		if (self.x <= -self.width / 2) {
			self.x += self.width * 2;
		}
	};
});
// Class for the midgroundtrees
var Midgroundtrees = Container.expand(function () {
	var self = Container.call(this);
	var midgroundtreesGraphics = self.attachAsset('Midgroundtrees', {
		anchorX: 0.5,
		anchorY: 0.7
	});
	self.speed = 3;
	self.update = function () {
		self.x -= self.speed * gameSpeed;
		// self.y = coot.y;
		if (self.x <= -self.width / 2) {
			self.x += self.width * 2;
		}
	};
});
// Class for the Obstacle (Duck, Eagle, and Fish combined)
var Obstacle = Container.expand(function (type) {
	var self = Container.call(this);
	var graphics;
	var collisionBlock = self.addChild(new CollisionBlock());
	collisionBlock.x = 0;
	collisionBlock.y = 0;
	graphics = self.attachAsset(type, {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Add a Ripple instance to the Duck obstacle
	if (type === 'Duck') {
		self.lastRippleTime = Date.now();
		var ripple = new Ripple();
		ripple.x = 0; // Center the ripple on the Duck
		ripple.y = graphics.height / 2; // Position the ripple at the bottom of the Duck
		self.addChildAt(ripple, 0); // Add ripple below the Duck but above the water layer
	}
	self.speedX = -6;
	if (type === 'Fish') {
		self.isJumping = false;
		self.pauseTime = 0;
		graphics.tint = 0x4444ff;
		graphics.alpha = 0.7;
	}
	if (type === 'Fish') {
		self.speedX = -6; // Back to original fast swimming speed
		self.jumpSpeed = 0.05; // Slow jump speed control
		self.isJumping = false;
		self.isPausing = false;
		self.pauseTime = 0;
		self.lastSplashTime = Date.now(); // Add splash timer
		graphics.tint = 0x4444ff; // Set underwater blue tint initially
		graphics.alpha = 0.7; // Set underwater opacity initially
		self.isFalling = false;
		self.jumpVelocity = 0;
		self.jumpStartY = self.y; // Store original position
		self.jumpTime = 0; // Initialize jump time counter
		self.y = 2732 * 0.90; // Set Fish Y position to the bottom of the Coot's dive
	}
	if (type === 'Eagle') {
		self.lastFeatherTime = Date.now();
		self.targetY = coot.isDiving || coot.isReturning ? coot.originalY : coot.y;
		self.speedY = (self.targetY - self.y) / 100;
	}
	self.update = function () {
		self.x += self.speedX * gameSpeed;
		if (type === 'Fish') {
			// Move horizontally
			self.x += self.speedX;
			// Generate underwater splash effects
			if (!self.isJumping && Date.now() - self.lastSplashTime >= 200) {
				// Generate every 200ms
				var numSplashes = Math.floor(Math.random() * 2) + 1; // 1-2 splashes
				for (var i = 0; i < numSplashes; i++) {
					var splash = new Splash();
					splash.x = self.x + (Math.random() * graphics.width - graphics.width / 2); // Random position along fish body
					splash.y = self.y;
					splash.tint = 0x4444ff; // Match fish's underwater tint
					game.addChildAt(splash, game.getChildIndex(self) - 1);
				}
				self.lastSplashTime = Date.now();
			}
			// Check if crossing under Coot
			if (self.x <= coot.x && !self.isJumping) {
				self.speedX = 0;
				graphics.alpha = 0;
				self.pauseTime += 0.05;
			}
			// Add this check for when to reappear
			if (self.pauseTime >= 1 && !self.isJumping) {
				graphics.alpha = 1;
				graphics.rotation = Math.PI / 2; // Changed from -Math.PI/2 to rotate the other way
				self.isJumping = true;
				self.jumpStartY = self.y;
				self.jumpTime = 0;
			}
			// Handle jumping motion
			if (self.isJumping) {
				self.jumpTime += self.jumpSpeed; // Use slower jumpSpeed
				var jumpHeight = -Math.sin(self.jumpTime) * 600; // Changed from 300 to 600
				self.y = self.jumpStartY + jumpHeight;
				// Generate bigger splash burst when jumping out
				if (self.jumpTime < 0.1) {
					// Only on first frame of jump
					var burstSplashes = Math.floor(Math.random() * 4) + 6; // 6-9 splashes (increased from 4-6)
					for (var i = 0; i < burstSplashes; i++) {
						var splash = new Splash();
						splash.x = self.x + (Math.random() * graphics.width - graphics.width / 2);
						splash.y = self.jumpStartY - Math.random() * 200; // Make splashes go higher
						game.addChildAt(splash, game.getChildIndex(self) - 1);
					}
				}
				// Change tint based on height above water
				if (self.y < self.jumpStartY - 50) {
					graphics.tint = 0xffffff; // Normal color above water
					graphics.alpha = 1.0;
				} else {
					graphics.tint = 0x4444ff; // Blue tint in water
					graphics.alpha = 0.7;
				}
				if (self.jumpTime > Math.PI) {
					Obstacle.lastDestroyTime = Date.now();
					console.log("Fish destroyed after jump at " + Date.now());
					currentObstacle = null; // Add this line
					self.destroy();
				}
			}
			// Normal destroy check
			if (self.x <= -self.width / 2) {
				self.destroy();
				Obstacle.lastDestroyTime = Date.now();
			}
		} else if (type === 'Eagle') {
			self.y += self.speedY;
			if (Date.now() - self.lastFeatherTime >= 900) {
				// Feather spawn every 900ms
				var numFeathers = Math.floor(Math.random() * 2) + 2; // Spawn 2-3 feathers
				for (var i = 0; i < numFeathers; i++) {
					var feather = new EagleFeather();
					feather.x = self.x + (Math.random() * 20 - 10); // Slight horizontal variation
					feather.y = self.y + graphics.height / 2;
					game.addChildAt(feather, game.getChildIndex(self) - 1);
				}
				self.lastFeatherTime = Date.now();
			}
			if (self.x <= -self.width / 2) {
				console.log("Checking for destruction: Eagle at " + self.x);
				self.destroy(); // Destroy the obstacle when it moves off-screen
				Obstacle.lastDestroyTime = Date.now(); // Set lastDestroyTime when destroyed
				console.log("Obstacle destroyed at " + Obstacle.lastDestroyTime);
			}
			if (self.y < self.targetY) {
				self.speedY = (self.targetY - self.y) / 100;
			} else {
				self.speedY = 0;
			}
		} else if (type === 'Duck') {
			// Add wobble effect to Duck
			graphics.rotation = Math.sin(LK.ticks / 20) * 0.05;
			// Ripple spawn logic
			if (Date.now() - self.lastRippleTime >= 500) {
				var ripple = new Ripple();
				ripple.x = self.x;
				ripple.y = self.y + graphics.height / 2;
				game.addChildAt(ripple, game.getChildIndex(self) - 1);
				self.lastRippleTime = Date.now();
			}
			// Existing destroy logic
			if (self.x <= -self.width / 2) {
				console.log("Checking for destruction: Duck at " + self.x);
				self.destroy();
				Obstacle.lastDestroyTime = Date.now();
				console.log("Obstacle destroyed at " + Obstacle.lastDestroyTime);
			}
		}
		collisionBlock.x = 0;
		collisionBlock.y = 0;
	};
});
var Ripple = Container.expand(function () {
	var self = Container.call(this);
	var rippleGraphics = self.attachAsset('Ripple', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.initialScale = 0.05;
	self.growthRate = 0.02;
	self.fadeRate = 0.01;
	self.maxScale = 2.0;
	rippleGraphics.scaleX = self.initialScale;
	rippleGraphics.scaleY = self.initialScale;
	self.update = function () {
		console.log("Ripple update called");
		rippleGraphics.scaleX += self.growthRate;
		rippleGraphics.scaleY += self.growthRate;
		rippleGraphics.alpha -= self.fadeRate;
		console.log("Ripple scale:", rippleGraphics.scaleX, "Ripple alpha:", rippleGraphics.alpha);
		if (rippleGraphics.scaleX >= self.maxScale || rippleGraphics.alpha <= 0) {
			console.log("Ripple destroyed");
			self.destroy();
		}
	};
});
// Static respawn delay property
// Class for the water splash particles
var Splash = Container.expand(function () {
	var self = Container.call(this);
	var scale = Math.random() * 0.75 + 0.25;
	var splashGraphics = self.attachAsset('Watersplash', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: scale,
		scaleY: scale
	});
	self.speedX = Math.random() * 2 - 1; // Random speed in X direction
	self.speedY = -Math.random() * 5; // Random upward speed in Y direction
	self.gravity = 0.1; // Gravity to pull the particle down
	self.update = function () {
		self.x += self.speedX * gameSpeed;
		self.y += self.speedY * gameSpeed;
		self.speedY += self.gravity; // Apply gravity
		// Add rotation based on the speed of the particle
		self.rotation += self.speedX / 10;
		if (self.y > 2732) {
			// If the particle is below the screen
			self.destroy(); // Destroy the particle
		}
	};
});
// Class for the water
var Water = Container.expand(function () {
	var self = Container.call(this);
	var waterGraphics = self.attachAsset('Water', {
		anchorX: 0.5,
		anchorY: 0.7
	});
	self.speed = 2;
	self.update = function () {
		self.x -= self.speed * gameSpeed;
		// self.y = midgroundtrees1.y + midgroundtrees1.height / 2;
		if (self.x <= -self.width / 2) {
			self.x += self.width * 2;
		}
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000
});
/**** 
* Game Code
****/ 
Obstacle.getRandomDelay = function (min, max) {
	return Math.floor(Math.random() * (max - min + 1)) + min;
};
Obstacle.spawnDelay = 2500; // Default fallback
Obstacle.respawnDelay = {
	Eagle: Obstacle.getRandomDelay(2000, 3000),
	Duck: Obstacle.getRandomDelay(2000, 3000),
	Fish: Obstacle.getRandomDelay(2000, 3000) // Add Fish delay
};
Obstacle.lastDestroyTime = Date.now() - 5000; // Initialize to ensure first spawn check passes
console.log("Initial lastDestroyTime: " + Obstacle.lastDestroyTime);
var background = game.addChild(LK.getAsset('Background', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 2732 / 2,
	scaleX: 2048 / 2500,
	scaleY: 2732 / 2500
}));
// Initialize the midgroundtrees
var midgroundtrees1 = game.addChild(new Midgroundtrees());
midgroundtrees1.x = 2048 / 2;
midgroundtrees1.y = 2732 * 0.7;
var midgroundtrees2 = game.addChild(new Midgroundtrees());
midgroundtrees2.x = 2048 / 2 + midgroundtrees2.width;
midgroundtrees2.y = 2732 * 0.7;
// Initialize the water
var water1 = game.addChild(new Water());
water1.x = 2048 / 2;
water1.y = midgroundtrees1.y + midgroundtrees1.height / 2;
var water2 = game.addChild(new Water());
water2.x = 2048 / 2 + water2.width;
water2.y = midgroundtrees2.y + midgroundtrees2.height / 2;
// Initialize game variables
var coot = game.addChild(new Coot());
coot.x = 2048 * 0.20;
coot.y = 2732 * 0.75;
coot.originalY = coot.y; // Initialize originalY position
var gameSpeed = 1.5; // Global variable for game speed
var score = 0;
var currentObstacle = null;
// Initialize the foreground
var foreground1 = game.addChild(new Foreground());
foreground1.x = 2048 / 2;
foreground1.y = 2732 * 0.9;
var foreground2 = game.addChild(new Foreground());
foreground2.x = 2048 / 2 + foreground2.width;
foreground2.y = 2732 * 0.9;
var scoreTxt = new Text2('0', {
	size: 100,
	fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Handle game updates
game.update = function () {
	coot.update();
	if (LK.ticks % 60 == 0) {
		score++;
		scoreTxt.setText(score);
	}
	// Check for collision between the Coot and the Collision Block of the current obstacle
	if (currentObstacle && coot.intersects(currentObstacle.children[0])) {
		LK.showGameOver();
	}
	// Update the midgroundtrees
	midgroundtrees1.update();
	midgroundtrees2.update();
	// Update the water
	water1.update();
	water2.update();
	// Update the current obstacle
	// Check if the current obstacle needs destruction
	if (currentObstacle && currentObstacle.x < -currentObstacle.width / 2) {
		currentObstacle.destroy();
		Obstacle.lastDestroyTime = Date.now();
		console.log("Obstacle destroyed at " + Obstacle.lastDestroyTime);
		currentObstacle = null;
	}
	// Check if it's time to spawn a new obstacle
	if (!currentObstacle && Date.now() - Obstacle.lastDestroyTime >= Obstacle.spawnDelay) {
		var obstacleTypes = ['Duck', 'Duck', 'Duck', 'Eagle', 'Fish']; // Keep the spawn code with all types
		var randomIndex = Math.floor(Math.random() * obstacleTypes.length);
		var obstacleType = obstacleTypes[randomIndex];
		console.log("Selected obstacle type: ", obstacleType);
		currentObstacle = game.addChild(new Obstacle(obstacleType));
		currentObstacle.x = 2048 + currentObstacle.width / 2; // Ensure it starts off-screen
		currentObstacle.y = obstacleType === 'Duck' ? 2732 * 0.75 : obstacleType === 'Eagle' ? 2732 * 0.25 : 2732 * 0.85; // Changed from 0.90 to 0.85 for Fish
		console.log("Spawned " + obstacleType + " at " + Date.now());
	}
	if (currentObstacle) {
		currentObstacle.update();
	}
	// Update the foreground
	foreground1.update();
	foreground2.update();
};
// Handle touch events for jumping and diving
game.down = function (x, y, obj) {
	dragStartY = y; // Record the initial y position when touch starts
};
game.move = function (x, y, obj) {
	if (dragStartY !== null) {
		if (y - dragStartY > 50 && coot.y === coot.originalY) {
			// Check if the drag is downward and significant
			coot.dive();
			dragStartY = null; // Reset dragStartY to prevent repeated dives
		} else if (dragStartY - y > 50 && coot.y === coot.originalY) {
			// Check if the drag is upward and significant
			coot.jump();
			dragStartY = null; // Reset dragStartY to prevent repeated jumps
		}
	}
};
game.up = function (x, y, obj) {
	dragStartY = null; // Reset dragStartY when touch ends
}; ===================================================================
--- original.js
+++ change.js
@@ -510,9 +510,9 @@
 		var obstacleType = obstacleTypes[randomIndex];
 		console.log("Selected obstacle type: ", obstacleType);
 		currentObstacle = game.addChild(new Obstacle(obstacleType));
 		currentObstacle.x = 2048 + currentObstacle.width / 2; // Ensure it starts off-screen
-		currentObstacle.y = obstacleType === 'Duck' ? 2732 * 0.75 : obstacleType === 'Eagle' ? 2732 * 0.25 : 2732 * 0.90; // Ensure Fish has its initial Y position defined
+		currentObstacle.y = obstacleType === 'Duck' ? 2732 * 0.75 : obstacleType === 'Eagle' ? 2732 * 0.25 : 2732 * 0.85; // Changed from 0.90 to 0.85 for Fish
 		console.log("Spawned " + obstacleType + " at " + Date.now());
 	}
 	if (currentObstacle) {
 		currentObstacle.update();
:quality(85)/https://cdn.frvr.ai/672d4a7e56e2b270e20d3a22.png%3F3) 
 American Coot sprite sheet. Running with wings up.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/672d5ced56e2b270e20d3adc.png%3F3) 
 A beautiful blue sky background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/672d5de356e2b270e20d3b08.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/672d639956e2b270e20d3b54.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/672d692556e2b270e20d3b6c.png%3F3) 
 Grass and reeds foreground layer for endless runner. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/672d861494e7c5f16429b131.png%3F3) 
 White water bubble. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/672d939e94e7c5f16429b16d.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67303a794f50ce123beda2dd.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67303b294f50ce123beda2e7.png%3F3) 
 A mallard floating on the water. Looking left. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/67303beb4f50ce123beda2f2.png%3F3) 
 A swimming salmon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/67303d864f50ce123beda319.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67328cfd99d859c714b9aa88.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6732b90b23b0c2840965b09d.png%3F3) 
 A single golden coin with the head of an American Coot on it.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6732b9e823b0c2840965b0ac.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6734c741842c208e94e26d68.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67352219030cd5f2855653b4.png%3F3) 
 The sun. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/67353035030cd5f2855653fe.png%3F3) 
 Game icon for a video game called βCoot Runβ. Show an American Coot with its wings up and its foot big in the foreground. Show the name of the game big in the center with the coots foot underneath.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/67355738dc06d48e89b48cdf.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67355761dc06d48e89b48ce3.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6735578cdc06d48e89b48ce7.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67357674e267577b281025eb.png%3F3) 
 A moon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/67357a0ce267577b28102610.png%3F3) 
 A starry sky background image. High resolution. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/67358526800648ac9692c245.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67358551800648ac9692c249.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6735857b800648ac9692c24d.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67379d0d411506a6eb0ec317.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67382f37118e7af5e5d5abdb.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/673832ad118e7af5e5d5ac6e.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6738335f118e7af5e5d5ac7d.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6738aba43f0660887e4ffa8c.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6738ffc94a0b6c80a35ada5e.png%3F3) 
 A fiery Phoenix with wings outspread.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/673901504a0b6c80a35ada71.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67395228ac74a0fd82f72b80.png%3F3) 
 A dark blue rectangle background with rounded edges to place text on top of for a menu.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6740c9c6802a5529a0ba310d.png%3F3) 
 An owl with talons extended downwards and wings up. Looking down. Color Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6740d51c26b2737fb5eabeb2.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6741594493d27411d64bae64.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67cf9e447facb8bf217acec1.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67cfa17dcb2e8d59fa19523f.png%3F3) 
 A captainβs hat. Side profile. Cartoon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67cfa37161c0de76a2fd8806.png%3F3) 
 A rainbow hat with a propeller on the top. Side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67cfa9dcc3b58ac96c4e9625.png%3F3) 
 A striped beanie. Side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67cfac85c3b58ac96c4e963d.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67cfad43c3b58ac96c4e9658.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67cfb8c0c3b58ac96c4e9795.png%3F3) 
 A white SVG with big bold letters, that says βStartβ. A couple black feathers flying off the edge of the word. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67cfc043c3b58ac96c4e982b.png%3F3) 
 A white SVG with big bold letters, that says βHow to playβ. A couple black feathers flying off the edge of the word. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67cfc47e99e801d74f703de3.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67d06e7cb142d0802250d5f9.png%3F3) 
 A sombrero. Side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67d0719d070170f02a35eb20.png%3F3) 
 A knights helmet. Side view. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67d07880070170f02a35ebdb.png%3F3) 
 A horned Viking cap. Side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67d0c97066038ad16110365c.png%3F3) 
 An astronauts helmet. Side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67d0cfea9d3c1aa0ea2615eb.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67d0f0249d3c1aa0ea2616a1.png%3F3) 
 A cowboy hat. Full side profile. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
duck
Sound effect
eagle
Sound effect
fishsplash
Sound effect
jumpsound
Sound effect
dashsound
Sound effect
backgroundmusic
Music
coin
Sound effect
powerup
Sound effect
coothurt
Sound effect
owl
Sound effect
phoenix
Sound effect
alert
Sound effect
cootdive
Sound effect
whistle
Sound effect