User prompt
make enemy2 randmon movement less shaky
User prompt
when various enemy2 are spawned, have them move randomly and not have the same movement
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of undefined (setting 'randomOffsetX')' in or related to this line: 'self.randomOffsetX = Math.random() * 100; // Random offset for X movement' Line Number: 1159
User prompt
when various enemy2 are spawned, have them move randomly and not have the same movement
User prompt
make sure boss3 asset and boss3bullet assets are used for boss annd bullets on level 3
User prompt
create a boss3 asset for boss3 level and also create boss3bullet
User prompt
use boss mirror image when it moves to the left
User prompt
make sure that if the player selects a powerup or closes the menu with the close button, either way, it will only always increase one in the level counter.
User prompt
flash screen white twice when boss is spawned
User prompt
play bossappear sound when boss is spawned
User prompt
reduce frequency of boss bullet
Code edit (1 edits merged)
Please save this source code
User prompt
when boss shoots bossbullet play bossbullet
Code edit (1 edits merged)
Please save this source code
User prompt
on tick check if backtound music is playing if not play
User prompt
on game start play backgroundmusic on loop
User prompt
when an enemy is hit by a herobullet play hit
User prompt
when an enemy is destroyed play boom
User prompt
when a herobullet is shot, play shoot
User prompt
make sure level is increased when a powerup is selected
User prompt
also increase level on powerup screen when a powerup is selected as well as when its closed
User prompt
each level should spanwn as many enemy2 after a waves as the level number. so level1 will spanw them by one, level 2 two, and so on
User prompt
also when all levels are complete and it is starting again from first level, make everything faster
User prompt
when all levels are complete, start agan from first level, but double the previous run hitpoins for enemies.
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'levelNumber')' in or related to this line: 'console.log("Current Level:", currentLevel.levelNumber);' Line Number: 791
/**** * 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 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 // 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 self.y += Math.sin(LK.ticks / (15 + self.randomFactorY)) * 2; // Add unique random bouncy movement // 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 / (30 + self.randomFactorX)) * 5; // Add unique random sideways movement self.y += Math.sin(LK.ticks / (15 + self.randomFactorY)) * 2; // Add unique random 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 }); 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 }); self.speed = -5; self.hitpoints = 1; // Add hitpoints property to HeroBullet 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; // Adjust width to half of the screen width screenGraphics.height = 1366; // Adjust height to half of the screen height screenGraphics.alpha = 0.8; screenGraphics.x = 2048 / 4; screenGraphics.y = 2732 / 4; var title = new Text2('Powerup Shop', { 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; self.addChild(title); var powerup1 = LK.getAsset('powerup1', { anchorX: 0.5, anchorY: 0.5 }); powerup1.x = screenGraphics.x - 300; powerup1.y = screenGraphics.y + 100; self.addChild(powerup1); powerup1.down = function (x, y, obj) { console.log("Powerup1 touched"); if (diamondCount >= 10) { 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; 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 }); } } else { var message = new Text2('I need 10 diamonds for this powerup!', { 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); } }; 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 + 20; 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 + 100; self.addChild(powerup2); powerup2.down = function (x, y, obj) { console.log("Powerup2 touched"); if (diamondCount >= 20) { diamondCount -= 20; diamondCounterTxt.setText(diamondCount); // Add action for powerup2 HeroBullet.prototype.hitpoints += 1; 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 20 diamonds for this powerup!', { 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); } }; 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 + 20; 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 + 100; self.addChild(powerup3); powerup3.down = function (x, y, obj) { console.log("Powerup3 touched"); if (diamondCount >= 30) { diamondCount -= 30; diamondCounterTxt.setText(diamondCount); // Add action for powerup3 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 30 diamonds for this powerup!', { 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); } }; 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 + 20; 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('Close', { 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 - 100; 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]; } } }; }); // 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 ****/ 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 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 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 var overlay = LK.getAsset('menu', { width: 2048, height: 250, color: 0x000000, alpha: 0.5, anchorX: 0.5, anchorY: 0 }); overlay.x = 2048 / 2; overlay.y = 0; game.addChild(overlay); 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 (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].intersects(enemies[j])) { LK.getSound('hit').play(); bullets[k].destroy(); bullets.splice(k, 1); enemies[j].hitpoints--; if (enemies[j].hitpoints <= 0) { var enemyX = enemies[j].x; var enemyY = enemies[j].y; // Create particle effect for (var p = 0; p < 20; p++) { var particle = LK.getAsset('star', { anchorX: 0.5, anchorY: 0.5, alpha: 1, scaleX: 2, scaleY: 2, tint: enemies[j].children[0].tint }); particle.x = enemyX; particle.y = enemyY; 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); } enemies[j].destroy(); LK.getSound('boom').play(); if (enemies[j] instanceof Boss || enemies[j] instanceof Boss2) { var powerupMenu = new PowerupMenu(); powerupMenu.x = 2048 / 2 - powerupMenu.width / 2; powerupMenu.y = 2732 / 2 - powerupMenu.height / 2; game.addChild(powerupMenu); isPowerupScreenActive = true; // Removed level increase when boss is destroyed } 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].intersects(enemies[l])) { bullets[k].destroy(); bullets.splice(k, 1); enemies[l].hitpoints--; 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 = 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
@@ -248,14 +248,14 @@
anchorY: 0.5
});
self.speed = 4; // Different speed for Enemy2
self.hitpoints = 4; // Different hitpoints for Enemy2
- self.randomFactorX = Math.random() * 20;
- self.randomFactorY = Math.random() * 10;
+ 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 + Math.random() * 20)) * 5; // Add random sideways movement
- self.y += Math.sin(LK.ticks / (15 + Math.random() * 10)) * 2; // Add random bouncy movement
+ self.x += Math.sin(LK.ticks / (30 + self.randomFactorX)) * 5; // Add unique random sideways movement
+ self.y += Math.sin(LK.ticks / (15 + self.randomFactorY)) * 2; // Add unique random bouncy movement
// Logic to increase and decrease size
if (LK.ticks % 120 < 60) {
self.scale.x += 0.001;
self.scale.y += 0.001;
8-bit. cartoon. white star.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
cartoon 8 bit fairy dust. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Cartoon, 8bit, fireball. Black border. Cicular.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
cartoon, 8 bit, shield. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
8bit, cartoon, axe. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
dark electric ball, 8bit, cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
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.