User prompt
eğer hard mode açılırsa 3x daha fazala düşman her modda boss gelsin ve birşey öldürünce 5 para kazansın ve sniper eklensin sniper yavaş ama arenanın %80nine vurabiliyor
User prompt
modese basınca open hard mode butonnu gelsin arkaplanlı
User prompt
modesa basınca oyun dursun ve ekrana zor modu aç gelsin
User prompt
modes wave 1e deymesin
User prompt
add modes button
User prompt
kılıçlılar 4kişi öldürünce ölsün
User prompt
kılıçlıların ölümünü ekle
User prompt
öldürülen her düşman için 3 para kazan
User prompt
buttonlar birbirine deymesinn
User prompt
kılıçlı adam ekle ve bu saldırmaya gitsin
User prompt
bosslar ekle
User prompt
karaktere tıklayınca gelen popupu sil
User prompt
yeni dümanlar ekle
User prompt
her levele farklı farklı düşmanlar ekle
User prompt
her wave geçilince 30 para versin
User prompt
okçu kulenin içinde olsun ve vurduğu alan tankın 2 katı olsun
User prompt
askerleri kulenin yanına koyabilelim
User prompt
savunduğmuz yere 1 okçu koy ve tankla aynı hasarı verin
User prompt
popupların arkasını doldur
User prompt
askerlerimizin nereye vurduğnu dokununca göster
User prompt
yazılar büyüsün
User prompt
yazılar küçülsün ve birbirine deymesin düzenli olsun
User prompt
fiyatı yaz
User prompt
arenaya koyulan karaktere tıklayınca gelen güçlendirme yeri 3 kat büyüsün
User prompt
oyuna başlıyınca güçlendirmeler kaydedilmesin ↪💡 Consider importing and using the following plugins: @upit/storage.v1
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Base = Container.expand(function () { var self = Container.call(this); var baseGraphics = self.attachAsset('playerBase', { anchorX: 0.5, anchorY: 0.5 }); self.health = 500; self.maxHealth = 500; self.isDead = false; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.health = 0; self.isDead = true; } }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.damage = 25; self.targetX = 0; self.targetY = 0; self.isPlayerBullet = true; self.update = function () { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < self.speed) { self.x = self.targetX; self.y = self.targetY; self.hasReachedTarget = true; } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); self.health = 100; self.maxHealth = 100; self.speed = 1; self.damage = 30; self.isDead = false; self.hasReachedBase = false; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.health = 0; self.isDead = true; } }; self.update = function () { if (self.isDead || self.hasReachedBase) return; var dx = playerBase.x - self.x; var dy = playerBase.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 80) { self.hasReachedBase = true; playerBase.takeDamage(self.damage); } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; return self; }); var MegaBoss = Enemy.expand(function () { var self = Enemy.call(this); var megaBossGraphics = self.attachAsset('enemyTank', { anchorX: 0.5, anchorY: 0.5 }); megaBossGraphics.tint = 0x4B0082; megaBossGraphics.scaleX = 2.0; megaBossGraphics.scaleY = 2.0; self.health = 800 + waveNumber * 100; self.maxHealth = self.health; self.speed = 0.3; self.damage = 150; self.attackRange = 400; self.attackCooldown = 0; self.attackDelay = 90; self.multiShotCooldown = 0; self.multiShotDelay = 240; // 4 seconds self.healCooldown = 0; self.healDelay = 600; // 10 seconds self.isBoss = true; self.update = function () { if (self.isDead || self.hasReachedBase) return; // Regular movement towards base var dx = playerBase.x - self.x; var dy = playerBase.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 80) { self.hasReachedBase = true; playerBase.takeDamage(self.damage); } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } // Multi-shot attack if (self.multiShotCooldown <= 0) { // Shoot at up to 3 different targets var targetsHit = 0; for (var i = 0; i < playerUnits.length && targetsHit < 3; i++) { var unit = playerUnits[i]; if (unit.isDead) continue; var udx = unit.x - self.x; var udy = unit.y - self.y; var udistance = Math.sqrt(udx * udx + udy * udy); if (udistance <= self.attackRange) { var bossBullet = new Bullet(); bossBullet.x = self.x; bossBullet.y = self.y; bossBullet.targetX = unit.x; bossBullet.targetY = unit.y; bossBullet.damage = 80; bossBullet.isPlayerBullet = false; bossBullet.speed = 7; bullets.push(bossBullet); game.addChild(bossBullet); targetsHit++; } } if (targetsHit > 0) { self.multiShotCooldown = self.multiShotDelay; } } if (self.multiShotCooldown > 0) { self.multiShotCooldown--; } // Self heal ability if (self.healCooldown <= 0 && self.health < self.maxHealth * 0.7) { self.health = Math.min(self.maxHealth, self.health + 200); self.healCooldown = self.healDelay; // Visual healing effect var healEffect = LK.getAsset('explosion', { anchorX: 0.5, anchorY: 0.5, x: self.x, y: self.y, alpha: 0.7, scaleX: 0.5, scaleY: 0.5 }); healEffect.tint = 0x00FF00; game.addChild(healEffect); tween(healEffect, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 1000, onFinish: function onFinish() { healEffect.destroy(); } }); } if (self.healCooldown > 0) { self.healCooldown--; } }; return self; }); var EnemyTank = Enemy.expand(function () { var self = Enemy.call(this); var tankGraphics = self.attachAsset('enemyTank', { anchorX: 0.5, anchorY: 0.5 }); self.health = 120; self.maxHealth = 120; self.speed = 0.8; self.damage = 40; return self; }); var EnemySwarm = Enemy.expand(function () { var self = Enemy.call(this); var swarmGraphics = self.attachAsset('enemyInfantry', { anchorX: 0.5, anchorY: 0.5 }); swarmGraphics.tint = 0xFFFF00; swarmGraphics.scaleX = 0.7; swarmGraphics.scaleY = 0.7; self.health = 25; self.maxHealth = 25; self.speed = 2.0; self.damage = 10; return self; }); var EnemyShielder = Enemy.expand(function () { var self = Enemy.call(this); var shielderGraphics = self.attachAsset('enemyTank', { anchorX: 0.5, anchorY: 0.5 }); shielderGraphics.tint = 0x4169E1; shielderGraphics.scaleX = 1.1; shielderGraphics.scaleY = 1.1; self.health = 180; self.maxHealth = 180; self.speed = 0.7; self.damage = 35; self.shieldActive = true; self.takeDamage = function (damage) { // Shielder takes reduced damage when shield is active var actualDamage = self.shieldActive ? damage * 0.5 : damage; self.health -= actualDamage; if (self.health <= 0) { self.health = 0; self.isDead = true; } // Shield breaks at half health if (self.health <= self.maxHealth * 0.5) { self.shieldActive = false; shielderGraphics.tint = 0xFF4500; } }; return self; }); var EnemyInfantry = Enemy.expand(function () { var self = Enemy.call(this); var infantryGraphics = self.attachAsset('enemyInfantry', { anchorX: 0.5, anchorY: 0.5 }); self.health = 50; self.maxHealth = 50; self.speed = 1.5; self.damage = 25; return self; }); var EnemyHeavy = Enemy.expand(function () { var self = Enemy.call(this); var heavyGraphics = self.attachAsset('enemyTank', { anchorX: 0.5, anchorY: 0.5 }); heavyGraphics.tint = 0x4B0082; heavyGraphics.scaleX = 1.2; heavyGraphics.scaleY = 1.2; self.health = 200; self.maxHealth = 200; self.speed = 0.6; self.damage = 60; return self; }); var EnemyHealer = Enemy.expand(function () { var self = Enemy.call(this); var healerGraphics = self.attachAsset('enemyInfantry', { anchorX: 0.5, anchorY: 0.5 }); healerGraphics.tint = 0x9932CC; healerGraphics.scaleX = 0.8; healerGraphics.scaleY = 0.8; self.health = 60; self.maxHealth = 60; self.speed = 1.2; self.damage = 15; self.healRange = 200; self.healCooldown = 0; self.healDelay = 180; // 3 seconds at 60fps self.healPower = 30; self.update = function () { if (self.isDead || self.hasReachedBase) return; // Heal nearby enemies if (self.healCooldown <= 0) { for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; if (enemy !== self && !enemy.isDead && enemy.health < enemy.maxHealth) { var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= self.healRange) { enemy.health = Math.min(enemy.maxHealth, enemy.health + self.healPower); self.healCooldown = self.healDelay; // Visual healing effect var healEffect = LK.getAsset('explosion', { anchorX: 0.5, anchorY: 0.5, x: enemy.x, y: enemy.y, alpha: 0.7, scaleX: 0.3, scaleY: 0.3 }); healEffect.tint = 0x00FF00; game.addChild(healEffect); tween(healEffect, { scaleX: 1, scaleY: 1, alpha: 0 }, { duration: 800, onFinish: function onFinish() { healEffect.destroy(); } }); break; } } } } if (self.healCooldown > 0) { self.healCooldown--; } // Move towards base var dx = playerBase.x - self.x; var dy = playerBase.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 80) { self.hasReachedBase = true; playerBase.takeDamage(self.damage); } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; return self; }); var EnemyFast = Enemy.expand(function () { var self = Enemy.call(this); var fastGraphics = self.attachAsset('enemyInfantry', { anchorX: 0.5, anchorY: 0.5 }); fastGraphics.tint = 0x00FF00; self.health = 30; self.maxHealth = 30; self.speed = 2.5; self.damage = 15; return self; }); var EnemyExploder = Enemy.expand(function () { var self = Enemy.call(this); var exploderGraphics = self.attachAsset('enemyInfantry', { anchorX: 0.5, anchorY: 0.5 }); exploderGraphics.tint = 0xFF1493; exploderGraphics.scaleX = 0.9; exploderGraphics.scaleY = 0.9; self.health = 40; self.maxHealth = 40; self.speed = 1.8; self.damage = 20; self.explosionRadius = 150; self.explodeOnDeath = function () { // Damage nearby player units when exploder dies for (var i = 0; i < playerUnits.length; i++) { var unit = playerUnits[i]; var dx = unit.x - self.x; var dy = unit.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= self.explosionRadius) { unit.takeDamage(50); } } // Visual explosion effect createExplosion(self.x, self.y); }; return self; }); var EnemyBoss = Enemy.expand(function () { var self = Enemy.call(this); var bossGraphics = self.attachAsset('enemyTank', { anchorX: 0.5, anchorY: 0.5 }); bossGraphics.tint = 0x8B0000; bossGraphics.scaleX = 1.5; bossGraphics.scaleY = 1.5; self.health = 400 + waveNumber * 50; self.maxHealth = self.health; self.speed = 0.4; self.damage = 100; self.attackRange = 300; self.attackCooldown = 0; self.attackDelay = 120; // 2 seconds self.specialAttackCooldown = 0; self.specialAttackDelay = 300; // 5 seconds self.isBoss = true; self.update = function () { if (self.isDead || self.hasReachedBase) return; // Regular movement towards base var dx = playerBase.x - self.x; var dy = playerBase.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 80) { self.hasReachedBase = true; playerBase.takeDamage(self.damage); } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } // Boss ranged attack if (self.attackCooldown <= 0) { // Find nearest player unit to attack var nearestUnit = null; var shortestDistance = self.attackRange; for (var i = 0; i < playerUnits.length; i++) { var unit = playerUnits[i]; if (unit.isDead) continue; var udx = unit.x - self.x; var udy = unit.y - self.y; var udistance = Math.sqrt(udx * udx + udy * udy); if (udistance < shortestDistance) { shortestDistance = udistance; nearestUnit = unit; } } if (nearestUnit) { // Create boss bullet var bossBullet = new Bullet(); bossBullet.x = self.x; bossBullet.y = self.y; bossBullet.targetX = nearestUnit.x; bossBullet.targetY = nearestUnit.y; bossBullet.damage = 60; bossBullet.isPlayerBullet = false; bossBullet.speed = 6; bullets.push(bossBullet); game.addChild(bossBullet); self.attackCooldown = self.attackDelay; } } if (self.attackCooldown > 0) { self.attackCooldown--; } // Special area attack if (self.specialAttackCooldown <= 0) { // Damage all player units within range for (var i = 0; i < playerUnits.length; i++) { var unit = playerUnits[i]; var udx = unit.x - self.x; var udy = unit.y - self.y; var udistance = Math.sqrt(udx * udx + udy * udy); if (udistance <= 400) { unit.takeDamage(40); createExplosion(unit.x, unit.y); } } self.specialAttackCooldown = self.specialAttackDelay; } if (self.specialAttackCooldown > 0) { self.specialAttackCooldown--; } }; return self; }); var PlayerUnit = Container.expand(function () { var self = Container.call(this); self.health = 100; self.maxHealth = 100; self.attackRange = 200; self.attackCooldown = 0; self.attackDelay = 60; self.damage = 25; self.unitType = 'tank'; self.lastTarget = null; self.rangeIndicator = null; self.targetIndicator = null; self.showingAttackInfo = false; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.health = 0; self.isDead = true; } }; self.findNearestEnemy = function () { var nearestEnemy = null; var shortestDistance = self.attackRange; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; if (enemy.isDead) continue; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < shortestDistance) { shortestDistance = distance; nearestEnemy = enemy; } } return nearestEnemy; }; self.attack = function (target) { if (self.attackCooldown <= 0) { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullet.targetX = target.x; bullet.targetY = target.y; bullet.damage = self.damage; bullet.isPlayerBullet = true; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); self.attackCooldown = self.attackDelay; // Update target indicator position if visible if (self.showingAttackInfo && self.targetIndicator) { self.targetIndicator.x = target.x; self.targetIndicator.y = target.y; } } }; self.showAttackInfo = function () { if (self.showingAttackInfo) return; // Create range indicator self.rangeIndicator = LK.getAsset('attackRange', { anchorX: 0.5, anchorY: 0.5, alpha: 0.3, scaleX: self.attackRange / 5, scaleY: self.attackRange / 5 }); self.rangeIndicator.x = self.x; self.rangeIndicator.y = self.y; game.addChild(self.rangeIndicator); // Create target indicator if there's a current target var currentTarget = self.findNearestEnemy(); if (currentTarget) { self.targetIndicator = LK.getAsset('targetIndicator', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); self.targetIndicator.x = currentTarget.x; self.targetIndicator.y = currentTarget.y; game.addChild(self.targetIndicator); } self.showingAttackInfo = true; }; self.hideAttackInfo = function () { if (!self.showingAttackInfo) return; if (self.rangeIndicator) { self.rangeIndicator.destroy(); self.rangeIndicator = null; } if (self.targetIndicator) { self.targetIndicator.destroy(); self.targetIndicator = null; } self.showingAttackInfo = false; }; self.down = function (x, y, obj) { // Hide attack info for all other units for (var i = 0; i < playerUnits.length; i++) { if (playerUnits[i] !== self) { playerUnits[i].hideAttackInfo(); } } // Just show attack info without popup self.showAttackInfo(); }; self.update = function () { if (self.isDead) return; if (self.attackCooldown > 0) { self.attackCooldown--; } var target = self.findNearestEnemy(); if (target) { self.attack(target); } }; return self; }); var Tank = PlayerUnit.expand(function () { var self = PlayerUnit.call(this); var tankGraphics = self.attachAsset('playerTank', { anchorX: 0.5, anchorY: 0.5 }); self.health = 150 + (upgrades.health - 1) * 30; self.maxHealth = self.health; self.attackRange = 250 + (upgrades.range - 1) * 25; self.attackDelay = 45; self.damage = 40 + (upgrades.damage - 1) * 10; self.unitType = 'tank'; self.cost = 100; return self; }); var SwordWarrior = PlayerUnit.expand(function () { var self = PlayerUnit.call(this); var swordGraphics = self.attachAsset('swordWarrior', { anchorX: 0.5, anchorY: 0.5 }); self.health = 120 + (upgrades.health - 1) * 25; self.maxHealth = self.health; self.attackRange = 80; // Short melee range self.attackDelay = 40; self.damage = 50 + (upgrades.damage - 1) * 12; self.unitType = 'sword'; self.cost = 90; self.speed = 2.5; // Fast movement to reach enemies self.currentTarget = null; self.isMovingToTarget = false; self.killCount = 0; // Track how many enemies killed self.maxKills = 4; // Die after 4 kills self.findNearestEnemy = function () { var nearestEnemy = null; var shortestDistance = 600; // Search range much larger than attack range for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; if (enemy.isDead) continue; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < shortestDistance) { shortestDistance = distance; nearestEnemy = enemy; } } return nearestEnemy; }; self.attack = function (target) { if (self.attackCooldown <= 0) { // Store target health before attack to check if it will die var targetWillDie = target.health <= self.damage; // Melee attack - damage directly without bullet target.takeDamage(self.damage); createExplosion(target.x, target.y); LK.getSound('shoot').play(); self.attackCooldown = self.attackDelay; // If target died from this attack, increment kill count if (targetWillDie && target.health <= 0) { self.killCount++; // Die after killing 4 enemies if (self.killCount >= self.maxKills) { self.isDead = true; } } } }; self.update = function () { if (self.isDead) { // Create death explosion effect createExplosion(self.x, self.y); return; } if (self.attackCooldown > 0) { self.attackCooldown--; } var target = self.findNearestEnemy(); if (target) { var dx = target.x - self.x; var dy = target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= self.attackRange) { // In attack range - attack the target self.attack(target); self.isMovingToTarget = false; } else { // Move towards the target self.isMovingToTarget = true; self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } self.currentTarget = target; } else { self.currentTarget = null; self.isMovingToTarget = false; } }; return self; }); var Infantry = PlayerUnit.expand(function () { var self = PlayerUnit.call(this); var infantryGraphics = self.attachAsset('playerInfantry', { anchorX: 0.5, anchorY: 0.5 }); self.health = 60 + (upgrades.health - 1) * 15; self.maxHealth = self.health; self.attackRange = 150 + (upgrades.range - 1) * 15; self.attackDelay = 30; self.damage = 20 + (upgrades.damage - 1) * 5; self.unitType = 'infantry'; self.cost = 50; return self; }); var Artillery = PlayerUnit.expand(function () { var self = PlayerUnit.call(this); var artilleryGraphics = self.attachAsset('playerArtillery', { anchorX: 0.5, anchorY: 0.5 }); self.health = 80 + (upgrades.health - 1) * 20; self.maxHealth = self.health; self.attackRange = 350 + (upgrades.range - 1) * 35; self.attackDelay = 90; self.damage = 60 + (upgrades.damage - 1) * 15; self.unitType = 'artillery'; self.cost = 120; return self; }); var Archer = PlayerUnit.expand(function () { var self = PlayerUnit.call(this); var archerGraphics = self.attachAsset('playerInfantry', { anchorX: 0.5, anchorY: 0.5 }); archerGraphics.tint = 0x8B4513; self.health = 70 + (upgrades.health - 1) * 18; self.maxHealth = self.health; self.attackRange = 300 + (upgrades.range - 1) * 30; self.attackDelay = 50; self.damage = 40 + (upgrades.damage - 1) * 10; self.unitType = 'archer'; self.cost = 80; return self; }); var UnitUpgradePopup = Container.expand(function () { var self = Container.call(this); // Create popup background var popupBg = LK.getAsset('playerBase', { anchorX: 0.5, anchorY: 0.5, scaleX: 6, scaleY: 4.5, alpha: 0.9 }); self.addChild(popupBg); popupBg.tint = 0x333333; // Create upgrade buttons // Create damage button background var damageBtnBg = LK.getAsset('playerBase', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 1.2, alpha: 0.7 }); damageBtnBg.x = -200; damageBtnBg.y = -80; damageBtnBg.tint = 0x4a4a4a; self.addChild(damageBtnBg); var damageUpgradeBtn = new Text2('DAMAGE + (75)', { size: 50, fill: 0xFFFFFF }); damageUpgradeBtn.anchor.set(0.5, 0.5); damageUpgradeBtn.x = -200; damageUpgradeBtn.y = -80; self.addChild(damageUpgradeBtn); // Create health button background var healthBtnBg = LK.getAsset('playerBase', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 1.2, alpha: 0.7 }); healthBtnBg.x = 200; healthBtnBg.y = -80; healthBtnBg.tint = 0x4a4a4a; self.addChild(healthBtnBg); var healthUpgradeBtn = new Text2('HEALTH + (75)', { size: 50, fill: 0xFFFFFF }); healthUpgradeBtn.anchor.set(0.5, 0.5); healthUpgradeBtn.x = 200; healthUpgradeBtn.y = -80; self.addChild(healthUpgradeBtn); // Create range button background var rangeBtnBg = LK.getAsset('playerBase', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 1.2, alpha: 0.7 }); rangeBtnBg.x = 0; rangeBtnBg.y = 80; rangeBtnBg.tint = 0x4a4a4a; self.addChild(rangeBtnBg); var rangeUpgradeBtn = new Text2('RANGE + (75)', { size: 50, fill: 0xFFFFFF }); rangeUpgradeBtn.anchor.set(0.5, 0.5); rangeUpgradeBtn.x = 0; rangeUpgradeBtn.y = 80; self.addChild(rangeUpgradeBtn); self.targetUnit = null; self.upgradeCost = 75; self.show = function (unit) { self.targetUnit = unit; self.x = unit.x; self.y = unit.y - 100; self.visible = true; }; self.hide = function () { if (self.targetUnit) { self.targetUnit.hideAttackInfo(); } self.visible = false; self.targetUnit = null; }; damageUpgradeBtn.down = function () { if (self.targetUnit && resources >= self.upgradeCost) { resources -= self.upgradeCost; self.targetUnit.damage += 15; resourceText.setText('Resources: ' + resources); self.hide(); } }; healthUpgradeBtn.down = function () { if (self.targetUnit && resources >= self.upgradeCost) { resources -= self.upgradeCost; self.targetUnit.health += 50; self.targetUnit.maxHealth += 50; resourceText.setText('Resources: ' + resources); self.hide(); } }; rangeUpgradeBtn.down = function () { if (self.targetUnit && resources >= self.upgradeCost) { resources -= self.upgradeCost; self.targetUnit.attackRange += 50; resourceText.setText('Resources: ' + resources); self.hide(); } }; self.visible = false; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2F4F2F }); /**** * Game Code ****/ var playerUnits = []; var enemies = []; var bullets = []; var explosions = []; var resources = 200; var maxResources = 500; var resourceRegenRate = 1; var resourceRegenTimer = 0; var waveNumber = 1; var enemiesSpawned = 0; var enemiesPerWave = 5; var spawnTimer = 0; var spawnDelay = 120; var timeBetweenWaves = 300; var waveTimer = 0; var isWaveActive = false; var selectedUnitType = 'tank'; var unitCosts = { tank: 100, artillery: 120, infantry: 50, sword: 90 }; // Create unit upgrade popup var unitUpgradePopup = game.addChild(new UnitUpgradePopup()); // Initialize upgrade system var upgrades = { damage: 1, health: 1, range: 1 }; var upgradeBaseCost = 150; // Create player base var playerBase = game.addChild(new Base()); playerBase.x = 1024; playerBase.y = 2400; // Place 1 archer inside the base with double tank range var defenseArcher = game.addChild(new Archer()); defenseArcher.x = 1024; defenseArcher.y = 2400; // Same position as base defenseArcher.attackRange = 500; // Double the tank's base range (250 * 2) playerUnits.push(defenseArcher); // Create UI elements var resourceText = new Text2('Resources: ' + resources, { size: 40, fill: 0xFFFFFF }); resourceText.anchor.set(0, 0); LK.gui.topLeft.addChild(resourceText); resourceText.x = 120; resourceText.y = 20; var waveText = new Text2('Wave: ' + waveNumber, { size: 40, fill: 0xFFFFFF }); waveText.anchor.set(0.5, 0); LK.gui.top.addChild(waveText); waveText.y = 140; var baseHealthText = new Text2('Base Health: ' + playerBase.health, { size: 40, fill: 0xFFFFFF }); baseHealthText.anchor.set(1, 0); LK.gui.topRight.addChild(baseHealthText); baseHealthText.x = -20; baseHealthText.y = 20; var scoreText = new Text2('Score: 0', { size: 40, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); LK.gui.topLeft.addChild(scoreText); scoreText.x = 120; scoreText.y = 70; // Unit selection buttons with square backgrounds var tankButtonBg = LK.getAsset('playerTank', { anchorX: 0.5, anchorY: 1, scaleX: 2, scaleY: 2 }); LK.gui.bottom.addChild(tankButtonBg); tankButtonBg.x = -450; tankButtonBg.y = -20; var tankButton = new Text2('TANK (100)', { size: 35, fill: 0xFFFFFF }); tankButton.anchor.set(0.5, 1); LK.gui.bottom.addChild(tankButton); tankButton.x = -450; tankButton.y = -80; var artilleryButtonBg = LK.getAsset('playerArtillery', { anchorX: 0.5, anchorY: 1, scaleX: 2, scaleY: 2 }); LK.gui.bottom.addChild(artilleryButtonBg); artilleryButtonBg.x = -150; artilleryButtonBg.y = -20; var artilleryButton = new Text2('ARTILLERY (120)', { size: 35, fill: 0xFFFFFF }); artilleryButton.anchor.set(0.5, 1); LK.gui.bottom.addChild(artilleryButton); artilleryButton.x = -150; artilleryButton.y = -80; var infantryButtonBg = LK.getAsset('playerInfantry', { anchorX: 0.5, anchorY: 1, scaleX: 2, scaleY: 2 }); LK.gui.bottom.addChild(infantryButtonBg); infantryButtonBg.x = 150; infantryButtonBg.y = -20; var infantryButton = new Text2('INFANTRY (50)', { size: 35, fill: 0xFFFFFF }); infantryButton.anchor.set(0.5, 1); LK.gui.bottom.addChild(infantryButton); infantryButton.x = 150; infantryButton.y = -80; var swordButtonBg = LK.getAsset('swordWarrior', { anchorX: 0.5, anchorY: 1, scaleX: 2, scaleY: 2 }); LK.gui.bottom.addChild(swordButtonBg); swordButtonBg.x = 450; swordButtonBg.y = -20; var swordButton = new Text2('SWORD (90)', { size: 35, fill: 0xFFFFFF }); swordButton.anchor.set(0.5, 1); LK.gui.bottom.addChild(swordButton); swordButton.x = 450; swordButton.y = -80; // Create upgrade buttons var damageUpgradeButton = new Text2('DMG LV' + upgrades.damage + ' (' + upgradeBaseCost * upgrades.damage + ')', { size: 50, fill: 0xFFFFFF }); damageUpgradeButton.anchor.set(1, 0); LK.gui.topRight.addChild(damageUpgradeButton); damageUpgradeButton.x = -20; damageUpgradeButton.y = 70; var healthUpgradeButton = new Text2('HP LV' + upgrades.health + ' (' + upgradeBaseCost * upgrades.health + ')', { size: 50, fill: 0xFFFFFF }); healthUpgradeButton.anchor.set(1, 0); LK.gui.topRight.addChild(healthUpgradeButton); healthUpgradeButton.x = -20; healthUpgradeButton.y = 130; var rangeUpgradeButton = new Text2('RNG LV' + upgrades.range + ' (' + upgradeBaseCost * upgrades.range + ')', { size: 50, fill: 0xFFFFFF }); rangeUpgradeButton.anchor.set(1, 0); LK.gui.topRight.addChild(rangeUpgradeButton); rangeUpgradeButton.x = -20; rangeUpgradeButton.y = 190; // Create modes button var modesButtonBg = LK.getAsset('playerBase', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 1.2, alpha: 0.8 }); modesButtonBg.tint = 0x4a4a4a; LK.gui.top.addChild(modesButtonBg); modesButtonBg.x = 0; modesButtonBg.y = 80; var modesButton = new Text2('MODES', { size: 45, fill: 0xFFFFFF }); modesButton.anchor.set(0.5, 0.5); LK.gui.top.addChild(modesButton); modesButton.x = 0; modesButton.y = 80; function updateSelectedUnit() { tankButtonBg.tint = selectedUnitType === 'tank' ? 0xFFFF00 : 0x4169E1; artilleryButtonBg.tint = selectedUnitType === 'artillery' ? 0xFFFF00 : 0x8B4513; infantryButtonBg.tint = selectedUnitType === 'infantry' ? 0xFFFF00 : 0x228B22; swordButtonBg.tint = selectedUnitType === 'sword' ? 0xFFFF00 : 0xb8860b; } updateSelectedUnit(); tankButtonBg.down = function () { selectedUnitType = 'tank'; updateSelectedUnit(); }; artilleryButtonBg.down = function () { selectedUnitType = 'artillery'; updateSelectedUnit(); }; infantryButtonBg.down = function () { selectedUnitType = 'infantry'; updateSelectedUnit(); }; swordButtonBg.down = function () { selectedUnitType = 'sword'; updateSelectedUnit(); }; damageUpgradeButton.down = function () { var cost = upgradeBaseCost * upgrades.damage; if (resources >= cost && upgrades.damage < 10) { resources -= cost; upgrades.damage++; storage.damageLevel = upgrades.damage; damageUpgradeButton.setText('DMG LV' + upgrades.damage + ' (' + upgradeBaseCost * upgrades.damage + ')'); resourceText.setText('Resources: ' + resources); } }; healthUpgradeButton.down = function () { var cost = upgradeBaseCost * upgrades.health; if (resources >= cost && upgrades.health < 10) { resources -= cost; upgrades.health++; storage.healthLevel = upgrades.health; healthUpgradeButton.setText('HP LV' + upgrades.health + ' (' + upgradeBaseCost * upgrades.health + ')'); resourceText.setText('Resources: ' + resources); } }; rangeUpgradeButton.down = function () { var cost = upgradeBaseCost * upgrades.range; if (resources >= cost && upgrades.range < 10) { resources -= cost; upgrades.range++; storage.rangeLevel = upgrades.range; rangeUpgradeButton.setText('RNG LV' + upgrades.range + ' (' + upgradeBaseCost * upgrades.range + ')'); resourceText.setText('Resources: ' + resources); } }; // Create hard mode popup (initially hidden) var hardModePopupBg = LK.getAsset('playerBase', { anchorX: 0.5, anchorY: 0.5, scaleX: 8, scaleY: 5, alpha: 0.95 }); hardModePopupBg.tint = 0x1a1a1a; LK.gui.center.addChild(hardModePopupBg); hardModePopupBg.x = 0; hardModePopupBg.y = 0; hardModePopupBg.visible = false; var hardModeButton = new Text2('OPEN HARD MODE', { size: 60, fill: 0xFF4500 }); hardModeButton.anchor.set(0.5, 0.5); LK.gui.center.addChild(hardModeButton); hardModeButton.x = 0; hardModeButton.y = -50; hardModeButton.visible = false; var closePopupButton = new Text2('CLOSE', { size: 45, fill: 0xFFFFFF }); closePopupButton.anchor.set(0.5, 0.5); LK.gui.center.addChild(closePopupButton); closePopupButton.x = 0; closePopupButton.y = 100; closePopupButton.visible = false; hardModeButton.down = function () { // Hard mode functionality can be implemented here // For now, just close the popup hardModePopupBg.visible = false; hardModeButton.visible = false; closePopupButton.visible = false; }; closePopupButton.down = function () { hardModePopupBg.visible = false; hardModeButton.visible = false; closePopupButton.visible = false; }; modesButton.down = function () { // Show hard mode popup hardModePopupBg.visible = true; hardModeButton.visible = true; closePopupButton.visible = true; }; function spawnEnemy() { var enemy; var spawnSide = Math.floor(Math.random() * 4); var spawnX, spawnY; // Random spawn from edges switch (spawnSide) { case 0: // Top spawnX = Math.random() * 2048; spawnY = 0; break; case 1: // Right spawnX = 2048; spawnY = Math.random() * 1500; break; case 2: // Left spawnX = 0; spawnY = Math.random() * 1500; break; case 3: // Top corners spawnX = Math.random() < 0.5 ? 0 : 2048; spawnY = Math.random() * 500; break; } // Boss waves every 5 waves if (waveNumber % 5 === 0) { // Boss wave - spawn boss in center top spawnX = 1024; spawnY = 0; if (waveNumber >= 15) { // Mega boss for higher waves enemy = new MegaBoss(); } else { // Regular boss enemy = new EnemyBoss(); } } else { // Different enemies based on wave number var enemyType = Math.random(); if (waveNumber <= 3) { // Early waves: Basic infantry and some tanks if (enemyType < 0.7) { enemy = new EnemyInfantry(); } else { enemy = new EnemyTank(); } } else if (waveNumber <= 6) { // Mid-early waves: Add fast enemies if (enemyType < 0.4) { enemy = new EnemyInfantry(); } else if (enemyType < 0.7) { enemy = new EnemyTank(); } else { enemy = new EnemyFast(); } } else if (waveNumber <= 10) { // Mid waves: Add heavy enemies if (enemyType < 0.3) { enemy = new EnemyInfantry(); } else if (enemyType < 0.5) { enemy = new EnemyTank(); } else if (enemyType < 0.7) { enemy = new EnemyFast(); } else { enemy = new EnemyHeavy(); } } else if (waveNumber <= 15) { // Late-mid waves: Add swarm enemies if (enemyType < 0.2) { enemy = new EnemyInfantry(); } else if (enemyType < 0.4) { enemy = new EnemyTank(); } else if (enemyType < 0.6) { enemy = new EnemyFast(); } else if (enemyType < 0.8) { enemy = new EnemyHeavy(); } else { enemy = new EnemySwarm(); } } else if (waveNumber <= 20) { // Advanced waves: Add special enemies if (enemyType < 0.1) { enemy = new EnemyInfantry(); } else if (enemyType < 0.2) { enemy = new EnemyTank(); } else if (enemyType < 0.35) { enemy = new EnemyFast(); } else if (enemyType < 0.5) { enemy = new EnemyHeavy(); } else if (enemyType < 0.65) { enemy = new EnemySwarm(); } else if (enemyType < 0.75) { enemy = new EnemyShielder(); } else if (enemyType < 0.85) { enemy = new EnemyExploder(); } else if (enemyType < 0.95) { enemy = new EnemyHealer(); } else { enemy = new EnemyBoss(); } } else { // Ultimate waves: All enemy types with higher spawn rates for special enemies if (enemyType < 0.05) { enemy = new EnemyInfantry(); } else if (enemyType < 0.1) { enemy = new EnemyTank(); } else if (enemyType < 0.2) { enemy = new EnemyFast(); } else if (enemyType < 0.35) { enemy = new EnemyHeavy(); } else if (enemyType < 0.45) { enemy = new EnemySwarm(); } else if (enemyType < 0.6) { enemy = new EnemyShielder(); } else if (enemyType < 0.75) { enemy = new EnemyExploder(); } else if (enemyType < 0.85) { enemy = new EnemyHealer(); } else { enemy = new EnemyBoss(); } } } enemy.x = spawnX; enemy.y = spawnY; // Bosses don't get additional speed/health scaling to maintain their unique stats if (!enemy.isBoss) { enemy.speed += Math.random() * 0.5 + waveNumber * 0.1; enemy.health += waveNumber * 10; enemy.maxHealth = enemy.health; } enemies.push(enemy); game.addChild(enemy); } function createExplosion(x, y) { var explosion = LK.getAsset('explosion', { anchorX: 0.5, anchorY: 0.5, x: x, y: y, alpha: 1, scaleX: 0.5, scaleY: 0.5 }); game.addChild(explosion); tween(explosion, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 500, onFinish: function onFinish() { explosion.destroy(); } }); LK.getSound('explosion').play(); } game.down = function (x, y, obj) { // Hide attack info for all units when clicking elsewhere for (var i = 0; i < playerUnits.length; i++) { playerUnits[i].hideAttackInfo(); } // Check if click is on battlefield (not on UI) or near the base var nearBase = false; var distanceToBase = Math.sqrt((x - playerBase.x) * (x - playerBase.x) + (y - playerBase.y) * (y - playerBase.y)); if (distanceToBase <= 300) { nearBase = true; } if (y > 200 && y < 2200 || nearBase) { var cost = unitCosts[selectedUnitType]; if (resources >= cost) { var unit; switch (selectedUnitType) { case 'tank': unit = new Tank(); break; case 'artillery': unit = new Artillery(); break; case 'infantry': unit = new Infantry(); break; case 'sword': unit = new SwordWarrior(); break; } unit.x = x; unit.y = y; playerUnits.push(unit); game.addChild(unit); resources -= cost; resourceText.setText('Resources: ' + resources); } } }; game.update = function () { // Resource regeneration resourceRegenTimer++; if (resourceRegenTimer >= 60) { if (resources < maxResources) { resources += resourceRegenRate; resourceText.setText('Resources: ' + resources); } resourceRegenTimer = 0; } // Wave management if (!isWaveActive) { waveTimer++; if (waveTimer >= timeBetweenWaves) { isWaveActive = true; enemiesSpawned = 0; waveTimer = 0; // Boss waves have fewer enemies but they're stronger if (waveNumber % 5 === 0) { enemiesPerWave = 1; // Only spawn 1 boss } else { enemiesPerWave = 5 + waveNumber * 2; } } } else { spawnTimer++; // Boss waves spawn immediately, regular waves use spawn delay var currentSpawnDelay = waveNumber % 5 === 0 ? 0 : spawnDelay; if (spawnTimer >= currentSpawnDelay && enemiesSpawned < enemiesPerWave) { spawnEnemy(); enemiesSpawned++; spawnTimer = 0; } // Check if wave is complete if (enemiesSpawned >= enemiesPerWave && enemies.length === 0) { isWaveActive = false; waveNumber++; waveText.setText('Wave: ' + waveNumber); LK.setScore(LK.getScore() + 100); scoreText.setText('Score: ' + LK.getScore()); // Award 30 resources for completing the wave resources += 30; resourceText.setText('Resources: ' + resources); } } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; bullet.update(); if (bullet.hasReachedTarget || bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) { if (bullet.hasReachedTarget) { createExplosion(bullet.x, bullet.y); } bullet.destroy(); bullets.splice(i, 1); continue; } // Check bullet collisions if (bullet.isPlayerBullet) { // Player bullets hit enemies for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (!enemy.isDead && bullet.intersects(enemy)) { enemy.takeDamage(bullet.damage); createExplosion(bullet.x, bullet.y); if (enemy.isDead) { // Check if this was an exploder and trigger explosion if (enemy.explodeOnDeath) { enemy.explodeOnDeath(); } // Boss kills give more points var scoreReward = enemy.isBoss ? 500 : 25; LK.setScore(LK.getScore() + scoreReward); scoreText.setText('Score: ' + LK.getScore()); // Award 3 resources for each enemy killed resources += 3; resourceText.setText('Resources: ' + resources); enemy.destroy(); enemies.splice(j, 1); } bullet.destroy(); bullets.splice(i, 1); break; } } } else { // Enemy/Boss bullets hit player units for (var j = playerUnits.length - 1; j >= 0; j--) { var unit = playerUnits[j]; if (!unit.isDead && bullet.intersects(unit)) { unit.takeDamage(bullet.damage); createExplosion(bullet.x, bullet.y); if (unit.isDead) { unit.destroy(); playerUnits.splice(j, 1); } bullet.destroy(); bullets.splice(i, 1); break; } } } } // Update player units for (var i = playerUnits.length - 1; i >= 0; i--) { var unit = playerUnits[i]; unit.update(); if (unit.isDead) { unit.destroy(); playerUnits.splice(i, 1); } } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; enemy.update(); if (enemy.isDead) { // Check if this was an exploder and trigger explosion if (enemy.explodeOnDeath) { enemy.explodeOnDeath(); } // Award 3 resources for each enemy killed resources += 3; resourceText.setText('Resources: ' + resources); enemy.destroy(); enemies.splice(i, 1); } else if (enemy.hasReachedBase) { enemy.destroy(); enemies.splice(i, 1); } } // Update base health display baseHealthText.setText('Base Health: ' + playerBase.health); // Check game over condition if (playerBase.isDead) { LK.showGameOver(); } // Check win condition (survive 20 waves) if (waveNumber > 20) { LK.showYouWin(); } };
===================================================================
--- original.js
+++ change.js
@@ -1097,30 +1097,57 @@
rangeUpgradeButton.setText('RNG LV' + upgrades.range + ' (' + upgradeBaseCost * upgrades.range + ')');
resourceText.setText('Resources: ' + resources);
}
};
-// Create hard mode text (initially hidden)
-var hardModeText = new Text2('ZOR MODU AÇ', {
- size: 100,
- fill: 0xFF0000
+// Create hard mode popup (initially hidden)
+var hardModePopupBg = LK.getAsset('playerBase', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 8,
+ scaleY: 5,
+ alpha: 0.95
});
-hardModeText.anchor.set(0.5, 0.5);
-LK.gui.center.addChild(hardModeText);
-hardModeText.visible = false;
-// Game pause state
-var gamePaused = false;
-modesButton.down = function () {
- // Toggle button color to show interaction
- modesButtonBg.tint = modesButtonBg.tint === 0x4a4a4a ? 0x6b6b6b : 0x4a4a4a;
- // Pause the game and show hard mode text
- gamePaused = true;
- hardModeText.visible = true;
+hardModePopupBg.tint = 0x1a1a1a;
+LK.gui.center.addChild(hardModePopupBg);
+hardModePopupBg.x = 0;
+hardModePopupBg.y = 0;
+hardModePopupBg.visible = false;
+var hardModeButton = new Text2('OPEN HARD MODE', {
+ size: 60,
+ fill: 0xFF4500
+});
+hardModeButton.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(hardModeButton);
+hardModeButton.x = 0;
+hardModeButton.y = -50;
+hardModeButton.visible = false;
+var closePopupButton = new Text2('CLOSE', {
+ size: 45,
+ fill: 0xFFFFFF
+});
+closePopupButton.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(closePopupButton);
+closePopupButton.x = 0;
+closePopupButton.y = 100;
+closePopupButton.visible = false;
+hardModeButton.down = function () {
+ // Hard mode functionality can be implemented here
+ // For now, just close the popup
+ hardModePopupBg.visible = false;
+ hardModeButton.visible = false;
+ closePopupButton.visible = false;
};
-// Add click handler to hide hard mode text and resume game
-hardModeText.down = function () {
- gamePaused = false;
- hardModeText.visible = false;
+closePopupButton.down = function () {
+ hardModePopupBg.visible = false;
+ hardModeButton.visible = false;
+ closePopupButton.visible = false;
};
+modesButton.down = function () {
+ // Show hard mode popup
+ hardModePopupBg.visible = true;
+ hardModeButton.visible = true;
+ closePopupButton.visible = true;
+};
function spawnEnemy() {
var enemy;
var spawnSide = Math.floor(Math.random() * 4);
var spawnX, spawnY;
@@ -1318,12 +1345,8 @@
}
}
};
game.update = function () {
- // Skip game updates when paused
- if (gamePaused) {
- return;
- }
// Resource regeneration
resourceRegenTimer++;
if (resourceRegenTimer >= 60) {
if (resources < maxResources) {