User prompt
only double bullets hitpoint when increase damage is seleceted
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'length')' in or related to this line: 'var optionGraphics = self.attachAsset(assetId, {' Line Number: 175
User prompt
replace increase health for shield up
User prompt
when power up increase daamage is selected, the add 1 to bullet damage
User prompt
add a value to how many hitpoints bullet take from enemies. it should start in 1.
User prompt
do not trigger spanwnxwave twice
User prompt
after upgrade screen, multiply hitpoins of blocks by 2
User prompt
do not add hitpoints to next wave until an upgrade is selected
User prompt
set all powerups o cost 0 diamons initially will update this later
User prompt
move conitnue without powerup button to hhe bottom of the screen
User prompt
make sure waves keep spawning after poweup screen is gone
User prompt
when powerup menu is shown, also add a button to continue without buying any powerup
User prompt
Please fix the bug: 'ReferenceError: cost is not defined' in or related to this line: 'if (diamondCount >= cost) {' Line Number: 194
User prompt
increase fire rate shoudl cost 1 diamond
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'length')' in or related to this line: 'var optionGraphics = self.attachAsset(assetId, {' Line Number: 176
User prompt
powerups will cost diamonds to purchase
User prompt
if increase fire damage is selected double the damage bullets do to enemies
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'damage')' in or related to this line: 'enemies[j].hitpoints -= bullets[k].damage;' Line Number: 479
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'damage')' in or related to this line: 'enemies[j].hitpoints -= bullets[k].damage;' Line Number: 479
User prompt
when increase damage is selected, then bullets hit points multiply by 2
User prompt
make sure waves keep appearing after an upgrade is selected
User prompt
when the upgrade button is touched, remove menu and apply upgrade
User prompt
each updagre should have their own button
User prompt
remove menu from top of the screen
User prompt
on touch select uppgrade
/****
* Classes
****/
// 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 () {
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());
}
};
});
//<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;
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
};
});
// 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();
}
};
});
// 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;
}
};
});
var UpgradeOption = Container.expand(function (text, onClick) {
var self = Container.call(this);
var optionGraphics = self.attachAsset('menu', {
anchorX: 0.5,
anchorY: 0.5
});
var optionText = new Text2(text, {
size: 100,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 5
});
optionText.anchor.set(0.5, 0.5);
self.addChild(optionText);
self.interactive = true;
self.on('down', function (x, y, obj) {
onClick();
});
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x800080 //Init game with purple background
});
/****
* Game Code
****/
function showUpgradeOptions() {
var options = [{
text: "Increase Fire Rate",
onClick: function onClick() {
increaseFireRate();
}
}, {
text: "Increase Damage",
onClick: function onClick() {
increaseDamage();
}
}, {
text: "Increase Health",
onClick: function onClick() {
increaseHealth();
}
}];
var optionSpacing = 300;
for (var i = 0; i < options.length; i++) {
var option = new UpgradeOption(options[i].text, options[i].onClick);
var button = LK.getAsset('menu', {
anchorX: 0.5,
anchorY: 0.5,
width: 500,
height: 200,
color: 0x0000ff
});
button.x = 2048 / 2;
button.y = 2732 / 2 - optionSpacing + i * optionSpacing;
option.x = button.x;
option.y = button.y;
game.addChild(button);
game.addChild(option);
}
}
function increaseFireRate() {
// Logic to increase fire rate
bulletSpawnRate = Math.max(10, bulletSpawnRate - 5); // Increase fire rate by decreasing spawn rate interval
game.paused = false;
updateGame(); // Resume game and spawn next wave
}
function increaseDamage() {
// Logic to increase damage
game.paused = false;
updateGame(); // Resume game and spawn next wave
}
function increaseHealth() {
// Logic to increase health
game.paused = false;
updateGame(); // Resume game and spawn next wave
}
// Initialize variables
var bulletSpawnRate = 30; // Default bullet spawn rate
var fairy;
var bullets = [];
var enemies = [];
var scoreTxt;
var score = 0;
var dragNode = null;
var diamondCount = 0; // Initialize diamond counter
var diamondCounterTxt; // Declare diamondCounterTxt variable
var isFairyHeld = false; // Track if the fairy is being held
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() {
// Create and position the fairy
fairy = game.addChild(new Fairy());
fairy.particles = [];
fairy.x = 2048 / 2;
fairy.y = 2732 - 200;
// 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);
}
// 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() {
// 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].intersects(enemies[j])) {
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();
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].intersects(enemies[l]) && !(enemies[l] instanceof Boss)) {
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();
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 % bulletSpawnRate == 0 && isFairyHeld) {
// Only spawn new bullets if the fairy is being held
var newBullet = new Bullet();
newBullet.x = fairy.x;
newBullet.y = fairy.y - fairy.height / 2;
bullets.push(newBullet);
game.addChild(newBullet);
}
// Spawn new enemies in a line
if (LK.ticks % 600 == 0) {
if (enemies.length === 0) {
waveCount++;
}
if (waveCount <= waveConfig.length || enemies.length === 0) {
if (waveCount > waveConfig.length) {
waveCount = 1; // Reset wave count to 1 if all waves are complete
// Add 1 hit point to each enemy
for (var i = 0; i < waveConfig.length; i++) {
for (var j = 0; j < waveConfig[i].hitpoints.length; j++) {
waveConfig[i].hitpoints[j]++;
}
}
// Pause the game and show upgrade options
game.paused = true;
showUpgradeOptions();
return; // Prevent spawning new waves until an upgrade is chosen
}
var currentWave = waveConfig[waveCount - 1];
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);
}
// 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;
}
}
}
}
// 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