User prompt
Gemi İsmini her yerden ''Savaşçı'' olarak değiştirelim.
User prompt
Asteroit Avcısı gemisini de 300 Kaynağa satın alabilelim.
User prompt
Üzerine bir panel daha oluştur. Oradan gemileri satın alabilelim.
User prompt
Kaynaklar hariç bütün yazı rengi beyaz olsun
User prompt
Yazıya Arka gölge ekle
User prompt
Bu panelin kendisinin resim dosyasını oluştur
User prompt
Sağ alt taraftaki yazıların üzerine yeni bir panel oluştur. Oradan aktif olan gemi öğelerini satın alabilelim.
User prompt
Sağ alt panele Gemi Canı kısmını sil. Can ibresi sadece o geminin üzerinde görünsün bar şeklinde.
User prompt
0 olursa o gemi ölsün. Oyun bitmesin
User prompt
En son gemi ekliyordun yarım kaldı. Devam et ona
User prompt
Please fix the bug: 'AsteroidNode is not defined' in or related to this line: 'var a = new AsteroidNode();' Line Number: 416
User prompt
Sorunu tamamen çöz.
User prompt
Sorunu çöz
User prompt
Please fix the bug: 'Ship is not defined' in or related to this line: 'ship = new Ship();' Line Number: 300
User prompt
Please fix the bug: 'Colony is not defined' in or related to this line: 'colony = new Colony();' Line Number: 90
User prompt
Please fix the bug: 'Colony is not defined' in or related to this line: 'colony = new Colony();' Line Number: 90
User prompt
Yeni bir gemi türü oluştur. Adı Toplayıcı olsun sadece haritada var olan kaynakları gidip toplasın. bu isteğime devam et
User prompt
Devam et
User prompt
Devam et
User prompt
Astroidlerin Boyutu Koloniye yaklaştıkça büyüsün. Başlangıçta çok küçük görünsünler. Asteroit Avcısı ise Haritanın yarısından yukarı kısmına müdahale etmesin. Bunu oran ile ayarla. İleride yükseltme yaparak bu oranı artıracağız.
User prompt
Toplayıcıların ismini sistemden tamamen ''Asteroit Avcısı'' olarak değiştir. Haritada bulunan hiçbir madeni toplamalarına izin verme. Sadece Astroidleri yok etmek için görevli olsunlar.
User prompt
Toplayıcılar Astroidleri haritanın neresinde olursa olsun yok etsinler. Ancak öncelik koloniye en yakın olan astroid olsun.
User prompt
Collector'ın asteroid peşine düşme mesafesini haritanın ortası ile koloni arasına geldiğinde aktif et.
User prompt
Collector'ın asteroid peşine düşme mesafesini haritanın orta alt tarafına geldiğinde aktif et.
User prompt
Collector'ın asteroid peşine düşme mesafesini astroid boyutu %50ye yaklaşınca takip etsin.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // Asteroit Avcısı (Collector) var AsteroidHunter = Container.expand(function () { var self = Container.call(this); var col = self.attachAsset('collector', { anchorX: 0.5, anchorY: 0.5 }); self.target = null; // Avcı hızı, kaynak hızından %25 fazla olacak şekilde ayarlanır self.speed = 1.25 * (0.002 + 0.001) * 0.1 * 2732; // Kaynakların max hızından %25 fazla (normalize için 2732 ile çarpıldı) self.state = 'idle'; // idle, moving, returning self.update = function () { if (self.state === 'moving' && self.target) { var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); // --- Avcı mermi sıksın: 60 tickte bir (1 saniyede bir) --- if (typeof self.lastShot === "undefined") self.lastShot = 0; if (typeof self.shootDelay === "undefined") self.shootDelay = 60; if (LK.ticks - self.lastShot > self.shootDelay && dist > 20) { var b = new Container(); var bulletAsset = b.attachAsset('collector_bullet', { anchorX: 0.5, anchorY: 0.5 }); b.x = self.x; b.y = self.y; // Asteroide doğru yönlendir var tdist = Math.sqrt(dx * dx + dy * dy); b.dirX = tdist > 0 ? dx / tdist : 0; b.dirY = tdist > 0 ? dy / tdist : -1; b.speed = 18 * 0.1; b.update = function () { b.x += b.dirX * b.speed; b.y += b.dirY * b.speed; // Asteroide çarptıysa yok et if (self.target && b.intersects(self.target)) { if (typeof self.target.hp === "number" && self.target.hp > 0) { self.target.hp -= 1; } b.destroy(); if (typeof bullets !== "undefined") { var idx = bullets.indexOf(b); if (idx !== -1) bullets.splice(idx, 1); } } // Ekran dışıysa yok et if (b.x < -100 || b.x > 2148 || b.y < -100 || b.y > 2832) { b.destroy(); if (typeof bullets !== "undefined") { var idx = bullets.indexOf(b); if (idx !== -1) bullets.splice(idx, 1); } } }; if (typeof bullets !== "undefined") bullets.push(b); if (typeof game !== "undefined") game.addChild(b); self.lastShot = LK.ticks; } if (dist < 10) { // Asteroide ulaştıysa, sadece idle'a geçsin self.state = 'returning'; } else { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } } else if (self.state === 'returning') { var dx = colony.x - self.x; var dy = colony.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 10) { self.state = 'idle'; self.target = null; } else { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } } }; return self; }); // Asteroid ve kaynak çıkışı için yeni AsteroidNode class'ı var AsteroidNode = Container.expand(function () { var self = Container.call(this); // Kaynak türleri ve asteroid asset id'leri var asteroidTypes = [{ name: "Altın", asset: "asteroid_gold", resourceAsset: "resource_gold" }, { name: "Kobalt", asset: "asteroid_cobalt", resourceAsset: "resource_cobalt" }, { name: "Nikel", asset: "asteroid_nickel", resourceAsset: "resource_nickel" }, { name: "Helyum-3", asset: "asteroid_helium3", resourceAsset: "resource_helium3" }, { name: "Platin", asset: "asteroid_platinum", resourceAsset: "resource_platinum" }, { name: "Demir", asset: "asteroid_iron", resourceAsset: "resource_iron" }, { name: "Manganez", asset: "asteroid_manganese", resourceAsset: "resource_manganese" }]; // Rastgele bir kaynak türü seç var typeIndex = Math.floor(Math.random() * asteroidTypes.length); self.resourceType = asteroidTypes[typeIndex].name; self.asteroidAsset = asteroidTypes[typeIndex].asset; self.resourceAsset = asteroidTypes[typeIndex].resourceAsset; // Asteroid görseli var ast = self.attachAsset(self.asteroidAsset, { anchorX: 0.5, anchorY: 0.5 }); self.hp = 3 + Math.floor(Math.random() * 3); // 3-5 arası can self.collected = false; self.resourceSpawned = false; // Hareket: Rastgele kenardan giriş var edge = Math.floor(Math.random() * 4); var startX, startY, endX, endY; var margin = 120; if (edge === 0) { startX = -margin; startY = 400 + Math.random() * (2732 - 800); endX = 2048 + margin; endY = startY + (Math.random() - 0.5) * 400; } else if (edge === 1) { startX = 2048 + margin; startY = 400 + Math.random() * (2732 - 800); endX = -margin; endY = startY + (Math.random() - 0.5) * 400; } else if (edge === 2) { startX = Math.random() * 2048; startY = -margin; endX = startX + (Math.random() - 0.5) * 400; endY = 2732 + margin; } else { startX = Math.random() * 2048; startY = 2732 + margin; endX = startX + (Math.random() - 0.5) * 400; endY = -margin; } self.x = startX; self.y = startY; self._moveStartX = startX; self._moveStartY = startY; self._moveEndX = endX; self._moveEndY = endY; self._moveProgress = 0; self._moveSpeed = (0.002 + Math.random() * 0.001) * 0.1; self.visible = true; self.resourceNode = null; // Kaynak nesnesi referansı self.update = function () { if (self.collected) return; // Hareket ilerlemesini güncelle self._moveProgress += self._moveSpeed; if (self._moveProgress > 1) { self.collected = true; self.visible = false; return; } // Lineer hareket self.x = self._moveStartX + (self._moveEndX - self._moveStartX) * self._moveProgress; self.y = self._moveStartY + (self._moveEndY - self._moveStartY) * self._moveProgress; // --- Asteroid boyutunu koloniye yaklaştıkça büyüt --- // Koloniye olan mesafeyi hesapla if (typeof colony !== "undefined" && colony && typeof colony.x === "number" && typeof colony.y === "number") { var dxCol = self.x - colony.x; var dyCol = self.y - colony.y; var distCol = Math.sqrt(dxCol * dxCol + dyCol * dyCol); // Maksimum mesafe: ekran köşesinden koloniye (en uzak ~2732) var maxDist = 2732; // Minimum scale: 0.25, Maksimum scale: 1.2 var minScale = 0.25; var maxScale = 1.2; // Koloniye yaklaştıkça scale artar, uzaktayken küçüktür var t = 1 - Math.min(distCol / maxDist, 1); var scale = minScale + (maxScale - minScale) * t; // Asteroit görselini ölçekle if (ast) { ast.scaleX = scale; ast.scaleY = scale; } } // Asteroid yok edildi ve kaynak çıkmadıysa kaynak çıkar if (self.hp <= 0 && !self.resourceSpawned) { self.resourceSpawned = true; // Kaynak node'u oluştur var resNode = new ResourceNode(self.resourceType, self.resourceAsset); resNode.x = self.x; resNode.y = self.y; if (typeof resourceNodes !== "undefined") resourceNodes.push(resNode); if (typeof game !== "undefined") game.addChild(resNode); self.collected = true; self.visible = false; } }; return self; }); // Mermi var Bullet = Container.expand(function () { var self = Container.call(this); var b = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 40 * 0.1; self.dirX = 0; self.dirY = -1; self.from = 'player'; // veya 'enemy' self.targetEnemy = null; // Eğer hedef varsa self.attackPower = 1; // Her merminin saldırı gücü 1 olsun self.update = function () { // Eğer bu oyuncu mermisi ve hedefi varsa, hedefe yönel if (self.from === 'player' && self.targetEnemy && typeof self.targetEnemy.x === "number" && typeof self.targetEnemy.y === "number") { var dx = self.targetEnemy.x - self.x; var dy = self.targetEnemy.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { self.dirX = dx / dist; self.dirY = dy / dist; } } self.x += self.dirX * self.speed; self.y += self.dirY * self.speed; }; return self; }); // Koloni ana üssü var Colony = Container.expand(function () { var self = Container.call(this); var c = self.attachAsset('colony', { anchorX: 0.5, anchorY: 0.5 }); // Koloni canı self.maxHp = 50; self.hp = 50; return self; }); // Düşman gemisi var Enemy = Container.expand(function () { var self = Container.call(this); var e = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); // Hız %100 yavaşlatıldı self.speed = (7 + Math.random() * 4) * 0.05; self.target = null; self.hp = 2; self.update = function () { if (self.target) { var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > self.speed) { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } } }; return self; }); // Kaynak noktası (sadece asteroid yok edilince çıkar) var ResourceNode = Container.expand(function (resourceType, resourceAsset) { var self = Container.call(this); // resourceType ve resourceAsset parametre olarak alınır self.resourceType = resourceType || "Altın"; self.resourceAsset = resourceAsset || "resource_gold"; var res = self.attachAsset(self.resourceAsset, { anchorX: 0.5, anchorY: 0.5 }); self.amount = 10 + Math.floor(Math.random() * 10); // 10-19 arası kaynak self.collected = false; self.visible = true; // Sabit durur, hareket etmez self.update = function () {}; return self; }); // Oyuncu gemisi var Ship = Container.expand(function () { var self = Container.call(this); var s = self.attachAsset('ship', { anchorX: 0.5, anchorY: 0.5 }); // Hız %100 yavaşlatıldı self.speed = 11 * 0.1; self.targetX = self.x; self.targetY = self.y; self.lastShot = 0; self.shootDelay = 30; // 0.5s self.update = function () { // Hareket var dx = self.targetX - self.x; var dy = self.targetY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > self.speed) { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } else { self.x = self.targetX; self.y = self.targetY; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0a0a1a }); /**** * Game Code ****/ // Sağ alt gemi paneli için özel arka plan görseli (daha belirgin, köşeleri yuvarlatılmış, koyu mavi) // 7 farklı asteroid görseli (her kaynak için bir tane) // Koloni, kaynak, gemi ve düşman için temel şekiller // Global değişkenler // Collector'ın sıktığı mermi için özel asset function _typeof3(o) { "@babel/helpers - typeof"; return _typeof3 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof3(o); } function _typeof2(o) { "@babel/helpers - typeof"; return _typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof2(o); } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var colony; var ship; var collectors = []; var resourceNodes = []; var enemies = []; var bullets = []; var resources = 0; var autoCollectors = 1; var spawnEnemyTimer = 0; var dragNode = null; var lastTouch = { x: 0, y: 0 }; // Koloni kur colony = new Colony(); colony.x = 2048 / 2; colony.y = 2732 - 400; game.addChild(colony); // Koloni can barı ve can göstergesi var colonyHpBarBg = LK.getAsset('collector', { width: 220, height: 28, color: 0x222222, anchorX: 0.5, anchorY: 0.5 }); colonyHpBarBg.y = colony.y - 160; colonyHpBarBg.x = colony.x; game.addChild(colonyHpBarBg); var colonyHpBar = LK.getAsset('collector', { width: 216, height: 20, color: 0x4adf4a, anchorX: 0.5, anchorY: 0.5 }); colonyHpBar.y = colony.y - 160; colonyHpBar.x = colony.x; game.addChild(colonyHpBar); // Sol alt köşeye hizalı GUI grubu oluştur var guiLeftBottomGroup = new Container(); LK.gui.bottomLeft.addChild(guiLeftBottomGroup); // Koloni can yazısı (sol alt) var colonyHpTxt = new Text2('50 / 50', { size: 36, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); colonyHpTxt.anchor.set(0, 1); // Sol alt köşe colonyHpTxt.x = 0; colonyHpTxt.y = 0; guiLeftBottomGroup.addChild(colonyHpTxt); // Kaynak göstergesi (sol alt) var resourceTxt = new Text2('Toplam Kaynak: 0', { size: 36, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); resourceTxt.anchor.set(0, 1); resourceTxt.x = 0; resourceTxt.y = colonyHpTxt.y - colonyHpTxt.height - 8; guiLeftBottomGroup.addChild(resourceTxt); // collectorTxt: Sadece yükseklik için dummy olarak tanımlanır (sol panelde gösterilmiyor) var collectorTxt = new Text2('Asteroit Avcısı: 1', { size: 36, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); collectorTxt.anchor.set(0, 1); collectorTxt.x = 0; collectorTxt.y = resourceTxt.y - resourceTxt.height - 8; // Gemi sayısı göstergesi -- KALDIRILDI var guiRightBottomGroup = new Container(); LK.gui.bottomRight.addChild(guiRightBottomGroup); // Koloni Sağlığı başlığı (sağ alt) var colonyHpLabelRight = new Text2('Koloni Sağlığı', { size: 28, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); colonyHpLabelRight.anchor.set(1, 1); colonyHpLabelRight.x = 0; colonyHpLabelRight.y = 0; guiRightBottomGroup.addChild(colonyHpLabelRight); // Koloni can yazısı (sağ alt) var colonyHpTxtRight = new Text2('50 / 50', { size: 36, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); colonyHpTxtRight.anchor.set(1, 1); // Sağ alt köşe colonyHpTxtRight.x = 0; colonyHpTxtRight.y = -colonyHpLabelRight.height - 8; guiRightBottomGroup.addChild(colonyHpTxtRight); // Otomasyon göstergesi (sağ alt) var collectorTxtRight = new Text2('Asteroit Avcısı: 1', { size: 36, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); collectorTxtRight.anchor.set(1, 1); collectorTxtRight.x = 0; collectorTxtRight.y = -colonyHpLabelRight.height - colonyHpTxtRight.height - 16; guiRightBottomGroup.addChild(collectorTxtRight); // Gemi sayısı göstergesi (sağ alt) var shipCountTxtRight = new Text2('Savaşçı: 1', { size: 36, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); shipCountTxtRight.anchor.set(1, 1); shipCountTxtRight.x = 0; shipCountTxtRight.y = -colonyHpLabelRight.height - colonyHpTxtRight.height - collectorTxtRight.height - 24; guiRightBottomGroup.addChild(shipCountTxtRight); // Gemi canı göstergesi (sağ alt) -- KALDIRILDI // --- Sağ alt panel: Gemi satın alma paneli (yeni) --- var shipBuyPanelGroup = new Container(); shipBuyPanelGroup.x = 0; shipBuyPanelGroup.y = -colonyHpLabelRight.height - colonyHpTxtRight.height - collectorTxtRight.height - shipCountTxtRight.height - 48 - 260; // 260px üstte, panel yüksekliği kadar yukarıda guiRightBottomGroup.addChild(shipBuyPanelGroup); // Panel arka planı (özel görsel, hafif şeffaf) var shipBuyPanelBg = LK.getAsset('ship_panel_bg', { anchorX: 1, anchorY: 1 }); shipBuyPanelBg.alpha = 0.92; shipBuyPanelBg.x = 0; shipBuyPanelBg.y = 0; shipBuyPanelGroup.addChild(shipBuyPanelBg); // Panel başlığı var shipBuyPanelTitle = new Text2('Savaşçı Satın Al', { size: 32, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); shipBuyPanelTitle.anchor.set(1, 1); shipBuyPanelTitle.x = -24; shipBuyPanelTitle.y = -24; shipBuyPanelGroup.addChild(shipBuyPanelTitle); // Satın alma butonu var shipBuyBtn = new Text2('Yeni Savaşçı (100 Kaynak)', { size: 28, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); shipBuyBtn.anchor.set(1, 1); shipBuyBtn.x = -32; shipBuyBtn.y = -80; shipBuyBtn.interactive = true; shipBuyBtn.buttonMode = true; shipBuyBtn.hitArea = { x: -shipBuyBtn.width - 20, y: -10, width: shipBuyBtn.width + 40, height: shipBuyBtn.height + 20 }; shipBuyPanelGroup.addChild(shipBuyBtn); // Asteroit Avcısı satın alma butonu var collectorBuyBtn = new Text2('Asteroit Avcısı (300 Kaynak)', { size: 28, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); collectorBuyBtn.anchor.set(1, 1); collectorBuyBtn.x = -32; collectorBuyBtn.y = -140; collectorBuyBtn.interactive = true; collectorBuyBtn.buttonMode = true; collectorBuyBtn.hitArea = { x: -collectorBuyBtn.width - 20, y: -10, width: collectorBuyBtn.width + 40, height: collectorBuyBtn.height + 20 }; shipBuyPanelGroup.addChild(collectorBuyBtn); // Gemi satın alma işlemi shipBuyBtn.down = function (x, y, obj) { // 100 kaynak ile yeni gemi ekle (şimdilik sadece 1 gemi destekleniyor, ileride çoklu gemi için güncellenebilir) if (resources >= 100 && (!ship.visible || ship.hp <= 0)) { resources -= 100; ship.hp = ship.maxHp || 6; ship.visible = true; ship.x = 2048 / 2; ship.y = 2732 - 700; LK.effects.flashObject(ship, 0x4adf4a, 800); } }; // Asteroit Avcısı satın alma işlemi collectorBuyBtn.down = function (x, y, obj) { // 300 kaynak ile yeni Asteroit Avcısı ekle (maksimum 3) if (resources >= 300 && autoCollectors < 3) { resources -= 300; autoCollectors++; createCollectors(autoCollectors); LK.effects.flashObject(collectors[collectors.length - 1], 0x4adf4a, 800); } }; // --- Sağ alt panel: Gemi öğeleri satın alma paneli --- var shipPanelGroup = new Container(); shipPanelGroup.x = 0; shipPanelGroup.y = -colonyHpLabelRight.height - colonyHpTxtRight.height - collectorTxtRight.height - shipCountTxtRight.height - 48; guiRightBottomGroup.addChild(shipPanelGroup); // Panel arka planı (özel görsel, hafif şeffaf) var shipPanelBg = LK.getAsset('ship_panel_bg', { anchorX: 1, anchorY: 1 }); shipPanelBg.alpha = 0.92; shipPanelBg.x = 0; shipPanelBg.y = 0; shipPanelGroup.addChild(shipPanelBg); // Panel başlığı var shipPanelTitle = new Text2('Savaşçı Yükseltmeleri', { size: 32, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); shipPanelTitle.anchor.set(1, 1); shipPanelTitle.x = -24; shipPanelTitle.y = -24; shipPanelGroup.addChild(shipPanelTitle); // Satın alınabilir öğeler: örnek olarak "Savaşçı Canı +1" ve "Savaşçı Yenile" var shipUpgradeBtn = new Text2('Can +1 (30 Kaynak)', { size: 28, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); shipUpgradeBtn.anchor.set(1, 1); shipUpgradeBtn.x = -32; shipUpgradeBtn.y = -80; shipUpgradeBtn.interactive = true; shipUpgradeBtn.buttonMode = true; shipUpgradeBtn.hitArea = { x: -shipUpgradeBtn.width - 20, y: -10, width: shipUpgradeBtn.width + 40, height: shipUpgradeBtn.height + 20 }; shipPanelGroup.addChild(shipUpgradeBtn); shipUpgradeBtn.down = function (x, y, obj) { // 30 kaynak ile savaşçı canı artır if (resources >= 30 && typeof ship.hp === "number" && typeof ship.maxHp === "number" && ship.visible) { resources -= 30; ship.maxHp += 1; ship.hp = ship.maxHp; LK.effects.flashObject(ship, 0x4adf4a, 600); } }; var shipRespawnBtn = new Text2('Savaşçı Yenile (60 Kaynak)', { size: 28, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); shipRespawnBtn.anchor.set(1, 1); shipRespawnBtn.x = -32; shipRespawnBtn.y = -140; shipRespawnBtn.interactive = true; shipRespawnBtn.buttonMode = true; shipRespawnBtn.hitArea = { x: -shipRespawnBtn.width - 20, y: -10, width: shipRespawnBtn.width + 40, height: shipRespawnBtn.height + 20 }; shipPanelGroup.addChild(shipRespawnBtn); shipRespawnBtn.down = function (x, y, obj) { // 60 kaynak ile gemi tekrar aktif edilir if (resources >= 60 && (!ship.visible || ship.hp <= 0)) { resources -= 60; ship.hp = ship.maxHp || 6; ship.visible = true; ship.x = 2048 / 2; ship.y = 2732 - 700; LK.effects.flashObject(ship, 0x4adf4a, 800); } }; // Paneli sağ alt köşede, diğer yazıların üstünde tutmak için z-index ayarı if (typeof shipPanelGroup.setChildIndex === "function") { shipPanelGroup.setChildIndex(shipPanelBg, 0); } // Sağ üst köşeye "Oyunu Sıfırla" butonu ekle var resetBtn = new Text2('Oyunu Sıfırla', { size: 44, fill: "#fff", font: "bold", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); resetBtn.anchor.set(1, 0); // sağ üst köşe resetBtn.x = 0; resetBtn.y = 0; resetBtn.interactive = true; resetBtn.buttonMode = true; resetBtn.hitArea = { x: -20, y: -10, width: resetBtn.width + 40, height: resetBtn.height + 20 }; resetBtn.down = function (x, y, obj) { // Oyun ilerlemesini sıfırla if (typeof storage !== "undefined" && storage.clear) { storage.clear(); } LK.showGameOver(); // Oyun sıfırlama için game over popup tetikle }; LK.gui.topRight.addChild(resetBtn); // Kaynak türleri ve isimleri var resourceTypeList = [{ name: "Altın", asset: "resource_gold" }, { name: "Kobalt", asset: "resource_cobalt" }, { name: "Nikel", asset: "resource_nickel" }, { name: "Helyum-3", asset: "resource_helium3" }, { name: "Platin", asset: "resource_platinum" }, { name: "Demir", asset: "resource_iron" }, { name: "Manganez", asset: "resource_manganese" }]; // Her kaynak için stok tut var resourceStocks = {}; for (var i = 0; i < resourceTypeList.length; i++) { resourceStocks[resourceTypeList[i].name] = 0; } // Oyun başında storage'dan yükleme yapılmaz, her zaman sıfırdan başlar // Her kaynak için ayrı Text2 oluştur, alt alta hizala var resourceStockTxts = []; var lastY = collectorTxt.y - collectorTxt.height - 16; for (var i = 0; i < resourceTypeList.length; i++) { // Kaynak rengi: asset id'sinden shape tanımını bul var assetId = resourceTypeList[i].asset; var assetColor = 0xffffff; // Asset tanımlarını yukarıda sabit olarak bildiğimiz için, elle eşleştiriyoruz if (assetId === "resource_gold") assetColor = 0x5b6733;else if (assetId === "resource_cobalt") assetColor = 0x52459a;else if (assetId === "resource_nickel") assetColor = 0x825648;else if (assetId === "resource_helium3") assetColor = 0xf59af1;else if (assetId === "resource_platinum") assetColor = 0x63dbd1;else if (assetId === "resource_iron") assetColor = 0xe5bf1c;else if (assetId === "resource_manganese") assetColor = 0xbc3379; var txt = new Text2(resourceTypeList[i].name + ": 0", { size: 36, fill: assetColor, dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); txt.anchor.set(0, 1); txt.x = 0; txt.y = lastY; guiLeftBottomGroup.addChild(txt); resourceStockTxts.push(txt); lastY = txt.y - txt.height; // Satır arası boşluğu kaldırıldı } // Gemi sayısı göstergesi (sol alt) -- KALDIRILDI, sadece yükseklik için dummy olarak tanımlanır var shipCountTxt = new Text2('Savaşçı: 1', { size: 36, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); shipCountTxt.anchor.set(0, 1); shipCountTxt.x = 0; shipCountTxt.y = -colonyHpTxt.height - resourceTxt.height - collectorTxt.height - 24; // Eğer başka yazı veya butonlar eklenirse, aynı şekilde guiLeftBottomGroup'a eklenmeli ve // y koordinatları bir önceki elemanın yüksekliği ve aradaki boşluk ile ayarlanmalı. // Tüm yazılar ve butonlar bu grupta, sol alt köşeye hizalı ve font boyutu 36 olacak şekilde ayarlanmıştır. // Gemi kur ship = new Ship(); ship.x = 2048 / 2; ship.y = 2732 - 700; ship.hp = 6; ship.maxHp = 6; game.addChild(ship); // Gemi can barı: geminin üstünde gösterilecek var shipHpBarBg = LK.getAsset('collector', { width: 90, height: 16, color: 0x222222, anchorX: 0.5, anchorY: 0.5 }); var shipHpBar = LK.getAsset('collector', { width: 86, height: 8, color: 0xE64A3A, anchorX: 0.5, anchorY: 0.5 }); shipHpBarBg.y = ship.y - 50; shipHpBarBg.x = ship.x; shipHpBar.y = ship.y - 50; shipHpBar.x = ship.x; game.addChild(shipHpBarBg); game.addChild(shipHpBar); // Asteroit Avcısı'nın aktif olacağı oran (ör: 0.5 = alt %50'lik kısımda avlanır, ileride artırılabilir) var hunterActiveRatio = 0.5; // Asteroit Avcılarını oluştur function createCollectors(n) { for (var i = collectors.length; i < n; i++) { var c = new AsteroidHunter(); c.x = colony.x + 100 * (i - n / 2); c.y = colony.y + 100; collectors.push(c); game.addChild(c); } } createCollectors(autoCollectors); // Asteroidleri oluştur (kaynaklar asteroid yok edilince çıkacak) // Artık asteroidler haritaya yavaşça girip rastgele ilerleyecek, sayıları 2-6 arası olacak var asteroidNodes = []; function spawnAsteroids() { // Haritada 2-6 asteroid olacak şekilde ayarla var minAsteroids = 2; var maxAsteroids = 6; // Mevcut asteroid sayısını kontrol et var currentAsteroids = 0; for (var i = 0; i < asteroidNodes.length; i++) { if (!asteroidNodes[i].collected) currentAsteroids++; } var toSpawn = Math.max(minAsteroids - currentAsteroids, 0); toSpawn = Math.min(maxAsteroids - currentAsteroids, toSpawn + Math.floor(Math.random() * (maxAsteroids - minAsteroids + 1))); for (var i = 0; i < toSpawn; i++) { var a = new AsteroidNode(); asteroidNodes.push(a); game.addChild(a); } } // Başlangıçta asteroidleri oluştur spawnAsteroids(); // Düşman üret function spawnEnemy() { var e = new Enemy(); var side = Math.random(); if (side < 0.5) { e.x = Math.random() * 2048; e.y = -100; } else { e.x = Math.random() < 0.5 ? -100 : 2048 + 100; e.y = 400 + Math.random() * 1200; } e.target = colony; enemies.push(e); game.addChild(e); } // Gemiye dokunma ve sürükleme game.down = function (x, y, obj) { // Gemiye dokunulduysa sürükle var local = game.toLocal({ x: x, y: y }); var dx = local.x - ship.x; var dy = local.y - ship.y; if (dx * dx + dy * dy < 120 * 120) { dragNode = ship; lastTouch.x = local.x; lastTouch.y = local.y; } else { // Hedefe git ship.targetX = local.x; ship.targetY = local.y; } }; game.move = function (x, y, obj) { if (dragNode === ship) { var local = game.toLocal({ x: x, y: y }); ship.targetX = local.x; ship.targetY = local.y; lastTouch.x = local.x; lastTouch.y = local.y; } }; game.up = function (x, y, obj) { dragNode = null; }; // Kaynak toplama otomasyonu function assignCollectors() { for (var i = 0; i < collectors.length; i++) { var c = collectors[i]; // Eğer collector bir asteroidi takip ediyorsa ve asteroid haritadan çıkmadıysa veya yok olmadıysa veya kaynak almadıysa, takip etmeye devam etsin if (c.state === 'moving' && c.target && typeof c.target.hp === "number" && // AsteroidNode ise !c.target.collected && c.target.visible && (!c.target.resourceSpawned || _typeof3(c.target.resourceNode) === "object" && c.target.resourceNode && !c.target.resourceNode.collected)) { // Asteroid yok edilmedi ve kaynak alınmadı, takip etmeye devam et continue; } // Sadece idle durumundakiler için yeni hedef ata if (c.state === 'idle') { // --- Tüm haritadaki asteroidlere saldır, öncelik koloniye en yakın olan --- // Asteroit Avcısı haritanın üst yarısına müdahale etmesin (oran ile) var hunterActiveY = 2732 * hunterActiveRatio; var minDistAst = 99999; var targetAst = null; for (var j = 0; j < asteroidNodes.length; j++) { var a = asteroidNodes[j]; if (!a.collected && a.visible && typeof a.x === "number" && typeof a.y === "number") { // Asteroit Avcısı sadece hunterActiveY'den aşağıdaki asteroidlere saldırır if (a.y < hunterActiveY) continue; // Koloniye olan mesafeyi hesapla var dxCol = a.x - colony.x; var dyCol = a.y - colony.y; var distCol = Math.sqrt(dxCol * dxCol + dyCol * dyCol); // Her durumda, en yakın asteroidi bul var dx = a.x - c.x; var dy = a.y - c.y; var dist = dx * dx + dy * dy; // Öncelik: koloniye en yakın asteroid if (distCol < minDistAst) { minDistAst = distCol; targetAst = a; } } } if (targetAst) { c.target = targetAst; c.state = 'moving'; continue; } // Asteroit Avcıları kaynak toplamaz, sadece asteroit yok ederler } } } // Gemi ateş etme function shipShoot() { if (LK.ticks - ship.lastShot > ship.shootDelay) { var b = new Bullet(); b.x = ship.x; b.y = ship.y - 60; // En yakın düşmanı bul var nearestEnemy = null; var minDist = 999999; for (var i = 0; i < enemies.length; i++) { var dx = enemies[i].x - ship.x; var dy = enemies[i].y - ship.y; var dist = dx * dx + dy * dy; if (dist < minDist) { minDist = dist; nearestEnemy = enemies[i]; } } if (nearestEnemy) { // Merminin hedefini kaydet b.targetEnemy = nearestEnemy; var tx = nearestEnemy.x - ship.x; var ty = nearestEnemy.y - ship.y; var tdist = Math.sqrt(tx * tx + ty * ty); if (tdist > 0) { b.dirX = tx / tdist; b.dirY = ty / tdist; } else { b.dirX = 0; b.dirY = -1; } } else { b.dirX = 0; b.dirY = -1; } b.from = 'player'; bullets.push(b); game.addChild(b); ship.lastShot = LK.ticks; } } // Düşman ateş etme function enemyShoot(enemy) { var b = new Bullet(); b.x = enemy.x; b.y = enemy.y + 60; b.dirX = (colony.x - enemy.x) / Math.max(1, Math.sqrt((colony.x - enemy.x) * (colony.x - enemy.x) + (colony.y - enemy.y) * (colony.y - enemy.y))); b.dirY = (colony.y - enemy.y) / Math.max(1, Math.sqrt((colony.x - enemy.x) * (colony.x - enemy.x) + (colony.y - enemy.y) * (colony.y - enemy.y))); b.from = 'enemy'; bullets.push(b); game.addChild(b); } // Oyun güncelleme döngüsü game.update = function () { // Kaynak göstergesini güncelle var totalResourceStock = 0; for (var i = 0; i < resourceTypeList.length; i++) { totalResourceStock += resourceStocks[resourceTypeList[i].name]; } resourceTxt.setText('Toplam Kaynak: ' + totalResourceStock); collectorTxt.setText('Asteroit Avcısı: ' + autoCollectors); // Her kaynak türünden stokta olan miktarı göster for (var i = 0; i < resourceTypeList.length; i++) { var typeName = resourceTypeList[i].name; // resourceStocks[typeName] zaten Collector tarafından güncelleniyor, burada tekrar sıfırlama veya toplama yapma! // Sadece GUI güncellemesi için değerler kullanılacak. } // Her kaynak için GUI yazısını güncelle for (var i = 0; i < resourceTypeList.length; i++) { var typeName = resourceTypeList[i].name; resourceStockTxts[i].setText(typeName + ": " + resourceStocks[typeName]); } // Gemi sayısı güncelle (şu an 1, ileride dinamik yapılabilir) shipCountTxt.setText('Savaşçı: 1'); shipCountTxtRight.setText('Savaşçı: 1'); // Gemi canı güncelle -- KALDIRILDI // --- Sağ alt panel butonlarının aktif/pasif durumunu güncelle --- // Gemi satın alma paneli butonu if (typeof shipBuyBtn !== "undefined") { if (resources >= 100 && (!ship.visible || ship.hp <= 0)) { shipBuyBtn.alpha = 1; } else { shipBuyBtn.alpha = 0.5; } } // Asteroit Avcısı satın alma butonu if (typeof collectorBuyBtn !== "undefined") { if (resources >= 300 && autoCollectors < 3) { collectorBuyBtn.alpha = 1; } else { collectorBuyBtn.alpha = 0.5; } } if (typeof shipUpgradeBtn !== "undefined") { if (resources >= 30 && typeof ship.hp === "number" && typeof ship.maxHp === "number" && ship.visible) { shipUpgradeBtn.alpha = 1; } else { shipUpgradeBtn.alpha = 0.5; } } if (typeof shipRespawnBtn !== "undefined") { if (resources >= 60 && (!ship.visible || ship.hp <= 0)) { shipRespawnBtn.alpha = 1; } else { shipRespawnBtn.alpha = 0.5; } } // Koloni can barı ve can yazısı güncelle if (colony.hp < 0) colony.hp = 0; if (colony.hp > colony.maxHp) colony.hp = colony.maxHp; colonyHpBar.width = 216 * (colony.hp / colony.maxHp); colonyHpBar.x = colony.x; colonyHpBar.y = colony.y - 160; colonyHpBarBg.x = colony.x; colonyHpBarBg.y = colony.y - 160; colonyHpTxt.setText(Math.round(colony.hp) + ' / ' + colony.maxHp); colonyHpTxt.x = colony.x; colonyHpTxt.y = colony.y - 160; colonyHpTxtRight.setText(Math.round(colony.hp) + ' / ' + colony.maxHp); // Sağ alt collector güncelle collectorTxtRight.setText('Asteroit Avcısı: ' + autoCollectors); // Asteroidleri güncelle ve haritada minimum 2, maksimum 6 asteroid olmasını sağla for (var i = asteroidNodes.length - 1; i >= 0; i--) { var a = asteroidNodes[i]; if (typeof a.update === "function") a.update(); // Haritadan çıkan veya yok edilen asteroidleri temizle if (a.collected || !a.visible) { a.destroy(); asteroidNodes.splice(i, 1); } } // Asteroid sayısı azaldıysa yeni asteroid ekle spawnAsteroids(); // Kaynakları güncelle (hareket ettir) for (var i = 0; i < resourceNodes.length; i++) { if (typeof resourceNodes[i].update === "function") resourceNodes[i].update(); } // Toplayıcıları görevlendir assignCollectors(); // Collector güncelle for (var i = 0; i < collectors.length; i++) { collectors[i].update(); } // Gemi güncelle ship.update(); // Gemi can barı pozisyon ve genişlik güncelle if (typeof shipHpBar !== "undefined" && typeof shipHpBarBg !== "undefined") { shipHpBarBg.x = ship.x; shipHpBarBg.y = ship.y - 50; shipHpBar.x = ship.x; shipHpBar.y = ship.y - 50; var ratio = typeof ship.hp === "number" && typeof ship.maxHp === "number" && ship.maxHp > 0 ? ship.hp / ship.maxHp : 1; if (ratio < 0) ratio = 0; if (ratio > 1) ratio = 1; shipHpBar.width = 86 * ratio; shipHpBar.visible = ship.visible; shipHpBarBg.visible = ship.visible; } // Gemi düşman haritaya girince onu takip etsin, koloniye çok uzaklaşmasın if (!ship.randomMoveTimer) ship.randomMoveTimer = 0; ship.randomMoveTimer++; if (ship.randomMoveTimer > 60) { // Her 1 saniyede bir yeni hedef belirle var nearestEnemy = null; var minDist = 999999; for (var i = 0; i < enemies.length; i++) { var dx = enemies[i].x - ship.x; var dy = enemies[i].y - ship.y; var dist = dx * dx + dy * dy; if (dist < minDist) { minDist = dist; nearestEnemy = enemies[i]; } } if (nearestEnemy) { // Koloniye çok uzaklaşmasın: ship ile colony arası mesafe 700'den fazla olmasın var dxCol = nearestEnemy.x - colony.x; var dyCol = nearestEnemy.y - colony.y; var distCol = Math.sqrt(dxCol * dxCol + dyCol * dyCol); // Ship ile colony arası mesafe var dxShipCol = ship.x - colony.x; var dyShipCol = ship.y - colony.y; var distShipCol = Math.sqrt(dxShipCol * dxShipCol + dyShipCol * dyShipCol); // Ship, düşmana yaklaşacak ama colony'den 700'den fazla uzaklaşmayacak if (distShipCol > 700) { // Koloniye 700'den fazla uzaksa, koloniye yaklaş ship.targetX = colony.x + (nearestEnemy.x - colony.x) * 700 / distCol; ship.targetY = colony.y + (nearestEnemy.y - colony.y) * 700 / distCol; } else { // Düşmana yaklaş ship.targetX = nearestEnemy.x; ship.targetY = nearestEnemy.y; } ship.isAttacking = true; } else { // Rastgele bir hedef seç, ama koloniye 700'den fazla uzaklaşmasın var angle = Math.random() * Math.PI * 2; var dist = 300 + Math.random() * 350; ship.targetX = colony.x + Math.cos(angle) * dist; ship.targetY = colony.y + Math.sin(angle) * dist; ship.isAttacking = false; } ship.randomMoveTimer = 0; } // --- Saldırı: Yakında düşman varsa ateş et --- // Sadece 350px mesafede ateş etsin, yoksa ateş etmesin var attackEnemy = null; for (var i = 0; i < enemies.length; i++) { var dx = enemies[i].x - ship.x; var dy = enemies[i].y - ship.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 350) { // Sadece 350px mesafede ateş etsin attackEnemy = enemies[i]; break; } } if (attackEnemy) { // Düşmana doğru ateş et if (LK.ticks - ship.lastShot > ship.shootDelay) { var b = new Bullet(); b.x = ship.x; b.y = ship.y - 60; var tx = attackEnemy.x - ship.x; var ty = attackEnemy.y - ship.y; var tdist = Math.sqrt(tx * tx + ty * ty); if (tdist > 0) { b.dirX = tx / tdist; b.dirY = ty / tdist; } else { b.dirX = 0; b.dirY = -1; } b.from = 'player'; bullets.push(b); game.addChild(b); ship.lastShot = LK.ticks; } } // Düşman yoksa ateş etme // Düşman spawn kontrol değişkenleri if (typeof nextEnemySpawnTick === "undefined") { nextEnemySpawnTick = LK.ticks + 3600; // 1 dakika = 60*60 = 3600 tick enemiesToSpawn = 1; } if (LK.ticks >= nextEnemySpawnTick) { for (var i = 0; i < enemiesToSpawn; i++) { spawnEnemy(); } nextEnemySpawnTick = LK.ticks + 3600; // 1 dakika sonra tekrar // enemiesToSpawn artırımı öldürmede yapılacak } // Düşman güncelle for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; e.update(); // Düşman koloniye ulaştı mı? if (e.intersects(colony)) { // Sadece koloniye ulaştığında can azalt, bitişi hp <= 0'da kontrol et if (typeof colony.hp !== "number") colony.hp = colony.maxHp || 50; colony.hp -= 1; LK.effects.flashObject(colony, 0xff0000, 400); if (colony.hp <= 0) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } // Düşmanı yok et e.destroy(); enemies.splice(i, 1); continue; } // Düşman sadece koloniye yaklaşınca ateş etsin var dxCol = colony.x - e.x; var dyCol = colony.y - e.y; var distCol = Math.sqrt(dxCol * dxCol + dyCol * dyCol); if (distCol < 400) { // Sadece 400px mesafede ateş etsin // Her düşmanın kendi ateş gecikmesi olsun if (!e.lastShot) e.lastShot = 0; if (!e.shootDelay) e.shootDelay = 60 + Math.floor(Math.random() * 40); // 1-1.6 sn arası if (LK.ticks - e.lastShot > e.shootDelay) { enemyShoot(e); e.lastShot = LK.ticks; } } } // Mermileri güncelle for (var i = bullets.length - 1; i >= 0; i--) { var b = bullets[i]; b.update(); // Ekran dışıysa sil if (b.x < -100 || b.x > 2148 || b.y < -100 || b.y > 2832) { b.destroy(); bullets.splice(i, 1); continue; } // Çarpışmalar if (b.from === 'player') { // Düşmanlara çarpma for (var j = enemies.length - 1; j >= 0; j--) { var e = enemies[j]; if (b.intersects(e)) { // Her mermi sadece 1 can götürsün if (typeof e.hp !== "number") e.hp = 10; e.hp -= typeof b.attackPower === "number" ? b.attackPower : 1; // Her mermi attackPower kadar can götürür if (e.hp <= 0) { e.destroy(); enemies.splice(j, 1); // Kaynak ödülü resources += 5; // Düşman öldürülünce spawn timer'ı 1 dakika sonraya ayarla ve spawn sayısını artır if (typeof nextEnemySpawnTick === "undefined") nextEnemySpawnTick = LK.ticks + 3600;else nextEnemySpawnTick = LK.ticks + 3600; if (typeof enemiesToSpawn === "undefined") enemiesToSpawn = 2;else enemiesToSpawn += 1; } b.destroy(); bullets.splice(i, 1); break; } } } else if (b.from === 'enemy') { // Koloniye çarpma if (b.intersects(colony)) { // Her mermi sadece 1 can götürsün if (typeof colony.hp !== "number") colony.hp = colony.maxHp || 50; colony.hp -= typeof b.attackPower === "number" ? b.attackPower : 1; // Her mermi attackPower kadar can götürür LK.effects.flashObject(colony, 0xff0000, 400); b.destroy(); bullets.splice(i, 1); // Oyun bitişi sadece canı sıfır olunca tetiklensin if (colony.hp <= 0) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } continue; } // Gemiye çarpma if (b.intersects(ship)) { LK.effects.flashObject(ship, 0xff0000, 500); b.destroy(); bullets.splice(i, 1); // Her mermi sadece 1 can götürsün if (typeof ship.hp !== "number") ship.hp = ship.maxHp || 6; ship.hp -= typeof b.attackPower === "number" ? b.attackPower : 1; // Her mermi attackPower kadar can götürür if (ship.hp <= 0) { ship.hp = 0; LK.effects.flashObject(ship, 0xff0000, 800); ship.visible = false; ship.x = -9999; // Ekrandan çıkar ship.y = -9999; // Gemi öldü, oyun devam etsin. Gemi tekrar eklenmesi için ileride upgrade vb. eklenebilir. // İstenirse burada bir GUI mesajı gösterilebilir. // return; // Oyun bitmesin! } } } } // Otomasyon yükseltme: 50 kaynak ile yeni toplayıcı if (resources >= 50 && autoCollectors < 3) { resources -= 50; autoCollectors++; createCollectors(autoCollectors); } // Kazanma koşulu: 200 kaynak if (resources >= 200) { LK.showYouWin(); return; } };
===================================================================
--- original.js
+++ change.js
@@ -501,9 +501,9 @@
collectorTxtRight.x = 0;
collectorTxtRight.y = -colonyHpLabelRight.height - colonyHpTxtRight.height - 16;
guiRightBottomGroup.addChild(collectorTxtRight);
// Gemi sayısı göstergesi (sağ alt)
-var shipCountTxtRight = new Text2('Gemi: 1', {
+var shipCountTxtRight = new Text2('Savaşçı: 1', {
size: 36,
fill: "#fff",
dropShadow: true,
dropShadowColor: 0x000000,
@@ -531,9 +531,9 @@
shipBuyPanelBg.x = 0;
shipBuyPanelBg.y = 0;
shipBuyPanelGroup.addChild(shipBuyPanelBg);
// Panel başlığı
-var shipBuyPanelTitle = new Text2('Gemi Satın Al', {
+var shipBuyPanelTitle = new Text2('Savaşçı Satın Al', {
size: 32,
fill: "#fff",
dropShadow: true,
dropShadowColor: 0x000000,
@@ -546,9 +546,9 @@
shipBuyPanelTitle.x = -24;
shipBuyPanelTitle.y = -24;
shipBuyPanelGroup.addChild(shipBuyPanelTitle);
// Satın alma butonu
-var shipBuyBtn = new Text2('Yeni Gemi (100 Kaynak)', {
+var shipBuyBtn = new Text2('Yeni Savaşçı (100 Kaynak)', {
size: 28,
fill: "#fff",
dropShadow: true,
dropShadowColor: 0x000000,
@@ -628,9 +628,9 @@
shipPanelBg.x = 0;
shipPanelBg.y = 0;
shipPanelGroup.addChild(shipPanelBg);
// Panel başlığı
-var shipPanelTitle = new Text2('Gemi Yükseltmeleri', {
+var shipPanelTitle = new Text2('Savaşçı Yükseltmeleri', {
size: 32,
fill: "#fff",
dropShadow: true,
dropShadowColor: 0x000000,
@@ -642,9 +642,9 @@
shipPanelTitle.anchor.set(1, 1);
shipPanelTitle.x = -24;
shipPanelTitle.y = -24;
shipPanelGroup.addChild(shipPanelTitle);
-// Satın alınabilir öğeler: örnek olarak "Gemi Canı +1" ve "Gemi Yenile"
+// Satın alınabilir öğeler: örnek olarak "Savaşçı Canı +1" ve "Savaşçı Yenile"
var shipUpgradeBtn = new Text2('Can +1 (30 Kaynak)', {
size: 28,
fill: "#fff",
dropShadow: true,
@@ -666,17 +666,17 @@
height: shipUpgradeBtn.height + 20
};
shipPanelGroup.addChild(shipUpgradeBtn);
shipUpgradeBtn.down = function (x, y, obj) {
- // 30 kaynak ile gemi canı artır
+ // 30 kaynak ile savaşçı canı artır
if (resources >= 30 && typeof ship.hp === "number" && typeof ship.maxHp === "number" && ship.visible) {
resources -= 30;
ship.maxHp += 1;
ship.hp = ship.maxHp;
LK.effects.flashObject(ship, 0x4adf4a, 600);
}
};
-var shipRespawnBtn = new Text2('Gemi Yenile (60 Kaynak)', {
+var shipRespawnBtn = new Text2('Savaşçı Yenile (60 Kaynak)', {
size: 28,
fill: "#fff",
dropShadow: true,
dropShadowColor: 0x000000,
@@ -798,9 +798,9 @@
resourceStockTxts.push(txt);
lastY = txt.y - txt.height; // Satır arası boşluğu kaldırıldı
}
// Gemi sayısı göstergesi (sol alt) -- KALDIRILDI, sadece yükseklik için dummy olarak tanımlanır
-var shipCountTxt = new Text2('Gemi: 1', {
+var shipCountTxt = new Text2('Savaşçı: 1', {
size: 36,
fill: "#fff",
dropShadow: true,
dropShadowColor: 0x000000,
@@ -1046,10 +1046,10 @@
var typeName = resourceTypeList[i].name;
resourceStockTxts[i].setText(typeName + ": " + resourceStocks[typeName]);
}
// Gemi sayısı güncelle (şu an 1, ileride dinamik yapılabilir)
- shipCountTxt.setText('Gemi: 1');
- shipCountTxtRight.setText('Gemi: 1');
+ shipCountTxt.setText('Savaşçı: 1');
+ shipCountTxtRight.setText('Savaşçı: 1');
// Gemi canı güncelle -- KALDIRILDI
// --- Sağ alt panel butonlarının aktif/pasif durumunu güncelle ---
// Gemi satın alma paneli butonu
if (typeof shipBuyBtn !== "undefined") {
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Galactic Colony Command" and with the description "Kendi uzay kolonini kur, kaynakları topla, otomasyon sistemleri geliştir ve diğer kolonilerle stratejik savaşlara girerek galaksinin hakimi ol!". No text on banner!
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Uzay İstasyonu" and with the description "Kendi uzay kolonini kur, kaynakları topla, otomasyon sistemleri geliştir ve diğer kolonilerle stratejik savaşlara girerek galaksinin hakimi ol!". No text on banner!, Uzay istasyonu
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Gezegen" and with the description "Kendi uzay kolonini kur, kaynakları topla, otomasyon sistemleri geliştir ve diğer kolonilerle stratejik savaşlara girerek galaksinin hakimi ol!". No text on banner!, Uzay istasyonu, Gezegen
Astreroit cobalt. In-Game asset. 2d. High contrast. No shadows
asteroid gold. In-Game asset. 2d. High contrast. No shadows
asteroid helium. In-Game asset. 2d. High contrast. No shadows
Asteroid Iron - Yazısız. In-Game asset. 2d. High contrast. No shadows
asteroid manganese - yazısız. In-Game asset. 2d. High contrast. No shadows
Asteroid Nikel - Yazısız. In-Game asset. 2d. High contrast. No shadows
Cobalt cevheri. In-Game asset. 2d. High contrast. No shadows
Platinum Cevheri - Yazısız. In-Game asset. 2d. High contrast. No shadows
Ateş - Patlama. In-Game asset. 2d. High contrast. No shadows
Ateş. In-Game asset. 2d. High contrast. No shadows
Maden toplayıcı uzay mekiği, Gerçekçi. In-Game asset. High contrast. No shadows
Uzay savaş gemisi - Gerçekçi - Yazısız. In-Game asset. High contrast. No shadows
Altın Cevheri - Yazısız. In-Game asset. 2d. High contrast. No shadows
Helium cevheri - yazısız. In-Game asset. 2d. High contrast. No shadows
Iron cevheri - yazısız. In-Game asset. 2d. High contrast. No shadows
Manganese cevheri - yazısız. In-Game asset. 2d. High contrast. No shadows
HP BAR - yazısız. In-Game asset. 2d. High contrast. No shadows
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Galactic Colony Command" and with the description "Kendi uzay kolonini kur, kaynakları topla, otomasyon sistemleri geliştir ve diğer kolonilerle stratejik savaşlara girerek galaksinin hakimi ol!". No text on banner!
uzay savaş gemisi. In-Game asset. 2d. High contrast. No shadows
uzay savaş gemisi - gerçekçi - yazısız. In-Game asset. High contrast. No shadows
uzay savaş gemisi - gerçekçi - yazısız. In-Game asset. High contrast. No shadows
Uzay Savunma Kulesi - Yazısız - Gerçekçi. In-Game asset. High contrast. No shadows
Uzay Savunma Kulesi - Yazısız - Gerçekçi. In-Game asset. High contrast. No shadows
Uzay Savunma Kulesi - Yazısız - Gerçekçi. In-Game asset. High contrast. No shadows
Uzay Savunma Kulesi - Yazısız - Gerçekçi. In-Game asset. High contrast. No shadows
Uzay savaş istasyonu - Gerçekçi. In-Game asset. High contrast. No shadows
Uzay savaş istasyonu - Gerçekçi. In-Game asset. High contrast. No shadows
Uzay savaş istasyonu - Gerçekçi. In-Game asset. High contrast. No shadows
Hoparlör. In-Game asset. 2d. High contrast. No shadows