User prompt
Gemi üzerinde kalan can miktarı sayı olarak görünsün
User prompt
Her düşman başka bir düşman resmi ile gelsin.
User prompt
10 farklı düşman resim dosyası oluştur
User prompt
şirket panelinin arkaplan resim dosyası oluştur
User prompt
şirket panelinin yeni resim dosyasını oluştur
User prompt
şirket panelinin resim dosyasını oluştur
User prompt
Şirket istek panelinin şuan ki resminin özel resim dosyasını ''sirket'' ismiyle yeni oluştur
User prompt
Şirket istek panelinin şuan ki resminin özel resim dosyasını oluştur
User prompt
Şirket istek panelinin şuan ki resminin özel dosyasını oluştur
User prompt
assest içinde panel resmi yok. Onu yeni oluştur.
User prompt
Panelin şuan ki mevcut resminin özel resim dosyasını oluştur
User prompt
Yüzde kaç oran fazla ise orada belirtilsin.
User prompt
Ödül sistemi istenin maden sayısının toplamının %2 ila %10 fazlalık aralığında olsun.
User prompt
Ödül sistemi istenin maden sayısının toplamının %2 ila %10 aralığında olsun.
User prompt
Panelin şuan ki resminin yeni dosyasını oluştur
User prompt
Panelin resim dosyasını oluştur
User prompt
Şirket maden isteği yazısını isteklerin yukarısına taşı.
User prompt
Panel içindeki yazı ve butonları isteklerin üst tarafına gelecek şekilde hizala.
User prompt
İstekler alt alta sıralı olsun.
User prompt
Yazıların yerlerine göre Yeniden paneli konumlandır.
User prompt
Panel içerisinde ki isteklerin yazıları alt alta sıralansın
User prompt
Şirket panelinin içeriğini ve konumunu Seviye yükseltme paneli ile aynı yap ve şirket paneli yukarısına yeniden konumlandır
User prompt
Şirket paneli içindeki yazı ve butonları, panel sayfası resmine oranla yeniden konumlandır.
User prompt
Paneli İçerisindeki yazıları ve butonu 4 satır yukarı taşı ve alt alta hizala.
User prompt
İçerisindeki yazıları ve butonu 2 satır yukarı taşı ve alt alta hizala.
/**** * 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 * 1.25 * 1.25; // Başlangıçta %25 daha hızlı (toplamda %56.25 hızlı) 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; } // Asteroit görselinin dışından saldırı: asteroidin görsel yarıçapı + avcı yarıçapı kadar mesafede dur var asteroidRadius = 0; if (self.target && self.target.children && self.target.children.length > 0 && self.target.children[0].width) { asteroidRadius = (self.target.children[0].width * self.target.children[0].scaleX || 1) * 0.5; } else { asteroidRadius = 60; // fallback } var hunterRadius = col && col.width ? col.width * (col.scaleX || 1) * 0.5 : 50; var stopDistance = asteroidRadius + hunterRadius + 8; // 8px tampon if (dist < stopDistance) { // Asteroide yeterince yaklaştı, daha fazla yaklaşma, state'i 'returning' yap self.state = 'returning'; } else { // Asteroide yaklaş, ama içine girme 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; }); // 60 saniye * 60 FPS // Düşman gemisi class'ı (önce base etrafında yavaşça döner, sonra saldırır) var EnemyShip = Container.expand(function () { var self = Container.call(this); // 10 farklı düşman görseli var enemyImages = ['enemy1', 'enemy2', 'enemy3', 'enemy4', 'enemy5', 'enemy6', 'enemy7', 'enemy8', 'enemy9', 'enemy10']; // Rastgele bir düşman görseli seç var enemyImageIndex = Math.floor(Math.random() * enemyImages.length); self.enemyImageId = enemyImages[enemyImageIndex]; var s = self.attachAsset(self.enemyImageId, { anchorX: 0.5, anchorY: 0.5 }); self.x = topAsteroid.x; self.y = topAsteroid.y + 80; // Askerler gibi yavaş hız: ResourceHunter ile aynı hız self.speed = 1.1 * (0.002 + 0.001) * 0.1 * 2732; // 0.0003*0.1*2732 ≈ 0.08*2732 ≈ 218 self.lastShot = 0; self.shootDelay = 60; // 1 saniyede bir ateş etsin self.hp = 3; self.state = 'orbiting'; // 'orbiting' -> 'attacking' self.orbitTime = 0; self.orbitDuration = 180; // 3 saniye boyunca base etrafında dönecek self.orbitRadius = 180 + Math.random() * 60; // 180-240px arası self.orbitAngle = Math.random() * Math.PI * 2; self.update = function () { // Düşman sağlık barı oluşturulmamışsa ekle if (!self.hpBarBg) { self.hpBarBg = LK.getAsset('ship_hpbar_bg', { anchorX: 0.5, anchorY: 0.5 }); self.hpBar = LK.getAsset('ship_hpbar_fg', { anchorX: 0.5, anchorY: 0.5 }); self.hpBarBg.x = self.x; self.hpBarBg.y = self.y - 50; self.hpBar.x = self.x; self.hpBar.y = self.y - 50; if (typeof game !== "undefined") { game.addChild(self.hpBarBg); game.addChild(self.hpBar); } } // Sağlık barı pozisyon ve genişlik güncelle if (self.hpBar && self.hpBarBg) { self.hpBarBg.x = self.x; self.hpBarBg.y = self.y - 50; self.hpBar.x = self.x; self.hpBar.y = self.y - 50; var ratio = typeof self.hp === "number" && self.hp > 0 ? self.hp / 3 : 0; if (ratio < 0) ratio = 0; if (ratio > 1) ratio = 1; self.hpBar.width = 86 * ratio; self.hpBar.visible = self.visible; self.hpBarBg.visible = self.visible; } // Takip mesafesi ve çakışmayı önleme var followDistance = 80; // px, minimum mesafe if (typeof enemyShips !== "undefined" && enemyShips.length > 1) { for (var i = 0; i < enemyShips.length; i++) { var e = enemyShips[i]; if (e === self || !e.visible || typeof e.x !== "number" || typeof e.y !== "number") continue; var dxE = e.x - self.x; var dyE = e.y - self.y; var distE = Math.sqrt(dxE * dxE + dyE * dyE); if (distE < followDistance && distE > 0) { // Düşman gemileri birbirine çok yakınsa, uzaklaş self.x -= (followDistance - distE) * dxE / distE * 0.5; self.y -= (followDistance - distE) * dyE / distE * 0.5; } } } if (self.state === 'orbiting') { // Base etrafında yavaşça daire çiz self.orbitTime++; self.orbitAngle += 0.012; // Yavaşça döner self.x = topAsteroid.x + Math.cos(self.orbitAngle) * self.orbitRadius; self.y = topAsteroid.y + Math.sin(self.orbitAngle) * self.orbitRadius; if (self.orbitTime > self.orbitDuration) { self.state = 'approaching'; // Saldırıya başlarken hedefi koloniye kilitle self.attackTargetX = colony.x; self.attackTargetY = colony.y; } } else if (self.state === 'approaching') { // Koloniye yaklaşana kadar ilerle, ama saldırma var dx = self.attackTargetX - self.x; var dy = self.attackTargetY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); // Koloniye belli bir mesafeye (ör: 350px) kadar yaklaşınca önce bizim askerlerle savaş var engageRadius = 350; if (dist > engageRadius) { if (dist > 0) { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } } else { // Koloniye yaklaştı, önce bizim askerlerle savaş self.state = 'engaging'; } } else if (self.state === 'engaging') { // Sadece bizim gemilere saldır, koloniye saldırmaz // En yakın oyuncu savaşçısını bul var nearestShip = null; var minDist = 999999; if (ship && ship.visible && typeof ship.x === "number" && typeof ship.y === "number" && ship.hp > 0) { var dxs = ship.x - self.x; var dys = ship.y - self.y; var dists = Math.sqrt(dxs * dxs + dys * dys); if (dists < minDist) { minDist = dists; nearestShip = ship; } } // Eğer yakınsa ona yaklaş ve ateş et if (nearestShip && minDist < 400) { // Yaklaş if (minDist > 40) { self.x += self.speed * (nearestShip.x - self.x) / minDist; self.y += self.speed * (nearestShip.y - self.y) / minDist; } // Ateş etme (her 1 saniyede bir) if (LK.ticks - self.lastShot > self.shootDelay) { var b = new Bullet(); b.x = self.x; b.y = self.y + 40; b.dirX = nearestShip.x - self.x; b.dirY = nearestShip.y - self.y; var bdist = Math.sqrt(b.dirX * b.dirX + b.dirY * b.dirY); if (bdist > 0) { b.dirX /= bdist; b.dirY /= bdist; } else { b.dirX = 0; b.dirY = 1; } b.from = 'enemy'; b.attackPower = 2; bullets.push(b); game.addChild(b); self.lastShot = LK.ticks; } // Eğer oyuncu gemisi yok olduysa, tekrar koloniye saldırmaya başla if (nearestShip.hp <= 0 || !nearestShip.visible) { self.state = 'attacking'; } } else { // Oyuncu gemisi yoksa veya çok uzaktaysa, tekrar koloniye saldır self.state = 'attacking'; } } else if (self.state === 'attacking') { // Koloniye doğru düz hareket var dx = self.attackTargetX - self.x; var dy = self.attackTargetY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } // Ateş etme (her 1 saniyede bir) if (LK.ticks - self.lastShot > self.shootDelay) { var b = new Bullet(); b.x = self.x; b.y = self.y + 40; b.dirX = colony.x - self.x; b.dirY = colony.y - self.y; var bdist = Math.sqrt(b.dirX * b.dirX + b.dirY * b.dirY); if (bdist > 0) { b.dirX /= bdist; b.dirY /= bdist; } else { b.dirX = 0; b.dirY = 1; } b.from = 'enemy'; b.attackPower = 2; bullets.push(b); game.addChild(b); self.lastShot = LK.ticks; } // Koloniye çok yaklaştıysa yok ol if (dist < 40) { self.hp = 0; } } }; return self; }); // Koloni can barı ve can göstergesi // Kaynak Avcısı (ResourceHunter) - sadece haritadaki kaynakları toplar var ResourceHunter = Container.expand(function () { var self = Container.call(this); var hunter = self.attachAsset('resource_hunter', { // Artık kendine özel görsel anchorX: 0.5, anchorY: 0.5 }); self.target = null; self.speed = 1.1 * (0.002 + 0.001) * 0.1 * 2732; // Kaynaklara uygun hız self.state = 'idle'; // idle, moving, returning self.carryType = null; self.carryAmount = 0; self.update = function () { // Eğer kaynak taşıyorsa koloniye dön if (self.state === 'returning' && self.carryType && self.carryAmount > 0) { var dx = colony.x - self.x; var dy = colony.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 20) { // Kaynağı koloniye bırak if (typeof resourceStocks[self.carryType] === "number") { resourceStocks[self.carryType] += self.carryAmount; } self.carryType = null; self.carryAmount = 0; self.state = 'idle'; self.target = null; } else { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } return; } // Eğer hedef kaynak varsa ona git if (self.state === 'moving' && self.target && !self.target.collected && self.target.visible) { var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 20) { // Kaynağı topla self.carryType = self.target.resourceType; self.carryAmount = self.target.amount; self.target.collected = true; self.target.visible = false; self.state = 'returning'; } else { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } return; } // Idle ise yeni hedef ara if (self.state === 'idle') { // En yakın toplanmamış kaynağı bul var minDist = 99999; var targetRes = null; for (var i = 0; i < resourceNodes.length; i++) { var r = resourceNodes[i]; if (!r.collected && r.visible) { var dx = r.x - self.x; var dy = r.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; targetRes = r; } } } if (targetRes) { self.target = targetRes; self.state = 'moving'; } } }; 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 = 2 + Math.floor(Math.random() * 9); // 2-10 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 () { // Takip mesafesi ve çakışmayı önleme var followDistance = 80; // px, minimum mesafe // Eğer bir düşman varsa ve ona yaklaşıyorsak, mesafeyi koru if (typeof enemyShips !== "undefined" && enemyShips.length > 0) { for (var i = 0; i < enemyShips.length; i++) { var e = enemyShips[i]; if (!e.visible || typeof e.x !== "number" || typeof e.y !== "number") continue; var dxE = e.x - self.x; var dyE = e.y - self.y; var distE = Math.sqrt(dxE * dxE + dyE * dyE); if (distE < followDistance && distE > 0) { // Gemi ile düşman arasındaki mesafe çok yakınsa, geri çekil self.x -= (followDistance - distE) * dxE / distE * 0.5; self.y -= (followDistance - distE) * dyE / distE * 0.5; } } } // 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) { // Hedefe yaklaşırken, diğer gemilerle çakışmayı önle 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 ****/ // Yeni panel resmi asset'i (örnek: 350x250 boyutunda, yeni bir id ile) // 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" }]; // --- Şirket Maden İstek Paneli (Seviye yükseltme paneli ile aynı içerik ve konumda, üstte) --- var companyPanelGroup = new Container(); var companyPanelYOffset = 32; var companyPanelHeight = 288; // Seviye paneli ile aynı yükseklik // Panel arka planı (özel şirket paneli arkaplan resmi ile) var companyPanelBg = LK.getAsset('company_panel_bgimg', { anchorX: 0, anchorY: 1 }); companyPanelBg.alpha = 0.92; companyPanelBg.x = 0; companyPanelBg.y = 0; companyPanelGroup.addChild(companyPanelBg); // Panel başlığı (Seviye paneli ile aynı stil) var companyPanelTitle = new Text2('Şirket Maden İsteği', { size: 32, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); companyPanelTitle.anchor.set(0, 1); companyPanelTitle.x = 24; companyPanelTitle.y = -24; companyPanelGroup.addChild(companyPanelTitle); // Açıklama (Seviye paneli ile aynı stil, şirket paneline uygun açıklama) var companyDescTxt = new Text2('Şirketin istediği madenleri teslim et, ödül kazan!', { size: 22, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); companyDescTxt.anchor.set(0, 1); companyDescTxt.x = 32; companyDescTxt.y = -64; companyPanelGroup.addChild(companyDescTxt); // İsteği teslim et butonu (Seviye paneli ile aynı stil) var companyDeliverBtn = new Text2('Teslim Et', { size: 28, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); companyDeliverBtn.anchor.set(0, 1); companyDeliverBtn.x = 32; companyDeliverBtn.y = -112; companyDeliverBtn.interactive = true; companyDeliverBtn.buttonMode = true; companyDeliverBtn.hitArea = { x: -20, y: -10, width: companyDeliverBtn.width + 40, height: companyDeliverBtn.height + 20 }; companyPanelGroup.addChild(companyDeliverBtn); // Şirket isteği verisi var companyRequest = null; var companyRequestTxt = new Text2('', { size: 28, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); companyRequestTxt.anchor.set(0, 1); companyRequestTxt.x = 32; companyRequestTxt.y = -160; companyPanelGroup.addChild(companyRequestTxt); // Şirket isteği oluşturucu function generateCompanyRequest() { // 2-7 farklı maden çeşidi seç var typeCount = 2 + Math.floor(Math.random() * 6); // 2-7 var shuffled = []; for (var i = 0; i < resourceTypeList.length; i++) shuffled.push(resourceTypeList[i].name); // Fisher-Yates shuffle for (var i = shuffled.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var tmp = shuffled[i]; shuffled[i] = shuffled[j]; shuffled[j] = tmp; } var selectedTypes = shuffled.slice(0, typeCount); // Her biri için 20-200 arası miktar var reqs = []; for (var i = 0; i < selectedTypes.length; i++) { reqs.push({ type: selectedTypes[i], amount: 20 + Math.floor(Math.random() * 181) // 20-200 }); } // Ödül: toplam istenen miktarın %2-%10 fazlası aralığında olacak şekilde ayarla var totalRequested = 0; for (var i = 0; i < reqs.length; i++) totalRequested += reqs[i].amount; // %2-%10 fazlalık aralığı var minReward = Math.ceil(totalRequested * 1.02); var maxReward = Math.ceil(totalRequested * 1.10); var rewardAmount = minReward + Math.floor(Math.random() * (maxReward - minReward + 1)); var rewardType = resourceTypeList[Math.floor(Math.random() * resourceTypeList.length)].name; return { requests: reqs, rewardType: rewardType, rewardAmount: rewardAmount }; } // Şirket isteğini güncelle ve göster function updateCompanyRequestPanel() { if (!companyRequest) companyRequest = generateCompanyRequest(); // Panel metni var txt = ''; for (var i = 0; i < companyRequest.requests.length; i++) { var req = companyRequest.requests[i]; txt += req.type + ': ' + req.amount + '\n'; } // Yüzde kaç fazla olduğunu hesapla var totalRequested = 0; for (var i = 0; i < companyRequest.requests.length; i++) { totalRequested += companyRequest.requests[i].amount; } var rewardPercent = 0; if (totalRequested > 0) { rewardPercent = Math.round((companyRequest.rewardAmount / totalRequested - 1) * 100); } txt += 'Ödül: ' + companyRequest.rewardAmount + ' ' + companyRequest.rewardType; if (rewardPercent > 0) { txt += ' (+' + rewardPercent + '%)'; } companyRequestTxt.setText(txt); } updateCompanyRequestPanel(); // Teslim et butonu fonksiyonu companyDeliverBtn.down = function (x, y, obj) { if (!companyRequest) return; // Yeterli kaynak var mı kontrol et var canDeliver = true; for (var i = 0; i < companyRequest.requests.length; i++) { var req = companyRequest.requests[i]; if (resourceStocks[req.type] < req.amount) { canDeliver = false; break; } } if (!canDeliver) { LK.effects.flashObject(companyPanelBg, 0xff0000, 600); return; } // Kaynakları düş for (var i = 0; i < companyRequest.requests.length; i++) { var req = companyRequest.requests[i]; resourceStocks[req.type] -= req.amount; } // Ödülü ekle resourceStocks[companyRequest.rewardType] += companyRequest.rewardAmount; LK.effects.flashObject(companyPanelBg, 0x4adf4a, 800); // Yeni istek oluştur companyRequest = generateCompanyRequest(); updateCompanyRequestPanel(); }; // --- Sol alt: Seviye Yükseltme Paneli --- // 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 // Colony HP bar custom images // Ship HP bar custom images 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 resourceHunters = []; var autoResourceHunters = 1; var resourceNodes = []; 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); // Haritanın üst tarafında sabit bir asteroid resmi oluştur var topAsteroidBase = LK.getAsset('enemy_base', { anchorX: 0.5, anchorY: 0.5 }); topAsteroidBase.x = 2048 / 2; topAsteroidBase.y = 120; // Ekranın üst kısmında, ortalanmış game.addChild(topAsteroidBase); // Eski asteroid görseli istenirse, aşağıdaki satırı kullanabilirsiniz: // var topAsteroid = LK.getAsset('asteroid_iron', { anchorX: 0.5, anchorY: 0.5 }); // topAsteroid.x = 2048 / 2; // topAsteroid.y = 120; // game.addChild(topAsteroid); // Oyun kodunda topAsteroid olarak kullanılan referansları topAsteroidBase olarak güncelleyin: var topAsteroid = topAsteroidBase; // Düşman gemisi için array ve timer var enemyShips = []; var enemySpawnTimer = 0; var ENEMY_SPAWN_INTERVAL = 60 * 60; // Düşman dalga sayacı ve gönderilecek gemi sayısı var enemyWaveCount = 0; var enemyShipsPerWave = 1; // Koloni can barı ve can göstergesi var colonyHpBarBg = LK.getAsset('colony_hpbar_bg', { anchorX: 0.5, anchorY: 0.5 }); colonyHpBarBg.y = colony.y - 160; colonyHpBarBg.x = colony.x; game.addChild(colonyHpBarBg); var colonyHpBar = LK.getAsset('colony_hpbar_fg', { 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_buy_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şçı (200 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ı (100 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); // --- Satın alma fiyatları ve artış oranı --- // Kaynak Avcısı ve Asteroid Avcısı: 100 kaynak, Savaşçı: 200 kaynak, her satın alımda %50 artış var shipBuyPrice = 200; var collectorBuyPrice = 100; var resourceHunterBuyPrice = 100; var shipBuyPriceIncrease = 1.5; var collectorBuyPriceIncrease = 1.5; var resourceHunterBuyPriceIncrease = 1.5; // Gemi satın alma işlemi shipBuyBtn.down = function (x, y, obj) { // Toplam kaynak stoğu ile kontrol (artık resourceStocks kullanılacak) var totalResourceStock = 0; for (var i = 0; i < resourceTypeList.length; i++) { totalResourceStock += resourceStocks[resourceTypeList[i].name]; } if (totalResourceStock >= shipBuyPrice && (!ship.visible || ship.hp <= 0)) { // Kaynakları harca (her kaynaktan orantılı olarak düş) var remaining = shipBuyPrice; for (var i = 0; i < resourceTypeList.length; i++) { var typeName = resourceTypeList[i].name; var take = Math.min(resourceStocks[typeName], remaining); resourceStocks[typeName] -= take; remaining -= take; if (remaining <= 0) break; } ship.hp = ship.maxHp || 6; ship.visible = true; ship.x = 2048 / 2; ship.y = 2732 - 700; LK.effects.flashObject(ship, 0x4adf4a, 800); shipBuyPrice = Math.ceil(shipBuyPrice * shipBuyPriceIncrease); shipBuyBtn.setText('Yeni Savaşçı (' + shipBuyPrice + ' Kaynak)'); // Yeni savaşçı gemisi oluştur ve diziye ekle var newShip = new Ship(); newShip.x = 2048 / 2 + (Math.random() * 200 - 100); newShip.y = 2732 - 700 + (Math.random() * 100 - 50); newShip.hp = ship.maxHp || 6; newShip.maxHp = ship.maxHp || 6; newShip.visible = true; newShip.isExtra = true; // AI kontrollü olduğunu belirtmek için game.addChild(newShip); extraShips.push(newShip); } }; // Asteroit Avcısı satın alma işlemi collectorBuyBtn.down = function (x, y, obj) { // Toplam kaynak stoğu ile kontrol var totalResourceStock = 0; for (var i = 0; i < resourceTypeList.length; i++) { totalResourceStock += resourceStocks[resourceTypeList[i].name]; } if (totalResourceStock >= collectorBuyPrice) { // Kaynakları harca (her kaynaktan orantılı olarak düş) var remaining = collectorBuyPrice; for (var i = 0; i < resourceTypeList.length; i++) { var typeName = resourceTypeList[i].name; var take = Math.min(resourceStocks[typeName], remaining); resourceStocks[typeName] -= take; remaining -= take; if (remaining <= 0) break; } autoCollectors++; createCollectors(autoCollectors); LK.effects.flashObject(collectors[collectors.length - 1], 0x4adf4a, 800); collectorBuyPrice = Math.ceil(collectorBuyPrice * collectorBuyPriceIncrease); collectorBuyBtn.setText('Asteroit Avcısı (' + collectorBuyPrice + ' Kaynak)'); } }; // Kaynak Avcısı satın alma butonu var resourceHunterBuyBtn = new Text2('Kaynak Avcısı (100 Kaynak)', { size: 28, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); resourceHunterBuyBtn.anchor.set(1, 1); resourceHunterBuyBtn.x = -32; resourceHunterBuyBtn.y = -200; resourceHunterBuyBtn.interactive = true; resourceHunterBuyBtn.buttonMode = true; resourceHunterBuyBtn.hitArea = { x: -resourceHunterBuyBtn.width - 20, y: -10, width: resourceHunterBuyBtn.width + 40, height: resourceHunterBuyBtn.height + 20 }; shipBuyPanelGroup.addChild(resourceHunterBuyBtn); // Kaynak Avcısı satın alma işlemi resourceHunterBuyBtn.down = function (x, y, obj) { // Toplam kaynak stoğu ile kontrol var totalResourceStock = 0; for (var i = 0; i < resourceTypeList.length; i++) { totalResourceStock += resourceStocks[resourceTypeList[i].name]; } if (totalResourceStock >= resourceHunterBuyPrice) { // Kaynakları harca (her kaynaktan orantılı olarak düş) var remaining = resourceHunterBuyPrice; for (var i = 0; i < resourceTypeList.length; i++) { var typeName = resourceTypeList[i].name; var take = Math.min(resourceStocks[typeName], remaining); resourceStocks[typeName] -= take; remaining -= take; if (remaining <= 0) break; } autoResourceHunters++; createResourceHunters(autoResourceHunters); LK.effects.flashObject(resourceHunters[resourceHunters.length - 1], 0x4adf4a, 800); resourceHunterBuyPrice = Math.ceil(resourceHunterBuyPrice * resourceHunterBuyPriceIncrease); resourceHunterBuyBtn.setText('Kaynak Avcısı (' + resourceHunterBuyPrice + ' Kaynak)'); } }; // --- 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); // --- Sol alt: Seviye Yükseltme Paneli --- // Paneli sol alt kaynak panelinin üstünden iki satır daha yukarı taşı var upgradePanelGroup = new Container(); // Sol alt panelin yüksekliğini hesapla (kaynak yazılarının en üstünden iki satır daha yukarı hizalanacak) var upgradePanelYOffset = 32; // Kaynak paneli ile aradaki boşluk var upgradePanelRowHeight = 0; if (typeof resourceStockTxts !== "undefined" && resourceStockTxts.length > 0) { // resourceStockTxts[resourceStockTxts.length-1] en üstteki (yukarıdan aşağıya ekleniyor) var topResourceTxt = resourceStockTxts[resourceStockTxts.length - 1]; upgradePanelRowHeight = topResourceTxt.height; } var upgradePanelTopY = 0; if (typeof resourceStockTxts !== "undefined" && resourceStockTxts.length > 0) { // İki satır daha yukarı taşı: iki kaynak satırı yüksekliği kadar yukarı var topResourceTxt = resourceStockTxts[resourceStockTxts.length - 1]; upgradePanelTopY = topResourceTxt.y - 2 * topResourceTxt.height - upgradePanelYOffset - upgradePanelRowHeight; } else { upgradePanelTopY = -400 - 36 - 36; // fallback, iki satır daha yukarı } upgradePanelGroup.x = 0; upgradePanelGroup.y = upgradePanelTopY; guiLeftBottomGroup.addChild(upgradePanelGroup); // Şirket panelini upgradePanelGroup'un hemen üstüne ve aynı konumda hizala (seviye paneli ile aynı genişlik ve hizalama) companyPanelGroup.x = upgradePanelGroup.x; companyPanelGroup.y = upgradePanelGroup.y - companyPanelHeight - companyPanelYOffset; guiLeftBottomGroup.addChild(companyPanelGroup); // Panelin yeni görünümünün özel resim dosyasını oluştur (örnek: panelin ekran görüntüsünü kaydet) if (typeof LK.screenshot === "function") { LK.screenshot(companyPanelGroup, "sirket.png", { replace: true }); } // Panel arka planı var upgradePanelBg = LK.getAsset('upgrade_panel_bg', { anchorX: 0, // sol hizalı anchorY: 1 // üst hizalı }); upgradePanelBg.alpha = 0.92; upgradePanelBg.x = 0; upgradePanelBg.y = 0; upgradePanelGroup.addChild(upgradePanelBg); // Panel başlığı var upgradePanelTitle = new Text2('Seviye Yükseltme', { size: 32, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); upgradePanelTitle.anchor.set(0, 1); upgradePanelTitle.x = 24; upgradePanelTitle.y = -24; upgradePanelGroup.addChild(upgradePanelTitle); // Seviye göstergesi var upgradeLevel = 0; var upgradeLevelTxt = new Text2('Seviye: 0', { size: 28, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); upgradeLevelTxt.anchor.set(0, 1); upgradeLevelTxt.x = 32; upgradeLevelTxt.y = -80; upgradePanelGroup.addChild(upgradeLevelTxt); // Yükseltme butonu var upgradeBasePrice = 100; var upgradePrice = upgradeBasePrice; var upgradeBtn = new Text2('Yükselt (' + upgradePrice + ' Kaynak)', { size: 28, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); upgradeBtn.anchor.set(0, 1); upgradeBtn.x = 32; upgradeBtn.y = -140; upgradeBtn.interactive = true; upgradeBtn.buttonMode = true; upgradeBtn.hitArea = { x: -20, y: -10, width: upgradeBtn.width + 40, height: upgradeBtn.height + 20 }; upgradePanelGroup.addChild(upgradeBtn); // Açıklama var upgradeDescTxt = new Text2('Her seviye:\n- Mermi hızı %20 artar\n- Gemi hızı %10 artar\n- Maden kaynağı %10 artar', { size: 22, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); upgradeDescTxt.anchor.set(0, 1); upgradeDescTxt.x = 32; upgradeDescTxt.y = -200; upgradePanelGroup.addChild(upgradeDescTxt); // Yükseltme butonu fonksiyonu upgradeBtn.down = function (x, y, obj) { // Toplam kaynak ile kontrol var totalResourceStock = 0; for (var i = 0; i < resourceTypeList.length; i++) { totalResourceStock += resourceStocks[resourceTypeList[i].name]; } if (totalResourceStock >= upgradePrice) { // Kaynakları harca (her kaynaktan orantılı olarak düş) var remaining = upgradePrice; for (var i = 0; i < resourceTypeList.length; i++) { var typeName = resourceTypeList[i].name; var take = Math.min(resourceStocks[typeName], remaining); resourceStocks[typeName] -= take; remaining -= take; if (remaining <= 0) break; } upgradeLevel++; upgradeLevelTxt.setText('Seviye: ' + upgradeLevel); // Fiyatı %25 artır upgradePrice = Math.ceil(upgradeBasePrice * Math.pow(1.25, upgradeLevel)); upgradeBtn.setText('Yükselt (' + upgradePrice + ' Kaynak)'); LK.effects.flashObject(upgradePanelBg, 0x4adf4a, 600); } }; // 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 toplam kaynak ile savaşçı canı artır var totalResourceStock = 0; for (var i = 0; i < resourceTypeList.length; i++) { totalResourceStock += resourceStocks[resourceTypeList[i].name]; } if (totalResourceStock >= 30 && typeof ship.maxHp === "number" && ship.visible && ship.hp > 0) { // Kaynakları harca (her kaynaktan orantılı olarak düş) var remaining = 30; for (var i = 0; i < resourceTypeList.length; i++) { var typeName = resourceTypeList[i].name; var take = Math.min(resourceStocks[typeName], remaining); resourceStocks[typeName] -= take; remaining -= take; if (remaining <= 0) break; } 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 // Toplam kaynak stoğu ile kontrol var totalResourceStock = 0; for (var i = 0; i < resourceTypeList.length; i++) { totalResourceStock += resourceStocks[resourceTypeList[i].name]; } if (totalResourceStock >= 60 && (!ship.visible || ship.hp <= 0)) { // Kaynakları harca (her kaynaktan orantılı olarak düş) var remaining = 60; for (var i = 0; i < resourceTypeList.length; i++) { var typeName = resourceTypeList[i].name; var take = Math.min(resourceStocks[typeName], remaining); resourceStocks[typeName] -= take; remaining -= take; if (remaining <= 0) break; } if (typeof ship.maxHp !== "number" || ship.maxHp < 1) ship.maxHp = 6; ship.hp = ship.maxHp; 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); // Ek savaşçı gemiler için dizi var extraShips = []; // Gemi can barı: geminin üstünde gösterilecek (özel resim ile) var shipHpBarBg = LK.getAsset('ship_hpbar_bg', { anchorX: 0.5, anchorY: 0.5 }); var shipHpBar = LK.getAsset('ship_hpbar_fg', { 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); // Gemi üzerinde kalan can miktarı sayı olarak gösterilsin var shipHpTxt = new Text2('', { size: 32, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); shipHpTxt.anchor.set(0.5, 1); shipHpTxt.x = ship.x; shipHpTxt.y = ship.y - 70; game.addChild(shipHpTxt); // 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; // Alt %50'lik kısımda aktif // 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); // Kaynak Avcılarını oluştur function createResourceHunters(n) { for (var i = resourceHunters.length; i < n; i++) { var h = new ResourceHunter(); h.x = colony.x + 100 * (i - n / 2); h.y = colony.y + 200; resourceHunters.push(h); game.addChild(h); // Yeni kaynaklar için baseAmount ayarla for (var j = 0; j < resourceNodes.length; j++) { if (typeof resourceNodes[j].baseAmount === "undefined") { resourceNodes[j].baseAmount = resourceNodes[j].amount; } } } } createResourceHunters(autoResourceHunters); // 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); // Yeni kaynaklar için baseAmount ayarla for (var j = 0; j < resourceNodes.length; j++) { if (typeof resourceNodes[j].baseAmount === "undefined") { resourceNodes[j].baseAmount = resourceNodes[j].amount; } } } } // Başlangıçta asteroidleri oluştur spawnAsteroids(); // 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" && !c.target.collected && c.target.visible && // Asteroid Avcısı sadece ilgili alan (hunterActiveY) içindeki asteroidi yok edene kadar peşini bırakmasın c.target.y >= 2732 * hunterActiveRatio && (!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 veya returning durumundakiler için yeni hedef ata if (c.state === 'idle' || c.state === 'returning' || !c.target || c.target && (c.target.collected || !c.target.visible)) { // --- 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; } // Eğer hedef yoksa, haritada rastgele bir noktaya doğru dolaşmaya başlasın if (!c.target || c.state === 'idle') { // Rastgele bir hedef belirle (harita içinde) var randX = 200 + Math.random() * (2048 - 400); var randY = 400 + Math.random() * (2732 - 800); // Sahte bir hedef objesi oluştur (sadece pozisyon için) c.target = { x: randX, y: randY, hp: 9999, collected: false, visible: true }; 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; } } // 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]; } resources = totalResourceStock; // resources birimini Toplam Kaynak ile eşdeğer yap 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 (gemi yoksa 0, varsa 1) var activeShipCount = ship && ship.visible && ship.hp > 0 ? 1 : 0; for (var i = 0; i < extraShips.length; i++) { if (extraShips[i].visible && extraShips[i].hp > 0) activeShipCount++; } shipCountTxt.setText('Savaşçı: ' + activeShipCount); shipCountTxtRight.setText('Savaşçı: ' + activeShipCount); // 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") { var totalResourceStock = 0; for (var i = 0; i < resourceTypeList.length; i++) { totalResourceStock += resourceStocks[resourceTypeList[i].name]; } if (totalResourceStock >= shipBuyPrice && (!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 >= collectorBuyPrice) { collectorBuyBtn.alpha = 1; } else { collectorBuyBtn.alpha = 0.5; } } // Kaynak Avcısı satın alma butonu aktiflik if (typeof resourceHunterBuyBtn !== "undefined") { if (resources >= resourceHunterBuyPrice) { resourceHunterBuyBtn.alpha = 1; } else { resourceHunterBuyBtn.alpha = 0.5; } } if (typeof shipUpgradeBtn !== "undefined") { var totalResourceStock = 0; for (var i = 0; i < resourceTypeList.length; i++) { totalResourceStock += resourceStocks[resourceTypeList[i].name]; } if (totalResourceStock >= 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; } } // Seviye yükseltme butonu aktiflik if (typeof upgradeBtn !== "undefined") { var totalResourceStock = 0; for (var i = 0; i < resourceTypeList.length; i++) { totalResourceStock += resourceStocks[resourceTypeList[i].name]; } if (totalResourceStock >= upgradePrice) { upgradeBtn.alpha = 1; } else { upgradeBtn.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); // Sağ alt Kaynak Avcısı güncelle if (typeof resourceHunterBuyBtn !== "undefined") { if (!game.resourceHunterTxtRight) { var txt = new Text2('Kaynak Avcısı: ' + autoResourceHunters, { size: 36, fill: "#fff", dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 2, dropShadowAngle: Math.PI / 4, dropShadowBlur: 4, dropShadowAlpha: 0.7 }); txt.anchor.set(1, 1); txt.x = 0; txt.y = -colonyHpLabelRight.height - colonyHpTxtRight.height - collectorTxtRight.height - shipCountTxtRight.height - 24; guiRightBottomGroup.addChild(txt); game.resourceHunterTxtRight = txt; } game.resourceHunterTxtRight.setText('Kaynak Avcısı: ' + autoResourceHunters); } // 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 ve AI ile otomatik görev yapmalarını sağla for (var i = 0; i < collectors.length; i++) { var c = collectors[i]; // Eğer collector yok olduysa veya görünmüyorsa, atla if (!c.visible) continue; // --- AI: En yakın uygun asteroide saldır --- if ((c.state === 'idle' || c.state === 'returning' || !c.target || c.target && (c.target.collected || !c.target.visible)) && asteroidNodes.length > 0) { // Asteroit Avcısı haritanın alt yarısında çalışır 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") { if (a.y < hunterActiveY) continue; var dxCol = a.x - colony.x; var dyCol = a.y - colony.y; var distCol = Math.sqrt(dxCol * dxCol + dyCol * dyCol); if (distCol < minDistAst) { minDistAst = distCol; targetAst = a; } } } if (targetAst) { c.target = targetAst; c.state = 'moving'; } else { // Hedef yoksa rastgele bir noktaya git var randX = 200 + Math.random() * (2048 - 400); var randY = 400 + Math.random() * (2732 - 800); c.target = { x: randX, y: randY, hp: 9999, collected: false, visible: true }; c.state = 'moving'; } } c.update(); } // Kaynak Avcısı güncelle ve AI ile otomatik görev yapmalarını sağla for (var i = 0; i < resourceHunters.length; i++) { var h = resourceHunters[i]; if (!h.visible) continue; // Eğer kaynak taşıyorsa koloniye dön if (h.state === 'returning' && h.carryType && h.carryAmount > 0) { // update fonksiyonu zaten taşıma işlemini yapıyor h.update(); continue; } // Eğer hedef kaynak yoksa veya hedefi toplandıysa yeni hedef ata if ((h.state === 'idle' || !h.target || h.target && (h.target.collected || !h.target.visible)) && resourceNodes.length > 0) { var minDist = 99999; var targetRes = null; for (var j = 0; j < resourceNodes.length; j++) { var r = resourceNodes[j]; if (!r.collected && r.visible) { var dx = r.x - h.x; var dy = r.y - h.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; targetRes = r; } } } if (targetRes) { h.target = targetRes; h.state = 'moving'; } } h.update(); } // --- Seviye yükseltme bonuslarını uygula --- if (typeof upgradeLevel !== "undefined" && upgradeLevel > 0) { // Gemi hızı ship.speed = 11 * 0.1 * Math.pow(1.1, upgradeLevel); // Asteroid Avcısı ve Kaynak Avcısı hızları for (var i = 0; i < collectors.length; i++) { collectors[i].speed = 1.25 * (0.002 + 0.001) * 0.1 * 2732 * Math.pow(1.1, upgradeLevel); } for (var i = 0; i < resourceHunters.length; i++) { resourceHunters[i].speed = 1.1 * (0.002 + 0.001) * 0.1 * 2732 * Math.pow(1.1, upgradeLevel); } // Mermi hızı for (var i = 0; i < bullets.length; i++) { if (typeof bullets[i].speed === "number") { // Sadece oyuncu ve collector mermileri için uygula if (bullets[i].from === 'player' || typeof bullets[i].from === "undefined") { bullets[i].speed = 40 * 0.1 * Math.pow(1.2, upgradeLevel); } else if (bullets[i].from === 'enemy') { // Düşman mermisi sabit kalsın } } } // Maden kaynağı artırımı (yeni kaynaklar için) for (var i = 0; i < resourceNodes.length; i++) { if (typeof resourceNodes[i].baseAmount === "undefined") { resourceNodes[i].baseAmount = resourceNodes[i].amount; } resourceNodes[i].amount = Math.floor(resourceNodes[i].baseAmount * Math.pow(1.1, upgradeLevel)); } } // Gemi güncelle ship.update(); // Ekstra savaşçı gemileri güncelle ve AI ile kontrol et for (var i = 0; i < extraShips.length; i++) { var s = extraShips[i]; // Eğer gemi yok olduysa veya görünmüyorsa, atla if (!s.visible || s.hp <= 0) continue; // --- AI: En yakın düşmana saldır --- var nearestEnemy = null; var minEnemyDist = 999999; for (var j = 0; j < enemyShips.length; j++) { var e = enemyShips[j]; if (e.state === 'approaching' || e.state === 'engaging' || e.state === 'attacking') { var dx = e.x - s.x; var dy = e.y - s.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minEnemyDist) { minEnemyDist = dist; nearestEnemy = e; } } } // Eğer bir düşman koloniye 600px mesafedeyse, gemi ona saldırı pozisyonuna geçsin if (nearestEnemy && minEnemyDist < 600) { // Saldırı pozisyonu: düşmana yaklaş ve ateş et var dx = nearestEnemy.x - s.x; var dy = nearestEnemy.y - s.y; var dist = Math.sqrt(dx * dx + dy * dy); // Eğer çok uzaktaysa yaklaş if (dist > 200) { s.targetX = nearestEnemy.x + Math.random() * 40 - 20; s.targetY = nearestEnemy.y + Math.random() * 40 - 20; } else { // Yakındaysa ateş et if (typeof s.lastShot === "undefined") s.lastShot = 0; if (typeof s.shootDelay === "undefined") s.shootDelay = 30; if (LK.ticks - s.lastShot > s.shootDelay) { var b = new Bullet(); b.x = s.x; b.y = s.y - 60; b.targetEnemy = nearestEnemy; var tx = nearestEnemy.x - s.x; var ty = nearestEnemy.y - s.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); s.lastShot = LK.ticks; } } s.isAttacking = true; s.randomMoveTimer = 0; } else { // Gemi rastgele hareket etsin, düşman yok if (!s.randomMoveTimer) s.randomMoveTimer = 0; s.randomMoveTimer++; if (s.randomMoveTimer > 60) { // Her 1 saniyede bir yeni hedef belirle var angle = Math.random() * Math.PI * 2; var dist = 300 + Math.random() * 350; s.targetX = colony.x + Math.cos(angle) * dist; s.targetY = colony.y + Math.sin(angle) * dist; s.isAttacking = false; s.randomMoveTimer = 0; } } s.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 üzerindeki can miktarı yazısını güncelle if (typeof shipHpTxt !== "undefined") { shipHpTxt.setText((typeof ship.hp === "number" ? Math.max(0, Math.round(ship.hp)) : 0) + " / " + (typeof ship.maxHp === "number" ? ship.maxHp : 0)); shipHpTxt.x = ship.x; shipHpTxt.y = ship.y - 70; shipHpTxt.visible = ship.visible; } // --- Bizim askerler, düşman birliği koloniye yaklaşırken savunma saldırısı yapsın --- // En yakın düşman gemisini bul ve eğer koloniye yaklaşıyorsa saldır var nearestEnemy = null; var minEnemyDist = 999999; for (var i = 0; i < enemyShips.length; i++) { var e = enemyShips[i]; // Sadece koloniye yaklaşan veya saldıran düşmanları dikkate al if (e.state === 'approaching' || e.state === 'engaging' || e.state === 'attacking') { var dx = e.x - colony.x; var dy = e.y - colony.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minEnemyDist) { minEnemyDist = dist; nearestEnemy = e; } } } // Eğer bir düşman koloniye 600px mesafedeyse, gemi ona saldırı pozisyonuna geçsin if (nearestEnemy && minEnemyDist < 600 && ship.visible && ship.hp > 0) { // Saldırı pozisyonu: düşmana yaklaş ve ateş et var dx = nearestEnemy.x - ship.x; var dy = nearestEnemy.y - ship.y; var dist = Math.sqrt(dx * dx + dy * dy); // Eğer çok uzaktaysa yaklaş if (dist > 200) { ship.targetX = nearestEnemy.x + Math.random() * 40 - 20; ship.targetY = nearestEnemy.y + Math.random() * 40 - 20; } else { // Yakındaysa ateş et if (LK.ticks - ship.lastShot > ship.shootDelay) { var b = new Bullet(); b.x = ship.x; b.y = ship.y - 60; 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; } b.from = 'player'; bullets.push(b); game.addChild(b); ship.lastShot = LK.ticks; } } ship.isAttacking = true; ship.randomMoveTimer = 0; } else { // Gemi rastgele hareket etsin, düşman yok if (!ship.randomMoveTimer) ship.randomMoveTimer = 0; ship.randomMoveTimer++; if (ship.randomMoveTimer > 60) { // Her 1 saniyede bir yeni hedef belirle 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; } } // --- Düşman gemisi üretimi ve güncellemesi --- enemySpawnTimer++; if (enemySpawnTimer >= ENEMY_SPAWN_INTERVAL) { // Düşman dalga sayısını artır enemyWaveCount++; // Her dalgada gönderilecek gemi sayısı: 1 * 1.25^enemyWaveCount, en az 1, tam sayı enemyShipsPerWave = Math.max(1, Math.floor(1 * Math.pow(1.25, enemyWaveCount))); for (var i = 0; i < enemyShipsPerWave; i++) { var newEnemy = new EnemyShip(); // Dalga içindeki gemileri biraz farklı açılarda gönder if (typeof topAsteroid !== "undefined" && typeof topAsteroid.x === "number" && typeof topAsteroid.y === "number") { var angle = Math.PI / 2 + (i - (enemyShipsPerWave - 1) / 2) * (Math.PI / 16); var radius = 80 + i * 20; newEnemy.x = topAsteroid.x + Math.cos(angle) * radius; newEnemy.y = topAsteroid.y + Math.sin(angle) * radius; } enemyShips.push(newEnemy); game.addChild(newEnemy); } enemySpawnTimer = 0; } // Düşman gemilerini güncelle for (var i = enemyShips.length - 1; i >= 0; i--) { var e = enemyShips[i]; if (typeof e.update === "function") e.update(); // Eğer yok olduysa sil if (e.hp <= 0 || e.x < -200 || e.x > 2248 || e.y < -200 || e.y > 2932) { // Düşman sağlık barı varsa yok et if (e.hpBar) { e.hpBar.destroy(); } if (e.hpBarBg) { e.hpBarBg.destroy(); } // Eğer düşman öldüyse (haritadan çıkmadıysa), kaynak ekle if (e.hp <= 0) { // 30 kaynağı rastgele kaynak türlerine dağıt var remaining = 30; var types = []; for (var t = 0; t < resourceTypeList.length; t++) { types.push(resourceTypeList[t].name); } while (remaining > 0) { var idx = Math.floor(Math.random() * types.length); resourceStocks[types[idx]] += 1; remaining--; } // resources değişkenini de güncelle (Toplam Kaynak ile eşdeğer) var totalResourceStock = 0; for (var t = 0; t < resourceTypeList.length; t++) { totalResourceStock += resourceStocks[resourceTypeList[t].name]; } resources = totalResourceStock; } e.destroy(); enemyShips.splice(i, 1); } } // 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 // Oyuncu mermisi düşmana çarptıysa if (b.from === 'player') { for (var j = enemyShips.length - 1; j >= 0; j--) { var e = enemyShips[j]; if (e.visible && typeof e.x === "number" && typeof e.y === "number" && b.intersects(e)) { // Düşman canını azalt if (typeof e.hp === "number") e.hp -= typeof b.attackPower === "number" ? b.attackPower : 1; LK.effects.flashObject(e, 0xff0000, 400); b.destroy(); bullets.splice(i, 1); break; } } if (i >= bullets.length) continue; // mermi silindiyse diğer kontrolleri atla } // Sadece koloni ve gemi ile çarpışma kontrolü (düşman yok) if (b.from === 'enemy') { // Koloniye çarpma if (b.intersects(colony)) { if (typeof colony.hp !== "number") colony.hp = colony.maxHp || 50; colony.hp -= typeof b.attackPower === "number" ? b.attackPower : 1; LK.effects.flashObject(colony, 0xff0000, 400); b.destroy(); bullets.splice(i, 1); 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); if (typeof ship.hp !== "number") ship.hp = ship.maxHp || 6; ship.hp -= typeof b.attackPower === "number" ? b.attackPower : 1; if (ship.hp <= 0) { ship.hp = 0; LK.effects.flashObject(ship, 0xff0000, 800); ship.visible = false; ship.x = -9999; ship.y = -9999; // Sağ alttaki birim sayı listesini güncelle if (typeof shipCountTxtRight !== "undefined") { shipCountTxtRight.setText('Savaşçı: 0'); } if (typeof shipCountTxt !== "undefined") { shipCountTxt.setText('Savaşçı: 0'); } } } // Ekstra savaşçı gemilerine çarpma for (var si = 0; si < extraShips.length; si++) { var s = extraShips[si]; if (s.visible && s.hp > 0 && b.intersects(s)) { LK.effects.flashObject(s, 0xff0000, 500); b.destroy(); bullets.splice(i, 1); if (typeof s.hp !== "number") s.hp = s.maxHp || 6; s.hp -= typeof b.attackPower === "number" ? b.attackPower : 1; if (s.hp <= 0) { s.hp = 0; LK.effects.flashObject(s, 0xff0000, 800); s.visible = false; s.x = -9999; s.y = -9999; } break; } } } } // Otomasyon yükseltme: 50 kaynak ile yeni toplayıcı // (Otomatik satın alma kaldırıldı) // Kazanma koşulu kaldırıldı: Artık oyun sonsuz, kaynak limiti yok };
===================================================================
--- original.js
+++ change.js
@@ -1582,8 +1582,23 @@
shipHpBar.y = ship.y - 50;
shipHpBar.x = ship.x;
game.addChild(shipHpBarBg);
game.addChild(shipHpBar);
+// Gemi üzerinde kalan can miktarı sayı olarak gösterilsin
+var shipHpTxt = new Text2('', {
+ size: 32,
+ fill: "#fff",
+ dropShadow: true,
+ dropShadowColor: 0x000000,
+ dropShadowDistance: 2,
+ dropShadowAngle: Math.PI / 4,
+ dropShadowBlur: 4,
+ dropShadowAlpha: 0.7
+});
+shipHpTxt.anchor.set(0.5, 1);
+shipHpTxt.x = ship.x;
+shipHpTxt.y = ship.y - 70;
+game.addChild(shipHpTxt);
// 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; // Alt %50'lik kısımda aktif
// Asteroit Avcılarını oluştur
function createCollectors(n) {
@@ -2113,8 +2128,15 @@
shipHpBar.width = 86 * ratio;
shipHpBar.visible = ship.visible;
shipHpBarBg.visible = ship.visible;
}
+ // Gemi üzerindeki can miktarı yazısını güncelle
+ if (typeof shipHpTxt !== "undefined") {
+ shipHpTxt.setText((typeof ship.hp === "number" ? Math.max(0, Math.round(ship.hp)) : 0) + " / " + (typeof ship.maxHp === "number" ? ship.maxHp : 0));
+ shipHpTxt.x = ship.x;
+ shipHpTxt.y = ship.y - 70;
+ shipHpTxt.visible = ship.visible;
+ }
// --- Bizim askerler, düşman birliği koloniye yaklaşırken savunma saldırısı yapsın ---
// En yakın düşman gemisini bul ve eğer koloniye yaklaşıyorsa saldır
var nearestEnemy = null;
var minEnemyDist = 999999;
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