User prompt
Mermi sıkmaya başlayınca, dost ve düşman birlikleri oldukları yerde dursunlar ta ki karşı tarafta kimse kalmayana dek.
User prompt
Neden mermi sıkarken ilerlemeye devam ediyorlar? İlerlemeye devam etmesinler. Mermi sıkmayı bırakınca, ilerlemeye devam etsinler.
User prompt
Mermi sıkarken düşman ve dost birlikleri hareket etmesinler.
User prompt
Bizim askerler de mermi sıksınlar,
User prompt
Her düşman birliği birbirlerine uzaktan atış yapsın ve her düşman birliğine özel merminin resim dosyasını oluştur.
User prompt
1-4 seviye aralığında çıkan asker taş atan, 4-10 aralığında çıkan asker mermi sıkan, 11-15 aralığında çıkan asker mermi sıkan araba ve 16-20 aralığında çıkan asker tank, 20-30 arasında çıkan asker savaş uçağı olsun. kendisine özel resim dosyalarını oluştur. Bu seviyelerde farklı askerler çıksın.
User prompt
1-4 seviye aralığında çıkan, 4-10 aralığında çıkan, 11-15 aralığında çıkan ve 16-20 aralığında çıkan askerlerin kendisine özel resim dosyalarını oluştur. Bu seviyelerde farklı askerler çıksın.
User prompt
Her seviye sonrası düşman askeri ve düşman base gücü %30 oranında daha güçlensin.
User prompt
Her seviye yükseltimi sonrası maliyet 2 katına çıksın.
User prompt
Özellikler ile ilgili yazıları hizalı olacak şekilde %40 oranında sola kaydır.
User prompt
Özellikler ile ilgili yazıları hizalı olacak şekilde %40 oranında sola kaydır.
User prompt
Özellikler ile ilgili yazıları olduğu gibi konumunu bağımsız olacak şekilde tamamen sıfırla ve hizalı şekilde ekranın ortasında görünmesini sağla.
User prompt
Özellikler ile ilgili yazıları olduğu gibi 10 satır sola taşı.
User prompt
Özellikler ile ilgili yazıları olduğu gibi reset butonu altına taşı.
User prompt
Özellikler ile ilgili yazıları olduğu gibi konum değerlerini sıfırla ve ekranın sol kenarına yeniden yerleştir.
User prompt
Özellikler ile ilgili yazıları olduğu gibi 5 satır sola taşı.
User prompt
Özellikler ile ilgili yazıları olduğu gibi 5 satır sola taşı.
User prompt
Özellikler ile ilgili yazıları olduğu gibi oyun ekranının sol kenarına taşı.
User prompt
Özellikler ile ilgili yazıları olduğu gibi 4 satır sola taşı.
User prompt
Özellikler ile ilgili yazıları olduğu gibi 2 satır sola taşı.
User prompt
Özelliklerin isminin sol kenarına, özellik seviyesi ekle. Her satın alım sonrası özellik seviyesi yükselsin.
User prompt
Özellikleri sol kenara olduğu gibi yerleşir.
User prompt
Özellikleri sol kenara hizalı gelecek şekilde yerleştir.
User prompt
Puan altına hizalı gelecek şekilde, puan karşılığı alınacak 10 geliştirme özelliği ekle.
User prompt
Yer çekimini %10 oranında azalt.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // AnaBase (player base) var AnaBase = Container.expand(function () { var self = Container.call(this); var base = self.attachAsset('anaBase', { anchorX: 0.5, anchorY: 0.5 }); self.hp = 100; self.maxHp = 100; self.hpBar = self.addChild(new HealthBar()); self.hpBar.y = 120; self.hpBar.set(1); return self; }); // EnemyBase (enemy base) var EnemyBase = Container.expand(function () { var self = Container.call(this); var base = self.attachAsset('enemyBase', { anchorX: 0.5, anchorY: 0.5 }); self.hp = 100; self.maxHp = 100; self.hpBar = self.addChild(new HealthBar()); self.hpBar.y = 120; self.hpBar.set(1); return self; }); // Enemy Gunner Bullet var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bullet = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.damage = 14; self.update = function () { if (self.lastX === undefined) self.lastX = self.x; if (self.lastY === undefined) self.lastY = self.y; self.x += self.vx; self.y += self.vy; self.lastX = self.x; self.lastY = self.y; }; return self; }); // Enemy soldier (Araba) var EnemyCar = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('enemyCar', { anchorX: 0.5, anchorY: 1 }); self.hp = 50; self.maxHp = 50; self.atk = 20; self.speed = 5; self.hpBar = self.addChild(new HealthBar()); self.hpBar.y = -60; self.hpBar.set(1); self.update = function () { self.x -= self.speed; }; return self; }); // Enemy Car Bullet var EnemyCarBullet = Container.expand(function () { var self = Container.call(this); var bullet = self.attachAsset('enemyCarBullet', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.damage = 20; self.update = function () { if (self.lastX === undefined) self.lastX = self.x; if (self.lastY === undefined) self.lastY = self.y; self.x += self.vx; self.y += self.vy; self.lastX = self.x; self.lastY = self.y; }; return self; }); // Enemy soldier (Mermi sıkan) var EnemyGunner = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('enemySoldier2', { anchorX: 0.5, anchorY: 1 }); self.hp = 30; self.maxHp = 30; self.atk = 14; self.speed = 3.5; self.hpBar = self.addChild(new HealthBar()); self.hpBar.y = -90; self.hpBar.set(1); self.update = function () { self.x -= self.speed; }; return self; }); // Enemy soldier (Jet) var EnemyJet = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('enemyJet', { anchorX: 0.5, anchorY: 1 }); self.hp = 80; self.maxHp = 80; self.atk = 60; self.speed = 8; self.hpBar = self.addChild(new HealthBar()); self.hpBar.y = -40; self.hpBar.set(1); self.update = function () { self.x -= self.speed; }; return self; }); // Enemy Jet Missile var EnemyJetMissile = Container.expand(function () { var self = Container.call(this); var missile = self.attachAsset('enemyJetMissile', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.damage = 60; self.update = function () { if (self.lastX === undefined) self.lastX = self.x; if (self.lastY === undefined) self.lastY = self.y; self.x += self.vx; self.y += self.vy; self.lastX = self.x; self.lastY = self.y; }; return self; }); // Enemy StoneThrower Bullet var EnemyStone = Container.expand(function () { var self = Container.call(this); var stone = self.attachAsset('enemyStone', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.damage = 10; self.update = function () { if (self.lastX === undefined) self.lastX = self.x; if (self.lastY === undefined) self.lastY = self.y; self.x += self.vx; self.y += self.vy; self.lastX = self.x; self.lastY = self.y; }; return self; }); // Enemy soldier (Taş atan) var EnemyStoneThrower = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('enemySoldier1', { anchorX: 0.5, anchorY: 1 }); self.hp = 20; self.maxHp = 20; self.atk = 8; self.speed = 3; self.hpBar = self.addChild(new HealthBar()); self.hpBar.y = -80; self.hpBar.set(1); self.update = function () { self.x -= self.speed; }; return self; }); // Enemy soldier (Tank) var EnemyTank = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('enemyTank', { anchorX: 0.5, anchorY: 1 }); self.hp = 120; self.maxHp = 120; self.atk = 40; self.speed = 2.2; self.hpBar = self.addChild(new HealthBar()); self.hpBar.y = -70; self.hpBar.set(1); self.update = function () { self.x -= self.speed; }; return self; }); // Enemy Tank Shell var EnemyTankShell = Container.expand(function () { var self = Container.call(this); var shell = self.attachAsset('enemyTankShell', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.damage = 40; self.update = function () { if (self.lastX === undefined) self.lastX = self.x; if (self.lastY === undefined) self.lastY = self.y; self.x += self.vx; self.y += self.vy; self.lastX = self.x; self.lastY = self.y; }; return self; }); // HealthBar class for bases and soldiers var HealthBar = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('hpBarBg', { anchorX: 0.5, anchorY: 0.5 }); var fg = self.attachAsset('hpBarFg', { anchorX: 0.5, anchorY: 0.5 }); self.set = function (percent) { if (percent < 0) percent = 0; if (percent > 1) percent = 1; fg.width = 120 * percent; }; return self; }); // Player soldier bullet var PlayerBullet = Container.expand(function () { var self = Container.call(this); var bullet = self.attachAsset('playerBullet', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.damage = 10; self.update = function () { if (self.lastX === undefined) self.lastX = self.x; if (self.lastY === undefined) self.lastY = self.y; self.x += self.vx; self.y += self.vy; self.lastX = self.x; self.lastY = self.y; }; return self; }); // Player soldier var PlayerSoldier = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('playerSoldier', { anchorX: 0.5, anchorY: 1 }); self.hp = 20; self.maxHp = 20; self.atk = 8; self.speed = 3; self.hpBar = self.addChild(new HealthBar()); self.hpBar.y = -80; self.hpBar.set(1); self.update = function () { self.x += self.speed; }; return self; }); // Slingshot (player control) var Slingshot = Container.expand(function () { var self = Container.call(this); var sling = self.attachAsset('slingshot', { anchorX: 0.5, anchorY: 1 }); self.stoneReady = true; self.stone = null; self.aimLine = null; self.aimStart = { x: 0, y: 0 }; self.aimEnd = { x: 0, y: 0 }; return self; }); // Stone (slingshot projectile) var Stone = Container.expand(function () { var self = Container.call(this); var stone = self.attachAsset('stone', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.damage = 20; self.update = function () { // Gravity effect if (self.lastY === undefined) self.lastY = self.y; if (self.lastVy === undefined) self.lastVy = self.vy; var gravity = 2.2 * 0.5 * 0.9; // %50 azaltıldı, ardından %10 daha azaltıldı self.vy += gravity; self.x += self.vx; self.y += self.vy; self.lastY = self.y; self.lastVy = self.vy; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xf7f7f7 }); /**** * Game Code ****/ // Savaş uçağı // Tank // Araba // Mermi sıkan // Taş atan // Health bar foreground // Health bar background // Slingshot // Stone (slingshot projectile) // Enemy soldier // Player soldier // EnemyBase (enemy base) // AnaBase (player base) // Game constants // StoneThrower bullet // Gunner bullet // Car bullet // Tank shell // Jet missile var GAME_WIDTH = 2048; var GAME_HEIGHT = 2732; var BASE_OFFSET_X = 220; var BASE_OFFSET_Y = 200; var GROUND_Y = GAME_HEIGHT - 300; var SLING_X = BASE_OFFSET_X; var SLING_Y = GROUND_Y - 110; var ENEMY_BASE_X = GAME_WIDTH - BASE_OFFSET_X; var ENEMY_BASE_Y = GROUND_Y; var MAX_LEVEL = 20; // Game state var anaBase, enemyBase, slingshot; var playerSoldiers = []; var enemySoldiers = []; var stones = []; var enemyBullets = []; // All enemy bullets (all types) var playerBullets = []; // All player bullets var level = storage.level || 1; var score = storage.score || 0; var upgradePoints = storage.upgradePoints || 0; // --- Freeze logic for firing phase --- var freezeAllSoldiers = false; var freezeWho = null; // "player" or "enemy" or null function isFiringPhase() { // If there are any playerBullets or enemyBullets, or stones, freeze all soldiers // But only if both sides still have soldiers var playerAlive = playerSoldiers.length > 0; var enemyAlive = enemySoldiers.length > 0; var firingObjects = playerBullets.length > 0 || enemyBullets.length > 0 || stones.length > 0; return firingObjects && playerAlive && enemyAlive; } var isDraggingSling = false; var dragStart = { x: 0, y: 0 }; var dragEnd = { x: 0, y: 0 }; var lastTouchId = null; var spawnTimers = { player: 0, enemy: 0 }; var enemySpawnInterval = 120; var playerSpawnInterval = 120; var enemySoldierStats = { hp: 20, atk: 8, speed: 3 }; var playerSoldierStats = { hp: 20, atk: 8, speed: 3 }; var enemyBaseStats = { hp: 100 }; var anaBaseStats = { hp: 100 }; var levelTxt, scoreTxt, upgradeTxt; // UI levelTxt = new Text2('Seviye: ' + level, { size: 80, fill: "#222" }); levelTxt.anchor.set(0.5, 0); // Add Reset button to the left of levelTxt var resetBtn = new Text2('Reset', { size: 70, fill: 0xC0392B }); resetBtn.anchor.set(0.5, 0); resetBtn.x = -260; // Place left of level text (enough space for "Puan" and "Seviye") resetBtn.y = 0; levelTxt.addChild(resetBtn); // Reset handler resetBtn.interactive = true; resetBtn.buttonMode = true; resetBtn.down = function (x, y, obj) { // Reset all game state level = 1; score = 0; upgradePoints = 0; enemyBaseStats.hp = 100; anaBaseStats.hp = 100; playerSoldierStats.hp = 20; playerSoldierStats.atk = 8; playerSoldierStats.speed = 3; enemySoldierStats.hp = 20; enemySoldierStats.atk = 8; enemySoldierStats.speed = 3; enemySpawnInterval = 120; playerSpawnInterval = 120; // Remove all soldiers and stones for (var i = 0; i < playerSoldiers.length; i++) playerSoldiers[i].destroy(); for (var i = 0; i < enemySoldiers.length; i++) enemySoldiers[i].destroy(); for (var i = 0; i < stones.length; i++) stones[i].destroy(); playerSoldiers = []; enemySoldiers = []; stones = []; // Reset bases anaBase.hp = anaBaseStats.hp; anaBase.maxHp = anaBaseStats.hp; enemyBase.hp = enemyBaseStats.hp; enemyBase.maxHp = enemyBaseStats.hp; // Save progress storage.level = level; storage.score = score; storage.upgradePoints = upgradePoints; // Update UI immediately levelTxt.setText('Seviye: ' + level); scoreTxt.setText('Puan: ' + score); anaBase.hpBar.set(anaBase.hp / anaBase.maxHp); enemyBase.hpBar.set(enemyBase.hp / enemyBase.maxHp); showUpgradeMsg("Oyun Sıfırlandı!"); }; LK.gui.top.addChild(levelTxt); scoreTxt = new Text2('Puan: ' + score, { size: 80, fill: "#222" }); scoreTxt.anchor.set(0.5, 0); scoreTxt.x = GAME_WIDTH * 0.25; // %25 sağa kaydır LK.gui.top.addChild(scoreTxt); upgradeTxt = new Text2('', { size: 60, fill: 0x27AE60 }); upgradeTxt.anchor.set(0.5, 0); LK.gui.bottom.addChild(upgradeTxt); // --- 10 Upgrade Features UI --- var upgradeFeatures = [{ name: "AnaBase HP +20", cost: 30, apply: function apply() { anaBaseStats.hp += 20; anaBase.maxHp = anaBaseStats.hp; anaBase.hp = anaBaseStats.hp; } }, { name: "Asker HP +6", cost: 20, apply: function apply() { playerSoldierStats.hp += 6; } }, { name: "Asker Atk +2", cost: 20, apply: function apply() { playerSoldierStats.atk += 2; } }, { name: "Asker Hız +0.5", cost: 20, apply: function apply() { playerSoldierStats.speed += 0.5; } }, { name: "Düşman Askeri HP -4", cost: 25, apply: function apply() { enemySoldierStats.hp = Math.max(4, enemySoldierStats.hp - 4); } }, { name: "Düşman Askeri Atk -1", cost: 25, apply: function apply() { enemySoldierStats.atk = Math.max(1, enemySoldierStats.atk - 1); } }, { name: "Sapan Taşı Hasarı +5", cost: 20, apply: function apply() { Stone.prototype.damage = (Stone.prototype.damage || 20) + 5; } }, { name: "Sapan Taşı Hızı +4", cost: 20, apply: function apply() { _fireStone.stoneSpeed = (_fireStone.stoneSpeed || 32) + 4; } }, { name: "Asker Sınırı +1", cost: 40, apply: function apply() { if (!game.maxPlayerSoldiers) game.maxPlayerSoldiers = 6; game.maxPlayerSoldiers++; } }, { name: "Base HP Yenileme +10", cost: 30, apply: function apply() { anaBase.hp = Math.min(anaBase.maxHp, anaBase.hp + 10); } }]; // Track upgrades purchased and levels var upgradesPurchased = []; var upgradesLevel = []; // new: track level for each upgrade for (var i = 0; i < 10; i++) { upgradesPurchased[i] = 0; upgradesLevel[i] = 0; } // UI: Create upgrade buttons below the reset button, aligned to the left edge var upgradeButtons = []; var upgradeStartY = resetBtn.y + resetBtn.height + 20; // Reset butonunun hemen altına hizala var upgradeLeftX = 0; // Tam sol kenara hizalı (platform menüsüne çakışmaz, 0'dan başlat) for (var i = 0; i < upgradeFeatures.length; i++) { var upg = upgradeFeatures[i]; var btn = new Text2("Lv. " + upgradesLevel[i] + " " + upg.name + " (" + upg.cost + ")", { size: 54, fill: "#444" }); btn.anchor.set(0.5, 0); // Ortala btn.x = GAME_WIDTH * 0.1; // %40 sola kaydır (merkezin %50 olduğu yerde, %10'a çek) btn.y = upgradeStartY + i * 80; btn.interactive = true; btn.buttonMode = true; (function (idx, btn, upg) { btn.down = function (x, y, obj) { if (score >= upg.cost) { // allow multiple purchases score -= upg.cost; upg.apply(); upgradesLevel[idx] = (upgradesLevel[idx] || 0) + 1; upgradesPurchased[idx] = 1; // still mark as purchased for compatibility // Double the cost for next level upg.cost = upg.cost * 2; btn.setText("Lv. " + upgradesLevel[idx] + " " + upg.name + " (" + upg.cost + ")"); showUpgradeMsg(upg.name + " seviye " + upgradesLevel[idx] + "!"); scoreTxt.setText('Puan: ' + score); storage.score = score; } else { showUpgradeMsg("Yetersiz puan!"); } }; })(i, btn, upg); LK.gui.top.addChild(btn); upgradeButtons.push(btn); } // Patch fireStone to use upgradeable speed var origFireStone = _fireStone; _fireStone = function fireStone(fromX, fromY, toX, toY) { var s = new Stone(); s.x = fromX; s.y = fromY; var dx = fromX - toX; var dy = fromY - toY; var dist = Math.sqrt(dx * dx + dy * dy); var speed = _fireStone.stoneSpeed || 32; s.vx = dx / dist * speed; s.vy = dy / dist * speed; // Patch damage if upgraded if (typeof Stone.prototype.damage === "number") s.damage = Stone.prototype.damage; stones.push(s); game.addChild(s); }; // Add bases anaBase = new AnaBase(); anaBase.x = BASE_OFFSET_X; anaBase.y = GROUND_Y; game.addChild(anaBase); enemyBase = new EnemyBase(); enemyBase.x = ENEMY_BASE_X; enemyBase.y = ENEMY_BASE_Y; game.addChild(enemyBase); // Add slingshot slingshot = new Slingshot(); slingshot.x = SLING_X; slingshot.y = SLING_Y; game.addChild(slingshot); // Helper: spawn player soldier function spawnPlayerSoldier() { var s = new PlayerSoldier(); s.hp = playerSoldierStats.hp; s.maxHp = playerSoldierStats.hp; s.atk = playerSoldierStats.atk; s.speed = playerSoldierStats.speed; s.x = anaBase.x + 100; s.y = GROUND_Y + 10; playerSoldiers.push(s); game.addChild(s); } // Helper: spawn enemy soldier function spawnEnemySoldier() { var s; // 1-4: StoneThrower, 5-10: Gunner, 11-15: Car, 16-20: Tank, 21-30: Jet if (level >= 1 && level <= 4) { s = new EnemyStoneThrower(); } else if (level >= 5 && level <= 10) { s = new EnemyGunner(); } else if (level >= 11 && level <= 15) { s = new EnemyCar(); } else if (level >= 16 && level <= 20) { s = new EnemyTank(); } else if (level >= 21 && level <= 30) { s = new EnemyJet(); } else { s = new EnemyStoneThrower(); } s.x = enemyBase.x - 100; s.y = GROUND_Y + 10; enemySoldiers.push(s); game.addChild(s); } // Helper: fire stone function _fireStone(fromX, fromY, toX, toY) { var s = new Stone(); s.x = fromX; s.y = fromY; // Atış yönünü tersine çevir: sapanı geriye çek, taş ileri fırlasın var dx = fromX - toX; var dy = fromY - toY; var dist = Math.sqrt(dx * dx + dy * dy); var speed = 32; // Daha yavaş gitmesi için azaltıldı s.vx = dx / dist * speed; s.vy = dy / dist * speed; stones.push(s); game.addChild(s); } // Helper: show upgrade message function showUpgradeMsg(msg) { upgradeTxt.setText(msg); tween(upgradeTxt, { alpha: 1 }, { duration: 0 }); tween(upgradeTxt, { alpha: 0 }, { duration: 1200, easing: tween.easeOut }); } // Touch/drag logic for slingshot game.down = function (x, y, obj) { // Only allow drag if touch is near slingshot if (Math.abs(x - slingshot.x) < 120 && Math.abs(y - slingshot.y) < 160) { isDraggingSling = true; dragStart.x = x; dragStart.y = y; dragEnd.x = x; dragEnd.y = y; } }; game.move = function (x, y, obj) { if (isDraggingSling) { dragEnd.x = x; dragEnd.y = y; } }; game.up = function (x, y, obj) { if (isDraggingSling) { // Fire stone if drag is long enough var dx = dragEnd.x - slingshot.x; var dy = dragEnd.y - slingshot.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 80 && stones.length < 2) { _fireStone(slingshot.x, slingshot.y - 60, dragEnd.x, dragEnd.y); // fireStone fonksiyonu artık ters vektörle çalışıyor } } isDraggingSling = false; }; // Tap to spawn player soldier (bottom left, not on slingshot) game.on('down', function (x, y, obj) { if (x < 300 && y > GROUND_Y + 60) { if (playerSoldiers.length < 6) { spawnPlayerSoldier(); } } }); // Upgrade logic (tap bottom right) game.on('down', function (x, y, obj) { if (x > GAME_WIDTH - 300 && y > GROUND_Y + 60) { if (upgradePoints > 0) { // Cycle upgrades: base hp, soldier hp, soldier atk, soldier speed var upg = (score + level) % 4; if (upg === 0) { anaBaseStats.hp += 20; anaBase.maxHp = anaBaseStats.hp; anaBase.hp = anaBaseStats.hp; showUpgradeMsg("AnaBase HP +20"); } else if (upg === 1) { playerSoldierStats.hp += 6; showUpgradeMsg("Asker HP +6"); } else if (upg === 2) { playerSoldierStats.atk += 2; showUpgradeMsg("Asker Atk +2"); } else { playerSoldierStats.speed += 0.5; showUpgradeMsg("Asker Hız +0.5"); } upgradePoints--; } } }); // Main update loop game.update = function () { // Update UI levelTxt.setText('Seviye: ' + level); scoreTxt.setText('Puan: ' + score); // Update health bars anaBase.hpBar.set(anaBase.hp / anaBase.maxHp); enemyBase.hpBar.set(enemyBase.hp / enemyBase.maxHp); // Draw slingshot pulled band and stone visual if (isDraggingSling) { // Remove previous drag visuals if any if (slingshot.dragStone) { slingshot.dragStone.destroy(); slingshot.dragStone = null; } if (slingshot.bandLeft) { slingshot.bandLeft.destroy(); slingshot.bandLeft = null; } if (slingshot.bandRight) { slingshot.bandRight.destroy(); slingshot.bandRight = null; } // Calculate band anchor points (left/right of slingshot top) var slingTopX = slingshot.x; var slingTopY = slingshot.y - 110; var bandOffset = 22; var leftX = slingTopX - bandOffset; var rightX = slingTopX + bandOffset; var bandY = slingTopY + 10; // Place a thin rectangle as band (left) slingshot.bandLeft = LK.getAsset('hpBarFg', { width: Math.max(8, Math.sqrt((dragEnd.x - leftX) * (dragEnd.x - leftX) + (dragEnd.y - bandY) * (dragEnd.y - bandY))), height: 8, anchorX: 0, anchorY: 0.5, x: leftX, y: bandY, rotation: Math.atan2(dragEnd.y - bandY, dragEnd.x - leftX) }); game.addChild(slingshot.bandLeft); // Place a thin rectangle as band (right) slingshot.bandRight = LK.getAsset('hpBarFg', { width: Math.max(8, Math.sqrt((dragEnd.x - rightX) * (dragEnd.x - rightX) + (dragEnd.y - bandY) * (dragEnd.y - bandY))), height: 8, anchorX: 0, anchorY: 0.5, x: rightX, y: bandY, rotation: Math.atan2(dragEnd.y - bandY, dragEnd.x - rightX) }); game.addChild(slingshot.bandRight); // Place the stone at dragEnd slingshot.dragStone = LK.getAsset('stone', { anchorX: 0.5, anchorY: 0.5, x: dragEnd.x, y: dragEnd.y }); game.addChild(slingshot.dragStone); } else { // Remove drag visuals if not dragging if (slingshot.dragStone) { slingshot.dragStone.destroy(); slingshot.dragStone = null; } if (slingshot.bandLeft) { slingshot.bandLeft.destroy(); slingshot.bandLeft = null; } if (slingshot.bandRight) { slingshot.bandRight.destroy(); slingshot.bandRight = null; } } // Spawn player soldiers automatically spawnTimers.player++; if (spawnTimers.player >= playerSpawnInterval) { if (playerSoldiers.length < 6) { spawnPlayerSoldier(); } spawnTimers.player = 0; } // Spawn enemy soldiers automatically spawnTimers.enemy++; if (spawnTimers.enemy >= enemySpawnInterval) { if (enemySoldiers.length < 6) { spawnEnemySoldier(); } spawnTimers.enemy = 0; } // --- Freeze logic: check if firing phase is active --- freezeAllSoldiers = isFiringPhase(); // Update player soldiers for (var i = playerSoldiers.length - 1; i >= 0; i--) { var s = playerSoldiers[i]; // --- Freeze all player soldiers if firing phase is active --- if (freezeAllSoldiers) { // No movement, no firing, no attacking base, but still allow dying from bullets continue; } // Asker dondurma: eğer bir düşmanla çarpışıyorsa hareket etmesin var frozen = false; for (var j = enemySoldiers.length - 1; j >= 0; j--) { var e = enemySoldiers[j]; if (Math.abs(s.x - e.x) < 80 && Math.abs(s.y - e.y) < 60) { // Fight! s.hp -= e.atk * 0.03; e.hp -= s.atk * 0.03; s.hpBar.set(s.hp / s.maxHp); e.hpBar.set(e.hp / e.maxHp); frozen = true; if (e.hp <= 0) { score += 10; enemySoldiers.splice(j, 1); e.destroy(); } if (s.hp <= 0) { playerSoldiers.splice(i, 1); s.destroy(); break; } // Eğer ikisi de hayattaysa, dondurulmuş kalmaya devam etsin if (s.hp > 0 && e.hp > 0) { frozen = true; } } } // Hareketi engelle: Eğer çarpışıyorsa update çağrılmasın, çarpışmıyorsa hareket etsin if (!frozen) { // Çarpışma kontrolü: Önümüzde bir düşman var mı? var blocked = false; // Önce kendi askerlerimizi kontrol et, öndekiyle çakışıyorsak ilerleme for (var j = 0; j < playerSoldiers.length; j++) { var s2 = playerSoldiers[j]; if (s2 === s) continue; if (Math.abs(s.y - s2.y) < 60 && s2.x > s.x && s2.x - s.x < 80 && s2.x - s.x > 0 // 80px mesafeden yakınsa ) { blocked = true; break; } } // Sonra düşman askerlerini kontrol et if (!blocked) { for (var j = 0; j < enemySoldiers.length; j++) { var e = enemySoldiers[j]; if (e === s) continue; // Sadece ileriye doğru olan ve çakışan askerleri engelle if (Math.abs(s.y - e.y) < 60 && e.x > s.x && // Sadece önündeki düşman e.x - s.x < 80 && e.x - s.x > 0 // 80px mesafeden yakınsa ) { blocked = true; break; } } } if (!blocked) { s.update(); // Clamp to not go past enemy base if (s.x > enemyBase.x - 120) s.x = enemyBase.x - 120; // --- Player Firing Logic --- if (!s.fireTimer) s.fireTimer = 0; s.fireTimer++; var fireInterval = 60; if (s.fireTimer >= fireInterval) { // Find closest enemy soldier, else aim at enemy base var target = null; var minDist = 99999; for (var es = 0; es < enemySoldiers.length; es++) { var e = enemySoldiers[es]; var dx = e.x - s.x; var dy = e.y - s.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; target = e; } } if (!target) { target = enemyBase; } // Fire bullet var b = new PlayerBullet(); b.x = s.x; b.y = s.y - 70; // Calculate direction var tx = target.x; var ty = target.y; var dx = tx - b.x; var dy = ty - b.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist === 0) dist = 1; b.vx = dx / dist * 22; b.vy = dy / dist * 22; b.damage = s.atk || 8; playerBullets.push(b); game.addChild(b); s.fireTimer = 0; } } } // If at enemy base, attack base if (s.lastAtEnemyBase === undefined) s.lastAtEnemyBase = false; var atEnemyBase = Math.abs(s.x - enemyBase.x) < 120; if (!s.lastAtEnemyBase && atEnemyBase) { // Just arrived at enemy base s.attackedBase = false; } if (!s.attackedBase && atEnemyBase) { enemyBase.hp -= s.atk * 0.15; if (enemyBase.hp < 0) enemyBase.hp = 0; s.attackedBase = true; } s.lastAtEnemyBase = atEnemyBase; } // Update enemy soldiers for (var i = enemySoldiers.length - 1; i >= 0; i--) { var e = enemySoldiers[i]; // --- Freeze all enemy soldiers if firing phase is active --- if (freezeAllSoldiers) { // No movement, no firing, no attacking base, but still allow dying from bullets continue; } // Asker dondurma: eğer bir oyuncu askeriyle çarpışıyorsa hareket etmesin var frozen = false; for (var j = playerSoldiers.length - 1; j >= 0; j--) { var s = playerSoldiers[j]; if (Math.abs(e.x - s.x) < 80 && Math.abs(e.y - s.y) < 60) { // Fight! e.hp -= s.atk * 0.03; s.hp -= e.atk * 0.03; e.hpBar.set(e.hp / e.maxHp); s.hpBar.set(s.hp / s.maxHp); frozen = true; if (s.hp <= 0) { playerSoldiers.splice(j, 1); s.destroy(); } if (e.hp <= 0) { score += 10; enemySoldiers.splice(i, 1); e.destroy(); break; } // Eğer ikisi de hayattaysa, dondurulmuş kalmaya devam etsin if (e.hp > 0 && s.hp > 0) { frozen = true; } } } // Hareketi engelle: Eğer çarpışıyorsa update çağrılmasın, çarpışmıyorsa hareket etsin if (!frozen) { // Çarpışma kontrolü: Önümüzde bir oyuncu askeri var mı? var blocked = false; // Önce kendi düşman askerlerini kontrol et, öndekiyle çakışıyorsak ilerleme for (var j = 0; j < enemySoldiers.length; j++) { var e2 = enemySoldiers[j]; if (e2 === e) continue; if (Math.abs(e.y - e2.y) < 60 && e2.x < e.x && e.x - e2.x < 80 && e.x - e2.x > 0 // 80px mesafeden yakınsa ) { blocked = true; break; } } // Sonra oyuncu askerlerini kontrol et if (!blocked) { for (var j = 0; j < playerSoldiers.length; j++) { var s = playerSoldiers[j]; if (Math.abs(e.y - s.y) < 60 && s.x > e.x && s.x - e.x < 80 && s.x - e.x > 0 // 80px mesafeden yakınsa ) { blocked = true; break; } } } if (!blocked) { e.update(); // Clamp to not go past anaBase if (e.x < anaBase.x + 120) e.x = anaBase.x + 120; } // --- Enemy Firing Logic --- if (!e.fireTimer) e.fireTimer = 0; e.fireTimer++; var fireInterval = 90; // default var BulletClass = null; var bulletSpeed = 0; var bulletDamage = 0; var bulletYOffset = 0; if (e.constructor === EnemyStoneThrower) { fireInterval = 120; BulletClass = EnemyStone; bulletSpeed = 12; bulletDamage = 10; bulletYOffset = -60; } else if (e.constructor === EnemyGunner) { fireInterval = 60; BulletClass = EnemyBullet; bulletSpeed = 18; bulletDamage = 14; bulletYOffset = -70; } else if (e.constructor === EnemyCar) { fireInterval = 80; BulletClass = EnemyCarBullet; bulletSpeed = 20; bulletDamage = 20; bulletYOffset = -40; } else if (e.constructor === EnemyTank) { fireInterval = 100; BulletClass = EnemyTankShell; bulletSpeed = 14; bulletDamage = 40; bulletYOffset = -50; } else if (e.constructor === EnemyJet) { fireInterval = 70; BulletClass = EnemyJetMissile; bulletSpeed = 28; bulletDamage = 60; bulletYOffset = -20; } if (BulletClass && e.fireTimer >= fireInterval) { // Find closest player soldier, else aim at anaBase var target = null; var minDist = 99999; for (var ps = 0; ps < playerSoldiers.length; ps++) { var p = playerSoldiers[ps]; var dx = p.x - e.x; var dy = p.y - e.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; target = p; } } if (!target) { target = anaBase; } // Fire bullet var b = new BulletClass(); b.x = e.x; b.y = e.y + bulletYOffset; // Calculate direction var tx = target.x; var ty = target.y; var dx = tx - b.x; var dy = ty - b.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist === 0) dist = 1; b.vx = dx / dist * bulletSpeed; b.vy = dy / dist * bulletSpeed; b.damage = bulletDamage; enemyBullets.push(b); game.addChild(b); e.fireTimer = 0; } } // If at anaBase, attack base if (e.lastAtAnaBase === undefined) e.lastAtAnaBase = false; var atAnaBase = Math.abs(e.x - anaBase.x) < 120; if (!e.lastAtAnaBase && atAnaBase) { // Just arrived at ana base e.attackedBase = false; } if (!e.attackedBase && atAnaBase) { anaBase.hp -= e.atk * 0.05; // Her asker %5 oranında base canı azaltır if (anaBase.hp < 0) anaBase.hp = 0; e.attackedBase = true; } e.lastAtAnaBase = atAnaBase; } // Update stones (slingshot projectiles) for (var i = stones.length - 1; i >= 0; i--) { var st = stones[i]; st.update(); // Remove if out of bounds if (st.x < 0 || st.x > GAME_WIDTH || st.y < 0 || st.y > GAME_HEIGHT) { stones.splice(i, 1); st.destroy(); continue; } // Hit enemy soldiers var hit = false; for (var j = enemySoldiers.length - 1; j >= 0; j--) { var e = enemySoldiers[j]; if (Math.abs(st.x - e.x) < 60 && Math.abs(st.y - e.y) < 80) { e.hp -= st.damage; e.hpBar.set(e.hp / e.maxHp); if (e.hp <= 0) { score += 10; enemySoldiers.splice(j, 1); e.destroy(); } hit = true; break; } } // Hit enemy base if (!hit && Math.abs(st.x - enemyBase.x) < 120 && Math.abs(st.y - enemyBase.y) < 120) { enemyBase.hp -= st.damage; if (enemyBase.hp < 0) enemyBase.hp = 0; hit = true; } if (hit) { stones.splice(i, 1); st.destroy(); } } // --- Enemy Bullets update --- for (var i = enemyBullets.length - 1; i >= 0; i--) { var b = enemyBullets[i]; b.update(); // Remove if out of bounds if (b.x < 0 || b.x > GAME_WIDTH || b.y < 0 || b.y > GAME_HEIGHT) { enemyBullets.splice(i, 1); b.destroy(); continue; } // Hit player soldiers var hit = false; for (var j = playerSoldiers.length - 1; j >= 0; j--) { var s = playerSoldiers[j]; if (Math.abs(b.x - s.x) < 50 && Math.abs(b.y - s.y) < 70) { s.hp -= b.damage; s.hpBar.set(s.hp / s.maxHp); if (s.hp <= 0) { playerSoldiers.splice(j, 1); s.destroy(); } hit = true; break; } } // Hit anaBase if (!hit && Math.abs(b.x - anaBase.x) < 120 && Math.abs(b.y - anaBase.y) < 120) { anaBase.hp -= b.damage; if (anaBase.hp < 0) anaBase.hp = 0; hit = true; } if (hit) { enemyBullets.splice(i, 1); b.destroy(); } } // --- Player Bullets update --- for (var i = playerBullets.length - 1; i >= 0; i--) { var b = playerBullets[i]; b.update(); // Remove if out of bounds if (b.x < 0 || b.x > GAME_WIDTH || b.y < 0 || b.y > GAME_HEIGHT) { playerBullets.splice(i, 1); b.destroy(); continue; } // Hit enemy soldiers var hit = false; for (var j = enemySoldiers.length - 1; j >= 0; j--) { var e = enemySoldiers[j]; if (Math.abs(b.x - e.x) < 50 && Math.abs(b.y - e.y) < 70) { e.hp -= b.damage; e.hpBar.set(e.hp / e.maxHp); if (e.hp <= 0) { score += 10; enemySoldiers.splice(j, 1); e.destroy(); } hit = true; break; } } // Hit enemy base if (!hit && Math.abs(b.x - enemyBase.x) < 120 && Math.abs(b.y - enemyBase.y) < 120) { enemyBase.hp -= b.damage; if (enemyBase.hp < 0) enemyBase.hp = 0; hit = true; } if (hit) { playerBullets.splice(i, 1); b.destroy(); } } // Check lose condition if (anaBase.hp <= 0) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } // Check win/level up if (enemyBase.hp <= 0) { level++; if (level > MAX_LEVEL) { LK.showYouWin(); return; } // Increase difficulty enemyBaseStats.hp = Math.round(enemyBaseStats.hp * 1.3); enemySoldierStats.hp = Math.round(enemySoldierStats.hp * 1.3); enemySoldierStats.atk = Math.round(enemySoldierStats.atk * 1.3); enemySoldierStats.speed = Math.round(enemySoldierStats.speed * 1.3 * 100) / 100; enemySpawnInterval = Math.max(60, enemySpawnInterval - 4); playerSpawnInterval = Math.max(60, playerSpawnInterval - 2); upgradePoints++; showUpgradeMsg("Seviye " + level + "! Yükseltme Puanı +1"); // Reset enemyBase.hp = enemyBaseStats.hp; enemyBase.maxHp = enemyBaseStats.hp; anaBase.hp = anaBaseStats.hp; anaBase.maxHp = anaBaseStats.hp; for (var i = 0; i < playerSoldiers.length; i++) playerSoldiers[i].destroy(); for (var i = 0; i < enemySoldiers.length; i++) enemySoldiers[i].destroy(); for (var i = 0; i < stones.length; i++) stones[i].destroy(); playerSoldiers = []; enemySoldiers = []; stones = []; } // Save progress storage.level = level; storage.score = score; storage.upgradePoints = upgradePoints; };
===================================================================
--- original.js
+++ change.js
@@ -340,27 +340,27 @@
/****
* Game Code
****/
-// Jet missile
-// Tank shell
-// Car bullet
-// Gunner bullet
-// StoneThrower bullet
-// Game constants
-// AnaBase (player base)
-// EnemyBase (enemy base)
-// Player soldier
-// Enemy soldier
-// Stone (slingshot projectile)
-// Slingshot
-// Health bar background
-// Health bar foreground
-// Taş atan
-// Mermi sıkan
-// Araba
-// Tank
// Savaş uçağı
+// Tank
+// Araba
+// Mermi sıkan
+// Taş atan
+// Health bar foreground
+// Health bar background
+// Slingshot
+// Stone (slingshot projectile)
+// Enemy soldier
+// Player soldier
+// EnemyBase (enemy base)
+// AnaBase (player base)
+// Game constants
+// StoneThrower bullet
+// Gunner bullet
+// Car bullet
+// Tank shell
+// Jet missile
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
var BASE_OFFSET_X = 220;
var BASE_OFFSET_Y = 200;
@@ -379,8 +379,19 @@
var playerBullets = []; // All player bullets
var level = storage.level || 1;
var score = storage.score || 0;
var upgradePoints = storage.upgradePoints || 0;
+// --- Freeze logic for firing phase ---
+var freezeAllSoldiers = false;
+var freezeWho = null; // "player" or "enemy" or null
+function isFiringPhase() {
+ // If there are any playerBullets or enemyBullets, or stones, freeze all soldiers
+ // But only if both sides still have soldiers
+ var playerAlive = playerSoldiers.length > 0;
+ var enemyAlive = enemySoldiers.length > 0;
+ var firingObjects = playerBullets.length > 0 || enemyBullets.length > 0 || stones.length > 0;
+ return firingObjects && playerAlive && enemyAlive;
+}
var isDraggingSling = false;
var dragStart = {
x: 0,
y: 0
@@ -840,13 +851,18 @@
spawnEnemySoldier();
}
spawnTimers.enemy = 0;
}
- // --- Freeze all soldiers if any bullet is being fired this frame ---
- var anyBulletFired = false;
+ // --- Freeze logic: check if firing phase is active ---
+ freezeAllSoldiers = isFiringPhase();
// Update player soldiers
for (var i = playerSoldiers.length - 1; i >= 0; i--) {
var s = playerSoldiers[i];
+ // --- Freeze all player soldiers if firing phase is active ---
+ if (freezeAllSoldiers) {
+ // No movement, no firing, no attacking base, but still allow dying from bullets
+ continue;
+ }
// Asker dondurma: eğer bir düşmanla çarpışıyorsa hareket etmesin
var frozen = false;
for (var j = enemySoldiers.length - 1; j >= 0; j--) {
var e = enemySoldiers[j];
@@ -902,13 +918,15 @@
}
}
}
if (!blocked) {
+ s.update();
+ // Clamp to not go past enemy base
+ if (s.x > enemyBase.x - 120) s.x = enemyBase.x - 120;
// --- Player Firing Logic ---
if (!s.fireTimer) s.fireTimer = 0;
s.fireTimer++;
var fireInterval = 60;
- var isFiring = false;
if (s.fireTimer >= fireInterval) {
// Find closest enemy soldier, else aim at enemy base
var target = null;
var minDist = 99999;
@@ -941,17 +959,9 @@
b.damage = s.atk || 8;
playerBullets.push(b);
game.addChild(b);
s.fireTimer = 0;
- isFiring = true;
- anyBulletFired = true;
}
- // Hareketi engelle: Sadece ateş eden askeri dondur, diğerleri hareket etsin
- if (!isFiring) {
- s.update();
- // Clamp to not go past enemy base
- if (s.x > enemyBase.x - 120) s.x = enemyBase.x - 120;
- }
}
}
// If at enemy base, attack base
if (s.lastAtEnemyBase === undefined) s.lastAtEnemyBase = false;
@@ -969,8 +979,13 @@
}
// Update enemy soldiers
for (var i = enemySoldiers.length - 1; i >= 0; i--) {
var e = enemySoldiers[i];
+ // --- Freeze all enemy soldiers if firing phase is active ---
+ if (freezeAllSoldiers) {
+ // No movement, no firing, no attacking base, but still allow dying from bullets
+ continue;
+ }
// Asker dondurma: eğer bir oyuncu askeriyle çarpışıyorsa hareket etmesin
var frozen = false;
for (var j = playerSoldiers.length - 1; j >= 0; j--) {
var s = playerSoldiers[j];
@@ -1022,91 +1037,85 @@
}
}
}
if (!blocked) {
- // --- Enemy Firing Logic ---
- if (!e.fireTimer) e.fireTimer = 0;
- e.fireTimer++;
- var fireInterval = 90; // default
- var BulletClass = null;
- var bulletSpeed = 0;
- var bulletDamage = 0;
- var bulletYOffset = 0;
- if (e.constructor === EnemyStoneThrower) {
- fireInterval = 120;
- BulletClass = EnemyStone;
- bulletSpeed = 12;
- bulletDamage = 10;
- bulletYOffset = -60;
- } else if (e.constructor === EnemyGunner) {
- fireInterval = 60;
- BulletClass = EnemyBullet;
- bulletSpeed = 18;
- bulletDamage = 14;
- bulletYOffset = -70;
- } else if (e.constructor === EnemyCar) {
- fireInterval = 80;
- BulletClass = EnemyCarBullet;
- bulletSpeed = 20;
- bulletDamage = 20;
- bulletYOffset = -40;
- } else if (e.constructor === EnemyTank) {
- fireInterval = 100;
- BulletClass = EnemyTankShell;
- bulletSpeed = 14;
- bulletDamage = 40;
- bulletYOffset = -50;
- } else if (e.constructor === EnemyJet) {
- fireInterval = 70;
- BulletClass = EnemyJetMissile;
- bulletSpeed = 28;
- bulletDamage = 60;
- bulletYOffset = -20;
- }
- var isFiring = false;
- if (BulletClass && e.fireTimer >= fireInterval) {
- // Find closest player soldier, else aim at anaBase
- var target = null;
- var minDist = 99999;
- for (var ps = 0; ps < playerSoldiers.length; ps++) {
- var p = playerSoldiers[ps];
- var dx = p.x - e.x;
- var dy = p.y - e.y;
- var dist = Math.sqrt(dx * dx + dy * dy);
- if (dist < minDist) {
- minDist = dist;
- target = p;
- }
- }
- if (!target) {
- target = anaBase;
- }
- // Fire bullet
- var b = new BulletClass();
- b.x = e.x;
- b.y = e.y + bulletYOffset;
- // Calculate direction
- var tx = target.x;
- var ty = target.y;
- var dx = tx - b.x;
- var dy = ty - b.y;
+ e.update();
+ // Clamp to not go past anaBase
+ if (e.x < anaBase.x + 120) e.x = anaBase.x + 120;
+ }
+ // --- Enemy Firing Logic ---
+ if (!e.fireTimer) e.fireTimer = 0;
+ e.fireTimer++;
+ var fireInterval = 90; // default
+ var BulletClass = null;
+ var bulletSpeed = 0;
+ var bulletDamage = 0;
+ var bulletYOffset = 0;
+ if (e.constructor === EnemyStoneThrower) {
+ fireInterval = 120;
+ BulletClass = EnemyStone;
+ bulletSpeed = 12;
+ bulletDamage = 10;
+ bulletYOffset = -60;
+ } else if (e.constructor === EnemyGunner) {
+ fireInterval = 60;
+ BulletClass = EnemyBullet;
+ bulletSpeed = 18;
+ bulletDamage = 14;
+ bulletYOffset = -70;
+ } else if (e.constructor === EnemyCar) {
+ fireInterval = 80;
+ BulletClass = EnemyCarBullet;
+ bulletSpeed = 20;
+ bulletDamage = 20;
+ bulletYOffset = -40;
+ } else if (e.constructor === EnemyTank) {
+ fireInterval = 100;
+ BulletClass = EnemyTankShell;
+ bulletSpeed = 14;
+ bulletDamage = 40;
+ bulletYOffset = -50;
+ } else if (e.constructor === EnemyJet) {
+ fireInterval = 70;
+ BulletClass = EnemyJetMissile;
+ bulletSpeed = 28;
+ bulletDamage = 60;
+ bulletYOffset = -20;
+ }
+ if (BulletClass && e.fireTimer >= fireInterval) {
+ // Find closest player soldier, else aim at anaBase
+ var target = null;
+ var minDist = 99999;
+ for (var ps = 0; ps < playerSoldiers.length; ps++) {
+ var p = playerSoldiers[ps];
+ var dx = p.x - e.x;
+ var dy = p.y - e.y;
var dist = Math.sqrt(dx * dx + dy * dy);
- if (dist === 0) dist = 1;
- b.vx = dx / dist * bulletSpeed;
- b.vy = dy / dist * bulletSpeed;
- b.damage = bulletDamage;
- enemyBullets.push(b);
- game.addChild(b);
- e.fireTimer = 0;
- isFiring = true;
- anyBulletFired = true;
+ if (dist < minDist) {
+ minDist = dist;
+ target = p;
+ }
}
- // Hareketi engelle: Sadece ateş eden düşman askeri dondur, diğerleri hareket etsin
- if (!isFiring) {
- e.update();
- // Clamp to not go past anaBase
- if (e.x < anaBase.x + 120) e.x = anaBase.x + 120;
+ if (!target) {
+ target = anaBase;
}
+ // Fire bullet
+ var b = new BulletClass();
+ b.x = e.x;
+ b.y = e.y + bulletYOffset;
+ // Calculate direction
+ var tx = target.x;
+ var ty = target.y;
+ var dx = tx - b.x;
+ var dy = ty - b.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist === 0) dist = 1;
+ b.vx = dx / dist * bulletSpeed;
+ b.vy = dy / dist * bulletSpeed;
+ b.damage = bulletDamage;
+ enemyBullets.push(b);
+ game.addChild(b);
+ e.fireTimer = 0;
}
}
// If at anaBase, attack base
if (e.lastAtAnaBase === undefined) e.lastAtAnaBase = false;
Yukarda gece gökyüzü, aşağıda çölün sadeliği, gerçekçi, uzaktan görünüm, yazısız, background, yüksek boyutta. In-Game asset. High contrast. No shadows
Askeri üs - gerçekçi, yazısız, yandan görünüm. In-Game asset. 2d. High contrast. No shadows
Ateş, gerçekçi, yazısız. In-Game asset. 2d. High contrast. No shadows
Mermi, gerçekçi, yazısız. In-Game asset. High contrast. No shadows
Taş çağında asker, yazısız, gerçekçi, yandan görünüm. In-Game asset. High contrast. No shadows
Komando, yazısız, gerçekçi, yandan görünüm. In-Game asset. 2d. High contrast. No shadows
Komando, yazısız, gerçekçi, yandan görünüm, bütün vücudu görünsün. In-Game asset. High contrast. No shadows
Zırhlı savaş arabası, gerçekçi, yazısız, yandan görümüm. In-Game asset. High contrast. No shadows
Sapan, yandan görünüm, gerçekçi, yazısız. In-Game asset. High contrast. No shadows
Savaş uçağı, gerçekçi, yazısız, yandan görünüm. In-Game asset. High contrast. No shadows
Füze, gerçekçi, yandan görünüm, yazısız. In-Game asset. High contrast. No shadows
Savaş tankı, gerçekçi, yandan görünüm, yazısız. In-Game asset. High contrast. No shadows
Bomba, gerçekçi, yandan görünüm, yazısız. In-Game asset. High contrast. No shadows
Music, icon, yazısız, gerçekçi. In-Game asset. High contrast. No shadows