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 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 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 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(); } } if (unitUpgradePopup.visible && unitUpgradePopup.targetUnit === self) { unitUpgradePopup.hide(); self.hideAttackInfo(); } else { unitUpgradePopup.show(self); 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 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 }; // 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 at defense position var defenseArcher = game.addChild(new Archer()); defenseArcher.x = 1024; defenseArcher.y = 2200; 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 = 20; 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 = -350; 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 = -350; tankButton.y = -80; var artilleryButtonBg = LK.getAsset('playerArtillery', { anchorX: 0.5, anchorY: 1, scaleX: 2, scaleY: 2 }); LK.gui.bottom.addChild(artilleryButtonBg); 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.y = -80; var infantryButtonBg = LK.getAsset('playerInfantry', { anchorX: 0.5, anchorY: 1, scaleX: 2, scaleY: 2 }); LK.gui.bottom.addChild(infantryButtonBg); infantryButtonBg.x = 350; 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 = 350; infantryButton.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; function updateSelectedUnit() { tankButtonBg.tint = selectedUnitType === 'tank' ? 0xFFFF00 : 0x4169E1; artilleryButtonBg.tint = selectedUnitType === 'artillery' ? 0xFFFF00 : 0x8B4513; infantryButtonBg.tint = selectedUnitType === 'infantry' ? 0xFFFF00 : 0x228B22; } updateSelectedUnit(); tankButtonBg.down = function () { selectedUnitType = 'tank'; updateSelectedUnit(); }; artilleryButtonBg.down = function () { selectedUnitType = 'artillery'; updateSelectedUnit(); }; infantryButtonBg.down = function () { selectedUnitType = 'infantry'; 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); } }; 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; } // Random enemy type based on wave if (Math.random() < 0.3 + waveNumber * 0.1) { enemy = new EnemyTank(); } else { enemy = new EnemyInfantry(); } enemy.x = spawnX; enemy.y = spawnY; 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 upgrade popup when clicking elsewhere if (unitUpgradePopup.visible) { unitUpgradePopup.hide(); } // 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; } 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; enemiesPerWave = 5 + waveNumber * 2; } } else { spawnTimer++; if (spawnTimer >= spawnDelay && 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()); } } // 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 with enemies if (bullet.isPlayerBullet) { 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) { LK.setScore(LK.getScore() + 25); scoreText.setText('Score: ' + LK.getScore()); enemy.destroy(); enemies.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) { 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
@@ -682,10 +682,15 @@
// 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)
- if (y > 200 && y < 2200) {
+ // 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) {