Code edit (4 edits merged)
Please save this source code
User prompt
boss hitpoits and speed should be multiplied by its spawncount. staring always at 1
User prompt
add a counter on each boss to keep track of how many times it has spawned.
Code edit (1 edits merged)
Please save this source code
User prompt
after a level is complete, set its index of wave back to 0
User prompt
make sure boss2 and boss3 also move like boss1
User prompt
ensure currentwaveinde is rested to 0 at the start of each level
User prompt
when level change, check level, and start from first wave on that level
User prompt
when a level is restarted make sure enemy waves are also started again
User prompt
levels should be played in loop. when the first 3 levels are complete, number one should start again, but harder, and so should be the boss
User prompt
add 3 more levels
User prompt
when a new level starts increase speed of start in the background and enemies by 10%
User prompt
when boss3 is destroyed, start level 1 again.
Code edit (1 edits merged)
Please save this source code
User prompt
when diamond is collected play diamondcollect sound
User prompt
Please fix the bug: 'Timeout.tick error: Cannot read properties of undefined (reading 'children')' in or related to this line: 'enemies[j].children[0].tint = 0xffffff; // Revert tint back to white' Line Number: 1051
User prompt
when enemy2 and boss is hit, change tint for a millisecond
User prompt
enemy2 and boss should have a slight effect when hit
User prompt
flicker shoudl last shorter
User prompt
make flicker lighter
User prompt
make enemy2 and boss flicker when they are hit
User prompt
only apply shield when powerup3 is selected, not when powerup1 or powerup2 are
User prompt
remove wait for 2 seconds between boss is destroyed and powerup menu is shown
User prompt
only apply this last big explossion and flash to boss, not all other enemies
User prompt
make boss explossion way bigger and flashier
/**** 
* Classes
****/ 
var Boss = Container.expand(function () {
	var self = Container.call(this);
	var bossGraphics = self.attachAsset('boss1', {
		anchorX: 0.5,
		anchorY: 0.5
		// Removed tint for the boss
	});
	self.speed = 2;
	self.hitpoints = 10; // High hitpoints for the boss
	self.update = function () {
		self.x += Math.sin(LK.ticks / 30) * 5; // Sideways movement
		self.y += Math.cos(LK.ticks / 50) * 3; // Top-down movement
		self.x = Math.max(Math.min(self.x, 2048 - self.width / 2), self.width / 2); // Keep within screen bounds horizontally
		self.y = Math.max(Math.min(self.y, 2732 * 0.4), self.height / 2); // Keep within top 40% of the screen
		if (Math.sin(LK.ticks / 30) < 0) {
			self.scale.x = -1; // Mirror image when moving left
		} else {
			self.scale.x = 1; // Normal image when moving right
		}
		// Logic to increase and decrease boss size
		if (LK.ticks % 120 < 60) {
			self.scale.x += 0.001;
			self.scale.y += 0.001;
		} else {
			self.scale.x -= 0.001;
			self.scale.y -= 0.001;
		}
		if (LK.ticks % 120 == 0) {
			LK.getSound('bossbullet').play(); // Play bossbullet sound when Boss shoots BossBullet
			// Shoot bullets every second
			var newBullet = new BossBullet();
			newBullet.x = self.x;
			newBullet.y = self.y + self.height / 2;
			bullets.push(newBullet);
			game.addChild(newBullet);
		}
	};
});
var Boss2 = Container.expand(function () {
	var self = Container.call(this);
	var bossGraphics = self.attachAsset('boss2', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 2;
	self.hitpoints = 15; // Higher hitpoints for the second boss
	self.update = function () {
		self.x += Math.sin(LK.ticks / 30) * 5; // Sideways movement
		if (Math.sin(LK.ticks / 30) < 0) {
			self.scale.x = -1; // Mirror image when moving left
		} else {
			self.scale.x = 1; // Normal image when moving right
		}
		self.y = Math.min(self.y + self.speed, 2732 * 0.4); // Move to the top 40% of the screen
		if (LK.ticks % 120 < 60) {
			self.scale.x += 0.001;
			self.scale.y += 0.001;
		} else {
			self.scale.x -= 0.001;
			self.scale.y -= 0.001;
		}
		if (LK.ticks % 60 == 0) {
			LK.getSound('bossbullet').play(); // Play bossbullet sound when Boss2 shoots BossBullet2
			var newBullet = new BossBullet2();
			newBullet.x = self.x;
			newBullet.y = self.y + self.height / 2;
			bullets.push(newBullet);
			game.addChild(newBullet);
		}
	};
});
var Boss3 = Container.expand(function () {
	var self = Container.call(this);
	var bossGraphics = self.attachAsset('boss3', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 2;
	self.hitpoints = 20; // Higher hitpoints for the third boss
	self.update = function () {
		self.x += Math.sin(LK.ticks / 30) * 5; // Sideways movement
		if (Math.sin(LK.ticks / 30) < 0) {
			self.scale.x = -1; // Mirror image when moving left
		} else {
			self.scale.x = 1; // Normal image when moving right
		}
		self.y = Math.min(self.y + self.speed, 2732 * 0.4); // Move to the top 40% of the screen
		if (LK.ticks % 120 < 60) {
			self.scale.x += 0.001;
			self.scale.y += 0.001;
		} else {
			self.scale.x -= 0.001;
			self.scale.y -= 0.001;
		}
		if (LK.ticks % 90 == 0) {
			LK.getSound('bossbullet').play(); // Play bossbullet sound when Boss3 shoots BossBullet3
			var newBullet = new BossBullet3();
			newBullet.x = self.x;
			newBullet.y = self.y + self.height / 2;
			bullets.push(newBullet);
			game.addChild(newBullet);
		}
	};
});
var BossBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bossbullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5;
	self.update = function () {
		self.y += self.speed;
		self.rotation += 0.1; // Add rotation to the boss bullet
		// Logic to increase and decrease boss bullet size
		if (LK.ticks % 120 < 60) {
			self.scale.x += 0.001;
			self.scale.y += 0.001;
		} else {
			self.scale.x -= 0.001;
			self.scale.y -= 0.001;
		}
	};
});
var BossBullet2 = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bossbullet2', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5;
	self.update = function () {
		self.y += self.speed;
		self.rotation += 0.1; // Add rotation to the boss bullet
		// Logic to increase and decrease boss bullet size
		if (LK.ticks % 120 < 60) {
			self.scale.x += 0.001;
			self.scale.y += 0.001;
		} else {
			self.scale.x -= 0.001;
			self.scale.y -= 0.001;
		}
	};
});
var BossBullet3 = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('boss3bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5;
	self.update = function () {
		self.y += self.speed;
		self.rotation += 0.1; // Add rotation to the boss bullet
		if (LK.ticks % 120 < 60) {
			self.scale.x += 0.001;
			self.scale.y += 0.001;
		} else {
			self.scale.x -= 0.001;
			self.scale.y -= 0.001;
		}
	};
});
// Bullet class
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -5; // Default bullet speed, can be overridden
	self.update = function () {
		self.y += self.speed;
	};
});
// Diamond class
var Diamond = Container.expand(function () {
	var self = Container.call(this);
	var diamondGraphics = self.attachAsset('diamond', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 4;
	self.update = function () {
		self.y += self.speed;
		self.rotation += 0.05; // Add rotation animation
		if (LK.ticks % 120 < 60) {
			self.scale.x += 0.002;
			self.scale.y += 0.002;
		} else {
			self.scale.x -= 0.002;
			self.scale.y -= 0.002;
		}
		if (self.y > 2732) {
			self.destroy();
		}
	};
});
// Enemy class
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.attachAsset('block', {
		anchorX: 0.5,
		anchorY: 0.5,
		tint: 0xffffff // Default tint, will be overridden by wave configuration
	});
	self.speed = 3;
	self.hitpoints = 3; // Add hitpoints to enemies
	self.update = function () {
		// Update tint based on hitpoints
		if (self.hitpoints === 3) {
			self.children[0].tint = 0xff6666; // Red tint for 3 hitpoints
		} else if (self.hitpoints === 2) {
			self.children[0].tint = 0xcc66ff; // Purple tint for 2 hitpoints
		} else if (self.hitpoints === 1) {
			self.children[0].tint = 0xffe066; // Yellow tint for 1 hitpoint
		}
		self.y += self.speed;
		// Logic to increase and decrease block sizes
		if (LK.ticks % 120 < 60) {
			self.scale.x += 0.002;
			self.scale.y += 0.002;
		} else {
			self.scale.x -= 0.002;
			self.scale.y -= 0.002;
		}
		// Create and update hitpoints display
		if (!self.hitpointsDisplay) {
			self.hitpointsDisplay = new Text2(self.hitpoints.toString(), {
				size: 100,
				fill: "#ffffff",
				stroke: "#000000",
				strokeThickness: 5
			});
			self.hitpointsDisplay.anchor.set(0.5, 0.5);
			self.hitpointsDisplay.y = 0;
			self.addChild(self.hitpointsDisplay);
		} else if (LK.ticks % 10 === 0) {
			self.hitpointsDisplay.setText(self.hitpoints.toString());
		}
	};
});
var Enemy2 = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.attachAsset('enemy2', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 4; // Different speed for Enemy2
	self.hitpoints = 4; // Different hitpoints for Enemy2
	self.randomFactorX = Math.random() * 20 + 10; // Ensure a minimum value to reduce shakiness
	self.randomFactorY = Math.random() * 10 + 5; // Ensure a minimum value to reduce shakiness
	self.update = function () {
		self.y += self.speed;
		self.x += Math.sin(LK.ticks / (30 + self.randomFactorX)) * 5; // Add unique random sideways movement
		// Ensure Enemy2 changes direction when touching the sides
		if (self.x < self.width / 2) {
			self.x = self.width / 2;
			self.randomFactorX = Math.random() * 20 + 10; // Change direction smoothly
		} else if (self.x > 2048 - self.width / 2) {
			self.x = 2048 - self.width / 2;
			self.randomFactorX = -self.randomFactorX; // Change direction
		}
		// Logic to increase and decrease size
		if (LK.ticks % 120 < 60) {
			self.scale.x += 0.001;
			self.scale.y += 0.001;
		} else {
			self.scale.x -= 0.001;
			self.scale.y -= 0.001;
		}
		self.x += Math.sin(LK.ticks / (60 + self.randomFactorX)) * 5; // Smooth sideways movement
		self.y += Math.sin(LK.ticks / (30 + self.randomFactorY)) * 2; // Smooth bouncy movement
		if (self.y > 2732) {
			self.destroy();
		}
	};
});
//<Assets used in the game will automatically appear here>
// Fairy class
var Fairy = Container.expand(function () {
	var self = Container.call(this);
	var fairyGraphics = self.attachAsset('fairy', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	fairyGraphics.hitArea = new Rectangle(-fairyGraphics.width / 4, -fairyGraphics.height / 4, fairyGraphics.width / 2, fairyGraphics.height / 2); // Reduce hitbox area
	self.speed = 5;
	self.particles = [];
	self.update = function () {
		// Particle emitter logic
		if (LK.ticks % 5 === 0) {
			var particle = LK.getAsset('fairyemitter', {
				anchorX: 0.5,
				anchorY: 0.5,
				alpha: 1,
				scaleX: 12,
				scaleY: 12
			});
			particle.x = self.x + (self.scale.x === -1 ? 30 : -30);
			particle.y = self.y + self.height / 2;
			particle.speedX = (Math.random() - 0.5) * 2;
			particle.speedY = Math.random() * 2 + 1; // Push particles downwards
			particle.update = function () {
				this.x += this.speedX;
				this.y += this.speedY;
				this.alpha -= 0.01;
				if (this.alpha <= 0) {
					this.destroy();
				}
			};
			self.particles.push(particle);
			game.addChild(particle);
		}
		// Update existing particles
		for (var i = self.particles.length - 1; i >= 0; i--) {
			self.particles[i].update();
			if (self.particles[i].alpha <= 0) {
				self.particles.splice(i, 1);
			}
		}
		// Fairy movement logic
	};
});
var HeroBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 0.8
	});
	self.speed = -5;
	self.hitpoints = 1; // Add hitpoints property to HeroBullet
	self.update = function () {
		self.y += self.speed;
	};
});
var HeroBullet2 = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('herobullet2', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -8; // Different speed for HeroBullet2
	self.hitpoints = 1; // Different hitpoints for HeroBullet2
	self.update = function () {
		self.y += self.speed;
	};
});
var HeroBullet3 = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('herobullet3', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -5; // Different speed for HeroBullet3
	self.hitpoints = 2; // Different hitpoints for HeroBullet3
	self.update = function () {
		self.y += self.speed;
	};
});
// Powerup class
var Powerup = Container.expand(function () {
	var self = Container.call(this);
	var powerupGraphics = self.attachAsset('powerup', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 3;
	self.update = function () {
		self.y += self.speed;
		if (self.y > 2732) {
			self.destroy();
		}
	};
});
var PowerupMenu = Container.expand(function () {
	var self = Container.call(this);
	var screenGraphics = self.attachAsset('menu', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	screenGraphics.width = 1024 * 1.5; // Increase width by 50%
	screenGraphics.height = 1366 * 1.5; // Increase height by 50%
	screenGraphics.alpha = 0.7;
	screenGraphics.x = 2048 / 3 + 100;
	screenGraphics.y = 2732 / 3 + 50;
	var title = new Text2('', {
		size: 150,
		fill: "#ffffff",
		stroke: "#000000",
		strokeThickness: 5
	});
	title.anchor.set(0.5, 0.5);
	title.x = screenGraphics.x;
	title.y = screenGraphics.y - screenGraphics.height / 2 + 150;
	self.x = 2048 / 2 - screenGraphics.width / 2 - 500;
	self.y = 2732 / 2 - screenGraphics.height / 2 - 300;
	self.addChild(title);
	var powerup1 = LK.getAsset('powerup1', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	powerup1.x = screenGraphics.x - 300;
	powerup1.y = screenGraphics.y - 400;
	self.addChild(powerup1);
	powerup1.down = function (x, y, obj) {
		console.log("Powerup1 touched");
		if (diamondCount >= powerupCosts.powerup1) {
			diamondCount -= powerupCosts.powerup1;
			diamondCounterTxt.setText(diamondCount);
			heroFireRate = Math.max(5, heroFireRate - 5); // Increase fire rate when the first powerup is selected, but not less than 5
			isUsingHeroBullet3 = true; // Switch to HeroBullet3
			// Removed incorrect attachAsset call for HeroBullet3
			// Removed shield application from powerup1
			self.destroy(); // Close powerup menu
			isPowerupScreenActive = false;
			if (currentLevelIndex < levels.length - 1) {
				currentLevelIndex++;
				currentLevel = levels[currentLevelIndex];
			} else {
				currentLevelIndex = 0;
				currentLevel = levels[currentLevelIndex];
				levels.forEach(function (level) {
					level.waves.forEach(function (wave) {
						wave.hitpoints = wave.hitpoints.map(function (hitpoint) {
							return hitpoint * 2;
						});
						wave.speed = wave.speed ? wave.speed * 2 : 2; // Double the speed of enemies
					});
				});
				bullets.forEach(function (bullet) {
					bullet.speed *= 2; // Double the speed of bullets
				});
			}
		} else {
			var message = new Text2("I need ".concat(powerupCosts.powerup1 - diamondCount, " more diamonds for this powerup!"), {
				size: 100,
				fill: "#ffffff",
				stroke: "#000000",
				strokeThickness: 5
			});
			message.anchor.set(0.5, 1.0);
			message.x = 2048 / 2;
			message.y = 2732 - 50;
			game.addChild(message);
			LK.setTimeout(function () {
				message.destroy();
			}, 2000);
		}
	};
	var powerup1DiamondIcon = LK.getAsset('diamond', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 0.5,
		scaleY: 0.5
	});
	powerup1DiamondIcon.x = powerup1.x;
	powerup1DiamondIcon.y = powerup1.y + powerup1.height / 2 + 50;
	self.addChild(powerup1DiamondIcon);
	var powerup1Cost = new Text2('10', {
		size: 100,
		fill: "#ffffff",
		stroke: "#000000",
		strokeThickness: 5
	});
	powerup1Cost.anchor.set(0.5, 0);
	powerup1Cost.x = powerup1.x;
	powerup1Cost.y = powerup1DiamondIcon.y + powerup1DiamondIcon.height / 2 - 20;
	self.addChild(powerup1Cost);
	var powerup2 = LK.getAsset('powerup2', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	powerup2.x = screenGraphics.x;
	powerup2.y = screenGraphics.y - 400;
	self.addChild(powerup2);
	powerup2.down = function (x, y, obj) {
		console.log("Powerup2 touched");
		if (diamondCount >= powerupCosts.powerup2) {
			diamondCount -= powerupCosts.powerup2;
			diamondCounterTxt.setText(diamondCount);
			// Add action for powerup3
			shield = game.addChild(new Shield());
			shield = game.addChild(new Shield());
			isUsingHeroBullet2 = true; // Switch to HeroBullet2
			self.destroy(); // Close powerup menu
			isPowerupScreenActive = false;
			// Increase level when a powerup is selected
			if (currentLevelIndex < levels.length - 1) {
				currentLevelIndex++;
				currentLevel = levels[currentLevelIndex];
			} else {
				currentLevelIndex = 0;
				currentLevel = levels[currentLevelIndex];
			}
		} else {
			var message = new Text2("I need ".concat(powerupCosts.powerup2 - diamondCount, " more diamonds for this powerup!"), {
				size: 100,
				fill: "#ffffff",
				stroke: "#000000",
				strokeThickness: 5
			});
			message.anchor.set(0.5, 1.0);
			message.x = 2048 / 2;
			message.y = 2732 - 50;
			game.addChild(message);
			LK.setTimeout(function () {
				message.destroy();
			}, 2000);
		}
	};
	var powerup2DiamondIcon = LK.getAsset('diamond', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 0.5,
		scaleY: 0.5
	});
	powerup2DiamondIcon.x = powerup2.x;
	powerup2DiamondIcon.y = powerup2.y + powerup2.height / 2 + 50;
	self.addChild(powerup2DiamondIcon);
	var powerup2Cost = new Text2('20', {
		size: 100,
		fill: "#ffffff",
		stroke: "#000000",
		strokeThickness: 5
	});
	powerup2Cost.anchor.set(0.5, 0);
	powerup2Cost.x = powerup2.x;
	powerup2Cost.y = powerup2DiamondIcon.y + powerup2DiamondIcon.height / 2 - 20;
	self.addChild(powerup2Cost);
	var powerup3 = LK.getAsset('powerup3', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	powerup3.x = screenGraphics.x + 300;
	powerup3.y = screenGraphics.y - 400;
	self.addChild(powerup3);
	powerup3.down = function (x, y, obj) {
		console.log("Powerup3 touched");
		if (diamondCount >= powerupCosts.powerup3) {
			diamondCount -= powerupCosts.powerup3;
			diamondCounterTxt.setText(diamondCount);
			// Add action for powerup3
			shield = game.addChild(new Shield()); // Add shield when powerup3 is selected
			self.destroy(); // Close powerup menu
			isPowerupScreenActive = false;
			// Increase level when a powerup is selected
			if (currentLevelIndex < levels.length - 1) {
				currentLevelIndex++;
				currentLevel = levels[currentLevelIndex];
			} else {
				currentLevelIndex = 0;
				currentLevel = levels[currentLevelIndex];
			}
		} else {
			var message = new Text2("I need ".concat(powerupCosts.powerup3 - diamondCount, " more diamonds for this powerup!"), {
				size: 100,
				fill: "#ffffff",
				stroke: "#000000",
				strokeThickness: 5
			});
			message.anchor.set(0.5, 1.0);
			message.x = 2048 / 2;
			message.y = 2732 - 50;
			game.addChild(message);
			LK.setTimeout(function () {
				message.destroy();
			}, 2000);
		}
	};
	var powerup3DiamondIcon = LK.getAsset('diamond', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 0.5,
		scaleY: 0.5
	});
	powerup3DiamondIcon.x = powerup3.x;
	powerup3DiamondIcon.y = powerup3.y + powerup3.height / 2 + 50;
	self.addChild(powerup3DiamondIcon);
	var powerup3Cost = new Text2('30', {
		size: 100,
		fill: "#ffffff",
		stroke: "#000000",
		strokeThickness: 5
	});
	powerup3Cost.anchor.set(0.5, 0);
	powerup3Cost.x = powerup3.x;
	powerup3Cost.y = powerup3DiamondIcon.y + powerup3DiamondIcon.height / 2 - 20;
	self.addChild(powerup3Cost);
	var closeButton = new Text2('Not now!', {
		size: 100,
		fill: "#ffffff",
		stroke: "#000000",
		strokeThickness: 5
	});
	closeButton.anchor.set(0.5, 0.5);
	closeButton.x = screenGraphics.x;
	closeButton.y = screenGraphics.y + screenGraphics.height / 2 - 300;
	self.addChild(closeButton);
	closeButton.down = function (x, y, obj) {
		self.destroy(); // Close powerup menu
		isPowerupScreenActive = false;
		if (currentLevelIndex < levels.length - 1) {
			currentLevelIndex++;
			currentLevel = levels[currentLevelIndex];
		} else {
			// Reset to first level and double enemy hitpoints
			currentLevelIndex = 0;
			currentLevel = levels[currentLevelIndex];
			levels.forEach(function (level) {
				level.waves.forEach(function (wave) {
					wave.hitpoints = wave.hitpoints.map(function (hitpoint) {
						return hitpoint * 2;
					});
					wave.speed = wave.speed ? wave.speed * 2 : 2; // Double the speed of enemies
				});
			});
			bullets.forEach(function (bullet) {
				bullet.speed *= 2; // Double the speed of bullets
			});
		}
	};
	self.down = function (x, y, obj) {
		var localPos = self.toLocal(obj.global);
		if (powerup1.intersects(self.toLocal(obj.global)) || powerup2.intersects(self.toLocal(obj.global)) || powerup3.intersects(self.toLocal(obj.global))) {
			if (powerup1.intersects(self.toLocal(obj.global)) && diamondCount >= 10) {
				console.log("Powerup1 touched");
				diamondCount -= 10;
				diamondCounterTxt.setText(diamondCount);
				heroFireRate = Math.max(5, heroFireRate - 5); // Increase fire rate when the first powerup is selected, but not less than 5
				self.destroy(); // Close powerup menu
				isPowerupScreenActive = false;
			} else if (powerup2.intersects(self.toLocal(obj.global)) && diamondCount >= 20) {
				console.log("Powerup2 touched");
				diamondCount -= 20;
				diamondCounterTxt.setText(diamondCount);
				// Add action for powerup2
				HeroBullet.prototype.hitpoints += 1;
				self.destroy(); // Close powerup menu
				isPowerupScreenActive = false;
			} else if (powerup3.intersects(self.toLocal(obj.global)) && diamondCount >= 30) {
				console.log("Powerup3 touched");
				diamondCount -= 30;
				diamondCounterTxt.setText(diamondCount);
				// Add action for powerup3
				self.destroy(); // Close powerup menu
				isPowerupScreenActive = false;
			} else {
				var messageText = 'I need more shiny things!';
				if (powerup1.intersects(self.toLocal(obj.global)) && diamondCount < 10) {
					messageText = 'I need 10 diamonds for this powerup!';
				} else if (powerup2.intersects(self.toLocal(obj.global)) && diamondCount < 20) {
					messageText = 'I need 20 diamonds for this powerup!';
				} else if (powerup3.intersects(self.toLocal(obj.global)) && diamondCount < 30) {
					messageText = 'I need 30 diamonds for this powerup!';
				}
				var message = new Text2(messageText, {
					size: 100,
					fill: "#ff0000",
					stroke: "#000000",
					strokeThickness: 5
				});
				message.anchor.set(0.5, 0.5);
				message.x = 2048 / 2;
				message.y = 2732 / 2;
				game.addChild(message);
				LK.setTimeout(function () {
					message.destroy();
				}, 2000);
			}
		} else if (closeButton.intersects(self.toLocal(obj.global))) {
			self.destroy(); // Close powerup menu
			isPowerupScreenActive = false;
			if (currentLevelIndex < levels.length) {
				currentLevelIndex++;
				currentLevel = levels[currentLevelIndex];
			}
		}
	};
});
var Shield = Container.expand(function () {
	var self = Container.call(this);
	var shieldGraphics = self.attachAsset('shield', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 0.5
	});
	self.update = function () {
		self.x = fairy.x;
		self.y = fairy.y;
		self.zIndex = fairy.zIndex + 1; // Ensure shield is rendered on top of fairy
	};
});
// Star class
var Star = Container.expand(function () {
	var self = Container.call(this);
	var starGraphics = self.attachAsset('star', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5;
	self.update = function () {
		self.y += self.speed;
		if (self.y > 2732) {
			self.y = -5;
			self.x = Math.random() * 2048;
		}
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x800080 //Init game with purple background
});
/**** 
* Game Code
****/ 
// Configuration for powerup costs
var powerupCosts = {
	powerup1: 10,
	powerup2: 20,
	powerup3: 30
};
var Level = function Level(config, levelNumber) {
	this.waves = config.waves;
	this.currentWaveIndex = 0;
	this.boss = config.boss;
	this.levelNumber = levelNumber;
};
Level.prototype.getNextWave = function () {
	if (this.currentWaveIndex < this.waves.length) {
		return this.waves[this.currentWaveIndex++];
	} else {
		return null;
	}
};
Level.prototype.hasBoss = function () {
	return this.boss && this.currentWaveIndex >= this.waves.length;
};
var levels = [new Level({
	waves: [{
		enemies: 3,
		hitpoints: [1],
		tints: [0xffe066]
		/**** 
		}, {
		enemies: 6,
		hitpoints: [2, 1],
		tints: [0xcc66ff, 0xffe066]
		}, {
		enemies: 9,
		hitpoints: [3, 2, 1],
		tints: [0xff6666, 0xcc66ff, 0xffe066]
		****/ 
	}],
	boss: true
}, 1), new Level({
	waves: [{
		enemies: 4,
		hitpoints: [2],
		tints: [0x66ff66]
	}, {
		enemies: 8,
		hitpoints: [3, 2],
		tints: [0x66ccff, 0x66ff66]
	}, {
		enemies: 12,
		hitpoints: [4, 3, 2],
		tints: []
	}],
	boss: true
}, 2), new Level({
	waves: [{
		enemies: 5,
		hitpoints: [3],
		tints: [0xff9933]
	}, {
		enemies: 10,
		hitpoints: [4, 3],
		tints: [0xffcc00, 0xff9933]
	}, {
		enemies: 12,
		hitpoints: [5, 4, 3],
		tints: [0xff6600, 0xffcc00, 0xff9933]
	}],
	boss: true
}, 3)];
var currentLevelIndex = 0;
var currentLevel = levels[currentLevelIndex];
// Initialize variables
var isUsingHeroBullet2 = false; // Flag to track if HeroBullet2 is being used
var isUsingHeroBullet3 = false; // Flag to track if HeroBullet3 is being used
var fairy;
var bullets = [];
var enemies = [];
var scoreTxt;
var score = 0;
var dragNode = null;
var heroFireRate = 30; // Default fire rate for hero bullets
var defaultHeroFireRate = 30; // Store the default fire rate
var diamondCount = 100; // Initialize diamond counter with 999 diamonds
var diamondCounterTxt; // Declare diamondCounterTxt variable
var isFairyHeld = false; // Track if the fairy is being held
var shield = null; // Initialize shield variable
var isPowerupScreenActive = false; // Track if the powerup screen is active
var waveCount = 0; // Track the wave count
var waveConfig = [{
	enemies: 3,
	hitpoints: [1],
	tints: [0xffe066]
}
/**** , {
enemies: 6,
hitpoints: [2, 1],
tints: [0xcc66ff, 0xffe066]
}
, {
enemies: 9,
hitpoints: [3, 2, 1],
tints: [0xff6666, 0xcc66ff, 0xffe066]
}
****/ 
// Add more wave configurations as needed
];
// Initialize game elements
function initGame() {
	// Play background music on loop
	var backgroundMusic = LK.getSound('backgroundmusic');
	backgroundMusic.loop = true;
	backgroundMusic.play();
	// Create and position the fairy
	fairy = game.addChild(new Fairy());
	fairy.particles = [];
	fairy.x = 2048 / 2;
	fairy.y = 2732 - 400;
	// Create score text
	scoreTxt = new Text2('0', {
		size: 200,
		fill: "#ffffff",
		stroke: "#000000",
		strokeThickness: 5
	});
	scoreTxt.anchor.set(0.5, 0); // Anchor to the top center
	scoreTxt.x = 2048 / 2; // Position at the top center of the screen
	scoreTxt.y = 20; // Position with a margin from the top
	for (var i = 0; i < 30; i++) {
		var star = game.addChild(new Star());
		star.x = Math.random() * 2048;
		star.y = Math.random() * 2732;
	}
	scoreTxt.anchor.set(0.5, 0);
	// Create coin counter text
	game.addChild(scoreTxt);
	// Create coin counter text
	// Removed menu background from the top of the screen where score and diamonds are
	var diamondCounterContainer = new Container();
	var diamondIcon = LK.getAsset('diamond', {
		anchorX: 1,
		anchorY: 0,
		alpha: 0.8,
		scaleX: 1.4,
		scaleY: 1.4
	});
	diamondIcon.x = 2048 - 100;
	diamondIcon.y = 20;
	diamondCounterContainer.addChild(diamondIcon);
	diamondCounterTxt = new Text2('0', {
		size: 120,
		fill: "#ffffff",
		stroke: "#000000",
		strokeThickness: 5
	});
	diamondCounterTxt.anchor.set(0.5, 0.5);
	diamondCounterTxt.x = diamondIcon.x + diamondIcon.width / 2 - 230;
	diamondCounterTxt.y = diamondIcon.y + diamondIcon.height / 2 + 15;
	diamondCounterContainer.addChild(diamondCounterTxt);
	game.addChild(diamondCounterContainer);
	// Set up game event listeners
	game.down = function (x, y, obj) {
		dragNode = fairy;
		isFairyHeld = true; // Set isFairyHeld to true when the fairy is held
	};
	game.up = function (x, y, obj) {
		dragNode = null;
		isFairyHeld = false; // Set isFairyHeld to false when the fairy is released
	};
	game.move = handleMove;
	// Update game every tick
	game.update = updateGame;
}
// Handle move events
function handleMove(x, y, obj) {
	if (dragNode) {
		// Check if the fairy is moving to the right
		if (x > dragNode.x) {
			// Mirror the fairy image
			dragNode.scale.x = -1;
		} else {
			// Reset the fairy image
			dragNode.scale.x = 1;
		}
		// Create a ghost image of the fairy when it moves every other frame
		if (LK.ticks % 4 === 0) {
			var ghostFairy = LK.getAsset('fairy', {
				anchorX: 0.5,
				anchorY: 0.5,
				alpha: 0.3
			});
			ghostFairy.x = dragNode.x;
			ghostFairy.y = dragNode.y;
			if (dragNode.parent === game) {
				game.addChildAt(ghostFairy, game.getChildIndex(dragNode));
			} else {
				game.addChild(ghostFairy);
			}
			if (dragNode.scale.x === -1) {
				ghostFairy.scale.x = -1;
			}
			// Remove the ghost image after 0.5 seconds
			LK.setTimeout(function () {
				ghostFairy.destroy();
			}, 250);
		}
		dragNode.x += (x - dragNode.x) * 0.1;
		if (y > 2732 * 0.6) {
			dragNode.y += (y - dragNode.y) * 0.1;
		} else {
			dragNode.y += (2732 * 0.6 - dragNode.y) * 0.1;
		}
	}
}
// Update game logic
function updateGame() {
	// Check if background music is playing, if not, play it
	var backgroundMusic = LK.getSound('backgroundmusic');
	if (!backgroundMusic.isPlaying) {
		backgroundMusic.play();
	}
	if (currentLevel) {
		console.log("Current Level:", currentLevel.levelNumber);
	} else {
		console.log("Current Level: undefined");
	}
	// Update starfield
	for (var i = game.children.length - 1; i >= 0; i--) {
		if (game.children[i] instanceof Star) {
			game.children[i].update();
		}
		if (game.children[i] instanceof Diamond && game.children[i].intersects(fairy)) {
			game.children[i].destroy();
			diamondCount++;
			diamondCounterTxt.setText(diamondCount);
		}
	}
	// Update bullets
	for (var i = bullets.length - 1; i >= 0; i--) {
		if (bullets[i] instanceof Bullet) {
			bullets[i].update();
		}
		bullets[i].update();
		if (bullets[i].y < -50) {
			bullets[i].destroy();
			bullets.splice(i, 1);
		}
	}
	for (var j = enemies.length - 1; j >= 0; j--) {
		enemies[j].update();
		if (enemies[j].y > 2732 + 50) {
			enemies[j].destroy();
			enemies.splice(j, 1);
		}
		if (shield && shield.intersects(enemies[j])) {
			shield.destroy();
			LK.getSound('boom').play(); // Play boom sound when shield is destroyed
			shield = null;
			enemies[j].destroy();
			enemies.splice(j, 1);
		} else if (fairy.intersects(enemies[j])) {
			var fairyX = fairy.x;
			var fairyY = fairy.y;
			// Create particle effect for fairy
			for (var p = 0; p < 10; p++) {
				var particle = LK.getAsset('star', {
					anchorX: 0.5,
					anchorY: 0.5,
					alpha: 1
				});
				particle.x = fairyX;
				particle.y = fairyY;
				particle.speedX = (Math.random() - 0.5) * 10;
				particle.speedY = (Math.random() - 0.5) * 10;
				particle.update = function () {
					this.x += this.speedX;
					this.y += this.speedY;
					this.alpha -= 0.02;
					if (this.alpha <= 0) {
						this.destroy();
					}
				};
				game.addChild(particle);
			}
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
		}
		for (var k = bullets.length - 1; k >= 0; k--) {
			if ((bullets[k] instanceof HeroBullet || bullets[k] instanceof HeroBullet2 || bullets[k] instanceof HeroBullet3) && bullets[k].intersects(enemies[j])) {
				LK.getSound('hit').play(); // Play hit sound when HeroBullet, HeroBullet2, or HeroBullet3 is destroyed
				bullets[k].destroy();
				bullets.splice(k, 1);
				enemies[j].hitpoints -= bullets[k] instanceof HeroBullet2 ? 2 : bullets[k] instanceof HeroBullet3 ? 3 : 1;
				if (enemies[j].hitpoints <= 0) {
					var enemyX = enemies[j].x;
					var enemyY = enemies[j].y;
					// Create particle effect
					for (var p = 0; p < 50; p++) {
						var particle = LK.getAsset('star', {
							anchorX: 0.5,
							anchorY: 0.5,
							alpha: 1,
							scaleX: 4,
							scaleY: 4,
							tint: enemies[j].children[0].tint
						});
						particle.x = enemyX;
						particle.y = enemyY;
						particle.speedX = (Math.random() - 0.5) * 20;
						particle.speedY = (Math.random() - 0.5) * 20;
						particle.update = function () {
							this.x += this.speedX;
							this.y += this.speedY;
							this.alpha -= 0.01;
							if (this.alpha <= 0) {
								this.destroy();
							}
						};
						game.addChild(particle);
					}
					enemies[j].destroy();
					LK.getSound('boom').play();
					if (enemies[j] instanceof Boss || enemies[j] instanceof Boss2 || enemies[j] instanceof Boss3) {
						LK.effects.flashScreen(0xff0000, 1000); // Flash screen red for 1 second
						var powerupMenu = new PowerupMenu();
						powerupMenu.x = 2048 / 2 - powerupMenu.width / 2;
						powerupMenu.y = 2732 / 2 - powerupMenu.height / 2;
						game.addChild(powerupMenu);
						isPowerupScreenActive = true;
					}
					enemies.splice(j, 1);
					if (enemies[j]) {
						score += enemies[j].hitpoints * 10;
					}
					scoreTxt.setText(score);
					var dropChance = Math.random();
					if (dropChance < 0.2) {
						var newDiamond = new Diamond();
						newDiamond.x = enemyX;
						newDiamond.y = enemyY;
						game.addChild(newDiamond);
					} else if (dropChance < 0.2) {
						var newPowerup = new Powerup();
						newPowerup.x = enemyX;
						newPowerup.y = enemyY;
						game.addChild(newPowerup);
					}
				}
				break;
			}
		}
	}
	// Check for collisions
	// Check for coin collection
	for (var i = game.children.length - 1; i >= 0; i--) {
		if (game.children[i] instanceof Diamond && game.children[i].intersects(fairy)) {
			game.children[i].destroy();
			diamondCount++;
			diamondCounterTxt.setText('Diamonds: ' + diamondCount);
		}
	}
	for (var k = bullets.length - 1; k >= 0; k--) {
		for (var l = enemies.length - 1; l >= 0; l--) {
			if ((bullets[k] instanceof HeroBullet || bullets[k] instanceof HeroBullet3) && bullets[k].intersects(enemies[l])) {
				LK.getSound('hit').play(); // Play hit sound when HeroBullet or HeroBullet3 is destroyed
				bullets[k].destroy();
				bullets.splice(k, 1);
				enemies[l].hitpoints -= bullets[k] instanceof HeroBullet3 ? 3 : 1;
				if (enemies[l].hitpoints <= 0) {
					var enemyX = enemies[l].x;
					var enemyY = enemies[l].y;
					enemies[l].destroy();
					LK.getSound('boom').play();
					enemies.splice(l, 1);
					if (enemies[l]) {
						score += enemies[l].hitpoints * 10;
					}
					scoreTxt.setText(score);
					// Randomly drop coins or powerups
					var dropChance = Math.random();
					if (dropChance < 0.2) {
						var newDiamond = new Diamond();
						newDiamond.x = enemyX;
						newDiamond.y = enemyY;
						game.addChild(newDiamond);
					} else if (dropChance < 0.2) {
						var newPowerup = new Powerup();
						newPowerup.x = enemyX;
						newPowerup.y = enemyY;
						game.addChild(newPowerup);
					}
				}
				break;
			}
		}
	}
	// Spawn new bullets
	if (LK.ticks % heroFireRate == 0 && isFairyHeld) {
		// Only spawn new bullets if the fairy is being held
		var newBullet;
		if (isUsingHeroBullet3) {
			newBullet = new HeroBullet3();
			newBullet.attachAsset('herobullet3', {
				anchorX: 0.5,
				anchorY: 0.5
			});
		} else if (isUsingHeroBullet2) {
			newBullet = new HeroBullet2();
			newBullet.attachAsset('herobullet2', {
				anchorX: 0.5,
				anchorY: 0.5
			});
		} else {
			newBullet = new HeroBullet();
		}
		newBullet.x = fairy.x;
		newBullet.y = fairy.y - fairy.height / 2;
		bullets.push(newBullet);
		game.addChild(newBullet);
		// Play shoot sound when a HeroBullet is shot
		LK.getSound('shoot').play();
	}
	// Spawn new enemies in a line
	if (LK.ticks % 600 == 0 && !isPowerupScreenActive) {
		if (enemies.length === 0) {
			waveCount++;
		}
		if (currentLevel) {
			var currentWave = currentLevel.getNextWave();
			if (currentWave) {
				var maxEnemiesPerLine = 3;
				var enemySpacing = 2048 / (maxEnemiesPerLine + 1); // Adjust spacing to center enemies
				var totalRows = Math.ceil(currentWave.enemies / maxEnemiesPerLine);
				for (var i = 0; i < currentWave.enemies; i++) {
					var newBlock = new Enemy();
					var row = Math.floor(i / maxEnemiesPerLine);
					newBlock.hitpoints = currentWave.hitpoints[row] || currentWave.hitpoints[currentWave.hitpoints.length - 1];
					newBlock.x = i % maxEnemiesPerLine * enemySpacing + enemySpacing / 2 - newBlock.width / 2;
					newBlock.y = row * 220 - 50; // Increase row spacing by 20 pixels
					newBlock.children[0].tint = currentWave.tints[row] || currentWave.tints[currentWave.tints.length - 1];
					enemies.push(newBlock);
					game.addChild(newBlock);
				}
				// Spawn Enemy2 based on the level number after the wave with a delay of 5 seconds
				LK.setTimeout(function () {
					for (var i = 0; i < currentLevel.levelNumber; i++) {
						var newEnemy2 = new Enemy2();
						newEnemy2.x = Math.random() * 2048;
						newEnemy2.y = -newEnemy2.height;
						enemies.push(newEnemy2);
						game.addChild(newEnemy2);
					}
				}, 5000);
				// Center the rows of enemies
				var totalWidth = (Math.min(currentWave.enemies, maxEnemiesPerLine) - 1) * enemySpacing;
				var offsetX = (2048 - totalWidth) / 2;
				for (var j = 0; j < enemies.length; j++) {
					enemies[j].x += offsetX - enemies[j].width / 2;
				}
			} else if (currentLevel.hasBoss() && enemies.length === 0) {
				var boss;
				if (currentLevel.levelNumber === 3) {
					boss = new Boss3();
				} else if (currentLevel.levelNumber === 2) {
					boss = new Boss2();
				} else {
					boss = new Boss();
				}
				boss.x = 2048 / 2;
				boss.y = -boss.height;
				enemies.push(boss);
				game.addChild(boss);
				LK.getSound('bossappear').play(); // Play bossappear sound when Boss is spawned
				LK.effects.flashScreen(0xffffff, 500); // Flash screen white for 500ms
				LK.setTimeout(function () {
					LK.effects.flashScreen(0xffffff, 500); // Flash screen white again for 500ms
				}, 600); // Delay the second flash by 600ms to allow a brief pause
			}
		}
	}
}
// Initialize the game
initGame(); ===================================================================
--- original.js
+++ change.js
@@ -1045,15 +1045,13 @@
 					enemies[j].destroy();
 					LK.getSound('boom').play();
 					if (enemies[j] instanceof Boss || enemies[j] instanceof Boss2 || enemies[j] instanceof Boss3) {
 						LK.effects.flashScreen(0xff0000, 1000); // Flash screen red for 1 second
-						LK.setTimeout(function () {
-							var powerupMenu = new PowerupMenu();
-							powerupMenu.x = 2048 / 2 - powerupMenu.width / 2;
-							powerupMenu.y = 2732 / 2 - powerupMenu.height / 2;
-							game.addChild(powerupMenu);
-							isPowerupScreenActive = true;
-						}, 2000); // Wait for 2 seconds before showing the powerup menu
+						var powerupMenu = new PowerupMenu();
+						powerupMenu.x = 2048 / 2 - powerupMenu.width / 2;
+						powerupMenu.y = 2732 / 2 - powerupMenu.height / 2;
+						game.addChild(powerupMenu);
+						isPowerupScreenActive = true;
 					}
 					enemies.splice(j, 1);
 					if (enemies[j]) {
 						score += enemies[j].hitpoints * 10;
:quality(85)/https://cdn.frvr.ai/66b31a03d23a7fddab9a62a3.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66b646291219c7e7899ea5b5.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66b64c391219c7e7899ea60f.png%3F3) 
 8-bit. cartoon. white star.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/66b65aba1219c7e7899ea64e.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66b664a01219c7e7899ea6c6.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66b73c30b97cf4096a70eadf.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66bb15c11219c7e7899eb124.png%3F3) 
 cartoon 8 bit fairy dust. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/66bc4954b9f48fd53cb0c9c8.png%3F3) 
 Cartoon, 8bit, fireball. Black border. Cicular.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/66bcc12cb9f48fd53cb0ca72.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66bcdbf1b9f48fd53cb0ca8b.png%3F3) 
 cartoon, 8 bit, shield. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/66bcf397b97cf4096a70efef.png%3F3) 
 8bit, cartoon, axe. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/66bd2fd7b97cf4096a70f069.png%3F3) 
 dark electric ball, 8bit, cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/66bd3695b97cf4096a70f0a2.png%3F3) 
 8bit, cartoon, treasure chest frame. very big empty center. only a fine border of chest. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/66bd9c911219c7e7899eb5ca.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66bda37c1219c7e7899eb5f7.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/66bde7fb28397410fcb63df2.png%3F3)