User prompt
Kervan butonunun işlevini, kervan resmine ekle.
User prompt
Kervan hareket etmiyor ve görünmüyor
User prompt
Öyleyse bu hatayı düzelt. Kervan geldi diyor. Tıklıyorum bişey olmuyor. Ayrıca haritada kervan yok.
User prompt
Kervan geldi diyor ama haritada kervan görünmüyor
User prompt
Business resmi üzerine kervan panelinin butonunu oluştur
User prompt
Kervan geldiği zaman Kervan geldi yazısına kervan panelinin butonunu ekle.
User prompt
Oyunda ki var olan kervana resim dosyası oluştur
User prompt
Kervan kalan spawn süresini "Nasıl Oynanır?" yazısının altına ekle.
User prompt
Kervan kalan spawn süresini nasıl yapılır yazısının altına ekle.
User prompt
Bütün kodları inceler misin, kervan hakkında eksiklik veya yanlış birşeyler varmı. Var ise düzelt
User prompt
Sen kontrol edip tavsiyeyi uygular mısın
User prompt
Karavan varış yeri depo yerine business resiminin üzeri olsun.
User prompt
Karavan gelsin artık gelmiyor. Sorunu çöz
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'undefined')' in or related to this line: 'return Math.round(productTypes[idx].price * 0.9);' Line Number: 2198
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'undefined')' in or related to this line: 'lines.push(productTypes[p.idx].name + ": " + ownProd + " adet (₺" + getCaravanSellPrice('product', p.idx) + " /adet)");' Line Number: 2245
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'undefined')' in or related to this line: 'return Math.round(productTypes[idx].price * 1.1);' Line Number: 2186
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'undefined')' in or related to this line: 'lines.push(productTypes[p.idx].name + ": " + p.count + " adet (₺" + getCaravanBuyPrice('product', p.idx) + " /adet)" + " [Al: +" + buyProd + " | Sat: -" + sellProd + "]");' Line Number: 2216
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'length')' in or related to this line: 'var idx = Math.floor(Math.random() * productTypes.length);' Line Number: 2154
User prompt
Caravan oyun başlangıcında gelsin
User prompt
Caravan oyun başlangıcından 5 saniye sonra spawn olsun.
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading '0')' in or related to this line: 'lines.push(productTypes[p.idx].name + ": " + p.count + " adet (₺" + getCaravanBuyPrice('product', p.idx) + " /adet)" + " [Al: +" + buyProd + " | Sat: -" + sellProd + "]");' Line Number: 2220
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'length')' in or related to this line: 'var idx = Math.floor(Math.random() * productTypes.length);' Line Number: 2154
User prompt
Karavan oyun başlangıcında gelsin.
User prompt
Taşıyıcılar satın alınan yeni fabrikadan da ürünleri alsınlar.
User prompt
Öyleyse bu konu ile ilgili bir resim dosyası oluştur.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // 10 minutes in seconds (will be converted to ticks) // --- BUSINESS PANEL CLASS --- // İşletmeler paneli ve sistemi var BusinessPanel = Container.expand(function () { var self = Container.call(this); // Panel arka planı var panelBg = LK.getAsset('businessPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 900, scaleX: 1.1, scaleY: 1.1 }); panelBg.alpha = 0.97; self.addChild(panelBg); // Panel başlığı var title = new Text2('İşletmeler', { size: 38, fill: "#000", fontWeight: "bold" }); title.anchor.set(0.5, 0.5); title.x = panelBg.x; title.y = panelBg.y - panelBg.height / 2 + 60; self.addChild(title); // İşletme tanımları var businessDefs = [{ name: "Çiftlik", price: 500, baseBonus: 0.03, levelBonus: 0.02, desc: "Satılan ürün başı %3 kar, seviye başı %2 artış", icon: null // İleride ikon eklenebilir }, { name: "Tarla", price: 1000, baseBonus: 0.05, levelBonus: 0.02, desc: "Satılan ürün başı %5 kar, seviye başı %2 artış", icon: null }, { name: "Demirci", price: 1500, baseBonus: 0.10, levelBonus: 0.02, desc: "Satılan ürün başı %10 kar, seviye başı %2 artış", icon: null }, { name: "Köşk", price: 2000, baseBonus: 0.15, levelBonus: 0.02, desc: "Satılan ürün başı %15 kar, seviye başı %2 artış", icon: null }, { name: "Kale", price: 5000, baseBonus: 0.20, levelBonus: 0.02, desc: "Satılan ürün başı %20 kar, seviye başı %2 artış", icon: null }]; // İşletme state: [{level: 0, owned: false}] self.businesses = []; for (var i = 0; i < businessDefs.length; i++) { self.businesses.push({ level: 0, owned: false }); } // Satır yüksekliği ve panel içi layout // Panel boyutuna göre orantılı satır yüksekliği ve yazı boyutları var contentMargin = Math.round(panelBg.height * 0.07); // üstten boşluk var rowHeight = Math.round(panelBg.height * 0.18); // Satır yüksekliği biraz artırıldı var startY = panelBg.y - panelBg.height / 2 + contentMargin + Math.round(rowHeight / 2); // Panel genişliğine göre kolon oranları var colName = Math.round(panelBg.width * 0.13); var colDesc = Math.round(panelBg.width * 0.32); var colLevel = Math.round(panelBg.width * 0.23); var colBtn = Math.round(panelBg.width * 0.22); // Tüm yazı fontları 36 var nameFontSize = 36; var descFontSize = 36; var levelFontSize = 36; var btnFontSize = 36; self.rows = []; for (var i = 0; i < businessDefs.length; i++) { var y = startY + i * rowHeight; // İsim var nameTxt = new Text2(businessDefs[i].name, { size: nameFontSize, fill: "#000", fontWeight: "bold" }); nameTxt.anchor.set(0, 0.5); nameTxt.x = panelBg.x - panelBg.width / 2 + colName; nameTxt.y = y; self.addChild(nameTxt); // Açıklama (işletme isminin altına hizala) var descTxt = new Text2(businessDefs[i].desc, { size: descFontSize, fill: "#333" }); descTxt.anchor.set(0, 0); descTxt.x = nameTxt.x; descTxt.y = nameTxt.y + nameTxt.height / 2 + 4; // ismin altına 4px boşlukla hizala self.addChild(descTxt); // Seviye var levelTxt = new Text2("Seviye: 0", { size: levelFontSize, fill: "#000" }); levelTxt.anchor.set(0, 0.5); levelTxt.x = panelBg.x - panelBg.width / 2 + colName + colDesc + colLevel; levelTxt.y = y; self.addChild(levelTxt); // Satın al/yükselt butonu ortada olacak şekilde hizala var btn = new Text2("Satın Al (₺" + businessDefs[i].price + ")", { size: btnFontSize, fill: 0x2E7D32, fontWeight: "bold" }); btn.anchor.set(0.5, 0.5); // Çiftlik ismi ile seviye yazısının ortasına hizala btn.x = (nameTxt.x + levelTxt.x) / 2 + nameTxt.width / 2; // ismin ortası ile seviye yazısının başı arasında ortala btn.y = y; self.addChild(btn); // Buton event (function (idx) { btn.down = function () { var biz = self.businesses[idx]; if (!biz.owned) { // Satın alma if (money >= businessDefs[idx].price) { money -= businessDefs[idx].price; biz.owned = true; biz.level = 1; updateMoneyText(); self.updateRows(); } } else { // Seviye yükseltme var upgradeCost = businessDefs[idx].price * (biz.level + 1); if (money >= upgradeCost) { money -= upgradeCost; biz.level++; updateMoneyText(); self.updateRows(); } } }; })(i); self.rows.push({ nameTxt: nameTxt, descTxt: descTxt, levelTxt: levelTxt, btn: btn }); } // Paneli güncelle self.updateRows = function () { for (var i = 0; i < businessDefs.length; i++) { var biz = self.businesses[i]; var row = self.rows[i]; if (!biz.owned) { row.levelTxt.setText("Seviye: 0"); row.btn.setText("Satın Al (₺" + businessDefs[i].price + ")"); row.btn.fill = "#2e7d32"; } else { row.levelTxt.setText("Seviye: " + biz.level); var upgradeCost = businessDefs[i].price * (biz.level + 1); row.btn.setText("Yükselt (₺" + upgradeCost + ")"); row.btn.fill = "#1565c0"; } // Buton pasif/gri yap var enoughMoney = !biz.owned ? money >= businessDefs[i].price : money >= businessDefs[i].price * (biz.level + 1); row.btn.alpha = enoughMoney ? 1 : 0.4; } }; // Kapat ikonu ekle var closeIcon = new Text2('✕', { size: 42, fill: 0xFF0000, fontWeight: "bold" }); closeIcon.anchor.set(0.5, 0.5); closeIcon.x = panelBg.x + panelBg.width / 2 - 30; closeIcon.y = panelBg.y - panelBg.height / 2 + 30; closeIcon.visible = false; self.addChild(closeIcon); closeIcon.down = function () { self.toggle(); }; // Paneli başta gizle self.visible = false; // Paneli aç/kapat fonksiyonu self.toggle = function () { self.visible = !self.visible; panelBg.visible = self.visible; title.visible = self.visible; closeIcon.visible = self.visible; for (var i = 0; i < self.rows.length; i++) { self.rows[i].nameTxt.visible = self.visible; self.rows[i].descTxt.visible = self.visible; self.rows[i].levelTxt.visible = self.visible; self.rows[i].btn.visible = self.visible; } if (self.visible) self.updateRows(); }; // Paneli başta gizle panelBg.visible = false; title.visible = false; for (var i = 0; i < self.rows.length; i++) { self.rows[i].nameTxt.visible = false; self.rows[i].descTxt.visible = false; self.rows[i].levelTxt.visible = false; self.rows[i].btn.visible = false; } return self; }); // --- CARAVAN CLASS --- // Kervan: Şehirler arası/uzak fabrikalar arası toplu ürün/hammadde taşıyan sistem var Caravan = Container.expand(function () { var self = Container.call(this); // Kervan görseli (artık özel caravan resmi kullanılıyor) var caravanSprite = self.attachAsset('caravan', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; self.state = 'idle'; // 'idle', 'toSource', 'toTarget', 'returning' self.source = null; // Kaynak fabrika/şehir self.target = null; // Hedef fabrika/şehir self.cargo = null; // {type: 'ore'|'wood'|'food'|'product', count: int} self.route = []; // Güzergah noktaları (ileride kullanılabilir) self.lastX = 0; self.lastY = 0; // Kervanı bir kaynaktan hedefe gönder self.send = function (source, target, cargoType, count) { self.state = 'toSource'; self.source = source; self.target = target; self.cargo = { type: cargoType, count: count || 1 }; self.x = source.x; self.y = source.y; self.lastX = self.x; self.lastY = self.y; }; // Hedefe doğru hareket et self.moveTowards = function (tx, ty) { var dx = tx - self.x; var dy = ty - self.y; var dist = Math.sqrt(dx * dx + dy * dy); var moveSpeed = self.speed; if (dist < moveSpeed) { self.x = tx; self.y = ty; return true; } self.x += dx / dist * moveSpeed; self.y += dy / dist * moveSpeed; return false; }; // Her tickte güncelle self.update = function () { if (self.state === 'toSource' && self.source) { if (self.moveTowards(self.source.x, self.source.y)) { // Kaynağa ulaştı, yükü al if (self.cargo && self.source[self.cargo.type + 'Buffer'] >= self.cargo.count) { self.source[self.cargo.type + 'Buffer'] -= self.cargo.count; self.state = 'toTarget'; } else { // Yeterli yük yoksa idle'a dön self.state = 'idle'; } } } else if (self.state === 'toTarget' && self.target) { if (self.moveTowards(self.target.x, self.target.y)) { // Hedefe ulaştı, yükü bırak if (self.cargo) { if (typeof self.target[self.cargo.type + 'Buffer'] === "number") { self.target[self.cargo.type + 'Buffer'] += self.cargo.count; } self.cargo = null; } self.state = 'returning'; } } else if (self.state === 'returning' && self.source) { if (self.moveTowards(self.source.x, self.source.y)) { self.state = 'idle'; } } self.lastX = self.x; self.lastY = self.y; }; return self; }); // Add level to Carrier (worker) var Carrier = Container.expand(function () { var self = Container.call(this); var carrierSprite = self.attachAsset('carrier', { anchorX: 0.5, anchorY: 0.5 }); self.level = 1; // Carrier level self.speed = 7; self.state = 'idle'; // 'idle', 'toFactory', 'toShop' self.target = null; self.carrying = null; //{a} // {productType: int, count: int} self.factoryTarget = null; self.shopTarget = null; self.goToFactory = function (factory) { self.state = 'toFactory'; self.target = { x: factory.x, y: factory.y }; self.factoryTarget = factory; }; self.goToShop = function (shop) { self.state = 'toShop'; self.target = { x: shop.x, y: shop.y }; self.shopTarget = shop; }; self.setIdle = function () { self.state = 'idle'; self.target = null; self.factoryTarget = null; self.shopTarget = null; self.carrying = null; }; self.moveTowards = function (tx, ty) { var dx = tx - self.x; var dy = ty - self.y; var dist = Math.sqrt(dx * dx + dy * dy); var moveSpeed = (self.speed + (self.level - 1) * 1) * getMoveMultiplier(self.level); if (dist < moveSpeed) { self.x = tx; self.y = ty; return true; } self.x += dx / dist * moveSpeed; self.y += dy / dist * moveSpeed; return false; }; self.update = function () { if (self.state === 'toFactory' && self.factoryTarget) { if (self.moveTowards(self.factoryTarget.x, self.factoryTarget.y)) { // Arrived at factory if (!self.carrying) { // Find a product type with available product var found = false; for (var p = 0; p < 10; p++) { if (self.factoryTarget.productBuffer[p] > 0) { self.factoryTarget.productBuffer[p]--; self.carrying = { productType: p, count: 1 }; found = true; break; } } if (found && shopList.length > 0) { self.goToShop(shopList[0]); } else { self.setIdle(); } } else { self.setIdle(); } } } else if (self.state === 'toShop' && self.shopTarget) { if (self.moveTowards(self.shopTarget.x, self.shopTarget.y)) { // Arrived at shop if (self.carrying) { // Deliver product to shop if (self.shopTarget && _typeof(self.shopTarget.productBuffer) === "object") { self.shopTarget.productBuffer[self.carrying.productType] += self.carrying.count; } self.carrying = null; } // Find next product to carry var found = false; for (var f = 0; f < factoryList.length; f++) { // Tüm fabrikalardan taşıyıcı ürün taşıyabilsin (başlangıç fabrikası dahil) var isOwned = true; if (typeof businessPanel !== "undefined" && businessPanel.businesses && businessPanel.businesses[f]) { // Sadece businessPanel'de tanımlı fabrikalar için owned kontrolü yap, ilk fabrika (başlangıç) için her zaman true if (f > 0) { isOwned = businessPanel.businesses[f].owned; } } // --- DEĞİŞİKLİK: Satın alınan yeni fabrikalardan da ürün taşıyıcı alabilsin --- // isOwned true ise (yani fabrika açıldıysa veya ilk fabrika ise) taşıyıcı ürün alabilir if (isOwned) { for (var p = 0; p < 10; p++) { if (factoryList[f].productBuffer[p] > 0) { self.goToFactory(factoryList[f]); found = true; break; } } } if (found) break; } if (!found) { self.setIdle(); } } } else if (self.state === 'idle') { // Look for product to carry var found = false; for (var f = 0; f < factoryList.length; f++) { // Tüm fabrikalardan taşıyıcı ürün taşıyabilsin (başlangıç fabrikası dahil) var isOwned = true; if (typeof businessPanel !== "undefined" && businessPanel.businesses && businessPanel.businesses[f]) { // Sadece businessPanel'de tanımlı fabrikalar için owned kontrolü yap, ilk fabrika (başlangıç) için her zaman true if (f > 0) { isOwned = businessPanel.businesses[f].owned; } } // --- DEĞİŞİKLİK: Satın alınan yeni fabrikalardan da ürün taşıyıcı alabilsin (idle durumunda) --- if (isOwned) { for (var p = 0; p < 10; p++) { if (factoryList[f].productBuffer[p] > 0) { self.goToFactory(factoryList[f]); found = true; break; } } } if (found) break; } } }; return self; }); // Add level to City var City = Container.expand(function () { var self = Container.call(this); // Add city color image var citySprite = self.attachAsset('city', { anchorX: 0.5, anchorY: 0.5 }); self.level = 1; // City level self.x = 150; // Move city to upper left side, but not in the 0-100px menu area self.y = 150; // Top left, but not in the 0-100px menu area self.customerSpawnCooldown = 0; self.customerSpawnInterval = 180; // 3 seconds at 60fps self.update = function () { self.customerSpawnCooldown--; if (self.customerSpawnCooldown <= 0) { // Only spawn customer if shop has at least 1 product var canSpawn = false; if (shopList.length > 0) { // Mağazada herhangi bir ürün çeşidi var mı? for (var p = 0; p < 10; p++) { if (shopList[0].productBuffer[p] > 0) { canSpawn = true; break; } } } self.customerSpawnCooldown = Math.max(30, self.customerSpawnInterval - (self.level - 1) * 30) + Math.floor(Math.random() * 120); if (canSpawn) { spawnCustomer(); } } }; return self; }); // Customer: Walks from city to shop, buys product if available, then leaves var Customer = Container.expand(function () { var self = Container.call(this); // Pick a random customer image for this customer var customerImages = ['customer1', 'customer2', 'customer3', 'customer4', 'customer5']; var customerImgId = customerImages[Math.floor(Math.random() * customerImages.length)]; var customerSprite = self.attachAsset(customerImgId, { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5 + Math.random() * 2; self.state = 'toShop'; // 'toShop', 'leaving' self.targetShop = null; self.hasBought = false; // Each customer wants a random product type self.wantProductType = Math.floor(Math.random() * 10); self.moveTowards = function (tx, ty) { var dx = tx - self.x; var dy = ty - self.y; var dist = Math.sqrt(dx * dx + dy * dy); var moveSpeed = self.speed * getMoveMultiplier(1); // Customers have no level, always use 1 if (dist < moveSpeed) { self.x = tx; self.y = ty; return true; } self.x += dx / dist * moveSpeed; self.y += dy / dist * moveSpeed; return false; }; self.update = function () { if (self.state === 'toShop' && self.targetShop) { if (self.moveTowards(self.targetShop.x, self.targetShop.y)) { // Arrived at shop if (!self.hasBought) { if (self.targetShop.productBuffer[self.wantProductType] > 0) { // İstediği ürün varsa onu al self.targetShop.productBuffer[self.wantProductType]--; var basePrice = productTypes[self.wantProductType].price; var bonus = 0; if (typeof businessPanel !== "undefined" && businessPanel.businesses) { for (var b = 0; b < businessPanel.businesses.length; b++) { var biz = businessPanel.businesses[b]; if (biz.owned && biz.level > 0) { var def = businessPanel.rows[b] && businessPanel.rows[b].descTxt ? null : null; // just to avoid unused warning var def2 = businessPanel.businesses[b]; var defObj = businessPanel.rows && businessPanel.rows[b] ? null : null; var defn = businessPanel.businesses[b]; var defB = businessPanel.businesses[b]; var defD = businessPanel.businesses[b]; var defE = businessPanel.businesses[b]; var defF = businessPanel.businesses[b]; var defG = businessPanel.businesses[b]; var defH = businessPanel.businesses[b]; var defI = businessPanel.businesses[b]; // Use businessDefs from class definition var bdef = businessPanel.rows && businessPanel.rows.length === businessPanel.businesses.length ? null : null; // Use static businessDefs var defs = [{ baseBonus: 0.03, levelBonus: 0.02 }, { baseBonus: 0.05, levelBonus: 0.02 }, { baseBonus: 0.10, levelBonus: 0.02 }, { baseBonus: 0.15, levelBonus: 0.02 }, { baseBonus: 0.20, levelBonus: 0.02 }]; var def = defs[b]; bonus += def.baseBonus + def.levelBonus * (biz.level - 1); } } } money += Math.round(basePrice * (1 + bonus)); updateMoneyText(); self.hasBought = true; self.state = 'leaving'; self.leaveTarget = { x: self.x, y: -100 }; // leave upwards } else { // İstediği ürün yoksa, başka bir ürün var mı bak var foundOther = false; for (var p = 0; p < 10; p++) { if (self.targetShop.productBuffer[p] > 0) { self.targetShop.productBuffer[p]--; var basePrice = productTypes[p].price; var bonus = 0; if (typeof businessPanel !== "undefined" && businessPanel.businesses) { for (var b = 0; b < businessPanel.businesses.length; b++) { var biz = businessPanel.businesses[b]; if (biz.owned && biz.level > 0) { var defs = [{ baseBonus: 0.03, levelBonus: 0.02 }, { baseBonus: 0.05, levelBonus: 0.02 }, { baseBonus: 0.10, levelBonus: 0.02 }, { baseBonus: 0.15, levelBonus: 0.02 }, { baseBonus: 0.20, levelBonus: 0.02 }]; var def = defs[b]; bonus += def.baseBonus + def.levelBonus * (biz.level - 1); } } } money += Math.round(basePrice * (1 + bonus)); updateMoneyText(); self.hasBought = true; self.state = 'leaving'; self.leaveTarget = { x: self.x, y: -100 }; foundOther = true; break; } } // Eğer hiç ürün yoksa beklemeye devam et } } } } else if (self.state === 'leaving') { if (self.moveTowards(self.leaveTarget.x, self.leaveTarget.y)) { // Remove from game for (var i = 0; i < customerList.length; i++) { if (customerList[i] === self) { customerList.splice(i, 1); break; } } self.destroy(); } } }; return self; }); // --- ENEMY CLASS --- var Enemy = Container.expand(function () { var self = Container.call(this); self.enemyType = 1; self.attack = 10; self.defense = 10; self.maxHP = 50; self.hp = 50; self.reward = 100; self.sprite = null; self.lastWasIntersecting = false; self.x = 0; self.y = 0; self.setType = function (type, powerScale) { self.enemyType = type; var assetId = 'enemy' + type; if (self.sprite) self.sprite.destroy(); self.sprite = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); // --- Add health bar above enemy sprite --- if (self.hpBar) { self.hpBar.destroy(); self.hpBar = null; } self.hpBarBg = new Container(); self.hpBar = new Container(); // Bar background (gray) var barBg = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: self.sprite.width * 0.9, height: 18, color: 0x444444, shape: 'box' }); self.hpBarBg.addChild(barBg); // Bar foreground (green, will be scaled) self.hpBar.bar = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: self.sprite.width * 0.88, height: 12, color: 0x4caf50, shape: 'box' }); self.hpBar.addChild(self.hpBar.bar); // Position bar above the sprite self.hpBarBg.x = 0; self.hpBarBg.y = -self.sprite.height / 2 - 18; self.hpBar.x = 0; self.hpBar.y = -self.sprite.height / 2 - 18; self.addChild(self.hpBarBg); self.addChild(self.hpBar); // Randomize stats based on powerScale (0.5 to 2.0) // Canavarların gücü %50 azaltıldı: attack ve defense 1x (eski 2x'dan düşürüldü) self.attack = Math.round((10 + type * 2 * powerScale) * 1); self.defense = Math.round((10 + type * 2 * powerScale) * 1); self.maxHP = Math.round(50 + type * 10 * powerScale); self.hp = self.maxHP; self.reward = Math.round(100 + (type - 1) * 100 * powerScale); // Not: Saldırı ve savunma 1x olarak ayarlandı (eski 2x'dan %50 azaltıldı) }; // Update health bar position and width if (self.hpBar && self.sprite) { // Keep bar above sprite self.hpBarBg.x = 0; self.hpBarBg.y = -self.sprite.height / 2 - 18; self.hpBar.x = 0; self.hpBar.y = -self.sprite.height / 2 - 18; // Update bar width (min 0) var ratio = Math.max(0, Math.min(1, self.hp / self.maxHP)); self.hpBar.bar.width = self.sprite.width * 0.88 * ratio; // Optionally, tint bar color based on health if (ratio > 0.5) { self.hpBar.bar.color = 0x4caf50; } else if (ratio > 0.2) { self.hpBar.bar.color = 0xffc107; } else { self.hpBar.bar.color = 0xf44336; } } return self; }); // Global lists for soldiers and enemy // Factory: Converts ore and wood to product over time var Factory = Container.expand(function () { var self = Container.call(this); var factorySprite = self.attachAsset('factory', { anchorX: 0.5, anchorY: 0.5 }); self.level = 1; // Factory level self.oreBuffer = 0; // ore waiting to be processed self.woodBuffer = 0; // wood waiting to be processed self.foodBuffer = 0; // food waiting to be processed // productBuffer is now an array of 10 product counts self.productBuffer = []; for (var i = 0; i < 10; i++) self.productBuffer[i] = 0; self.processTime = 120; // ticks to process one resource (was 60, now 2x slower) self.processCounter = 0; self.update = function () { // Check if we have at least 1 of each resource type if (self.oreBuffer > 0 && self.woodBuffer > 0 && self.foodBuffer > 0) { self.processCounter++; if (self.processCounter >= Math.max(10, self.processTime - (self.level - 1) * 10)) { // Consume 1 of each resource type for production self.oreBuffer--; self.woodBuffer--; self.foodBuffer--; // Pick a random product type to produce var prodType = Math.floor(Math.random() * 10); self.productBuffer[prodType]++; self.processCounter = 0; } } else { self.processCounter = 0; } }; return self; }); // Food: Spawns randomly on the game screen var Food = Container.expand(function () { var self = Container.call(this); // Pick a random food image for this food var foodImages = ['food1', 'food2', 'food3', 'food4', 'food5']; var foodImgId = foodImages[Math.floor(Math.random() * foodImages.length)]; var foodSprite = self.attachAsset(foodImgId, { anchorX: 0.5, anchorY: 0.5 }); self.foodType = foodImgId; return self; }); // Mine: Contains ore or wood, can be depleted var Mine = Container.expand(function () { var self = Container.call(this); // Pick a random resource image for this mine (33% ore, 33% wood, 33% food) var resourceImages = ['ore1', 'ore2', 'ore3', 'ore4', 'ore5', 'ore6', 'ore7', 'ore8', 'ore9', 'ore10', 'wood1', 'wood2', 'wood3', 'wood4', 'wood5', 'food1', 'food2', 'food3', 'food4', 'food5']; var resourceImgId = resourceImages[Math.floor(Math.random() * resourceImages.length)]; var mineSprite = self.attachAsset(resourceImgId, { anchorX: 0.5, anchorY: 0.5 }); self.ore = 10; // initial resource amount self.resourceType = resourceImgId.startsWith('wood') ? 'wood' : resourceImgId.startsWith('food') ? 'food' : 'ore'; // determine if this is wood, food, or ore self.setOre = function (amount) { self.ore = amount; }; return self; }); // Add level to Miner (worker) var Miner = Container.expand(function () { var self = Container.call(this); // Miner visual var minerImages = ['miner1', 'miner2', 'miner3', 'miner4', 'miner5']; var minerImgId = minerImages[Math.floor(Math.random() * minerImages.length)]; var minerSprite = self.attachAsset(minerImgId, { anchorX: 0.5, anchorY: 0.5 }); self.level = 1; // Worker level self.speed = 6; // px per tick self.state = 'idle'; // 'idle', 'toMine', 'mining', 'toFactory', 'toShop' self.target = null; // {x, y} self.carrying = null; // 'ore' or 'product' or null self.mineTarget = null; // reference to Mine self.factoryTarget = null; // reference to Factory // Mining animation state self.miningTicks = 0; self.miningDuration = 240; // 4 seconds at 60fps (ores are mined 100% slower, now 2x slower) self.pickaxeIcon = null; // Set miner to go to a mine self.goToMine = function (mine) { self.state = 'toMine'; self.target = { x: mine.x, y: mine.y }; self.mineTarget = mine; }; // Set miner to go to factory self.goToFactory = function (factory) { self.state = 'toFactory'; self.target = { x: factory.x, y: factory.y }; self.factoryTarget = factory; }; // Set miner to idle self.setIdle = function () { self.state = 'idle'; self.target = null; self.mineTarget = null; self.factoryTarget = null; self.miningTicks = 0; if (self.pickaxeIcon) { self.pickaxeIcon.destroy(); self.pickaxeIcon = null; } }; // Move towards target self.moveTowards = function (tx, ty) { var dx = tx - self.x; var dy = ty - self.y; var dist = Math.sqrt(dx * dx + dy * dy); var moveSpeed = (self.speed + (self.level - 1) * 1) * getMoveMultiplier(self.level); if (dist < moveSpeed) { self.x = tx; self.y = ty; return true; } self.x += dx / dist * moveSpeed; self.y += dy / dist * moveSpeed; return false; }; // Called every tick self.update = function () { if (self.state === 'toMine' && self.mineTarget) { if (self.moveTowards(self.mineTarget.x, self.mineTarget.y)) { // Arrived at mine if (self.mineTarget.ore > 0 && !self.carrying) { // Start mining animation self.state = 'mining'; self.miningTicks = 0; // Add pickaxe icon if not present if (!self.pickaxeIcon) { self.pickaxeIcon = LK.getAsset('pickaxe', { anchorX: 0.5, anchorY: 1.2, x: 0, y: -60 }); self.addChild(self.pickaxeIcon); } // Animate pickaxe (simple up-down) tween(self.pickaxeIcon, { y: -80 }, { duration: 200, easing: tween.cubicInOut, onFinish: function onFinish() { if (self.pickaxeIcon) { tween(self.pickaxeIcon, { y: -60 }, { duration: 200, easing: tween.cubicInOut }); } } }); } else { self.setIdle(); } } } else if (self.state === 'mining' && self.mineTarget) { self.miningTicks++; // Animate pickaxe every 20 ticks if (self.pickaxeIcon && self.miningTicks % 20 === 0) { tween(self.pickaxeIcon, { y: -80 }, { duration: 100, easing: tween.cubicInOut, onFinish: function onFinish() { if (self.pickaxeIcon) { tween(self.pickaxeIcon, { y: -60 }, { duration: 100, easing: tween.cubicInOut }); } } }); } if (self.miningTicks >= Math.max(10, self.miningDuration - (self.level - 1) * 10)) { if (self.mineTarget.ore > 0 && !self.carrying) { self.mineTarget.ore--; self.carrying = self.mineTarget.resourceType; // carry 'ore' or 'wood' based on mine type if (self.pickaxeIcon) { self.pickaxeIcon.destroy(); self.pickaxeIcon = null; } // En yakın fabrikayı bul ve oraya git var nearestFactory = null; var nearestDist = Infinity; for (var f = 0; f < factoryList.length; f++) { var fx = factoryList[f].x; var fy = factoryList[f].y; var dx = fx - self.x; var dy = fy - self.y; var dist = dx * dx + dy * dy; if (dist < nearestDist) { nearestDist = dist; nearestFactory = factoryList[f]; } } if (nearestFactory) { self.goToFactory(nearestFactory); } else { self.setIdle(); } } else { self.setIdle(); } } } else if (self.state === 'toFactory' && self.factoryTarget) { if (self.moveTowards(self.factoryTarget.x, self.factoryTarget.y)) { // Arrived at factory if (self.carrying === 'ore') { self.carrying = null; self.factoryTarget.oreBuffer++; if (self._transferToFactory && self._transferType === 'ore') { // Ore transferi başlatıldıysa, şimdi ore alıp diğer fabrikaya götür self.carrying = 'ore'; self.factoryTarget.oreBuffer--; var dest = self._transferToFactory; self.state = 'toFactory'; self.target = { x: dest.x, y: dest.y }; self.factoryTarget = dest; self._transferToFactory = null; self._transferType = null; } else { self.setIdle(); } } else if (self.carrying === 'wood') { self.carrying = null; self.factoryTarget.woodBuffer++; self.setIdle(); } else if (self.carrying === 'food') { self.carrying = null; self.factoryTarget.foodBuffer++; self.setIdle(); } else if (self._transferToFactory && self._transferType === 'ore') { // Ore transferi için ilk varış, ore al ve diğer fabrikaya git if (self.factoryTarget.oreBuffer > 0) { self.carrying = 'ore'; self.factoryTarget.oreBuffer--; var dest = self._transferToFactory; self.state = 'toFactory'; self.target = { x: dest.x, y: dest.y }; self.factoryTarget = dest; self._transferToFactory = null; self._transferType = null; } else { self.setIdle(); } } else { self.setIdle(); } } } else if (self.state === 'idle') { // Find nearest mine with ore only (not wood or food) var bestMine = null; var bestDist = Infinity; for (var i = 0; i < mineList.length; i++) { var m = mineList[i]; if (m.ore > 0 && m.resourceType === 'ore') { var dx = m.x - self.x; var dy = m.y - self.y; var d = dx * dx + dy * dy; if (d < bestDist) { bestDist = d; bestMine = m; } } } if (bestMine) { self.goToMine(bestMine); } else { // --- Fabrikalar arası eksik hammaddeyi eşitlemek için getir götür --- // Sadece idle ise ve üzerinde yük yoksa // Sadece 'ore' için var fromFactory = null; var toFactory = null; var maxBuffer = -1; var minBuffer = 999999; // Farklı fabrikalar arasında en çok ve en az oreBuffer olanı bul for (var i = 0; i < factoryList.length; i++) { if (factoryList[i].oreBuffer > maxBuffer) { maxBuffer = factoryList[i].oreBuffer; fromFactory = factoryList[i]; } if (factoryList[i].oreBuffer < minBuffer) { minBuffer = factoryList[i].oreBuffer; toFactory = factoryList[i]; } } // Eğer fark 2 veya daha fazlaysa ve fromFactory'de en az 1 ore varsa taşı if (fromFactory && toFactory && fromFactory !== toFactory && maxBuffer - minBuffer >= 2 && fromFactory.oreBuffer > 0) { // Madenci, fromFactory'ye gidip ore alacak self.state = 'toFactory'; self.target = { x: fromFactory.x, y: fromFactory.y }; self.factoryTarget = fromFactory; self.carrying = null; // Taşıma işlemi: fromFactory'ye varınca ore alacak, sonra toFactory'ye götürecek self._transferToFactory = toFactory; self._transferType = 'ore'; } } } }; return self; }); // Oduncu: Collects wood from mines with resourceType 'wood' only var Oduncu = Container.expand(function () { var self = Container.call(this); // Oduncu visual var oduncuImages = ['oduncu1', 'oduncu2', 'oduncu3', 'oduncu4', 'oduncu5']; var oduncuImgId = oduncuImages[Math.floor(Math.random() * oduncuImages.length)]; var oduncuSprite = self.attachAsset(oduncuImgId, { anchorX: 0.5, anchorY: 0.5 }); self.level = 1; // Worker level self.speed = 6; // px per tick self.state = 'idle'; // 'idle', 'toMine', 'mining', 'toFactory', 'toShop' self.target = null; // {x, y} self.carrying = null; // 'wood' or 'product' or null self.mineTarget = null; // reference to Mine self.factoryTarget = null; // reference to Factory // Mining animation state self.miningTicks = 0; self.miningDuration = 240; // 4 seconds at 60fps (ores are mined 100% slower, now 2x slower) self.pickaxeIcon = null; // Set oduncu to go to a mine self.goToMine = function (mine) { self.state = 'toMine'; self.target = { x: mine.x, y: mine.y }; self.mineTarget = mine; }; // Set oduncu to go to factory self.goToFactory = function (factory) { self.state = 'toFactory'; self.target = { x: factory.x, y: factory.y }; self.factoryTarget = factory; }; // Set oduncu to idle self.setIdle = function () { self.state = 'idle'; self.target = null; self.mineTarget = null; self.factoryTarget = null; self.miningTicks = 0; if (self.pickaxeIcon) { self.pickaxeIcon.destroy(); self.pickaxeIcon = null; } }; // Move towards target self.moveTowards = function (tx, ty) { var dx = tx - self.x; var dy = ty - self.y; var dist = Math.sqrt(dx * dx + dy * dy); var moveSpeed = (self.speed + (self.level - 1) * 1) * getMoveMultiplier(self.level); if (dist < moveSpeed) { self.x = tx; self.y = ty; return true; } self.x += dx / dist * moveSpeed; self.y += dy / dist * moveSpeed; return false; }; // Called every tick self.update = function () { if (self.state === 'toMine' && self.mineTarget) { if (self.moveTowards(self.mineTarget.x, self.mineTarget.y)) { // Arrived at mine if (self.mineTarget.ore > 0 && !self.carrying) { // Start mining animation self.state = 'mining'; self.miningTicks = 0; // Add pickaxe icon if not present if (!self.pickaxeIcon) { self.pickaxeIcon = LK.getAsset('pickaxe', { anchorX: 0.5, anchorY: 1.2, x: 0, y: -60 }); self.addChild(self.pickaxeIcon); } // Animate pickaxe (simple up-down) tween(self.pickaxeIcon, { y: -80 }, { duration: 200, easing: tween.cubicInOut, onFinish: function onFinish() { if (self.pickaxeIcon) { tween(self.pickaxeIcon, { y: -60 }, { duration: 200, easing: tween.cubicInOut }); } } }); } else { self.setIdle(); } } } else if (self.state === 'mining' && self.mineTarget) { self.miningTicks++; // Animate pickaxe every 20 ticks if (self.pickaxeIcon && self.miningTicks % 20 === 0) { tween(self.pickaxeIcon, { y: -80 }, { duration: 100, easing: tween.cubicInOut, onFinish: function onFinish() { if (self.pickaxeIcon) { tween(self.pickaxeIcon, { y: -60 }, { duration: 100, easing: tween.cubicInOut }); } } }); } if (self.miningTicks >= Math.max(10, self.miningDuration - (self.level - 1) * 10)) { if (self.mineTarget.ore > 0 && !self.carrying) { self.mineTarget.ore--; self.carrying = self.mineTarget.resourceType; // carry 'ore' or 'wood' based on mine type if (self.pickaxeIcon) { self.pickaxeIcon.destroy(); self.pickaxeIcon = null; } // En yakın fabrikayı bul ve oraya git var nearestFactory = null; var nearestDist = Infinity; for (var f = 0; f < factoryList.length; f++) { var fx = factoryList[f].x; var fy = factoryList[f].y; var dx = fx - self.x; var dy = fy - self.y; var dist = dx * dx + dy * dy; if (dist < nearestDist) { nearestDist = dist; nearestFactory = factoryList[f]; } } if (nearestFactory) { self.goToFactory(nearestFactory); } else { self.setIdle(); } } else { self.setIdle(); } } } else if (self.state === 'toFactory' && self.factoryTarget) { if (self.moveTowards(self.factoryTarget.x, self.factoryTarget.y)) { // Arrived at factory if (self.carrying === 'ore') { self.carrying = null; self.factoryTarget.oreBuffer++; self.setIdle(); } else if (self.carrying === 'wood') { self.carrying = null; self.factoryTarget.woodBuffer++; if (self._transferToFactory && self._transferType === 'wood') { // Wood transferi başlatıldıysa, şimdi wood alıp diğer fabrikaya götür self.carrying = 'wood'; self.factoryTarget.woodBuffer--; var dest = self._transferToFactory; self.state = 'toFactory'; self.target = { x: dest.x, y: dest.y }; self.factoryTarget = dest; self._transferToFactory = null; self._transferType = null; } else { self.setIdle(); } } else if (self.carrying === 'food') { self.carrying = null; self.factoryTarget.foodBuffer++; self.setIdle(); } else if (self._transferToFactory && self._transferType === 'wood') { // Wood transferi için ilk varış, wood al ve diğer fabrikaya git if (self.factoryTarget.woodBuffer > 0) { self.carrying = 'wood'; self.factoryTarget.woodBuffer--; var dest = self._transferToFactory; self.state = 'toFactory'; self.target = { x: dest.x, y: dest.y }; self.factoryTarget = dest; self._transferToFactory = null; self._transferType = null; } else { self.setIdle(); } } else { self.setIdle(); } } } else if (self.state === 'idle') { // Find nearest mine with wood only (not ore or food) var bestMine = null; var bestDist = Infinity; for (var i = 0; i < mineList.length; i++) { var m = mineList[i]; if (m.ore > 0 && m.resourceType === 'wood') { var dx = m.x - self.x; var dy = m.y - self.y; var d = dx * dx + dy * dy; if (d < bestDist) { bestDist = d; bestMine = m; } } } if (bestMine) { self.goToMine(bestMine); } else { // --- Fabrikalar arası eksik odunu eşitlemek için getir götür --- // Sadece idle ise ve üzerinde yük yoksa // Sadece 'wood' için var fromFactory = null; var toFactory = null; var maxBuffer = -1; var minBuffer = 999999; // Farklı fabrikalar arasında en çok ve en az woodBuffer olanı bul for (var i = 0; i < factoryList.length; i++) { if (factoryList[i].woodBuffer > maxBuffer) { maxBuffer = factoryList[i].woodBuffer; fromFactory = factoryList[i]; } if (factoryList[i].woodBuffer < minBuffer) { minBuffer = factoryList[i].woodBuffer; toFactory = factoryList[i]; } } // Eğer fark 2 veya daha fazlaysa ve fromFactory'de en az 1 wood varsa taşı if (fromFactory && toFactory && fromFactory !== toFactory && maxBuffer - minBuffer >= 2 && fromFactory.woodBuffer > 0) { // Oduncu, fromFactory'ye gidip wood alacak self.state = 'toFactory'; self.target = { x: fromFactory.x, y: fromFactory.y }; self.factoryTarget = fromFactory; self.carrying = null; // Taşıma işlemi: fromFactory'ye varınca wood alacak, sonra toFactory'ye götürecek self._transferToFactory = toFactory; self._transferType = 'wood'; } } } }; return self; }); // Researcher: When a mine is depleted, finds a new mine location and spawns it var Researcher = Container.expand(function () { var self = Container.call(this); // Visual for researcher var researcherSprite = self.attachAsset('miner', { anchorX: 0.5, anchorY: 0.5 }); researcherSprite.tint = 0x1a8ffc; // blue tint for distinction self.speed = 5; self.state = 'idle'; // 'idle', 'moving', 'researching' self.target = null; self.researchTicks = 0; self.researchDuration = 90; // 1.5 seconds self.moveTowards = function (tx, ty) { var dx = tx - self.x; var dy = ty - self.y; var dist = Math.sqrt(dx * dx + dy * dy); var moveSpeed = self.speed * getMoveMultiplier(1); // Researchers have no level, always use 1 if (dist < moveSpeed) { self.x = tx; self.y = ty; return true; } self.x += dx / dist * moveSpeed; self.y += dy / dist * moveSpeed; return false; }; self.startResearch = function (tx, ty) { self.state = 'moving'; self.target = { x: tx, y: ty }; self.researchTicks = 0; }; self.update = function () { if (self.state === 'moving' && self.target) { if (self.moveTowards(self.target.x, self.target.y)) { // If we just finished research, set to idle after returning to start if (self.researchTicks >= self.researchDuration) { self.state = 'idle'; self.target = null; self.researchTicks = 0; } else { self.state = 'researching'; self.researchTicks = 0; } } } else if (self.state === 'researching') { self.researchTicks++; if (self.researchTicks >= self.researchDuration) { // Spawn new mine at this location var mine = new Mine(); mine.x = self.x; mine.y = self.y; mineList.push(mine); game.addChild(mine); // After finding ore, move researcher to starting position and wait there self.state = 'moving'; self.target = { x: 1024, // worker start image x y: 2400 // worker start image y }; } } else if (self.state === 'idle') { // --- Yeni: Stokta en az olan hammaddeyi bulup ona öncelik ver --- // Her fabrika için oreBuffer, woodBuffer, foodBuffer toplamlarını hesapla var oreTotal = 0, woodTotal = 0, foodTotal = 0; for (var i = 0; i < factoryList.length; i++) { oreTotal += factoryList[i].oreBuffer || 0; woodTotal += factoryList[i].woodBuffer || 0; foodTotal += factoryList[i].foodBuffer || 0; } // Hangi hammadde en azsa onu bul var minVal = Math.min(oreTotal, woodTotal, foodTotal); var minTypes = []; if (oreTotal === minVal) minTypes.push('ore'); if (woodTotal === minVal) minTypes.push('wood'); if (foodTotal === minVal) minTypes.push('food'); // Eğer birden fazla eşitse rastgele seç var targetType = minTypes[Math.floor(Math.random() * minTypes.length)]; // O tipten haritada kaç tane var? var oreCount = 0, woodCount = 0, foodCount = 0; for (var i = 0; i < mineList.length; i++) { if (mineList[i].resourceType === 'ore') oreCount++; if (mineList[i].resourceType === 'wood') woodCount++; if (mineList[i].resourceType === 'food') foodCount++; } var treeCount = treeList.length; // Her tip için maksimum 4 tane olsun var needOre = targetType === 'ore' && oreCount < 4; var needWood = targetType === 'wood' && treeCount < 4; var needFood = targetType === 'food' && foodCount < 4; if (needOre || needWood || needFood) { // Yeni madenin tipine göre random bir konum seç var tx = 300 + Math.random() * 1400; var ty = 600 + Math.random() * 600; self.startResearch(tx, ty); } } }; return self; }); // Shop: Holds products for sale, customers come to buy var Shop = Container.expand(function () { var self = Container.call(this); var shopSprite = self.attachAsset('shop', { anchorX: 0.5, anchorY: 0.5 }); // productBuffer is now an array of 10 product counts self.productBuffer = []; for (var i = 0; i < 10; i++) self.productBuffer[i] = 0; self.level = 1; return self; }); // --- SOLDIER CLASS --- var Soldier = Container.expand(function () { var self = Container.call(this); // type: 'yaya', 'okcu', 'mizrakci', 'zirhli', 'atli' self.soldierType = 'yaya'; self.state = 'idle'; // 'idle', 'moving', 'fighting', 'returning' self.targetEnemy = null; self.targetPos = null; self.lastX = 0; self.lastY = 0; self.lastWasIntersecting = false; self.attack = 1; self.defense = 1; self.speed = 3; self.reward = 0; self.sprite = null; self.setType = function (type) { self.soldierType = type; var assetId = 'soldier_' + type; if (self.sprite) self.sprite.destroy(); self.sprite = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); // Set stats with 1.5x power scaling if (type === 'yaya') { self.attack = 10; self.defense = 8; self.speed = 3; } else if (type === 'okcu') { // 1.5x stronger than yaya: (10+8) * 1.5 = 27 total power self.attack = 15; self.defense = 12; self.speed = 3.5; } else if (type === 'mizrakci') { // 1.5x stronger than okcu: 27 * 1.5 = 40.5 total power self.attack = 22; self.defense = 18; self.speed = 3; } else if (type === 'zirhli') { // 1.5x stronger than mizrakci: 40 * 1.5 = 60 total power self.attack = 33; self.defense = 27; self.speed = 2.2; } else if (type === 'atli') { // 1.5x stronger than zirhli: 60 * 1.5 = 90 total power self.attack = 50; self.defense = 40; self.speed = 4.2; } }; self.goTo = function (x, y) { self.state = 'moving'; self.targetPos = { x: x, y: y }; }; self.returnToHQ = function () { // Karargah binasına dön self.state = 'returning'; self.targetPos = { x: karargahImg.x, y: karargahImg.y + 80 }; }; self.update = function () { if (self.state === 'idle') return; if (self.state === 'moving' && self.targetPos) { var dx = self.targetPos.x - self.x; var dy = self.targetPos.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < self.speed) { self.x = self.targetPos.x; self.y = self.targetPos.y; if (self.targetEnemy) { self.state = 'fighting'; } else { self.state = 'idle'; } } else { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } } else if (self.state === 'fighting' && self.targetEnemy) { // Fight logic handled in game.update } else if (self.state === 'returning' && self.targetPos) { var dx = self.targetPos.x - self.x; var dy = self.targetPos.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < self.speed) { self.x = self.targetPos.x; self.y = self.targetPos.y; self.state = 'idle'; } else { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } } self.lastX = self.x; self.lastY = self.y; }; return self; }); // Toplayıcı: Collects food from mines with resourceType 'food' only var Toplayici = Container.expand(function () { var self = Container.call(this); // Toplayıcı visual var toplayiciImages = ['toplayici1', 'toplayici2', 'toplayici3', 'toplayici4', 'toplayici5']; var toplayiciImgId = toplayiciImages[Math.floor(Math.random() * toplayiciImages.length)]; var toplayiciSprite = self.attachAsset(toplayiciImgId, { anchorX: 0.5, anchorY: 0.5 }); self.level = 1; // Worker level self.speed = 6; // px per tick self.state = 'idle'; // 'idle', 'toMine', 'mining', 'toFactory', 'toShop' self.target = null; // {x, y} self.carrying = null; // 'food' or 'product' or null self.mineTarget = null; // reference to Mine self.factoryTarget = null; // reference to Factory // Mining animation state self.miningTicks = 0; self.miningDuration = 240; // 4 seconds at 60fps (ores are mined 100% slower, now 2x slower) self.pickaxeIcon = null; // Set toplayıcı to go to a mine self.goToMine = function (mine) { self.state = 'toMine'; self.target = { x: mine.x, y: mine.y }; self.mineTarget = mine; }; // Set toplayıcı to go to factory self.goToFactory = function (factory) { self.state = 'toFactory'; self.target = { x: factory.x, y: factory.y }; self.factoryTarget = factory; }; // Set toplayıcı to idle self.setIdle = function () { self.state = 'idle'; self.target = null; self.mineTarget = null; self.factoryTarget = null; self.miningTicks = 0; if (self.pickaxeIcon) { self.pickaxeIcon.destroy(); self.pickaxeIcon = null; } }; // Move towards target self.moveTowards = function (tx, ty) { var dx = tx - self.x; var dy = ty - self.y; var dist = Math.sqrt(dx * dx + dy * dy); var moveSpeed = (self.speed + (self.level - 1) * 1) * getMoveMultiplier(self.level); if (dist < moveSpeed) { self.x = tx; self.y = ty; return true; } self.x += dx / dist * moveSpeed; self.y += dy / dist * moveSpeed; return false; }; // Called every tick self.update = function () { if (self.state === 'toMine' && self.mineTarget) { if (self.moveTowards(self.mineTarget.x, self.mineTarget.y)) { // Arrived at mine if (self.mineTarget.ore > 0 && !self.carrying) { // Start mining animation self.state = 'mining'; self.miningTicks = 0; // Add pickaxe icon if not present if (!self.pickaxeIcon) { self.pickaxeIcon = LK.getAsset('pickaxe', { anchorX: 0.5, anchorY: 1.2, x: 0, y: -60 }); self.addChild(self.pickaxeIcon); } // Animate pickaxe (simple up-down) tween(self.pickaxeIcon, { y: -80 }, { duration: 200, easing: tween.cubicInOut, onFinish: function onFinish() { if (self.pickaxeIcon) { tween(self.pickaxeIcon, { y: -60 }, { duration: 200, easing: tween.cubicInOut }); } } }); } else { self.setIdle(); } } } else if (self.state === 'mining' && self.mineTarget) { self.miningTicks++; // Animate pickaxe every 20 ticks if (self.pickaxeIcon && self.miningTicks % 20 === 0) { tween(self.pickaxeIcon, { y: -80 }, { duration: 100, easing: tween.cubicInOut, onFinish: function onFinish() { if (self.pickaxeIcon) { tween(self.pickaxeIcon, { y: -60 }, { duration: 100, easing: tween.cubicInOut }); } } }); } if (self.miningTicks >= Math.max(10, self.miningDuration - (self.level - 1) * 10)) { if (self.mineTarget.ore > 0 && !self.carrying) { self.mineTarget.ore--; self.carrying = self.mineTarget.resourceType; // carry 'ore' or 'wood' based on mine type if (self.pickaxeIcon) { self.pickaxeIcon.destroy(); self.pickaxeIcon = null; } // En yakın fabrikayı bul ve oraya git var nearestFactory = null; var nearestDist = Infinity; for (var f = 0; f < factoryList.length; f++) { var fx = factoryList[f].x; var fy = factoryList[f].y; var dx = fx - self.x; var dy = fy - self.y; var dist = dx * dx + dy * dy; if (dist < nearestDist) { nearestDist = dist; nearestFactory = factoryList[f]; } } if (nearestFactory) { self.goToFactory(nearestFactory); } else { self.setIdle(); } } else { self.setIdle(); } } } else if (self.state === 'toFactory' && self.factoryTarget) { if (self.moveTowards(self.factoryTarget.x, self.factoryTarget.y)) { // Arrived at factory if (self.carrying === 'ore') { self.carrying = null; self.factoryTarget.oreBuffer++; self.setIdle(); } else if (self.carrying === 'wood') { self.carrying = null; self.factoryTarget.woodBuffer++; self.setIdle(); } else if (self.carrying === 'food') { self.carrying = null; self.factoryTarget.foodBuffer++; if (self._transferToFactory && self._transferType === 'food') { // Food transferi başlatıldıysa, şimdi food alıp diğer fabrikaya götür self.carrying = 'food'; self.factoryTarget.foodBuffer--; var dest = self._transferToFactory; self.state = 'toFactory'; self.target = { x: dest.x, y: dest.y }; self.factoryTarget = dest; self._transferToFactory = null; self._transferType = null; } else { self.setIdle(); } } else if (self._transferToFactory && self._transferType === 'food') { // Food transferi için ilk varış, food al ve diğer fabrikaya git if (self.factoryTarget.foodBuffer > 0) { self.carrying = 'food'; self.factoryTarget.foodBuffer--; var dest = self._transferToFactory; self.state = 'toFactory'; self.target = { x: dest.x, y: dest.y }; self.factoryTarget = dest; self._transferToFactory = null; self._transferType = null; } else { self.setIdle(); } } else { self.setIdle(); } } } else if (self.state === 'idle') { // Find nearest mine with food only (not ore or wood) var bestMine = null; var bestDist = Infinity; for (var i = 0; i < mineList.length; i++) { var m = mineList[i]; if (m.ore > 0 && m.resourceType === 'food') { var dx = m.x - self.x; var dy = m.y - self.y; var d = dx * dx + dy * dy; if (d < bestDist) { bestDist = d; bestMine = m; } } } if (bestMine) { self.goToMine(bestMine); } else { // --- Fabrikalar arası eksik yiyeceği eşitlemek için getir götür --- // Sadece idle ise ve üzerinde yük yoksa // Sadece 'food' için var fromFactory = null; var toFactory = null; var maxBuffer = -1; var minBuffer = 999999; // Farklı fabrikalar arasında en çok ve en az foodBuffer olanı bul for (var i = 0; i < factoryList.length; i++) { if (factoryList[i].foodBuffer > maxBuffer) { maxBuffer = factoryList[i].foodBuffer; fromFactory = factoryList[i]; } if (factoryList[i].foodBuffer < minBuffer) { minBuffer = factoryList[i].foodBuffer; toFactory = factoryList[i]; } } // Eğer fark 2 veya daha fazlaysa ve fromFactory'de en az 1 food varsa taşı if (fromFactory && toFactory && fromFactory !== toFactory && maxBuffer - minBuffer >= 2 && fromFactory.foodBuffer > 0) { // Toplayıcı, fromFactory'ye gidip food alacak self.state = 'toFactory'; self.target = { x: fromFactory.x, y: fromFactory.y }; self.factoryTarget = fromFactory; self.carrying = null; // Taşıma işlemi: fromFactory'ye varınca food alacak, sonra toFactory'ye götürecek self._transferToFactory = toFactory; self._transferType = 'food'; } } } }; return self; }); // ÇALIŞANLAR PANELİ başlık, buton ve sayıları başta gizle // No background, no music, no sound, as per requirements // End of MVP code; // Tree: Spawns randomly on the game screen var Tree = Container.expand(function () { var self = Container.call(this); // Pick a random tree image for this tree var treeImages = ['wood1', 'wood2', 'wood3', 'wood4', 'wood5']; var treeImgId = treeImages[Math.floor(Math.random() * treeImages.length)]; var treeSprite = self.attachAsset(treeImgId, { anchorX: 0.5, anchorY: 0.5 }); self.treeType = treeImgId; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Global lists for soldiers and enemy // Enemy assets (10 types) // Soldier assets // Add a background image to the game var soldierList = []; var currentEnemy = null; var lastEnemyDefeatedTime = 0; var enemyCooldown = 600; // --- KERVAN SİSTEMİ --- // Kervan paneli ve state var caravanPanelBg = LK.getAsset('businessPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 1.1, scaleY: 1.1 }); caravanPanelBg.alpha = 0.97; caravanPanelBg.visible = false; game.addChild(caravanPanelBg); // --- Kervan Panel Butonu: Business paneli üstünde --- // Buton businessPanel.panelBg'nin üstünde, ortalanmış şekilde var businessPanelCaravanBtn = new Text2('Kervan', { size: 36, fill: "#fff", fontWeight: "bold" }); businessPanelCaravanBtn.anchor.set(0.5, 0.5); // Defensive: businessPanel ve panelBg'nin varlığını kontrol et if (typeof businessPanel !== "undefined" && businessPanel.panelBg) { businessPanelCaravanBtn.x = businessPanel.panelBg.x; businessPanelCaravanBtn.y = businessPanel.panelBg.y - businessPanel.panelBg.height / 2 + 30; } else { businessPanelCaravanBtn.x = 1024; businessPanelCaravanBtn.y = 900 - 650 * 1.1 / 2 + 30; } businessPanelCaravanBtn.visible = true; game.addChild(businessPanelCaravanBtn); // Butona tıklanınca kervan panelini aç businessPanelCaravanBtn.down = function () { // Artık işlev kervan sprite'ına taşındı, burada bir şey yapılmıyor. }; var caravanPanelTitle = new Text2('Kervan Ticareti', { size: 42, fill: "#000", fontWeight: "bold" }); caravanPanelTitle.anchor.set(0.5, 0.5); caravanPanelTitle.x = caravanPanelBg.x; caravanPanelTitle.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 60; caravanPanelTitle.visible = false; game.addChild(caravanPanelTitle); var caravanPanelContent = new Text2('', { size: 32, fill: "#000" }); caravanPanelContent.anchor.set(0.5, 0); caravanPanelContent.x = caravanPanelBg.x; caravanPanelContent.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 120; caravanPanelContent.visible = false; game.addChild(caravanPanelContent); var caravanPanelCloseIcon = new Text2('✕', { size: 42, fill: 0xFF0000, fontWeight: "bold" }); caravanPanelCloseIcon.anchor.set(0.5, 0.5); caravanPanelCloseIcon.x = caravanPanelBg.x + caravanPanelBg.width / 2 - 30; caravanPanelCloseIcon.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 30; caravanPanelCloseIcon.visible = false; game.addChild(caravanPanelCloseIcon); var caravanPanelBuyBtn = new Text2('Kervandan Al', { size: 36, fill: 0x2E7D32, fontWeight: "bold" }); caravanPanelBuyBtn.anchor.set(0.5, 0.5); caravanPanelBuyBtn.x = caravanPanelBg.x - 120; caravanPanelBuyBtn.y = caravanPanelBg.y + caravanPanelBg.height / 2 - 60; caravanPanelBuyBtn.visible = false; game.addChild(caravanPanelBuyBtn); var caravanPanelSellBtn = new Text2('Kervana Sat', { size: 36, fill: 0xD32F2F, fontWeight: "bold" }); caravanPanelSellBtn.anchor.set(0.5, 0.5); caravanPanelSellBtn.x = caravanPanelBg.x + 120; caravanPanelSellBtn.y = caravanPanelBg.y + caravanPanelBg.height / 2 - 60; caravanPanelSellBtn.visible = false; game.addChild(caravanPanelSellBtn); var caravanPanelConfirmBtn = new Text2('Ticareti Onayla', { size: 36, fill: 0x1565C0, fontWeight: "bold" }); caravanPanelConfirmBtn.anchor.set(0.5, 0.5); caravanPanelConfirmBtn.x = caravanPanelBg.x; caravanPanelConfirmBtn.y = caravanPanelBg.y + caravanPanelBg.height / 2 - 10; caravanPanelConfirmBtn.visible = false; game.addChild(caravanPanelConfirmBtn); // --- Kervan paneli: miktar artır/azalt butonları (her ürün ve hammadde için) --- var caravanPanelMatPlusBtn = new Text2('+', { size: 36, fill: 0x388E3C, fontWeight: "bold" }); caravanPanelMatPlusBtn.anchor.set(0.5, 0.5); caravanPanelMatPlusBtn.x = caravanPanelBg.x - 220; caravanPanelMatPlusBtn.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 180; caravanPanelMatPlusBtn.visible = false; game.addChild(caravanPanelMatPlusBtn); var caravanPanelMatMinusBtn = new Text2('-', { size: 36, fill: 0xD32F2F, fontWeight: "bold" }); caravanPanelMatMinusBtn.anchor.set(0.5, 0.5); caravanPanelMatMinusBtn.x = caravanPanelBg.x - 170; caravanPanelMatMinusBtn.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 180; caravanPanelMatMinusBtn.visible = false; game.addChild(caravanPanelMatMinusBtn); var caravanPanelMatSellPlusBtn = new Text2('+', { size: 36, fill: 0x388E3C, fontWeight: "bold" }); caravanPanelMatSellPlusBtn.anchor.set(0.5, 0.5); caravanPanelMatSellPlusBtn.x = caravanPanelBg.x + 170; caravanPanelMatSellPlusBtn.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 180; caravanPanelMatSellPlusBtn.visible = false; game.addChild(caravanPanelMatSellPlusBtn); var caravanPanelMatSellMinusBtn = new Text2('-', { size: 36, fill: 0xD32F2F, fontWeight: "bold" }); caravanPanelMatSellMinusBtn.anchor.set(0.5, 0.5); caravanPanelMatSellMinusBtn.x = caravanPanelBg.x + 220; caravanPanelMatSellMinusBtn.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 180; caravanPanelMatSellMinusBtn.visible = false; game.addChild(caravanPanelMatSellMinusBtn); // Ürünler için butonlar (5 ürün) var caravanPanelProdPlusBtns = []; var caravanPanelProdMinusBtns = []; var caravanPanelProdSellPlusBtns = []; var caravanPanelProdSellMinusBtns = []; for (var i = 0; i < 5; i++) { var plusBtn = new Text2('+', { size: 36, fill: 0x388E3C, fontWeight: "bold" }); plusBtn.anchor.set(0.5, 0.5); plusBtn.x = caravanPanelBg.x - 220; plusBtn.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 230 + i * 40; plusBtn.visible = false; game.addChild(plusBtn); caravanPanelProdPlusBtns.push(plusBtn); var minusBtn = new Text2('-', { size: 36, fill: 0xD32F2F, fontWeight: "bold" }); minusBtn.anchor.set(0.5, 0.5); minusBtn.x = caravanPanelBg.x - 170; minusBtn.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 230 + i * 40; minusBtn.visible = false; game.addChild(minusBtn); caravanPanelProdMinusBtns.push(minusBtn); var sellPlusBtn = new Text2('+', { size: 36, fill: 0x388E3C, fontWeight: "bold" }); sellPlusBtn.anchor.set(0.5, 0.5); sellPlusBtn.x = caravanPanelBg.x + 170; sellPlusBtn.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 230 + i * 40; sellPlusBtn.visible = false; game.addChild(sellPlusBtn); caravanPanelProdSellPlusBtns.push(sellPlusBtn); var sellMinusBtn = new Text2('-', { size: 36, fill: 0xD32F2F, fontWeight: "bold" }); sellMinusBtn.anchor.set(0.5, 0.5); sellMinusBtn.x = caravanPanelBg.x + 220; sellMinusBtn.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 230 + i * 40; sellMinusBtn.visible = false; game.addChild(sellMinusBtn); caravanPanelProdSellMinusBtns.push(sellMinusBtn); } var caravanPanelInfoTxt = new Text2('', { size: 28, fill: "#000" }); caravanPanelInfoTxt.anchor.set(0.5, 0); caravanPanelInfoTxt.x = caravanPanelBg.x; caravanPanelInfoTxt.y = caravanPanelBg.y + 40; caravanPanelInfoTxt.visible = false; game.addChild(caravanPanelInfoTxt); // Kervan state var caravan = null; var caravanActive = false; var caravanArrived = false; var caravanPanelOpen = false; var caravanTradeMade = false; var caravanTimeout = null; var caravanNextArrivalTick = 0; // İlk başta hemen spawn edilebilsin var caravanStock = null; var caravanBuyAmounts = {}; var caravanSellAmounts = {}; var caravanLastPanelOpenTick = 0; // Defensive: Oyun başında kervan state'ini sıfırla caravanActive = false; caravanArrived = false; caravanPanelOpen = false; caravanTradeMade = false; caravanTimeout = null; caravanNextArrivalTick = 0; // Kervan stoğu ve fiyatları oluştur function generateCaravanStock() { // Hammadde: min 5, max 30 var minMat = 5 + Math.floor(Math.random() * 6); // 5-10 var maxMat = 25 + Math.floor(Math.random() * 6); // 25-30 var matCount = minMat + Math.floor(Math.random() * (maxMat - minMat + 1)); // 5 çeşit ürün, her biri 1-20 adet var productIndexes = []; while (productIndexes.length < 5) { // Defensive: check productTypes is defined and is an array with length > 0 if (!productTypes || !productTypes.length) { break; // Prevent crash if productTypes is undefined or empty } var idx = Math.floor(Math.random() * productTypes.length); if (productIndexes.indexOf(idx) === -1) productIndexes.push(idx); } var products = []; for (var i = 0; i < 5; i++) { products.push({ idx: productIndexes[i], count: 1 + Math.floor(Math.random() * 20) }); } // Hammadde türü: rastgele 'ore', 'wood', 'food' var matTypes = ['ore', 'wood', 'food']; var matType = matTypes[Math.floor(Math.random() * matTypes.length)]; return { matType: matType, matCount: matCount, products: products }; } // Kervan fiyatlarını hesapla function getCaravanBuyPrice(type, idx) { // Kervandan almak: %10 zamlı if (type === 'mat') { // Hammadde fiyatı: 10 return Math.round(10 * 1.1); } else if (type === 'product') { if (!productTypes || !productTypes[idx] || typeof productTypes[idx].price === "undefined") { return 0; } return Math.round(productTypes[idx].price * 1.1); } return 0; } function getCaravanSellPrice(type, idx) { // Kervana satmak: %10 zararına if (type === 'mat') { return Math.round(10 * 0.9); } else if (type === 'product') { if (!productTypes || !productTypes[idx] || typeof productTypes[idx].price === "undefined") { return 0; } return Math.round(productTypes[idx].price * 0.9); } return 0; } // Kervan panelini güncelle function updateCaravanPanel() { if (!caravanStock) return; var lines = []; lines.push("Kervan Stoğu:"); // Hammadde satırında miktar seçimi göster var buyMat = caravanBuyAmounts.mat || 0; var sellMat = caravanSellAmounts.mat || 0; lines.push("Hammadde (" + caravanStock.matType + "): " + caravanStock.matCount + " adet (₺" + getCaravanBuyPrice('mat') + " /adet)" + " [Al: +" + buyMat + " | Sat: -" + sellMat + "]"); for (var i = 0; i < caravanStock.products.length; i++) { var p = caravanStock.products[i]; var buyKey = "prod" + i; var sellKey = "prod" + i; var buyProd = caravanBuyAmounts[buyKey] || 0; var sellProd = caravanSellAmounts[sellKey] || 0; if (productTypes && productTypes[p.idx]) { lines.push(productTypes[p.idx].name + ": " + p.count + " adet (₺" + getCaravanBuyPrice('product', p.idx) + " /adet)" + " [Al: +" + buyProd + " | Sat: -" + sellProd + "]"); } else { lines.push("Bilinmeyen Ürün: " + p.count + " adet (₺" + getCaravanBuyPrice('product', p.idx) + " /adet)" + " [Al: +" + buyProd + " | Sat: -" + sellProd + "]"); } } lines.push(""); lines.push("Kendi Stokunuz:"); // Depo: ilk fabrika ve ilk shop var ownMat = 0; if (factoryList.length > 0) { if (caravanStock.matType === 'ore') ownMat = factoryList[0].oreBuffer;else if (caravanStock.matType === 'wood') ownMat = factoryList[0].woodBuffer;else if (caravanStock.matType === 'food') ownMat = factoryList[0].foodBuffer; } lines.push("Hammadde (" + caravanStock.matType + "): " + ownMat + " adet (₺" + getCaravanSellPrice('mat') + " /adet)"); for (var i = 0; i < caravanStock.products.length; i++) { var p = caravanStock.products[i]; var ownProd = 0; if (factoryList.length > 0) ownProd = factoryList[0].productBuffer[p.idx] || 0; if (productTypes && productTypes[p.idx]) { lines.push(productTypes[p.idx].name + ": " + ownProd + " adet (₺" + getCaravanSellPrice('product', p.idx) + " /adet)"); } else { lines.push("Bilinmeyen Ürün: " + ownProd + " adet (₺" + getCaravanSellPrice('product', p.idx) + " /adet)"); } } lines.push(""); lines.push("Almak/Satmak için butonlara tıklayın. Onayla ile işlemi tamamlayın."); caravanPanelContent.setText(lines.join("\n")); // Toplam maliyet ve kazanç hesapla var totalBuyCost = 0; var totalSellGain = 0; // Hammadde alımı if (caravanBuyAmounts.mat && caravanBuyAmounts.mat > 0) { var buyCount = Math.min(caravanBuyAmounts.mat, caravanStock.matCount); var price = getCaravanBuyPrice('mat'); totalBuyCost += buyCount * price; } // Ürün alımı for (var i = 0; i < caravanStock.products.length; i++) { var p = caravanStock.products[i]; var buyKey = "prod" + i; if (caravanBuyAmounts[buyKey] && caravanBuyAmounts[buyKey] > 0) { var buyCount = Math.min(caravanBuyAmounts[buyKey], p.count); var price = getCaravanBuyPrice('product', p.idx); totalBuyCost += buyCount * price; } } // Hammadde satışı if (caravanSellAmounts.mat && caravanSellAmounts.mat > 0) { var ownMat = 0; if (factoryList.length > 0) { if (caravanStock.matType === 'ore') ownMat = factoryList[0].oreBuffer;else if (caravanStock.matType === 'wood') ownMat = factoryList[0].woodBuffer;else if (caravanStock.matType === 'food') ownMat = factoryList[0].foodBuffer; } var sellCount = Math.min(caravanSellAmounts.mat, ownMat); var price = getCaravanSellPrice('mat'); totalSellGain += sellCount * price; } // Ürün satışı for (var i = 0; i < caravanStock.products.length; i++) { var p = caravanStock.products[i]; var sellKey = "prod" + i; if (caravanSellAmounts[sellKey] && caravanSellAmounts[sellKey] > 0) { var ownProd = 0; if (factoryList.length > 0) ownProd = factoryList[0].productBuffer[p.idx] || 0; var sellCount = Math.min(caravanSellAmounts[sellKey], ownProd); var price = getCaravanSellPrice('product', p.idx); totalSellGain += sellCount * price; } } // Info if (caravanTradeMade) { caravanPanelInfoTxt.setText("Ticaret yapıldı! Kervan birazdan ayrılacak."); } else { var infoStr = ""; if (totalBuyCost > 0) infoStr += "Toplam Alış: -" + totalBuyCost + "₺ "; if (totalSellGain > 0) infoStr += "Toplam Satış: +" + totalSellGain + "₺"; caravanPanelInfoTxt.setText(infoStr); } // --- Butonları pasifleştir (alpha=0.4) --- // Hammadde alım butonu if (caravanStock && caravanStock.matCount <= 0) { caravanPanelMatPlusBtn.alpha = 0.4; caravanPanelBuyBtn.alpha = 0.4; } else { caravanPanelMatPlusBtn.alpha = 1; caravanPanelBuyBtn.alpha = 1; } // Hammadde satım butonu var ownMat = 0; if (factoryList.length > 0 && caravanStock) { if (caravanStock.matType === 'ore') ownMat = factoryList[0].oreBuffer;else if (caravanStock.matType === 'wood') ownMat = factoryList[0].woodBuffer;else if (caravanStock.matType === 'food') ownMat = factoryList[0].foodBuffer; } if (ownMat <= 0) { caravanPanelMatSellPlusBtn.alpha = 0.4; caravanPanelSellBtn.alpha = 0.4; } else { caravanPanelMatSellPlusBtn.alpha = 1; caravanPanelSellBtn.alpha = 1; } // Ürünler için for (var i = 0; i < 5; i++) { var prodBtn = caravanPanelProdPlusBtns[i]; var prodSellBtn = caravanPanelProdSellPlusBtns[i]; var prod = caravanStock && caravanStock.products && caravanStock.products[i] ? caravanStock.products[i] : null; var ownProd = 0; if (prod && factoryList.length > 0) ownProd = factoryList[0].productBuffer[prod.idx] || 0; // Alım butonu if (prod && prod.count <= 0) { prodBtn.alpha = 0.4; } else { prodBtn.alpha = 1; } // Satım butonu if (ownProd <= 0) { prodSellBtn.alpha = 0.4; } else { prodSellBtn.alpha = 1; } } } // Kervan panelini aç/kapat function showCaravanPanel(show) { caravanPanelBg.visible = show; caravanPanelTitle.visible = show; caravanPanelContent.visible = show; caravanPanelCloseIcon.visible = show; caravanPanelBuyBtn.visible = show; caravanPanelSellBtn.visible = show; caravanPanelConfirmBtn.visible = show; caravanPanelInfoTxt.visible = show; caravanPanelOpen = show; // Miktar artır/azalt butonlarını göster/gizle caravanPanelMatPlusBtn.visible = show; caravanPanelMatMinusBtn.visible = show; caravanPanelMatSellPlusBtn.visible = show; caravanPanelMatSellMinusBtn.visible = show; for (var i = 0; i < 5; i++) { caravanPanelProdPlusBtns[i].visible = show; caravanPanelProdMinusBtns[i].visible = show; caravanPanelProdSellPlusBtns[i].visible = show; caravanPanelProdSellMinusBtns[i].visible = show; } // Panel açılırken diğer panelleri kapat if (show) { // Diğer panelleri kapat if (typeof businessPanel !== "undefined" && businessPanel.visible) businessPanel.toggle(); if (typeof karargahPanelBg !== "undefined" && karargahPanelBg.visible) karargahImg.down(); if (typeof depoPanelBg !== "undefined" && depoPanelBg.visible) workerPanelTopImg.down(); if (typeof workersPanelBg !== "undefined" && workersPanelBg.visible) researchCampRightImg.down(); if (typeof levelPanelBg !== "undefined" && levelPanelBg.visible) researchCampImg.down(); if (typeof researchCampPanelBg !== "undefined" && researchCampPanelBg.visible) researchCampImg.down(); if (typeof howToPlayPanelBg !== "undefined" && howToPlayPanelBg.visible) toggleHowToPlayPanel(); // --- Miktar seçimlerini sıfırla --- caravanBuyAmounts = {}; caravanSellAmounts = {}; updateCaravanPanel(); caravanLastPanelOpenTick = LK.ticks; // Kervan sprite'ı panel açıkken gizle if (caravan) caravan.visible = false; if (businessPanelCaravanBtn) businessPanelCaravanBtn.alpha = 0.4; // --- Panel arka planı karartma overlay'i ekle --- if (typeof caravanPanelOverlay === "undefined") { caravanPanelOverlay = new Container(); var overlayRect = LK.getAsset('bullet', { anchorX: 0, anchorY: 0, x: 0, y: 0, width: 2048, height: 2732, color: 0x000000, shape: 'box' }); overlayRect.alpha = 0.45; caravanPanelOverlay.addChild(overlayRect); caravanPanelOverlay.zIndex = 1000; game.addChildAt(caravanPanelOverlay, 0); } if (caravanPanelOverlay) caravanPanelOverlay.visible = true; } else { // Panel kapalıysa kervan sprite'ı tekrar görünür olsun (eğer DEPO'da ise) if (caravan && caravanArrived) caravan.visible = true; if (businessPanelCaravanBtn) businessPanelCaravanBtn.alpha = 1; // --- Panel arka planı karartma overlay'i gizle --- if (typeof caravanPanelOverlay !== "undefined" && caravanPanelOverlay) caravanPanelOverlay.visible = false; } } // Kervan paneli kapatıldığında function closeCaravanPanel() { showCaravanPanel(false); // Kervan ticareti yapılmadıysa, 1 dakika sonra ayrılacak if (!caravanTradeMade && caravanTimeout == null) { caravanTimeout = LK.setTimeout(function () { caravanLeave(); }, 60000); } } // Kervan ayrılır function caravanLeave() { showCaravanPanel(false); caravanActive = false; caravanArrived = false; caravanPanelOpen = false; caravanTradeMade = false; caravanTimeout = null; // 1-3 dakika sonra tekrar gelsin var minTick = 60 * 60; var maxTick = 3 * 60 * 60; caravanNextArrivalTick = LK.ticks + minTick + Math.floor(Math.random() * (maxTick - minTick)); // Eğer kervan zaten aktif değilse ve haritada yoksa, bir sonraki tickte spawnCaravan çağrılabilsin if (!caravanActive && !caravan) { caravanNextArrivalTick = LK.ticks - 1; } // Her zaman bir güvenlik olarak, kervan ayrıldığında tick'i sıfırla if (!caravanActive) { caravanNextArrivalTick = LK.ticks - 1; } // Kervan sprite'ı haritadan kaldır if (caravan) { // Fade out animasyonu ekle tween(caravan, { alpha: 0 }, { duration: 800, easing: tween.cubicInOut, onFinish: function onFinish() { if (caravan) caravan.destroy(); caravan = null; } }); } else { caravan = null; } } // Kervan ticareti onayla caravanPanelConfirmBtn.down = function () { // Alım var totalBuyCost = 0; var totalSellGain = 0; // Hammadde alımı if (caravanBuyAmounts.mat && caravanBuyAmounts.mat > 0) { var buyCount = Math.min(caravanBuyAmounts.mat, caravanStock.matCount); var price = getCaravanBuyPrice('mat'); var cost = buyCount * price; if (money >= cost) { if (factoryList.length > 0) { if (caravanStock.matType === 'ore') factoryList[0].oreBuffer += buyCount;else if (caravanStock.matType === 'wood') factoryList[0].woodBuffer += buyCount;else if (caravanStock.matType === 'food') factoryList[0].foodBuffer += buyCount; } money -= cost; caravanStock.matCount -= buyCount; totalBuyCost += cost; caravanBuyAmounts.mat -= buyCount; if (caravanBuyAmounts.mat < 0) caravanBuyAmounts.mat = 0; } } // Ürün alımı for (var i = 0; i < caravanStock.products.length; i++) { var p = caravanStock.products[i]; var buyKey = "prod" + i; if (caravanBuyAmounts[buyKey] && caravanBuyAmounts[buyKey] > 0) { var buyCount = Math.min(caravanBuyAmounts[buyKey], p.count); var price = getCaravanBuyPrice('product', p.idx); var cost = buyCount * price; if (money >= cost) { if (factoryList.length > 0) factoryList[0].productBuffer[p.idx] += buyCount; money -= cost; p.count -= buyCount; totalBuyCost += cost; caravanBuyAmounts[buyKey] -= buyCount; if (caravanBuyAmounts[buyKey] < 0) caravanBuyAmounts[buyKey] = 0; } } } // Hammadde satışı if (caravanSellAmounts.mat && caravanSellAmounts.mat > 0) { var sellCount = 0; if (factoryList.length > 0) { if (caravanStock.matType === 'ore') sellCount = Math.min(caravanSellAmounts.mat, factoryList[0].oreBuffer);else if (caravanStock.matType === 'wood') sellCount = Math.min(caravanSellAmounts.mat, factoryList[0].woodBuffer);else if (caravanStock.matType === 'food') sellCount = Math.min(caravanSellAmounts.mat, factoryList[0].foodBuffer); } var price = getCaravanSellPrice('mat'); var gain = sellCount * price; if (factoryList.length > 0 && sellCount > 0) { if (caravanStock.matType === 'ore') factoryList[0].oreBuffer -= sellCount;else if (caravanStock.matType === 'wood') factoryList[0].woodBuffer -= sellCount;else if (caravanStock.matType === 'food') factoryList[0].foodBuffer -= sellCount; money += gain; totalSellGain += gain; caravanSellAmounts.mat -= sellCount; if (caravanSellAmounts.mat < 0) caravanSellAmounts.mat = 0; } } // Ürün satışı for (var i = 0; i < caravanStock.products.length; i++) { var p = caravanStock.products[i]; var sellKey = "prod" + i; if (caravanSellAmounts[sellKey] && caravanSellAmounts[sellKey] > 0) { var sellCount = 0; if (factoryList.length > 0) sellCount = Math.min(caravanSellAmounts[sellKey], factoryList[0].productBuffer[p.idx]); var price = getCaravanSellPrice('product', p.idx); var gain = sellCount * price; if (factoryList.length > 0 && sellCount > 0) { factoryList[0].productBuffer[p.idx] -= sellCount; money += gain; totalSellGain += gain; caravanSellAmounts[sellKey] -= sellCount; if (caravanSellAmounts[sellKey] < 0) caravanSellAmounts[sellKey] = 0; } } } updateMoneyText(); updateDepoPanelContent && updateDepoPanelContent(); updateCaravanPanel(); caravanTradeMade = true; // Panelde bilgi göster caravanPanelInfoTxt.setText("Ticaret yapıldı! Kervan birazdan ayrılacak."); // 10 saniye sonra kervan ayrılır if (caravanTimeout) LK.clearTimeout(caravanTimeout); caravanTimeout = LK.setTimeout(function () { caravanLeave(); }, 10000); }; // Kervandan al butonu caravanPanelBuyBtn.down = function () { // Hammadde alımını 1 artır if (!caravanBuyAmounts.mat) caravanBuyAmounts.mat = 0; if (caravanStock.matCount > 0) caravanBuyAmounts.mat++; // Her ürün için for (var i = 0; i < caravanStock.products.length; i++) { var p = caravanStock.products[i]; var key = "prod" + i; if (!caravanBuyAmounts[key]) caravanBuyAmounts[key] = 0; if (p.count > 0) caravanBuyAmounts[key]++; } updateCaravanPanel(); }; // Kervana sat butonu caravanPanelSellBtn.down = function () { // Hammadde satımını 1 artır if (!caravanSellAmounts.mat) caravanSellAmounts.mat = 0; if (factoryList.length > 0) { var ownMat = 0; if (caravanStock.matType === 'ore') ownMat = factoryList[0].oreBuffer;else if (caravanStock.matType === 'wood') ownMat = factoryList[0].woodBuffer;else if (caravanStock.matType === 'food') ownMat = factoryList[0].foodBuffer; if (ownMat > 0) caravanSellAmounts.mat++; } // Her ürün için for (var i = 0; i < caravanStock.products.length; i++) { var p = caravanStock.products[i]; var key = "prod" + i; if (!caravanSellAmounts[key]) caravanSellAmounts[key] = 0; var ownProd = 0; if (factoryList.length > 0) ownProd = factoryList[0].productBuffer[p.idx] || 0; if (ownProd > 0) caravanSellAmounts[key]++; } updateCaravanPanel(); }; // Panel kapat ikonu caravanPanelCloseIcon.down = function () { closeCaravanPanel(); }; // Kervan paneli açıkken panel dışına tıklanırsa paneli kapat game.down = function (x, y, obj) { // Kervan paneli açıkken sadece panel dışı tıklamayı işle, diğer tüm tıklamaları engelle if (caravanPanelOpen) { // Panelin sınırları var left = caravanPanelBg.x - caravanPanelBg.width / 2; var right = caravanPanelBg.x + caravanPanelBg.width / 2; var top = caravanPanelBg.y - caravanPanelBg.height / 2; var bottom = caravanPanelBg.y + caravanPanelBg.height / 2; // Sadece panel dışına tıklanırsa paneli kapat, başka hiçbir tıklamayı işleME if (!(x >= left && x <= right && y >= top && y <= bottom)) { closeCaravanPanel(); } return; // Kervan paneli açıkken başka hiçbir tıklama işlemi yapılmasın } // Diğer tıklama işlemleri (varsa) buraya eklenebilir }; // --- Kervan panelinde azaltma işlemleri için ek butonlar (uzun basma yerine panelde azaltma) --- // Kervan paneli miktar artır/azalt butonlarının işlevleri caravanPanelMatPlusBtn.down = function () { if (!caravanBuyAmounts.mat) caravanBuyAmounts.mat = 0; if (caravanStock && caravanStock.matCount > 0 && caravanBuyAmounts.mat < caravanStock.matCount) { caravanBuyAmounts.mat++; updateCaravanPanel(); } }; caravanPanelMatMinusBtn.down = function () { if (!caravanBuyAmounts.mat) caravanBuyAmounts.mat = 0; if (caravanBuyAmounts.mat > 0) { caravanBuyAmounts.mat--; updateCaravanPanel(); } }; caravanPanelMatSellPlusBtn.down = function () { if (!caravanSellAmounts.mat) caravanSellAmounts.mat = 0; var ownMat = 0; if (factoryList.length > 0 && caravanStock) { if (caravanStock.matType === 'ore') ownMat = factoryList[0].oreBuffer;else if (caravanStock.matType === 'wood') ownMat = factoryList[0].woodBuffer;else if (caravanStock.matType === 'food') ownMat = factoryList[0].foodBuffer; } if (ownMat > 0 && caravanSellAmounts.mat < ownMat) { caravanSellAmounts.mat++; updateCaravanPanel(); } }; caravanPanelMatSellMinusBtn.down = function () { if (!caravanSellAmounts.mat) caravanSellAmounts.mat = 0; if (caravanSellAmounts.mat > 0) { caravanSellAmounts.mat--; updateCaravanPanel(); } }; // Ürünler için for (var i = 0; i < 5; i++) { (function (idx) { caravanPanelProdPlusBtns[idx].down = function () { var key = "prod" + idx; if (!caravanBuyAmounts[key]) caravanBuyAmounts[key] = 0; if (caravanStock && caravanStock.products && caravanStock.products[idx]) { var p = caravanStock.products[idx]; if (caravanBuyAmounts[key] < p.count) { caravanBuyAmounts[key]++; updateCaravanPanel(); } } }; caravanPanelProdMinusBtns[idx].down = function () { var key = "prod" + idx; if (!caravanBuyAmounts[key]) caravanBuyAmounts[key] = 0; if (caravanBuyAmounts[key] > 0) { caravanBuyAmounts[key]--; updateCaravanPanel(); } }; caravanPanelProdSellPlusBtns[idx].down = function () { var key = "prod" + idx; if (!caravanSellAmounts[key]) caravanSellAmounts[key] = 0; var ownProd = 0; if (factoryList.length > 0 && caravanStock && caravanStock.products && caravanStock.products[idx]) { var p = caravanStock.products[idx]; ownProd = factoryList[0].productBuffer[p.idx] || 0; if (caravanSellAmounts[key] < ownProd) { caravanSellAmounts[key]++; updateCaravanPanel(); } } }; caravanPanelProdSellMinusBtns[idx].down = function () { var key = "prod" + idx; if (!caravanSellAmounts[key]) caravanSellAmounts[key] = 0; if (caravanSellAmounts[key] > 0) { caravanSellAmounts[key]--; updateCaravanPanel(); } }; })(i); } // Eski up fonksiyonları kaldırıldı (artık kullanılmıyor) // Kervan haritada hareket etsin function spawnCaravan() { if (caravan) { caravan.destroy(); caravan = null; } caravan = new Caravan(); // Sol üstten başla (x: 120, y: 120) caravan.x = 120; caravan.y = 120; // Kervan state'ini sıfırla (defensive) caravanActive = true; caravanArrived = false; caravanPanelOpen = false; caravanTradeMade = false; caravanTimeout = null; // Hedef: BUSINESS PANEL (businessPanel ikonu) // BusinessPanel instance'ı ekranda, panelin arka planı panelBg'dir. // workerStartImg yerine businessPanel'in panelBg'sinin konumunu kullan. // BusinessPanel'in panelBg'sine erişmek için businessPanel.panelBg kullanılır. // Defensive: Eğer businessPanel.panelBg yoksa, workerStartImg fallback olarak kullanılır. var businessTargetX = businessPanel && businessPanel.panelBg && typeof businessPanel.panelBg.x === "number" ? businessPanel.panelBg.x : workerStartImg.x; var businessTargetY = businessPanel && businessPanel.panelBg && typeof businessPanel.panelBg.y === "number" ? businessPanel.panelBg.y : workerStartImg.y; caravan.targetX = businessTargetX; caravan.targetY = businessTargetY; caravan.lastX = caravan.x; caravan.lastY = caravan.y; game.addChild(caravan); // --- Kervan sprite'ına tıklama ile panel açma --- // Sadece kervan geldiyse paneli aç caravan.down = function () { if (caravanArrived) { showCaravanPanel(true); // Panel açıldığında kervan sprite'ı haritada gizlensin (panel fonksiyonu zaten bunu yapıyor) } else { // Kervan yoksa kısa bilgi ver if (typeof caravanSpawnTimerTxt !== "undefined") { caravanSpawnTimerTxt.setText("Kervan henüz gelmedi!"); } } }; caravanActive = true; caravanArrived = false; caravanPanelOpen = false; caravanTradeMade = false; caravanStock = generateCaravanStock(); caravanBuyAmounts = {}; caravanSellAmounts = {}; updateCaravanPanel(); } // Kervan BUSINESS PANEL'e ulaştı mı kontrol et function checkCaravanArrived() { if (!caravan || caravanArrived) return; // BusinessPanel panelBg'sinin konumunu hedef olarak kullan var businessTargetX = businessPanel && businessPanel.panelBg && typeof businessPanel.panelBg.x === "number" ? businessPanel.panelBg.x : workerStartImg.x; var businessTargetY = businessPanel && businessPanel.panelBg && typeof businessPanel.panelBg.y === "number" ? businessPanel.panelBg.y : workerStartImg.y; var dx = caravan.x - businessTargetX; var dy = caravan.y - businessTargetY; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 40) { caravanArrived = true; // Paneli otomatik açma! Sadece kervan sprite'ı haritada görünsün, buton aktif olsun. // showCaravanPanel(true); // Otomatik panel açmayı kaldırdık // 1 dakika sonra ayrılacak (ticaret yapılmazsa) if (caravanTimeout) LK.clearTimeout(caravanTimeout); caravanTimeout = LK.setTimeout(function () { if (!caravanTradeMade) caravanLeave(); }, 60000); } } // Main game.update patch: kervan hareketi ve paneli // Kervan tickleri var lastCaravanTick = 0; // --- Kervan sistemini game.update'e entegre et --- var originalGameUpdate = game.update; game.update = function () { // Kervan sistemi if (!caravanActive && LK.ticks > caravanNextArrivalTick) { // Eğer kervan spawn edilmiyor ve uzun süredir gelmiyorsa, tick'i sıfırla (safety) if (caravanNextArrivalTick > LK.ticks + 60 * 60 * 10) { // 10 dakika ileriye ayarlanmışsa caravanNextArrivalTick = LK.ticks - 1; } spawnCaravan(); } if (caravanActive && caravan && !caravanArrived) { // Kervan BUSINESS PANEL'e doğru hareket etsin (businessPanel.panelBg) var businessTargetX = businessPanel && businessPanel.panelBg && typeof businessPanel.panelBg.x === "number" ? businessPanel.panelBg.x : workerStartImg.x; var businessTargetY = businessPanel && businessPanel.panelBg && typeof businessPanel.panelBg.y === "number" ? businessPanel.panelBg.y : workerStartImg.y; // --- Kervan hareketi Caravan class'ının update fonksiyonu ile yapılmalı --- if (typeof caravan.update === "function") { caravan.target = { x: businessTargetX, y: businessTargetY }; caravan.moveTowards(businessTargetX, businessTargetY); caravan.update(); } checkCaravanArrived(); // Panel açık değilse kervan sprite'ı görünür olsun if (!caravanPanelOpen) caravan.visible = true;else caravan.visible = false; } // Kervan geldiğinde haritada kervan sprite'ı göster if (caravanActive && caravanArrived && caravan && !caravanPanelOpen) { caravan.visible = true; // Kervan butonunu da aktif et (görünürlük zaten true, ama panel açık değilse tıklanabilir olmalı) businessPanelCaravanBtn.alpha = 1; } // Panel açıkken güncelle if (caravanPanelOpen) updateCaravanPanel(); // Orijinal update fonksiyonunu çağır if (typeof originalGameUpdate === "function") originalGameUpdate(); }; 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 baseMoveMultiplier = 0.5; // Everyone moves 50% slower by default function getMoveMultiplier(level) { // Each level increases speed by 2% (so multiplier increases) // Level 1: 0.5, Level 2: 0.5*1.02, Level 3: 0.5*1.04, etc. return baseMoveMultiplier * (1 + 0.02 * (level - 1)); } var backgroundImg = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 1, scaleY: 1 }); backgroundImg.alpha = 1; game.addChildAt(backgroundImg, 0); // Add as the bottom-most layer // --- KARARGAH IMAGE & PANEL --- // Karargah image (sola, Kampımız'ın soluna) var karargahImg = LK.getAsset('city', { anchorX: 0.5, anchorY: 0.5, x: 1024 - 430, // Kampımız'ın x'i 1024, 430px sola y: 2400 }); game.addChild(karargahImg); // Karargah label below the image var karargahLabel = new Text2('Karargah', { size: 36, fill: "#fff" }); karargahLabel.anchor.set(0.5, 0); karargahLabel.x = karargahImg.x; karargahLabel.y = karargahImg.y + karargahImg.height / 2 + 10; game.addChild(karargahLabel); // Karargah panel (hidden by default) var karargahPanelBg = LK.getAsset('karargahPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 300, // Sola açılması için x: 300 (ekranın solunda) y: 1366, scaleX: 1.1, scaleY: 1.1 }); karargahPanelBg.alpha = 0.97; karargahPanelBg.visible = false; game.addChild(karargahPanelBg); // --- Not: Savaşı kaybederseniz askerler ölür. --- Bilgi metni panelin en altına ekleniyor var karargahPanelNoteTxt = new Text2("Not: Savaşı kaybederseniz askerler ölür.", { size: 28, fill: 0xB71C1C }); karargahPanelNoteTxt.anchor.set(0.5, 1); karargahPanelNoteTxt.x = karargahPanelBg.x; karargahPanelNoteTxt.y = karargahPanelBg.y + karargahPanelBg.height / 2 - 18; karargahPanelNoteTxt.visible = false; game.addChild(karargahPanelNoteTxt); // Karargah paneli kapat ikonu var karargahCloseIcon = new Text2('✕', { size: 42, fill: 0xFF0000, fontWeight: "bold" }); karargahCloseIcon.anchor.set(0.5, 0.5); karargahCloseIcon.x = karargahPanelBg.x + karargahPanelBg.width / 2 - 30; karargahCloseIcon.y = karargahPanelBg.y - karargahPanelBg.height / 2 + 30; karargahCloseIcon.visible = false; game.addChild(karargahCloseIcon); karargahCloseIcon.down = function () { karargahImg.down(); }; // --- Yeni: Canavar kalan spawn süresi texti (karargah paneli notunun hemen üstünde) --- var karargahPanelEnemyTimerTxt = new Text2("", { size: 30, fill: "#333" }); karargahPanelEnemyTimerTxt.anchor.set(0.5, 1); karargahPanelEnemyTimerTxt.x = karargahPanelBg.x; karargahPanelEnemyTimerTxt.y = karargahPanelNoteTxt.y - 32; // Notun hemen üstünde karargahPanelEnemyTimerTxt.visible = false; game.addChild(karargahPanelEnemyTimerTxt); // Karargah paneli başlık var karargahPanelTitle = new Text2('Karargah', { size: 38, fill: "#000", fontWeight: "bold" }); karargahPanelTitle.anchor.set(0.5, 0.5); karargahPanelTitle.x = karargahPanelBg.x; karargahPanelTitle.y = karargahPanelBg.y - karargahPanelBg.height / 2 + 60; karargahPanelTitle.visible = false; game.addChild(karargahPanelTitle); // Total power display next to Karargah title var karargahTotalPowerTxt = new Text2('', { size: 32, fill: "#333", fontWeight: "bold" }); karargahTotalPowerTxt.anchor.set(0, 0.5); karargahTotalPowerTxt.x = karargahPanelTitle.x + 80; // Right of the title karargahTotalPowerTxt.y = karargahPanelTitle.y; karargahTotalPowerTxt.visible = false; game.addChild(karargahTotalPowerTxt); // Asker türleri ve fiyatları var soldierTypes = [{ type: 'yaya', label: 'Yaya', cost: 200 }, { type: 'okcu', label: 'Okçu', cost: 400 }, { type: 'mizrakci', label: 'Mızrakçı', cost: 600 }, { type: 'zirhli', label: 'Zırhlı', cost: 800 }, { type: 'atli', label: 'Atlı', cost: 1000 }]; // Panelde asker sayıları ve satın alma butonları var karargahPanelRows = []; var karargahPanelRowY0 = karargahPanelBg.y - karargahPanelBg.height / 2 + 120; var karargahPanelRowDY = 90; for (var i = 0; i < soldierTypes.length; i++) { var y = karargahPanelRowY0 + i * karargahPanelRowDY; // Asker görseli var img = LK.getAsset('soldier_' + soldierTypes[i].type, { anchorX: 0, anchorY: 0.5, x: karargahPanelBg.x - karargahPanelBg.width / 2 + 40, y: y }); img.visible = false; game.addChild(img); // Asker adı var nameTxt = new Text2(soldierTypes[i].label, { size: 36, fill: "#000", fontWeight: "bold" }); nameTxt.anchor.set(0, 0.5); nameTxt.x = img.x + 90; nameTxt.y = y; nameTxt.visible = false; game.addChild(nameTxt); // Asker sayısı var countTxt = new Text2('0', { size: 36, fill: "#000" }); countTxt.anchor.set(0, 0.5); countTxt.x = nameTxt.x + 120; countTxt.y = y; countTxt.visible = false; game.addChild(countTxt); // --- YENİ: Canavarı yenme yüzdesi --- // winRateTxt artık countTxt'nin ALTINDA gösterilecek var winRateTxt = new Text2('Yenme: %0', { size: 28, fill: 0x1565C0 }); winRateTxt.anchor.set(0, 0.5); // X'i countTxt ile aynı hizaya getir winRateTxt.x = countTxt.x; // Y'si countTxt'nin hemen altında olacak şekilde ayarla (10px boşluk) winRateTxt.y = countTxt.y + countTxt.height / 2 + 10; winRateTxt.visible = false; game.addChild(winRateTxt); // --- YENİ: Saldır butonu --- var attackBtn = new Text2('Saldır', { size: 32, fill: 0xd32f2f, fontWeight: "bold" }); attackBtn.anchor.set(1, 0.5); attackBtn.x = karargahPanelBg.x + karargahPanelBg.width / 2 - 40; attackBtn.y = y + 35; // Satın alma butonunun altına attackBtn.visible = false; (function (idx) { attackBtn.down = function () { // Sadece asker varsa ve düşman varsa saldır var count = 0; for (var j = 0; j < soldierList.length; j++) { if (soldierList[j].soldierType === soldierTypes[idx].type && soldierList[j].state === 'idle') count++; } if (count > 0 && currentEnemy && !soldierList.some(function (s) { return s.soldierType === soldierTypes[idx].type && s.state === 'moving'; })) { // Sadece bu tipteki idle askerleri gönder for (var j = 0; j < soldierList.length; j++) { var s = soldierList[j]; if (s.soldierType === soldierTypes[idx].type && s.state === 'idle') { s.targetEnemy = currentEnemy; // Hedefe gitme süresi askerin hızına göre değişsin var tx = currentEnemy.x + Math.random() * 40 - 20; var ty = currentEnemy.y + Math.random() * 40 - 20; s.goTo(tx, ty); } } // --- Savaş efekti: canavarın üstünde bir resim ve animasyon --- // Savaş efekti resmi (örnek: pickaxe veya başka bir var olan asset) var battleEffect = LK.getAsset('pickaxe', { anchorX: 0.5, anchorY: 0.5, x: currentEnemy.x, y: currentEnemy.y - (currentEnemy.sprite ? currentEnemy.sprite.height / 2 : 60) - 30, scaleX: 1.5, scaleY: 1.5 }); game.addChild(battleEffect); // Basit animasyon: yukarı-aşağı sallama ve fade out tween(battleEffect, { y: battleEffect.y - 40, rotation: Math.PI / 6 }, { duration: 180, easing: tween.cubicInOut, onFinish: function onFinish() { tween(battleEffect, { y: battleEffect.y + 40, rotation: -Math.PI / 6, alpha: 0 }, { duration: 220, easing: tween.cubicInOut, onFinish: function onFinish() { if (battleEffect) battleEffect.destroy(); } }); } }); } }; })(i); game.addChild(attackBtn); // --- YENİ: Hepsini Gönder butonu --- var sendAllBtn = new Text2('Hepsini Gönder', { size: 28, fill: 0xff5722, fontWeight: "bold" }); sendAllBtn.anchor.set(1, 0.5); sendAllBtn.x = karargahPanelBg.x + karargahPanelBg.width / 2 - 40; sendAllBtn.y = y + 70; // Attack butonunun altına sendAllBtn.visible = false; (function (idx) { sendAllBtn.down = function () { // Tüm idle askerleri gönder var totalSent = 0; if (currentEnemy) { for (var j = 0; j < soldierList.length; j++) { var s = soldierList[j]; if (s.state === 'idle') { s.targetEnemy = currentEnemy; var tx = currentEnemy.x + Math.random() * 40 - 20; var ty = currentEnemy.y + Math.random() * 40 - 20; s.goTo(tx, ty); totalSent++; } } // Savaş efekti (tüm askerler gönderildiğinde daha büyük efekt) if (totalSent > 0) { var battleEffect = LK.getAsset('pickaxe', { anchorX: 0.5, anchorY: 0.5, x: currentEnemy.x, y: currentEnemy.y - (currentEnemy.sprite ? currentEnemy.sprite.height / 2 : 60) - 30, scaleX: 2.0, scaleY: 2.0 }); game.addChild(battleEffect); tween(battleEffect, { y: battleEffect.y - 50, rotation: Math.PI / 4 }, { duration: 200, easing: tween.cubicInOut, onFinish: function onFinish() { tween(battleEffect, { y: battleEffect.y + 50, rotation: -Math.PI / 4, alpha: 0 }, { duration: 250, easing: tween.cubicInOut, onFinish: function onFinish() { if (battleEffect) battleEffect.destroy(); } }); } }); } } }; })(i); game.addChild(sendAllBtn); // Satın alma butonu var buyBtn = new Text2('Eğit (₺' + soldierTypes[i].cost + ')', { size: 36, fill: 0x2E7D32, fontWeight: "bold" }); buyBtn.anchor.set(1, 0.5); buyBtn.x = karargahPanelBg.x + karargahPanelBg.width / 2 - 40; buyBtn.y = y; buyBtn.visible = false; (function (idx) { // --- Dynamic soldier prices --- if (typeof soldierTypes[idx].dynamicCost === "undefined") { soldierTypes[idx].dynamicCost = soldierTypes[idx].cost; } buyBtn.setText('Eğit (₺' + soldierTypes[idx].dynamicCost + ')'); buyBtn.down = function () { if (money >= soldierTypes[idx].dynamicCost) { money -= soldierTypes[idx].dynamicCost; soldierTypes[idx].dynamicCost = Math.ceil(soldierTypes[idx].dynamicCost * 1.1); buyBtn.setText('Eğit (₺' + soldierTypes[idx].dynamicCost + ')'); updateMoneyText(); // Yeni asker oluştur var s = new Soldier(); s.setType(soldierTypes[idx].type); s.x = karargahImg.x + 80 + Math.random() * 40 - 20; s.y = karargahImg.y + 80 + Math.random() * 40 - 20; soldierList.push(s); game.addChild(s); updateKarargahPanelRows(); } }; })(i); game.addChild(buyBtn); karargahPanelRows.push({ img: img, nameTxt: nameTxt, countTxt: countTxt, buyBtn: buyBtn, winRateTxt: winRateTxt, attackBtn: attackBtn, sendAllBtn: sendAllBtn }); } // Paneli güncelleyen fonksiyon function updateKarargahPanelRows() { // Calculate total army power var totalArmyPower = 0; for (var j = 0; j < soldierList.length; j++) { totalArmyPower += soldierList[j].attack + soldierList[j].defense; } // Calculate power multiplier based on total army power var powerMultiplier = Math.max(1, Math.round(totalArmyPower / 18 * 10) / 10); // Base power is 18 (yaya), round to 1 decimal karargahTotalPowerTxt.setText("Toplam Güç " + powerMultiplier + "x"); karargahTotalPowerTxt.visible = karargahPanelBg.visible; for (var i = 0; i < soldierTypes.length; i++) { var count = 0; for (var j = 0; j < soldierList.length; j++) { if (soldierList[j].soldierType === soldierTypes[i].type) count++; } karargahPanelRows[i].countTxt.setText(count + " adet"); // Buton pasif/gri yap karargahPanelRows[i].buyBtn.alpha = money >= soldierTypes[i].cost ? 1 : 0.4; // --- YENİ: Canavarı yenme yüzdesi ve saldır butonu güncelle --- var winRate = 0; var canAttack = false; if (typeof currentEnemy !== "undefined" && currentEnemy) { // Bu tipteki askerlerin toplam saldırı ve savunması var totalAttack = 0, totalDefense = 0, soldierCount = 0; for (var j = 0; j < soldierList.length; j++) { if (soldierList[j].soldierType === soldierTypes[i].type) { totalAttack += soldierList[j].attack; totalDefense += soldierList[j].defense; soldierCount++; } } // Basit bir oran: (asker saldırı + savunma) / (düşman saldırı + savunma) * 100 // Savaşı kazanmak %50 oranında zorlaşsın: winRate'i yarıya düşür var enemyPower = currentEnemy.attack + currentEnemy.defense; var ourPower = totalAttack + totalDefense; if (enemyPower > 0) { winRate = Math.min(100, Math.round(ourPower / enemyPower * 100 * 0.5)); } // Saldır butonu sadece asker varsa ve düşman varsa aktif canAttack = soldierCount > 0; } karargahPanelRows[i].winRateTxt.setText("Yenme: %" + winRate); karargahPanelRows[i].winRateTxt.visible = karargahPanelBg.visible; karargahPanelRows[i].attackBtn.visible = karargahPanelBg.visible; karargahPanelRows[i].attackBtn.alpha = canAttack ? 1 : 0.4; karargahPanelRows[i].sendAllBtn.visible = karargahPanelBg.visible; // sendAllBtn only shows for the last row and only if there are any idle soldiers var hasAnyIdleSoldiers = soldierList.some(function (s) { return s.state === 'idle'; }); if (i === soldierTypes.length - 1) { karargahPanelRows[i].sendAllBtn.visible = karargahPanelBg.visible; karargahPanelRows[i].sendAllBtn.alpha = hasAnyIdleSoldiers && currentEnemy ? 1 : 0.4; } else { karargahPanelRows[i].sendAllBtn.visible = false; } } // --- Not: Savaşı kaybederseniz askerler ölür. --- Bilgi metni panelin en altına ekleniyor if (typeof karargahPanelNoteTxt !== "undefined") { karargahPanelNoteTxt.visible = karargahPanelBg.visible; } } // Show/hide Karargah panel on image press karargahImg.down = function () { var newVisible = !karargahPanelBg.visible; karargahPanelBg.visible = newVisible; karargahPanelTitle.visible = newVisible; karargahTotalPowerTxt.visible = newVisible; karargahCloseIcon.visible = newVisible; for (var i = 0; i < karargahPanelRows.length; i++) { karargahPanelRows[i].img.visible = newVisible; karargahPanelRows[i].nameTxt.visible = newVisible; karargahPanelRows[i].countTxt.visible = newVisible; karargahPanelRows[i].buyBtn.visible = newVisible; // Hide winRateTxt and attackBtn when panel is closed karargahPanelRows[i].winRateTxt.visible = newVisible; karargahPanelRows[i].attackBtn.visible = newVisible; } // Show/hide the note at the bottom of the panel if (typeof karargahPanelNoteTxt !== "undefined") { karargahPanelNoteTxt.visible = newVisible; } // Yeni: spawn süresi textini göster/gizle if (typeof karargahPanelEnemyTimerTxt !== "undefined") { karargahPanelEnemyTimerTxt.visible = newVisible; } // Show/hide sendAllBtn for each row for (var i = 0; i < karargahPanelRows.length; i++) { if (karargahPanelRows[i].sendAllBtn) { karargahPanelRows[i].sendAllBtn.visible = newVisible && i === soldierTypes.length - 1; } } if (newVisible) updateKarargahPanelRows(); }; // City colored image asset (example: blue city icon) // Global game state var minerList = []; var oduncuList = []; var mineList = []; var factoryList = []; var shopList = []; var carrierList = []; var researcherList = []; var customerList = []; var treeList = []; var foodList = []; var toplayiciList = []; var money = 50; var city = null; function spawnCustomer() { if (shopList.length === 0) return; var customer = new Customer(); customer.x = city.x; customer.y = city.y + 40; customer.targetShop = shopList[0]; customerList.push(customer); game.addChild(customer); } function spawnTree() { var tree = new Tree(); // Place at random location across the game area, avoiding bottom area where buildings are tree.x = 200 + Math.random() * 1600; tree.y = 400 + Math.random() * 1400; treeList.push(tree); game.addChild(tree); } function spawnFood() { var food = new Food(); // Place at random location across the game area, avoiding bottom area where buildings are food.x = 200 + Math.random() * 1600; food.y = 400 + Math.random() * 1400; foodList.push(food); game.addChild(food); } function spawnResearcher() { var researcher = new Researcher(); // Place at random near bottom researcher.x = 200 + Math.random() * 1600; researcher.y = 2300 + Math.random() * 200; researcherList.push(researcher); game.addChild(researcher); } function spawnOduncu() { var oduncu = new Oduncu(); // Place at random near bottom oduncu.x = 400 + Math.random() * 1200; oduncu.y = 2300 + Math.random() * 200; oduncuList.push(oduncu); game.addChild(oduncu); } function spawnToplayici() { var toplayici = new Toplayici(); // Place at random near bottom toplayici.x = 400 + Math.random() * 1200; toplayici.y = 2300 + Math.random() * 200; toplayiciList.push(toplayici); game.addChild(toplayici); } function spawnCarrier() { var carrier = new Carrier(); // Place at random near bottom carrier.x = 600 + Math.random() * 800; carrier.y = 2300 + Math.random() * 200; carrierList.push(carrier); game.addChild(carrier); } // UI var moneyText = new Text2('₺' + money, { size: 36, fill: 0xFFE066 }); moneyText.anchor.set(0.5, 0); LK.gui.top.addChild(moneyText); // Nasıl Oynanır? button below money text var howToPlayBtn = new Text2('Nasıl Oynanır?', { size: 28, fill: 0xFFFFFF, fontWeight: "bold" }); howToPlayBtn.anchor.set(0.5, 0); howToPlayBtn.x = moneyText.x; howToPlayBtn.y = moneyText.y + 50; // 50px below money text LK.gui.top.addChild(howToPlayBtn); // Kervan kalan spawn süresi texti (Nasıl Oynanır? yazısının altına) var caravanSpawnTimerTxt = new Text2("", { size: 24, fill: "#fff" }); caravanSpawnTimerTxt.anchor.set(0.5, 0); caravanSpawnTimerTxt.x = howToPlayBtn.x; caravanSpawnTimerTxt.y = howToPlayBtn.y + 40; // 40px below Nasıl Oynanır? butonu LK.gui.top.addChild(caravanSpawnTimerTxt); function updateMoneyText() { moneyText.setText('₺' + money); } // --- NASIL OYNANIR PANELİ --- var howToPlayPanelBg = LK.getAsset('businessPanelBg', { anchorX: 1.0, anchorY: 0.0, x: 2048 - 40, y: 40, scaleX: 1.2, scaleY: 1.2 }); howToPlayPanelBg.alpha = 0.97; howToPlayPanelBg.visible = false; game.addChild(howToPlayPanelBg); // Panel başlığı var howToPlayTitle = new Text2('Nasıl Oynanır?', { size: 42, fill: "#000", fontWeight: "bold" }); howToPlayTitle.anchor.set(0.5, 0.5); howToPlayTitle.x = howToPlayPanelBg.x - howToPlayPanelBg.width / 2; howToPlayTitle.y = howToPlayPanelBg.y + 60; howToPlayTitle.visible = false; game.addChild(howToPlayTitle); // Oyun açıklaması var howToPlayText = new Text2('OYUNUN AMACI:\n' + '• Para kazanarak işletmenizi büyütün\n' + '• Madenciler cevher, oduncular odun, toplayıcılar yiyecek toplar\n' + '• Fabrikalar bu hammaddeleri ürüne çevirir\n' + '• Taşıyıcılar ürünleri mağazaya götürür\n' + '• Müşteriler ürün satın alır, para kazanırsınız\n\n' + 'SAVAŞ SİSTEMİ:\n' + '• Düzenli olarak canavarlar saldırır\n' + '• Karargahtan asker eğitip canavarlarla savaşın\n' + '• Savaşı kaybederseniz askerleriniz ölür\n\n' + 'İŞLETMELER:\n' + '• İşletmeler satış gelirlerinizi artırır\n' + '• Her seviye %2 hız artışı sağlar\n\n' + 'İPUCU:\n' + '• Araştırmacılar tükenen madenleri yeniler\n' + '• Sağ aşağıda bulunan DEPO sayfasını kontrol ederek,\n ihtiyacınız olan çalışanı işe alın.', { size: 28, fill: "#000" }); howToPlayText.anchor.set(0.5, 0); howToPlayText.x = howToPlayPanelBg.x - howToPlayPanelBg.width / 2; howToPlayText.y = howToPlayPanelBg.y + 120; howToPlayText.visible = false; game.addChild(howToPlayText); // Kapat ikonu var howToPlayCloseIcon = new Text2('✕', { size: 42, fill: 0xFF0000, fontWeight: "bold" }); howToPlayCloseIcon.anchor.set(0.5, 0.5); howToPlayCloseIcon.x = howToPlayPanelBg.x - 30; howToPlayCloseIcon.y = howToPlayPanelBg.y + 30; howToPlayCloseIcon.visible = false; game.addChild(howToPlayCloseIcon); // Panel toggle function function toggleHowToPlayPanel() { var newVisible = !howToPlayPanelBg.visible; howToPlayPanelBg.visible = newVisible; howToPlayTitle.visible = newVisible; howToPlayText.visible = newVisible; howToPlayCloseIcon.visible = newVisible; } // Button click events howToPlayBtn.down = function () { toggleHowToPlayPanel(); }; howToPlayCloseIcon.down = function () { toggleHowToPlayPanel(); }; // Add buttons for buying miners and mines // Satın alma butonları ve yazıları gizlendi (Madenci Al, Maden Aç, Fabrika Kur, Taşıyıcı Al) // (Butonlar ve ilgili eventler kaldırıldı) // Spawning functions function spawnMiner() { var miner = new Miner(); // Place at random near bottom miner.x = 400 + Math.random() * 1200; miner.y = 2300 + Math.random() * 200; minerList.push(miner); game.addChild(miner); } function spawnMine() { var mine = new Mine(); // Place at random in upper half mine.x = 300 + Math.random() * 1400; mine.y = 600 + Math.random() * 600; mineList.push(mine); game.addChild(mine); } function spawnFactory() { var factory = new Factory(); // Place at center factory.x = 1024; factory.y = 1600; factoryList.push(factory); game.addChild(factory); } function spawnShop() { var shop = new Shop(); shop.x = 1024; shop.y = 350; shopList.push(shop); game.addChild(shop); } // Initial setup // Add worker start position image at bottom center var workerStartImg = LK.getAsset('workerStart', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 2400 }); game.addChild(workerStartImg); // Başlangıç yerindeki resme tıklanınca business paneli aç/kapat workerStartImg.down = function () { businessPanel.toggle(); }; // Add 'Kampımız' label below the starting area image var kampimizLabel = new Text2('Kampımız', { size: 36, fill: "#fff" }); kampimizLabel.anchor.set(0.5, 0); kampimizLabel.x = workerStartImg.x; kampimizLabel.y = workerStartImg.y + workerStartImg.height / 2 + 10; game.addChild(kampimizLabel); // Kampımız labelına tıklanınca işletmeler panelini aç/kapat kampimizLabel.down = function () { businessPanel.toggle(); }; // --- BUSINESS PANEL INSTANCE --- var businessPanel = new BusinessPanel(); game.addChild(businessPanel); // Add Araştırma Kampı image (was restAreaImg) var researchCampImg = LK.getAsset('restAreaSide', { anchorX: 0.5, anchorY: 0.5, x: 1024 + 430, y: 2400 }); game.addChild(researchCampImg); // Add a new image to the right of the research camp var researchCampRightImg = LK.getAsset('workerPanel', { anchorX: 0.0, anchorY: 0.5, x: researchCampImg.x + 180, // 180px right of center of research camp y: researchCampImg.y }); game.addChild(researchCampRightImg); // Add a new depoWorker image above the workerPanel image var workerPanelTopImg = LK.getAsset('depoWorker', { anchorX: 0.5, anchorY: 1.0, x: researchCampRightImg.x + researchCampRightImg.width / 2, y: researchCampRightImg.y - researchCampRightImg.height / 2 - 10 }); game.addChild(workerPanelTopImg); // Add 'Depo' label above the workerPanelTopImg image var depoLabel = new Text2('Depo', { size: 36, fill: "#fff" }); depoLabel.anchor.set(0.5, 1); depoLabel.x = workerPanelTopImg.x; depoLabel.y = workerPanelTopImg.y - workerPanelTopImg.height / 2 - 10; game.addChild(depoLabel); // --- DEPO PANEL --- // Panel arka planı (Depo paneli) var depoPanelBg = LK.getAsset('depoPanelBg', { anchorX: 1.0, anchorY: 0.0, x: 2048 - 40, // sağ üstte, 40px içeride y: 40, // üstten 40px aşağıda scaleX: 1.1, scaleY: 1.1 }); depoPanelBg.alpha = 0.97; depoPanelBg.visible = false; game.addChild(depoPanelBg); // Depo görseli (artık shop yerine depo resmi kullanılıyor) var depoImage = LK.getAsset('depo', { anchorX: 0.5, anchorY: 1.0, x: depoPanelBg.x - depoPanelBg.width / 2, y: depoPanelBg.y - 10, // panelin üstüne hizala scaleX: 0.8, scaleY: 0.8 }); depoImage.visible = false; game.addChild(depoImage); // Panel başlığı var depoPanelTitle = new Text2('Depo', { size: 38, fill: "#000", fontWeight: "bold" }); depoPanelTitle.anchor.set(0.5, 0.5); depoPanelTitle.x = depoPanelBg.x - depoPanelBg.width / 2; depoPanelTitle.y = depoPanelBg.y + 60; depoPanelTitle.visible = false; game.addChild(depoPanelTitle); // Panel içeriği (örnek: fabrika ve mağaza ürünleri) var depoPanelContent = new Text2('', { size: 36, fill: "#000" }); depoPanelContent.anchor.set(0.5, 0); depoPanelContent.x = depoPanelBg.x - depoPanelBg.width / 2 - 30; depoPanelContent.y = depoPanelBg.y + 120; depoPanelContent.visible = false; game.addChild(depoPanelContent); // Depo paneli kapat ikonu var depoCloseIcon = new Text2('✕', { size: 42, fill: 0xFF0000, fontWeight: "bold" }); depoCloseIcon.anchor.set(0.5, 0.5); depoCloseIcon.x = depoPanelBg.x - 30; depoCloseIcon.y = depoPanelBg.y + 30; depoCloseIcon.visible = false; game.addChild(depoCloseIcon); depoCloseIcon.down = function () { workerPanelTopImg.down(); }; // Depo panelini güncelleyen fonksiyon function updateDepoPanelContent() { // Fabrika ve mağaza ürünlerini 4 satırlık bloklar halinde alt alta göster var lines = []; for (var i = 0; i < factoryList.length; i++) { var factory = factoryList[i]; // Hammadde bilgileri ekle lines.push("Fabrika #" + (i + 1) + " Hammaddeler:"); lines.push(" Cevher: " + factory.oreBuffer + " Odun: " + factory.woodBuffer + " Yiyecek: " + factory.foodBuffer); lines.push(""); var prodCounts = []; for (var p = 0; p < productTypes.length; p++) { var count = factory.productBuffer[p] || 0; prodCounts.push(productTypes[p].name + ": " + count); } // 4 satırlık bloklar halinde alt alta yaz lines.push("Fabrika #" + (i + 1) + " Ürünler:"); for (var row = 0; row < 4; row++) { var start = row * 3; var end = start + 3; if (start < prodCounts.length) { lines.push(" " + prodCounts.slice(start, end).join(" ")); } } lines.push(""); } for (var i = 0; i < shopList.length; i++) { var shop = shopList[i]; var prodCounts = []; for (var p = 0; p < productTypes.length; p++) { var count = shop.productBuffer[p] || 0; prodCounts.push(productTypes[p].name + ": " + count); } lines.push("Mağaza #" + (i + 1) + ":"); for (var row = 0; row < 4; row++) { var start = row * 3; var end = start + 3; if (start < prodCounts.length) { lines.push(" " + prodCounts.slice(start, end).join(" ")); } } } depoPanelContent.setText(lines.join("\n")); } // Depo resmine tıklanınca paneli aç/kapat workerPanelTopImg.down = function () { var newVisible = !depoPanelBg.visible; depoPanelBg.visible = newVisible; depoPanelTitle.visible = newVisible; depoPanelContent.visible = newVisible; depoImage.visible = newVisible; depoCloseIcon.visible = newVisible; if (newVisible) updateDepoPanelContent(); }; // Add 'Çalışanlar' label below the workerPanel image var workerPanelLabel = new Text2('Çalışanlar', { size: 36, fill: "#fff" }); workerPanelLabel.anchor.set(0.5, 0); workerPanelLabel.x = researchCampRightImg.x + researchCampRightImg.width / 2; workerPanelLabel.y = researchCampRightImg.y + researchCampRightImg.height / 2 + 10; game.addChild(workerPanelLabel); // --- ÇALIŞANLAR PANELİ --- // ÇALIŞANLAR PANELİ arka planı (sol ortada açılır) var workersPanelBg = LK.getAsset('levelPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 505, // 300 + 204.8 (10% of 2048) = 504.8, move panel 10% right // Sol ortada açmak için x'i sağa kaydır y: 1366, // Ekranın ortası (2048x2732 için) scaleX: 1.1, scaleY: 1.1 }); workersPanelBg.alpha = 0.97; workersPanelBg.visible = false; game.addChild(workersPanelBg); // Panel başlığı var workersPanelTitle = new Text2('Çalışanlar', { size: 38, fill: "#000", fontWeight: "bold" }); workersPanelTitle.anchor.set(0.5, 0.5); workersPanelTitle.x = workersPanelBg.x; workersPanelTitle.y = workersPanelBg.y - workersPanelBg.height / 2 + 60; game.addChild(workersPanelTitle); // Çalışan sayıları için yazılar var workerPanelFontSize = 36; var workerPanelLeft = workersPanelBg.x - workersPanelBg.width / 2 + 60; var workerPanelRight = workersPanelBg.x + workersPanelBg.width / 2 - 60; var workerPanelRowY0 = workersPanelBg.y - 30; var workerPanelRowDY = 90; var workerCountMinerText = new Text2('', { size: workerPanelFontSize, fill: "#000" }); workerCountMinerText.anchor.set(0, 0.5); workerCountMinerText.x = workerPanelLeft; workerCountMinerText.y = workerPanelRowY0; game.addChild(workerCountMinerText); var workerCountCarrierText = new Text2('', { size: workerPanelFontSize, fill: "#000" }); workerCountCarrierText.anchor.set(0, 0.5); workerCountCarrierText.x = workerPanelLeft; workerCountCarrierText.y = workerPanelRowY0 + workerPanelRowDY; game.addChild(workerCountCarrierText); var workerCountResearcherText = new Text2('', { size: workerPanelFontSize, fill: "#000" }); workerCountResearcherText.anchor.set(0, 0.5); workerCountResearcherText.x = workerPanelLeft; workerCountResearcherText.y = workerPanelRowY0 + 2 * workerPanelRowDY; game.addChild(workerCountResearcherText); var workerCountOduncuText = new Text2('', { size: workerPanelFontSize, fill: "#000" }); workerCountOduncuText.anchor.set(0, 0.5); workerCountOduncuText.x = workerPanelLeft; workerCountOduncuText.y = workerPanelRowY0 + 3 * workerPanelRowDY; game.addChild(workerCountOduncuText); var workerCountToplayiciText = new Text2('', { size: workerPanelFontSize, fill: "#000" }); workerCountToplayiciText.anchor.set(0, 0.5); workerCountToplayiciText.x = workerPanelLeft; workerCountToplayiciText.y = workerPanelRowY0 + 4 * workerPanelRowDY; game.addChild(workerCountToplayiciText); // Satın alma butonları ve fiyatlar (panelin sağında, sayılarla hizalı) var buyWorkerMinerBtn = new Text2('Madenci Al (₺100)', { size: workerPanelFontSize, fill: "#333" }); buyWorkerMinerBtn.anchor.set(1, 0.5); buyWorkerMinerBtn.x = workerPanelRight; buyWorkerMinerBtn.y = workerPanelRowY0; game.addChild(buyWorkerMinerBtn); // --- Dynamic worker prices --- var workerMinerPrice = 100; var workerCarrierPrice = 150; var workerResearcherPrice = 200; var workerOduncuPrice = 120; var workerToplayiciPrice = 110; buyWorkerMinerBtn.setText('Madenci Al (₺' + workerMinerPrice + ')'); buyWorkerMinerBtn.down = function () { if (money >= workerMinerPrice) { money -= workerMinerPrice; workerMinerPrice = Math.ceil(workerMinerPrice * 1.1); buyWorkerMinerBtn.setText('Madenci Al (₺' + workerMinerPrice + ')'); updateMoneyText(); spawnMiner(); updateWorkerCounts(); } }; var buyWorkerCarrierBtn = new Text2('Taşıyıcı Al (₺' + workerCarrierPrice + ')', { size: workerPanelFontSize, fill: "#333" }); buyWorkerCarrierBtn.anchor.set(1, 0.5); buyWorkerCarrierBtn.x = workerPanelRight; buyWorkerCarrierBtn.y = workerPanelRowY0 + workerPanelRowDY; game.addChild(buyWorkerCarrierBtn); buyWorkerCarrierBtn.down = function () { if (money >= workerCarrierPrice) { money -= workerCarrierPrice; workerCarrierPrice = Math.ceil(workerCarrierPrice * 1.1); buyWorkerCarrierBtn.setText('Taşıyıcı Al (₺' + workerCarrierPrice + ')'); updateMoneyText(); spawnCarrier(); updateWorkerCounts(); } }; var buyWorkerResearcherBtn = new Text2('Araştırmacı Al (₺' + workerResearcherPrice + ')', { size: workerPanelFontSize, fill: "#333" }); buyWorkerResearcherBtn.anchor.set(1, 0.5); buyWorkerResearcherBtn.x = workerPanelRight; buyWorkerResearcherBtn.y = workerPanelRowY0 + 2 * workerPanelRowDY; game.addChild(buyWorkerResearcherBtn); buyWorkerResearcherBtn.down = function () { if (money >= workerResearcherPrice) { money -= workerResearcherPrice; workerResearcherPrice = Math.ceil(workerResearcherPrice * 1.1); buyWorkerResearcherBtn.setText('Araştırmacı Al (₺' + workerResearcherPrice + ')'); updateMoneyText(); spawnResearcher(); updateWorkerCounts(); } }; var buyWorkerOduncuBtn = new Text2('Oduncu Al (₺' + workerOduncuPrice + ')', { size: workerPanelFontSize, fill: "#333" }); buyWorkerOduncuBtn.anchor.set(1, 0.5); buyWorkerOduncuBtn.x = workerPanelRight; buyWorkerOduncuBtn.y = workerPanelRowY0 + 3 * workerPanelRowDY; game.addChild(buyWorkerOduncuBtn); buyWorkerOduncuBtn.down = function () { if (money >= workerOduncuPrice) { money -= workerOduncuPrice; workerOduncuPrice = Math.ceil(workerOduncuPrice * 1.1); buyWorkerOduncuBtn.setText('Oduncu Al (₺' + workerOduncuPrice + ')'); updateMoneyText(); spawnOduncu(); updateWorkerCounts(); } }; var buyWorkerToplayiciBtn = new Text2('Toplayıcı Al (₺' + workerToplayiciPrice + ')', { size: workerPanelFontSize, fill: "#333" }); buyWorkerToplayiciBtn.anchor.set(1, 0.5); buyWorkerToplayiciBtn.x = workerPanelRight; buyWorkerToplayiciBtn.y = workerPanelRowY0 + 4 * workerPanelRowDY; game.addChild(buyWorkerToplayiciBtn); buyWorkerToplayiciBtn.down = function () { if (money >= workerToplayiciPrice) { money -= workerToplayiciPrice; workerToplayiciPrice = Math.ceil(workerToplayiciPrice * 1.1); buyWorkerToplayiciBtn.setText('Toplayıcı Al (₺' + workerToplayiciPrice + ')'); updateMoneyText(); spawnToplayici(); updateWorkerCounts(); } }; // ÇALIŞANLAR PANELİ başlık, buton ve sayıları başta gizle workersPanelTitle.visible = false; buyWorkerMinerBtn.visible = false; buyWorkerCarrierBtn.visible = false; buyWorkerResearcherBtn.visible = false; buyWorkerOduncuBtn.visible = false; workerCountMinerText.visible = false; workerCountCarrierText.visible = false; workerCountResearcherText.visible = false; workerCountOduncuText.visible = false; // Çalışanlar paneli kapat ikonu var workersCloseIcon = new Text2('✕', { size: 42, fill: 0xFF0000, fontWeight: "bold" }); workersCloseIcon.anchor.set(0.5, 0.5); workersCloseIcon.x = workersPanelBg.x + workersPanelBg.width / 2 - 30; workersCloseIcon.y = workersPanelBg.y - workersPanelBg.height / 2 + 30; workersCloseIcon.visible = false; game.addChild(workersCloseIcon); workersCloseIcon.down = function () { researchCampRightImg.down(); }; // workerPanel image'a tıklanınca paneli aç/kapat researchCampRightImg.down = function () { var newVisible = !workersPanelTitle.visible; workersPanelBg.visible = newVisible; workersPanelTitle.visible = newVisible; buyWorkerMinerBtn.visible = newVisible; buyWorkerCarrierBtn.visible = newVisible; buyWorkerResearcherBtn.visible = newVisible; buyWorkerOduncuBtn.visible = newVisible; buyWorkerToplayiciBtn.visible = newVisible; workerCountMinerText.visible = newVisible; workerCountCarrierText.visible = newVisible; workerCountResearcherText.visible = newVisible; workerCountOduncuText.visible = newVisible; workerCountToplayiciText.visible = newVisible; workersCloseIcon.visible = newVisible; if (newVisible) updateWorkerCounts(); }; // Çalışan sayısını güncelleyen fonksiyon function updateWorkerCounts() { workerCountMinerText.setText("Madenci: " + minerList.length); workerCountCarrierText.setText("Taşıyıcı: " + carrierList.length); workerCountResearcherText.setText("Araştırmacı: " + researcherList.length); workerCountOduncuText.setText("Oduncu: " + oduncuList.length); workerCountToplayiciText.setText("Toplayıcı: " + toplayiciList.length); } // Add 'Araştırma Kampı' label below the image var researchCampLabel = new Text2('Araştırma Kampı', { size: 36, fill: "#fff" }); researchCampLabel.anchor.set(0.5, 0); researchCampLabel.x = researchCampImg.x; researchCampLabel.y = researchCampImg.y + 90; game.addChild(researchCampLabel); // Create a panel for Araştırma Kampı (hidden by default) var researchCampPanelBg = LK.getAsset('researchCampPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 300, // sol ortada açmak için x'i sola al y: 1366, // ekranın ortası (2048x2732 için) scaleX: 1.1, scaleY: 1.1 }); researchCampPanelBg.alpha = 0.97; researchCampPanelBg.visible = false; game.addChild(researchCampPanelBg); var researchCampPanelText = new Text2('Araştırma Kampı\nYeni madenler için araştırmacı gönder.', { size: 36, fill: "#fff" }); researchCampPanelText.anchor.set(0, 0.5); researchCampPanelText.x = researchCampPanelBg.x - researchCampPanelBg.width / 2 + 40; researchCampPanelText.y = researchCampPanelBg.y - researchCampPanelBg.height / 2 + 80; researchCampPanelText.visible = false; game.addChild(researchCampPanelText); // Araştırma kampı paneli kapat ikonu var researchCloseIcon = new Text2('✕', { size: 42, fill: 0xFF0000, fontWeight: "bold" }); researchCloseIcon.anchor.set(0.5, 0.5); researchCloseIcon.x = researchCampPanelBg.x + researchCampPanelBg.width / 2 - 30; researchCloseIcon.y = researchCampPanelBg.y - researchCampPanelBg.height / 2 + 30; researchCloseIcon.visible = false; game.addChild(researchCloseIcon); researchCloseIcon.down = function () { researchCampImg.down(); }; // Show/hide panel on image press researchCampImg.down = function () { researchCampPanelBg.visible = !researchCampPanelBg.visible; researchCampPanelText.visible = researchCampPanelBg.visible; }; spawnMine(); spawnMine(); spawnFactory(); spawnShop(); spawnMiner(); spawnCarrier(); spawnResearcher(); spawnResearcher(); // İkinci araştırmacı spawnOduncu(); spawnToplayici(); // --- Kervan oyun başlangıcında gelsin --- // Her ihtimale karşı caravanNextArrivalTick'i sıfırla ki hemen spawn edilebilsin caravanNextArrivalTick = LK.ticks - 1; // Kervan başlangıçta her zaman spawn edilsin if (!caravanActive && !caravan) { spawnCaravan(); caravanActive = true; caravanArrived = false; caravanPanelOpen = false; caravanTradeMade = false; caravanTimeout = null; } // Spawn 3 trees at random locations spawnTree(); spawnTree(); spawnTree(); // Spawn 3 food items at random locations spawnFood(); spawnFood(); spawnFood(); city = new City(); game.addChild(city); // Shop sell timer REMOVED: Carriers now deliver products // Dragging mines/factories for placement (future feature, not implemented now) // Main game update game.update = function () { // Helper function to check if an object overlaps with any open panel function isElementInPanelArea(element) { if (!element || !element.x || !element.y) return false; var elementBounds = { left: element.x - (element.width || 100) / 2, right: element.x + (element.width || 100) / 2, top: element.y - (element.height || 100) / 2, bottom: element.y + (element.height || 100) / 2 }; // Check overlap with business panel - using exact panel background dimensions if (businessPanel.visible) { var businessBounds = { left: 1024 - 866.7 * 1.1 / 2, // exact business panel bg scaled width/2 right: 1024 + 866.7 * 1.1 / 2, top: 900 - 650 * 1.1 / 2, // exact business panel bg scaled height/2 bottom: 900 + 650 * 1.1 / 2 }; if (elementBounds.right > businessBounds.left && elementBounds.left < businessBounds.right && elementBounds.bottom > businessBounds.top && elementBounds.top < businessBounds.bottom) { return true; } } // Check overlap with karargah panel - using exact panel background dimensions if (karargahPanelBg.visible) { var karargahBounds = { left: 300 - 650 * 1.1 / 2, // exact karargah panel bg scaled width/2 right: 300 + 650 * 1.1 / 2, top: 1366 - 650 * 1.1 / 2, // exact karargah panel bg scaled height/2 bottom: 1366 + 650 * 1.1 / 2 }; if (elementBounds.right > karargahBounds.left && elementBounds.left < karargahBounds.right && elementBounds.bottom > karargahBounds.top && elementBounds.top < karargahBounds.bottom) { return true; } } // Check overlap with depo panel - using exact panel background dimensions if (depoPanelBg.visible) { var depoBounds = { left: 2048 - 40 - 650 * 1.1, // depo panel anchor 1.0, 0.0 positioning right: 2048 - 40, top: 40, bottom: 40 + 600 * 1.1 // exact depo panel bg scaled height }; if (elementBounds.right > depoBounds.left && elementBounds.left < depoBounds.right && elementBounds.bottom > depoBounds.top && elementBounds.top < depoBounds.bottom) { return true; } } // Check overlap with workers panel - using exact panel background dimensions if (workersPanelBg.visible) { var workersBounds = { left: 505 - 650 * 1.1 / 2, // exact workers panel bg scaled width/2 right: 505 + 650 * 1.1 / 2, top: 1366 - 700 * 1.1 / 2, // exact workers panel bg scaled height/2 bottom: 1366 + 700 * 1.1 / 2 }; if (elementBounds.right > workersBounds.left && elementBounds.left < workersBounds.right && elementBounds.bottom > workersBounds.top && elementBounds.top < workersBounds.bottom) { return true; } } // Check overlap with level/research camp panel - using exact panel background dimensions if (levelPanelBg.visible || researchCampPanelBg.visible) { var levelBounds = { left: 300 - 650 * 1.1 / 2, // exact level panel bg scaled width/2 (levelPanelBg uses karargahPanelBg asset) right: 300 + 650 * 1.1 / 2, top: 1366 - 700 * 1.1 / 2, // exact level panel bg scaled height/2 (levelPanelBg) bottom: 1366 + 700 * 1.1 / 2 }; if (elementBounds.right > levelBounds.left && elementBounds.left < levelBounds.right && elementBounds.bottom > levelBounds.top && elementBounds.top < levelBounds.bottom) { return true; } } // Check overlap with Nasıl Oynanır panel - using exact panel background dimensions if (howToPlayPanelBg.visible) { var howToPlayBounds = { left: 2048 - 40 - 866.7 * 1.2, // howToPlayPanelBg anchor 1.0, 0.0 positioning with scale 1.2 right: 2048 - 40, top: 40, bottom: 40 + 650 * 1.2 // exact how to play panel bg scaled height }; if (elementBounds.right > howToPlayBounds.left && elementBounds.left < howToPlayBounds.right && elementBounds.bottom > howToPlayBounds.top && elementBounds.top < howToPlayBounds.bottom) { return true; } } return false; } // Selectively hide only elements that overlap with open panels var anyPanelOpen = karargahPanelBg.visible || businessPanel.visible || depoPanelBg.visible || workersPanelBg.visible || levelPanelBg.visible || researchCampPanelBg.visible; // Always show background backgroundImg.visible = true; // Show/hide main building images and labels based on panel overlap karargahImg.visible = !isElementInPanelArea(karargahImg); karargahLabel.visible = !isElementInPanelArea(karargahLabel); workerStartImg.visible = !isElementInPanelArea(workerStartImg); kampimizLabel.visible = !isElementInPanelArea(kampimizLabel); researchCampImg.visible = !isElementInPanelArea(researchCampImg); researchCampLabel.visible = !isElementInPanelArea(researchCampLabel); researchCampRightImg.visible = !isElementInPanelArea(researchCampRightImg); workerPanelLabel.visible = !isElementInPanelArea(workerPanelLabel); workerPanelTopImg.visible = !isElementInPanelArea(workerPanelTopImg); depoLabel.visible = !isElementInPanelArea(depoLabel); // Show/hide city based on panel overlap if (city) city.visible = !isElementInPanelArea(city); // Show/hide workers and game objects based on panel overlap for (var i = 0; i < minerList.length; i++) { minerList[i].visible = !isElementInPanelArea(minerList[i]); } for (var i = 0; i < carrierList.length; i++) { carrierList[i].visible = !isElementInPanelArea(carrierList[i]); } for (var i = 0; i < researcherList.length; i++) { researcherList[i].visible = !isElementInPanelArea(researcherList[i]); } for (var i = 0; i < oduncuList.length; i++) { oduncuList[i].visible = !isElementInPanelArea(oduncuList[i]); } for (var i = 0; i < toplayiciList.length; i++) { toplayiciList[i].visible = !isElementInPanelArea(toplayiciList[i]); } for (var i = 0; i < customerList.length; i++) { customerList[i].visible = !isElementInPanelArea(customerList[i]); } for (var i = 0; i < mineList.length; i++) { mineList[i].visible = !isElementInPanelArea(mineList[i]); } for (var i = 0; i < factoryList.length; i++) { factoryList[i].visible = !isElementInPanelArea(factoryList[i]); } for (var i = 0; i < shopList.length; i++) { shopList[i].visible = !isElementInPanelArea(shopList[i]); } for (var i = 0; i < soldierList.length; i++) { soldierList[i].visible = !isElementInPanelArea(soldierList[i]); } for (var i = 0; i < treeList.length; i++) { treeList[i].visible = !isElementInPanelArea(treeList[i]); } for (var i = 0; i < foodList.length; i++) { foodList[i].visible = !isElementInPanelArea(foodList[i]); } if (currentEnemy) { currentEnemy.visible = !isElementInPanelArea(currentEnemy); } // Show/hide status texts based on panel overlap for (var i = 0; i < statusTexts.length; i++) { statusTexts[i].visible = !isElementInPanelArea(statusTexts[i]); } // --- Yeni: Karargah paneli açıkken kalan canavar spawn süresini güncelle --- if (typeof karargahPanelEnemyTimerTxt !== "undefined" && karargahPanelEnemyTimerTxt.visible) { // Eğer bir canavar yoksa ve cooldown devam ediyorsa kalan süreyi göster if (!currentEnemy && lastEnemyDefeatedTime > 0 && LK.ticks - lastEnemyDefeatedTime < 18000) { var ticksLeft = 18000 - (LK.ticks - lastEnemyDefeatedTime); var secondsLeft = Math.ceil(ticksLeft / 60); var min = Math.floor(secondsLeft / 60); var sec = secondsLeft % 60; var timeStr = min + "dk " + (sec < 10 ? "0" : "") + sec + "sn"; karargahPanelEnemyTimerTxt.setText("Yeni canavar için kalan süre: " + timeStr); } else { karargahPanelEnemyTimerTxt.setText(""); } } // --- Kervan kalan spawn süresi textini güncelle --- if (typeof caravanSpawnTimerTxt !== "undefined") { if (!caravanActive && LK.ticks < caravanNextArrivalTick) { var ticksLeft = caravanNextArrivalTick - LK.ticks; var secondsLeft = Math.ceil(ticksLeft / 60); var min = Math.floor(secondsLeft / 60); var sec = secondsLeft % 60; var timeStr = min + "dk " + (sec < 10 ? "0" : "") + sec + "sn"; caravanSpawnTimerTxt.setText("Yeni kervan için kalan süre: " + timeStr); } else if (!caravanActive && LK.ticks >= caravanNextArrivalTick) { caravanSpawnTimerTxt.setText("Kervan yolda!"); } else if (caravanActive) { // Kervan geldiğinde, butonu ekle var caravanBtnText = "Kervan geldi!"; // Eğer panel butonu görünürse, butonu da ekle if (caravanPanelBuyBtn && caravanPanelBuyBtn.visible) { caravanBtnText += " ["; caravanBtnText += caravanPanelBuyBtn.text || "Kervandan Al"; caravanBtnText += "]"; } // Kervan geldiğinde buton aktif (alpha=1) olmalı if (businessPanelCaravanBtn) businessPanelCaravanBtn.alpha = 1; caravanSpawnTimerTxt.setText(caravanBtnText); } else { caravanSpawnTimerTxt.setText(""); } } if (city) city.update(); // Update all customers for (var i = 0; i < customerList.length; i++) { customerList[i].update(); } // Update all miners for (var i = 0; i < minerList.length; i++) { minerList[i].update(); } // Update all factories for (var i = 0; i < factoryList.length; i++) { factoryList[i].update(); } // Update all carriers for (var i = 0; i < carrierList.length; i++) { carrierList[i].update(); } // Update all researchers for (var i = 0; i < researcherList.length; i++) { researcherList[i].update(); } // Update all oduncu for (var i = 0; i < oduncuList.length; i++) { oduncuList[i].update(); } // Update all toplayıcı for (var i = 0; i < toplayiciList.length; i++) { toplayiciList[i].update(); } // Remove depleted trees when collected for (var i = treeList.length - 1; i >= 0; i--) { if (treeList[i].collected) { treeList[i].destroy(); treeList.splice(i, 1); } } // Remove depleted food when collected or when out of resources for (var i = foodList.length - 1; i >= 0; i--) { if (foodList[i].collected) { foodList[i].destroy(); foodList.splice(i, 1); } } // Remove depleted mines and assign researcher to find new mine for (var i = mineList.length - 1; i >= 0; i--) { if (mineList[i].ore <= 0) { // Count existing resources before spawning new ones var treeCount = treeList.length; var oreCount = 0; var foodCount = 0; for (var j = 0; j < mineList.length; j++) { if (j !== i) { // Don't count the current depleted mine if (mineList[j].resourceType === 'ore') oreCount++; if (mineList[j].resourceType === 'food') foodCount++; } } // CRITICAL FIX: Capture the depleted mine type BEFORE removing it var depletedType = mineList[i].resourceType; // Remove the depleted mine mineList[i].destroy(); mineList.splice(i, 1); // Find an idle researcher only if we haven't reached the maximum of 4 var assigned = false; var canSpawnNew = false; if (depletedType === 'ore' && oreCount < 4) canSpawnNew = true; if (depletedType === 'food' && foodCount < 4) canSpawnNew = true; if (depletedType === 'wood' && treeCount < 4) canSpawnNew = true; if (canSpawnNew) { for (var r = 0; r < researcherList.length; r++) { var researcher = researcherList[r]; if (researcher.state === 'idle') { // Pick a random location in upper half for new mine var tx = 300 + Math.random() * 1400; var ty = 600 + Math.random() * 600; researcher.startResearch(tx, ty); assigned = true; break; } } } } } // --- ENEMY & SOLDIER SYSTEM --- // Enemy spawn logic if (!currentEnemy) { // 5 dakika bekleme (5*60*60 = 18000 tick, 60fps) if (lastEnemyDefeatedTime > 0 && LK.ticks - lastEnemyDefeatedTime < 18000) { // Waiting for cooldown } else { // Spawn new enemy at random location var enemyType = 1 + Math.floor(Math.random() * 10); // Calculate total soldier power var totalAttack = 0, totalDefense = 0; for (var i = 0; i < soldierList.length; i++) { totalAttack += soldierList[i].attack; totalDefense += soldierList[i].defense; } var avgPower = (totalAttack + totalDefense) / Math.max(1, soldierList.length * 2); // Power scale: sometimes strong, sometimes weak var powerScale = 0.7 + Math.random() * 1.3; // 0.7-2.0 if (Math.random() < 0.5) powerScale = Math.max(0.5, avgPower / 20 * (0.7 + Math.random() * 0.6)); var enemy = new Enemy(); enemy.setType(enemyType, powerScale); // Spawn at random place in upper half enemy.x = 400 + Math.random() * 1200; enemy.y = 600 + Math.random() * 600; game.addChild(enemy); currentEnemy = enemy; // Askerleri savaşa gönder for (var i = 0; i < soldierList.length; i++) { if (soldierList[i].state === 'idle') { soldierList[i].targetEnemy = enemy; soldierList[i].goTo(enemy.x + Math.random() * 40 - 20, enemy.y + Math.random() * 40 - 20); } } } } // Update all soldiers for (var i = 0; i < soldierList.length; i++) { soldierList[i].update(); } // Enemy and soldier fight logic if (currentEnemy) { // Soldiers attack if close enough var anyFighting = false; for (var i = 0; i < soldierList.length; i++) { var s = soldierList[i]; if (s.state === 'moving' && s.targetEnemy === currentEnemy) { // Check if close enough to fight var dx = s.x - currentEnemy.x; var dy = s.y - currentEnemy.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 60) { s.state = 'fighting'; } } if (s.state === 'fighting' && s.targetEnemy === currentEnemy) { anyFighting = true; // --- Savaş süresi %100 uzasın: Saldırıları yarı hızda uygula --- if (!s.fightTick) s.fightTick = 0; s.fightTick++; if (s.fightTick % 2 === 0) { // Sadece 2 tickte bir saldırı uygula (savaş süresi 2 katı) // Soldier attacks enemy var damage = Math.max(1, s.attack - currentEnemy.defense / 4 + Math.random() * 2); currentEnemy.hp -= damage; // Enemy attacks back (canavar saldırı gücü %100 artırıldı, yani 2x) var enemyDmg = Math.max(0, currentEnemy.attack * 2 - s.defense / 3 + Math.random() * 2); // Asker ölme şansı: toplu saldırıda birkaç asker ölsün if (Math.random() < 0.25) { // %25 ihtimalle asker ölür // Sadece savaşan askeri öldür s.destroy(); soldierList.splice(i, 1); i--; // Listeyi güncelledik, indexi azalt continue; } } // If enemy dead if (currentEnemy.hp <= 0) { // Reward var reward = Math.max(100, Math.min(1000, currentEnemy.reward)); money += reward; updateMoneyText(); // Remove enemy currentEnemy.destroy(); currentEnemy = null; lastEnemyDefeatedTime = LK.ticks; // Soldiers return to HQ for (var j = 0; j < soldierList.length; j++) { if (soldierList[j].state === 'fighting') { soldierList[j].targetEnemy = null; soldierList[j].returnToHQ(); } } break; } // --- Savaş kaybedilince askerler ölsün --- // If all soldiers are defeated (enemy still alive, but no fighting soldiers left) if (currentEnemy && // enemy exists !anyFighting && // no soldiers fighting soldierList.some(function (s) { return s.state === 'moving' || s.state === 'fighting'; }) // there were soldiers sent ) { // Remove all soldiers who were fighting or moving to fight this enemy for (var j = soldierList.length - 1; j >= 0; j--) { var s = soldierList[j]; if ((s.state === 'moving' || s.state === 'fighting') && s.targetEnemy === currentEnemy) { s.destroy(); soldierList.splice(j, 1); } } } } } // If no soldiers left fighting, enemy just waits if (!anyFighting && currentEnemy) { // If all soldiers dead or retreated, enemy could disappear after a while (not implemented) } } // Soldiers at HQ wait for next enemy for (var i = 0; i < soldierList.length; i++) { if (soldierList[i].state === 'idle' && !soldierList[i].targetEnemy) { // Place at HQ // Optionally, could move them to a waiting area } } }; // --- PRODUCT TYPES --- var productTypes = [{ name: "Ürün 1", price: 10 }, { name: "Ürün 2", price: 12 }, { name: "Ürün 3", price: 14 }, { name: "Ürün 4", price: 16 }, { name: "Ürün 5", price: 18 }, { name: "Ürün 6", price: 20 }, { name: "Ürün 7", price: 22 }, { name: "Ürün 8", price: 24 }, { name: "Ürün 9", price: 26 }, { name: "Ürün 10", price: 28 }]; // Show product/ore/factory status as text overlays var statusTexts = []; function updateStatusTexts() { // Remove old for (var i = 0; i < statusTexts.length; i++) { statusTexts[i].destroy(); } statusTexts = []; // Mines for (var i = 0; i < mineList.length; i++) { var resourceLabel = mineList[i].resourceType === 'wood' ? 'Odun: ' : mineList[i].resourceType === 'food' ? 'Yiyecek: ' : 'Cevher: '; var t = new Text2(resourceLabel + mineList[i].ore, { size: 36, fill: "#fff" }); t.anchor.set(0.5, 1); t.x = mineList[i].x; t.y = mineList[i].y - 80; game.addChild(t); statusTexts.push(t); } // Factories // (Ürün ve cevher yazıları gizlendi) // Shops // (Mağaza ürün yazıları gizlendi) } var statusTimer = LK.setInterval(updateStatusTexts, 400); // Prevent UI overlap with top left menu // (All UI is placed away from top left 100x100 px) // (Satın alma butonları kaldırıldığı için bu satırlar kaldırıldı) // --- LEVEL PANEL (BOTTOM LEFT) --- // --- LEVEL PANEL (BOTTOM LEFT) --- // Move level panel content into Araştırma Kampı panel var levelPanelBg = LK.getAsset('levelPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 300, // sol ortada açmak için x'i sola al y: 1366, // ekranın ortası (2048x2732 için) scaleX: 1.1, scaleY: 1.1 }); levelPanelBg.alpha = 0.97; levelPanelBg.visible = false; game.addChild(levelPanelBg); var levelPanelText = new Text2('', { size: 36, fill: "#000" }); levelPanelText.anchor.set(0.5, 0.5); levelPanelText.x = levelPanelBg.x; levelPanelText.y = levelPanelBg.y; levelPanelText.visible = false; game.addChild(levelPanelText); // --- UPGRADE BUTTONS AND COSTS --- var upgradeButtons = []; var upgradeCostTexts = []; var upgradeTypes = [{ label: "Şehir", key: "city", color: 0x4FC3F7, costBase: 100, costStep: 100 }, { label: "Fabrika", key: "factory", color: 0xFFD54F, costBase: 80, costStep: 80 }, { label: "Mağaza", key: "shop", color: 0x81C784, costBase: 80, costStep: 80 }, { label: "Madenci", key: "miner", color: 0xFF8A65, costBase: 60, costStep: 60 }, { label: "Taşıyıcı", key: "carrier", color: 0xBA68C8, costBase: 60, costStep: 60 }, { label: "Oduncu", key: "oduncu", color: 0x8BC34A, costBase: 60, costStep: 60 }, { label: "Toplayıcı", key: "toplayici", color: 0xE91E63, costBase: 60, costStep: 60 }]; // Layout constants for alignment var panelLeft = levelPanelBg.x - levelPanelBg.width / 2 + 40; var panelTop = levelPanelBg.y - levelPanelBg.height / 2 + 40; var rowHeight = 100; var btnSize = 70; // Panel content positioning var panelLeft = levelPanelBg.x - levelPanelBg.width / 2 + 40; var panelTop = levelPanelBg.y - levelPanelBg.height / 2 + 40; var rowHeight = 100; var btnSize = 70; var textSize = 60; var btnTextSize = 36; var costTextSize = 36; // Her satır için: seviye label + seviye değeri + maliyet + buton yanyana var levelLabels = []; var levelValues = []; // Hız artışı açıklama metni (Şehir label'ının üstünde) var speedInfoTxt = new Text2("Her seviye hızı %2 oranda artırır", { size: 32, fill: "#000", fontWeight: "bold" }); speedInfoTxt.anchor.set(0, 0.5); speedInfoTxt.x = panelLeft; speedInfoTxt.y = panelTop - rowHeight / 2 + textSize / 2 + 8; speedInfoTxt.visible = false; game.addChild(speedInfoTxt); for (var i = 0; i < upgradeTypes.length; i++) { // Seviye label var labelTxt = new Text2(upgradeTypes[i].label + ":", { size: 36, fill: "#000", fontWeight: "bold" }); labelTxt.anchor.set(0, 0.5); labelTxt.x = panelLeft; labelTxt.y = panelTop + i * rowHeight + textSize / 2 + 8; labelTxt.visible = false; game.addChild(labelTxt); levelLabels.push(labelTxt); // Seviye değeri var valueTxt = new Text2("", { size: 36, fill: "#000", fontWeight: "bold" }); valueTxt.anchor.set(0, 0.5); valueTxt.x = panelLeft + 180; valueTxt.y = panelTop + i * rowHeight + textSize / 2 + 8; valueTxt.visible = false; game.addChild(valueTxt); levelValues.push(valueTxt); // Cost text (hemen valueTxt'nin sağında, arada boşluk yok) var costTxt = new Text2("", { size: costTextSize, fill: "#000", fontWeight: "bold" }); costTxt.anchor.set(0, 0.5); // costTxt.x = valueTxt.x + valueTxt.width + 0; // width bilinmediği için güncelleLevelPanel'de ayarlanacak costTxt.y = panelTop + i * rowHeight + textSize / 2 + 8; costTxt.visible = false; game.addChild(costTxt); upgradeCostTexts.push(costTxt); // Upgrade button (costTxt'nin hemen sağında olacak, x'i updateLevelPanel'de ayarlanacak) var btn = new Text2("▲", { size: btnTextSize, fill: upgradeTypes[i].color, fontWeight: "bold" }); btn.anchor.set(0, 0.5); // btn.x = btnOffsetX; // x'i updateLevelPanel'de ayarlayacağız btn.y = panelTop + i * rowHeight + textSize / 2 + 8; btn.visible = false; game.addChild(btn); upgradeButtons.push(btn); } // --- LEVEL PANEL UPDATE --- function updateLevelPanel() { // Find max levels for each type var factoryLevel = 0; for (var i = 0; i < factoryList.length; i++) { if (factoryList[i].level > factoryLevel) factoryLevel = factoryList[i].level; } var shopLevel = 0; for (var i = 0; i < shopList.length; i++) { if (shopList[i].level > shopLevel) shopLevel = shopList[i].level; } var cityLevel = city && city.level ? city.level : 1; var minerLevel = 0; for (var i = 0; i < minerList.length; i++) { if (minerList[i].level > minerLevel) minerLevel = minerList[i].level; } var carrierLevel = 0; for (var i = 0; i < carrierList.length; i++) { if (carrierList[i].level > carrierLevel) carrierLevel = carrierList[i].level; } var oduncuLevel = 0; for (var i = 0; i < oduncuList.length; i++) { if (oduncuList[i].level > oduncuLevel) oduncuLevel = oduncuList[i].level; } var toplayiciLevel = 0; for (var i = 0; i < toplayiciList.length; i++) { if (toplayiciList[i].level > toplayiciLevel) toplayiciLevel = toplayiciList[i].level; } // Paneldeki eski toplu metni gizle levelPanelText.setText(""); // Her satır için seviyeleri güncelle var levels = [cityLevel, factoryLevel || 1, shopLevel || 1, minerLevel || 1, carrierLevel || 1, oduncuLevel || 1, toplayiciLevel || 1]; for (var i = 0; i < upgradeTypes.length; i++) { // Seviye değerini göster levelLabels[i].visible = levelPanelText.visible; levelValues[i].visible = levelPanelText.visible; levelValues[i].setText(levels[i]); // Maliyet ve butonları güncelle var cost = upgradeTypes[i].costBase + (levels[i] - 1) * upgradeTypes[i].costStep; upgradeCostTexts[i].setText("₺" + cost); upgradeCostTexts[i].visible = levelPanelText.visible; upgradeButtons[i].visible = levelPanelText.visible; // Cost text'i valueTxt'nin hemen sağında hizala (boşluk yok) upgradeCostTexts[i].x = levelValues[i].x + levelValues[i].width + 8; // Upgrade butonunu costTxt'nin hemen sağında hizala (boşluk yok) upgradeButtons[i].x = upgradeCostTexts[i].x + upgradeCostTexts[i].width + 8; // Gray out if not enough money if (money < cost) { upgradeButtons[i].alpha = 0.4; upgradeCostTexts[i].alpha = 0.4; } else { upgradeButtons[i].alpha = 1; upgradeCostTexts[i].alpha = 1; } } } var levelPanelTimer = LK.setInterval(updateLevelPanel, 400); // --- LEVEL UPGRADES (button per type) --- upgradeButtons[0].down = function () { // City var cost = 100 + ((city && city.level ? city.level : 1) - 1) * 100; if (city && money >= cost) { city.level++; money -= cost; updateMoneyText(); updateLevelPanel(); } }; upgradeButtons[1].down = function () { // Factory var factoryLevel = factoryList.length > 0 ? factoryList[0].level : 1; var cost = 80 + (factoryLevel - 1) * 80; if (factoryList.length > 0 && money >= cost) { factoryList[0].level++; money -= cost; updateMoneyText(); updateLevelPanel(); } }; upgradeButtons[2].down = function () { // Shop var shopLevel = shopList.length > 0 ? shopList[0].level : 1; var cost = 80 + (shopLevel - 1) * 80; if (shopList.length > 0 && money >= cost) { shopList[0].level++; money -= cost; updateMoneyText(); updateLevelPanel(); } }; upgradeButtons[3].down = function () { // Miner var minerLevel = minerList.length > 0 ? minerList[0].level : 1; var cost = 60 + (minerLevel - 1) * 60; if (minerList.length > 0 && money >= cost) { minerList[0].level++; money -= cost; updateMoneyText(); updateLevelPanel(); } }; upgradeButtons[4].down = function () { // Carrier var carrierLevel = carrierList.length > 0 ? carrierList[0].level : 1; var cost = 60 + (carrierLevel - 1) * 60; if (carrierList.length > 0 && money >= cost) { carrierList[0].level++; money -= cost; updateMoneyText(); updateLevelPanel(); } }; upgradeButtons[5].down = function () { // Oduncu var oduncuLevel = oduncuList.length > 0 ? oduncuList[0].level : 1; var cost = 60 + (oduncuLevel - 1) * 60; if (oduncuList.length > 0 && money >= cost) { oduncuList[0].level++; money -= cost; updateMoneyText(); updateLevelPanel(); } }; upgradeButtons[6].down = function () { // Toplayıcı var toplayiciLevel = toplayiciList.length > 0 ? toplayiciList[0].level : 1; var cost = 60 + (toplayiciLevel - 1) * 60; if (toplayiciList.length > 0 && money >= cost) { toplayiciList[0].level++; money -= cost; updateMoneyText(); updateLevelPanel(); } }; // Show/hide Araştırma Kampı panel and level panel content together researchCampImg.down = function () { var newVisible = !levelPanelBg.visible; levelPanelBg.visible = newVisible; levelPanelText.visible = newVisible; researchCampPanelBg.visible = newVisible; researchCampPanelText.visible = newVisible; researchCloseIcon.visible = newVisible; for (var i = 0; i < upgradeButtons.length; i++) { upgradeButtons[i].visible = newVisible; upgradeCostTexts[i].visible = newVisible; if (typeof levelLabels !== "undefined" && levelLabels[i]) levelLabels[i].visible = newVisible; if (typeof levelValues !== "undefined" && levelValues[i]) levelValues[i].visible = newVisible; } if (typeof speedInfoTxt !== "undefined") speedInfoTxt.visible = newVisible; }; // ÇALIŞANLAR PANELİ başlık, buton ve sayıları başta gizle workersPanelTitle.visible = false; buyWorkerMinerBtn.visible = false; buyWorkerCarrierBtn.visible = false; buyWorkerResearcherBtn.visible = false; buyWorkerOduncuBtn.visible = false; buyWorkerToplayiciBtn.visible = false; workerCountMinerText.visible = false; workerCountCarrierText.visible = false; workerCountResearcherText.visible = false; workerCountOduncuText.visible = false; workerCountToplayiciText.visible = false; // --- FABRIKA AÇ BUTONU --- var factoryOpenCost = 1000; // Başlangıç maliyeti 1000 lira // Fabrika resmi (şehir resminin altında) var fabrikaAcIcon = LK.getAsset('fabrikaAcIcon', { anchorX: 0.5, anchorY: 0.5, x: city.x, // Şehir ile aynı x konumunda y: city.y + 200, // Şehir resminin 200px altında (1 satır aşağı) scaleX: 0.5, scaleY: 0.5 }); game.addChild(fabrikaAcIcon); // Fabrika aç buton container'ı (resmin altında) var fabrikaAcContainer = new Container(); fabrikaAcContainer.x = fabrikaAcIcon.x; // Resim ile aynı x konumunda fabrikaAcContainer.y = fabrikaAcIcon.y + 200; // Resmin 200px altında (1 satır daha aşağı) game.addChild(fabrikaAcContainer); // Fabrika aç yazısı var fabrikaAcText = new Text2('Fabrika Aç', { size: 36, fill: "#fff", fontWeight: "bold" }); fabrikaAcText.anchor.set(0.5, 0.5); fabrikaAcText.x = 0; // Container'ın merkezinde fabrikaAcText.y = -15; // Biraz yukarıda fabrikaAcContainer.addChild(fabrikaAcText); // Fiyat yazısı var fabrikaAcPrice = new Text2('₺' + factoryOpenCost, { size: 30, fill: "#fff", fontWeight: "bold" }); fabrikaAcPrice.anchor.set(0.5, 0.5); fabrikaAcPrice.x = 0; // Container'ın merkezinde fabrikaAcPrice.y = 15; // Text'in altında fabrikaAcContainer.addChild(fabrikaAcPrice); // Container'a tıklama olayı ekle var fabrikaAcBtn = fabrikaAcContainer; // Eski referansı korumak için fabrikaAcContainer.down = function () { if (money >= factoryOpenCost) { money -= factoryOpenCost; updateMoneyText(); // Yeni fabrika oluştur var newFactory = new Factory(); // Haritanın rastgele bir yerine yerleştir (üst yarı) newFactory.x = 300 + Math.random() * 1400; newFactory.y = 600 + Math.random() * 800; factoryList.push(newFactory); game.addChild(newFactory); // Fabrika açma maliyetini 10 katına çıkar factoryOpenCost *= 10; fabrikaAcPrice.setText('₺' + factoryOpenCost); } }; // Buton rengini para durumuna göre güncelle var updateFactoryBtnColor = LK.setInterval(function () { if (money >= factoryOpenCost) { fabrikaAcText.fill = "#fff"; // Beyaz fabrikaAcPrice.fill = "#fff"; // Beyaz fabrikaAcContainer.alpha = 1; } else { fabrikaAcText.fill = "#fff"; // Beyaz fabrikaAcPrice.fill = "#fff"; // Beyaz fabrikaAcContainer.alpha = 0.6; } }, 100); ;
===================================================================
--- original.js
+++ change.js
@@ -1877,18 +1877,9 @@
businessPanelCaravanBtn.visible = true;
game.addChild(businessPanelCaravanBtn);
// Butona tıklanınca kervan panelini aç
businessPanelCaravanBtn.down = function () {
- // Sadece kervan geldiyse paneli aç
- if (caravanArrived) {
- showCaravanPanel(true);
- // Panel açıldığında kervan sprite'ı haritada gizlensin (panel fonksiyonu zaten bunu yapıyor)
- } else {
- // Kervan yoksa kısa bilgi ver
- if (typeof caravanSpawnTimerTxt !== "undefined") {
- caravanSpawnTimerTxt.setText("Kervan henüz gelmedi!");
- }
- }
+ // Artık işlev kervan sprite'ına taşındı, burada bir şey yapılmıyor.
};
var caravanPanelTitle = new Text2('Kervan Ticareti', {
size: 42,
fill: "#000",
@@ -2621,8 +2612,21 @@
caravan.targetY = businessTargetY;
caravan.lastX = caravan.x;
caravan.lastY = caravan.y;
game.addChild(caravan);
+ // --- Kervan sprite'ına tıklama ile panel açma ---
+ // Sadece kervan geldiyse paneli aç
+ caravan.down = function () {
+ if (caravanArrived) {
+ showCaravanPanel(true);
+ // Panel açıldığında kervan sprite'ı haritada gizlensin (panel fonksiyonu zaten bunu yapıyor)
+ } else {
+ // Kervan yoksa kısa bilgi ver
+ if (typeof caravanSpawnTimerTxt !== "undefined") {
+ caravanSpawnTimerTxt.setText("Kervan henüz gelmedi!");
+ }
+ }
+ };
caravanActive = true;
caravanArrived = false;
caravanPanelOpen = false;
caravanTradeMade = false;
Kazma cevheri kazma hareketli resmi.. In-Game asset. 2d. High contrast. No shadows
Cevher. In-Game asset. 2d. High contrast. No shadows
Üstten olacak şekilde hafif ormanlık ve dağlık olacak şekilde çayır.. In-Game asset. 2d. High contrast. Gölgelikler olsun. Map tarzı bir harita.. In-Game asset. 2d. High contrast. No shadows
Madenci. In-Game asset. 2d. High contrast. No shadows
Savaşçı. In-Game asset. 2d. High contrast. No shadows
Kılıç kalkan ok yay gibi savaş malzemeleri taşıyan at arabası. In-Game asset. 2d. High contrast. No shadows
Demirci, Eski savaş malzemeleri üretiyor. In-Game asset. 2d. High contrast. No shadows
Okçu savaşçı. In-Game asset. 2d. High contrast. No shadows
Eski çağ savaş malzemesi dükkanı. In-Game asset. 2d. High contrast. No shadows
Cevher. In-Game asset. 2d. High contrast. No shadows
Cevher. In-Game asset. 2d. High contrast. No shadows
Savaşçı kampı. In-Game asset. 2d. High contrast. No shadows
Büyük savaşçı kampı uzaktan görünüm. In-Game asset. 2d. High contrast. No shadows
Siyah sayfa. In-Game asset. 2d. High contrast. No shadows
Madenci. In-Game asset. 2d. High contrast. No shadows
Demirci ve madencilerin olduğu uzaktan bakış bir kamp alanı oluştur.. In-Game asset. 2d. High contrast. No shadows
Eski kılıçlı silahlar ve cevherlerin vs. olduğu uzaktan bakış depo alanı.. In-Game asset. 2d. High contrast. No shadows
Canavar. In-Game asset. 2d. High contrast. No shadows
Düşman canavar. In-Game asset. 2d. High contrast. No shadows
Düşman farklı canavar. In-Game asset. 2d. High contrast. No shadows
Kılıçlar savaş iconu. In-Game asset. 2d. High contrast. No shadows
Canavar. In-Game asset. 2d. High contrast. No shadows
Atlı savaşçı asker. In-Game asset. 2d. High contrast. No shadows
Mızraklı piyade asker. In-Game asset. 2d. High contrast. No shadows
Okçu piyade savaşçı. In-Game asset. 2d. High contrast. No shadows
Yaya Piyade savaşçı. In-Game asset. 2d. High contrast. No shadows
Zırhlı Savaşçı. In-Game asset. 2d. High contrast. No shadows
Yetişen yiyecek. In-Game asset. 2d. High contrast. No shadows
Yetişen Yiyecek. In-Game asset. 2d. High contrast. No shadows
Dalında çilek. In-Game asset. 2d. High contrast. No shadows
Dalında Meyve. In-Game asset. 2d. High contrast. No shadows
Oduncu. In-Game asset. 2d. High contrast. No shadows
Oduncu. In-Game asset. 2d. High contrast. No shadows
Oduncu. In-Game asset. 2d. High contrast. No shadows
Ağaç. In-Game asset. 2d. High contrast. No shadows
Ağaç. In-Game asset. 2d. High contrast. No shadows
Toplayıcı. In-Game asset. 2d. High contrast. No shadows
Toplayıcı. In-Game asset. 2d. High contrast. No shadows
İnşaat eski çağ. In-Game asset. 2d. High contrast. No shadows
Eski çağ savaş karavan. In-Game asset. 2d. High contrast. No shadows
Kalkan. In-Game asset. 2d. High contrast. No shadows
Kalkanlı Savaş Arabası. In-Game asset. 2d. High contrast. No shadows
Koçbaşı. In-Game asset. 2d. High contrast. No shadows
Kılıç. In-Game asset. 2d. High contrast. No shadows
Mızrak. In-Game asset. 2d. High contrast. No shadows
Ok ve Yay birlikte eski çağ. In-Game asset. 2d. High contrast. No shadows
Büyük savaş baltası. In-Game asset. 2d. High contrast. No shadows
Savaş Zırhı. In-Game asset. 2d. High contrast. No shadows
Miğfer. In-Game asset. 2d. High contrast. No shadows
Maden arayıcı eski çağ. In-Game asset. 2d. High contrast. No shadows
Arkaplan müziği için kullanacağım müzik ile ilgili bir icon. In-Game asset. 2d. High contrast. No shadows