User prompt
Ships cannot be checked after merging, fix this issue
User prompt
Fix problems in the game
User prompt
Devriye gemisinin hızını yüzde 30 azalat. Oyunda 4. Seviye korsan gemisi belirince devriye gemisi yardım için yeni bir devriye gemisi çağırsın ve her yeni 4. Seviye korsan gemisi için yeni bir devriye gemisi desteğe gelsin
User prompt
Fix bugs in the game
User prompt
Oyundaki hataları gider
User prompt
3. Seviye ve üst seviye gemiler görünmez ve işlevsiz oluyor bunu düzelt
User prompt
Oyunda 2 ve daha fazla 3. Seviye korsan gemisi olunca gemi hareket ettirelemiyor bunu gider
User prompt
Oyun devriye gemisini korsan gemisi sanıyor bu hatayı gider
User prompt
Zaman zaman gemiler hareket ettirilemiyor bu sorunu düzelt. Ayrıca devriye gemisini başlangıçta daha yavaş oyunda süre geçtikçe daha hızlı olmasını sağla
User prompt
Devriye gemisi haritada gezinsin ve radarına giren gemilere bomba atsın her korsan gemisinin seviyesi ile orantılı olarak canı daha yüksek olsun
User prompt
Gemi ekleme tuşu olmasın tersane adasına park edildiğinde otomatik olarak haritanın belli noktalarına 5 saniyede bir gemi eklensin
User prompt
Gemi ekleme tuşu yok neden
User prompt
Yeni gemi ekle butonu gözükmüyor neden
User prompt
Tersane adası için farklı bir asset kullan
User prompt
Son eklemeler oyuna eklenmemiş gözden geçir ve ekle
User prompt
Oyuncunun yeni gemi üretmesi için tersane adası ekle
Code edit (1 edits merged)
Please save this source code
User prompt
Korsan Adası: Altın ve Savaş
Initial prompt
Bir okyanus üzerinde bir korsan gemisi bir kaç adayı sömürüp altın kazanıyor. Altın kazandıkça yeni korsan gemileri üretiyor korsan gemileri oyuncunun sürekli mekaniği ile birleşip bir üst seviye korsan gemisi oluyor. Korsan gemilerine olduğu yerden bomba atıp batırmaya çalışan bir ordu gemisi var her bomba denk geldiğinde korsan gemileri in seviyesine göre canı azalsın
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // Bomba var Bomb = Container.expand(function (sx, sy, tx, ty) { var self = Container.call(this); self.asset = self.attachAsset('bomb', { anchorX: 0.5, anchorY: 0.5 }); self.x = sx; self.y = sy; self.tx = tx; self.ty = ty; self.speed = 18; self.toRemove = false; self.update = function () { var dx = self.tx - self.x; var dy = self.ty - self.y; var d = Math.sqrt(dx * dx + dy * dy); if (d < 30) { // Çarpışma kontrolü for (var i = pirateShips.length - 1; i >= 0; i--) { var ship = pirateShips[i]; // Sadece PirateShip sınıfı örneklerini hedef al, devriye gemilerini asla hedef alma var isNavy = false; for (var ni = 0; ni < navyShips.length; ni++) { if (ship === navyShips[ni]) { isNavy = true; break; } } if (ship && ship.constructor && ship.constructor === PirateShip && self.intersects(ship) && !isNavy && typeof ship.hp !== "undefined" && ship.hp > 0) { var dead = ship.takeDamage(25); // Her bomba vuruşu 25 hasar if (dead) { pirateShips.splice(i, 1); } self.toRemove = true; break; } } if (!self.toRemove) { self.toRemove = true; } } else { self.x += self.speed * dx / d; self.y += self.speed * dy / d; } // Ekran dışı if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) { self.toRemove = true; } }; return self; }); // Ada var Island = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('island', { anchorX: 0.5, anchorY: 0.5 }); return self; }); // Ordu Gemisi var NavyShip = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('navy', { anchorX: 0.5, anchorY: 0.5 }); // (No hp or takeDamage logic for NavyShip) self.bombCooldown = 0; self.target = null; self.speed = 1.8; //{G} // Devriye gemisi hızı azaltıldı (daha yavaş) self.bombs = []; self.patrolPoints = [[2048 / 2, 300], [2048 - 300, 700], [2048 - 300, 2000], [300, 2000], [300, 700]]; self.patrolIndex = 0; self.patrolWait = 0; self.radarRange = 600 * 600; // radar menzili (kare mesafe) self.update = function () { // 0-60sn: 2.8, 60-120sn: 3.5, 120-180sn: 4.2, 180+sn: 4.9 var elapsedSeconds = Math.floor(LK.ticks / 60); if (elapsedSeconds < 60) { self.speed = 2.8; } else if (elapsedSeconds < 120) { self.speed = 3.5; } else if (elapsedSeconds < 180) { self.speed = 4.2; } else { self.speed = 4.9; } // Önce radar menziline giren bir korsan gemisi var mı bak var foundTarget = null; var minDist = 999999; for (var i = 0; i < pirateShips.length; i++) { var candidate = pirateShips[i]; // Sadece PirateShip sınıfı örneklerini hedef al, diğer devriye gemilerini asla hedef alma var isNavyCandidate = false; for (var ni = 0; ni < navyShips.length; ni++) { if (candidate === navyShips[ni]) { isNavyCandidate = true; break; } } if (!candidate || !candidate.constructor || candidate.constructor !== PirateShip || candidate === self || isNavyCandidate) continue; var dx = candidate.x - self.x; var dy = candidate.y - self.y; var dist = dx * dx + dy * dy; if (dist < self.radarRange && dist < minDist) { minDist = dist; foundTarget = candidate; } } if (foundTarget) { self.target = foundTarget; } else { self.target = null; } // Eğer hedef varsa ona yönel ve bomba at if (self.target) { var dx = self.target.x - self.x; var dy = self.target.y - self.y; var d = Math.sqrt(dx * dx + dy * dy); if (d > 10) { self.x += self.speed * dx / d; self.y += self.speed * dy / d; } // Bomba at self.bombCooldown--; if (self.bombCooldown <= 0) { self.bombCooldown = 90 + Math.floor(Math.random() * 60); self.shootBomb(); } self.patrolWait = 0; // hedef varken bekleme yok } else { // Devriye rotasında gez if (self.patrolPoints && self.patrolPoints.length > 0) { var pt = self.patrolPoints[self.patrolIndex]; var dx = pt[0] - self.x; var dy = pt[1] - self.y; var d = Math.sqrt(dx * dx + dy * dy); if (d > 10) { self.x += self.speed * dx / d; self.y += self.speed * dy / d; self.patrolWait = 0; } else { // Noktaya ulaştı, biraz bekle if (self.patrolWait < 30) { self.patrolWait++; } else { self.patrolWait = 0; self.patrolIndex = (self.patrolIndex + 1) % self.patrolPoints.length; } } } } // Bombaları güncelle for (var i = self.bombs.length - 1; i >= 0; i--) { var bomb = self.bombs[i]; bomb.update(); if (bomb.toRemove) { bomb.destroy(); self.bombs.splice(i, 1); } } }; self.shootBomb = function () { if (!self.target) return; var bomb = new Bomb(self.x, self.y, self.target.x, self.target.y); game.addChild(bomb); self.bombs.push(bomb); LK.getSound('bomb').play(); }; // Devriye gemisi hasar alma fonksiyonu return self; }); // Korsan Gemisi var PirateShip = Container.expand(function () { var self = Container.call(this); self.level = 1; // 1-5 self.hp = 3; // Her seviye için can self.maxHp = 3; self.isDragging = false; self.isMerging = false; self.mergeTarget = null; self.collecting = false; self.collectTimeout = null; self.shootCooldown = 0; // 4 ve 5. seviye için ateş etme bekleme süresi self.bullets = []; // kendi mermileri // Sağlık barı için Container ve bar asset'i self.hpBarContainer = new Container(); self.hpBarBg = LK.getAsset('bullet', { width: 80, height: 14, color: 0x333333, anchorX: 0.5, anchorY: 0.5 }); self.hpBarFg = LK.getAsset('bullet', { width: 76, height: 10, color: 0x4caf50, anchorX: 0.5, anchorY: 0.5 }); self.hpBarContainer.addChild(self.hpBarBg); self.hpBarContainer.addChild(self.hpBarFg); self.hpBarFg.x = 0; // Foreground bar centered on background self.hpBarContainer.y = 0; // Yükseklik asset'e göre ayarlanacak // Seviye ve cana göre asset seçimi function updateGraphics() { if (self.asset) { self.removeChild(self.asset); } // Seviye 1-5 arası assetId belirle var assetId; if (self.level === 1) { assetId = 'pirate1'; } else if (self.level === 2) { assetId = 'pirate2'; } else if (self.level === 3) { assetId = 'pirate3'; } else if (self.level === 4) { assetId = 'pirate4'; } else if (self.level >= 5) { // 5 ve üstü seviye için en büyük asseti kullan assetId = 'pirate5'; } self.asset = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); // Görünürlük ve işlevsellik: 3 ve üstü seviyeler için de asset ve etkileşim aktif self.visible = true; self.interactive = true; // Asset boyutunu güncelle (gerekirse) if (self.hpText && self.asset) { self.hpText.x = 0; self.hpText.y = self.asset.height * 0.6; } // Sağlık barını asset boyutuna göre konumlandır if (self.hpBarContainer && self.asset) { self.hpBarContainer.x = 0; self.hpBarContainer.y = -self.asset.height * 0.55; } } updateGraphics(); // Can göstergesi self.hpText = new Text2(self.hp + '', { size: 60, fill: "#fff" }); self.hpText.anchor.set(0.5, 1.2); self.addChild(self.hpText); // Sağlık barını ekle self.addChild(self.hpBarContainer); // Sağlık barını güncelle self.updateHpBar = function () { // Bar genişliği ve oranı var ratio = Math.max(0, Math.min(1, self.hp / self.maxHp)); self.hpBarFg.width = 76 * ratio; self.hpBarFg.x = 0; // Keep bar centered as width changes // Renk değişimi (kırmızıya yaklaşsın) if (ratio > 0.5) { self.hpBarFg.tint = 0x4caf50; } else if (ratio > 0.2) { self.hpBarFg.tint = 0xffc107; } else { self.hpBarFg.tint = 0xf44336; } }; self.updateHp = function () { self.hpText.setText(self.hp + ''); self.updateHpBar(); }; // Seviye başına sabit can değerleri uygula self.setLevel = function (lvl) { self.level = lvl; // Seviye başına can değerleri if (self.level === 1) { self.maxHp = 100; } else if (self.level === 2) { self.maxHp = 125; } else if (self.level === 3) { self.maxHp = 150; } else if (self.level === 4) { self.maxHp = 175; } else if (self.level >= 5) { self.maxHp = 200; } self.hp = self.maxHp; updateGraphics(); self.updateHp(); }; self.takeDamage = function (dmg) { self.hp -= dmg; if (self.hp < 0) self.hp = 0; self.updateHp(); LK.effects.flashObject(self, 0xff0000, 400); LK.getSound('hit').play(); if (self.hp <= 0) { self.hp = 0; self.updateHp(); self.destroy(); return true; } return false; }; self.heal = function () { self.hp = self.maxHp; self.updateHp(); }; self.collectGold = function (island) { if (self.collecting) return; self.collecting = true; LK.getSound('gold').play(); // Altın animasyonu var gold = LK.getAsset('gold', { anchorX: 0.5, anchorY: 0.5, x: island.x, y: island.y }); game.addChild(gold); tween(gold, { x: self.x, y: self.y }, { duration: 500, easing: tween.cubicOut, onFinish: function onFinish() { gold.destroy(); } }); // Altın ekle goldCount += 1; updateGoldText(); // Skor: Altın toplama başına +2 puan if (typeof score !== "undefined") { score += 2; if (typeof updateScoreText === "function") updateScoreText(); } // Kısa süre sonra tekrar toplayabilsin self.collectTimeout = LK.setTimeout(function () { self.collecting = false; }, 1200); }; // (No PirateBullet or shootAtNavy logic) self.update = function () { // Mermileri güncelle for (var i = self.bullets.length - 1; i >= 0; i--) { var bullet = self.bullets[i]; if (bullet && typeof bullet.update === "function" && typeof self.hp !== "undefined" && self.hp > 0) bullet.update(); if (bullet && bullet.toRemove) { bullet.destroy(); self.bullets.splice(i, 1); } } // Ateş etme cooldown if (self.shootCooldown > 0) self.shootCooldown--; // (No self-defense for pirate ships) }; return self; }); // Tersane Adası (Shipyard Island) var ShipyardIsland = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('shipyard_island', { anchorX: 0.5, anchorY: 0.5 }); self.isShipyard = true; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a237e }); /**** * Game Code ****/ // Sesler // Altın simgesi // Bomba // Arka plan ekle var background = LK.getAsset('ocean_bg', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, scaleX: 1, scaleY: 1 }); background.alpha = 1; game.addChildAt(background, 0); // Ordu gemisi // Ada (altın kaynağı) // Korsan gemisi seviyelerine göre farklı renk ve boyutlarda kutular // Oyun değişkenleri var pirateShips = []; var islands = []; var navyShips = []; // Birden fazla devriye gemisi için dizi var goldCount = 0; var goldText = null; var score = 0; var scoreText = null; var spawnBtn = null; var draggingShip = null; var dragOffsetX = 0; var dragOffsetY = 0; var mergeCandidate = null; var mergeAnim = false; // Skor göstergesi scoreText = new Text2('Skor: 0', { size: 90, fill: 0xFFFFFF }); scoreText.anchor.set(1, 0); // sağ üst köşe için anchorX=1 LK.gui.topRight.addChild(scoreText); function updateScoreText() { scoreText.setText('Skor: ' + score); } // Altın göstergesi goldText = new Text2('Altın: 0', { size: 90, fill: 0xFFD700 }); goldText.anchor.set(0, 0); // sol üst köşe için anchorX=0 LK.gui.topLeft.addChild(goldText); function updateGoldText() { goldText.setText('Altın: ' + goldCount); } // Korsan gemisi üretme butonu kaldırıldı // Ada yerleşimi function spawnIslands() { var positions = [[400, 700], [1648, 700], [400, 2000], [1648, 2000], [1024, 1400]]; for (var i = 0; i < positions.length; i++) { // Son ada Shipyard olarak atanacak var island; if (i === positions.length - 1) { island = new ShipyardIsland(); island.isShipyard = true; } else { island = new Island(); island.isShipyard = false; } island.x = positions[i][0]; island.y = positions[i][1]; game.addChild(island); islands.push(island); } } // Başlangıç korsan gemisi function spawnPirateShip(level, x, y) { var ship = new PirateShip(); ship.setLevel(level); ship.x = x; ship.y = y; pirateShips.push(ship); game.addChild(ship); LK.getSound('spawn').play(); return ship; } // Ordu gemisi başlat function spawnNavyShip() { var newNavy = new NavyShip(); // Rastgele bir devriye rotası oluştur var patrolTemplates = [[[2048 / 2, 300], [2048 - 300, 700], [2048 - 300, 2000], [300, 2000], [300, 700]], [[300, 300], [2048 - 300, 300], [2048 - 300, 2732 - 300], [300, 2732 - 300]], [[1024, 400], [1800, 1000], [1024, 2200], [300, 1000]], [[400, 700], [1648, 700], [1648, 2000], [400, 2000]], [[600, 600], [2048 - 600, 600], [2048 - 600, 2732 - 600], [600, 2732 - 600]]]; var idx = Math.floor(Math.random() * patrolTemplates.length); newNavy.patrolPoints = patrolTemplates[idx]; newNavy.patrolIndex = 0; // Başlangıç noktası rotanın ilk noktası newNavy.x = newNavy.patrolPoints[0][0]; newNavy.y = newNavy.patrolPoints[0][1]; game.addChild(newNavy); navyShips.push(newNavy); return newNavy; } // Gemi birleştirme function tryMergeShips(ship1, ship2) { if (ship1.level !== ship2.level) return false; if (ship1.isMerging || ship2.isMerging) return false; if (ship1 === ship2) return false; if (ship1.level >= 5) return false; ship1.isMerging = true; ship2.isMerging = true; mergeAnim = true; // Birleştirme animasyonu var mx = (ship1.x + ship2.x) / 2; var my = (ship1.y + ship2.y) / 2; tween(ship1, { x: mx, y: my, scaleX: 1.2, scaleY: 1.2 }, { duration: 300, easing: tween.cubicInOut }); tween(ship2, { x: mx, y: my, scaleX: 1.2, scaleY: 1.2 }, { duration: 300, easing: tween.cubicInOut, onFinish: function onFinish() { // Yeni üst seviye gemi // Eski gemileri silmeden önce indexlerini al var idx1 = pirateShips.indexOf(ship1); var idx2 = pirateShips.indexOf(ship2); // Eski gemileri sil if (idx1 > -1) pirateShips.splice(idx1, 1); if (idx2 > -1) pirateShips.splice(idx2, 1); ship1.destroy(); ship2.destroy(); // Yeni üst seviye gemiyi ekle var newShip = spawnPirateShip(ship1.level + 1, mx, my); // --- EK: yeni geminin event handler'larını ve state'ini sıfırla --- newShip.isDragging = false; newShip.isMerging = false; newShip.mergeTarget = null; newShip.collecting = false; newShip.collectTimeout = null; LK.getSound('merge').play(); mergeAnim = false; // Skor: Birleştirme başına +10 puan score += 10; updateScoreText(); // --- YENİ EKLEME: yeni gemiyle hemen birleştirme ve altın toplama kontrolü --- // Merge sonrası yeni gemiyle hemen tekrar merge veya altın toplama kontrolü // 1. Merge kontrolü mergeCandidate = null; for (var i = 0; i < pirateShips.length; i++) { var other = pirateShips[i]; if (other === newShip) continue; if (other.level !== newShip.level) continue; var dx = newShip.x - other.x; var dy = newShip.y - other.y; var r = Math.max(newShip.asset.width, other.asset.width) / 2 + 30; if (dx * dx + dy * dy < r * r) { mergeCandidate = other; break; } } if (mergeCandidate) { tryMergeShips(newShip, mergeCandidate); } // 2. Altın toplama kontrolü for (var j = 0; j < islands.length; j++) { var island = islands[j]; if (newShip.intersects(island)) { newShip.collectGold(island); } } } }); } // Gemi ekleme tuşu kaldırıldı, otomatik üretim eklenecek // Gemi sürükleme ve birleştirme game.down = function (x, y, obj) { if (mergeAnim) return; // Eğer zaten bir gemi sürükleniyorsa ve o gemi hala pirateShips içindeyse yeni bir sürükleme başlatma if (draggingShip && draggingShip.isDragging && pirateShips.indexOf(draggingShip) !== -1) return; // Gemilerden birine tıklandı mı? for (var i = pirateShips.length - 1; i >= 0; i--) { var ship = pirateShips[i]; var dx = x - ship.x; var dy = y - ship.y; var r = Math.max(ship.asset.width, ship.asset.height) / 2; if (dx * dx + dy * dy < r * r) { // Sadece bir gemi sürüklenebilir, başka bir gemi sürükleniyorsa bırak if (draggingShip && draggingShip !== ship) { draggingShip.isDragging = false; } draggingShip = ship; dragOffsetX = ship.x - x; dragOffsetY = ship.y - y; ship.isDragging = true; break; } } }; game.move = function (x, y, obj) { if (mergeAnim) return; // draggingShip pirateShips'ten silindiyse veya draggingShip yoksa sürüklemeyi bırak if (!draggingShip || pirateShips.indexOf(draggingShip) === -1) { if (draggingShip) draggingShip.isDragging = false; draggingShip = null; mergeCandidate = null; return; } // Sadece draggingShip.isDragging true ise ve draggingShip hala pirateShips içinde ise sürüklemeye izin ver if (draggingShip && draggingShip.isDragging && pirateShips.indexOf(draggingShip) !== -1) { draggingShip.x = x + dragOffsetX; draggingShip.y = y + dragOffsetY; // Sınır dışına çıkmasın if (draggingShip.x < 120) draggingShip.x = 120; if (draggingShip.x > 2048 - 120) draggingShip.x = 2048 - 120; if (draggingShip.y < 200) draggingShip.y = 200; if (draggingShip.y > 2732 - 120) draggingShip.y = 2732 - 120; // Birleştirme adayı bul mergeCandidate = null; for (var i = 0; i < pirateShips.length; i++) { var other = pirateShips[i]; if (other === draggingShip) continue; if (other.level !== draggingShip.level) continue; var dx = draggingShip.x - other.x; var dy = draggingShip.y - other.y; var r = Math.max(draggingShip.asset.width, other.asset.width) / 2 + 30; if (dx * dx + dy * dy < r * r) { mergeCandidate = other; break; } } } }; game.up = function (x, y, obj) { if (mergeAnim) return; if (draggingShip && draggingShip.isDragging) { draggingShip.isDragging = false; // Birleştirme varsa if (mergeCandidate) { tryMergeShips(draggingShip, mergeCandidate); } draggingShip = null; mergeCandidate = null; } }; // Oyun güncelleme game.update = function () { // Ordu gemileri hareket ve bomba for (var n = 0; n < navyShips.length; n++) { if (navyShips[n]) { navyShips[n].update(); } } // Her yeni 4. seviye korsan gemisi için yeni devriye gemisi çağır if (typeof game.lastLevel4Count === "undefined") { game.lastLevel4Count = 0; } var currentLevel4Count = 0; for (var i = 0; i < pirateShips.length; i++) { var ship = pirateShips[i]; if (ship.level === 4) { currentLevel4Count++; } for (var j = 0; j < islands.length; j++) { var island = islands[j]; if (ship.intersects(island)) { ship.collectGold(island); } } } if (typeof game.lastLevel4ShipIds === "undefined") { game.lastLevel4ShipIds = []; } // Şu anki 4. seviye gemilerin referanslarını topla var currentLevel4ShipIds = []; for (var i = 0; i < pirateShips.length; i++) { if (pirateShips[i].level === 4) { currentLevel4ShipIds.push(pirateShips[i]); } } // Sadece yeni eklenen 4. seviye gemiler için devriye gemisi çağır for (var i = 0; i < currentLevel4ShipIds.length; i++) { var found = false; for (var j = 0; j < game.lastLevel4ShipIds.length; j++) { if (currentLevel4ShipIds[i] === game.lastLevel4ShipIds[j]) { found = true; break; } } if (!found) { spawnNavyShip(); } } game.lastLevel4ShipIds = currentLevel4ShipIds.slice(); // Oyun bitti mi? (Hiç korsan gemisi kalmadıysa) if (pirateShips.length === 0) { LK.effects.flashScreen(0x000000, 800); LK.showGameOver(); } }; // Oyun başlat spawnIslands(); spawnPirateShip(1, 2048 / 2, 2200); spawnNavyShip(); // İlk devriye gemisi updateGoldText(); // --- Otomatik gemi üretimi için değişkenler --- var autoSpawnInterval = null; var autoSpawnActive = false; var lastShipOnShipyard = false; // --- Otomatik gemi üretim fonksiyonu --- function tryAutoSpawnPirateShip() { // Shipyard adasını bul var shipyard = null; for (var i = 0; i < islands.length; i++) { if (islands[i].isShipyard) { shipyard = islands[i]; break; } } if (!shipyard) return; // Shipyard adasında bir korsan gemisi var mı? var shipOnShipyard = false; for (var j = 0; j < pirateShips.length; j++) { var ship = pirateShips[j]; if (ship.intersects(shipyard)) { shipOnShipyard = true; break; } } // Sadece bir kere interval başlatmak için state takibi if (shipOnShipyard && !autoSpawnActive) { autoSpawnActive = true; autoSpawnInterval = LK.setInterval(function () { // Her 5 saniyede bir, shipyard adasında hala gemi varsa yeni gemi üret var stillShipOnShipyard = false; for (var k = 0; k < pirateShips.length; k++) { if (pirateShips[k].intersects(shipyard)) { stillShipOnShipyard = true; break; } } if (stillShipOnShipyard) { // Haritanın rastgele bir adasına (shipyard hariç) yeni gemi ekle var possibleIslands = []; for (var m = 0; m < islands.length; m++) { if (!islands[m].isShipyard) { possibleIslands.push(islands[m]); } } if (possibleIslands.length > 0) { var targetIsland = possibleIslands[Math.floor(Math.random() * possibleIslands.length)]; var px = targetIsland.x + (Math.random() - 0.5) * 40; var py = targetIsland.y + (Math.random() - 0.5) * 40; spawnPirateShip(1, px, py); } } else { // Shipyard'da gemi yoksa intervali durdur LK.clearInterval(autoSpawnInterval); autoSpawnActive = false; } }, 5000); } else if (!shipOnShipyard && autoSpawnActive) { // Shipyard'da gemi yoksa intervali durdur LK.clearInterval(autoSpawnInterval); autoSpawnActive = false; } } // Oyun update fonksiyonuna shipyard kontrolü ekle var originalGameUpdate = game.update; game.update = function () { if (typeof originalGameUpdate === "function") { originalGameUpdate(); } tryAutoSpawnPirateShip(); };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// Bomba
var Bomb = Container.expand(function (sx, sy, tx, ty) {
var self = Container.call(this);
self.asset = self.attachAsset('bomb', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = sx;
self.y = sy;
self.tx = tx;
self.ty = ty;
self.speed = 18;
self.toRemove = false;
self.update = function () {
var dx = self.tx - self.x;
var dy = self.ty - self.y;
var d = Math.sqrt(dx * dx + dy * dy);
if (d < 30) {
// Çarpışma kontrolü
for (var i = pirateShips.length - 1; i >= 0; i--) {
var ship = pirateShips[i];
// Sadece PirateShip sınıfı örneklerini hedef al, devriye gemilerini asla hedef alma
var isNavy = false;
for (var ni = 0; ni < navyShips.length; ni++) {
if (ship === navyShips[ni]) {
isNavy = true;
break;
}
}
if (ship && ship.constructor && ship.constructor === PirateShip && self.intersects(ship) && !isNavy && typeof ship.hp !== "undefined" && ship.hp > 0) {
var dead = ship.takeDamage(25); // Her bomba vuruşu 25 hasar
if (dead) {
pirateShips.splice(i, 1);
}
self.toRemove = true;
break;
}
}
if (!self.toRemove) {
self.toRemove = true;
}
} else {
self.x += self.speed * dx / d;
self.y += self.speed * dy / d;
}
// Ekran dışı
if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) {
self.toRemove = true;
}
};
return self;
});
// Ada
var Island = Container.expand(function () {
var self = Container.call(this);
self.asset = self.attachAsset('island', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Ordu Gemisi
var NavyShip = Container.expand(function () {
var self = Container.call(this);
self.asset = self.attachAsset('navy', {
anchorX: 0.5,
anchorY: 0.5
});
// (No hp or takeDamage logic for NavyShip)
self.bombCooldown = 0;
self.target = null;
self.speed = 1.8; //{G} // Devriye gemisi hızı azaltıldı (daha yavaş)
self.bombs = [];
self.patrolPoints = [[2048 / 2, 300], [2048 - 300, 700], [2048 - 300, 2000], [300, 2000], [300, 700]];
self.patrolIndex = 0;
self.patrolWait = 0;
self.radarRange = 600 * 600; // radar menzili (kare mesafe)
self.update = function () {
// 0-60sn: 2.8, 60-120sn: 3.5, 120-180sn: 4.2, 180+sn: 4.9
var elapsedSeconds = Math.floor(LK.ticks / 60);
if (elapsedSeconds < 60) {
self.speed = 2.8;
} else if (elapsedSeconds < 120) {
self.speed = 3.5;
} else if (elapsedSeconds < 180) {
self.speed = 4.2;
} else {
self.speed = 4.9;
}
// Önce radar menziline giren bir korsan gemisi var mı bak
var foundTarget = null;
var minDist = 999999;
for (var i = 0; i < pirateShips.length; i++) {
var candidate = pirateShips[i];
// Sadece PirateShip sınıfı örneklerini hedef al, diğer devriye gemilerini asla hedef alma
var isNavyCandidate = false;
for (var ni = 0; ni < navyShips.length; ni++) {
if (candidate === navyShips[ni]) {
isNavyCandidate = true;
break;
}
}
if (!candidate || !candidate.constructor || candidate.constructor !== PirateShip || candidate === self || isNavyCandidate) continue;
var dx = candidate.x - self.x;
var dy = candidate.y - self.y;
var dist = dx * dx + dy * dy;
if (dist < self.radarRange && dist < minDist) {
minDist = dist;
foundTarget = candidate;
}
}
if (foundTarget) {
self.target = foundTarget;
} else {
self.target = null;
}
// Eğer hedef varsa ona yönel ve bomba at
if (self.target) {
var dx = self.target.x - self.x;
var dy = self.target.y - self.y;
var d = Math.sqrt(dx * dx + dy * dy);
if (d > 10) {
self.x += self.speed * dx / d;
self.y += self.speed * dy / d;
}
// Bomba at
self.bombCooldown--;
if (self.bombCooldown <= 0) {
self.bombCooldown = 90 + Math.floor(Math.random() * 60);
self.shootBomb();
}
self.patrolWait = 0; // hedef varken bekleme yok
} else {
// Devriye rotasında gez
if (self.patrolPoints && self.patrolPoints.length > 0) {
var pt = self.patrolPoints[self.patrolIndex];
var dx = pt[0] - self.x;
var dy = pt[1] - self.y;
var d = Math.sqrt(dx * dx + dy * dy);
if (d > 10) {
self.x += self.speed * dx / d;
self.y += self.speed * dy / d;
self.patrolWait = 0;
} else {
// Noktaya ulaştı, biraz bekle
if (self.patrolWait < 30) {
self.patrolWait++;
} else {
self.patrolWait = 0;
self.patrolIndex = (self.patrolIndex + 1) % self.patrolPoints.length;
}
}
}
}
// Bombaları güncelle
for (var i = self.bombs.length - 1; i >= 0; i--) {
var bomb = self.bombs[i];
bomb.update();
if (bomb.toRemove) {
bomb.destroy();
self.bombs.splice(i, 1);
}
}
};
self.shootBomb = function () {
if (!self.target) return;
var bomb = new Bomb(self.x, self.y, self.target.x, self.target.y);
game.addChild(bomb);
self.bombs.push(bomb);
LK.getSound('bomb').play();
};
// Devriye gemisi hasar alma fonksiyonu
return self;
});
// Korsan Gemisi
var PirateShip = Container.expand(function () {
var self = Container.call(this);
self.level = 1; // 1-5
self.hp = 3; // Her seviye için can
self.maxHp = 3;
self.isDragging = false;
self.isMerging = false;
self.mergeTarget = null;
self.collecting = false;
self.collectTimeout = null;
self.shootCooldown = 0; // 4 ve 5. seviye için ateş etme bekleme süresi
self.bullets = []; // kendi mermileri
// Sağlık barı için Container ve bar asset'i
self.hpBarContainer = new Container();
self.hpBarBg = LK.getAsset('bullet', {
width: 80,
height: 14,
color: 0x333333,
anchorX: 0.5,
anchorY: 0.5
});
self.hpBarFg = LK.getAsset('bullet', {
width: 76,
height: 10,
color: 0x4caf50,
anchorX: 0.5,
anchorY: 0.5
});
self.hpBarContainer.addChild(self.hpBarBg);
self.hpBarContainer.addChild(self.hpBarFg);
self.hpBarFg.x = 0; // Foreground bar centered on background
self.hpBarContainer.y = 0; // Yükseklik asset'e göre ayarlanacak
// Seviye ve cana göre asset seçimi
function updateGraphics() {
if (self.asset) {
self.removeChild(self.asset);
}
// Seviye 1-5 arası assetId belirle
var assetId;
if (self.level === 1) {
assetId = 'pirate1';
} else if (self.level === 2) {
assetId = 'pirate2';
} else if (self.level === 3) {
assetId = 'pirate3';
} else if (self.level === 4) {
assetId = 'pirate4';
} else if (self.level >= 5) {
// 5 ve üstü seviye için en büyük asseti kullan
assetId = 'pirate5';
}
self.asset = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// Görünürlük ve işlevsellik: 3 ve üstü seviyeler için de asset ve etkileşim aktif
self.visible = true;
self.interactive = true;
// Asset boyutunu güncelle (gerekirse)
if (self.hpText && self.asset) {
self.hpText.x = 0;
self.hpText.y = self.asset.height * 0.6;
}
// Sağlık barını asset boyutuna göre konumlandır
if (self.hpBarContainer && self.asset) {
self.hpBarContainer.x = 0;
self.hpBarContainer.y = -self.asset.height * 0.55;
}
}
updateGraphics();
// Can göstergesi
self.hpText = new Text2(self.hp + '', {
size: 60,
fill: "#fff"
});
self.hpText.anchor.set(0.5, 1.2);
self.addChild(self.hpText);
// Sağlık barını ekle
self.addChild(self.hpBarContainer);
// Sağlık barını güncelle
self.updateHpBar = function () {
// Bar genişliği ve oranı
var ratio = Math.max(0, Math.min(1, self.hp / self.maxHp));
self.hpBarFg.width = 76 * ratio;
self.hpBarFg.x = 0; // Keep bar centered as width changes
// Renk değişimi (kırmızıya yaklaşsın)
if (ratio > 0.5) {
self.hpBarFg.tint = 0x4caf50;
} else if (ratio > 0.2) {
self.hpBarFg.tint = 0xffc107;
} else {
self.hpBarFg.tint = 0xf44336;
}
};
self.updateHp = function () {
self.hpText.setText(self.hp + '');
self.updateHpBar();
};
// Seviye başına sabit can değerleri uygula
self.setLevel = function (lvl) {
self.level = lvl;
// Seviye başına can değerleri
if (self.level === 1) {
self.maxHp = 100;
} else if (self.level === 2) {
self.maxHp = 125;
} else if (self.level === 3) {
self.maxHp = 150;
} else if (self.level === 4) {
self.maxHp = 175;
} else if (self.level >= 5) {
self.maxHp = 200;
}
self.hp = self.maxHp;
updateGraphics();
self.updateHp();
};
self.takeDamage = function (dmg) {
self.hp -= dmg;
if (self.hp < 0) self.hp = 0;
self.updateHp();
LK.effects.flashObject(self, 0xff0000, 400);
LK.getSound('hit').play();
if (self.hp <= 0) {
self.hp = 0;
self.updateHp();
self.destroy();
return true;
}
return false;
};
self.heal = function () {
self.hp = self.maxHp;
self.updateHp();
};
self.collectGold = function (island) {
if (self.collecting) return;
self.collecting = true;
LK.getSound('gold').play();
// Altın animasyonu
var gold = LK.getAsset('gold', {
anchorX: 0.5,
anchorY: 0.5,
x: island.x,
y: island.y
});
game.addChild(gold);
tween(gold, {
x: self.x,
y: self.y
}, {
duration: 500,
easing: tween.cubicOut,
onFinish: function onFinish() {
gold.destroy();
}
});
// Altın ekle
goldCount += 1;
updateGoldText();
// Skor: Altın toplama başına +2 puan
if (typeof score !== "undefined") {
score += 2;
if (typeof updateScoreText === "function") updateScoreText();
}
// Kısa süre sonra tekrar toplayabilsin
self.collectTimeout = LK.setTimeout(function () {
self.collecting = false;
}, 1200);
};
// (No PirateBullet or shootAtNavy logic)
self.update = function () {
// Mermileri güncelle
for (var i = self.bullets.length - 1; i >= 0; i--) {
var bullet = self.bullets[i];
if (bullet && typeof bullet.update === "function" && typeof self.hp !== "undefined" && self.hp > 0) bullet.update();
if (bullet && bullet.toRemove) {
bullet.destroy();
self.bullets.splice(i, 1);
}
}
// Ateş etme cooldown
if (self.shootCooldown > 0) self.shootCooldown--;
// (No self-defense for pirate ships)
};
return self;
});
// Tersane Adası (Shipyard Island)
var ShipyardIsland = Container.expand(function () {
var self = Container.call(this);
self.asset = self.attachAsset('shipyard_island', {
anchorX: 0.5,
anchorY: 0.5
});
self.isShipyard = true;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a237e
});
/****
* Game Code
****/
// Sesler
// Altın simgesi
// Bomba
// Arka plan ekle
var background = LK.getAsset('ocean_bg', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2,
scaleX: 1,
scaleY: 1
});
background.alpha = 1;
game.addChildAt(background, 0);
// Ordu gemisi
// Ada (altın kaynağı)
// Korsan gemisi seviyelerine göre farklı renk ve boyutlarda kutular
// Oyun değişkenleri
var pirateShips = [];
var islands = [];
var navyShips = []; // Birden fazla devriye gemisi için dizi
var goldCount = 0;
var goldText = null;
var score = 0;
var scoreText = null;
var spawnBtn = null;
var draggingShip = null;
var dragOffsetX = 0;
var dragOffsetY = 0;
var mergeCandidate = null;
var mergeAnim = false;
// Skor göstergesi
scoreText = new Text2('Skor: 0', {
size: 90,
fill: 0xFFFFFF
});
scoreText.anchor.set(1, 0); // sağ üst köşe için anchorX=1
LK.gui.topRight.addChild(scoreText);
function updateScoreText() {
scoreText.setText('Skor: ' + score);
}
// Altın göstergesi
goldText = new Text2('Altın: 0', {
size: 90,
fill: 0xFFD700
});
goldText.anchor.set(0, 0); // sol üst köşe için anchorX=0
LK.gui.topLeft.addChild(goldText);
function updateGoldText() {
goldText.setText('Altın: ' + goldCount);
}
// Korsan gemisi üretme butonu kaldırıldı
// Ada yerleşimi
function spawnIslands() {
var positions = [[400, 700], [1648, 700], [400, 2000], [1648, 2000], [1024, 1400]];
for (var i = 0; i < positions.length; i++) {
// Son ada Shipyard olarak atanacak
var island;
if (i === positions.length - 1) {
island = new ShipyardIsland();
island.isShipyard = true;
} else {
island = new Island();
island.isShipyard = false;
}
island.x = positions[i][0];
island.y = positions[i][1];
game.addChild(island);
islands.push(island);
}
}
// Başlangıç korsan gemisi
function spawnPirateShip(level, x, y) {
var ship = new PirateShip();
ship.setLevel(level);
ship.x = x;
ship.y = y;
pirateShips.push(ship);
game.addChild(ship);
LK.getSound('spawn').play();
return ship;
}
// Ordu gemisi başlat
function spawnNavyShip() {
var newNavy = new NavyShip();
// Rastgele bir devriye rotası oluştur
var patrolTemplates = [[[2048 / 2, 300], [2048 - 300, 700], [2048 - 300, 2000], [300, 2000], [300, 700]], [[300, 300], [2048 - 300, 300], [2048 - 300, 2732 - 300], [300, 2732 - 300]], [[1024, 400], [1800, 1000], [1024, 2200], [300, 1000]], [[400, 700], [1648, 700], [1648, 2000], [400, 2000]], [[600, 600], [2048 - 600, 600], [2048 - 600, 2732 - 600], [600, 2732 - 600]]];
var idx = Math.floor(Math.random() * patrolTemplates.length);
newNavy.patrolPoints = patrolTemplates[idx];
newNavy.patrolIndex = 0;
// Başlangıç noktası rotanın ilk noktası
newNavy.x = newNavy.patrolPoints[0][0];
newNavy.y = newNavy.patrolPoints[0][1];
game.addChild(newNavy);
navyShips.push(newNavy);
return newNavy;
}
// Gemi birleştirme
function tryMergeShips(ship1, ship2) {
if (ship1.level !== ship2.level) return false;
if (ship1.isMerging || ship2.isMerging) return false;
if (ship1 === ship2) return false;
if (ship1.level >= 5) return false;
ship1.isMerging = true;
ship2.isMerging = true;
mergeAnim = true;
// Birleştirme animasyonu
var mx = (ship1.x + ship2.x) / 2;
var my = (ship1.y + ship2.y) / 2;
tween(ship1, {
x: mx,
y: my,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300,
easing: tween.cubicInOut
});
tween(ship2, {
x: mx,
y: my,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300,
easing: tween.cubicInOut,
onFinish: function onFinish() {
// Yeni üst seviye gemi
// Eski gemileri silmeden önce indexlerini al
var idx1 = pirateShips.indexOf(ship1);
var idx2 = pirateShips.indexOf(ship2);
// Eski gemileri sil
if (idx1 > -1) pirateShips.splice(idx1, 1);
if (idx2 > -1) pirateShips.splice(idx2, 1);
ship1.destroy();
ship2.destroy();
// Yeni üst seviye gemiyi ekle
var newShip = spawnPirateShip(ship1.level + 1, mx, my);
// --- EK: yeni geminin event handler'larını ve state'ini sıfırla ---
newShip.isDragging = false;
newShip.isMerging = false;
newShip.mergeTarget = null;
newShip.collecting = false;
newShip.collectTimeout = null;
LK.getSound('merge').play();
mergeAnim = false;
// Skor: Birleştirme başına +10 puan
score += 10;
updateScoreText();
// --- YENİ EKLEME: yeni gemiyle hemen birleştirme ve altın toplama kontrolü ---
// Merge sonrası yeni gemiyle hemen tekrar merge veya altın toplama kontrolü
// 1. Merge kontrolü
mergeCandidate = null;
for (var i = 0; i < pirateShips.length; i++) {
var other = pirateShips[i];
if (other === newShip) continue;
if (other.level !== newShip.level) continue;
var dx = newShip.x - other.x;
var dy = newShip.y - other.y;
var r = Math.max(newShip.asset.width, other.asset.width) / 2 + 30;
if (dx * dx + dy * dy < r * r) {
mergeCandidate = other;
break;
}
}
if (mergeCandidate) {
tryMergeShips(newShip, mergeCandidate);
}
// 2. Altın toplama kontrolü
for (var j = 0; j < islands.length; j++) {
var island = islands[j];
if (newShip.intersects(island)) {
newShip.collectGold(island);
}
}
}
});
}
// Gemi ekleme tuşu kaldırıldı, otomatik üretim eklenecek
// Gemi sürükleme ve birleştirme
game.down = function (x, y, obj) {
if (mergeAnim) return;
// Eğer zaten bir gemi sürükleniyorsa ve o gemi hala pirateShips içindeyse yeni bir sürükleme başlatma
if (draggingShip && draggingShip.isDragging && pirateShips.indexOf(draggingShip) !== -1) return;
// Gemilerden birine tıklandı mı?
for (var i = pirateShips.length - 1; i >= 0; i--) {
var ship = pirateShips[i];
var dx = x - ship.x;
var dy = y - ship.y;
var r = Math.max(ship.asset.width, ship.asset.height) / 2;
if (dx * dx + dy * dy < r * r) {
// Sadece bir gemi sürüklenebilir, başka bir gemi sürükleniyorsa bırak
if (draggingShip && draggingShip !== ship) {
draggingShip.isDragging = false;
}
draggingShip = ship;
dragOffsetX = ship.x - x;
dragOffsetY = ship.y - y;
ship.isDragging = true;
break;
}
}
};
game.move = function (x, y, obj) {
if (mergeAnim) return;
// draggingShip pirateShips'ten silindiyse veya draggingShip yoksa sürüklemeyi bırak
if (!draggingShip || pirateShips.indexOf(draggingShip) === -1) {
if (draggingShip) draggingShip.isDragging = false;
draggingShip = null;
mergeCandidate = null;
return;
}
// Sadece draggingShip.isDragging true ise ve draggingShip hala pirateShips içinde ise sürüklemeye izin ver
if (draggingShip && draggingShip.isDragging && pirateShips.indexOf(draggingShip) !== -1) {
draggingShip.x = x + dragOffsetX;
draggingShip.y = y + dragOffsetY;
// Sınır dışına çıkmasın
if (draggingShip.x < 120) draggingShip.x = 120;
if (draggingShip.x > 2048 - 120) draggingShip.x = 2048 - 120;
if (draggingShip.y < 200) draggingShip.y = 200;
if (draggingShip.y > 2732 - 120) draggingShip.y = 2732 - 120;
// Birleştirme adayı bul
mergeCandidate = null;
for (var i = 0; i < pirateShips.length; i++) {
var other = pirateShips[i];
if (other === draggingShip) continue;
if (other.level !== draggingShip.level) continue;
var dx = draggingShip.x - other.x;
var dy = draggingShip.y - other.y;
var r = Math.max(draggingShip.asset.width, other.asset.width) / 2 + 30;
if (dx * dx + dy * dy < r * r) {
mergeCandidate = other;
break;
}
}
}
};
game.up = function (x, y, obj) {
if (mergeAnim) return;
if (draggingShip && draggingShip.isDragging) {
draggingShip.isDragging = false;
// Birleştirme varsa
if (mergeCandidate) {
tryMergeShips(draggingShip, mergeCandidate);
}
draggingShip = null;
mergeCandidate = null;
}
};
// Oyun güncelleme
game.update = function () {
// Ordu gemileri hareket ve bomba
for (var n = 0; n < navyShips.length; n++) {
if (navyShips[n]) {
navyShips[n].update();
}
}
// Her yeni 4. seviye korsan gemisi için yeni devriye gemisi çağır
if (typeof game.lastLevel4Count === "undefined") {
game.lastLevel4Count = 0;
}
var currentLevel4Count = 0;
for (var i = 0; i < pirateShips.length; i++) {
var ship = pirateShips[i];
if (ship.level === 4) {
currentLevel4Count++;
}
for (var j = 0; j < islands.length; j++) {
var island = islands[j];
if (ship.intersects(island)) {
ship.collectGold(island);
}
}
}
if (typeof game.lastLevel4ShipIds === "undefined") {
game.lastLevel4ShipIds = [];
}
// Şu anki 4. seviye gemilerin referanslarını topla
var currentLevel4ShipIds = [];
for (var i = 0; i < pirateShips.length; i++) {
if (pirateShips[i].level === 4) {
currentLevel4ShipIds.push(pirateShips[i]);
}
}
// Sadece yeni eklenen 4. seviye gemiler için devriye gemisi çağır
for (var i = 0; i < currentLevel4ShipIds.length; i++) {
var found = false;
for (var j = 0; j < game.lastLevel4ShipIds.length; j++) {
if (currentLevel4ShipIds[i] === game.lastLevel4ShipIds[j]) {
found = true;
break;
}
}
if (!found) {
spawnNavyShip();
}
}
game.lastLevel4ShipIds = currentLevel4ShipIds.slice();
// Oyun bitti mi? (Hiç korsan gemisi kalmadıysa)
if (pirateShips.length === 0) {
LK.effects.flashScreen(0x000000, 800);
LK.showGameOver();
}
};
// Oyun başlat
spawnIslands();
spawnPirateShip(1, 2048 / 2, 2200);
spawnNavyShip(); // İlk devriye gemisi
updateGoldText();
// --- Otomatik gemi üretimi için değişkenler ---
var autoSpawnInterval = null;
var autoSpawnActive = false;
var lastShipOnShipyard = false;
// --- Otomatik gemi üretim fonksiyonu ---
function tryAutoSpawnPirateShip() {
// Shipyard adasını bul
var shipyard = null;
for (var i = 0; i < islands.length; i++) {
if (islands[i].isShipyard) {
shipyard = islands[i];
break;
}
}
if (!shipyard) return;
// Shipyard adasında bir korsan gemisi var mı?
var shipOnShipyard = false;
for (var j = 0; j < pirateShips.length; j++) {
var ship = pirateShips[j];
if (ship.intersects(shipyard)) {
shipOnShipyard = true;
break;
}
}
// Sadece bir kere interval başlatmak için state takibi
if (shipOnShipyard && !autoSpawnActive) {
autoSpawnActive = true;
autoSpawnInterval = LK.setInterval(function () {
// Her 5 saniyede bir, shipyard adasında hala gemi varsa yeni gemi üret
var stillShipOnShipyard = false;
for (var k = 0; k < pirateShips.length; k++) {
if (pirateShips[k].intersects(shipyard)) {
stillShipOnShipyard = true;
break;
}
}
if (stillShipOnShipyard) {
// Haritanın rastgele bir adasına (shipyard hariç) yeni gemi ekle
var possibleIslands = [];
for (var m = 0; m < islands.length; m++) {
if (!islands[m].isShipyard) {
possibleIslands.push(islands[m]);
}
}
if (possibleIslands.length > 0) {
var targetIsland = possibleIslands[Math.floor(Math.random() * possibleIslands.length)];
var px = targetIsland.x + (Math.random() - 0.5) * 40;
var py = targetIsland.y + (Math.random() - 0.5) * 40;
spawnPirateShip(1, px, py);
}
} else {
// Shipyard'da gemi yoksa intervali durdur
LK.clearInterval(autoSpawnInterval);
autoSpawnActive = false;
}
}, 5000);
} else if (!shipOnShipyard && autoSpawnActive) {
// Shipyard'da gemi yoksa intervali durdur
LK.clearInterval(autoSpawnInterval);
autoSpawnActive = false;
}
}
// Oyun update fonksiyonuna shipyard kontrolü ekle
var originalGameUpdate = game.update;
game.update = function () {
if (typeof originalGameUpdate === "function") {
originalGameUpdate();
}
tryAutoSpawnPirateShip();
};