User prompt
Collector'ın asteroid peşine düşme mesafesini resetle.
User prompt
%50'lik oranı %200'e çıkar ve mermisi bitmesin.
User prompt
%50'lik oranı %150'a çıkar
User prompt
Toplayıcının mermi sayısı bitmesin.
User prompt
%50'lik oranı %90'a çıkar
User prompt
Collector'ın mermi doldurmak için koloniye dönmesini engelle
User prompt
%50'lik oranı %75'e çıkar
User prompt
Bunu düzelt.
User prompt
Toplayıcı %30'luk oranını %50'ye çıkar.
User prompt
astroidlerin boyutu koloniye uzakta iken çok küçük olsun, koloniye yaklaştıkça şuan ki büyüklüğüne göre büyüsün.
User prompt
Astroide bağlı hiçbir kaynak olmayacak. Astroid yok olduğu zaman içindeki kaynak işleme alınsın.
User prompt
%10'luk oranı %30'a çıkar.
User prompt
Koloniye gidip gidip geliyor. öyle yapmasın. Takibini sürdürsün.
User prompt
Toplayıcılar astroidleri haritadan çıkana kadar veya yok edene kadar ve kaynak alana kadar takip etsinler. Her mermi atışında ve astroid yok olduğunda hammaddeyi almadan koloniye dönüş yapmasınlar.
User prompt
Kaynak ile ilgili stok sayı sistemini güncelle.
User prompt
Astroidler Minimum haritada toplam 2 ile maksimum 6 adet olmak kaydıyla üzere haritaya yavaş şekilde girsinler ve çıkana kadar rastgele ilerlesinler, Toplayıcılar bu astroidlerin koloniye %10 kadar yaklaşınca toplamak için harita çıkışına kadar arkalarından gitsin.
User prompt
Astroidler Minimum 3- maksimum 5 olmak üzere haritaya yavaş şekilde girsinler ve çıkana kadar rastgele ilerlesinler, Toplayıcılar bu astroidlerin koloniye %10 kadar yaklaşınca toplamak için harita çıkışına kadar arkalarından gitsin.
User prompt
Astroidler Minimum 3- maksimum 5 olmak üzere haritaya giriş yapıp çıkış yapsınlar, Toplayıcılar bu astroidler koloniye %10 kadar yaklaşınca toplamak için harita çıkışına kadar arkalarından gitsin.
User prompt
Her kaynağın bağlı olduğu 7 farklı astroid resmi oluştur. Bu astroidleri toplayıcılar mermi ile yok edip, içerisinden kaynak çıkmasını sağlayacak. O çıkan kaynağı toplayacaklar. ile ilgili bir kod yaz.
User prompt
Toplanan kaynaklar sıfırlanmasın. Para kazanmak için kaynakları işleyip ürün haline getireceğiz. Sonrasında ürünleri satarak para kazanacağız. Bu para ile yeni gemiler, toplayıcılar ve seviye yükseltmeleri yapacağız.
User prompt
Toplayıcılar koloninin %10 yakınında olan madenleri toplasınlar.
User prompt
Toplayıcıların hızı, kaynakların hızından %25 daha fazla olsun. Kaynakları takip ederek toplasın. Ayrıca bir toplarken mermi sıksın. sıktığı merminin resim dosyasını oluştur.
User prompt
Sağ alt panele Toplayıcı ibaresi yok. Onu da ekle.
User prompt
Haritada ki kaynak sayısı değil. Toplanıp stokta olan kaynak sayısı yazsın orada.
User prompt
Her başlangıçta kaynak oluyor stokta. Oyunu her sıfırla dediğimiz de sıfırlanmış şekilde başlamasını istiyorum.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // 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; }); // Otomatik toplayıcı (Collector) var Collector = Container.expand(function () { var self = Container.call(this); var col = self.attachAsset('collector', { anchorX: 0.5, anchorY: 0.5 }); self.target = null; self.speed = 8 * 0.1; self.carrying = 0; self.maxCarry = 10; 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); if (dist < 10) { // Kaynağa ulaştı if (!self.target.collected && self.carrying < self.maxCarry) { var take = Math.min(self.maxCarry - self.carrying, self.target.amount); self.carrying += take; self.target.amount -= take; if (self.target.amount <= 0) { self.target.collected = true; self.target.visible = false; } } 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) { // Koloniye ulaştı resources += self.carrying; self.carrying = 0; self.state = 'idle'; self.target = null; } else { self.x += self.speed * dx / dist; self.y += self.speed * dy / dist; } } }; 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ı var ResourceNode = Container.expand(function () { var self = Container.call(this); // Kaynak türleri ve asset id'leri var resourceTypes = [{ 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" }]; // Rastgele bir kaynak türü seç var typeIndex = Math.floor(Math.random() * resourceTypes.length); self.resourceType = resourceTypes[typeIndex].name; self.resourceAsset = resourceTypes[typeIndex].asset; // Asset'i ata 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; // --- HAREKET EKLE --- // Rastgele bir giriş kenarı seç (sol, sağ, üst, alt) var edge = Math.floor(Math.random() * 4); var startX, startY, endX, endY; var margin = 120; if (edge === 0) { // sol kenar startX = -margin; startY = 400 + Math.random() * (2732 - 800); endX = 2048 + margin; endY = startY + (Math.random() - 0.5) * 400; } else if (edge === 1) { // sağ kenar startX = 2048 + margin; startY = 400 + Math.random() * (2732 - 800); endX = -margin; endY = startY + (Math.random() - 0.5) * 400; } else if (edge === 2) { // üst kenar startX = Math.random() * 2048; startY = -margin; endX = startX + (Math.random() - 0.5) * 400; endY = 2732 + margin; } else { // alt kenar 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; // Daha da yavaş hareket self.visible = true; self.update = function () { if (self.collected) return; // Hareket ilerlemesini güncelle self._moveProgress += self._moveSpeed; if (self._moveProgress > 1) { // Haritadan çıktı, kaybolsun 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; }; 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 ****/ // Global değişkenler // Koloni, kaynak, gemi ve düşman için temel şekiller 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 }; // Kaynak stoklarını ve toplam kaynakları her oyun başında sıfırla if (typeof resourceStocks !== "undefined") { for (var i = 0; i < resourceTypeList.length; i++) { resourceStocks[resourceTypeList[i].name] = 0; } } resources = 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" }); 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" }); 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('Toplayıcı: 1', { size: 36, fill: "#fff" }); 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" }); 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" }); 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('Toplayıcı: 1', { size: 36, fill: 0xB8FFB8 }); collectorTxtRight.anchor.set(1, 1); collectorTxtRight.x = 0; collectorTxtRight.y = -colonyHpLabelRight.height - colonyHpTxtRight.height - 16; // Gemi sayısı göstergesi (sağ alt) var shipCountTxtRight = new Text2('Gemi: 1', { size: 36, fill: "#fff" }); shipCountTxtRight.anchor.set(1, 1); shipCountTxtRight.x = 0; shipCountTxtRight.y = -colonyHpLabelRight.height - colonyHpTxtRight.height - collectorTxtRight.height - 24; guiRightBottomGroup.addChild(shipCountTxtRight); // Sağ üst köşeye "Oyunu Sıfırla" butonu ekle var resetBtn = new Text2('Oyunu Sıfırla', { size: 44, fill: "#fff", font: "bold" }); 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(); } // Kaynak stoğunu da sıfırla resources = 0; for (var i = 0; i < resourceTypeList.length; i++) { resourceStocks[resourceTypeList[i].name] = 0; } // Bir sonraki oyun başında da sıfırdan başlasın diye storage'a da kaydet if (typeof storage !== "undefined" && storage.setItem) { storage.setItem("resources", 0); for (var i = 0; i < resourceTypeList.length; i++) { storage.setItem("resourceStock_" + resourceTypeList[i].name, 0); } } 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 }); 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('Gemi: 1', { size: 36, fill: "#fff" }); 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; game.addChild(ship); // Otomatik toplayıcıları oluştur function createCollectors(n) { for (var i = collectors.length; i < n; i++) { var c = new Collector(); c.x = colony.x + 100 * (i - n / 2); c.y = colony.y + 100; collectors.push(c); game.addChild(c); } } createCollectors(autoCollectors); // Kaynak noktalarını oluştur function spawnResources() { for (var i = 0; i < 5; i++) { var r = new ResourceNode(); var angle = Math.PI * 2 * i / 5 + Math.random() * 0.2; var dist = 700 + Math.random() * 200; r.x = colony.x + Math.cos(angle) * dist; r.y = colony.y - 600 + Math.sin(angle) * dist; resourceNodes.push(r); game.addChild(r); } } spawnResources(); // 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]; if (c.state === 'idle') { // En yakın toplanmamış kaynağı bul var minDist = 99999; var target = null; for (var j = 0; j < resourceNodes.length; j++) { var r = resourceNodes[j]; if (!r.collected && r.amount > 0) { var dx = r.x - c.x; var dy = r.y - c.y; var dist = dx * dx + dy * dy; if (dist < minDist) { minDist = dist; target = r; } } } if (target) { c.target = target; c.state = 'moving'; } } } } // 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('Toplayıcı: ' + autoCollectors); // Her kaynak türünden kaç tane var, say for (var i = 0; i < resourceTypeList.length; i++) { var typeName = resourceTypeList[i].name; resourceStocks[typeName] = 0; } for (var i = 0; i < resourceNodes.length; i++) { var r = resourceNodes[i]; if (!r.collected && r.amount > 0) { if (typeof resourceStocks[r.resourceType] === "number") { resourceStocks[r.resourceType]++; } } } // 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('Gemi: 1'); shipCountTxtRight.setText('Gemi: 1'); // 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('Toplayıcı: ' + autoCollectors); // Kaynaklar bitti ise yenilerini oluştur var allCollected = true; for (var i = 0; i < resourceNodes.length; i++) { if (!resourceNodes[i].collected && resourceNodes[i].amount > 0) { allCollected = false; break; } } if (allCollected) { for (var i = 0; i < resourceNodes.length; i++) { resourceNodes[i].destroy(); } resourceNodes = []; spawnResources(); } // 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 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 (!ship.hp) ship.hp = 6; ship.hp -= typeof b.attackPower === "number" ? b.attackPower : 1; // Her mermi attackPower kadar can götürür if (ship.hp <= 0) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } } } } // 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; } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// 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;
});
// Otomatik toplayıcı (Collector)
var Collector = Container.expand(function () {
var self = Container.call(this);
var col = self.attachAsset('collector', {
anchorX: 0.5,
anchorY: 0.5
});
self.target = null;
self.speed = 8 * 0.1;
self.carrying = 0;
self.maxCarry = 10;
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);
if (dist < 10) {
// Kaynağa ulaştı
if (!self.target.collected && self.carrying < self.maxCarry) {
var take = Math.min(self.maxCarry - self.carrying, self.target.amount);
self.carrying += take;
self.target.amount -= take;
if (self.target.amount <= 0) {
self.target.collected = true;
self.target.visible = false;
}
}
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) {
// Koloniye ulaştı
resources += self.carrying;
self.carrying = 0;
self.state = 'idle';
self.target = null;
} else {
self.x += self.speed * dx / dist;
self.y += self.speed * dy / dist;
}
}
};
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ı
var ResourceNode = Container.expand(function () {
var self = Container.call(this);
// Kaynak türleri ve asset id'leri
var resourceTypes = [{
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"
}];
// Rastgele bir kaynak türü seç
var typeIndex = Math.floor(Math.random() * resourceTypes.length);
self.resourceType = resourceTypes[typeIndex].name;
self.resourceAsset = resourceTypes[typeIndex].asset;
// Asset'i ata
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;
// --- HAREKET EKLE ---
// Rastgele bir giriş kenarı seç (sol, sağ, üst, alt)
var edge = Math.floor(Math.random() * 4);
var startX, startY, endX, endY;
var margin = 120;
if (edge === 0) {
// sol kenar
startX = -margin;
startY = 400 + Math.random() * (2732 - 800);
endX = 2048 + margin;
endY = startY + (Math.random() - 0.5) * 400;
} else if (edge === 1) {
// sağ kenar
startX = 2048 + margin;
startY = 400 + Math.random() * (2732 - 800);
endX = -margin;
endY = startY + (Math.random() - 0.5) * 400;
} else if (edge === 2) {
// üst kenar
startX = Math.random() * 2048;
startY = -margin;
endX = startX + (Math.random() - 0.5) * 400;
endY = 2732 + margin;
} else {
// alt kenar
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; // Daha da yavaş hareket
self.visible = true;
self.update = function () {
if (self.collected) return;
// Hareket ilerlemesini güncelle
self._moveProgress += self._moveSpeed;
if (self._moveProgress > 1) {
// Haritadan çıktı, kaybolsun
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;
};
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
****/
// Global değişkenler
// Koloni, kaynak, gemi ve düşman için temel şekiller
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
};
// Kaynak stoklarını ve toplam kaynakları her oyun başında sıfırla
if (typeof resourceStocks !== "undefined") {
for (var i = 0; i < resourceTypeList.length; i++) {
resourceStocks[resourceTypeList[i].name] = 0;
}
}
resources = 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"
});
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"
});
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('Toplayıcı: 1', {
size: 36,
fill: "#fff"
});
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"
});
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"
});
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('Toplayıcı: 1', {
size: 36,
fill: 0xB8FFB8
});
collectorTxtRight.anchor.set(1, 1);
collectorTxtRight.x = 0;
collectorTxtRight.y = -colonyHpLabelRight.height - colonyHpTxtRight.height - 16;
// Gemi sayısı göstergesi (sağ alt)
var shipCountTxtRight = new Text2('Gemi: 1', {
size: 36,
fill: "#fff"
});
shipCountTxtRight.anchor.set(1, 1);
shipCountTxtRight.x = 0;
shipCountTxtRight.y = -colonyHpLabelRight.height - colonyHpTxtRight.height - collectorTxtRight.height - 24;
guiRightBottomGroup.addChild(shipCountTxtRight);
// Sağ üst köşeye "Oyunu Sıfırla" butonu ekle
var resetBtn = new Text2('Oyunu Sıfırla', {
size: 44,
fill: "#fff",
font: "bold"
});
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();
}
// Kaynak stoğunu da sıfırla
resources = 0;
for (var i = 0; i < resourceTypeList.length; i++) {
resourceStocks[resourceTypeList[i].name] = 0;
}
// Bir sonraki oyun başında da sıfırdan başlasın diye storage'a da kaydet
if (typeof storage !== "undefined" && storage.setItem) {
storage.setItem("resources", 0);
for (var i = 0; i < resourceTypeList.length; i++) {
storage.setItem("resourceStock_" + resourceTypeList[i].name, 0);
}
}
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
});
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('Gemi: 1', {
size: 36,
fill: "#fff"
});
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;
game.addChild(ship);
// Otomatik toplayıcıları oluştur
function createCollectors(n) {
for (var i = collectors.length; i < n; i++) {
var c = new Collector();
c.x = colony.x + 100 * (i - n / 2);
c.y = colony.y + 100;
collectors.push(c);
game.addChild(c);
}
}
createCollectors(autoCollectors);
// Kaynak noktalarını oluştur
function spawnResources() {
for (var i = 0; i < 5; i++) {
var r = new ResourceNode();
var angle = Math.PI * 2 * i / 5 + Math.random() * 0.2;
var dist = 700 + Math.random() * 200;
r.x = colony.x + Math.cos(angle) * dist;
r.y = colony.y - 600 + Math.sin(angle) * dist;
resourceNodes.push(r);
game.addChild(r);
}
}
spawnResources();
// 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];
if (c.state === 'idle') {
// En yakın toplanmamış kaynağı bul
var minDist = 99999;
var target = null;
for (var j = 0; j < resourceNodes.length; j++) {
var r = resourceNodes[j];
if (!r.collected && r.amount > 0) {
var dx = r.x - c.x;
var dy = r.y - c.y;
var dist = dx * dx + dy * dy;
if (dist < minDist) {
minDist = dist;
target = r;
}
}
}
if (target) {
c.target = target;
c.state = 'moving';
}
}
}
}
// 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('Toplayıcı: ' + autoCollectors);
// Her kaynak türünden kaç tane var, say
for (var i = 0; i < resourceTypeList.length; i++) {
var typeName = resourceTypeList[i].name;
resourceStocks[typeName] = 0;
}
for (var i = 0; i < resourceNodes.length; i++) {
var r = resourceNodes[i];
if (!r.collected && r.amount > 0) {
if (typeof resourceStocks[r.resourceType] === "number") {
resourceStocks[r.resourceType]++;
}
}
}
// 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('Gemi: 1');
shipCountTxtRight.setText('Gemi: 1');
// 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('Toplayıcı: ' + autoCollectors);
// Kaynaklar bitti ise yenilerini oluştur
var allCollected = true;
for (var i = 0; i < resourceNodes.length; i++) {
if (!resourceNodes[i].collected && resourceNodes[i].amount > 0) {
allCollected = false;
break;
}
}
if (allCollected) {
for (var i = 0; i < resourceNodes.length; i++) {
resourceNodes[i].destroy();
}
resourceNodes = [];
spawnResources();
}
// 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 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 (!ship.hp) ship.hp = 6;
ship.hp -= typeof b.attackPower === "number" ? b.attackPower : 1; // Her mermi attackPower kadar can götürür
if (ship.hp <= 0) {
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
}
}
// 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;
}
};
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