User prompt
Dont start any wave after wave 50. Also when the boss is dead remove the boss fight music
User prompt
Remove the aimbot from the player’s bullets
User prompt
Play the bgSound when it is 1-49 wave
User prompt
When you beat the kendrick Lamar (the boss) a text message appears on the screen with a sound asset saying “YOU DID IT” and after 10 seconds the text disappears and a new text appears saying “NOW GET OUT!” And takes player back to the main menu after 5 seconds ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
play the bossFightMusic when its wave 50
User prompt
add the bgSound when it is wave 1-49
User prompt
remove the original background music and add a new boss fight music at wave 50
User prompt
remove the original background music and add a new boss fight music at wave 50, also add a sound when kendrick lamar is in the main game
User prompt
also add kendrick lamar image asset
User prompt
add image assets for, money sniffer, roonie and kendrick lamar
User prompt
when it is wave 50, remove all enemies and add a huge enemy called Kendrick Lamar and write "HE IS HERE" on top of screen. it has 3000000 HP
User prompt
when its wave 45+ add a new enemy called Roonie it has 50000 HP
User prompt
change his name to money sniffer
User prompt
when player clicks the boss fight mode boss buttons, it takes you to the city with only the player and the boss
User prompt
Little Jew has 30000 HP roonie has 40000 HP Kendrick Lamar Has 100000 HP
User prompt
and make the boss very very big but slow ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
boss fight has only one enemy and it is the boss fight bosses.
User prompt
no just remove the wave system. add diffuculties back
User prompt
remove the wave system from boss fight menu
User prompt
add Little Jew, Roonie and Kendrick Lamar as the boss fight modes and put image asset for them also put thheir images on the boss fight mode menu on top of their mode
User prompt
add a menu for boss fight mode
User prompt
make spaces it and tutorial text too
User prompt
more space
User prompt
make spaces between boss fight button and admin mode button in main menu
User prompt
add a new game mod to the main menu named boss fight
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.damage = 5;
self.update = function () {
self.y -= self.speed;
};
return self;
});
var GeorgeDropd = Container.expand(function () {
var self = Container.call(this);
var georgeDroydGraphics = self.attachAsset('georgeDropd', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 30000;
self.health = self.maxHealth;
self.speed = 0.3;
self.coinValue = 100;
self.lastHealth = self.health;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health < 0) self.health = 0;
};
self.update = function () {
self.y += self.speed;
// Flash red when taking damage
if (self.lastHealth > self.health) {
LK.effects.flashObject(self, 0xff0000, 300);
}
self.lastHealth = self.health;
};
return self;
});
var GeorgeFloyd = Container.expand(function () {
var self = Container.call(this);
var georgeFloydGraphics = self.attachAsset('georgeFloyd', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 5000;
self.health = self.maxHealth;
self.speed = 0.8;
self.coinValue = 20;
self.lastHealth = self.health;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health < 0) self.health = 0;
};
self.update = function () {
self.y += self.speed;
// Flash red when taking damage
if (self.lastHealth > self.health) {
LK.effects.flashObject(self, 0xff0000, 300);
}
self.lastHealth = self.health;
};
return self;
});
var KendrickLamar = Container.expand(function () {
var self = Container.call(this);
var kendrickGraphics = self.attachAsset('kendrickLamar', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 3000000;
self.health = self.maxHealth;
self.speed = 0.1;
self.coinValue = 1000;
self.lastHealth = self.health;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health < 0) self.health = 0;
};
self.update = function () {
self.y += self.speed;
// Flash red when taking damage
if (self.lastHealth > self.health) {
LK.effects.flashObject(self, 0xff0000, 300);
}
self.lastHealth = self.health;
};
return self;
});
var LaserBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('laserBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 30; // Faster laser bullets
self.damage = 300; // Base damage at level 1
self.laserLevel = 1; // Default level
self.velocityX = 0;
self.velocityY = 0;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Mango = Container.expand(function () {
var self = Container.call(this);
var mangoGraphics = self.attachAsset('mango', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 100;
self.health = self.maxHealth;
self.speed = 2;
self.coinValue = 1;
self.lastHealth = self.health;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health < 0) self.health = 0;
};
self.update = function () {
self.y += self.speed;
// Flash red when taking damage
if (self.lastHealth > self.health) {
LK.effects.flashObject(self, 0xff0000, 300);
}
self.lastHealth = self.health;
};
return self;
});
var Mustard = Container.expand(function () {
var self = Container.call(this);
var mustardGraphics = self.attachAsset('mustard', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 200;
self.health = self.maxHealth;
self.speed = 1.5;
self.coinValue = 2;
self.lastHealth = self.health;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health < 0) self.health = 0;
};
self.update = function () {
self.y += self.speed;
// Flash red when taking damage
if (self.lastHealth > self.health) {
LK.effects.flashObject(self, 0xff0000, 300);
}
self.lastHealth = self.health;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
return self;
});
var RPGBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('rpgRocket', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12; // Slower than other towers
self.damage = 5000; // Base damage at level 1
self.rpgLevel = 1; // Default level
self.velocityX = 0;
self.velocityY = 0;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Roonie = Container.expand(function () {
var self = Container.call(this);
var roonieGraphics = self.attachAsset('roonie', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 50000;
self.health = self.maxHealth;
self.speed = 0.2;
self.coinValue = 200;
self.lastHealth = self.health;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health < 0) self.health = 0;
};
self.update = function () {
self.y += self.speed;
// Flash red when taking damage
if (self.lastHealth > self.health) {
LK.effects.flashObject(self, 0xff0000, 300);
}
self.lastHealth = self.health;
};
return self;
});
var SigmaBlud = Container.expand(function () {
var self = Container.call(this);
var sigmaBludGraphics = self.attachAsset('sigmaBlud', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 10000;
self.health = self.maxHealth;
self.speed = 0.5;
self.coinValue = 50;
self.lastHealth = self.health;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health < 0) self.health = 0;
};
self.update = function () {
self.y += self.speed;
// Flash red when taking damage
if (self.lastHealth > self.health) {
LK.effects.flashObject(self, 0xff0000, 300);
}
self.lastHealth = self.health;
};
return self;
});
var SixSevenKid = Container.expand(function () {
var self = Container.call(this);
var kidGraphics = self.attachAsset('sixSevenKid', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 500;
self.health = self.maxHealth;
self.speed = 1;
self.coinValue = 5;
self.lastHealth = self.health;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health < 0) self.health = 0;
};
self.update = function () {
self.y += self.speed;
// Flash red when taking damage
if (self.lastHealth > self.health) {
LK.effects.flashObject(self, 0xff0000, 300);
}
self.lastHealth = self.health;
};
return self;
});
var TurretBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('turretBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 25; // Much faster bullets for quicker targeting
self.damage = 5;
self.turretLevel = 1; // Default level
self.velocityX = 0;
self.velocityY = 0;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x8B0000
});
/****
* Game Code
****/
// Game variables
var player;
var bullets = [];
var enemies = [];
var coins = 0;
var playerHealth = 100;
var gameStarted = false;
var showMainMenu = true;
var isAdminMode = false;
var enemySpawnTimer = 0;
var enemySpawnRate = 120; // frames between spawns
var difficultyTimer = 0;
var isMouseDown = false;
var mouseX = 0;
var mouseY = 0;
var shootCooldown = 0;
var shootRate = 10; // frames between shots when holding
var currentWave = 0; // Start at 0 so first wave becomes 1
var enemiesInWave = 8; // Start with 8 enemies per wave
var enemiesSpawned = 0;
var enemiesKilled = 0;
var waveInProgress = false;
var waveStartDelay = 180; // 3 seconds between waves
var waveDelayTimer = 0;
var upgrade1Cost = 1;
var upgrade2Cost = 3;
var upgrade3Cost = 2000;
var upgrade4Cost = 5000;
var upgrade1Level = 0;
var upgrade2Level = 0;
var upgrade3Level = 0;
var upgrade4Level = 0;
// Turret damage and cost progression tables
var turretDamageTable = [0, 5, 10, 15, 20, 25, 30, 40, 50, 100, 200];
var turret1CostTable = [0, 1, 1, 2, 5, 10, 50, 50, 60, 200, 250];
var turret2CostTable = [0, 3, 4, 5, 10, 20, 50, 60, 70, 250, 300];
var laserDamageTable = [0, 300, 400, 800, 1000, 1500, 2000, 2500, 3000, 4000, 5000];
var laserCostTable = [0, 500, 700, 900, 1000, 1300, 1500, 3000, 4000, 6000, 8000];
var rpgDamageTable = [0, 5000, 6000, 8000, 10000, 15000, 20000, 25000, 30000, 40000, 50000];
var rpgCostTable = [0, 5000, 7000, 9000, 10000, 13000, 15000, 20000, 25000, 30000, 35000];
var turrets1 = [];
var turrets2 = [];
var turrets3 = [];
var turrets4 = [];
var turretBullets = [];
var turretShootTimer1 = 0;
var turretShootTimer2 = 0;
var turretShootTimer3 = 0;
var turretShootTimer4 = 0;
var turretShootRate = 15; // Faster turret shooting rate
var rpgShootRate = 45; // Slower RPG shooting rate
// Create city background
var cityBuildings = [];
for (var i = 0; i < 12; i++) {
var buildingType = Math.floor(Math.random() * 3) + 1;
var building = LK.getAsset('cityBuilding' + buildingType, {
anchorX: 0.5,
anchorY: 1
});
building.x = i * 180 + 100;
building.y = 2732;
building.alpha = 0.3;
game.addChild(building);
cityBuildings.push(building);
}
;
// Main Menu Background
var menuBackground = LK.getAsset('menuBackground', {
anchorX: 0.5,
anchorY: 0.5
});
menuBackground.x = 2048 / 2;
menuBackground.y = 2732 / 2;
menuBackground.alpha = 0.8;
game.addChild(menuBackground);
// Start menu music
LK.playMusic('menuMusic', {
loop: true
});
// Main Menu Elements
var menuTitle = new Text2('MANGO SHOOTER', {
size: 120,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 4
});
menuTitle.anchor.set(0.5, 0.5);
menuTitle.x = 2048 / 2;
menuTitle.y = 2732 / 2 - 400;
game.addChild(menuTitle);
var startButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
startButton.x = 2048 / 2;
startButton.y = 2732 / 2 - 200;
startButton.tint = 0x4CAF50;
game.addChild(startButton);
var startButtonText = new Text2('START GAME', {
size: 40,
fill: 0xFFFFFF,
font: "Futura",
stroke: 0x000000,
strokeThickness: 3
});
startButtonText.anchor.set(0.5, 0.5);
startButtonText.x = startButton.x;
startButtonText.y = startButton.y;
game.addChild(startButtonText);
var adminButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
adminButton.x = 2048 / 2;
adminButton.y = 2732 / 2 + 80;
adminButton.tint = 0xFF4444;
game.addChild(adminButton);
var adminButtonText = new Text2('ADMIN MODE', {
size: 40,
fill: 0xFFFFFF,
font: "Futura",
stroke: 0x000000,
strokeThickness: 3
});
adminButtonText.anchor.set(0.5, 0.5);
adminButtonText.x = adminButton.x;
adminButtonText.y = adminButton.y;
game.addChild(adminButtonText);
var instructionText = new Text2('Tap to shoot enemies\nUpgrade turrets with coins\nDefend your city!', {
size: 80,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 3
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 2048 / 2;
instructionText.y = 2732 / 2 + 500;
game.addChild(instructionText);
// Create player
player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 - 150;
player.visible = false;
// UI Elements
var coinText = new Text2('Coins: 0', {
size: 60,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 3
});
coinText.anchor.set(0, 0);
coinText.x = 150;
coinText.y = 50;
coinText.visible = false;
LK.gui.topLeft.addChild(coinText);
// Admin button in bottom left corner
var adminCornerButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.6,
scaleY: 0.6
});
adminCornerButton.x = 150;
adminCornerButton.y = 2732 - 150;
adminCornerButton.tint = 0xFF4444;
adminCornerButton.visible = false;
game.addChild(adminCornerButton);
var adminCornerText = new Text2('ADMIN', {
size: 24,
fill: 0xFFFFFF,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
adminCornerText.anchor.set(0.5, 0.5);
adminCornerText.x = adminCornerButton.x;
adminCornerText.y = adminCornerButton.y;
adminCornerText.visible = false;
game.addChild(adminCornerText);
// Admin menu overlay
var adminMenu = new Container();
adminMenu.visible = false;
game.addChild(adminMenu);
// Admin menu background
var adminMenuBg = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 8,
scaleY: 12
});
adminMenuBg.x = 2048 / 2;
adminMenuBg.y = 2732 / 2;
adminMenuBg.tint = 0x333333;
adminMenuBg.alpha = 0.9;
adminMenu.addChild(adminMenuBg);
// Admin menu title
var adminMenuTitle = new Text2('ADMIN MENU', {
size: 80,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 4
});
adminMenuTitle.anchor.set(0.5, 0.5);
adminMenuTitle.x = 2048 / 2;
adminMenuTitle.y = 500;
adminMenu.addChild(adminMenuTitle);
// Admin menu buttons
var addCoinsButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 1
});
addCoinsButton.x = 2048 / 2;
addCoinsButton.y = 800;
addCoinsButton.tint = 0xFFD700;
adminMenu.addChild(addCoinsButton);
var addCoinsText = new Text2('ADD 100000 COINS', {
size: 36,
fill: 0x000000,
font: "Futura",
stroke: 0xFFFFFF,
strokeThickness: 2
});
addCoinsText.anchor.set(0.5, 0.5);
addCoinsText.x = addCoinsButton.x;
addCoinsText.y = addCoinsButton.y;
adminMenu.addChild(addCoinsText);
var healButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 1
});
healButton.x = 2048 / 2;
healButton.y = 1000;
healButton.tint = 0x00FF00;
adminMenu.addChild(healButton);
var healText = new Text2('FULL HEAL', {
size: 36,
fill: 0x000000,
font: "Futura",
stroke: 0xFFFFFF,
strokeThickness: 2
});
healText.anchor.set(0.5, 0.5);
healText.x = healButton.x;
healText.y = healButton.y;
adminMenu.addChild(healText);
var killEnemiesButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 1
});
killEnemiesButton.x = 2048 / 2;
killEnemiesButton.y = 1200;
killEnemiesButton.tint = 0xFF0000;
adminMenu.addChild(killEnemiesButton);
var killEnemiesText = new Text2('KILL ALL ENEMIES', {
size: 36,
fill: 0xFFFFFF,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
killEnemiesText.anchor.set(0.5, 0.5);
killEnemiesText.x = killEnemiesButton.x;
killEnemiesText.y = killEnemiesButton.y;
adminMenu.addChild(killEnemiesText);
var skipWaveButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 1
});
skipWaveButton.x = 2048 / 2;
skipWaveButton.y = 1400;
skipWaveButton.tint = 0xFFA500;
adminMenu.addChild(skipWaveButton);
var skipWaveText = new Text2('SKIP WAVE', {
size: 36,
fill: 0x000000,
font: "Futura",
stroke: 0xFFFFFF,
strokeThickness: 2
});
skipWaveText.anchor.set(0.5, 0.5);
skipWaveText.x = skipWaveButton.x;
skipWaveText.y = skipWaveButton.y;
adminMenu.addChild(skipWaveText);
var closeMenuButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 1
});
closeMenuButton.x = 2048 / 2;
closeMenuButton.y = 1600;
closeMenuButton.tint = 0x666666;
adminMenu.addChild(closeMenuButton);
var closeMenuText = new Text2('CLOSE MENU', {
size: 36,
fill: 0xFFFFFF,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
closeMenuText.anchor.set(0.5, 0.5);
closeMenuText.x = closeMenuButton.x;
closeMenuText.y = closeMenuButton.y;
adminMenu.addChild(closeMenuText);
var showAdminMenu = false;
var showPasswordInput = false;
var currentPassword = "";
var correctPassword = "300710";
// Password input container
var passwordInputContainer = new Container();
passwordInputContainer.visible = false;
game.addChild(passwordInputContainer);
// Password background
var passwordInputBg = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 4
});
passwordInputBg.x = 2048 / 2;
passwordInputBg.y = 2732 / 2;
passwordInputBg.tint = 0x333333;
passwordInputBg.alpha = 0.9;
passwordInputContainer.addChild(passwordInputBg);
// Password prompt text
var passwordPromptText = new Text2('Enter Admin Password:', {
size: 60,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 3
});
passwordPromptText.anchor.set(0.5, 0.5);
passwordPromptText.x = 2048 / 2;
passwordPromptText.y = 2732 / 2 - 100;
passwordInputContainer.addChild(passwordPromptText);
// Password display text
var passwordDisplayText = new Text2('Password: ', {
size: 50,
fill: 0xFFFFFF,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
passwordDisplayText.anchor.set(0.5, 0.5);
passwordDisplayText.x = 2048 / 2;
passwordDisplayText.y = 2732 / 2;
passwordInputContainer.addChild(passwordDisplayText);
// Password instruction text
var passwordInstructionText = new Text2('Use the keyboard below to enter password\nTap DELETE to remove characters, tap SUBMIT when done', {
size: 35,
fill: 0xFFDD00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
passwordInstructionText.anchor.set(0.5, 0.5);
passwordInstructionText.x = 2048 / 2;
passwordInstructionText.y = 2732 / 2 + 100;
passwordInputContainer.addChild(passwordInstructionText);
// Create keyboard buttons
var keyboardButtons = [];
var keyboardChars = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'];
var keyboardStartX = 2048 / 2 - 500;
var keyboardY = 2732 / 2 + 200;
// Create character buttons
for (var kb = 0; kb < keyboardChars.length; kb++) {
var keyButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.5,
scaleY: 0.5
});
keyButton.x = keyboardStartX + kb * 100;
keyButton.y = keyboardY;
keyButton.tint = 0x4CAF50;
keyButton["char"] = keyboardChars[kb];
passwordInputContainer.addChild(keyButton);
keyboardButtons.push(keyButton);
var keyText = new Text2(keyboardChars[kb], {
size: 20,
fill: 0xFFFFFF,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
keyText.anchor.set(0.5, 0.5);
keyText.x = keyButton.x;
keyText.y = keyButton.y;
passwordInputContainer.addChild(keyText);
}
// Create DELETE button
var deleteButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 0.8
});
deleteButton.x = 2048 / 2 - 200;
deleteButton.y = keyboardY + 100;
deleteButton.tint = 0xFF4444;
passwordInputContainer.addChild(deleteButton);
var deleteText = new Text2('DELETE', {
size: 25,
fill: 0xFFFFFF,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
deleteText.anchor.set(0.5, 0.5);
deleteText.x = deleteButton.x;
deleteText.y = deleteButton.y;
passwordInputContainer.addChild(deleteText);
// Create SUBMIT button
var submitButton = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 0.8
});
submitButton.x = 2048 / 2 + 200;
submitButton.y = keyboardY + 100;
submitButton.tint = 0x2196F3;
passwordInputContainer.addChild(submitButton);
var submitText = new Text2('SUBMIT', {
size: 25,
fill: 0xFFFFFF,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
submitText.anchor.set(0.5, 0.5);
submitText.x = submitButton.x;
submitText.y = submitButton.y;
passwordInputContainer.addChild(submitText);
var healthText = new Text2('Health: 100', {
size: 60,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 3
});
healthText.anchor.set(1, 0);
healthText.visible = false;
LK.gui.topRight.addChild(healthText);
var waveText = new Text2('Wave: 1', {
size: 60,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 3
});
waveText.anchor.set(0.5, 0);
waveText.visible = false;
LK.gui.top.addChild(waveText);
var bossText = new Text2('HE IS HERE', {
size: 120,
fill: 0xFF0000,
font: "Futura",
stroke: 0x000000,
strokeThickness: 6
});
bossText.anchor.set(0.5, 0);
bossText.x = 2048 / 2;
bossText.y = 200;
bossText.visible = false;
game.addChild(bossText);
var youDidItText = new Text2('YOU DID IT', {
size: 150,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 8
});
youDidItText.anchor.set(0.5, 0.5);
youDidItText.x = 2048 / 2;
youDidItText.y = 2732 / 2;
youDidItText.visible = false;
youDidItText.alpha = 0;
game.addChild(youDidItText);
var getOutText = new Text2('NOW GET OUT!', {
size: 120,
fill: 0xFF0000,
font: "Futura",
stroke: 0x000000,
strokeThickness: 6
});
getOutText.anchor.set(0.5, 0.5);
getOutText.x = 2048 / 2;
getOutText.y = 2732 / 2;
getOutText.visible = false;
getOutText.alpha = 0;
game.addChild(getOutText);
var bossDefeated = false;
// Create upgrade buttons
var upgrade1Button = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
upgrade1Button.x = player.x - 200;
upgrade1Button.y = player.y;
upgrade1Button.visible = false;
game.addChild(upgrade1Button);
var upgrade2Button = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
upgrade2Button.x = player.x + 200;
upgrade2Button.y = player.y;
upgrade2Button.visible = false;
game.addChild(upgrade2Button);
var upgrade3Button = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
upgrade3Button.x = player.x - 400;
upgrade3Button.y = player.y;
upgrade3Button.visible = false;
game.addChild(upgrade3Button);
var upgrade4Button = LK.getAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
upgrade4Button.x = player.x + 400;
upgrade4Button.y = player.y;
upgrade4Button.visible = false;
game.addChild(upgrade4Button);
// Add upgrade button labels
var upgrade1Text = new Text2('Upgrade 1\nCost: ' + upgrade1Cost, {
size: 30,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
upgrade1Text.anchor.set(0.5, 0.5);
upgrade1Text.x = upgrade1Button.x;
upgrade1Text.y = upgrade1Button.y;
upgrade1Text.visible = false;
game.addChild(upgrade1Text);
var upgrade2Text = new Text2('Upgrade 2\nCost: ' + upgrade2Cost, {
size: 30,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
upgrade2Text.anchor.set(0.5, 0.5);
upgrade2Text.x = upgrade2Button.x;
upgrade2Text.y = upgrade2Button.y;
upgrade2Text.visible = false;
game.addChild(upgrade2Text);
var upgrade3Text = new Text2('Upgrade 3\nLaser Tower\nCost: ' + upgrade3Cost, {
size: 30,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
upgrade3Text.anchor.set(0.5, 0.5);
upgrade3Text.x = upgrade3Button.x;
upgrade3Text.y = upgrade3Button.y;
upgrade3Text.visible = false;
game.addChild(upgrade3Text);
var upgrade4Text = new Text2('Upgrade 4\nRPG Tower\nCost: ' + upgrade4Cost, {
size: 30,
fill: 0x00FF00,
font: "Futura",
stroke: 0x000000,
strokeThickness: 2
});
upgrade4Text.anchor.set(0.5, 0.5);
upgrade4Text.x = upgrade4Button.x;
upgrade4Text.y = upgrade4Button.y;
upgrade4Text.visible = false;
game.addChild(upgrade4Text);
// Game functions
function spawnEnemy() {
var enemy;
var spawnX = Math.random() * (2048 - 100) + 50;
if (currentWave >= 45) {
// From wave 45 onwards: include Roonie in spawn pool
var rand = Math.random();
if (rand < 0.15) {
enemy = new Mango();
} else if (rand < 0.25) {
enemy = new Mustard();
} else if (rand < 0.35) {
enemy = new SixSevenKid();
} else if (rand < 0.5) {
enemy = new GeorgeFloyd();
} else if (rand < 0.65) {
enemy = new SigmaBlud();
} else if (rand < 0.85) {
enemy = new GeorgeDropd();
} else {
enemy = new Roonie();
}
} else if (currentWave >= 25) {
// From wave 25 onwards: include George Droyd in spawn pool
var rand = Math.random();
if (rand < 0.2) {
enemy = new Mango();
} else if (rand < 0.35) {
enemy = new Mustard();
} else if (rand < 0.5) {
enemy = new SixSevenKid();
} else if (rand < 0.65) {
enemy = new GeorgeFloyd();
} else if (rand < 0.85) {
enemy = new SigmaBlud();
} else {
enemy = new GeorgeDropd();
}
} else if (currentWave >= 20) {
// From wave 20-24: include Sigma Blud in spawn pool
var rand = Math.random();
if (rand < 0.25) {
enemy = new Mango();
} else if (rand < 0.45) {
enemy = new Mustard();
} else if (rand < 0.65) {
enemy = new SixSevenKid();
} else if (rand < 0.85) {
enemy = new GeorgeFloyd();
} else {
enemy = new SigmaBlud();
}
} else if (currentWave >= 10) {
// From wave 10-19: include George Floyd in spawn pool
var rand = Math.random();
if (rand < 0.35) {
enemy = new Mango();
} else if (rand < 0.6) {
enemy = new Mustard();
} else if (rand < 0.85) {
enemy = new SixSevenKid();
} else {
enemy = new GeorgeFloyd();
}
} else if (currentWave >= 5) {
// From wave 5-9: 50% Mango, 25% Mustard, 25% 6 7 Kid
var rand = Math.random();
if (rand < 0.5) {
enemy = new Mango();
} else if (rand < 0.75) {
enemy = new Mustard();
} else {
enemy = new SixSevenKid();
}
} else {
// Before wave 5: 70% chance for Mango, 30% chance for Mustard
if (Math.random() < 0.7) {
enemy = new Mango();
} else {
enemy = new Mustard();
}
}
enemy.x = spawnX;
enemy.y = -50;
enemy.lastY = enemy.y;
// Increase coin value based on wave progression
var waveMultiplier = 1 + Math.floor(currentWave / 5) * 0.5; // +50% coins every 5 waves
enemy.coinValue = Math.floor(enemy.coinValue * waveMultiplier);
enemies.push(enemy);
game.addChild(enemy);
enemiesSpawned++;
}
function startNewWave() {
currentWave++;
// Special handling for wave 50
if (currentWave === 50) {
// Remove all existing enemies
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
enemy.destroy();
enemies.splice(e, 1);
}
// Play boss fight music immediately
LK.stopMusic();
LK.playMusic('bossFightMusic', {
loop: true
});
// Spawn Kendrick Lamar boss
var boss = new KendrickLamar();
boss.x = 2048 / 2;
boss.y = -100;
boss.lastY = boss.y;
enemies.push(boss);
game.addChild(boss);
// Set wave parameters for boss fight
enemiesInWave = 1;
enemiesSpawned = 1;
enemiesKilled = 0;
waveInProgress = true;
waveDelayTimer = 0;
waveText.setText('Wave: ' + currentWave);
return;
} else if (currentWave >= 1 && currentWave <= 49) {
// Play background music for waves 1-49
LK.stopMusic();
LK.playMusic('bgMusic', {
loop: true
});
}
enemiesInWave = enemiesInWave + 2; // Increase enemies per wave by 2
enemiesSpawned = 0;
enemiesKilled = 0;
waveInProgress = true;
waveDelayTimer = 0;
waveText.setText('Wave: ' + currentWave);
// Make waves progressively harder
enemySpawnRate = Math.max(30, enemySpawnRate - 5);
}
function fireBullet(targetX, targetY) {
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y - 40;
bullet.lastY = bullet.y;
// Aimbot: Find nearest enemy instead of using target coordinates
var nearestEnemy = findNearestEnemy(bullet.x, bullet.y);
var finalTargetX = targetX;
var finalTargetY = targetY;
if (nearestEnemy) {
// Use predictive aiming for aimbot
var distance = Math.sqrt(Math.pow(nearestEnemy.x - bullet.x, 2) + Math.pow(nearestEnemy.y - bullet.y, 2));
var timeToHit = distance / bullet.speed;
// Predict enemy position
finalTargetX = nearestEnemy.x;
finalTargetY = nearestEnemy.y + nearestEnemy.speed * timeToHit;
}
// Calculate angle to target at time of firing
var deltaX = finalTargetX - bullet.x;
var deltaY = finalTargetY - bullet.y;
var angle = Math.atan2(deltaY, deltaX);
// Set bullet direction
var velocityX = Math.cos(angle) * bullet.speed;
var velocityY = Math.sin(angle) * bullet.speed;
// Override update to use fixed velocity calculated at firing time
bullet.update = function () {
bullet.x += velocityX;
bullet.y += velocityY;
};
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
function fireTurretBullet(turretX, turretY, targetEnemy, turretLevel) {
if (!targetEnemy) return;
var bullet = new TurretBullet();
bullet.x = turretX;
bullet.y = turretY;
bullet.lastY = bullet.y;
bullet.turretLevel = turretLevel || 1;
bullet.damage = turretDamageTable[bullet.turretLevel];
// Predictive aiming - calculate where enemy will be when bullet arrives
var distance = Math.sqrt(Math.pow(targetEnemy.x - bullet.x, 2) + Math.pow(targetEnemy.y - bullet.y, 2));
var timeToHit = distance / bullet.speed;
// Predict enemy position based on current velocity
var predictedX = targetEnemy.x;
var predictedY = targetEnemy.y + targetEnemy.speed * timeToHit;
// Calculate angle to predicted position for aimbot accuracy
var deltaX = predictedX - bullet.x;
var deltaY = predictedY - bullet.y;
var angle = Math.atan2(deltaY, deltaX);
// Set bullet direction with predictive targeting
bullet.velocityX = Math.cos(angle) * bullet.speed;
bullet.velocityY = Math.sin(angle) * bullet.speed;
turretBullets.push(bullet);
game.addChild(bullet);
}
function fireLaserBullet(turretX, turretY, targetEnemy, laserLevel) {
if (!targetEnemy) return;
var bullet = new LaserBullet();
bullet.x = turretX;
bullet.y = turretY;
bullet.lastY = bullet.y;
bullet.laserLevel = laserLevel || 1;
bullet.damage = laserDamageTable[bullet.laserLevel] || 300; // Use damage table
// Predictive aiming - calculate where enemy will be when bullet arrives
var distance = Math.sqrt(Math.pow(targetEnemy.x - bullet.x, 2) + Math.pow(targetEnemy.y - bullet.y, 2));
var timeToHit = distance / bullet.speed;
// Predict enemy position based on current velocity
var predictedX = targetEnemy.x;
var predictedY = targetEnemy.y + targetEnemy.speed * timeToHit;
// Calculate angle to predicted position for aimbot accuracy
var deltaX = predictedX - bullet.x;
var deltaY = predictedY - bullet.y;
var angle = Math.atan2(deltaY, deltaX);
// Set bullet direction with predictive targeting
bullet.velocityX = Math.cos(angle) * bullet.speed;
bullet.velocityY = Math.sin(angle) * bullet.speed;
turretBullets.push(bullet);
game.addChild(bullet);
}
function fireRPGBullet(turretX, turretY, targetEnemy, rpgLevel) {
if (!targetEnemy) return;
var bullet = new RPGBullet();
bullet.x = turretX;
bullet.y = turretY;
bullet.lastY = bullet.y;
bullet.rpgLevel = rpgLevel || 1;
bullet.damage = rpgDamageTable[bullet.rpgLevel] || 5000; // Use damage table
// Predictive aiming - calculate where enemy will be when bullet arrives
var distance = Math.sqrt(Math.pow(targetEnemy.x - bullet.x, 2) + Math.pow(targetEnemy.y - bullet.y, 2));
var timeToHit = distance / bullet.speed;
// Predict enemy position based on current velocity
var predictedX = targetEnemy.x;
var predictedY = targetEnemy.y + targetEnemy.speed * timeToHit;
// Calculate angle to predicted position for aimbot accuracy
var deltaX = predictedX - bullet.x;
var deltaY = predictedY - bullet.y;
var angle = Math.atan2(deltaY, deltaX);
// Set bullet direction with predictive targeting
bullet.velocityX = Math.cos(angle) * bullet.speed;
bullet.velocityY = Math.sin(angle) * bullet.speed;
turretBullets.push(bullet);
game.addChild(bullet);
}
function dealAreaDamage(explosionX, explosionY, baseDamage, maxRadius) {
// Create visual explosion effect
var explosion = LK.getAsset('areaDamage', {
anchorX: 0.5,
anchorY: 0.5
});
explosion.x = explosionX;
explosion.y = explosionY;
explosion.alpha = 0.8;
explosion.scaleX = 0.1;
explosion.scaleY = 0.1;
game.addChild(explosion);
// Animate explosion
tween(explosion, {
scaleX: 2.0,
scaleY: 2.0,
alpha: 0
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
explosion.destroy();
}
});
// Deal damage to all enemies in radius
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var distance = Math.sqrt(Math.pow(enemy.x - explosionX, 2) + Math.pow(enemy.y - explosionY, 2));
if (distance <= maxRadius) {
// Calculate damage falloff based on distance
var damageMultiplier = Math.max(0.2, 1 - distance / maxRadius); // Minimum 20% damage at edge
var actualDamage = Math.floor(baseDamage * damageMultiplier);
enemy.takeDamage(actualDamage);
LK.getSound('enemyDamage').play();
}
}
}
function findNearestEnemy(turretX, turretY) {
var nearestEnemy = null;
var nearestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var distance = Math.sqrt(Math.pow(enemy.x - turretX, 2) + Math.pow(enemy.y - turretY, 2));
if (distance < nearestDistance && distance < 2000) {
// Increased range to 2000px for better aimbot coverage
nearestDistance = distance;
nearestEnemy = enemy;
}
}
return nearestEnemy;
}
// Event handlers
game.down = function (x, y, obj) {
if (showPasswordInput) {
// Check keyboard button clicks
var keyPressed = '';
for (var kb = 0; kb < keyboardButtons.length; kb++) {
var keyButton = keyboardButtons[kb];
var keyLeft = keyButton.x - 25;
var keyRight = keyButton.x + 25;
var keyTop = keyButton.y - 20;
var keyBottom = keyButton.y + 20;
if (x >= keyLeft && x <= keyRight && y >= keyTop && y <= keyBottom) {
keyPressed = keyButton["char"];
break;
}
}
if (keyPressed) {
currentPassword += keyPressed;
var displayPassword = '';
for (var p = 0; p < currentPassword.length; p++) {
displayPassword += '*';
}
passwordDisplayText.setText('Password: ' + displayPassword);
}
// Check DELETE button
var deleteLeft = deleteButton.x - 60;
var deleteRight = deleteButton.x + 60;
var deleteTop = deleteButton.y - 30;
var deleteBottom = deleteButton.y + 30;
if (x >= deleteLeft && x <= deleteRight && y >= deleteTop && y <= deleteBottom) {
if (currentPassword.length > 0) {
currentPassword = currentPassword.slice(0, -1);
var displayPassword = '';
for (var p = 0; p < currentPassword.length; p++) {
displayPassword += '*';
}
passwordDisplayText.setText('Password: ' + displayPassword);
}
}
// Check SUBMIT button
var submitLeft = submitButton.x - 60;
var submitRight = submitButton.x + 60;
var submitTop = submitButton.y - 30;
var submitBottom = submitButton.y + 30;
if (x >= submitLeft && x <= submitRight && y >= submitTop && y <= submitBottom) {
if (currentPassword === correctPassword) {
// Correct password - activate admin mode
isAdminMode = true;
coins = 10000;
playerHealth = 10000;
coinText.setText('Coins: ' + coins);
healthText.setText('Health: ' + playerHealth);
// Hide password input
showPasswordInput = false;
passwordInputContainer.visible = false;
currentPassword = "";
// Hide menu elements
showMainMenu = false;
gameStarted = true;
menuBackground.visible = false;
menuTitle.visible = false;
startButton.visible = false;
startButtonText.visible = false;
adminButton.visible = false;
adminButtonText.visible = false;
instructionText.visible = false;
// Show game elements
player.visible = true;
upgrade1Button.visible = true;
upgrade2Button.visible = true;
upgrade3Button.visible = true;
upgrade4Button.visible = true;
upgrade1Text.visible = true;
upgrade2Text.visible = true;
upgrade3Text.visible = true;
upgrade4Text.visible = true;
coinText.visible = true;
healthText.visible = true;
waveText.visible = true;
adminCornerButton.visible = true;
adminCornerText.visible = true;
// Switch from menu music to game music
LK.stopMusic();
LK.playMusic('bgMusic', {
loop: true
});
// Start from wave 1
currentWave = 0;
waveText.setText('Wave: 1');
} else {
// Wrong password - flash red and reset
LK.effects.flashScreen(0xff0000, 500);
currentPassword = "";
passwordDisplayText.setText('Password: ');
}
}
// Check top area to cancel
if (y < 200) {
showPasswordInput = false;
passwordInputContainer.visible = false;
currentPassword = "";
}
return;
}
if (showMainMenu) {
// Check if start button was clicked
var startLeft = startButton.x - 135;
var startRight = startButton.x + 135;
var startTop = startButton.y - 90;
var startBottom = startButton.y + 90;
if (x >= startLeft && x <= startRight && y >= startTop && y <= startBottom) {
// Hide menu elements
showMainMenu = false;
gameStarted = true;
menuBackground.visible = false;
menuTitle.visible = false;
startButton.visible = false;
startButtonText.visible = false;
adminButton.visible = false;
adminButtonText.visible = false;
instructionText.visible = false;
// Show game elements
player.visible = true;
upgrade1Button.visible = true;
upgrade2Button.visible = true;
upgrade3Button.visible = true;
upgrade4Button.visible = true;
upgrade1Text.visible = true;
upgrade2Text.visible = true;
upgrade3Text.visible = true;
upgrade4Text.visible = true;
coinText.visible = true;
healthText.visible = true;
waveText.visible = true;
// Switch from menu music to game music
LK.stopMusic();
LK.playMusic('bgMusic', {
loop: true
});
// Start from wave 1
currentWave = 0;
waveText.setText('Wave: 1');
}
// Check if admin button was clicked
var adminLeft = adminButton.x - 135;
var adminRight = adminButton.x + 135;
var adminTop = adminButton.y - 90;
var adminBottom = adminButton.y + 90;
if (x >= adminLeft && x <= adminRight && y >= adminTop && y <= adminBottom) {
// Show password input overlay
showPasswordInput = true;
passwordInputContainer.visible = true;
currentPassword = "";
passwordDisplayText.setText('Password: ');
}
return;
}
if (gameStarted) {
// Check upgrade 1 button - use proper bounds checking
var upgrade1Left = upgrade1Button.x - 90;
var upgrade1Right = upgrade1Button.x + 90;
var upgrade1Top = upgrade1Button.y - 60;
var upgrade1Bottom = upgrade1Button.y + 60;
if (x >= upgrade1Left && x <= upgrade1Right && y >= upgrade1Top && y <= upgrade1Bottom) {
if (upgrade1Level < 10 && coins >= upgrade1Cost) {
coins -= upgrade1Cost;
upgrade1Level++;
upgrade1Cost = turret1CostTable[upgrade1Level] || upgrade1Cost;
coinText.setText('Coins: ' + coins);
var damageText = turretDamageTable[upgrade1Level];
if (upgrade1Level >= 10) {
upgrade1Text.setText('Turret 1\nMax Level\nDamage: ' + damageText);
} else {
upgrade1Text.setText('Turret 1\nLevel: ' + upgrade1Level + '\nDamage: ' + damageText + '\nCost: ' + upgrade1Cost);
}
// Only spawn turret if this is the first level
if (upgrade1Level === 1) {
// Spawn turret at upgrade button position with animation
var newTurret = LK.getAsset('turret', {
anchorX: 0.5,
anchorY: 0.5
});
newTurret.x = player.x - 200;
newTurret.y = player.y - 100; // Position above player
newTurret.tint = 0x00ff00; // Green tint for turret
newTurret.scaleX = 0.1;
newTurret.scaleY = 0.1;
newTurret.level = upgrade1Level;
game.addChild(newTurret);
turrets1.push(newTurret);
// Animate turret spawn
tween(newTurret, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 500,
easing: tween.bounceOut
});
} else {
// Update existing turret level
if (turrets1.length > 0) {
turrets1[0].level = upgrade1Level;
}
}
}
return;
}
// Check upgrade 2 button - use proper bounds checking
var upgrade2Left = upgrade2Button.x - 90;
var upgrade2Right = upgrade2Button.x + 90;
var upgrade2Top = upgrade2Button.y - 60;
var upgrade2Bottom = upgrade2Button.y + 60;
if (x >= upgrade2Left && x <= upgrade2Right && y >= upgrade2Top && y <= upgrade2Bottom) {
if (upgrade2Level < 10 && coins >= upgrade2Cost) {
coins -= upgrade2Cost;
upgrade2Level++;
upgrade2Cost = turret2CostTable[upgrade2Level] || upgrade2Cost;
coinText.setText('Coins: ' + coins);
var damageText = turretDamageTable[upgrade2Level];
if (upgrade2Level >= 10) {
upgrade2Text.setText('Turret 2\nMax Level\nDamage: ' + damageText);
} else {
upgrade2Text.setText('Turret 2\nLevel: ' + upgrade2Level + '\nDamage: ' + damageText + '\nCost: ' + upgrade2Cost);
}
// Only spawn turret if this is the first level
if (upgrade2Level === 1) {
// Spawn turret at upgrade button position with animation
var newTurret = LK.getAsset('turret', {
anchorX: 0.5,
anchorY: 0.5
});
newTurret.x = player.x + 200;
newTurret.y = player.y - 100; // Position above player
newTurret.tint = 0x0000ff; // Blue tint for turret
newTurret.scaleX = 0.1;
newTurret.scaleY = 0.1;
newTurret.level = upgrade2Level;
game.addChild(newTurret);
turrets2.push(newTurret);
// Animate turret spawn
tween(newTurret, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 500,
easing: tween.bounceOut
});
} else {
// Update existing turret level
if (turrets2.length > 0) {
turrets2[0].level = upgrade2Level;
}
}
}
return;
}
// Check upgrade 3 button - use proper bounds checking
var upgrade3Left = upgrade3Button.x - 90;
var upgrade3Right = upgrade3Button.x + 90;
var upgrade3Top = upgrade3Button.y - 60;
var upgrade3Bottom = upgrade3Button.y + 60;
if (x >= upgrade3Left && x <= upgrade3Right && y >= upgrade3Top && y <= upgrade3Bottom) {
if (upgrade3Level < 10 && coins >= upgrade3Cost) {
coins -= upgrade3Cost;
upgrade3Level++;
upgrade3Cost = laserCostTable[upgrade3Level] || upgrade3Cost;
coinText.setText('Coins: ' + coins);
var damageText = laserDamageTable[upgrade3Level];
if (upgrade3Level >= 10) {
upgrade3Text.setText('Laser Tower\nMax Level\nDamage: ' + damageText);
} else {
upgrade3Text.setText('Laser Tower\nLevel: ' + upgrade3Level + '\nDamage: ' + damageText + '\nCost: ' + upgrade3Cost);
}
// Only spawn turret if this is the first level
if (upgrade3Level === 1) {
// Spawn laser turret at upgrade button position with animation
var newTurret = LK.getAsset('laserTurret', {
anchorX: 0.5,
anchorY: 0.5
});
newTurret.x = player.x - 400;
newTurret.y = player.y - 100; // Position above player
newTurret.tint = 0xff0000; // Red tint for laser turret
newTurret.scaleX = 0.1;
newTurret.scaleY = 0.1;
newTurret.level = upgrade3Level;
game.addChild(newTurret);
turrets3.push(newTurret);
// Animate turret spawn
tween(newTurret, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 500,
easing: tween.bounceOut
});
} else {
// Update existing turret level
if (turrets3.length > 0) {
turrets3[0].level = upgrade3Level;
}
}
}
return;
}
// Check upgrade 4 button - use proper bounds checking
var upgrade4Left = upgrade4Button.x - 90;
var upgrade4Right = upgrade4Button.x + 90;
var upgrade4Top = upgrade4Button.y - 60;
var upgrade4Bottom = upgrade4Button.y + 60;
if (x >= upgrade4Left && x <= upgrade4Right && y >= upgrade4Top && y <= upgrade4Bottom) {
if (upgrade4Level < 10 && coins >= upgrade4Cost) {
coins -= upgrade4Cost;
upgrade4Level++;
upgrade4Cost = rpgCostTable[upgrade4Level] || upgrade4Cost;
coinText.setText('Coins: ' + coins);
var damageText = rpgDamageTable[upgrade4Level];
if (upgrade4Level >= 10) {
upgrade4Text.setText('RPG Tower\nMax Level\nDamage: ' + damageText);
} else {
upgrade4Text.setText('RPG Tower\nLevel: ' + upgrade4Level + '\nDamage: ' + damageText + '\nCost: ' + upgrade4Cost);
}
// Only spawn turret if this is the first level
if (upgrade4Level === 1) {
// Spawn RPG turret at upgrade button position with animation
var newTurret = LK.getAsset('rpgTurret', {
anchorX: 0.5,
anchorY: 0.5
});
newTurret.x = player.x + 400;
newTurret.y = player.y - 100; // Position above player
newTurret.tint = 0x9900ff; // Purple tint for RPG turret
newTurret.scaleX = 0.1;
newTurret.scaleY = 0.1;
newTurret.level = upgrade4Level;
game.addChild(newTurret);
turrets4.push(newTurret);
// Animate turret spawn
tween(newTurret, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 500,
easing: tween.bounceOut
});
} else {
// Update existing turret level
if (turrets4.length > 0) {
turrets4[0].level = upgrade4Level;
}
}
}
return;
}
// Check admin corner button click
if (isAdminMode) {
var adminCornerLeft = adminCornerButton.x - 54;
var adminCornerRight = adminCornerButton.x + 54;
var adminCornerTop = adminCornerButton.y - 36;
var adminCornerBottom = adminCornerButton.y + 36;
if (x >= adminCornerLeft && x <= adminCornerRight && y >= adminCornerTop && y <= adminCornerBottom) {
showAdminMenu = !showAdminMenu;
adminMenu.visible = showAdminMenu;
return;
}
// Check admin menu clicks
if (showAdminMenu) {
// Add coins button
var addCoinsLeft = addCoinsButton.x - 180;
var addCoinsRight = addCoinsButton.x + 180;
var addCoinsTop = addCoinsButton.y - 60;
var addCoinsBottom = addCoinsButton.y + 60;
if (x >= addCoinsLeft && x <= addCoinsRight && y >= addCoinsTop && y <= addCoinsBottom) {
coins += 100000;
coinText.setText('Coins: ' + coins);
return;
}
// Heal button
var healLeft = healButton.x - 180;
var healRight = healButton.x + 180;
var healTop = healButton.y - 60;
var healBottom = healButton.y + 60;
if (x >= healLeft && x <= healRight && y >= healTop && y <= healBottom) {
playerHealth = 10000;
healthText.setText('Health: ' + playerHealth);
return;
}
// Kill enemies button
var killLeft = killEnemiesButton.x - 180;
var killRight = killEnemiesButton.x + 180;
var killTop = killEnemiesButton.y - 60;
var killBottom = killEnemiesButton.y + 60;
if (x >= killLeft && x <= killRight && y >= killTop && y <= killBottom) {
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
coins += enemy.coinValue;
enemiesKilled++;
enemy.destroy();
enemies.splice(e, 1);
}
coinText.setText('Coins: ' + coins);
return;
}
// Skip wave button
var skipWaveLeft = skipWaveButton.x - 180;
var skipWaveRight = skipWaveButton.x + 180;
var skipWaveTop = skipWaveButton.y - 60;
var skipWaveBottom = skipWaveButton.y + 60;
if (x >= skipWaveLeft && x <= skipWaveRight && y >= skipWaveTop && y <= skipWaveBottom) {
// Kill all current enemies to complete the wave instantly
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
coins += enemy.coinValue;
enemiesKilled++;
enemy.destroy();
enemies.splice(e, 1);
}
coinText.setText('Coins: ' + coins);
// Force wave completion and immediately start next wave
if (waveInProgress) {
// Set enemies killed to wave requirement to complete current wave
enemiesKilled = enemiesInWave;
// End current wave
waveInProgress = false;
waveDelayTimer = waveStartDelay; // Set delay timer to trigger next wave immediately
}
return;
}
// Close menu button
var closeLeft = closeMenuButton.x - 180;
var closeRight = closeMenuButton.x + 180;
var closeTop = closeMenuButton.y - 60;
var closeBottom = closeMenuButton.y + 60;
if (x >= closeLeft && x <= closeRight && y >= closeTop && y <= closeBottom) {
showAdminMenu = false;
adminMenu.visible = false;
return;
}
return; // Don't shoot while menu is open
}
}
isMouseDown = true;
mouseX = x;
mouseY = y;
fireBullet(x, y);
} else {
gameStarted = true;
}
};
game.up = function (x, y, obj) {
isMouseDown = false;
};
game.move = function (x, y, obj) {
// Remove mouse tracking during movement to prevent bullets from following cursor
};
// Main game loop
game.update = function () {
if (showMainMenu) {
return; // Don't run game logic while in menu
}
if (!gameStarted) {
waveInProgress = true; // Start first wave when game begins
return;
}
// Update upgrade button positions
upgrade1Button.x = player.x - 200;
upgrade1Button.y = player.y;
upgrade1Text.x = upgrade1Button.x;
upgrade1Text.y = upgrade1Button.y;
upgrade2Button.x = player.x + 200;
upgrade2Button.y = player.y;
upgrade2Text.x = upgrade2Button.x;
upgrade2Text.y = upgrade2Button.y;
upgrade3Button.x = player.x - 400;
upgrade3Button.y = player.y;
upgrade3Text.x = upgrade3Button.x;
upgrade3Text.y = upgrade3Button.y;
upgrade4Button.x = player.x + 400;
upgrade4Button.y = player.y;
upgrade4Text.x = upgrade4Button.x;
upgrade4Text.y = upgrade4Button.y;
// Handle continuous shooting
if (isMouseDown) {
shootCooldown--;
if (shootCooldown <= 0) {
fireBullet(mouseX, mouseY);
shootCooldown = shootRate;
}
}
// Wave management
if (!waveInProgress) {
waveDelayTimer++;
if (waveDelayTimer >= waveStartDelay) {
startNewWave();
}
} else {
// Special handling for wave 50 boss
if (currentWave === 50) {
// Show boss text
bossText.visible = true;
// Don't spawn additional enemies for boss wave
} else {
// Hide boss text for non-boss waves
bossText.visible = false;
// Spawn enemies for current wave
enemySpawnTimer++;
if (enemySpawnTimer >= enemySpawnRate && enemiesSpawned < enemiesInWave) {
spawnEnemy();
enemySpawnTimer = 0;
}
}
// Check if wave is complete
if (enemiesKilled >= enemiesInWave && enemies.length === 0) {
waveInProgress = false;
waveDelayTimer = 0;
if (currentWave === 50) {
bossText.visible = false;
}
}
}
// Turret shooting logic
turretShootTimer1++;
turretShootTimer2++;
if (turretShootTimer1 >= turretShootRate) {
for (var t1 = 0; t1 < turrets1.length; t1++) {
var turret1 = turrets1[t1];
var target1 = findNearestEnemy(turret1.x, turret1.y);
if (target1) {
fireTurretBullet(turret1.x, turret1.y, target1, upgrade1Level);
}
}
turretShootTimer1 = 0;
}
if (turretShootTimer2 >= turretShootRate) {
for (var t2 = 0; t2 < turrets2.length; t2++) {
var turret2 = turrets2[t2];
var target2 = findNearestEnemy(turret2.x, turret2.y);
if (target2) {
fireTurretBullet(turret2.x, turret2.y, target2, upgrade2Level);
}
}
turretShootTimer2 = 0;
}
// Laser turret shooting
turretShootTimer3++;
if (turretShootTimer3 >= turretShootRate) {
for (var t3 = 0; t3 < turrets3.length; t3++) {
var turret3 = turrets3[t3];
var target3 = findNearestEnemy(turret3.x, turret3.y);
if (target3) {
fireLaserBullet(turret3.x, turret3.y, target3, upgrade3Level);
}
}
turretShootTimer3 = 0;
}
// RPG turret shooting (slower rate)
turretShootTimer4++;
if (turretShootTimer4 >= rpgShootRate) {
for (var t4 = 0; t4 < turrets4.length; t4++) {
var turret4 = turrets4[t4];
var target4 = findNearestEnemy(turret4.x, turret4.y);
if (target4) {
fireRPGBullet(turret4.x, turret4.y, target4, upgrade4Level);
}
}
turretShootTimer4 = 0;
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove bullets that go off screen
if (bullet.lastY <= 2732 && (bullet.y > 2732 || bullet.y < -50 || bullet.x < -50 || bullet.x > 2098)) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
bullet.lastY = bullet.y;
}
// Update turret bullets
for (var tb = turretBullets.length - 1; tb >= 0; tb--) {
var turretBullet = turretBullets[tb];
// Remove turret bullets that go off screen
if (turretBullet.lastY <= 2732 && (turretBullet.y > 2732 || turretBullet.y < -50 || turretBullet.x < -50 || turretBullet.x > 2098)) {
turretBullet.destroy();
turretBullets.splice(tb, 1);
continue;
}
turretBullet.lastY = turretBullet.y;
}
// Update enemies and check collisions
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
// Remove enemies that reach bottom (player takes damage)
if (enemy.lastY < 2732 && enemy.y >= 2732) {
playerHealth -= 20;
healthText.setText('Health: ' + playerHealth);
LK.effects.flashScreen(0xff0000, 500);
if (playerHealth <= 0) {
LK.setScore(coins);
LK.showGameOver();
return;
}
enemiesKilled++; // Count as killed for wave progress
enemy.destroy();
enemies.splice(j, 1);
continue;
}
// Check bullet collisions
for (var k = bullets.length - 1; k >= 0; k--) {
var bullet = bullets[k];
if (bullet.intersects(enemy)) {
enemy.takeDamage(bullet.damage);
LK.getSound('enemyDamage').play();
// Remove bullet
bullet.destroy();
bullets.splice(k, 1);
// Check if enemy is dead
if (enemy.health <= 0) {
// Check if this is Kendrick Lamar (boss) being defeated
if (currentWave === 50 && enemy instanceof KendrickLamar && !bossDefeated) {
bossDefeated = true;
// Play victory sound
LK.getSound('youDidIt').play();
// Show "YOU DID IT" text with fade in animation
youDidItText.visible = true;
tween(youDidItText, {
alpha: 1
}, {
duration: 1000,
easing: tween.easeIn,
onFinish: function onFinish() {
// After 10 seconds, fade out "YOU DID IT" and show "NOW GET OUT!"
LK.setTimeout(function () {
tween(youDidItText, {
alpha: 0
}, {
duration: 1000,
easing: tween.easeOut,
onFinish: function onFinish() {
youDidItText.visible = false;
// Show "NOW GET OUT!" text
getOutText.visible = true;
tween(getOutText, {
alpha: 1
}, {
duration: 1000,
easing: tween.easeIn,
onFinish: function onFinish() {
// After 5 seconds, return to main menu
LK.setTimeout(function () {
// Reset game to main menu state
showMainMenu = true;
gameStarted = false;
bossDefeated = false;
currentWave = 0;
coins = 0;
playerHealth = 100;
isAdminMode = false;
// Clear all game objects
for (var be = enemies.length - 1; be >= 0; be--) {
enemies[be].destroy();
enemies.splice(be, 1);
}
for (var bb = bullets.length - 1; bb >= 0; bb--) {
bullets[bb].destroy();
bullets.splice(bb, 1);
}
for (var btb = turretBullets.length - 1; btb >= 0; btb--) {
turretBullets[btb].destroy();
turretBullets.splice(btb, 1);
}
// Clear turrets
for (var bt1 = turrets1.length - 1; bt1 >= 0; bt1--) {
turrets1[bt1].destroy();
turrets1.splice(bt1, 1);
}
for (var bt2 = turrets2.length - 1; bt2 >= 0; bt2--) {
turrets2[bt2].destroy();
turrets2.splice(bt2, 1);
}
for (var bt3 = turrets3.length - 1; bt3 >= 0; bt3--) {
turrets3[bt3].destroy();
turrets3.splice(bt3, 1);
}
for (var bt4 = turrets4.length - 1; bt4 >= 0; bt4--) {
turrets4[bt4].destroy();
turrets4.splice(bt4, 1);
}
// Reset upgrade levels and costs
upgrade1Level = 0;
upgrade2Level = 0;
upgrade3Level = 0;
upgrade4Level = 0;
upgrade1Cost = 1;
upgrade2Cost = 3;
upgrade3Cost = 2000;
upgrade4Cost = 5000;
// Hide victory texts
getOutText.visible = false;
getOutText.alpha = 0;
youDidItText.alpha = 0;
// Hide game UI
player.visible = false;
upgrade1Button.visible = false;
upgrade2Button.visible = false;
upgrade3Button.visible = false;
upgrade4Button.visible = false;
upgrade1Text.visible = false;
upgrade2Text.visible = false;
upgrade3Text.visible = false;
upgrade4Text.visible = false;
coinText.visible = false;
healthText.visible = false;
waveText.visible = false;
adminCornerButton.visible = false;
adminCornerText.visible = false;
bossText.visible = false;
adminMenu.visible = false;
showAdminMenu = false;
// Show menu elements
menuBackground.visible = true;
menuTitle.visible = true;
startButton.visible = true;
startButtonText.visible = true;
adminButton.visible = true;
adminButtonText.visible = true;
instructionText.visible = true;
// Play menu music
LK.stopMusic();
LK.playMusic('menuMusic', {
loop: true
});
}, 5000);
}
});
}
});
}, 10000);
}
});
}
coins += enemy.coinValue;
coinText.setText('Coins: ' + coins);
LK.getSound('enemyDeath').play();
enemiesKilled++;
enemy.destroy();
enemies.splice(j, 1);
}
break;
}
}
// Check turret bullet collisions
for (var tkb = turretBullets.length - 1; tkb >= 0; tkb--) {
var turretBullet = turretBullets[tkb];
if (turretBullet.intersects(enemy)) {
// Check if this is an RPG bullet for area damage
if (turretBullet.rpgLevel) {
// RPG rocket explosion with area damage
dealAreaDamage(turretBullet.x, turretBullet.y, turretBullet.damage, 150);
// Remove turret bullet
turretBullet.destroy();
turretBullets.splice(tkb, 1);
// Check all enemies for death after area damage
for (var ed = enemies.length - 1; ed >= 0; ed--) {
var checkEnemy = enemies[ed];
if (checkEnemy.health <= 0) {
// Check if this is Kendrick Lamar (boss) being defeated by area damage
if (currentWave === 50 && checkEnemy instanceof KendrickLamar && !bossDefeated) {
bossDefeated = true;
// Play victory sound
LK.getSound('youDidIt').play();
// Show "YOU DID IT" text with fade in animation
youDidItText.visible = true;
tween(youDidItText, {
alpha: 1
}, {
duration: 1000,
easing: tween.easeIn,
onFinish: function onFinish() {
// After 10 seconds, fade out "YOU DID IT" and show "NOW GET OUT!"
LK.setTimeout(function () {
tween(youDidItText, {
alpha: 0
}, {
duration: 1000,
easing: tween.easeOut,
onFinish: function onFinish() {
youDidItText.visible = false;
// Show "NOW GET OUT!" text
getOutText.visible = true;
tween(getOutText, {
alpha: 1
}, {
duration: 1000,
easing: tween.easeIn,
onFinish: function onFinish() {
// After 5 seconds, return to main menu
LK.setTimeout(function () {
// Reset game to main menu state
showMainMenu = true;
gameStarted = false;
bossDefeated = false;
currentWave = 0;
coins = 0;
playerHealth = 100;
isAdminMode = false;
// Clear all game objects
for (var bee = enemies.length - 1; bee >= 0; bee--) {
enemies[bee].destroy();
enemies.splice(bee, 1);
}
for (var bbb = bullets.length - 1; bbb >= 0; bbb--) {
bullets[bbb].destroy();
bullets.splice(bbb, 1);
}
for (var bbtb = turretBullets.length - 1; bbtb >= 0; bbtb--) {
turretBullets[bbtb].destroy();
turretBullets.splice(bbtb, 1);
}
// Clear turrets
for (var bbt1 = turrets1.length - 1; bbt1 >= 0; bbt1--) {
turrets1[bbt1].destroy();
turrets1.splice(bbt1, 1);
}
for (var bbt2 = turrets2.length - 1; bbt2 >= 0; bbt2--) {
turrets2[bbt2].destroy();
turrets2.splice(bbt2, 1);
}
for (var bbt3 = turrets3.length - 1; bbt3 >= 0; bbt3--) {
turrets3[bbt3].destroy();
turrets3.splice(bbt3, 1);
}
for (var bbt4 = turrets4.length - 1; bbt4 >= 0; bbt4--) {
turrets4[bbt4].destroy();
turrets4.splice(bbt4, 1);
}
// Reset upgrade levels and costs
upgrade1Level = 0;
upgrade2Level = 0;
upgrade3Level = 0;
upgrade4Level = 0;
upgrade1Cost = 1;
upgrade2Cost = 3;
upgrade3Cost = 2000;
upgrade4Cost = 5000;
// Hide victory texts
getOutText.visible = false;
getOutText.alpha = 0;
youDidItText.alpha = 0;
// Hide game UI
player.visible = false;
upgrade1Button.visible = false;
upgrade2Button.visible = false;
upgrade3Button.visible = false;
upgrade4Button.visible = false;
upgrade1Text.visible = false;
upgrade2Text.visible = false;
upgrade3Text.visible = false;
upgrade4Text.visible = false;
coinText.visible = false;
healthText.visible = false;
waveText.visible = false;
adminCornerButton.visible = false;
adminCornerText.visible = false;
bossText.visible = false;
adminMenu.visible = false;
showAdminMenu = false;
// Show menu elements
menuBackground.visible = true;
menuTitle.visible = true;
startButton.visible = true;
startButtonText.visible = true;
adminButton.visible = true;
adminButtonText.visible = true;
instructionText.visible = true;
// Play menu music
LK.stopMusic();
LK.playMusic('menuMusic', {
loop: true
});
}, 5000);
}
});
}
});
}, 10000);
}
});
}
coins += checkEnemy.coinValue;
coinText.setText('Coins: ' + coins);
LK.getSound('enemyDeath').play();
enemiesKilled++;
checkEnemy.destroy();
enemies.splice(ed, 1);
if (ed <= j) j--; // Adjust outer loop index
}
}
} else {
// Regular turret bullet
enemy.takeDamage(turretBullet.damage);
LK.getSound('enemyDamage').play();
// Remove turret bullet
turretBullet.destroy();
turretBullets.splice(tkb, 1);
// Check if enemy is dead
if (enemy.health <= 0) {
// Check if this is Kendrick Lamar (boss) being defeated by turret
if (currentWave === 50 && enemy instanceof KendrickLamar && !bossDefeated) {
bossDefeated = true;
// Play victory sound
LK.getSound('youDidIt').play();
// Show "YOU DID IT" text with fade in animation
youDidItText.visible = true;
tween(youDidItText, {
alpha: 1
}, {
duration: 1000,
easing: tween.easeIn,
onFinish: function onFinish() {
// After 10 seconds, fade out "YOU DID IT" and show "NOW GET OUT!"
LK.setTimeout(function () {
tween(youDidItText, {
alpha: 0
}, {
duration: 1000,
easing: tween.easeOut,
onFinish: function onFinish() {
youDidItText.visible = false;
// Show "NOW GET OUT!" text
getOutText.visible = true;
tween(getOutText, {
alpha: 1
}, {
duration: 1000,
easing: tween.easeIn,
onFinish: function onFinish() {
// After 5 seconds, return to main menu
LK.setTimeout(function () {
// Reset game to main menu state
showMainMenu = true;
gameStarted = false;
bossDefeated = false;
currentWave = 0;
coins = 0;
playerHealth = 100;
isAdminMode = false;
// Clear all game objects
for (var beee = enemies.length - 1; beee >= 0; beee--) {
enemies[beee].destroy();
enemies.splice(beee, 1);
}
for (var bbbb = bullets.length - 1; bbbb >= 0; bbbb--) {
bullets[bbbb].destroy();
bullets.splice(bbbb, 1);
}
for (var bbbtb = turretBullets.length - 1; bbbtb >= 0; bbbtb--) {
turretBullets[bbbtb].destroy();
turretBullets.splice(bbbtb, 1);
}
// Clear turrets
for (var bbbt1 = turrets1.length - 1; bbbt1 >= 0; bbbt1--) {
turrets1[bbbt1].destroy();
turrets1.splice(bbbt1, 1);
}
for (var bbbt2 = turrets2.length - 1; bbbt2 >= 0; bbbt2--) {
turrets2[bbbt2].destroy();
turrets2.splice(bbbt2, 1);
}
for (var bbbt3 = turrets3.length - 1; bbbt3 >= 0; bbbt3--) {
turrets3[bbbt3].destroy();
turrets3.splice(bbbt3, 1);
}
for (var bbbt4 = turrets4.length - 1; bbbt4 >= 0; bbbt4--) {
turrets4[bbbt4].destroy();
turrets4.splice(bbbt4, 1);
}
// Reset upgrade levels and costs
upgrade1Level = 0;
upgrade2Level = 0;
upgrade3Level = 0;
upgrade4Level = 0;
upgrade1Cost = 1;
upgrade2Cost = 3;
upgrade3Cost = 2000;
upgrade4Cost = 5000;
// Hide victory texts
getOutText.visible = false;
getOutText.alpha = 0;
youDidItText.alpha = 0;
// Hide game UI
player.visible = false;
upgrade1Button.visible = false;
upgrade2Button.visible = false;
upgrade3Button.visible = false;
upgrade4Button.visible = false;
upgrade1Text.visible = false;
upgrade2Text.visible = false;
upgrade3Text.visible = false;
upgrade4Text.visible = false;
coinText.visible = false;
healthText.visible = false;
waveText.visible = false;
adminCornerButton.visible = false;
adminCornerText.visible = false;
bossText.visible = false;
adminMenu.visible = false;
showAdminMenu = false;
// Show menu elements
menuBackground.visible = true;
menuTitle.visible = true;
startButton.visible = true;
startButtonText.visible = true;
adminButton.visible = true;
adminButtonText.visible = true;
instructionText.visible = true;
// Play menu music
LK.stopMusic();
LK.playMusic('menuMusic', {
loop: true
});
}, 5000);
}
});
}
});
}, 10000);
}
});
}
coins += enemy.coinValue;
coinText.setText('Coins: ' + coins);
LK.getSound('enemyDeath').play();
enemiesKilled++;
enemy.destroy();
enemies.splice(j, 1);
}
}
break;
}
}
enemy.lastY = enemy.y;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1004,8 +1004,14 @@
waveInProgress = true;
waveDelayTimer = 0;
waveText.setText('Wave: ' + currentWave);
return;
+ } else if (currentWave >= 1 && currentWave <= 49) {
+ // Play background music for waves 1-49
+ LK.stopMusic();
+ LK.playMusic('bgMusic', {
+ loop: true
+ });
}
enemiesInWave = enemiesInWave + 2; // Increase enemies per wave by 2
enemiesSpawned = 0;
enemiesKilled = 0;