User prompt
make a movement button
User prompt
make enemies come to me ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
when I hold the mouse it shoots
User prompt
make a more comfrotable movment system ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
then make a better movment mechanic ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
make a movment system for the carechter
Code edit (1 edits merged)
Please save this source code
User prompt
Mango Shooters
Initial prompt
Game Title: Mango Shooters mechanics: FPS game, you shoot with your mouse and move with w,a,s,d. Enemies are: Mango and Mustard, Mango has 100 HP and Mustard has 200 HP. You have a AK 47 that deals 2 damage per bullet. You kill them in a destroyed city Objective: kill Mangos and Mustards and get coins, every mango you kill is 1 point, every mustard you kill is 2 coin
/****
* 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++;
// Don't start any wave after wave 50
if (currentWave > 50) {
return;
}
// 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;
// Calculate angle to target tap location
var deltaX = targetX - bullet.x;
var deltaY = targetY - bullet.y;
var angle = Math.atan2(deltaY, deltaX);
// Set bullet direction toward tap location
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;
// Stop boss fight music when boss is defeated
LK.stopMusic();
// 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;
// Stop boss fight music when boss is defeated
LK.stopMusic();
// 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;
// Stop boss fight music when boss is defeated
LK.stopMusic();
// 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;
}
}; /****
* 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++;
// Don't start any wave after wave 50
if (currentWave > 50) {
return;
}
// 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;
// Calculate angle to target tap location
var deltaX = targetX - bullet.x;
var deltaY = targetY - bullet.y;
var angle = Math.atan2(deltaY, deltaX);
// Set bullet direction toward tap location
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;
// Stop boss fight music when boss is defeated
LK.stopMusic();
// 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;
// Stop boss fight music when boss is defeated
LK.stopMusic();
// 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;
// Stop boss fight music when boss is defeated
LK.stopMusic();
// 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;
}
};