User prompt
Let him give 300 money when he deletes the sword
User prompt
Speed of tower (Very Slow=1,Slow=2,normal=3,fast=4,Flash=5)
User prompt
Speed=(1 very slow, 2 Slow, 3 normal,4 Fast,5 very fast)
Code edit (1 edits merged)
Please save this source code
User prompt
Add Sword Tower Damage 5 pierce 1 speed 1 long 3 $340
User prompt
Change balloons name to balls
User prompt
Let it take 15 Round, let GB come in the last round
User prompt
Delete tb bloon
User prompt
Delete bb,bbe,bgb bloon
User prompt
When we delete it, it gives $80
User prompt
Click on the tower 2 time and it will be deleted
User prompt
Delete upgrades
User prompt
When you click on the upgrades, it closes back, when you touch them, it gets Upgrade But no matter how much money it is, and if the money is not enough, say "you can't afford it"
User prompt
It doesn't work even though I click on upgrades
User prompt
Add Upgrades back
User prompt
When I click on the dart, something comes up (Something round), delete it
User prompt
Make the Upgrade buttons big. And when you click on them, let it get Upgrade
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of null (reading 'getUpgradeCost')' in or related to this line: 'var cost = selectedTower.getUpgradeCost(pathIndex);' Line Number: 548
User prompt
When you click on the power-ups, let it get stronger, when it is max, it will write max level
User prompt
Let the path of the balloons be gray
User prompt
Take the money a little to the left
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of null (reading 'upgrade')' in or related to this line: 'if (selectedTower.upgrade(pathIndex)) {' Line Number: 537
User prompt
When you click on the dart, the power-up location will open and the place where the balloons go will be gray
User prompt
Make Bloons: Red 1 Blue 1 (Turns into a red balloon after death) Green 1 (Turns into a Blue balloon after death) Yellow 1 (Turns into a Green balloon after death) Pink 1 (Turns into a Pink balloon after death) White 1 Feature:Does not take damage from Normal Darts (Turns into a red balloon after death) Black 1 Feature:Undamaged by Stone and Iron Swords (Turns into a red balloon after death) Rainbow 5 (Turns into a 2 Pink balloon after death) Seramic 10 (Turns İnto 2 Rainbow Balloon after death) GB 25 (Turns into 4 Seramic balloon after death) BGB 100 (Turns into 4 GB balloon after death) TB 200 (Turns into 2 BGB balloon after death) BBE 500 (Turns into 2 TB and 1 BGB balloon after death) BB 1000 Feature:At 500 HP Spawns a BBE (Turns into a BBE balloon after death) Popers 1.Dart Poper Damage 2 Pierce 2 Speed 2 Long 2 1.way 1.Power Darts (+2 Damage) 250$->2.Sharp Darts (Pierce 2+) 400$->3.Spike Thrower (Pierce +6 and Damage 4+) 1050$ 2.way 1.Long Darts (2->3 long) 300$->Super Long (3->4 Long) 600$->Dart Poper Factory (Spawn Dart Poper 0-0-0 every Minute) 1350$ 3.way 1.Speeder (2->3 Speed) 225$->Triple Shot (Shot Triple) 475$->HYPERSPEED (3->5 Speed) 1645$ SUPER (3-3-3):+5 Pierce,+7 Damage 4000$
User prompt
Balloon Defense Squad
/**** * Classes ****/ var Balloon = Container.expand(function (type, x, y) { var self = Container.call(this); self.balloonType = type || 'red'; self.x = x || 0; self.y = y || 0; self.speed = 2; self.pathIndex = 0; self.lastX = self.x; self.lastY = self.y; // Define balloon properties var balloonData = { 'red': { hp: 1, asset: 'redBalloon', reward: 1, spawns: [] }, 'blue': { hp: 1, asset: 'blueBalloon', reward: 2, spawns: ['red'] }, 'green': { hp: 1, asset: 'greenBalloon', reward: 3, spawns: ['blue'] }, 'yellow': { hp: 1, asset: 'yellowBalloon', reward: 4, spawns: ['green'] }, 'pink': { hp: 1, asset: 'pinkBalloon', reward: 5, spawns: ['yellow'] }, 'white': { hp: 1, asset: 'whiteBalloon', reward: 6, spawns: ['red'], immuneToDarts: true }, 'black': { hp: 1, asset: 'blackBalloon', reward: 7, spawns: ['red'], immuneToSwords: true }, 'rainbow': { hp: 5, asset: 'rainbowBalloon', reward: 15, spawns: ['pink', 'pink'] }, 'ceramic': { hp: 10, asset: 'ceramicBalloon', reward: 30, spawns: ['rainbow', 'rainbow'] }, 'gb': { hp: 25, asset: 'gbBalloon', reward: 75, spawns: ['ceramic', 'ceramic', 'ceramic', 'ceramic'] }, 'bgb': { hp: 100, asset: 'bgbBalloon', reward: 200, spawns: ['gb', 'gb', 'gb', 'gb'] }, 'tb': { hp: 200, asset: 'tbBalloon', reward: 400, spawns: ['bgb', 'bgb'] }, 'bbe': { hp: 500, asset: 'bbeBalloon', reward: 800, spawns: ['tb', 'tb', 'bgb'] }, 'bb': { hp: 1000, asset: 'bbBalloon', reward: 1500, spawns: ['bbe'], spawnsBBEAt: 500 } }; self.data = balloonData[self.balloonType]; self.hp = self.data.hp; self.maxHp = self.data.hp; var balloonGraphics = self.attachAsset(self.data.asset, { anchorX: 0.5, anchorY: 0.5 }); self.takeDamage = function (damage, weaponType) { // Check immunities if (weaponType === 'dart' && self.data.immuneToDarts) return false; if (weaponType === 'sword' && self.data.immuneToSwords) return false; self.hp -= damage; // Check for BB special spawn if (self.balloonType === 'bb' && self.hp <= 500 && !self.spawnedBBE) { self.spawnedBBE = true; spawnBalloon('bbe', self.x, self.y); } if (self.hp <= 0) { return true; // Balloon destroyed } return false; }; self.update = function () { if (pathPoints.length === 0) return; self.lastX = self.x; self.lastY = self.y; if (self.pathIndex < pathPoints.length - 1) { var target = pathPoints[self.pathIndex + 1]; var dx = target.x - self.x; var dy = target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 10) { self.pathIndex++; } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); var DartProjectile = Container.expand(function (x, y, targetX, targetY, damage, pierce) { var self = Container.call(this); self.x = x; self.y = y; self.damage = damage || 2; self.pierce = pierce || 2; self.pierceCount = 0; self.speed = 8; var dx = targetX - x; var dy = targetY - y; var distance = Math.sqrt(dx * dx + dy * dy); self.velocityX = dx / distance * self.speed; self.velocityY = dy / distance * self.speed; var projectileGraphics = self.attachAsset('dartProjectile', { anchorX: 0.5, anchorY: 0.5 }); projectileGraphics.rotation = Math.atan2(dy, dx); self.update = function () { self.x += self.velocityX; self.y += self.velocityY; // Check collision with balloons for (var i = balloons.length - 1; i >= 0; i--) { var balloon = balloons[i]; if (self.intersects(balloon)) { var destroyed = balloon.takeDamage(self.damage, 'dart'); if (destroyed) { // Award money money += balloon.data.reward; updateMoneyDisplay(); // Spawn child balloons for (var j = 0; j < balloon.data.spawns.length; j++) { spawnBalloon(balloon.data.spawns[j], balloon.x, balloon.y); } // Remove balloon balloon.destroy(); balloons.splice(i, 1); LK.getSound('pop').play(); } self.pierceCount++; if (self.pierceCount >= self.pierce) { return true; // Destroy projectile } break; } } // Remove if off screen if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) { return true; } return false; }; return self; }); var DartTower = Container.expand(function (x, y) { var self = Container.call(this); self.x = x; self.y = y; self.damage = 2; self.pierce = 2; self.range = 150; self.fireRate = 30; // frames between shots self.lastShot = 0; self.tripleShot = false; self.hyperspeed = false; // Upgrade levels [path1, path2, path3] self.upgrades = [0, 0, 0]; var towerGraphics = self.attachAsset('dartTower', { anchorX: 0.5, anchorY: 0.5 }); self.getUpgradeCost = function (path) { var costs = [[250, 400, 1050], // Path 1: Power -> Sharp -> Spike [300, 600, 1350], // Path 2: Long -> Super Long -> Factory [225, 475, 1645] // Path 3: Speed -> Triple -> Hyperspeed ]; if (self.upgrades[path] >= 3) return -1; // Max level return costs[path][self.upgrades[path]]; }; self.upgrade = function (path) { var cost = self.getUpgradeCost(path); if (cost === -1 || money < cost) return false; money -= cost; updateMoneyDisplay(); self.upgrades[path]++; // Apply upgrade effects self.applyUpgrades(); return true; }; self.applyUpgrades = function () { // Reset to base stats self.damage = 2; self.pierce = 2; self.range = 150; self.fireRate = 30; self.tripleShot = false; self.hyperspeed = false; // Path 1: Damage and pierce if (self.upgrades[0] >= 1) self.damage += 2; // Power Darts if (self.upgrades[0] >= 2) self.pierce += 2; // Sharp Darts if (self.upgrades[0] >= 3) { // Spike Thrower self.pierce += 6; self.damage += 4; } // Path 2: Range if (self.upgrades[1] >= 1) self.range = 200; // Long Darts if (self.upgrades[1] >= 2) self.range = 250; // Super Long // Path 2 level 3 (Factory) handled separately // Path 3: Speed and multi-shot if (self.upgrades[2] >= 1) self.fireRate = 20; // Speeder if (self.upgrades[2] >= 2) self.tripleShot = true; // Triple Shot if (self.upgrades[2] >= 3) { // Hyperspeed self.fireRate = 12; self.hyperspeed = true; } // Super upgrade (3-3-3) if (self.upgrades[0] === 3 && self.upgrades[1] === 3 && self.upgrades[2] === 3) { self.pierce += 5; self.damage += 7; } }; self.findTarget = function () { var closestBalloon = null; var closestDistance = self.range + 1; for (var i = 0; i < balloons.length; i++) { var balloon = balloons[i]; var dx = balloon.x - self.x; var dy = balloon.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= self.range && distance < closestDistance) { closestBalloon = balloon; closestDistance = distance; } } return closestBalloon; }; self.shoot = function (target) { if (!target) return; LK.getSound('shoot').play(); if (self.tripleShot) { // Triple shot with spread var angles = [-0.3, 0, 0.3]; for (var i = 0; i < 3; i++) { var angle = Math.atan2(target.y - self.y, target.x - self.x) + angles[i]; var targetX = self.x + Math.cos(angle) * 200; var targetY = self.y + Math.sin(angle) * 200; var projectile = new DartProjectile(self.x, self.y, targetX, targetY, self.damage, self.pierce); projectiles.push(projectile); game.addChild(projectile); } } else { var projectile = new DartProjectile(self.x, self.y, target.x, target.y, self.damage, self.pierce); projectiles.push(projectile); game.addChild(projectile); } }; self.update = function () { if (LK.ticks - self.lastShot >= self.fireRate) { var target = self.findTarget(); if (target) { self.shoot(target); self.lastShot = LK.ticks; } } // Factory spawn (Path 2 level 3) if (self.upgrades[1] === 3 && LK.ticks % 3600 === 0) { // Every minute // Try to spawn a new dart tower nearby var spawnX = self.x + (Math.random() - 0.5) * 200; var spawnY = self.y + (Math.random() - 0.5) * 200; // Keep within bounds spawnX = Math.max(100, Math.min(1948, spawnX)); spawnY = Math.max(200, Math.min(2632, spawnY)); var newTower = new DartTower(spawnX, spawnY); towers.push(newTower); game.addChild(newTower); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ ; // Game variables var balloons = []; var towers = []; var projectiles = []; var money = 500; var lives = 100; var wave = 1; var waveTimer = 0; var balloonsSpawned = 0; var balloonsToSpawn = 5; // Path points for balloons to follow var pathPoints = [{ x: -50, y: 400 }, { x: 300, y: 400 }, { x: 300, y: 800 }, { x: 800, y: 800 }, { x: 800, y: 1200 }, { x: 1400, y: 1200 }, { x: 1400, y: 600 }, { x: 1800, y: 600 }, { x: 2100, y: 600 }]; // UI Elements var moneyText = new Text2('Money: $' + money, { size: 60, fill: 0xFFFF00 }); moneyText.anchor.set(0, 0); LK.gui.topRight.addChild(moneyText); moneyText.x = -300; moneyText.y = 20; var livesText = new Text2('Lives: ' + lives, { size: 60, fill: 0xFF0000 }); livesText.anchor.set(0, 0); LK.gui.topRight.addChild(livesText); livesText.x = -300; livesText.y = 90; var waveText = new Text2('Wave: ' + wave, { size: 60, fill: 0x00FF00 }); waveText.anchor.set(0, 0); LK.gui.topLeft.addChild(waveText); waveText.x = 120; waveText.y = 20; // Tower purchase button var towerButton = LK.getAsset('towerButton', { anchorX: 0.5, anchorY: 0.5 }); LK.gui.bottomLeft.addChild(towerButton); towerButton.x = 100; towerButton.y = -100; var buttonText = new Text2('Dart\n$100', { size: 40, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); towerButton.addChild(buttonText); var selectedTowerType = 'dart'; var placingTower = false; function updateMoneyDisplay() { moneyText.setText('Money: $' + money); } function updateLivesDisplay() { livesText.setText('Lives: ' + lives); } function updateWaveDisplay() { waveText.setText('Wave: ' + wave); } function spawnBalloon(type, x, y) { var balloon = new Balloon(type, x || -50, y || 400); balloons.push(balloon); game.addChild(balloon); } function startWave() { balloonsSpawned = 0; balloonsToSpawn = 5 + wave * 2; waveTimer = 0; updateWaveDisplay(); } // Start first wave startWave(); // Event handlers towerButton.down = function (x, y, obj) { if (money >= 100) { placingTower = true; } }; game.down = function (x, y, obj) { if (placingTower && money >= 100) { // Check if position is valid (not too close to path) var validPosition = true; for (var i = 0; i < pathPoints.length; i++) { var point = pathPoints[i]; var dx = x - point.x; var dy = y - point.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 80) { validPosition = false; break; } } if (validPosition) { money -= 100; updateMoneyDisplay(); var newTower = new DartTower(x, y); towers.push(newTower); game.addChild(newTower); placingTower = false; } } }; game.update = function () { // Spawn balloons for current wave if (balloonsSpawned < balloonsToSpawn) { waveTimer++; if (waveTimer >= 60) { // Spawn every second var balloonType = 'red'; if (wave >= 3) balloonType = 'blue'; if (wave >= 5) balloonType = 'green'; if (wave >= 8) balloonType = 'yellow'; if (wave >= 12) balloonType = 'pink'; if (wave >= 15) balloonType = Math.random() < 0.3 ? 'white' : balloonType; if (wave >= 18) balloonType = Math.random() < 0.3 ? 'black' : balloonType; if (wave >= 25) balloonType = Math.random() < 0.2 ? 'rainbow' : balloonType; spawnBalloon(balloonType); balloonsSpawned++; waveTimer = 0; } } // Update balloons for (var i = balloons.length - 1; i >= 0; i--) { var balloon = balloons[i]; // Check if balloon reached the end if (balloon.pathIndex >= pathPoints.length - 1) { lives--; updateLivesDisplay(); balloon.destroy(); balloons.splice(i, 1); if (lives <= 0) { LK.showGameOver(); return; } } } // Update projectiles for (var i = projectiles.length - 1; i >= 0; i--) { var projectile = projectiles[i]; var shouldDestroy = projectile.update(); if (shouldDestroy) { projectile.destroy(); projectiles.splice(i, 1); } } // Check for wave completion if (balloonsSpawned >= balloonsToSpawn && balloons.length === 0) { wave++; money += 100; // Wave completion bonus updateMoneyDisplay(); startWave(); } // Victory condition if (wave > 50) { LK.showYouWin(); } }; // Balloon assets // Tower assets // UI assets // Sound effects
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,530 @@
-/****
+/****
+* Classes
+****/
+var Balloon = Container.expand(function (type, x, y) {
+ var self = Container.call(this);
+ self.balloonType = type || 'red';
+ self.x = x || 0;
+ self.y = y || 0;
+ self.speed = 2;
+ self.pathIndex = 0;
+ self.lastX = self.x;
+ self.lastY = self.y;
+ // Define balloon properties
+ var balloonData = {
+ 'red': {
+ hp: 1,
+ asset: 'redBalloon',
+ reward: 1,
+ spawns: []
+ },
+ 'blue': {
+ hp: 1,
+ asset: 'blueBalloon',
+ reward: 2,
+ spawns: ['red']
+ },
+ 'green': {
+ hp: 1,
+ asset: 'greenBalloon',
+ reward: 3,
+ spawns: ['blue']
+ },
+ 'yellow': {
+ hp: 1,
+ asset: 'yellowBalloon',
+ reward: 4,
+ spawns: ['green']
+ },
+ 'pink': {
+ hp: 1,
+ asset: 'pinkBalloon',
+ reward: 5,
+ spawns: ['yellow']
+ },
+ 'white': {
+ hp: 1,
+ asset: 'whiteBalloon',
+ reward: 6,
+ spawns: ['red'],
+ immuneToDarts: true
+ },
+ 'black': {
+ hp: 1,
+ asset: 'blackBalloon',
+ reward: 7,
+ spawns: ['red'],
+ immuneToSwords: true
+ },
+ 'rainbow': {
+ hp: 5,
+ asset: 'rainbowBalloon',
+ reward: 15,
+ spawns: ['pink', 'pink']
+ },
+ 'ceramic': {
+ hp: 10,
+ asset: 'ceramicBalloon',
+ reward: 30,
+ spawns: ['rainbow', 'rainbow']
+ },
+ 'gb': {
+ hp: 25,
+ asset: 'gbBalloon',
+ reward: 75,
+ spawns: ['ceramic', 'ceramic', 'ceramic', 'ceramic']
+ },
+ 'bgb': {
+ hp: 100,
+ asset: 'bgbBalloon',
+ reward: 200,
+ spawns: ['gb', 'gb', 'gb', 'gb']
+ },
+ 'tb': {
+ hp: 200,
+ asset: 'tbBalloon',
+ reward: 400,
+ spawns: ['bgb', 'bgb']
+ },
+ 'bbe': {
+ hp: 500,
+ asset: 'bbeBalloon',
+ reward: 800,
+ spawns: ['tb', 'tb', 'bgb']
+ },
+ 'bb': {
+ hp: 1000,
+ asset: 'bbBalloon',
+ reward: 1500,
+ spawns: ['bbe'],
+ spawnsBBEAt: 500
+ }
+ };
+ self.data = balloonData[self.balloonType];
+ self.hp = self.data.hp;
+ self.maxHp = self.data.hp;
+ var balloonGraphics = self.attachAsset(self.data.asset, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.takeDamage = function (damage, weaponType) {
+ // Check immunities
+ if (weaponType === 'dart' && self.data.immuneToDarts) return false;
+ if (weaponType === 'sword' && self.data.immuneToSwords) return false;
+ self.hp -= damage;
+ // Check for BB special spawn
+ if (self.balloonType === 'bb' && self.hp <= 500 && !self.spawnedBBE) {
+ self.spawnedBBE = true;
+ spawnBalloon('bbe', self.x, self.y);
+ }
+ if (self.hp <= 0) {
+ return true; // Balloon destroyed
+ }
+ return false;
+ };
+ self.update = function () {
+ if (pathPoints.length === 0) return;
+ self.lastX = self.x;
+ self.lastY = self.y;
+ if (self.pathIndex < pathPoints.length - 1) {
+ var target = pathPoints[self.pathIndex + 1];
+ var dx = target.x - self.x;
+ var dy = target.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 10) {
+ self.pathIndex++;
+ } else {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ }
+ };
+ return self;
+});
+var DartProjectile = Container.expand(function (x, y, targetX, targetY, damage, pierce) {
+ var self = Container.call(this);
+ self.x = x;
+ self.y = y;
+ self.damage = damage || 2;
+ self.pierce = pierce || 2;
+ self.pierceCount = 0;
+ self.speed = 8;
+ var dx = targetX - x;
+ var dy = targetY - y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ self.velocityX = dx / distance * self.speed;
+ self.velocityY = dy / distance * self.speed;
+ var projectileGraphics = self.attachAsset('dartProjectile', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ projectileGraphics.rotation = Math.atan2(dy, dx);
+ self.update = function () {
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ // Check collision with balloons
+ for (var i = balloons.length - 1; i >= 0; i--) {
+ var balloon = balloons[i];
+ if (self.intersects(balloon)) {
+ var destroyed = balloon.takeDamage(self.damage, 'dart');
+ if (destroyed) {
+ // Award money
+ money += balloon.data.reward;
+ updateMoneyDisplay();
+ // Spawn child balloons
+ for (var j = 0; j < balloon.data.spawns.length; j++) {
+ spawnBalloon(balloon.data.spawns[j], balloon.x, balloon.y);
+ }
+ // Remove balloon
+ balloon.destroy();
+ balloons.splice(i, 1);
+ LK.getSound('pop').play();
+ }
+ self.pierceCount++;
+ if (self.pierceCount >= self.pierce) {
+ return true; // Destroy projectile
+ }
+ break;
+ }
+ }
+ // Remove if off screen
+ if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) {
+ return true;
+ }
+ return false;
+ };
+ return self;
+});
+var DartTower = Container.expand(function (x, y) {
+ var self = Container.call(this);
+ self.x = x;
+ self.y = y;
+ self.damage = 2;
+ self.pierce = 2;
+ self.range = 150;
+ self.fireRate = 30; // frames between shots
+ self.lastShot = 0;
+ self.tripleShot = false;
+ self.hyperspeed = false;
+ // Upgrade levels [path1, path2, path3]
+ self.upgrades = [0, 0, 0];
+ var towerGraphics = self.attachAsset('dartTower', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.getUpgradeCost = function (path) {
+ var costs = [[250, 400, 1050],
+ // Path 1: Power -> Sharp -> Spike
+ [300, 600, 1350],
+ // Path 2: Long -> Super Long -> Factory
+ [225, 475, 1645] // Path 3: Speed -> Triple -> Hyperspeed
+ ];
+ if (self.upgrades[path] >= 3) return -1; // Max level
+ return costs[path][self.upgrades[path]];
+ };
+ self.upgrade = function (path) {
+ var cost = self.getUpgradeCost(path);
+ if (cost === -1 || money < cost) return false;
+ money -= cost;
+ updateMoneyDisplay();
+ self.upgrades[path]++;
+ // Apply upgrade effects
+ self.applyUpgrades();
+ return true;
+ };
+ self.applyUpgrades = function () {
+ // Reset to base stats
+ self.damage = 2;
+ self.pierce = 2;
+ self.range = 150;
+ self.fireRate = 30;
+ self.tripleShot = false;
+ self.hyperspeed = false;
+ // Path 1: Damage and pierce
+ if (self.upgrades[0] >= 1) self.damage += 2; // Power Darts
+ if (self.upgrades[0] >= 2) self.pierce += 2; // Sharp Darts
+ if (self.upgrades[0] >= 3) {
+ // Spike Thrower
+ self.pierce += 6;
+ self.damage += 4;
+ }
+ // Path 2: Range
+ if (self.upgrades[1] >= 1) self.range = 200; // Long Darts
+ if (self.upgrades[1] >= 2) self.range = 250; // Super Long
+ // Path 2 level 3 (Factory) handled separately
+ // Path 3: Speed and multi-shot
+ if (self.upgrades[2] >= 1) self.fireRate = 20; // Speeder
+ if (self.upgrades[2] >= 2) self.tripleShot = true; // Triple Shot
+ if (self.upgrades[2] >= 3) {
+ // Hyperspeed
+ self.fireRate = 12;
+ self.hyperspeed = true;
+ }
+ // Super upgrade (3-3-3)
+ if (self.upgrades[0] === 3 && self.upgrades[1] === 3 && self.upgrades[2] === 3) {
+ self.pierce += 5;
+ self.damage += 7;
+ }
+ };
+ self.findTarget = function () {
+ var closestBalloon = null;
+ var closestDistance = self.range + 1;
+ for (var i = 0; i < balloons.length; i++) {
+ var balloon = balloons[i];
+ var dx = balloon.x - self.x;
+ var dy = balloon.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance <= self.range && distance < closestDistance) {
+ closestBalloon = balloon;
+ closestDistance = distance;
+ }
+ }
+ return closestBalloon;
+ };
+ self.shoot = function (target) {
+ if (!target) return;
+ LK.getSound('shoot').play();
+ if (self.tripleShot) {
+ // Triple shot with spread
+ var angles = [-0.3, 0, 0.3];
+ for (var i = 0; i < 3; i++) {
+ var angle = Math.atan2(target.y - self.y, target.x - self.x) + angles[i];
+ var targetX = self.x + Math.cos(angle) * 200;
+ var targetY = self.y + Math.sin(angle) * 200;
+ var projectile = new DartProjectile(self.x, self.y, targetX, targetY, self.damage, self.pierce);
+ projectiles.push(projectile);
+ game.addChild(projectile);
+ }
+ } else {
+ var projectile = new DartProjectile(self.x, self.y, target.x, target.y, self.damage, self.pierce);
+ projectiles.push(projectile);
+ game.addChild(projectile);
+ }
+ };
+ self.update = function () {
+ if (LK.ticks - self.lastShot >= self.fireRate) {
+ var target = self.findTarget();
+ if (target) {
+ self.shoot(target);
+ self.lastShot = LK.ticks;
+ }
+ }
+ // Factory spawn (Path 2 level 3)
+ if (self.upgrades[1] === 3 && LK.ticks % 3600 === 0) {
+ // Every minute
+ // Try to spawn a new dart tower nearby
+ var spawnX = self.x + (Math.random() - 0.5) * 200;
+ var spawnY = self.y + (Math.random() - 0.5) * 200;
+ // Keep within bounds
+ spawnX = Math.max(100, Math.min(1948, spawnX));
+ spawnY = Math.max(200, Math.min(2632, spawnY));
+ var newTower = new DartTower(spawnX, spawnY);
+ towers.push(newTower);
+ game.addChild(newTower);
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
backgroundColor: 0x000000
-});
\ No newline at end of file
+});
+
+/****
+* Game Code
+****/
+;
+// Game variables
+var balloons = [];
+var towers = [];
+var projectiles = [];
+var money = 500;
+var lives = 100;
+var wave = 1;
+var waveTimer = 0;
+var balloonsSpawned = 0;
+var balloonsToSpawn = 5;
+// Path points for balloons to follow
+var pathPoints = [{
+ x: -50,
+ y: 400
+}, {
+ x: 300,
+ y: 400
+}, {
+ x: 300,
+ y: 800
+}, {
+ x: 800,
+ y: 800
+}, {
+ x: 800,
+ y: 1200
+}, {
+ x: 1400,
+ y: 1200
+}, {
+ x: 1400,
+ y: 600
+}, {
+ x: 1800,
+ y: 600
+}, {
+ x: 2100,
+ y: 600
+}];
+// UI Elements
+var moneyText = new Text2('Money: $' + money, {
+ size: 60,
+ fill: 0xFFFF00
+});
+moneyText.anchor.set(0, 0);
+LK.gui.topRight.addChild(moneyText);
+moneyText.x = -300;
+moneyText.y = 20;
+var livesText = new Text2('Lives: ' + lives, {
+ size: 60,
+ fill: 0xFF0000
+});
+livesText.anchor.set(0, 0);
+LK.gui.topRight.addChild(livesText);
+livesText.x = -300;
+livesText.y = 90;
+var waveText = new Text2('Wave: ' + wave, {
+ size: 60,
+ fill: 0x00FF00
+});
+waveText.anchor.set(0, 0);
+LK.gui.topLeft.addChild(waveText);
+waveText.x = 120;
+waveText.y = 20;
+// Tower purchase button
+var towerButton = LK.getAsset('towerButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+});
+LK.gui.bottomLeft.addChild(towerButton);
+towerButton.x = 100;
+towerButton.y = -100;
+var buttonText = new Text2('Dart\n$100', {
+ size: 40,
+ fill: 0xFFFFFF
+});
+buttonText.anchor.set(0.5, 0.5);
+towerButton.addChild(buttonText);
+var selectedTowerType = 'dart';
+var placingTower = false;
+function updateMoneyDisplay() {
+ moneyText.setText('Money: $' + money);
+}
+function updateLivesDisplay() {
+ livesText.setText('Lives: ' + lives);
+}
+function updateWaveDisplay() {
+ waveText.setText('Wave: ' + wave);
+}
+function spawnBalloon(type, x, y) {
+ var balloon = new Balloon(type, x || -50, y || 400);
+ balloons.push(balloon);
+ game.addChild(balloon);
+}
+function startWave() {
+ balloonsSpawned = 0;
+ balloonsToSpawn = 5 + wave * 2;
+ waveTimer = 0;
+ updateWaveDisplay();
+}
+// Start first wave
+startWave();
+// Event handlers
+towerButton.down = function (x, y, obj) {
+ if (money >= 100) {
+ placingTower = true;
+ }
+};
+game.down = function (x, y, obj) {
+ if (placingTower && money >= 100) {
+ // Check if position is valid (not too close to path)
+ var validPosition = true;
+ for (var i = 0; i < pathPoints.length; i++) {
+ var point = pathPoints[i];
+ var dx = x - point.x;
+ var dy = y - point.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 80) {
+ validPosition = false;
+ break;
+ }
+ }
+ if (validPosition) {
+ money -= 100;
+ updateMoneyDisplay();
+ var newTower = new DartTower(x, y);
+ towers.push(newTower);
+ game.addChild(newTower);
+ placingTower = false;
+ }
+ }
+};
+game.update = function () {
+ // Spawn balloons for current wave
+ if (balloonsSpawned < balloonsToSpawn) {
+ waveTimer++;
+ if (waveTimer >= 60) {
+ // Spawn every second
+ var balloonType = 'red';
+ if (wave >= 3) balloonType = 'blue';
+ if (wave >= 5) balloonType = 'green';
+ if (wave >= 8) balloonType = 'yellow';
+ if (wave >= 12) balloonType = 'pink';
+ if (wave >= 15) balloonType = Math.random() < 0.3 ? 'white' : balloonType;
+ if (wave >= 18) balloonType = Math.random() < 0.3 ? 'black' : balloonType;
+ if (wave >= 25) balloonType = Math.random() < 0.2 ? 'rainbow' : balloonType;
+ spawnBalloon(balloonType);
+ balloonsSpawned++;
+ waveTimer = 0;
+ }
+ }
+ // Update balloons
+ for (var i = balloons.length - 1; i >= 0; i--) {
+ var balloon = balloons[i];
+ // Check if balloon reached the end
+ if (balloon.pathIndex >= pathPoints.length - 1) {
+ lives--;
+ updateLivesDisplay();
+ balloon.destroy();
+ balloons.splice(i, 1);
+ if (lives <= 0) {
+ LK.showGameOver();
+ return;
+ }
+ }
+ }
+ // Update projectiles
+ for (var i = projectiles.length - 1; i >= 0; i--) {
+ var projectile = projectiles[i];
+ var shouldDestroy = projectile.update();
+ if (shouldDestroy) {
+ projectile.destroy();
+ projectiles.splice(i, 1);
+ }
+ }
+ // Check for wave completion
+ if (balloonsSpawned >= balloonsToSpawn && balloons.length === 0) {
+ wave++;
+ money += 100; // Wave completion bonus
+ updateMoneyDisplay();
+ startWave();
+ }
+ // Victory condition
+ if (wave > 50) {
+ LK.showYouWin();
+ }
+};
+// Balloon assets
+// Tower assets
+// UI assets
+// Sound effects
\ No newline at end of file
Red ball. In-Game asset. 2d. High contrast. No shadows
Yellow ball. In-Game asset. 2d. High contrast. No shadows
Green ball. In-Game asset. 2d. High contrast. No shadows
Brown ball (not basketball) . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
White ball. In-Game asset. 2d. High contrast. No shadows
Rainbow ball. In-Game asset. 2d. High contrast. No shadows
Pink ball. In-Game asset. 2d. High contrast. No shadows
Off orange Ball (not a basketball). In-Game asset. 2d. High contrast. No shadows
Blue ball. In-Game asset. 2d. High contrast. No shadows
Grey ball. In-Game asset. 2d. High contrast. No shadows
Dart. In-Game asset. 2d. High contrast. No shadows
Sword. In-Game asset. 2d. High contrast. No shadows