User prompt
enemy2 should sligtlhy shake when hit by a bulle
User prompt
when enemy2 is hit by a bullet it should change its tint to yellow, for a tenth of a second and then go back to white
User prompt
yellos tint on enemy should last one milisecond
User prompt
change enemy2 tint to yellow for a milisecond when hit by a bullet
Code edit (3 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Timeout.tick error: Cannot set properties of undefined (setting 'alpha')' in or related to this line: 'enemies[j].alpha = 1;' Line Number: 1213
User prompt
add a very very tiny flicker to enemy2 and boss when hit by a bullet. but very minos
User prompt
backround music should start playing every 10 seconds
User prompt
make sure bakcroundmusic is finished playing before starting it agai
User prompt
waves should spawn every 12 seconds
User prompt
once enemy2 spanws it shoudl not be affect by threshold
User prompt
enemy2 position shoudl not be impacted by enemy spawning
User prompt
prevent enemy2 from doing a starnge jump when the next wave spawns
User prompt
enemy2 should slowly move in the direction of the fairy but always keep downwards speed until it is offscreen
User prompt
update enemy2 movement make it smoother
User prompt
enemy2 is still getting to close to borders of screen, make movement better
User prompt
enemy2 should not stay moving next to a side of the screen, if stuck it should move to the opposite side for at least 2 seconds and then go back to random
User prompt
replace Not Now, for Maybe next time!
Code edit (1 edits merged)
Please save this source code
User prompt
play yes when an upgrade is purchased instead of hooray
Code edit (1 edits merged)
Please save this source code
User prompt
play hooray when boss is destroyed
User prompt
fix performace on bosses bullet shooting
Code edit (1 edits merged)
Please save this source code
User prompt
boss2 should not shoot two bullets together
/****
* Classes
****/
// Global counter for Boss spawns
var Boss = Container.expand(function () {
var self = Container.call(this);
bossSpawnCount++; // Increment the counter each time a Boss is spawned
var bossGraphics = self.attachAsset('boss1', {
anchorX: 0.5,
anchorY: 0.5
// Removed tint for the boss
});
self.speed = 2 * bossSpawnCount;
self.hitpoints = 15 * bossSpawnCount; // High hitpoints for the boss
self.update = function () {
self.x += Math.sin(LK.ticks / 30) * (5 + bossSpeedIncrement); // Sideways movement
self.y += Math.cos(LK.ticks / 50) * 3; // Top-down movement
self.x = Math.max(Math.min(self.x, 2048 + self.width * 0.25), -self.width * 0.25); // Allow part of the body outside the screen 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 % 60 == 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);
self.hasActiveBullet = true;
}
};
});
// Global counter for Boss2 spawns
var Boss2 = Container.expand(function () {
var self = Container.call(this);
boss2SpawnCount++; // Increment the counter each time a Boss2 is spawned
var bossGraphics = self.attachAsset('boss2', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3 * boss2SpawnCount;
self.hitpoints = 25 * boss2SpawnCount; // Higher hitpoints for the second boss
self.update = function () {
self.x += Math.sin(LK.ticks / 30) * (5 + bossSpeedIncrement); // Sideways movement
self.y += Math.cos(LK.ticks / 50) * 3; // Top-down movement
self.x = Math.max(Math.min(self.x, 2048 + self.width * 0.25), -self.width * 0.25); // Allow part of the body outside the screen 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
}
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 % 30 == 0 && !self.hasActiveBullet) {
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);
self.hasActiveBullet = true;
}
};
});
// Global counter for Boss3 spawns
var Boss3 = Container.expand(function () {
var self = Container.call(this);
boss3SpawnCount++; // Increment the counter each time a Boss3 is spawned
var bossGraphics = self.attachAsset('boss3', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4 * boss3SpawnCount;
self.hitpoints = 35 * boss3SpawnCount; // Higher hitpoints for the third boss
self.update = function () {
self.x += Math.sin(LK.ticks / 30) * (5 + bossSpeedIncrement); // Sideways movement
self.y += Math.cos(LK.ticks / 50) * 3; // Top-down movement
self.x = Math.max(Math.min(self.x, 2048 + self.width * 0.25), -self.width * 0.25); // Allow part of the body outside the screen 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
}
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 % 45 == 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);
self.hasActiveBullet = true;
}
};
});
var BossBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bossbullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5.5; // Increase speed by 10%
self.update = function () {
self.y += self.speed;
self.rotation += 0.1; // Add rotation to the boss bullet
if (self.y > 2732 + 50) {
self.destroy();
bullets.splice(bullets.indexOf(self), 1);
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] instanceof Boss) {
enemies[i].hasActiveBullet = false;
break;
}
}
}
// 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 = 6;
self.update = function () {
self.y += self.speed;
self.rotation += 0.1; // Add rotation to the boss bullet
if (self.y > 2732 + 50) {
self.destroy();
bullets.splice(bullets.indexOf(self), 1);
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] instanceof Boss2) {
enemies[i].hasActiveBullet = false;
break;
}
}
}
// 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 = 7;
self.update = function () {
self.y += self.speed;
self.rotation += 0.1; // Add rotation to the boss bullet
if (self.y > 2732 + 50) {
self.destroy();
bullets.splice(bullets.indexOf(self), 1);
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] instanceof Boss3) {
enemies[i].hasActiveBullet = false;
break;
}
}
}
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.3; // Increase speed by 10%
self.hitpoints = 3; // Add hitpoints to enemies
self.update = function () {
// Update tint based on hitpoints
if (self.hitpoints === 12) {
self.children[0].tint = 0x9400D3; // Dark Violet tint for 12 hitpoints
} else if (self.hitpoints === 11) {
self.children[0].tint = 0x4B0082; // Indigo tint for 11 hitpoints
} else if (self.hitpoints === 10) {
self.children[0].tint = 0x0000FF; // Blue tint for 10 hitpoints
} else if (self.hitpoints === 9) {
self.children[0].tint = 0x00FF00; // Green tint for 9 hitpoints
} else if (self.hitpoints === 8) {
self.children[0].tint = 0x00FFFF; // Cyan tint for 8 hitpoints
} else if (self.hitpoints === 7) {
self.children[0].tint = 0xFF7F00; // Orange tint for 7 hitpoints
} else if (self.hitpoints === 6) {
self.children[0].tint = 0xFF0000; // Red tint for 6 hitpoints
} else if (self.hitpoints === 5) {
self.children[0].tint = 0xFFCC00; // Light Orange tint for 5 hitpoints
} else if (self.hitpoints === 4) {
self.children[0].tint = 0xFF3333; // Stronger Red tint for 4 hitpoints
} else if (self.hitpoints === 3) {
self.children[0].tint = 0xFF6666; // Light Red tint for 3 hitpoints
} else if (self.hitpoints === 2) {
self.children[0].tint = 0xCC66FF; // Light Purple tint for 2 hitpoints
} else if (self.hitpoints === 1) {
self.children[0].tint = 0xFFE066; // Light 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.4; // Increase speed by 10%
self.hitpoints = 5; // 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 / (60 + self.randomFactorX)) * 5; // Smooth sideways movement
self.y += Math.sin(LK.ticks / (60 + self.randomFactorY)) * 2; // Smooth bouncy movement
self.x = Math.max(Math.min(self.x, 2048 - self.width / 2), self.width / 2); // Ensure Enemy2 stays within horizontal limits
if (self.y > 2732 + self.height / 2) {
self.destroy();
}
// 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;
}
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 = -5; // Different speed for HeroBullet2
self.hitpoints = 2; // 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 = -8; // Different speed for HeroBullet3
self.hitpoints = 1; // Set base damage for HeroBullet3 to 1
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) {
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
HeroBullet.prototype.speed -= 0.3; // Increase bullet speed by 1
isUsingHeroBullet2 = false; // Ensure HeroBullet2 is not used
HeroBullet2.prototype.speed = -8; // Reset HeroBullet2 speed
LK.getSound('hooray').play(); // Play hooray sound when powerup1 is purchased
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
});
}
currentLevel.currentWaveIndex = 0; // Reset the current wave index to start from the first wave
} else {
LK.getSound('nono').play(); // Play nono sound when player can't purchase powerup1
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('5', {
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) {
if (diamondCount >= powerupCosts.powerup2) {
diamondCount -= powerupCosts.powerup2;
diamondCounterTxt.setText(diamondCount);
// Add action for powerup3
isUsingHeroBullet2 = true; // Switch to HeroBullet2
isUsingHeroBullet3 = false; // Ensure HeroBullet3 is not used
// HeroBullet.prototype.speed = -5; // Reset HeroBullet speed
heroFireRate = Math.max(5, heroFireRate - 5); // Increase fire rate when the second powerup is selected, but not less than 5
HeroBullet2.prototype.hitpoints *= 1.2; // Increase hit points by 20%
LK.getSound('hooray').play(); // Play hooray sound when powerup2 is purchased
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];
levels.forEach(function (level) {
level.waves.forEach(function (wave) {
wave.hitpoints = wave.hitpoints.map(function (hitpoint) {
return hitpoint * 1.2; // Increase hitpoints by 20%
});
wave.speed = wave.speed ? wave.speed * 1.5 : 1.5; // Increase speed by 50%
});
});
bullets.forEach(function (bullet) {
bullet.speed *= 1.5; // Increase bullet speed by 50%
});
}
} else {
LK.getSound('nono').play(); // Play nono sound when player can't purchase powerup2
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('5', {
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) {
if (diamondCount >= powerupCosts.powerup3) {
diamondCount -= powerupCosts.powerup3;
diamondCounterTxt.setText(diamondCount);
// Add action for powerup3
shield = game.addChild(new Shield()); // Add shield only when powerup3 is selected
LK.getSound('hooray').play(); // Play hooray sound when powerup3 is purchased
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 {
LK.getSound('nono').play(); // Play nono sound when player can't purchase powerup3
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('10', {
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 >= 5) {
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 >= 5) {
diamondCount -= 20;
diamondCounterTxt.setText(diamondCount);
// Add action for powerup2
self.destroy(); // Close powerup menu
isPowerupScreenActive = false;
} else if (powerup3.intersects(self.toLocal(obj.global)) && diamondCount >= 10) {
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 < 5) {
messageText = 'I need 5 diamonds for this powerup!';
} else if (powerup2.intersects(self.toLocal(obj.global)) && diamondCount < 5) {
messageText = 'I need 5 diamonds for this powerup!';
} else if (powerup3.intersects(self.toLocal(obj.global)) && diamondCount < 10) {
messageText = 'I need 10 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];
} 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
});
}
currentLevel.currentWaveIndex = 0; // Reset the current wave index to start from the first wave
}
};
});
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 bossSpawnCount = 0;
var boss2SpawnCount = 0;
var boss3SpawnCount = 0;
var bossSpeedIncrement = 0; // Global variable to track boss speed increment
var powerupCosts = {
powerup1: 5,
powerup2: 5,
powerup3: 10
};
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: [0xcc66ff, 0xffe066]
}, {
enemies: 9,
hitpoints: [4, 3, 2],
tints: [0xcc66ff, 0xffe066]**/
}],
boss: true
}, 1), new Level({
waves: [{
enemies: 6,
hitpoints: [4, 3],
tints: [0x66ff66]
}, {
enemies: 9,
hitpoints: [5, 4, 3],
tints: [0x66ccff, 0x66ff66]
}, {
enemies: 9,
hitpoints: [5, 4, 3],
tints: [0x66ccff, 0x66ff66]
}, {
enemies: 9,
hitpoints: [6, 5, 4],
tints: [0x66ccff, 0x66ff66]
}],
boss: true
}, 2), new Level({
waves: [{
enemies: 9,
hitpoints: [7, 6, 5],
tints: [0xff9933]
}, {
enemies: 9,
hitpoints: [8, 7, 6],
tints: [0xffcc00, 0xff9933]
}, {
enemies: 9,
hitpoints: [10, 9, 8],
tints: [0xff6600, 0xffcc00, 0xff9933]
}, {
enemies: 9,
hitpoints: [12, 10, 8],
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 = 0; // Initialize diamond counter with 0 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 deathSoundPlayed = false; // Flag to track if the death sound has been played
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 'letsgo' sound one second after the game starts
LK.setTimeout(function () {
LK.getSound('letsgo').play();
}, 1000);
// 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 < 50; 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 && fairy.parent) {
// 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.5) {
dragNode.y += (y - dragNode.y) * 0.1;
} else {
dragNode.y += (2732 * 0.5 - 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 (LK.ticks % 300 === 0) {
// Every 5 seconds (300 ticks at 60FPS)
bossSpeedIncrement += 1; // Increase boss speed increment
}
if (currentLevel) {} else {}
// 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);
LK.getSound('diamondcollect').play(); // Play diamondcollect sound when a diamond is collected
}
}
// 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] && 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();
score += enemies[j].hitpoints * 10; // Add points based on enemy hitpoints
scoreTxt.setText(score); // Update score text
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 < 5; p++) {
var particle = LK.getAsset('star', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1,
scaleX: 4,
scaleY: 4,
tint: Math.random() < 0.5 ? 0xffb6c1 : 0x98fb98 // Softer Pink or Green tint
});
particle.x = fairyX;
particle.y = fairyY;
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);
}
// Play death sound and destroy fairy asset when destroyed by enemy
if (!deathSoundPlayed) {
LK.getSound('death').play();
deathSoundPlayed = true;
}
fairy.speed = 0; // Stop fairy movement
fairy.destroy();
dragNode = null; // Prevent dragging the fairy ghost
// Destroy all fairy ghosts
for (var i = game.children.length - 1; i >= 0; i--) {
if (game.children[i].alpha === 0.3 && game.children[i].width === fairy.width && game.children[i].height === fairy.height) {
game.children[i].destroy();
}
}
LK.setTimeout(function () {
LK.showGameOver();
}, 2000);
}
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] instanceof Enemy2 ? 0x000000 : 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) {
score += 200; // Add 200 points when a boss is destroyed
}
if (enemies[j] instanceof Boss || enemies[j] instanceof Boss2 || enemies[j] instanceof Boss3) {
bossSpeedIncrement = 0; // Reset boss speed increment when a boss is killed
LK.effects.flashScreen(0xff0000, 1000); // Flash screen red for 1 second
// Destroy all boss bullets
for (var b = bullets.length - 1; b >= 0; b--) {
if (bullets[b] instanceof BossBullet || bullets[b] instanceof BossBullet2 || bullets[b] instanceof BossBullet3) {
bullets[b].destroy();
bullets.splice(b, 1);
}
}
var powerupMenu = new PowerupMenu();
powerupMenu.x = 2048 / 2 - powerupMenu.width / 2;
powerupMenu.y = 2732 / 2 - powerupMenu.height / 2;
game.addChild(powerupMenu);
isPowerupScreenActive = true;
score += 200; // Add 200 points when a boss is destroyed
}
if (enemies[j] instanceof Enemy2) {
score += 50; // Add 50 points when an Enemy2 is destroyed
}
enemies.splice(j, 1);
if (enemies[j]) {
if (enemies[j] instanceof Boss || enemies[j] instanceof Boss2 || enemies[j] instanceof Boss3) {
score += enemies[j].hitpoints * 10;
} else {
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;
} else if ((bullets[k] instanceof BossBullet || bullets[k] instanceof BossBullet2 || bullets[k] instanceof BossBullet3) && bullets[k].intersects(fairy)) {
if (shield) {
shield.destroy();
LK.getSound('boom').play(); // Play boom sound when shield is destroyed
shield = null;
} else {
var fairyX = fairy.x;
var fairyY = fairy.y;
// Create particle effect for fairy
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: Math.random() < 0.5 ? 0xffb6c1 : 0x98fb98 // Softer Pink or Green tint
});
particle.x = fairyX;
particle.y = fairyY;
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.02;
if (this.alpha <= 0) {
this.destroy();
}
};
game.addChild(particle);
}
// Play death sound and destroy fairy asset when destroyed by BossBullet
if (!deathSoundPlayed) {
LK.getSound('death').play();
deathSoundPlayed = true;
}
fairy.speed = 0; // Stop fairy movement
fairy.destroy();
dragNode = null; // Prevent dragging the fairy ghost
// Destroy all fairy ghosts
for (var i = game.children.length - 1; i >= 0; i--) {
if (game.children[i].alpha === 0.3 && game.children[i].width === fairy.width && game.children[i].height === fairy.height) {
game.children[i].destroy();
}
}
LK.setTimeout(function () {
LK.showGameOver();
}, 2000);
}
bullets[k].destroy();
bullets.splice(k, 1);
}
}
}
// 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; // Add points based on enemy hitpoints
}
scoreTxt.setText(score); // Update score text
// 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 = -newBlock.height - row * 220; // Spawn offscreen and start appearing down from the top
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 - 100; // Spawn offscreen and start appearing down from the top
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 - 100; // Spawn offscreen and start appearing down from the top
boss.hitpoints *= 1.5; // Increase boss hitpoints by 50%
boss.speed *= 1.5; // Increase boss speed by 50%
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();
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.
shoot
Sound effect
boom
Sound effect
Hit
Sound effect
backgroundmusic
Sound effect
bossbullet
Sound effect
bossappear
Sound effect
hit
Sound effect
diamondcollect
Sound effect
hooray
Sound effect
nono
Sound effect
letsgo
Sound effect
death
Sound effect
yes
Sound effect