/**** * 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: 84, fill: 0xFF0000, fontWeight: "bold" }); closeIcon.anchor.set(0.5, 0.5); closeIcon.x = panelBg.x + panelBg.width / 2 - 60; closeIcon.y = panelBg.y - panelBg.height / 2 + 60; closeIcon.visible = false; self.addChild(closeIcon); // Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle var closeHitArea = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: closeIcon.width * 1.2, height: closeIcon.height * 1.2, color: 0x000000, alpha: 0 // tamamen şeffaf }); closeHitArea.x = closeIcon.x; closeHitArea.y = closeIcon.y; closeHitArea.visible = false; self.addChild(closeHitArea); closeHitArea.down = function () { self.toggle(); }; 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 + 2 * 100; // Move city 2 columns (200px) right self.y = 150 + 2 * 100; // Move city 2 rows (200px) down 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) { // Önce mağaza stoğundan kontrol et 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 if (typeof hangarStock !== "undefined" && hangarStock.product && hangarStock.product[self.wantProductType] > 0) { // Hangar stoğunda varsa oradan al hangarStock.product[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 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 }; } 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; } else if (typeof hangarStock !== "undefined" && hangarStock.product && hangarStock.product[p] > 0) { // Hangar stoğunda başka ürün varsa oradan al hangarStock.product[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 toplam can ve gücü %75 artırıldı (attack, defense, maxHP, reward) self.attack = Math.round((10 + type * 2 * powerScale) * 1.75); self.defense = Math.round((10 + type * 2 * powerScale) * 1.75); self.maxHP = Math.round((50 + type * 10 * powerScale) * 1.75); self.hp = self.maxHP; self.reward = Math.round((100 + (type - 1) * 100 * powerScale) * 1.75); // Not: Saldırı, savunma, can ve ödül %75 artırı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 () { // --- HANGAR: Hammaddeleri hangarStock'tan kullan --- // Önce kendi buffer'ından, yoksa hangarStock'tan çek var oreAvailable = self.oreBuffer > 0 ? self.oreBuffer : typeof hangarStock !== "undefined" ? hangarStock.ore : 0; var woodAvailable = self.woodBuffer > 0 ? self.woodBuffer : typeof hangarStock !== "undefined" ? hangarStock.wood : 0; var foodAvailable = self.foodBuffer > 0 ? self.foodBuffer : typeof hangarStock !== "undefined" ? hangarStock.food : 0; if (oreAvailable > 0 && woodAvailable > 0 && foodAvailable > 0) { self.processCounter++; if (self.processCounter >= Math.max(10, self.processTime - (self.level - 1) * 10)) { // Consume 1 of each resource type for production if (self.oreBuffer > 0) self.oreBuffer--;else if (typeof hangarStock !== "undefined" && hangarStock.ore > 0) hangarStock.ore--; if (self.woodBuffer > 0) self.woodBuffer--;else if (typeof hangarStock !== "undefined" && hangarStock.wood > 0) hangarStock.wood--; if (self.foodBuffer > 0) self.foodBuffer--;else if (typeof hangarStock !== "undefined" && hangarStock.food > 0) hangarStock.food--; // Pick a random product type to produce var prodType = Math.floor(Math.random() * 10); self.productBuffer[prodType]++; // --- HANGAR: Ürünleri hangarStock'a da ekle --- if (typeof hangarStock !== "undefined" && hangarStock.product) { hangarStock.product[prodType] = (hangarStock.product[prodType] || 0) + 1; } self.processCounter = 0; if (typeof updateHangarPanelContent === "function") updateHangarPanelContent(); } } 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('researcher_icon', { anchorX: 0.5, anchorY: 0.5 }); 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 ****/ // Araştırmacı için özel renkli icon // Koçbaşı // Kalkanlı Savaş Arabası // At Arabası // Savaş Baltası // Zırh // Ok ve Yay // Miğfer // Kalkan // Mızrak // Kılıç // Ancient war product icons (unique color for each) // Add a background image to the game // Soldier assets // Enemy assets (10 types) // Global lists for soldiers and enemy var soldierList = []; var currentEnemy = null; var lastEnemyDefeatedTime = 0; // --- KERVAN SİSTEMİ: GELİŞMİŞ TİCARET PANELİ ve LOJİSTİK --- // Kervan state değişkenleri var caravan = null; var caravanActive = false; var caravanArrived = false; var caravanPanelOpen = false; var caravanTradeMade = false; var caravanTimeout = null; var caravanNextArrivalTick = 0; var caravanStock = null; var caravanProductRows = []; var caravanPanelBg, caravanPanelTitle, caravanPanelContent, caravanPanelCloseIcon; var caravanPanelSellRows = []; var caravanPanelTimer = null; var caravanLeaveTick = 0; var caravanArriveTargetX = 0, caravanArriveTargetY = 0; var caravanDepoTargetX = 0, caravanDepoTargetY = 0; // Kervan stoğu oluşturucu function generateCaravanStock() { // Hammaddeler: min 5, max 30 var ore = 5 + Math.floor(Math.random() * 26); var wood = 5 + Math.floor(Math.random() * 26); var food = 5 + Math.floor(Math.random() * 26); // Ürünlerden rastgele 5 çeşit, her biri 1-20 arası var productStock = []; var productIndexes = []; for (var i = 0; i < productTypes.length; i++) productIndexes.push(i); // Karıştır for (var i = productIndexes.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var tmp = productIndexes[i]; productIndexes[i] = productIndexes[j]; productIndexes[j] = tmp; } var selectedProducts = productIndexes.slice(0, 5); for (var i = 0; i < productTypes.length; i++) productStock[i] = 0; for (var i = 0; i < selectedProducts.length; i++) { productStock[selectedProducts[i]] = 1 + Math.floor(Math.random() * 20); } return { ore: ore, wood: wood, food: food, product: productStock }; } // Kervan panelini oluştur (ilk seferde bir kez) function createCaravanPanel() { if (caravanPanelBg) return; caravanPanelBg = LK.getAsset('caravanPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, scaleX: 1.1, scaleY: 1.1 }); caravanPanelBg.alpha = 0.97; caravanPanelBg.visible = false; game.addChild(caravanPanelBg); caravanPanelTitle = new Text2('Kervan', { size: 42, fill: "#000", fontWeight: "bold" }); caravanPanelTitle.anchor.set(0.5, 0.5); caravanPanelTitle.x = caravanPanelBg.x; caravanPanelTitle.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 40; // 1 satır yukarı taşı caravanPanelTitle.visible = false; game.addChild(caravanPanelTitle); caravanPanelContent = new Container(); caravanPanelContent.x = caravanPanelBg.x; // 1 satır yukarı taşı (ör: %18 yerine %25 yapıldıysa, şimdi %30 yap) caravanPanelContent.y = caravanPanelBg.y - 60 - caravanPanelBg.height * 0.18; // 1 satır daha yukarı caravanPanelContent.visible = false; game.addChild(caravanPanelContent); // Kapat ikonu caravanPanelCloseIcon = new Text2('✕', { size: 84, fill: 0xFF0000, fontWeight: "bold" }); caravanPanelCloseIcon.anchor.set(0.5, 0.5); caravanPanelCloseIcon.x = caravanPanelBg.x + caravanPanelBg.width / 2 - 60; caravanPanelCloseIcon.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 40; // 1 satır yukarı taşı caravanPanelCloseIcon.visible = false; game.addChild(caravanPanelCloseIcon); // Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle var caravanPanelCloseHitArea = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: caravanPanelCloseIcon.width * 1.2, height: caravanPanelCloseIcon.height * 1.2, color: 0x000000, alpha: 0 }); caravanPanelCloseHitArea.x = caravanPanelCloseIcon.x; caravanPanelCloseHitArea.y = caravanPanelCloseIcon.y; caravanPanelCloseHitArea.visible = false; game.addChild(caravanPanelCloseHitArea); caravanPanelCloseHitArea.down = function () { toggleCaravanPanel(false); }; caravanPanelCloseIcon.down = function () { toggleCaravanPanel(false); }; } // Kervan panelini aç/kapat ve güncelle function toggleCaravanPanel(forceOpen) { var newVisible = typeof forceOpen === "boolean" ? forceOpen : !caravanPanelBg.visible; // Paneli en ön planda açmak için zIndex'i en yükseğe ayarla if (caravanPanelBg && typeof caravanPanelBg.setIndex === "function") { caravanPanelBg.setIndex(9999); } if (caravanPanelTitle && typeof caravanPanelTitle.setIndex === "function") { caravanPanelTitle.setIndex(9999); } if (caravanPanelCloseIcon && typeof caravanPanelCloseIcon.setIndex === "function") { caravanPanelCloseIcon.setIndex(9999); } if (caravanPanelContent && typeof caravanPanelContent.setIndex === "function") { caravanPanelContent.setIndex(9999); } caravanPanelBg.visible = newVisible; caravanPanelTitle.visible = newVisible; caravanPanelCloseIcon.visible = newVisible; caravanPanelContent.visible = newVisible; caravanPanelOpen = newVisible; // Panel açılırsa kalan süreyi sıfırla if (newVisible) { // Paneli ortala if (caravanPanelBg) { caravanPanelBg.x = 2048 / 2; caravanPanelBg.y = 2732 / 2; } if (caravanPanelTitle) { caravanPanelTitle.x = 2048 / 2; caravanPanelTitle.y = 2732 / 2 - (caravanPanelBg ? caravanPanelBg.height / 2 : 0) + 60; } if (caravanPanelContent) { caravanPanelContent.x = 2048 / 2; // YAZI ve İŞLEVLERİ %25 yukarı taşı (arka plan sabit kalacak) // 1 satır yukarı taşımak için offseti azalt (ör: %25 yerine %18) caravanPanelContent.y = 2732 / 2 - 30 - (caravanPanelBg ? caravanPanelBg.height * 0.18 : 0); } if (caravanPanelCloseIcon) { caravanPanelCloseIcon.x = 2048 / 2 + (caravanPanelBg ? caravanPanelBg.width / 2 : 0) - 30; caravanPanelCloseIcon.y = 2732 / 2 - (caravanPanelBg ? caravanPanelBg.height / 2 : 0) + 30; } // Panel arka planını yazının en altına kadar uzat if (caravanPanelBg && caravanPanelContent && caravanPanelContent.children.length > 0) { // Son satırın y'sini bul var lastChild = caravanPanelContent.children[caravanPanelContent.children.length - 1]; var contentBottom = lastChild.y + (lastChild.height ? lastChild.height / 2 : 0); var panelTop = caravanPanelBg.y - caravanPanelBg.height / 2; var panelBottom = panelTop + caravanPanelBg.height; var desiredHeight = contentBottom + 60; // 60px alt boşluk var newHeight = Math.max(caravanPanelBg.height, desiredHeight); caravanPanelBg.height = newHeight; // Panel başlığını ve kapat ikonunu yeni yüksekliğe göre hizala if (caravanPanelTitle) { caravanPanelTitle.y = caravanPanelBg.y - newHeight / 2 + 60; } if (caravanPanelCloseIcon) { caravanPanelCloseIcon.y = caravanPanelBg.y - newHeight / 2 + 30; } } caravanLeaveTick = LK.ticks + 3600; // 1 dakika sonra ayrılacak (60*60) updateCaravanPanelRows(); } // Panel kapatılırsa, ana ekranı göster if (!newVisible) { showMainPageElements(true); } } // Ana sayfa elemanlarını göster/gizle function showMainPageElements(show) { karargahImg.visible = show; karargahLabel.visible = show; workerStartImg.visible = show; kampimizLabel.visible = show; researchCampImg.visible = show; researchCampLabel.visible = show; researchCampRightImg.visible = show; workerPanelLabel.visible = show; // workerPanelTopImg.visible = show; // Removed: workerPanelTopImg is not defined // depoLabel.visible = show; // Removed: depoLabel is not defined if (city) city.visible = show; for (var i = 0; i < minerList.length; i++) minerList[i].visible = show; for (var i = 0; i < carrierList.length; i++) carrierList[i].visible = show; for (var i = 0; i < researcherList.length; i++) researcherList[i].visible = show; for (var i = 0; i < oduncuList.length; i++) oduncuList[i].visible = show; for (var i = 0; i < toplayiciList.length; i++) toplayiciList[i].visible = show; for (var i = 0; i < customerList.length; i++) customerList[i].visible = show; for (var i = 0; i < mineList.length; i++) mineList[i].visible = show; for (var i = 0; i < factoryList.length; i++) factoryList[i].visible = show; for (var i = 0; i < shopList.length; i++) shopList[i].visible = show; for (var i = 0; i < soldierList.length; i++) soldierList[i].visible = show; for (var i = 0; i < treeList.length; i++) treeList[i].visible = show; for (var i = 0; i < foodList.length; i++) foodList[i].visible = show; if (currentEnemy) currentEnemy.visible = show; for (var i = 0; i < statusTexts.length; i++) statusTexts[i].visible = show; } // Kervan panel satırlarını güncelle function updateCaravanPanelRows() { // Paneli temizle while (caravanPanelContent.children.length > 0) { var c = caravanPanelContent.children[0]; c.destroy && c.destroy(); caravanPanelContent.removeChild(c); } caravanProductRows = []; caravanPanelSellRows = []; var y = 0; var rowHeight = 80; var colLabelX = -caravanPanelBg.width * 0.35; var colValueX = 0; var colBtnX = caravanPanelBg.width * 0.35 - 30; // Font büyüklüklerini 1 boy artır var caravanFontSize = 36; var caravanBtnFontSize = 32; var caravanSmallFontSize = 26; var caravanProfitFontSize = 24; // --- Kervan geldiğinde kalan süreyi gösteren sayaç ekle --- if (caravanArrived && caravanLeaveTick > LK.ticks) { var ticksLeft = caravanLeaveTick - 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"; var caravanTimerTxt = new Text2("Kervan gidecek: " + timeStr, { size: caravanFontSize, fill: 0xD32F2F, fontWeight: "bold" }); caravanTimerTxt.anchor.set(0.5, 0.5); caravanTimerTxt.x = 0; caravanTimerTxt.y = y - 20; // 1 satır yukarı taşı caravanPanelContent.addChild(caravanTimerTxt); y += rowHeight - 40; } // --- Kervandan AL (hammadde ve ürünler) --- // Hammaddeler var matList = [{ key: "ore", label: "Cevher", price: Math.round(productTypes[0].price * 1.1) }, { key: "wood", label: "Odun", price: Math.round(productTypes[1].price * 1.1) }, { key: "food", label: "Yiyecek", price: Math.round(productTypes[2].price * 1.1) }]; for (var i = 0; i < matList.length; i++) { var mat = matList[i]; var rowBg = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: caravanPanelBg.width * 0.85, height: rowHeight - 10, color: 0xf5f5f5, shape: 'box', x: 0, y: y }); rowBg.alpha = 0.85; caravanPanelContent.addChild(rowBg); // --- Hammadde isminin yanına icon ekle (Kervan paneli) --- var matIconMap = { ore: "ore1", wood: "wood1", food: "food1" }; var iconAsset = LK.getAsset(matIconMap[mat.key], { anchorX: 0.5, anchorY: 0.5, x: colLabelX, y: y - 20, scaleX: 0.6, scaleY: 0.6 }); caravanPanelContent.addChild(iconAsset); // Iconun sağında hammadde ismi var labelTxt = new Text2(mat.label + ":", { size: caravanFontSize, fill: "#000", fontWeight: "bold" }); labelTxt.anchor.set(0, 0.5); labelTxt.x = colLabelX + 60; labelTxt.y = y - 20; caravanPanelContent.addChild(labelTxt); var valueTxt = new Text2("" + (caravanStock ? caravanStock[mat.key] : 0), { size: caravanFontSize, fill: "#333" }); valueTxt.anchor.set(0.5, 0.5); valueTxt.x = colValueX; valueTxt.y = y - 20; caravanPanelContent.addChild(valueTxt); var price = mat.price; var buyBtn = new Text2("Al (₺" + price + ")", { size: caravanBtnFontSize, fill: 0x2E7D32, fontWeight: "bold" }); buyBtn.anchor.set(1, 0.5); buyBtn.x = colBtnX; buyBtn.y = y - 20; buyBtn.alpha = caravanStock && caravanStock[mat.key] > 0 ? 1 : 0.4; (function (mat, valueTxt, buyBtn) { buyBtn.down = function () { if (caravanStock && caravanStock[mat.key] > 0 && money >= mat.price) { money -= mat.price; updateMoneyText(); caravanStock[mat.key]--; valueTxt.setText("" + caravanStock[mat.key]); buyBtn.alpha = caravanStock[mat.key] <= 0 ? 0.4 : 1; // --- HANGAR: Stoğa ekle --- if (typeof hangarStock !== "undefined") { hangarStock[mat.key] = (hangarStock[mat.key] || 0) + 1; } updateHangarPanelContent && updateHangarPanelContent(); caravanTradeMade = true; } }; })(mat, valueTxt, buyBtn); caravanPanelContent.addChild(buyBtn); caravanProductRows.push({ labelTxt: labelTxt, valueTxt: valueTxt, buyBtn: buyBtn }); y += rowHeight; } // Ürünler (kervandan AL) for (var i = 0; i < productTypes.length; i++) { if (!caravanStock || !caravanStock.product || caravanStock.product[i] <= 0) continue; var rowBg = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: caravanPanelBg.width * 0.85, height: rowHeight - 10, color: 0xf5f5f5, shape: 'box', x: 0, y: y }); rowBg.alpha = 0.85; caravanPanelContent.addChild(rowBg); // --- Ürün isminin yanına icon ekle --- // Icon assetini oluştur var iconAsset = LK.getAsset(productTypes[i].icon, { anchorX: 0.5, anchorY: 0.5, x: colLabelX, y: y - 20, scaleX: 0.6, scaleY: 0.6 }); caravanPanelContent.addChild(iconAsset); // Iconun sağında ürün ismi var labelTxt = new Text2(productTypes[i].name + ":", { size: caravanFontSize, fill: "#000", fontWeight: "bold" }); labelTxt.anchor.set(0, 0.5); // Iconun sağında 60px boşluk bırak labelTxt.x = colLabelX + 60; labelTxt.y = y - 20; caravanPanelContent.addChild(labelTxt); var valueTxt = new Text2("" + (caravanStock.product[i] || 0), { size: caravanFontSize, fill: "#333" }); valueTxt.anchor.set(0.5, 0.5); valueTxt.x = colValueX; valueTxt.y = y - 20; caravanPanelContent.addChild(valueTxt); var price = Math.round(productTypes[i].price * 1.1); // Ortalama fiyatı hesapla (örnek: ürünün base fiyatı) var avgPrice = productTypes[i].price; // Kar/zarar oranı hesapla var profitPercent = Math.round((price - avgPrice) / avgPrice * 100); var profitColor = profitPercent > 0 ? "#2E7D32" : profitPercent < 0 ? "#d32f2f" : "#333"; var profitText = profitPercent > 0 ? "Kâr: %" + profitPercent : profitPercent < 0 ? "Zarar: %" + Math.abs(profitPercent) : "Kâr: %0"; var profitTxt = new Text2(profitText, { size: caravanProfitFontSize, fill: profitColor }); profitTxt.anchor.set(0, 0.5); profitTxt.x = colValueX + 80; profitTxt.y = y - 20; caravanPanelContent.addChild(profitTxt); var buyBtn = new Text2("Al (₺" + price + ")", { size: caravanBtnFontSize, fill: 0x2E7D32, fontWeight: "bold" }); buyBtn.anchor.set(1, 0.5); buyBtn.x = colBtnX; buyBtn.y = y - 20; buyBtn.alpha = caravanStock.product[i] > 0 ? 1 : 0.4; (function (i, valueTxt, buyBtn) { buyBtn.down = function () { if (caravanStock && caravanStock.product[i] > 0 && money >= price) { money -= price; updateMoneyText(); caravanStock.product[i]--; valueTxt.setText("" + caravanStock.product[i]); buyBtn.alpha = caravanStock.product[i] <= 0 ? 0.4 : 1; // --- HANGAR: Stoğa ekle --- if (typeof hangarStock !== "undefined" && hangarStock.product) { hangarStock.product[i] = (hangarStock.product[i] || 0) + 1; } updateHangarPanelContent && updateHangarPanelContent(); caravanTradeMade = true; } }; })(i, valueTxt, buyBtn); caravanPanelContent.addChild(buyBtn); caravanProductRows.push({ labelTxt: labelTxt, valueTxt: valueTxt, buyBtn: buyBtn, profitTxt: profitTxt }); y += rowHeight; } // --- Kervana SAT (ürün ve hammadde) --- // Satılabilir ürünler: oyuncunun stoğunda olanlar var sellTitle = new Text2("Kervana Satış", { size: caravanFontSize, fill: 0x1565C0, fontWeight: "bold" }); sellTitle.anchor.set(0.5, 0.5); sellTitle.x = 0; sellTitle.y = y + 10; // 1 satır yukarı taşı caravanPanelContent.addChild(sellTitle); y += rowHeight + 10; // Hammaddelerden satılabilenler var playerMats = [{ key: "ore", label: "Cevher", getCount: function getCount() { var total = 0; for (var f = 0; f < factoryList.length; f++) total += factoryList[f].oreBuffer || 0; return total; }, price: Math.round(productTypes[0].price * 0.9) }, { key: "wood", label: "Odun", getCount: function getCount() { var total = 0; for (var f = 0; f < factoryList.length; f++) total += factoryList[f].woodBuffer || 0; return total; }, price: Math.round(productTypes[1].price * 0.9) }, { key: "food", label: "Yiyecek", getCount: function getCount() { var total = 0; for (var f = 0; f < factoryList.length; f++) total += factoryList[f].foodBuffer || 0; return total; }, price: Math.round(productTypes[2].price * 0.9) }]; for (var i = 0; i < playerMats.length; i++) { var mat = playerMats[i]; var rowBg = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: caravanPanelBg.width * 0.85, height: rowHeight - 10, color: 0xe3f2fd, shape: 'box', x: 0, y: y }); rowBg.alpha = 0.85; caravanPanelContent.addChild(rowBg); // --- Hammadde isminin yanına icon ekle (Kervan paneli satış kısmı) --- var matIconMap = { ore: "ore1", wood: "wood1", food: "food1" }; var iconAsset = LK.getAsset(matIconMap[mat.key], { anchorX: 0.5, anchorY: 0.5, x: colLabelX, y: y - 20, scaleX: 0.6, scaleY: 0.6 }); caravanPanelContent.addChild(iconAsset); // Iconun sağında hammadde ismi var labelTxt = new Text2(mat.label + ":", { size: caravanFontSize, fill: "#000", fontWeight: "bold" }); labelTxt.anchor.set(0, 0.5); labelTxt.x = colLabelX + 60; labelTxt.y = y - 20; caravanPanelContent.addChild(labelTxt); var valueTxt = new Text2("" + mat.getCount(), { size: caravanFontSize, fill: "#333" }); valueTxt.anchor.set(0.5, 0.5); valueTxt.x = colValueX; valueTxt.y = y - 20; caravanPanelContent.addChild(valueTxt); var price = mat.price; var sellBtn = new Text2("Sat (₺" + price + ")", { size: caravanBtnFontSize, fill: 0xd32f2f, fontWeight: "bold" }); sellBtn.anchor.set(1, 0.5); sellBtn.x = colBtnX; sellBtn.y = y - 20; sellBtn.alpha = mat.getCount() > 0 ? 1 : 0.4; (function (mat, valueTxt, sellBtn) { sellBtn.down = function () { // Satış: ilk bulduğu fabrikadan 1 adet düş for (var f = 0; f < factoryList.length; f++) { if (factoryList[f][mat.key + "Buffer"] > 0) { factoryList[f][mat.key + "Buffer"]--; money += mat.price; updateMoneyText(); valueTxt.setText("" + mat.getCount()); sellBtn.alpha = mat.getCount() <= 0 ? 0.4 : 1; caravanTradeMade = true; break; } } }; })(mat, valueTxt, sellBtn); caravanPanelContent.addChild(sellBtn); caravanPanelSellRows.push({ labelTxt: labelTxt, valueTxt: valueTxt, sellBtn: sellBtn }); y += rowHeight; } // Ürünlerden satılabilenler for (var i = 0; i < productTypes.length; i++) { // Oyuncunun stoğunda var mı? var total = 0; for (var f = 0; f < factoryList.length; f++) total += factoryList[f].productBuffer[i] || 0; if (total <= 0) continue; var rowBg = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: caravanPanelBg.width * 0.85, height: rowHeight - 10, color: 0xe3f2fd, shape: 'box', x: 0, y: y }); rowBg.alpha = 0.85; caravanPanelContent.addChild(rowBg); // --- Ürün isminin yanına icon ekle (satış paneli) --- var iconAsset = LK.getAsset(productTypes[i].icon, { anchorX: 0.5, anchorY: 0.5, x: colLabelX, y: y - 20, scaleX: 0.6, scaleY: 0.6 }); caravanPanelContent.addChild(iconAsset); var labelTxt = new Text2(productTypes[i].name + ":", { size: caravanFontSize, fill: "#000", fontWeight: "bold" }); labelTxt.anchor.set(0, 0.5); labelTxt.x = colLabelX + 60; labelTxt.y = y - 20; caravanPanelContent.addChild(labelTxt); var valueTxt = new Text2("" + total, { size: caravanFontSize, fill: "#333" }); valueTxt.anchor.set(0.5, 0.5); valueTxt.x = colValueX; valueTxt.y = y - 20; caravanPanelContent.addChild(valueTxt); var price = Math.round(productTypes[i].price * 0.9); // Ortalama fiyatı hesapla (örnek: ürünün base fiyatı) var avgPrice = productTypes[i].price; // Kar/zarar oranı hesapla var profitPercent = Math.round((price - avgPrice) / avgPrice * 100); var profitColor = profitPercent > 0 ? "#2E7D32" : profitPercent < 0 ? "#d32f2f" : "#333"; var profitText = profitPercent > 0 ? "Kâr: %" + profitPercent : profitPercent < 0 ? "Zarar: %" + Math.abs(profitPercent) : "Kâr: %0"; var profitTxt = new Text2(profitText, { size: caravanProfitFontSize, fill: profitColor }); profitTxt.anchor.set(0, 0.5); profitTxt.x = colValueX + 80; profitTxt.y = y - 20; caravanPanelContent.addChild(profitTxt); var sellBtn = new Text2("Sat (₺" + price + ")", { size: caravanBtnFontSize, fill: 0xd32f2f, fontWeight: "bold" }); sellBtn.anchor.set(1, 0.5); sellBtn.x = colBtnX; sellBtn.y = y - 20; sellBtn.alpha = total > 0 ? 1 : 0.4; (function (i, valueTxt, sellBtn) { sellBtn.down = function () { // Satış: ilk bulduğu fabrikadan 1 adet düş for (var f = 0; f < factoryList.length; f++) { if (factoryList[f].productBuffer[i] > 0) { factoryList[f].productBuffer[i]--; money += price; updateMoneyText(); // Güncelle var total = 0; for (var ff = 0; ff < factoryList.length; ff++) total += factoryList[ff].productBuffer[i] || 0; valueTxt.setText("" + total); sellBtn.alpha = total <= 0 ? 0.4 : 1; caravanTradeMade = true; break; } } }; })(i, valueTxt, sellBtn); caravanPanelContent.addChild(sellBtn); caravanPanelSellRows.push({ labelTxt: labelTxt, valueTxt: valueTxt, sellBtn: sellBtn, profitTxt: profitTxt }); y += rowHeight; } } // Kervan spawn fonksiyonu function spawnCaravan() { if (caravan) { caravan.destroy(); caravan = null; } createCaravanPanel(); caravan = new Caravan(); // Kervan paneli açılmasını garanti et caravan.down = function (x, y, obj) { toggleCaravanPanel(true); showMainPageElements(false); }; // Kervan haritanın orta kısımlarında rastgele bir noktadan başlasın (kenarlardan uzak) // Orta alan: x: 500-1548, y: 700-2000 var spawnX = 500 + Math.random() * 1048; var spawnY = 700 + Math.random() * 1300; caravan.x = spawnX; caravan.y = spawnY; caravan.lastX = caravan.x; caravan.lastY = caravan.y; // Hedef: Haritanın orta kısımlarında rastgele bir yerde dursun (kenarlardan uzak) // Orta alan: x: 600-1448, y: 900-1800 caravanDepoTargetX = 600 + Math.random() * 848; caravanDepoTargetY = 900 + Math.random() * 900; caravanArriveTargetX = caravanDepoTargetX; caravanArriveTargetY = caravanDepoTargetY; game.addChild(caravan); caravanActive = true; caravanArrived = false; caravanPanelOpen = false; caravanTradeMade = false; caravanTimeout = null; caravanStock = generateCaravanStock(); caravanLeaveTick = 0; } // Kervan'a tıklanınca panel aç/kapat function caravanDownHandler() { toggleCaravanPanel(true); showMainPageElements(false); } // Kervan her zaman tıklanabilir olsun (kervanArrived olmasa da) function checkCaravanArrived() { if (!caravan) return; // Hedef: DEPO'nun olduğu yer var targetX = caravanArriveTargetX; var targetY = caravanArriveTargetY; var dx = caravan.x - targetX; var dy = caravan.y - targetY; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 40) { caravanArrived = true; } // Kervan resmine tıklanınca paneli aç if (caravan) { caravan.down = function (x, y, obj) { toggleCaravanPanel(true); showMainPageElements(false); }; } } // Kervanın ayrılması ve tekrar gelmesi function handleCaravanTimeouts() { // Panel açıksa ve ticaret yapıldıysa, panel kapatılınca 1dk sonra tekrar gelsin if (!caravanActive) return; // Kervan geldikten 1 dakika sonra gitsin ve 2 dakika sonra güncel stok ile geri gelsin // 1. Kervan geldiğinde, 1dk sonra ayrılacak (panel açık veya kapalı farketmez) if (caravanArrived && caravanActive) { // Kervan ayrılma tick'i ayarlanmadıysa ayarla if (caravanLeaveTick === 0) { caravanLeaveTick = LK.ticks + 60 * 60; // 1dk sonra ayrılacak } // 1dk dolduysa kervanı kaldır if (LK.ticks >= caravanLeaveTick) { // Panel açıksa kapat if (caravanPanelOpen) { toggleCaravanPanel(false); showMainPageElements(true); } // Kervanı kaldır if (caravan) { caravan.destroy(); caravan = null; } caravanActive = false; caravanArrived = false; caravanPanelOpen = false; caravanTradeMade = false; caravanTimeout = null; // 2dk sonra tekrar gelsin (güncel stok ile) caravanNextArrivalTick = LK.ticks + 2 * 60 * 60; // 2dk sonra tekrar gelsin caravanLeaveTick = 0; } } // --- EK: Kervan paneli açıkken 1dk dolduysa paneli kapat ve kervanı kaldır (aktiflik için) --- if (caravanActive && caravanArrived && LK.ticks >= caravanLeaveTick) { if (caravanPanelOpen) { toggleCaravanPanel(false); showMainPageElements(true); } if (caravan) { caravan.destroy(); caravan = null; } caravanActive = false; caravanArrived = false; caravanPanelOpen = false; caravanTradeMade = false; caravanTimeout = null; caravanNextArrivalTick = LK.ticks + 2 * 60 * 60; caravanLeaveTick = 0; } } // Kervan update'i ana game.update'e ekle var originalGameUpdate = game.update; game.update = function () { // Kervan yoksa ve zamanı geldiyse spawn et if (!caravanActive && LK.ticks > caravanNextArrivalTick) { spawnCaravan(); } // Kervan aktifse ve varmadıysa hareket ettir if (caravanActive && caravan && !caravanArrived) { var targetX = caravanArriveTargetX; var targetY = caravanArriveTargetY; if (typeof caravan.moveTowards === "function") { caravan.moveTowards(targetX, targetY); } checkCaravanArrived(); caravan.visible = true; } // Kervan varınca sabit dursun if (caravanActive && caravanArrived && caravan && !caravanPanelOpen) { caravan.visible = true; } // Kervan paneli açıksa satırları güncelle if (caravanPanelOpen) { updateCaravanPanelRows(); } // Kervan ayrılma/tekrar gelme mantığı handleCaravanTimeouts(); if (typeof originalGameUpdate === "function") originalGameUpdate(); }; // --- KERVAN GİTME DÜZELTME --- // handleCaravanTimeouts fonksiyonunda leaveTick'in doğru ayarlanmasını ve kervanın zamanında kaldırılmasını sağlar // (Bu kod, fonksiyonun mevcut tanımını değiştirmez, sadece fonksiyonun doğru çalışmasını sağlar) // Kervan panelini dışarıdan erişim için global yap window.toggleCaravanPanel = toggleCaravanPanel; // Kervan ilk başta pasif, 10 saniye (600 tick) sonra gelsin caravanNextArrivalTick = LK.ticks + 600; caravanActive = false; caravanArrived = false; caravanPanelOpen = false; caravanTradeMade = false; caravanTimeout = null; 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 --- // --- HANGAR (Sol Depo) --- // Hangar görseli (haritanın solunda, karargahın solunda) var hangarImg = LK.getAsset('depo', { anchorX: 0.5, anchorY: 0.5, x: 180, // Sol kenara yakın y: 2400 }); game.addChild(hangarImg); // Hangar label (görselin altında) var hangarLabel = new Text2('HANGAR', { size: 36, fill: "#fff" }); hangarLabel.anchor.set(0.5, 0); hangarLabel.x = hangarImg.x; hangarLabel.y = hangarImg.y + hangarImg.height / 2 + 10; game.addChild(hangarLabel); // Hangar panel arka planı (solda açılır) var hangarPanelBg = LK.getAsset('depoPanelBg', { anchorX: 0.0, anchorY: 0.5, x: 40, // Sol kenar y: 1366, scaleX: 1.1, scaleY: 1.1 }); hangarPanelBg.alpha = 0.97; hangarPanelBg.visible = false; game.addChild(hangarPanelBg); // Hangar panel başlığı var hangarPanelTitle = new Text2('HANGAR', { size: 38, fill: "#000", fontWeight: "bold" }); hangarPanelTitle.anchor.set(0.5, 0.5); hangarPanelTitle.x = hangarPanelBg.x + hangarPanelBg.width / 2; hangarPanelTitle.y = hangarPanelBg.y - hangarPanelBg.height / 2 + 60; hangarPanelTitle.visible = false; game.addChild(hangarPanelTitle); // Hangar panel içeriği // Panelde ürün isimlerinin yanına icon eklemek için Container kullan var hangarPanelContent = new Container(); hangarPanelContent.x = hangarPanelBg.x + hangarPanelBg.width / 2; hangarPanelContent.y = hangarPanelBg.y - hangarPanelBg.height / 2 + 120; hangarPanelContent.visible = false; game.addChild(hangarPanelContent); // Hangar paneli kapat ikonu var hangarCloseIcon = new Text2('✕', { size: 84, fill: 0xFF0000, fontWeight: "bold" }); hangarCloseIcon.anchor.set(0.5, 0.5); hangarCloseIcon.x = hangarPanelBg.x + hangarPanelBg.width - 60; hangarCloseIcon.y = hangarPanelBg.y - hangarPanelBg.height / 2 + 60; hangarCloseIcon.visible = false; game.addChild(hangarCloseIcon); // Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle var hangarCloseHitArea = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: hangarCloseIcon.width * 1.2, height: hangarCloseIcon.height * 1.2, color: 0x000000, alpha: 0 }); hangarCloseHitArea.x = hangarCloseIcon.x; hangarCloseHitArea.y = hangarCloseIcon.y; hangarCloseHitArea.visible = false; game.addChild(hangarCloseHitArea); hangarCloseHitArea.down = function () { hangarImg.down(); }; hangarCloseIcon.down = function () { hangarImg.down(); }; // Hangar panelini güncelleyen fonksiyon function updateHangarPanelContent() { // Önce eski içeriği temizle while (hangarPanelContent.children.length > 0) { var c = hangarPanelContent.children[0]; c.destroy && c.destroy(); hangarPanelContent.removeChild(c); } var y = 0; var rowHeight = 54; var leftX = -hangarPanelBg.width / 2 + 40; var iconSize = 40; var textOffset = 50; var colCount = 3; // 3'lü sıra var colSpacing = (hangarPanelBg.width - 80) / colCount; // 80px margin // Kervan stoğu başlığı var caravanTitle = new Text2("Kervan Stoğu:", { size: 32, fill: "#222", fontWeight: "bold" }); caravanTitle.anchor.set(0, 0.5); caravanTitle.x = leftX; caravanTitle.y = y; hangarPanelContent.addChild(caravanTitle); y += rowHeight; // Hammaddeler (Cevher, Odun, Yiyecek) - iconlu var matList = [{ key: "ore", label: "Cevher", icon: "ore1", value: typeof hangarStock !== "undefined" && hangarStock.ore || 0 }, { key: "wood", label: "Odun", icon: "wood1", value: typeof hangarStock !== "undefined" && hangarStock.wood || 0 }, { key: "food", label: "Yiyecek", icon: "food1", value: typeof hangarStock !== "undefined" && hangarStock.food || 0 }]; // --- 3'lü sıra ile hammaddeler --- // Her hammadde için icon ve label ayrı ayrı ekle for (var i = 0; i < matList.length; i++) { var mat = matList[i]; var col = i % colCount; var row = Math.floor(i / colCount); var xPos = leftX + col * colSpacing + iconSize / 2; var yPos = y + row * rowHeight; // Icon ekle var icon = LK.getAsset(mat.icon, { anchorX: 0.5, anchorY: 0.5, x: xPos, y: yPos, scaleX: 0.4, scaleY: 0.4 }); hangarPanelContent.addChild(icon); // Iconun sağında label ekle var label = new Text2(mat.label + ": " + mat.value, { size: 30, fill: "#000" }); label.anchor.set(0, 0.5); label.x = xPos + textOffset; label.y = yPos; hangarPanelContent.addChild(label); } y += Math.ceil(matList.length / colCount) * rowHeight; // Ürünler başlığı var urunlerTitle = new Text2("Ürünler:", { size: 32, fill: "#222", fontWeight: "bold" }); urunlerTitle.anchor.set(0, 0.5); urunlerTitle.x = leftX; urunlerTitle.y = y; hangarPanelContent.addChild(urunlerTitle); y += rowHeight; // Ürünler (her biri iconlu) 3'lü sıra ile if (typeof productTypes !== "undefined" && productTypes && typeof productTypes.length === "number") { var productRowCount = Math.ceil(productTypes.length / colCount); for (var p = 0; p < productTypes.length; p++) { var count = typeof hangarStock !== "undefined" && hangarStock.product && hangarStock.product[p] ? hangarStock.product[p] : 0; var col = p % colCount; var row = Math.floor(p / colCount); var xPos = leftX + col * colSpacing + iconSize / 2; var yPos = y + row * rowHeight; var icon = LK.getAsset(productTypes[p].icon, { anchorX: 0.5, anchorY: 0.5, x: xPos, y: yPos, scaleX: 0.4, scaleY: 0.4 }); hangarPanelContent.addChild(icon); var label = new Text2(productTypes[p].name + ": " + count, { size: 28, fill: "#000" }); label.anchor.set(0, 0.5); label.x = xPos + textOffset; label.y = yPos; hangarPanelContent.addChild(label); } y += productRowCount * rowHeight; } // Boş satır y += 10; // Fabrika + Eski Stoklar başlığı var fabrikaTitle = new Text2("Fabrika + Eski Stoklar:", { size: 32, fill: "#222", fontWeight: "bold" }); fabrikaTitle.anchor.set(0, 0.5); fabrikaTitle.x = leftX; fabrikaTitle.y = y; hangarPanelContent.addChild(fabrikaTitle); y += rowHeight; // Tüm fabrika stokları (hammaddeler) var totalOre = 0, totalWood = 0, totalFood = 0; var totalProducts = []; for (var p = 0; p < productTypes.length; p++) totalProducts[p] = 0; for (var i = 0; i < factoryList.length; i++) { totalOre += factoryList[i].oreBuffer || 0; totalWood += factoryList[i].woodBuffer || 0; totalFood += factoryList[i].foodBuffer || 0; for (var p = 0; p < productTypes.length; p++) { totalProducts[p] += factoryList[i].productBuffer[p] || 0; } } // Hammaddeler (iconlu) - 3'lü sıra ile var matList2 = [{ label: "Cevher", icon: "ore1", value: totalOre }, { label: "Odun", icon: "wood1", value: totalWood }, { label: "Yiyecek", icon: "food1", value: totalFood }]; var matColCount = 3; var matColSpacing = (hangarPanelBg.width - 80) / matColCount; var matIconSize = 40; var matTextOffset = 50; for (var i = 0; i < matList2.length; i++) { var mat = matList2[i]; var col = i % matColCount; var row = Math.floor(i / matColCount); var xPos = leftX + col * matColSpacing + matIconSize / 2; var yPos = y + row * rowHeight; var icon = LK.getAsset(mat.icon, { anchorX: 0.5, anchorY: 0.5, x: xPos, y: yPos, scaleX: 0.4, scaleY: 0.4 }); hangarPanelContent.addChild(icon); var label = new Text2(mat.label + ": " + mat.value, { size: 30, fill: "#000" }); label.anchor.set(0, 0.5); label.x = xPos + matTextOffset; label.y = yPos; hangarPanelContent.addChild(label); } y += Math.ceil(matList2.length / matColCount) * rowHeight; // Ürünler başlığı var urunler2Title = new Text2("Ürünler:", { size: 32, fill: "#222", fontWeight: "bold" }); urunler2Title.anchor.set(0, 0.5); urunler2Title.x = leftX; urunler2Title.y = y; hangarPanelContent.addChild(urunler2Title); y += rowHeight; // Ürünler (her biri iconlu) 3'lü sıra ile if (typeof productTypes !== "undefined" && productTypes && typeof productTypes.length === "number") { var prodColCount = 3; var prodColSpacing = (hangarPanelBg.width - 80) / prodColCount; var prodIconSize = 40; var prodTextOffset = 50; var productRowCount = Math.ceil(productTypes.length / prodColCount); for (var p = 0; p < productTypes.length; p++) { var count = totalProducts[p]; var col = p % prodColCount; var row = Math.floor(p / prodColCount); var xPos = leftX + col * prodColSpacing + prodIconSize / 2; var yPos = y + row * rowHeight; var icon = LK.getAsset(productTypes[p].icon, { anchorX: 0.5, anchorY: 0.5, x: xPos, y: yPos, scaleX: 0.4, scaleY: 0.4 }); hangarPanelContent.addChild(icon); var label = new Text2(productTypes[p].name + ": " + count, { size: 28, fill: "#000" }); label.anchor.set(0, 0.5); label.x = xPos + prodTextOffset; label.y = yPos; hangarPanelContent.addChild(label); } y += productRowCount * rowHeight; } } // Hangar resmine tıklanınca paneli aç/kapat hangarImg.down = function () { var newVisible = !hangarPanelBg.visible; hangarPanelBg.visible = newVisible; hangarPanelTitle.visible = newVisible; hangarPanelContent.visible = newVisible; hangarCloseIcon.visible = newVisible; if (newVisible) updateHangarPanelContent(); }; // --- HANGAR Stokları --- // Kervandan alınanlar ve fabrika stokları burada tutulacak var hangarStock = { ore: 0, wood: 0, food: 0, product: [] }; if (typeof productTypes !== "undefined" && productTypes && typeof productTypes.length === "number") { for (var p = 0; p < productTypes.length; p++) hangarStock.product[p] = 0; } // 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: 84, fill: 0xFF0000, fontWeight: "bold" }); karargahCloseIcon.anchor.set(0.5, 0.5); karargahCloseIcon.x = karargahPanelBg.x + karargahPanelBg.width / 2 - 60; karargahCloseIcon.y = karargahPanelBg.y - karargahPanelBg.height / 2 + 60; karargahCloseIcon.visible = false; game.addChild(karargahCloseIcon); // Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle var karargahCloseHitArea = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: karargahCloseIcon.width * 1.2, height: karargahCloseIcon.height * 1.2, color: 0x000000, alpha: 0 }); karargahCloseHitArea.x = karargahCloseIcon.x; karargahCloseHitArea.y = karargahCloseIcon.y; karargahCloseHitArea.visible = false; game.addChild(karargahCloseHitArea); karargahCloseHitArea.down = function () { karargahImg.down(); }; 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); // --- Yeni: Canavar öldürülünce yeni canavar için kalan süre texti (karargahPanelEnemyTimerTxt'nin hemen altında) --- var karargahPanelEnemyNextTimerTxt = new Text2("", { size: 26, fill: "#333" }); karargahPanelEnemyNextTimerTxt.anchor.set(0.5, 1); karargahPanelEnemyNextTimerTxt.x = karargahPanelEnemyTimerTxt.x; karargahPanelEnemyNextTimerTxt.y = karargahPanelEnemyTimerTxt.y + 32; karargahPanelEnemyNextTimerTxt.visible = false; game.addChild(karargahPanelEnemyNextTimerTxt); // 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); // Kervan sadece şehirden bilgi alınca gelsin: ilk müşteri spawn edildiğinde kervan çağır if (!caravanActive && LK.ticks >= caravanNextArrivalTick) { spawnCaravan(); } } 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 // --- MUSIC ICON & BACKGROUND MUSIC TOGGLE --- // Add a music icon to the left of the money text (5 lines to the left) var musicIcon = LK.getAsset('music_icon', { anchorX: 0.5, anchorY: 0, x: -120, // 5 lines to the left of moneyText (approx -120px) y: 0, scaleX: 0.7, scaleY: 0.7 }); musicIcon.alpha = 0.85; LK.gui.top.addChild(musicIcon); // Music state var isMusicOn = true; // Play background music only after first user interaction (for mobile compatibility) var _musicStarted = false; function startBackgroundMusicIfNeeded() { if (!_musicStarted && isMusicOn) { LK.playMusic('arkaplan', { loop: true }); _musicStarted = true; musicIcon.alpha = 0.85; } } // Listen for first user interaction to start music if (typeof game !== "undefined") { game.down = function (origDown) { return function (x, y, obj) { startBackgroundMusicIfNeeded(); if (typeof origDown === "function") origDown(x, y, obj); }; }(game.down); } if (typeof LK !== "undefined" && LK.gui && LK.gui.top) { LK.gui.top.down = function (origDown) { return function (x, y, obj) { startBackgroundMusicIfNeeded(); if (typeof origDown === "function") origDown(x, y, obj); }; }(LK.gui.top.down); } // Music icon toggle handler musicIcon.down = function () { if (isMusicOn) { LK.stopMusic(); isMusicOn = false; musicIcon.alpha = 0.35; _musicStarted = false; } else { LK.playMusic('arkaplan', { loop: true }); isMusicOn = true; _musicStarted = true; musicIcon.alpha = 0.85; } }; 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: 84, fill: 0xFF0000, fontWeight: "bold" }); howToPlayCloseIcon.anchor.set(0.5, 0.5); howToPlayCloseIcon.x = howToPlayPanelBg.x - 60; howToPlayCloseIcon.y = howToPlayPanelBg.y + 60; howToPlayCloseIcon.visible = false; game.addChild(howToPlayCloseIcon); // Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle var howToPlayCloseHitArea = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: howToPlayCloseIcon.width * 1.2, height: howToPlayCloseIcon.height * 1.2, color: 0x000000, alpha: 0 }); howToPlayCloseHitArea.x = howToPlayCloseIcon.x; howToPlayCloseHitArea.y = howToPlayCloseIcon.y; howToPlayCloseHitArea.visible = false; game.addChild(howToPlayCloseHitArea); howToPlayCloseHitArea.down = function () { toggleHowToPlayPanel(); }; howToPlayCloseIcon.down = function () { toggleHowToPlayPanel(); }; // 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); // --- DEPO image, label, and panel removed from main screen (bottom right) --- // 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; // --- İşçi isimlerinin yanına icon ekle (Çalışanlar paneli) --- var workerIconSize = 40; var workerIconOffsetY = 0; var workerIconOffsetX = -workerIconSize - 8; // Madenci iconu var workerMinerIcon = LK.getAsset('miner1', { anchorX: 0.5, anchorY: 0.5, x: workerPanelLeft + workerIconOffsetX, y: workerPanelRowY0 + workerIconOffsetY, scaleX: 0.4, scaleY: 0.4 }); game.addChild(workerMinerIcon); var workerCountMinerText = new Text2('', { size: workerPanelFontSize, fill: "#000" }); workerCountMinerText.anchor.set(0, 0.5); workerCountMinerText.x = workerPanelLeft; workerCountMinerText.y = workerPanelRowY0; game.addChild(workerCountMinerText); // Taşıyıcı iconu var workerCarrierIcon = LK.getAsset('carrier', { anchorX: 0.5, anchorY: 0.5, x: workerPanelLeft + workerIconOffsetX, y: workerPanelRowY0 + workerPanelRowDY + workerIconOffsetY, scaleX: 0.4, scaleY: 0.4 }); game.addChild(workerCarrierIcon); var workerCountCarrierText = new Text2('', { size: workerPanelFontSize, fill: "#000" }); workerCountCarrierText.anchor.set(0, 0.5); workerCountCarrierText.x = workerPanelLeft; workerCountCarrierText.y = workerPanelRowY0 + workerPanelRowDY; game.addChild(workerCountCarrierText); // Araştırmacı iconu var workerResearcherIcon = LK.getAsset('researcher_icon', { anchorX: 0.5, anchorY: 0.5, x: workerPanelLeft + workerIconOffsetX, y: workerPanelRowY0 + 2 * workerPanelRowDY + workerIconOffsetY, scaleX: 0.4, scaleY: 0.4 }); game.addChild(workerResearcherIcon); 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); // Oduncu iconu var workerOduncuIcon = LK.getAsset('oduncu1', { anchorX: 0.5, anchorY: 0.5, x: workerPanelLeft + workerIconOffsetX, y: workerPanelRowY0 + 3 * workerPanelRowDY + workerIconOffsetY, scaleX: 0.4, scaleY: 0.4 }); game.addChild(workerOduncuIcon); 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); // Toplayıcı iconu var workerToplayiciIcon = LK.getAsset('toplayici1', { anchorX: 0.5, anchorY: 0.5, x: workerPanelLeft + workerIconOffsetX, y: workerPanelRowY0 + 4 * workerPanelRowDY + workerIconOffsetY, scaleX: 0.4, scaleY: 0.4 }); game.addChild(workerToplayiciIcon); 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: 84, fill: 0xFF0000, fontWeight: "bold" }); workersCloseIcon.anchor.set(0.5, 0.5); workersCloseIcon.x = workersPanelBg.x + workersPanelBg.width / 2 - 60; workersCloseIcon.y = workersPanelBg.y - workersPanelBg.height / 2 + 60; workersCloseIcon.visible = false; game.addChild(workersCloseIcon); // Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle var workersCloseHitArea = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: workersCloseIcon.width * 1.2, height: workersCloseIcon.height * 1.2, color: 0x000000, alpha: 0 }); workersCloseHitArea.x = workersCloseIcon.x; workersCloseHitArea.y = workersCloseIcon.y; workersCloseHitArea.visible = false; game.addChild(workersCloseHitArea); workersCloseHitArea.down = function () { researchCampRightImg.down(); }; 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; // Çalışanlar iconlarını panel açılınca otomatik tekrar görünür yap workerMinerIcon.visible = newVisible; workerCarrierIcon.visible = newVisible; workerResearcherIcon.visible = newVisible; workerOduncuIcon.visible = newVisible; workerToplayiciIcon.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); // %10 sağa kaydır: panel genişliğinin %10'u kadar ekle researchCampPanelText.x = researchCampPanelBg.x - researchCampPanelBg.width / 2 + 40 + researchCampPanelBg.width * 0.10; 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: 84, fill: 0xFF0000, fontWeight: "bold" }); researchCloseIcon.anchor.set(0.5, 0.5); researchCloseIcon.x = researchCampPanelBg.x + researchCampPanelBg.width / 2 - 60; researchCloseIcon.y = researchCampPanelBg.y - researchCampPanelBg.height / 2 + 60; researchCloseIcon.visible = false; game.addChild(researchCloseIcon); // Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle var researchCloseHitArea = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: researchCloseIcon.width * 1.2, height: researchCloseIcon.height * 1.2, color: 0x000000, alpha: 0 }); researchCloseHitArea.x = researchCloseIcon.x; researchCloseHitArea.y = researchCloseIcon.y; researchCloseHitArea.visible = false; game.addChild(researchCloseHitArea); researchCloseHitArea.down = function () { researchCampImg.down(); }; researchCloseIcon.down = function () { researchCampImg.down(); }; // Show/hide panel on image press researchCampImg.down = function () { var newVisible = !researchCampPanelBg.visible; researchCampPanelBg.visible = newVisible; researchCampPanelText.visible = newVisible; researchCloseIcon.visible = newVisible; }; spawnMine(); spawnMine(); spawnFactory(); spawnShop(); spawnMiner(); spawnCarrier(); spawnResearcher(); spawnResearcher(); // İkinci araştırmacı spawnOduncu(); spawnToplayici(); // --- Kervan oyun başladıktan 10 saniye (600 tick) sonra gelsin --- // Kervan ilk başta pasif, sadece 10 saniye sonra aktifleşecek caravanNextArrivalTick = LK.ticks + 600; // 10 saniye (600 tick) sonra ilk geliş // Kervan başta pasif caravanActive = false; 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; } } // (depo panel removed) // 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; } // Tüm paneller açıldığında sadece panel arka planı kadar ana ekran unsurlarını gizle, panel dışı alanlar görünür kalsın var anyPanelOpen = karargahPanelBg.visible || businessPanel.visible || workersPanelBg.visible || levelPanelBg.visible || researchCampPanelBg.visible || hangarPanelBg.visible || caravanPanelBg && caravanPanelBg.visible; // Always show background backgroundImg.visible = true; // Helper: Sadece panel arka planı kadar alanı gizle, panel dışı unsurlar görünür kalsın function isElementInAnyPanelBgArea(element) { if (!element || typeof element.x !== "number" || typeof element.y !== "number") 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 }; // İşletmeler paneli if (businessPanel.visible && businessPanel.children && businessPanel.children.length > 0) { var bg = businessPanel.children[0]; if (bg && bg.visible) { var left = bg.x - bg.width / 2, right = bg.x + bg.width / 2, top = bg.y - bg.height / 2, bottom = bg.y + bg.height / 2; if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true; } } // Karargah paneli if (karargahPanelBg.visible) { var left = karargahPanelBg.x - karargahPanelBg.width / 2, right = karargahPanelBg.x + karargahPanelBg.width / 2, top = karargahPanelBg.y - karargahPanelBg.height / 2, bottom = karargahPanelBg.y + karargahPanelBg.height / 2; if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true; } // (depo panel removed) // Çalışanlar paneli if (workersPanelBg.visible) { var left = workersPanelBg.x - workersPanelBg.width / 2, right = workersPanelBg.x + workersPanelBg.width / 2, top = workersPanelBg.y - workersPanelBg.height / 2, bottom = workersPanelBg.y + workersPanelBg.height / 2; if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true; } // Level paneli if (levelPanelBg.visible) { var left = levelPanelBg.x - levelPanelBg.width / 2, right = levelPanelBg.x + levelPanelBg.width / 2, top = levelPanelBg.y - levelPanelBg.height / 2, bottom = levelPanelBg.y + levelPanelBg.height / 2; if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true; } // Araştırma kampı paneli if (researchCampPanelBg.visible) { var left = researchCampPanelBg.x - researchCampPanelBg.width / 2, right = researchCampPanelBg.x + researchCampPanelBg.width / 2, top = researchCampPanelBg.y - researchCampPanelBg.height / 2, bottom = researchCampPanelBg.y + researchCampPanelBg.height / 2; if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true; } // Nasıl Oynanır paneli if (howToPlayPanelBg.visible) { var left = howToPlayPanelBg.x - howToPlayPanelBg.width, right = howToPlayPanelBg.x, top = howToPlayPanelBg.y, bottom = howToPlayPanelBg.y + howToPlayPanelBg.height; if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true; } // HANGAR paneli (depoPanelBg ile karışmasın) if (hangarPanelBg && hangarPanelBg.visible) { var left = hangarPanelBg.x, right = hangarPanelBg.x + hangarPanelBg.width, top = hangarPanelBg.y - hangarPanelBg.height / 2, bottom = hangarPanelBg.y + hangarPanelBg.height / 2; if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true; } // KERVAN paneli if (caravanPanelBg && caravanPanelBg.visible) { var left = caravanPanelBg.x - caravanPanelBg.width / 2, right = caravanPanelBg.x + caravanPanelBg.width / 2, top = caravanPanelBg.y - caravanPanelBg.height / 2, bottom = caravanPanelBg.y + caravanPanelBg.height / 2; if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true; } // FABRIKA STOK paneli if (factoryStockPanelBg && factoryStockPanelBg.visible) { var left = factoryStockPanelBg.x - factoryStockPanelBg.width / 2, right = factoryStockPanelBg.x + factoryStockPanelBg.width / 2, top = factoryStockPanelBg.y - factoryStockPanelBg.height / 2, bottom = factoryStockPanelBg.y + factoryStockPanelBg.height / 2; if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true; } // MAĞAZA STOK paneli if (shopStockPanelBg && shopStockPanelBg.visible) { var left = shopStockPanelBg.x - shopStockPanelBg.width / 2, right = shopStockPanelBg.x + shopStockPanelBg.width / 2, top = shopStockPanelBg.y - shopStockPanelBg.height / 2, bottom = shopStockPanelBg.y + shopStockPanelBg.height / 2; if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true; } return false; } // Show/hide main building images and labels based on panel bg overlap karargahImg.visible = !isElementInAnyPanelBgArea(karargahImg); karargahLabel.visible = !isElementInAnyPanelBgArea(karargahLabel); workerStartImg.visible = !isElementInAnyPanelBgArea(workerStartImg); kampimizLabel.visible = !isElementInAnyPanelBgArea(kampimizLabel); researchCampImg.visible = !isElementInAnyPanelBgArea(researchCampImg); researchCampLabel.visible = !isElementInAnyPanelBgArea(researchCampLabel); researchCampRightImg.visible = !isElementInAnyPanelBgArea(researchCampRightImg); workerPanelLabel.visible = !isElementInAnyPanelBgArea(workerPanelLabel); // workerPanelTopImg.visible = !isElementInAnyPanelBgArea(workerPanelTopImg); // Removed: workerPanelTopImg is not defined // Show/hide city based on panel bg overlap if (city) city.visible = !isElementInAnyPanelBgArea(city); // Show/hide workers and game objects based on panel bg overlap for (var i = 0; i < minerList.length; i++) { minerList[i].visible = !isElementInAnyPanelBgArea(minerList[i]); } for (var i = 0; i < carrierList.length; i++) { carrierList[i].visible = !isElementInAnyPanelBgArea(carrierList[i]); } for (var i = 0; i < researcherList.length; i++) { researcherList[i].visible = !isElementInAnyPanelBgArea(researcherList[i]); } for (var i = 0; i < oduncuList.length; i++) { oduncuList[i].visible = !isElementInAnyPanelBgArea(oduncuList[i]); } for (var i = 0; i < toplayiciList.length; i++) { toplayiciList[i].visible = !isElementInAnyPanelBgArea(toplayiciList[i]); } for (var i = 0; i < customerList.length; i++) { customerList[i].visible = !isElementInAnyPanelBgArea(customerList[i]); } for (var i = 0; i < mineList.length; i++) { mineList[i].visible = !isElementInAnyPanelBgArea(mineList[i]); } for (var i = 0; i < factoryList.length; i++) { factoryList[i].visible = !isElementInAnyPanelBgArea(factoryList[i]); } for (var i = 0; i < shopList.length; i++) { shopList[i].visible = !isElementInAnyPanelBgArea(shopList[i]); } for (var i = 0; i < soldierList.length; i++) { soldierList[i].visible = !isElementInAnyPanelBgArea(soldierList[i]); } for (var i = 0; i < treeList.length; i++) { treeList[i].visible = !isElementInAnyPanelBgArea(treeList[i]); } for (var i = 0; i < foodList.length; i++) { foodList[i].visible = !isElementInAnyPanelBgArea(foodList[i]); } if (currentEnemy) { currentEnemy.visible = !isElementInAnyPanelBgArea(currentEnemy); } // Kervan resmi panellerden biri açıkken veya panel arka planı ile çakışıyorsa gizle var anyPanelOpenForCaravan = karargahPanelBg.visible || businessPanel.visible || workersPanelBg.visible || levelPanelBg.visible || researchCampPanelBg.visible || hangarPanelBg.visible || caravanPanelBg && caravanPanelBg.visible || factoryStockPanelBg.visible || shopStockPanelBg.visible; if (caravan) { // Kervan, herhangi bir panel açıkken veya panel arka planı ile çakışıyorsa gizli caravan.visible = !anyPanelOpenForCaravan ? !isElementInAnyPanelBgArea(caravan) : false; } // Show/hide status texts based on panel bg overlap for (var i = 0; i < statusTexts.length; i++) { statusTexts[i].visible = !isElementInAnyPanelBgArea(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); // Altına ek: Canavar henüz öldürülmemişse, "Canavara Geldi" yazmasın, sadece kalan süreyi göster if (typeof karargahPanelEnemyNextTimerTxt !== "undefined") { karargahPanelEnemyNextTimerTxt.visible = true; karargahPanelEnemyNextTimerTxt.setText(""); } } else if (!currentEnemy) { // Canavar henüz öldürülmemişse, "Canavara Geldi" yaz karargahPanelEnemyTimerTxt.setText("Canavara Geldi"); if (typeof karargahPanelEnemyNextTimerTxt !== "undefined") { karargahPanelEnemyNextTimerTxt.visible = false; karargahPanelEnemyNextTimerTxt.setText(""); } } else { karargahPanelEnemyTimerTxt.setText(""); if (typeof karargahPanelEnemyNextTimerTxt !== "undefined") { karargahPanelEnemyNextTimerTxt.visible = false; karargahPanelEnemyNextTimerTxt.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!"; 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: "Kılıç", icon: "kilic_icon", price: 10 }, { name: "Mızrak", icon: "mizrak_icon", price: 12 }, { name: "Kalkan", icon: "kalkan_icon", price: 14 }, { name: "Miğfer", icon: "migfer_icon", price: 16 }, { name: "Ok ve Yay", icon: "okveyay_icon", price: 18 }, { name: "Zırh", icon: "zirh_icon", price: 20 }, { name: "Savaş Baltası", icon: "savasbaltasi_icon", price: 22 }, { name: "At Arabası", icon: "atarabasi_icon", price: 24 }, { name: "Savaş Arabası", icon: "kalkanlisavasarabasi_icon", price: 26 }, { name: "Koçbaşı", icon: "kocbasi_icon", 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++) { // Ana ekranda hammadde ismi gösterme, sadece sayı göster var t = new Text2("" + 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); // --- FABRIKA STOK PANELİ --- // Panel arka planı var factoryStockPanelBg = LK.getAsset('businessPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 1.1, scaleY: 1.1 }); factoryStockPanelBg.alpha = 0.97; factoryStockPanelBg.visible = false; game.addChild(factoryStockPanelBg); // Panel başlığı var factoryStockPanelTitle = new Text2('Fabrika Stoğu', { size: 38, fill: "#000", fontWeight: "bold" }); factoryStockPanelTitle.anchor.set(0.5, 0.5); factoryStockPanelTitle.x = factoryStockPanelBg.x; factoryStockPanelTitle.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 60; factoryStockPanelTitle.visible = false; game.addChild(factoryStockPanelTitle); // Panel içeriği var factoryStockPanelContent = new Container(); factoryStockPanelContent.x = factoryStockPanelBg.x; factoryStockPanelContent.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 120; factoryStockPanelContent.visible = false; game.addChild(factoryStockPanelContent); // Kapatma ikonu var factoryStockCloseIcon = new Text2('✕', { size: 84, fill: 0xFF0000, fontWeight: "bold" }); factoryStockCloseIcon.anchor.set(0.5, 0.5); factoryStockCloseIcon.x = factoryStockPanelBg.x + factoryStockPanelBg.width / 2 - 60; factoryStockCloseIcon.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 60; factoryStockCloseIcon.visible = false; game.addChild(factoryStockCloseIcon); // Kapatma ikonunun tıklanabilir alanı var factoryStockCloseHitArea = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: factoryStockCloseIcon.width * 1.2, height: factoryStockCloseIcon.height * 1.2, color: 0x000000, alpha: 0 }); factoryStockCloseHitArea.x = factoryStockCloseIcon.x; factoryStockCloseHitArea.y = factoryStockCloseIcon.y; factoryStockCloseHitArea.visible = false; game.addChild(factoryStockCloseHitArea); // Paneli güncelleyen fonksiyon function updateFactoryStockPanelContent(factory) { // Panel içeriğini temizle while (factoryStockPanelContent.children.length > 0) { var c = factoryStockPanelContent.children[0]; c.destroy && c.destroy(); factoryStockPanelContent.removeChild(c); } if (!factory) return; var y = 0; var rowHeight = 60; var leftX = -factoryStockPanelBg.width / 2 + 60; var iconSize = 40; var textOffset = 50; var colCount = 3; var colSpacing = (factoryStockPanelBg.width - 80) / colCount; // Başlık: Hammaddeler var matTitle = new Text2("Hammaddeler:", { size: 32, fill: "#222", fontWeight: "bold" }); matTitle.anchor.set(0, 0.5); matTitle.x = leftX; matTitle.y = y; factoryStockPanelContent.addChild(matTitle); y += rowHeight; // Hammaddeler (iconlu) var matList = [{ key: "ore", label: "Cevher", icon: "ore1", value: factory.oreBuffer || 0 }, { key: "wood", label: "Odun", icon: "wood1", value: factory.woodBuffer || 0 }, { key: "food", label: "Yiyecek", icon: "food1", value: factory.foodBuffer || 0 }]; for (var i = 0; i < matList.length; i++) { var mat = matList[i]; var col = i % colCount; var row = Math.floor(i / colCount); var xPos = leftX + col * colSpacing + iconSize / 2; var yPos = y + row * rowHeight; var icon = LK.getAsset(mat.icon, { anchorX: 0.5, anchorY: 0.5, x: xPos, y: yPos, scaleX: 0.4, scaleY: 0.4 }); factoryStockPanelContent.addChild(icon); var label = new Text2(mat.label + ": " + mat.value, { size: 30, fill: "#000" }); label.anchor.set(0, 0.5); label.x = xPos + textOffset; label.y = yPos; factoryStockPanelContent.addChild(label); } y += Math.ceil(matList.length / colCount) * rowHeight; // Başlık: Ürünler var urunlerTitle = new Text2("Ürünler:", { size: 32, fill: "#222", fontWeight: "bold" }); urunlerTitle.anchor.set(0, 0.5); urunlerTitle.x = leftX; urunlerTitle.y = y; factoryStockPanelContent.addChild(urunlerTitle); y += rowHeight; // Ürünler (iconlu) if (typeof productTypes !== "undefined" && productTypes && typeof productTypes.length === "number") { var productRowCount = Math.ceil(productTypes.length / colCount); for (var p = 0; p < productTypes.length; p++) { var count = factory.productBuffer && factory.productBuffer[p] ? factory.productBuffer[p] : 0; var col = p % colCount; var row = Math.floor(p / colCount); var xPos = leftX + col * colSpacing + iconSize / 2; var yPos = y + row * rowHeight; var icon = LK.getAsset(productTypes[p].icon, { anchorX: 0.5, anchorY: 0.5, x: xPos, y: yPos, scaleX: 0.4, scaleY: 0.4 }); factoryStockPanelContent.addChild(icon); var label = new Text2(productTypes[p].name + ": " + count, { size: 28, fill: "#000" }); label.anchor.set(0, 0.5); label.x = xPos + textOffset; label.y = yPos; factoryStockPanelContent.addChild(label); } y += productRowCount * rowHeight; } } // Paneli aç/kapat fonksiyonu var currentFactoryForPanel = null; function toggleFactoryStockPanel(factory) { var newVisible = !factoryStockPanelBg.visible; if (typeof factory !== "undefined") { currentFactoryForPanel = factory; } factoryStockPanelBg.visible = newVisible; factoryStockPanelTitle.visible = newVisible; factoryStockPanelContent.visible = newVisible; factoryStockCloseIcon.visible = newVisible; factoryStockCloseHitArea.visible = newVisible; if (newVisible && currentFactoryForPanel) { // Paneli ortala factoryStockPanelBg.x = 1024; factoryStockPanelBg.y = 1366; factoryStockPanelTitle.x = factoryStockPanelBg.x; factoryStockPanelTitle.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 60; factoryStockPanelContent.x = factoryStockPanelBg.x; factoryStockPanelContent.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 120; factoryStockCloseIcon.x = factoryStockPanelBg.x + factoryStockPanelBg.width / 2 - 60; factoryStockCloseIcon.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 60; factoryStockCloseHitArea.x = factoryStockCloseIcon.x; factoryStockCloseHitArea.y = factoryStockCloseIcon.y; updateFactoryStockPanelContent(currentFactoryForPanel); } } // Kapatma ikonuna tıklama factoryStockCloseHitArea.down = function () { toggleFactoryStockPanel(); }; factoryStockCloseIcon.down = function () { toggleFactoryStockPanel(); }; // --- Fabrika tıklama: Her fabrika için down event ekle --- for (var i = 0; i < factoryList.length; i++) { (function (factory) { factory.down = function () { toggleFactoryStockPanel(factory); }; })(factoryList[i]); } // Yeni fabrika açıldığında da down event ekle var _oldSpawnFactory = spawnFactory; spawnFactory = function spawnFactory() { var factory = new Factory(); factory.x = 1024; factory.y = 1600; factoryList.push(factory); game.addChild(factory); // Down event ekle factory.down = function () { toggleFactoryStockPanel(factory); }; return factory; }; // --- MAĞAZA STOK PANELİ --- // Panel arka planı var shopStockPanelBg = LK.getAsset('businessPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 600, scaleX: 1.1, scaleY: 1.1 }); shopStockPanelBg.alpha = 0.97; shopStockPanelBg.visible = false; game.addChild(shopStockPanelBg); // Panel başlığı var shopStockPanelTitle = new Text2('Mağaza Stoğu', { size: 38, fill: "#000", fontWeight: "bold" }); shopStockPanelTitle.anchor.set(0.5, 0.5); shopStockPanelTitle.x = shopStockPanelBg.x; shopStockPanelTitle.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 60; shopStockPanelTitle.visible = false; game.addChild(shopStockPanelTitle); // Panel içeriği var shopStockPanelContent = new Container(); shopStockPanelContent.x = shopStockPanelBg.x; shopStockPanelContent.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 120; shopStockPanelContent.visible = false; game.addChild(shopStockPanelContent); // Kapatma ikonu var shopStockCloseIcon = new Text2('✕', { size: 84, fill: 0xFF0000, fontWeight: "bold" }); shopStockCloseIcon.anchor.set(0.5, 0.5); shopStockCloseIcon.x = shopStockPanelBg.x + shopStockPanelBg.width / 2 - 60; shopStockCloseIcon.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 60; shopStockCloseIcon.visible = false; game.addChild(shopStockCloseIcon); // Kapatma ikonunun tıklanabilir alanı var shopStockCloseHitArea = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: shopStockCloseIcon.width * 1.2, height: shopStockCloseIcon.height * 1.2, color: 0x000000, alpha: 0 }); shopStockCloseHitArea.x = shopStockCloseIcon.x; shopStockCloseHitArea.y = shopStockCloseIcon.y; shopStockCloseHitArea.visible = false; game.addChild(shopStockCloseHitArea); // Paneli güncelleyen fonksiyon function updateShopStockPanelContent(shop) { while (shopStockPanelContent.children.length > 0) { var c = shopStockPanelContent.children[0]; c.destroy && c.destroy(); shopStockPanelContent.removeChild(c); } if (!shop) return; var y = 0; var rowHeight = 60; var leftX = -shopStockPanelBg.width / 2 + 60; var iconSize = 40; var textOffset = 50; var colCount = 3; var colSpacing = (shopStockPanelBg.width - 80) / colCount; // Başlık: Ürünler var urunlerTitle = new Text2("Ürünler:", { size: 32, fill: "#222", fontWeight: "bold" }); urunlerTitle.anchor.set(0, 0.5); urunlerTitle.x = leftX; urunlerTitle.y = y; shopStockPanelContent.addChild(urunlerTitle); y += rowHeight; // Ürünler (iconlu) if (typeof productTypes !== "undefined" && productTypes && typeof productTypes.length === "number") { var productRowCount = Math.ceil(productTypes.length / colCount); for (var p = 0; p < productTypes.length; p++) { var count = shop.productBuffer && shop.productBuffer[p] ? shop.productBuffer[p] : 0; var col = p % colCount; var row = Math.floor(p / colCount); var xPos = leftX + col * colSpacing + iconSize / 2; var yPos = y + row * rowHeight; var icon = LK.getAsset(productTypes[p].icon, { anchorX: 0.5, anchorY: 0.5, x: xPos, y: yPos, scaleX: 0.4, scaleY: 0.4 }); shopStockPanelContent.addChild(icon); var label = new Text2(productTypes[p].name + ": " + count, { size: 28, fill: "#000" }); label.anchor.set(0, 0.5); label.x = xPos + textOffset; label.y = yPos; shopStockPanelContent.addChild(label); } y += productRowCount * rowHeight; } } // Paneli aç/kapat fonksiyonu var currentShopForPanel = null; function toggleShopStockPanel(shop) { var newVisible = !shopStockPanelBg.visible; if (typeof shop !== "undefined") { currentShopForPanel = shop; } shopStockPanelBg.visible = newVisible; shopStockPanelTitle.visible = newVisible; shopStockPanelContent.visible = newVisible; shopStockCloseIcon.visible = newVisible; shopStockCloseHitArea.visible = newVisible; if (newVisible && currentShopForPanel) { // Paneli ortala shopStockPanelBg.x = 1024; shopStockPanelBg.y = 600; shopStockPanelTitle.x = shopStockPanelBg.x; shopStockPanelTitle.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 60; shopStockPanelContent.x = shopStockPanelBg.x; shopStockPanelContent.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 120; shopStockCloseIcon.x = shopStockPanelBg.x + shopStockPanelBg.width / 2 - 60; shopStockCloseIcon.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 60; shopStockCloseHitArea.x = shopStockCloseIcon.x; shopStockCloseHitArea.y = shopStockCloseIcon.y; updateShopStockPanelContent(currentShopForPanel); } } // Kapatma ikonuna tıklama shopStockCloseHitArea.down = function () { toggleShopStockPanel(); }; shopStockCloseIcon.down = function () { toggleShopStockPanel(); }; // --- Mağaza tıklama: Her mağaza için down event ekle --- for (var i = 0; i < shopList.length; i++) { (function (shop) { shop.down = function () { toggleShopStockPanel(shop); }; })(shopList[i]); } // Yeni mağaza açıldığında da down event ekle var _oldSpawnShop = spawnShop; spawnShop = function spawnShop() { var shop = new Shop(); shop.x = 1024; shop.y = 350; shopList.push(shop); game.addChild(shop); shop.down = function () { toggleShopStockPanel(shop); }; return shop; }; // 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); // %10 sağa kaydır: panel genişliğinin %10'u kadar ekle speedInfoTxt.x = panelLeft + levelPanelBg.width * 0.10; 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); // %10 sağa kaydır: panel genişliğinin %10'u kadar ekle labelTxt.x = panelLeft + levelPanelBg.width * 0.10; 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); // %10 sağa kaydır: panel genişliğinin %10'u kadar ekle valueTxt.x = panelLeft + 180 + levelPanelBg.width * 0.10; 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; }; // Çalışanlar paneli 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; // Çalışanlar iconlarını panel kapanınca gizle workerMinerIcon.visible = workersPanelTitle.visible; workerCarrierIcon.visible = workersPanelTitle.visible; workerResearcherIcon.visible = workersPanelTitle.visible; workerOduncuIcon.visible = workersPanelTitle.visible; workerToplayiciIcon.visible = workersPanelTitle.visible; // --- 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); } }; // --- KERVANI GÖNDER BUTONU --- // 'Fabrika Aç' butonunun hemen altına ekle var kervaniGonderBtn = new Text2('Kervanı Gönder', { size: 32, fill: "#fff", fontWeight: "bold" }); kervaniGonderBtn.anchor.set(0.5, 0.5); kervaniGonderBtn.x = 0; kervaniGonderBtn.y = 60; // Fabrika Aç butonunun altına // Butonun işlevi: kervan varsa hemen gönder, yoksa bir şey yapma kervaniGonderBtn.down = function () { // Her durumda kervanı gönder if (caravan) { if (caravanPanelOpen) { toggleCaravanPanel(false); showMainPageElements(true); } caravan.destroy(); caravan = null; } caravanActive = false; caravanArrived = false; caravanPanelOpen = false; caravanTradeMade = false; caravanTimeout = null; caravanNextArrivalTick = LK.ticks + 2 * 60 * 60; caravanLeaveTick = 0; }; fabrikaAcContainer.addChild(kervaniGonderBtn); // 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); ;
/****
* 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: 84,
fill: 0xFF0000,
fontWeight: "bold"
});
closeIcon.anchor.set(0.5, 0.5);
closeIcon.x = panelBg.x + panelBg.width / 2 - 60;
closeIcon.y = panelBg.y - panelBg.height / 2 + 60;
closeIcon.visible = false;
self.addChild(closeIcon);
// Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle
var closeHitArea = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: closeIcon.width * 1.2,
height: closeIcon.height * 1.2,
color: 0x000000,
alpha: 0 // tamamen şeffaf
});
closeHitArea.x = closeIcon.x;
closeHitArea.y = closeIcon.y;
closeHitArea.visible = false;
self.addChild(closeHitArea);
closeHitArea.down = function () {
self.toggle();
};
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 + 2 * 100; // Move city 2 columns (200px) right
self.y = 150 + 2 * 100; // Move city 2 rows (200px) down
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) {
// Önce mağaza stoğundan kontrol et
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 if (typeof hangarStock !== "undefined" && hangarStock.product && hangarStock.product[self.wantProductType] > 0) {
// Hangar stoğunda varsa oradan al
hangarStock.product[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 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
};
} 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;
} else if (typeof hangarStock !== "undefined" && hangarStock.product && hangarStock.product[p] > 0) {
// Hangar stoğunda başka ürün varsa oradan al
hangarStock.product[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 toplam can ve gücü %75 artırıldı (attack, defense, maxHP, reward)
self.attack = Math.round((10 + type * 2 * powerScale) * 1.75);
self.defense = Math.round((10 + type * 2 * powerScale) * 1.75);
self.maxHP = Math.round((50 + type * 10 * powerScale) * 1.75);
self.hp = self.maxHP;
self.reward = Math.round((100 + (type - 1) * 100 * powerScale) * 1.75);
// Not: Saldırı, savunma, can ve ödül %75 artırı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 () {
// --- HANGAR: Hammaddeleri hangarStock'tan kullan ---
// Önce kendi buffer'ından, yoksa hangarStock'tan çek
var oreAvailable = self.oreBuffer > 0 ? self.oreBuffer : typeof hangarStock !== "undefined" ? hangarStock.ore : 0;
var woodAvailable = self.woodBuffer > 0 ? self.woodBuffer : typeof hangarStock !== "undefined" ? hangarStock.wood : 0;
var foodAvailable = self.foodBuffer > 0 ? self.foodBuffer : typeof hangarStock !== "undefined" ? hangarStock.food : 0;
if (oreAvailable > 0 && woodAvailable > 0 && foodAvailable > 0) {
self.processCounter++;
if (self.processCounter >= Math.max(10, self.processTime - (self.level - 1) * 10)) {
// Consume 1 of each resource type for production
if (self.oreBuffer > 0) self.oreBuffer--;else if (typeof hangarStock !== "undefined" && hangarStock.ore > 0) hangarStock.ore--;
if (self.woodBuffer > 0) self.woodBuffer--;else if (typeof hangarStock !== "undefined" && hangarStock.wood > 0) hangarStock.wood--;
if (self.foodBuffer > 0) self.foodBuffer--;else if (typeof hangarStock !== "undefined" && hangarStock.food > 0) hangarStock.food--;
// Pick a random product type to produce
var prodType = Math.floor(Math.random() * 10);
self.productBuffer[prodType]++;
// --- HANGAR: Ürünleri hangarStock'a da ekle ---
if (typeof hangarStock !== "undefined" && hangarStock.product) {
hangarStock.product[prodType] = (hangarStock.product[prodType] || 0) + 1;
}
self.processCounter = 0;
if (typeof updateHangarPanelContent === "function") updateHangarPanelContent();
}
} 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('researcher_icon', {
anchorX: 0.5,
anchorY: 0.5
});
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
****/
// Araştırmacı için özel renkli icon
// Koçbaşı
// Kalkanlı Savaş Arabası
// At Arabası
// Savaş Baltası
// Zırh
// Ok ve Yay
// Miğfer
// Kalkan
// Mızrak
// Kılıç
// Ancient war product icons (unique color for each)
// Add a background image to the game
// Soldier assets
// Enemy assets (10 types)
// Global lists for soldiers and enemy
var soldierList = [];
var currentEnemy = null;
var lastEnemyDefeatedTime = 0;
// --- KERVAN SİSTEMİ: GELİŞMİŞ TİCARET PANELİ ve LOJİSTİK ---
// Kervan state değişkenleri
var caravan = null;
var caravanActive = false;
var caravanArrived = false;
var caravanPanelOpen = false;
var caravanTradeMade = false;
var caravanTimeout = null;
var caravanNextArrivalTick = 0;
var caravanStock = null;
var caravanProductRows = [];
var caravanPanelBg, caravanPanelTitle, caravanPanelContent, caravanPanelCloseIcon;
var caravanPanelSellRows = [];
var caravanPanelTimer = null;
var caravanLeaveTick = 0;
var caravanArriveTargetX = 0,
caravanArriveTargetY = 0;
var caravanDepoTargetX = 0,
caravanDepoTargetY = 0;
// Kervan stoğu oluşturucu
function generateCaravanStock() {
// Hammaddeler: min 5, max 30
var ore = 5 + Math.floor(Math.random() * 26);
var wood = 5 + Math.floor(Math.random() * 26);
var food = 5 + Math.floor(Math.random() * 26);
// Ürünlerden rastgele 5 çeşit, her biri 1-20 arası
var productStock = [];
var productIndexes = [];
for (var i = 0; i < productTypes.length; i++) productIndexes.push(i);
// Karıştır
for (var i = productIndexes.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var tmp = productIndexes[i];
productIndexes[i] = productIndexes[j];
productIndexes[j] = tmp;
}
var selectedProducts = productIndexes.slice(0, 5);
for (var i = 0; i < productTypes.length; i++) productStock[i] = 0;
for (var i = 0; i < selectedProducts.length; i++) {
productStock[selectedProducts[i]] = 1 + Math.floor(Math.random() * 20);
}
return {
ore: ore,
wood: wood,
food: food,
product: productStock
};
}
// Kervan panelini oluştur (ilk seferde bir kez)
function createCaravanPanel() {
if (caravanPanelBg) return;
caravanPanelBg = LK.getAsset('caravanPanelBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2,
scaleX: 1.1,
scaleY: 1.1
});
caravanPanelBg.alpha = 0.97;
caravanPanelBg.visible = false;
game.addChild(caravanPanelBg);
caravanPanelTitle = new Text2('Kervan', {
size: 42,
fill: "#000",
fontWeight: "bold"
});
caravanPanelTitle.anchor.set(0.5, 0.5);
caravanPanelTitle.x = caravanPanelBg.x;
caravanPanelTitle.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 40; // 1 satır yukarı taşı
caravanPanelTitle.visible = false;
game.addChild(caravanPanelTitle);
caravanPanelContent = new Container();
caravanPanelContent.x = caravanPanelBg.x;
// 1 satır yukarı taşı (ör: %18 yerine %25 yapıldıysa, şimdi %30 yap)
caravanPanelContent.y = caravanPanelBg.y - 60 - caravanPanelBg.height * 0.18; // 1 satır daha yukarı
caravanPanelContent.visible = false;
game.addChild(caravanPanelContent);
// Kapat ikonu
caravanPanelCloseIcon = new Text2('✕', {
size: 84,
fill: 0xFF0000,
fontWeight: "bold"
});
caravanPanelCloseIcon.anchor.set(0.5, 0.5);
caravanPanelCloseIcon.x = caravanPanelBg.x + caravanPanelBg.width / 2 - 60;
caravanPanelCloseIcon.y = caravanPanelBg.y - caravanPanelBg.height / 2 + 40; // 1 satır yukarı taşı
caravanPanelCloseIcon.visible = false;
game.addChild(caravanPanelCloseIcon);
// Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle
var caravanPanelCloseHitArea = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: caravanPanelCloseIcon.width * 1.2,
height: caravanPanelCloseIcon.height * 1.2,
color: 0x000000,
alpha: 0
});
caravanPanelCloseHitArea.x = caravanPanelCloseIcon.x;
caravanPanelCloseHitArea.y = caravanPanelCloseIcon.y;
caravanPanelCloseHitArea.visible = false;
game.addChild(caravanPanelCloseHitArea);
caravanPanelCloseHitArea.down = function () {
toggleCaravanPanel(false);
};
caravanPanelCloseIcon.down = function () {
toggleCaravanPanel(false);
};
}
// Kervan panelini aç/kapat ve güncelle
function toggleCaravanPanel(forceOpen) {
var newVisible = typeof forceOpen === "boolean" ? forceOpen : !caravanPanelBg.visible;
// Paneli en ön planda açmak için zIndex'i en yükseğe ayarla
if (caravanPanelBg && typeof caravanPanelBg.setIndex === "function") {
caravanPanelBg.setIndex(9999);
}
if (caravanPanelTitle && typeof caravanPanelTitle.setIndex === "function") {
caravanPanelTitle.setIndex(9999);
}
if (caravanPanelCloseIcon && typeof caravanPanelCloseIcon.setIndex === "function") {
caravanPanelCloseIcon.setIndex(9999);
}
if (caravanPanelContent && typeof caravanPanelContent.setIndex === "function") {
caravanPanelContent.setIndex(9999);
}
caravanPanelBg.visible = newVisible;
caravanPanelTitle.visible = newVisible;
caravanPanelCloseIcon.visible = newVisible;
caravanPanelContent.visible = newVisible;
caravanPanelOpen = newVisible;
// Panel açılırsa kalan süreyi sıfırla
if (newVisible) {
// Paneli ortala
if (caravanPanelBg) {
caravanPanelBg.x = 2048 / 2;
caravanPanelBg.y = 2732 / 2;
}
if (caravanPanelTitle) {
caravanPanelTitle.x = 2048 / 2;
caravanPanelTitle.y = 2732 / 2 - (caravanPanelBg ? caravanPanelBg.height / 2 : 0) + 60;
}
if (caravanPanelContent) {
caravanPanelContent.x = 2048 / 2;
// YAZI ve İŞLEVLERİ %25 yukarı taşı (arka plan sabit kalacak)
// 1 satır yukarı taşımak için offseti azalt (ör: %25 yerine %18)
caravanPanelContent.y = 2732 / 2 - 30 - (caravanPanelBg ? caravanPanelBg.height * 0.18 : 0);
}
if (caravanPanelCloseIcon) {
caravanPanelCloseIcon.x = 2048 / 2 + (caravanPanelBg ? caravanPanelBg.width / 2 : 0) - 30;
caravanPanelCloseIcon.y = 2732 / 2 - (caravanPanelBg ? caravanPanelBg.height / 2 : 0) + 30;
}
// Panel arka planını yazının en altına kadar uzat
if (caravanPanelBg && caravanPanelContent && caravanPanelContent.children.length > 0) {
// Son satırın y'sini bul
var lastChild = caravanPanelContent.children[caravanPanelContent.children.length - 1];
var contentBottom = lastChild.y + (lastChild.height ? lastChild.height / 2 : 0);
var panelTop = caravanPanelBg.y - caravanPanelBg.height / 2;
var panelBottom = panelTop + caravanPanelBg.height;
var desiredHeight = contentBottom + 60; // 60px alt boşluk
var newHeight = Math.max(caravanPanelBg.height, desiredHeight);
caravanPanelBg.height = newHeight;
// Panel başlığını ve kapat ikonunu yeni yüksekliğe göre hizala
if (caravanPanelTitle) {
caravanPanelTitle.y = caravanPanelBg.y - newHeight / 2 + 60;
}
if (caravanPanelCloseIcon) {
caravanPanelCloseIcon.y = caravanPanelBg.y - newHeight / 2 + 30;
}
}
caravanLeaveTick = LK.ticks + 3600; // 1 dakika sonra ayrılacak (60*60)
updateCaravanPanelRows();
}
// Panel kapatılırsa, ana ekranı göster
if (!newVisible) {
showMainPageElements(true);
}
}
// Ana sayfa elemanlarını göster/gizle
function showMainPageElements(show) {
karargahImg.visible = show;
karargahLabel.visible = show;
workerStartImg.visible = show;
kampimizLabel.visible = show;
researchCampImg.visible = show;
researchCampLabel.visible = show;
researchCampRightImg.visible = show;
workerPanelLabel.visible = show;
// workerPanelTopImg.visible = show; // Removed: workerPanelTopImg is not defined
// depoLabel.visible = show; // Removed: depoLabel is not defined
if (city) city.visible = show;
for (var i = 0; i < minerList.length; i++) minerList[i].visible = show;
for (var i = 0; i < carrierList.length; i++) carrierList[i].visible = show;
for (var i = 0; i < researcherList.length; i++) researcherList[i].visible = show;
for (var i = 0; i < oduncuList.length; i++) oduncuList[i].visible = show;
for (var i = 0; i < toplayiciList.length; i++) toplayiciList[i].visible = show;
for (var i = 0; i < customerList.length; i++) customerList[i].visible = show;
for (var i = 0; i < mineList.length; i++) mineList[i].visible = show;
for (var i = 0; i < factoryList.length; i++) factoryList[i].visible = show;
for (var i = 0; i < shopList.length; i++) shopList[i].visible = show;
for (var i = 0; i < soldierList.length; i++) soldierList[i].visible = show;
for (var i = 0; i < treeList.length; i++) treeList[i].visible = show;
for (var i = 0; i < foodList.length; i++) foodList[i].visible = show;
if (currentEnemy) currentEnemy.visible = show;
for (var i = 0; i < statusTexts.length; i++) statusTexts[i].visible = show;
}
// Kervan panel satırlarını güncelle
function updateCaravanPanelRows() {
// Paneli temizle
while (caravanPanelContent.children.length > 0) {
var c = caravanPanelContent.children[0];
c.destroy && c.destroy();
caravanPanelContent.removeChild(c);
}
caravanProductRows = [];
caravanPanelSellRows = [];
var y = 0;
var rowHeight = 80;
var colLabelX = -caravanPanelBg.width * 0.35;
var colValueX = 0;
var colBtnX = caravanPanelBg.width * 0.35 - 30;
// Font büyüklüklerini 1 boy artır
var caravanFontSize = 36;
var caravanBtnFontSize = 32;
var caravanSmallFontSize = 26;
var caravanProfitFontSize = 24;
// --- Kervan geldiğinde kalan süreyi gösteren sayaç ekle ---
if (caravanArrived && caravanLeaveTick > LK.ticks) {
var ticksLeft = caravanLeaveTick - 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";
var caravanTimerTxt = new Text2("Kervan gidecek: " + timeStr, {
size: caravanFontSize,
fill: 0xD32F2F,
fontWeight: "bold"
});
caravanTimerTxt.anchor.set(0.5, 0.5);
caravanTimerTxt.x = 0;
caravanTimerTxt.y = y - 20; // 1 satır yukarı taşı
caravanPanelContent.addChild(caravanTimerTxt);
y += rowHeight - 40;
}
// --- Kervandan AL (hammadde ve ürünler) ---
// Hammaddeler
var matList = [{
key: "ore",
label: "Cevher",
price: Math.round(productTypes[0].price * 1.1)
}, {
key: "wood",
label: "Odun",
price: Math.round(productTypes[1].price * 1.1)
}, {
key: "food",
label: "Yiyecek",
price: Math.round(productTypes[2].price * 1.1)
}];
for (var i = 0; i < matList.length; i++) {
var mat = matList[i];
var rowBg = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: caravanPanelBg.width * 0.85,
height: rowHeight - 10,
color: 0xf5f5f5,
shape: 'box',
x: 0,
y: y
});
rowBg.alpha = 0.85;
caravanPanelContent.addChild(rowBg);
// --- Hammadde isminin yanına icon ekle (Kervan paneli) ---
var matIconMap = {
ore: "ore1",
wood: "wood1",
food: "food1"
};
var iconAsset = LK.getAsset(matIconMap[mat.key], {
anchorX: 0.5,
anchorY: 0.5,
x: colLabelX,
y: y - 20,
scaleX: 0.6,
scaleY: 0.6
});
caravanPanelContent.addChild(iconAsset);
// Iconun sağında hammadde ismi
var labelTxt = new Text2(mat.label + ":", {
size: caravanFontSize,
fill: "#000",
fontWeight: "bold"
});
labelTxt.anchor.set(0, 0.5);
labelTxt.x = colLabelX + 60;
labelTxt.y = y - 20;
caravanPanelContent.addChild(labelTxt);
var valueTxt = new Text2("" + (caravanStock ? caravanStock[mat.key] : 0), {
size: caravanFontSize,
fill: "#333"
});
valueTxt.anchor.set(0.5, 0.5);
valueTxt.x = colValueX;
valueTxt.y = y - 20;
caravanPanelContent.addChild(valueTxt);
var price = mat.price;
var buyBtn = new Text2("Al (₺" + price + ")", {
size: caravanBtnFontSize,
fill: 0x2E7D32,
fontWeight: "bold"
});
buyBtn.anchor.set(1, 0.5);
buyBtn.x = colBtnX;
buyBtn.y = y - 20;
buyBtn.alpha = caravanStock && caravanStock[mat.key] > 0 ? 1 : 0.4;
(function (mat, valueTxt, buyBtn) {
buyBtn.down = function () {
if (caravanStock && caravanStock[mat.key] > 0 && money >= mat.price) {
money -= mat.price;
updateMoneyText();
caravanStock[mat.key]--;
valueTxt.setText("" + caravanStock[mat.key]);
buyBtn.alpha = caravanStock[mat.key] <= 0 ? 0.4 : 1;
// --- HANGAR: Stoğa ekle ---
if (typeof hangarStock !== "undefined") {
hangarStock[mat.key] = (hangarStock[mat.key] || 0) + 1;
}
updateHangarPanelContent && updateHangarPanelContent();
caravanTradeMade = true;
}
};
})(mat, valueTxt, buyBtn);
caravanPanelContent.addChild(buyBtn);
caravanProductRows.push({
labelTxt: labelTxt,
valueTxt: valueTxt,
buyBtn: buyBtn
});
y += rowHeight;
}
// Ürünler (kervandan AL)
for (var i = 0; i < productTypes.length; i++) {
if (!caravanStock || !caravanStock.product || caravanStock.product[i] <= 0) continue;
var rowBg = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: caravanPanelBg.width * 0.85,
height: rowHeight - 10,
color: 0xf5f5f5,
shape: 'box',
x: 0,
y: y
});
rowBg.alpha = 0.85;
caravanPanelContent.addChild(rowBg);
// --- Ürün isminin yanına icon ekle ---
// Icon assetini oluştur
var iconAsset = LK.getAsset(productTypes[i].icon, {
anchorX: 0.5,
anchorY: 0.5,
x: colLabelX,
y: y - 20,
scaleX: 0.6,
scaleY: 0.6
});
caravanPanelContent.addChild(iconAsset);
// Iconun sağında ürün ismi
var labelTxt = new Text2(productTypes[i].name + ":", {
size: caravanFontSize,
fill: "#000",
fontWeight: "bold"
});
labelTxt.anchor.set(0, 0.5);
// Iconun sağında 60px boşluk bırak
labelTxt.x = colLabelX + 60;
labelTxt.y = y - 20;
caravanPanelContent.addChild(labelTxt);
var valueTxt = new Text2("" + (caravanStock.product[i] || 0), {
size: caravanFontSize,
fill: "#333"
});
valueTxt.anchor.set(0.5, 0.5);
valueTxt.x = colValueX;
valueTxt.y = y - 20;
caravanPanelContent.addChild(valueTxt);
var price = Math.round(productTypes[i].price * 1.1);
// Ortalama fiyatı hesapla (örnek: ürünün base fiyatı)
var avgPrice = productTypes[i].price;
// Kar/zarar oranı hesapla
var profitPercent = Math.round((price - avgPrice) / avgPrice * 100);
var profitColor = profitPercent > 0 ? "#2E7D32" : profitPercent < 0 ? "#d32f2f" : "#333";
var profitText = profitPercent > 0 ? "Kâr: %" + profitPercent : profitPercent < 0 ? "Zarar: %" + Math.abs(profitPercent) : "Kâr: %0";
var profitTxt = new Text2(profitText, {
size: caravanProfitFontSize,
fill: profitColor
});
profitTxt.anchor.set(0, 0.5);
profitTxt.x = colValueX + 80;
profitTxt.y = y - 20;
caravanPanelContent.addChild(profitTxt);
var buyBtn = new Text2("Al (₺" + price + ")", {
size: caravanBtnFontSize,
fill: 0x2E7D32,
fontWeight: "bold"
});
buyBtn.anchor.set(1, 0.5);
buyBtn.x = colBtnX;
buyBtn.y = y - 20;
buyBtn.alpha = caravanStock.product[i] > 0 ? 1 : 0.4;
(function (i, valueTxt, buyBtn) {
buyBtn.down = function () {
if (caravanStock && caravanStock.product[i] > 0 && money >= price) {
money -= price;
updateMoneyText();
caravanStock.product[i]--;
valueTxt.setText("" + caravanStock.product[i]);
buyBtn.alpha = caravanStock.product[i] <= 0 ? 0.4 : 1;
// --- HANGAR: Stoğa ekle ---
if (typeof hangarStock !== "undefined" && hangarStock.product) {
hangarStock.product[i] = (hangarStock.product[i] || 0) + 1;
}
updateHangarPanelContent && updateHangarPanelContent();
caravanTradeMade = true;
}
};
})(i, valueTxt, buyBtn);
caravanPanelContent.addChild(buyBtn);
caravanProductRows.push({
labelTxt: labelTxt,
valueTxt: valueTxt,
buyBtn: buyBtn,
profitTxt: profitTxt
});
y += rowHeight;
}
// --- Kervana SAT (ürün ve hammadde) ---
// Satılabilir ürünler: oyuncunun stoğunda olanlar
var sellTitle = new Text2("Kervana Satış", {
size: caravanFontSize,
fill: 0x1565C0,
fontWeight: "bold"
});
sellTitle.anchor.set(0.5, 0.5);
sellTitle.x = 0;
sellTitle.y = y + 10; // 1 satır yukarı taşı
caravanPanelContent.addChild(sellTitle);
y += rowHeight + 10;
// Hammaddelerden satılabilenler
var playerMats = [{
key: "ore",
label: "Cevher",
getCount: function getCount() {
var total = 0;
for (var f = 0; f < factoryList.length; f++) total += factoryList[f].oreBuffer || 0;
return total;
},
price: Math.round(productTypes[0].price * 0.9)
}, {
key: "wood",
label: "Odun",
getCount: function getCount() {
var total = 0;
for (var f = 0; f < factoryList.length; f++) total += factoryList[f].woodBuffer || 0;
return total;
},
price: Math.round(productTypes[1].price * 0.9)
}, {
key: "food",
label: "Yiyecek",
getCount: function getCount() {
var total = 0;
for (var f = 0; f < factoryList.length; f++) total += factoryList[f].foodBuffer || 0;
return total;
},
price: Math.round(productTypes[2].price * 0.9)
}];
for (var i = 0; i < playerMats.length; i++) {
var mat = playerMats[i];
var rowBg = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: caravanPanelBg.width * 0.85,
height: rowHeight - 10,
color: 0xe3f2fd,
shape: 'box',
x: 0,
y: y
});
rowBg.alpha = 0.85;
caravanPanelContent.addChild(rowBg);
// --- Hammadde isminin yanına icon ekle (Kervan paneli satış kısmı) ---
var matIconMap = {
ore: "ore1",
wood: "wood1",
food: "food1"
};
var iconAsset = LK.getAsset(matIconMap[mat.key], {
anchorX: 0.5,
anchorY: 0.5,
x: colLabelX,
y: y - 20,
scaleX: 0.6,
scaleY: 0.6
});
caravanPanelContent.addChild(iconAsset);
// Iconun sağında hammadde ismi
var labelTxt = new Text2(mat.label + ":", {
size: caravanFontSize,
fill: "#000",
fontWeight: "bold"
});
labelTxt.anchor.set(0, 0.5);
labelTxt.x = colLabelX + 60;
labelTxt.y = y - 20;
caravanPanelContent.addChild(labelTxt);
var valueTxt = new Text2("" + mat.getCount(), {
size: caravanFontSize,
fill: "#333"
});
valueTxt.anchor.set(0.5, 0.5);
valueTxt.x = colValueX;
valueTxt.y = y - 20;
caravanPanelContent.addChild(valueTxt);
var price = mat.price;
var sellBtn = new Text2("Sat (₺" + price + ")", {
size: caravanBtnFontSize,
fill: 0xd32f2f,
fontWeight: "bold"
});
sellBtn.anchor.set(1, 0.5);
sellBtn.x = colBtnX;
sellBtn.y = y - 20;
sellBtn.alpha = mat.getCount() > 0 ? 1 : 0.4;
(function (mat, valueTxt, sellBtn) {
sellBtn.down = function () {
// Satış: ilk bulduğu fabrikadan 1 adet düş
for (var f = 0; f < factoryList.length; f++) {
if (factoryList[f][mat.key + "Buffer"] > 0) {
factoryList[f][mat.key + "Buffer"]--;
money += mat.price;
updateMoneyText();
valueTxt.setText("" + mat.getCount());
sellBtn.alpha = mat.getCount() <= 0 ? 0.4 : 1;
caravanTradeMade = true;
break;
}
}
};
})(mat, valueTxt, sellBtn);
caravanPanelContent.addChild(sellBtn);
caravanPanelSellRows.push({
labelTxt: labelTxt,
valueTxt: valueTxt,
sellBtn: sellBtn
});
y += rowHeight;
}
// Ürünlerden satılabilenler
for (var i = 0; i < productTypes.length; i++) {
// Oyuncunun stoğunda var mı?
var total = 0;
for (var f = 0; f < factoryList.length; f++) total += factoryList[f].productBuffer[i] || 0;
if (total <= 0) continue;
var rowBg = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: caravanPanelBg.width * 0.85,
height: rowHeight - 10,
color: 0xe3f2fd,
shape: 'box',
x: 0,
y: y
});
rowBg.alpha = 0.85;
caravanPanelContent.addChild(rowBg);
// --- Ürün isminin yanına icon ekle (satış paneli) ---
var iconAsset = LK.getAsset(productTypes[i].icon, {
anchorX: 0.5,
anchorY: 0.5,
x: colLabelX,
y: y - 20,
scaleX: 0.6,
scaleY: 0.6
});
caravanPanelContent.addChild(iconAsset);
var labelTxt = new Text2(productTypes[i].name + ":", {
size: caravanFontSize,
fill: "#000",
fontWeight: "bold"
});
labelTxt.anchor.set(0, 0.5);
labelTxt.x = colLabelX + 60;
labelTxt.y = y - 20;
caravanPanelContent.addChild(labelTxt);
var valueTxt = new Text2("" + total, {
size: caravanFontSize,
fill: "#333"
});
valueTxt.anchor.set(0.5, 0.5);
valueTxt.x = colValueX;
valueTxt.y = y - 20;
caravanPanelContent.addChild(valueTxt);
var price = Math.round(productTypes[i].price * 0.9);
// Ortalama fiyatı hesapla (örnek: ürünün base fiyatı)
var avgPrice = productTypes[i].price;
// Kar/zarar oranı hesapla
var profitPercent = Math.round((price - avgPrice) / avgPrice * 100);
var profitColor = profitPercent > 0 ? "#2E7D32" : profitPercent < 0 ? "#d32f2f" : "#333";
var profitText = profitPercent > 0 ? "Kâr: %" + profitPercent : profitPercent < 0 ? "Zarar: %" + Math.abs(profitPercent) : "Kâr: %0";
var profitTxt = new Text2(profitText, {
size: caravanProfitFontSize,
fill: profitColor
});
profitTxt.anchor.set(0, 0.5);
profitTxt.x = colValueX + 80;
profitTxt.y = y - 20;
caravanPanelContent.addChild(profitTxt);
var sellBtn = new Text2("Sat (₺" + price + ")", {
size: caravanBtnFontSize,
fill: 0xd32f2f,
fontWeight: "bold"
});
sellBtn.anchor.set(1, 0.5);
sellBtn.x = colBtnX;
sellBtn.y = y - 20;
sellBtn.alpha = total > 0 ? 1 : 0.4;
(function (i, valueTxt, sellBtn) {
sellBtn.down = function () {
// Satış: ilk bulduğu fabrikadan 1 adet düş
for (var f = 0; f < factoryList.length; f++) {
if (factoryList[f].productBuffer[i] > 0) {
factoryList[f].productBuffer[i]--;
money += price;
updateMoneyText();
// Güncelle
var total = 0;
for (var ff = 0; ff < factoryList.length; ff++) total += factoryList[ff].productBuffer[i] || 0;
valueTxt.setText("" + total);
sellBtn.alpha = total <= 0 ? 0.4 : 1;
caravanTradeMade = true;
break;
}
}
};
})(i, valueTxt, sellBtn);
caravanPanelContent.addChild(sellBtn);
caravanPanelSellRows.push({
labelTxt: labelTxt,
valueTxt: valueTxt,
sellBtn: sellBtn,
profitTxt: profitTxt
});
y += rowHeight;
}
}
// Kervan spawn fonksiyonu
function spawnCaravan() {
if (caravan) {
caravan.destroy();
caravan = null;
}
createCaravanPanel();
caravan = new Caravan();
// Kervan paneli açılmasını garanti et
caravan.down = function (x, y, obj) {
toggleCaravanPanel(true);
showMainPageElements(false);
};
// Kervan haritanın orta kısımlarında rastgele bir noktadan başlasın (kenarlardan uzak)
// Orta alan: x: 500-1548, y: 700-2000
var spawnX = 500 + Math.random() * 1048;
var spawnY = 700 + Math.random() * 1300;
caravan.x = spawnX;
caravan.y = spawnY;
caravan.lastX = caravan.x;
caravan.lastY = caravan.y;
// Hedef: Haritanın orta kısımlarında rastgele bir yerde dursun (kenarlardan uzak)
// Orta alan: x: 600-1448, y: 900-1800
caravanDepoTargetX = 600 + Math.random() * 848;
caravanDepoTargetY = 900 + Math.random() * 900;
caravanArriveTargetX = caravanDepoTargetX;
caravanArriveTargetY = caravanDepoTargetY;
game.addChild(caravan);
caravanActive = true;
caravanArrived = false;
caravanPanelOpen = false;
caravanTradeMade = false;
caravanTimeout = null;
caravanStock = generateCaravanStock();
caravanLeaveTick = 0;
}
// Kervan'a tıklanınca panel aç/kapat
function caravanDownHandler() {
toggleCaravanPanel(true);
showMainPageElements(false);
}
// Kervan her zaman tıklanabilir olsun (kervanArrived olmasa da)
function checkCaravanArrived() {
if (!caravan) return;
// Hedef: DEPO'nun olduğu yer
var targetX = caravanArriveTargetX;
var targetY = caravanArriveTargetY;
var dx = caravan.x - targetX;
var dy = caravan.y - targetY;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 40) {
caravanArrived = true;
}
// Kervan resmine tıklanınca paneli aç
if (caravan) {
caravan.down = function (x, y, obj) {
toggleCaravanPanel(true);
showMainPageElements(false);
};
}
}
// Kervanın ayrılması ve tekrar gelmesi
function handleCaravanTimeouts() {
// Panel açıksa ve ticaret yapıldıysa, panel kapatılınca 1dk sonra tekrar gelsin
if (!caravanActive) return;
// Kervan geldikten 1 dakika sonra gitsin ve 2 dakika sonra güncel stok ile geri gelsin
// 1. Kervan geldiğinde, 1dk sonra ayrılacak (panel açık veya kapalı farketmez)
if (caravanArrived && caravanActive) {
// Kervan ayrılma tick'i ayarlanmadıysa ayarla
if (caravanLeaveTick === 0) {
caravanLeaveTick = LK.ticks + 60 * 60; // 1dk sonra ayrılacak
}
// 1dk dolduysa kervanı kaldır
if (LK.ticks >= caravanLeaveTick) {
// Panel açıksa kapat
if (caravanPanelOpen) {
toggleCaravanPanel(false);
showMainPageElements(true);
}
// Kervanı kaldır
if (caravan) {
caravan.destroy();
caravan = null;
}
caravanActive = false;
caravanArrived = false;
caravanPanelOpen = false;
caravanTradeMade = false;
caravanTimeout = null;
// 2dk sonra tekrar gelsin (güncel stok ile)
caravanNextArrivalTick = LK.ticks + 2 * 60 * 60; // 2dk sonra tekrar gelsin
caravanLeaveTick = 0;
}
}
// --- EK: Kervan paneli açıkken 1dk dolduysa paneli kapat ve kervanı kaldır (aktiflik için) ---
if (caravanActive && caravanArrived && LK.ticks >= caravanLeaveTick) {
if (caravanPanelOpen) {
toggleCaravanPanel(false);
showMainPageElements(true);
}
if (caravan) {
caravan.destroy();
caravan = null;
}
caravanActive = false;
caravanArrived = false;
caravanPanelOpen = false;
caravanTradeMade = false;
caravanTimeout = null;
caravanNextArrivalTick = LK.ticks + 2 * 60 * 60;
caravanLeaveTick = 0;
}
}
// Kervan update'i ana game.update'e ekle
var originalGameUpdate = game.update;
game.update = function () {
// Kervan yoksa ve zamanı geldiyse spawn et
if (!caravanActive && LK.ticks > caravanNextArrivalTick) {
spawnCaravan();
}
// Kervan aktifse ve varmadıysa hareket ettir
if (caravanActive && caravan && !caravanArrived) {
var targetX = caravanArriveTargetX;
var targetY = caravanArriveTargetY;
if (typeof caravan.moveTowards === "function") {
caravan.moveTowards(targetX, targetY);
}
checkCaravanArrived();
caravan.visible = true;
}
// Kervan varınca sabit dursun
if (caravanActive && caravanArrived && caravan && !caravanPanelOpen) {
caravan.visible = true;
}
// Kervan paneli açıksa satırları güncelle
if (caravanPanelOpen) {
updateCaravanPanelRows();
}
// Kervan ayrılma/tekrar gelme mantığı
handleCaravanTimeouts();
if (typeof originalGameUpdate === "function") originalGameUpdate();
};
// --- KERVAN GİTME DÜZELTME ---
// handleCaravanTimeouts fonksiyonunda leaveTick'in doğru ayarlanmasını ve kervanın zamanında kaldırılmasını sağlar
// (Bu kod, fonksiyonun mevcut tanımını değiştirmez, sadece fonksiyonun doğru çalışmasını sağlar)
// Kervan panelini dışarıdan erişim için global yap
window.toggleCaravanPanel = toggleCaravanPanel;
// Kervan ilk başta pasif, 10 saniye (600 tick) sonra gelsin
caravanNextArrivalTick = LK.ticks + 600;
caravanActive = false;
caravanArrived = false;
caravanPanelOpen = false;
caravanTradeMade = false;
caravanTimeout = null;
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 ---
// --- HANGAR (Sol Depo) ---
// Hangar görseli (haritanın solunda, karargahın solunda)
var hangarImg = LK.getAsset('depo', {
anchorX: 0.5,
anchorY: 0.5,
x: 180,
// Sol kenara yakın
y: 2400
});
game.addChild(hangarImg);
// Hangar label (görselin altında)
var hangarLabel = new Text2('HANGAR', {
size: 36,
fill: "#fff"
});
hangarLabel.anchor.set(0.5, 0);
hangarLabel.x = hangarImg.x;
hangarLabel.y = hangarImg.y + hangarImg.height / 2 + 10;
game.addChild(hangarLabel);
// Hangar panel arka planı (solda açılır)
var hangarPanelBg = LK.getAsset('depoPanelBg', {
anchorX: 0.0,
anchorY: 0.5,
x: 40,
// Sol kenar
y: 1366,
scaleX: 1.1,
scaleY: 1.1
});
hangarPanelBg.alpha = 0.97;
hangarPanelBg.visible = false;
game.addChild(hangarPanelBg);
// Hangar panel başlığı
var hangarPanelTitle = new Text2('HANGAR', {
size: 38,
fill: "#000",
fontWeight: "bold"
});
hangarPanelTitle.anchor.set(0.5, 0.5);
hangarPanelTitle.x = hangarPanelBg.x + hangarPanelBg.width / 2;
hangarPanelTitle.y = hangarPanelBg.y - hangarPanelBg.height / 2 + 60;
hangarPanelTitle.visible = false;
game.addChild(hangarPanelTitle);
// Hangar panel içeriği
// Panelde ürün isimlerinin yanına icon eklemek için Container kullan
var hangarPanelContent = new Container();
hangarPanelContent.x = hangarPanelBg.x + hangarPanelBg.width / 2;
hangarPanelContent.y = hangarPanelBg.y - hangarPanelBg.height / 2 + 120;
hangarPanelContent.visible = false;
game.addChild(hangarPanelContent);
// Hangar paneli kapat ikonu
var hangarCloseIcon = new Text2('✕', {
size: 84,
fill: 0xFF0000,
fontWeight: "bold"
});
hangarCloseIcon.anchor.set(0.5, 0.5);
hangarCloseIcon.x = hangarPanelBg.x + hangarPanelBg.width - 60;
hangarCloseIcon.y = hangarPanelBg.y - hangarPanelBg.height / 2 + 60;
hangarCloseIcon.visible = false;
game.addChild(hangarCloseIcon);
// Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle
var hangarCloseHitArea = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: hangarCloseIcon.width * 1.2,
height: hangarCloseIcon.height * 1.2,
color: 0x000000,
alpha: 0
});
hangarCloseHitArea.x = hangarCloseIcon.x;
hangarCloseHitArea.y = hangarCloseIcon.y;
hangarCloseHitArea.visible = false;
game.addChild(hangarCloseHitArea);
hangarCloseHitArea.down = function () {
hangarImg.down();
};
hangarCloseIcon.down = function () {
hangarImg.down();
};
// Hangar panelini güncelleyen fonksiyon
function updateHangarPanelContent() {
// Önce eski içeriği temizle
while (hangarPanelContent.children.length > 0) {
var c = hangarPanelContent.children[0];
c.destroy && c.destroy();
hangarPanelContent.removeChild(c);
}
var y = 0;
var rowHeight = 54;
var leftX = -hangarPanelBg.width / 2 + 40;
var iconSize = 40;
var textOffset = 50;
var colCount = 3; // 3'lü sıra
var colSpacing = (hangarPanelBg.width - 80) / colCount; // 80px margin
// Kervan stoğu başlığı
var caravanTitle = new Text2("Kervan Stoğu:", {
size: 32,
fill: "#222",
fontWeight: "bold"
});
caravanTitle.anchor.set(0, 0.5);
caravanTitle.x = leftX;
caravanTitle.y = y;
hangarPanelContent.addChild(caravanTitle);
y += rowHeight;
// Hammaddeler (Cevher, Odun, Yiyecek) - iconlu
var matList = [{
key: "ore",
label: "Cevher",
icon: "ore1",
value: typeof hangarStock !== "undefined" && hangarStock.ore || 0
}, {
key: "wood",
label: "Odun",
icon: "wood1",
value: typeof hangarStock !== "undefined" && hangarStock.wood || 0
}, {
key: "food",
label: "Yiyecek",
icon: "food1",
value: typeof hangarStock !== "undefined" && hangarStock.food || 0
}];
// --- 3'lü sıra ile hammaddeler ---
// Her hammadde için icon ve label ayrı ayrı ekle
for (var i = 0; i < matList.length; i++) {
var mat = matList[i];
var col = i % colCount;
var row = Math.floor(i / colCount);
var xPos = leftX + col * colSpacing + iconSize / 2;
var yPos = y + row * rowHeight;
// Icon ekle
var icon = LK.getAsset(mat.icon, {
anchorX: 0.5,
anchorY: 0.5,
x: xPos,
y: yPos,
scaleX: 0.4,
scaleY: 0.4
});
hangarPanelContent.addChild(icon);
// Iconun sağında label ekle
var label = new Text2(mat.label + ": " + mat.value, {
size: 30,
fill: "#000"
});
label.anchor.set(0, 0.5);
label.x = xPos + textOffset;
label.y = yPos;
hangarPanelContent.addChild(label);
}
y += Math.ceil(matList.length / colCount) * rowHeight;
// Ürünler başlığı
var urunlerTitle = new Text2("Ürünler:", {
size: 32,
fill: "#222",
fontWeight: "bold"
});
urunlerTitle.anchor.set(0, 0.5);
urunlerTitle.x = leftX;
urunlerTitle.y = y;
hangarPanelContent.addChild(urunlerTitle);
y += rowHeight;
// Ürünler (her biri iconlu) 3'lü sıra ile
if (typeof productTypes !== "undefined" && productTypes && typeof productTypes.length === "number") {
var productRowCount = Math.ceil(productTypes.length / colCount);
for (var p = 0; p < productTypes.length; p++) {
var count = typeof hangarStock !== "undefined" && hangarStock.product && hangarStock.product[p] ? hangarStock.product[p] : 0;
var col = p % colCount;
var row = Math.floor(p / colCount);
var xPos = leftX + col * colSpacing + iconSize / 2;
var yPos = y + row * rowHeight;
var icon = LK.getAsset(productTypes[p].icon, {
anchorX: 0.5,
anchorY: 0.5,
x: xPos,
y: yPos,
scaleX: 0.4,
scaleY: 0.4
});
hangarPanelContent.addChild(icon);
var label = new Text2(productTypes[p].name + ": " + count, {
size: 28,
fill: "#000"
});
label.anchor.set(0, 0.5);
label.x = xPos + textOffset;
label.y = yPos;
hangarPanelContent.addChild(label);
}
y += productRowCount * rowHeight;
}
// Boş satır
y += 10;
// Fabrika + Eski Stoklar başlığı
var fabrikaTitle = new Text2("Fabrika + Eski Stoklar:", {
size: 32,
fill: "#222",
fontWeight: "bold"
});
fabrikaTitle.anchor.set(0, 0.5);
fabrikaTitle.x = leftX;
fabrikaTitle.y = y;
hangarPanelContent.addChild(fabrikaTitle);
y += rowHeight;
// Tüm fabrika stokları (hammaddeler)
var totalOre = 0,
totalWood = 0,
totalFood = 0;
var totalProducts = [];
for (var p = 0; p < productTypes.length; p++) totalProducts[p] = 0;
for (var i = 0; i < factoryList.length; i++) {
totalOre += factoryList[i].oreBuffer || 0;
totalWood += factoryList[i].woodBuffer || 0;
totalFood += factoryList[i].foodBuffer || 0;
for (var p = 0; p < productTypes.length; p++) {
totalProducts[p] += factoryList[i].productBuffer[p] || 0;
}
}
// Hammaddeler (iconlu) - 3'lü sıra ile
var matList2 = [{
label: "Cevher",
icon: "ore1",
value: totalOre
}, {
label: "Odun",
icon: "wood1",
value: totalWood
}, {
label: "Yiyecek",
icon: "food1",
value: totalFood
}];
var matColCount = 3;
var matColSpacing = (hangarPanelBg.width - 80) / matColCount;
var matIconSize = 40;
var matTextOffset = 50;
for (var i = 0; i < matList2.length; i++) {
var mat = matList2[i];
var col = i % matColCount;
var row = Math.floor(i / matColCount);
var xPos = leftX + col * matColSpacing + matIconSize / 2;
var yPos = y + row * rowHeight;
var icon = LK.getAsset(mat.icon, {
anchorX: 0.5,
anchorY: 0.5,
x: xPos,
y: yPos,
scaleX: 0.4,
scaleY: 0.4
});
hangarPanelContent.addChild(icon);
var label = new Text2(mat.label + ": " + mat.value, {
size: 30,
fill: "#000"
});
label.anchor.set(0, 0.5);
label.x = xPos + matTextOffset;
label.y = yPos;
hangarPanelContent.addChild(label);
}
y += Math.ceil(matList2.length / matColCount) * rowHeight;
// Ürünler başlığı
var urunler2Title = new Text2("Ürünler:", {
size: 32,
fill: "#222",
fontWeight: "bold"
});
urunler2Title.anchor.set(0, 0.5);
urunler2Title.x = leftX;
urunler2Title.y = y;
hangarPanelContent.addChild(urunler2Title);
y += rowHeight;
// Ürünler (her biri iconlu) 3'lü sıra ile
if (typeof productTypes !== "undefined" && productTypes && typeof productTypes.length === "number") {
var prodColCount = 3;
var prodColSpacing = (hangarPanelBg.width - 80) / prodColCount;
var prodIconSize = 40;
var prodTextOffset = 50;
var productRowCount = Math.ceil(productTypes.length / prodColCount);
for (var p = 0; p < productTypes.length; p++) {
var count = totalProducts[p];
var col = p % prodColCount;
var row = Math.floor(p / prodColCount);
var xPos = leftX + col * prodColSpacing + prodIconSize / 2;
var yPos = y + row * rowHeight;
var icon = LK.getAsset(productTypes[p].icon, {
anchorX: 0.5,
anchorY: 0.5,
x: xPos,
y: yPos,
scaleX: 0.4,
scaleY: 0.4
});
hangarPanelContent.addChild(icon);
var label = new Text2(productTypes[p].name + ": " + count, {
size: 28,
fill: "#000"
});
label.anchor.set(0, 0.5);
label.x = xPos + prodTextOffset;
label.y = yPos;
hangarPanelContent.addChild(label);
}
y += productRowCount * rowHeight;
}
}
// Hangar resmine tıklanınca paneli aç/kapat
hangarImg.down = function () {
var newVisible = !hangarPanelBg.visible;
hangarPanelBg.visible = newVisible;
hangarPanelTitle.visible = newVisible;
hangarPanelContent.visible = newVisible;
hangarCloseIcon.visible = newVisible;
if (newVisible) updateHangarPanelContent();
};
// --- HANGAR Stokları ---
// Kervandan alınanlar ve fabrika stokları burada tutulacak
var hangarStock = {
ore: 0,
wood: 0,
food: 0,
product: []
};
if (typeof productTypes !== "undefined" && productTypes && typeof productTypes.length === "number") {
for (var p = 0; p < productTypes.length; p++) hangarStock.product[p] = 0;
}
// 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: 84,
fill: 0xFF0000,
fontWeight: "bold"
});
karargahCloseIcon.anchor.set(0.5, 0.5);
karargahCloseIcon.x = karargahPanelBg.x + karargahPanelBg.width / 2 - 60;
karargahCloseIcon.y = karargahPanelBg.y - karargahPanelBg.height / 2 + 60;
karargahCloseIcon.visible = false;
game.addChild(karargahCloseIcon);
// Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle
var karargahCloseHitArea = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: karargahCloseIcon.width * 1.2,
height: karargahCloseIcon.height * 1.2,
color: 0x000000,
alpha: 0
});
karargahCloseHitArea.x = karargahCloseIcon.x;
karargahCloseHitArea.y = karargahCloseIcon.y;
karargahCloseHitArea.visible = false;
game.addChild(karargahCloseHitArea);
karargahCloseHitArea.down = function () {
karargahImg.down();
};
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);
// --- Yeni: Canavar öldürülünce yeni canavar için kalan süre texti (karargahPanelEnemyTimerTxt'nin hemen altında) ---
var karargahPanelEnemyNextTimerTxt = new Text2("", {
size: 26,
fill: "#333"
});
karargahPanelEnemyNextTimerTxt.anchor.set(0.5, 1);
karargahPanelEnemyNextTimerTxt.x = karargahPanelEnemyTimerTxt.x;
karargahPanelEnemyNextTimerTxt.y = karargahPanelEnemyTimerTxt.y + 32;
karargahPanelEnemyNextTimerTxt.visible = false;
game.addChild(karargahPanelEnemyNextTimerTxt);
// 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);
// Kervan sadece şehirden bilgi alınca gelsin: ilk müşteri spawn edildiğinde kervan çağır
if (!caravanActive && LK.ticks >= caravanNextArrivalTick) {
spawnCaravan();
}
}
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
// --- MUSIC ICON & BACKGROUND MUSIC TOGGLE ---
// Add a music icon to the left of the money text (5 lines to the left)
var musicIcon = LK.getAsset('music_icon', {
anchorX: 0.5,
anchorY: 0,
x: -120,
// 5 lines to the left of moneyText (approx -120px)
y: 0,
scaleX: 0.7,
scaleY: 0.7
});
musicIcon.alpha = 0.85;
LK.gui.top.addChild(musicIcon);
// Music state
var isMusicOn = true;
// Play background music only after first user interaction (for mobile compatibility)
var _musicStarted = false;
function startBackgroundMusicIfNeeded() {
if (!_musicStarted && isMusicOn) {
LK.playMusic('arkaplan', {
loop: true
});
_musicStarted = true;
musicIcon.alpha = 0.85;
}
}
// Listen for first user interaction to start music
if (typeof game !== "undefined") {
game.down = function (origDown) {
return function (x, y, obj) {
startBackgroundMusicIfNeeded();
if (typeof origDown === "function") origDown(x, y, obj);
};
}(game.down);
}
if (typeof LK !== "undefined" && LK.gui && LK.gui.top) {
LK.gui.top.down = function (origDown) {
return function (x, y, obj) {
startBackgroundMusicIfNeeded();
if (typeof origDown === "function") origDown(x, y, obj);
};
}(LK.gui.top.down);
}
// Music icon toggle handler
musicIcon.down = function () {
if (isMusicOn) {
LK.stopMusic();
isMusicOn = false;
musicIcon.alpha = 0.35;
_musicStarted = false;
} else {
LK.playMusic('arkaplan', {
loop: true
});
isMusicOn = true;
_musicStarted = true;
musicIcon.alpha = 0.85;
}
};
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: 84,
fill: 0xFF0000,
fontWeight: "bold"
});
howToPlayCloseIcon.anchor.set(0.5, 0.5);
howToPlayCloseIcon.x = howToPlayPanelBg.x - 60;
howToPlayCloseIcon.y = howToPlayPanelBg.y + 60;
howToPlayCloseIcon.visible = false;
game.addChild(howToPlayCloseIcon);
// Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle
var howToPlayCloseHitArea = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: howToPlayCloseIcon.width * 1.2,
height: howToPlayCloseIcon.height * 1.2,
color: 0x000000,
alpha: 0
});
howToPlayCloseHitArea.x = howToPlayCloseIcon.x;
howToPlayCloseHitArea.y = howToPlayCloseIcon.y;
howToPlayCloseHitArea.visible = false;
game.addChild(howToPlayCloseHitArea);
howToPlayCloseHitArea.down = function () {
toggleHowToPlayPanel();
};
howToPlayCloseIcon.down = function () {
toggleHowToPlayPanel();
};
// 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);
// --- DEPO image, label, and panel removed from main screen (bottom right) ---
// 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;
// --- İşçi isimlerinin yanına icon ekle (Çalışanlar paneli) ---
var workerIconSize = 40;
var workerIconOffsetY = 0;
var workerIconOffsetX = -workerIconSize - 8;
// Madenci iconu
var workerMinerIcon = LK.getAsset('miner1', {
anchorX: 0.5,
anchorY: 0.5,
x: workerPanelLeft + workerIconOffsetX,
y: workerPanelRowY0 + workerIconOffsetY,
scaleX: 0.4,
scaleY: 0.4
});
game.addChild(workerMinerIcon);
var workerCountMinerText = new Text2('', {
size: workerPanelFontSize,
fill: "#000"
});
workerCountMinerText.anchor.set(0, 0.5);
workerCountMinerText.x = workerPanelLeft;
workerCountMinerText.y = workerPanelRowY0;
game.addChild(workerCountMinerText);
// Taşıyıcı iconu
var workerCarrierIcon = LK.getAsset('carrier', {
anchorX: 0.5,
anchorY: 0.5,
x: workerPanelLeft + workerIconOffsetX,
y: workerPanelRowY0 + workerPanelRowDY + workerIconOffsetY,
scaleX: 0.4,
scaleY: 0.4
});
game.addChild(workerCarrierIcon);
var workerCountCarrierText = new Text2('', {
size: workerPanelFontSize,
fill: "#000"
});
workerCountCarrierText.anchor.set(0, 0.5);
workerCountCarrierText.x = workerPanelLeft;
workerCountCarrierText.y = workerPanelRowY0 + workerPanelRowDY;
game.addChild(workerCountCarrierText);
// Araştırmacı iconu
var workerResearcherIcon = LK.getAsset('researcher_icon', {
anchorX: 0.5,
anchorY: 0.5,
x: workerPanelLeft + workerIconOffsetX,
y: workerPanelRowY0 + 2 * workerPanelRowDY + workerIconOffsetY,
scaleX: 0.4,
scaleY: 0.4
});
game.addChild(workerResearcherIcon);
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);
// Oduncu iconu
var workerOduncuIcon = LK.getAsset('oduncu1', {
anchorX: 0.5,
anchorY: 0.5,
x: workerPanelLeft + workerIconOffsetX,
y: workerPanelRowY0 + 3 * workerPanelRowDY + workerIconOffsetY,
scaleX: 0.4,
scaleY: 0.4
});
game.addChild(workerOduncuIcon);
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);
// Toplayıcı iconu
var workerToplayiciIcon = LK.getAsset('toplayici1', {
anchorX: 0.5,
anchorY: 0.5,
x: workerPanelLeft + workerIconOffsetX,
y: workerPanelRowY0 + 4 * workerPanelRowDY + workerIconOffsetY,
scaleX: 0.4,
scaleY: 0.4
});
game.addChild(workerToplayiciIcon);
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: 84,
fill: 0xFF0000,
fontWeight: "bold"
});
workersCloseIcon.anchor.set(0.5, 0.5);
workersCloseIcon.x = workersPanelBg.x + workersPanelBg.width / 2 - 60;
workersCloseIcon.y = workersPanelBg.y - workersPanelBg.height / 2 + 60;
workersCloseIcon.visible = false;
game.addChild(workersCloseIcon);
// Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle
var workersCloseHitArea = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: workersCloseIcon.width * 1.2,
height: workersCloseIcon.height * 1.2,
color: 0x000000,
alpha: 0
});
workersCloseHitArea.x = workersCloseIcon.x;
workersCloseHitArea.y = workersCloseIcon.y;
workersCloseHitArea.visible = false;
game.addChild(workersCloseHitArea);
workersCloseHitArea.down = function () {
researchCampRightImg.down();
};
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;
// Çalışanlar iconlarını panel açılınca otomatik tekrar görünür yap
workerMinerIcon.visible = newVisible;
workerCarrierIcon.visible = newVisible;
workerResearcherIcon.visible = newVisible;
workerOduncuIcon.visible = newVisible;
workerToplayiciIcon.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);
// %10 sağa kaydır: panel genişliğinin %10'u kadar ekle
researchCampPanelText.x = researchCampPanelBg.x - researchCampPanelBg.width / 2 + 40 + researchCampPanelBg.width * 0.10;
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: 84,
fill: 0xFF0000,
fontWeight: "bold"
});
researchCloseIcon.anchor.set(0.5, 0.5);
researchCloseIcon.x = researchCampPanelBg.x + researchCampPanelBg.width / 2 - 60;
researchCloseIcon.y = researchCampPanelBg.y - researchCampPanelBg.height / 2 + 60;
researchCloseIcon.visible = false;
game.addChild(researchCloseIcon);
// Kapatma ikonunun tıklanabilir alanını büyütmek için şeffaf bir kutu ekle
var researchCloseHitArea = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: researchCloseIcon.width * 1.2,
height: researchCloseIcon.height * 1.2,
color: 0x000000,
alpha: 0
});
researchCloseHitArea.x = researchCloseIcon.x;
researchCloseHitArea.y = researchCloseIcon.y;
researchCloseHitArea.visible = false;
game.addChild(researchCloseHitArea);
researchCloseHitArea.down = function () {
researchCampImg.down();
};
researchCloseIcon.down = function () {
researchCampImg.down();
};
// Show/hide panel on image press
researchCampImg.down = function () {
var newVisible = !researchCampPanelBg.visible;
researchCampPanelBg.visible = newVisible;
researchCampPanelText.visible = newVisible;
researchCloseIcon.visible = newVisible;
};
spawnMine();
spawnMine();
spawnFactory();
spawnShop();
spawnMiner();
spawnCarrier();
spawnResearcher();
spawnResearcher(); // İkinci araştırmacı
spawnOduncu();
spawnToplayici();
// --- Kervan oyun başladıktan 10 saniye (600 tick) sonra gelsin ---
// Kervan ilk başta pasif, sadece 10 saniye sonra aktifleşecek
caravanNextArrivalTick = LK.ticks + 600; // 10 saniye (600 tick) sonra ilk geliş
// Kervan başta pasif
caravanActive = false;
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;
}
}
// (depo panel removed)
// 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;
}
// Tüm paneller açıldığında sadece panel arka planı kadar ana ekran unsurlarını gizle, panel dışı alanlar görünür kalsın
var anyPanelOpen = karargahPanelBg.visible || businessPanel.visible || workersPanelBg.visible || levelPanelBg.visible || researchCampPanelBg.visible || hangarPanelBg.visible || caravanPanelBg && caravanPanelBg.visible;
// Always show background
backgroundImg.visible = true;
// Helper: Sadece panel arka planı kadar alanı gizle, panel dışı unsurlar görünür kalsın
function isElementInAnyPanelBgArea(element) {
if (!element || typeof element.x !== "number" || typeof element.y !== "number") 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
};
// İşletmeler paneli
if (businessPanel.visible && businessPanel.children && businessPanel.children.length > 0) {
var bg = businessPanel.children[0];
if (bg && bg.visible) {
var left = bg.x - bg.width / 2,
right = bg.x + bg.width / 2,
top = bg.y - bg.height / 2,
bottom = bg.y + bg.height / 2;
if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true;
}
}
// Karargah paneli
if (karargahPanelBg.visible) {
var left = karargahPanelBg.x - karargahPanelBg.width / 2,
right = karargahPanelBg.x + karargahPanelBg.width / 2,
top = karargahPanelBg.y - karargahPanelBg.height / 2,
bottom = karargahPanelBg.y + karargahPanelBg.height / 2;
if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true;
}
// (depo panel removed)
// Çalışanlar paneli
if (workersPanelBg.visible) {
var left = workersPanelBg.x - workersPanelBg.width / 2,
right = workersPanelBg.x + workersPanelBg.width / 2,
top = workersPanelBg.y - workersPanelBg.height / 2,
bottom = workersPanelBg.y + workersPanelBg.height / 2;
if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true;
}
// Level paneli
if (levelPanelBg.visible) {
var left = levelPanelBg.x - levelPanelBg.width / 2,
right = levelPanelBg.x + levelPanelBg.width / 2,
top = levelPanelBg.y - levelPanelBg.height / 2,
bottom = levelPanelBg.y + levelPanelBg.height / 2;
if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true;
}
// Araştırma kampı paneli
if (researchCampPanelBg.visible) {
var left = researchCampPanelBg.x - researchCampPanelBg.width / 2,
right = researchCampPanelBg.x + researchCampPanelBg.width / 2,
top = researchCampPanelBg.y - researchCampPanelBg.height / 2,
bottom = researchCampPanelBg.y + researchCampPanelBg.height / 2;
if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true;
}
// Nasıl Oynanır paneli
if (howToPlayPanelBg.visible) {
var left = howToPlayPanelBg.x - howToPlayPanelBg.width,
right = howToPlayPanelBg.x,
top = howToPlayPanelBg.y,
bottom = howToPlayPanelBg.y + howToPlayPanelBg.height;
if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true;
}
// HANGAR paneli (depoPanelBg ile karışmasın)
if (hangarPanelBg && hangarPanelBg.visible) {
var left = hangarPanelBg.x,
right = hangarPanelBg.x + hangarPanelBg.width,
top = hangarPanelBg.y - hangarPanelBg.height / 2,
bottom = hangarPanelBg.y + hangarPanelBg.height / 2;
if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true;
}
// KERVAN paneli
if (caravanPanelBg && caravanPanelBg.visible) {
var left = caravanPanelBg.x - caravanPanelBg.width / 2,
right = caravanPanelBg.x + caravanPanelBg.width / 2,
top = caravanPanelBg.y - caravanPanelBg.height / 2,
bottom = caravanPanelBg.y + caravanPanelBg.height / 2;
if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true;
}
// FABRIKA STOK paneli
if (factoryStockPanelBg && factoryStockPanelBg.visible) {
var left = factoryStockPanelBg.x - factoryStockPanelBg.width / 2,
right = factoryStockPanelBg.x + factoryStockPanelBg.width / 2,
top = factoryStockPanelBg.y - factoryStockPanelBg.height / 2,
bottom = factoryStockPanelBg.y + factoryStockPanelBg.height / 2;
if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true;
}
// MAĞAZA STOK paneli
if (shopStockPanelBg && shopStockPanelBg.visible) {
var left = shopStockPanelBg.x - shopStockPanelBg.width / 2,
right = shopStockPanelBg.x + shopStockPanelBg.width / 2,
top = shopStockPanelBg.y - shopStockPanelBg.height / 2,
bottom = shopStockPanelBg.y + shopStockPanelBg.height / 2;
if (elementBounds.right > left && elementBounds.left < right && elementBounds.bottom > top && elementBounds.top < bottom) return true;
}
return false;
}
// Show/hide main building images and labels based on panel bg overlap
karargahImg.visible = !isElementInAnyPanelBgArea(karargahImg);
karargahLabel.visible = !isElementInAnyPanelBgArea(karargahLabel);
workerStartImg.visible = !isElementInAnyPanelBgArea(workerStartImg);
kampimizLabel.visible = !isElementInAnyPanelBgArea(kampimizLabel);
researchCampImg.visible = !isElementInAnyPanelBgArea(researchCampImg);
researchCampLabel.visible = !isElementInAnyPanelBgArea(researchCampLabel);
researchCampRightImg.visible = !isElementInAnyPanelBgArea(researchCampRightImg);
workerPanelLabel.visible = !isElementInAnyPanelBgArea(workerPanelLabel);
// workerPanelTopImg.visible = !isElementInAnyPanelBgArea(workerPanelTopImg); // Removed: workerPanelTopImg is not defined
// Show/hide city based on panel bg overlap
if (city) city.visible = !isElementInAnyPanelBgArea(city);
// Show/hide workers and game objects based on panel bg overlap
for (var i = 0; i < minerList.length; i++) {
minerList[i].visible = !isElementInAnyPanelBgArea(minerList[i]);
}
for (var i = 0; i < carrierList.length; i++) {
carrierList[i].visible = !isElementInAnyPanelBgArea(carrierList[i]);
}
for (var i = 0; i < researcherList.length; i++) {
researcherList[i].visible = !isElementInAnyPanelBgArea(researcherList[i]);
}
for (var i = 0; i < oduncuList.length; i++) {
oduncuList[i].visible = !isElementInAnyPanelBgArea(oduncuList[i]);
}
for (var i = 0; i < toplayiciList.length; i++) {
toplayiciList[i].visible = !isElementInAnyPanelBgArea(toplayiciList[i]);
}
for (var i = 0; i < customerList.length; i++) {
customerList[i].visible = !isElementInAnyPanelBgArea(customerList[i]);
}
for (var i = 0; i < mineList.length; i++) {
mineList[i].visible = !isElementInAnyPanelBgArea(mineList[i]);
}
for (var i = 0; i < factoryList.length; i++) {
factoryList[i].visible = !isElementInAnyPanelBgArea(factoryList[i]);
}
for (var i = 0; i < shopList.length; i++) {
shopList[i].visible = !isElementInAnyPanelBgArea(shopList[i]);
}
for (var i = 0; i < soldierList.length; i++) {
soldierList[i].visible = !isElementInAnyPanelBgArea(soldierList[i]);
}
for (var i = 0; i < treeList.length; i++) {
treeList[i].visible = !isElementInAnyPanelBgArea(treeList[i]);
}
for (var i = 0; i < foodList.length; i++) {
foodList[i].visible = !isElementInAnyPanelBgArea(foodList[i]);
}
if (currentEnemy) {
currentEnemy.visible = !isElementInAnyPanelBgArea(currentEnemy);
}
// Kervan resmi panellerden biri açıkken veya panel arka planı ile çakışıyorsa gizle
var anyPanelOpenForCaravan = karargahPanelBg.visible || businessPanel.visible || workersPanelBg.visible || levelPanelBg.visible || researchCampPanelBg.visible || hangarPanelBg.visible || caravanPanelBg && caravanPanelBg.visible || factoryStockPanelBg.visible || shopStockPanelBg.visible;
if (caravan) {
// Kervan, herhangi bir panel açıkken veya panel arka planı ile çakışıyorsa gizli
caravan.visible = !anyPanelOpenForCaravan ? !isElementInAnyPanelBgArea(caravan) : false;
}
// Show/hide status texts based on panel bg overlap
for (var i = 0; i < statusTexts.length; i++) {
statusTexts[i].visible = !isElementInAnyPanelBgArea(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);
// Altına ek: Canavar henüz öldürülmemişse, "Canavara Geldi" yazmasın, sadece kalan süreyi göster
if (typeof karargahPanelEnemyNextTimerTxt !== "undefined") {
karargahPanelEnemyNextTimerTxt.visible = true;
karargahPanelEnemyNextTimerTxt.setText("");
}
} else if (!currentEnemy) {
// Canavar henüz öldürülmemişse, "Canavara Geldi" yaz
karargahPanelEnemyTimerTxt.setText("Canavara Geldi");
if (typeof karargahPanelEnemyNextTimerTxt !== "undefined") {
karargahPanelEnemyNextTimerTxt.visible = false;
karargahPanelEnemyNextTimerTxt.setText("");
}
} else {
karargahPanelEnemyTimerTxt.setText("");
if (typeof karargahPanelEnemyNextTimerTxt !== "undefined") {
karargahPanelEnemyNextTimerTxt.visible = false;
karargahPanelEnemyNextTimerTxt.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!";
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: "Kılıç",
icon: "kilic_icon",
price: 10
}, {
name: "Mızrak",
icon: "mizrak_icon",
price: 12
}, {
name: "Kalkan",
icon: "kalkan_icon",
price: 14
}, {
name: "Miğfer",
icon: "migfer_icon",
price: 16
}, {
name: "Ok ve Yay",
icon: "okveyay_icon",
price: 18
}, {
name: "Zırh",
icon: "zirh_icon",
price: 20
}, {
name: "Savaş Baltası",
icon: "savasbaltasi_icon",
price: 22
}, {
name: "At Arabası",
icon: "atarabasi_icon",
price: 24
}, {
name: "Savaş Arabası",
icon: "kalkanlisavasarabasi_icon",
price: 26
}, {
name: "Koçbaşı",
icon: "kocbasi_icon",
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++) {
// Ana ekranda hammadde ismi gösterme, sadece sayı göster
var t = new Text2("" + 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);
// --- FABRIKA STOK PANELİ ---
// Panel arka planı
var factoryStockPanelBg = LK.getAsset('businessPanelBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 1.1,
scaleY: 1.1
});
factoryStockPanelBg.alpha = 0.97;
factoryStockPanelBg.visible = false;
game.addChild(factoryStockPanelBg);
// Panel başlığı
var factoryStockPanelTitle = new Text2('Fabrika Stoğu', {
size: 38,
fill: "#000",
fontWeight: "bold"
});
factoryStockPanelTitle.anchor.set(0.5, 0.5);
factoryStockPanelTitle.x = factoryStockPanelBg.x;
factoryStockPanelTitle.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 60;
factoryStockPanelTitle.visible = false;
game.addChild(factoryStockPanelTitle);
// Panel içeriği
var factoryStockPanelContent = new Container();
factoryStockPanelContent.x = factoryStockPanelBg.x;
factoryStockPanelContent.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 120;
factoryStockPanelContent.visible = false;
game.addChild(factoryStockPanelContent);
// Kapatma ikonu
var factoryStockCloseIcon = new Text2('✕', {
size: 84,
fill: 0xFF0000,
fontWeight: "bold"
});
factoryStockCloseIcon.anchor.set(0.5, 0.5);
factoryStockCloseIcon.x = factoryStockPanelBg.x + factoryStockPanelBg.width / 2 - 60;
factoryStockCloseIcon.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 60;
factoryStockCloseIcon.visible = false;
game.addChild(factoryStockCloseIcon);
// Kapatma ikonunun tıklanabilir alanı
var factoryStockCloseHitArea = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: factoryStockCloseIcon.width * 1.2,
height: factoryStockCloseIcon.height * 1.2,
color: 0x000000,
alpha: 0
});
factoryStockCloseHitArea.x = factoryStockCloseIcon.x;
factoryStockCloseHitArea.y = factoryStockCloseIcon.y;
factoryStockCloseHitArea.visible = false;
game.addChild(factoryStockCloseHitArea);
// Paneli güncelleyen fonksiyon
function updateFactoryStockPanelContent(factory) {
// Panel içeriğini temizle
while (factoryStockPanelContent.children.length > 0) {
var c = factoryStockPanelContent.children[0];
c.destroy && c.destroy();
factoryStockPanelContent.removeChild(c);
}
if (!factory) return;
var y = 0;
var rowHeight = 60;
var leftX = -factoryStockPanelBg.width / 2 + 60;
var iconSize = 40;
var textOffset = 50;
var colCount = 3;
var colSpacing = (factoryStockPanelBg.width - 80) / colCount;
// Başlık: Hammaddeler
var matTitle = new Text2("Hammaddeler:", {
size: 32,
fill: "#222",
fontWeight: "bold"
});
matTitle.anchor.set(0, 0.5);
matTitle.x = leftX;
matTitle.y = y;
factoryStockPanelContent.addChild(matTitle);
y += rowHeight;
// Hammaddeler (iconlu)
var matList = [{
key: "ore",
label: "Cevher",
icon: "ore1",
value: factory.oreBuffer || 0
}, {
key: "wood",
label: "Odun",
icon: "wood1",
value: factory.woodBuffer || 0
}, {
key: "food",
label: "Yiyecek",
icon: "food1",
value: factory.foodBuffer || 0
}];
for (var i = 0; i < matList.length; i++) {
var mat = matList[i];
var col = i % colCount;
var row = Math.floor(i / colCount);
var xPos = leftX + col * colSpacing + iconSize / 2;
var yPos = y + row * rowHeight;
var icon = LK.getAsset(mat.icon, {
anchorX: 0.5,
anchorY: 0.5,
x: xPos,
y: yPos,
scaleX: 0.4,
scaleY: 0.4
});
factoryStockPanelContent.addChild(icon);
var label = new Text2(mat.label + ": " + mat.value, {
size: 30,
fill: "#000"
});
label.anchor.set(0, 0.5);
label.x = xPos + textOffset;
label.y = yPos;
factoryStockPanelContent.addChild(label);
}
y += Math.ceil(matList.length / colCount) * rowHeight;
// Başlık: Ürünler
var urunlerTitle = new Text2("Ürünler:", {
size: 32,
fill: "#222",
fontWeight: "bold"
});
urunlerTitle.anchor.set(0, 0.5);
urunlerTitle.x = leftX;
urunlerTitle.y = y;
factoryStockPanelContent.addChild(urunlerTitle);
y += rowHeight;
// Ürünler (iconlu)
if (typeof productTypes !== "undefined" && productTypes && typeof productTypes.length === "number") {
var productRowCount = Math.ceil(productTypes.length / colCount);
for (var p = 0; p < productTypes.length; p++) {
var count = factory.productBuffer && factory.productBuffer[p] ? factory.productBuffer[p] : 0;
var col = p % colCount;
var row = Math.floor(p / colCount);
var xPos = leftX + col * colSpacing + iconSize / 2;
var yPos = y + row * rowHeight;
var icon = LK.getAsset(productTypes[p].icon, {
anchorX: 0.5,
anchorY: 0.5,
x: xPos,
y: yPos,
scaleX: 0.4,
scaleY: 0.4
});
factoryStockPanelContent.addChild(icon);
var label = new Text2(productTypes[p].name + ": " + count, {
size: 28,
fill: "#000"
});
label.anchor.set(0, 0.5);
label.x = xPos + textOffset;
label.y = yPos;
factoryStockPanelContent.addChild(label);
}
y += productRowCount * rowHeight;
}
}
// Paneli aç/kapat fonksiyonu
var currentFactoryForPanel = null;
function toggleFactoryStockPanel(factory) {
var newVisible = !factoryStockPanelBg.visible;
if (typeof factory !== "undefined") {
currentFactoryForPanel = factory;
}
factoryStockPanelBg.visible = newVisible;
factoryStockPanelTitle.visible = newVisible;
factoryStockPanelContent.visible = newVisible;
factoryStockCloseIcon.visible = newVisible;
factoryStockCloseHitArea.visible = newVisible;
if (newVisible && currentFactoryForPanel) {
// Paneli ortala
factoryStockPanelBg.x = 1024;
factoryStockPanelBg.y = 1366;
factoryStockPanelTitle.x = factoryStockPanelBg.x;
factoryStockPanelTitle.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 60;
factoryStockPanelContent.x = factoryStockPanelBg.x;
factoryStockPanelContent.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 120;
factoryStockCloseIcon.x = factoryStockPanelBg.x + factoryStockPanelBg.width / 2 - 60;
factoryStockCloseIcon.y = factoryStockPanelBg.y - factoryStockPanelBg.height / 2 + 60;
factoryStockCloseHitArea.x = factoryStockCloseIcon.x;
factoryStockCloseHitArea.y = factoryStockCloseIcon.y;
updateFactoryStockPanelContent(currentFactoryForPanel);
}
}
// Kapatma ikonuna tıklama
factoryStockCloseHitArea.down = function () {
toggleFactoryStockPanel();
};
factoryStockCloseIcon.down = function () {
toggleFactoryStockPanel();
};
// --- Fabrika tıklama: Her fabrika için down event ekle ---
for (var i = 0; i < factoryList.length; i++) {
(function (factory) {
factory.down = function () {
toggleFactoryStockPanel(factory);
};
})(factoryList[i]);
}
// Yeni fabrika açıldığında da down event ekle
var _oldSpawnFactory = spawnFactory;
spawnFactory = function spawnFactory() {
var factory = new Factory();
factory.x = 1024;
factory.y = 1600;
factoryList.push(factory);
game.addChild(factory);
// Down event ekle
factory.down = function () {
toggleFactoryStockPanel(factory);
};
return factory;
};
// --- MAĞAZA STOK PANELİ ---
// Panel arka planı
var shopStockPanelBg = LK.getAsset('businessPanelBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 600,
scaleX: 1.1,
scaleY: 1.1
});
shopStockPanelBg.alpha = 0.97;
shopStockPanelBg.visible = false;
game.addChild(shopStockPanelBg);
// Panel başlığı
var shopStockPanelTitle = new Text2('Mağaza Stoğu', {
size: 38,
fill: "#000",
fontWeight: "bold"
});
shopStockPanelTitle.anchor.set(0.5, 0.5);
shopStockPanelTitle.x = shopStockPanelBg.x;
shopStockPanelTitle.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 60;
shopStockPanelTitle.visible = false;
game.addChild(shopStockPanelTitle);
// Panel içeriği
var shopStockPanelContent = new Container();
shopStockPanelContent.x = shopStockPanelBg.x;
shopStockPanelContent.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 120;
shopStockPanelContent.visible = false;
game.addChild(shopStockPanelContent);
// Kapatma ikonu
var shopStockCloseIcon = new Text2('✕', {
size: 84,
fill: 0xFF0000,
fontWeight: "bold"
});
shopStockCloseIcon.anchor.set(0.5, 0.5);
shopStockCloseIcon.x = shopStockPanelBg.x + shopStockPanelBg.width / 2 - 60;
shopStockCloseIcon.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 60;
shopStockCloseIcon.visible = false;
game.addChild(shopStockCloseIcon);
// Kapatma ikonunun tıklanabilir alanı
var shopStockCloseHitArea = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: shopStockCloseIcon.width * 1.2,
height: shopStockCloseIcon.height * 1.2,
color: 0x000000,
alpha: 0
});
shopStockCloseHitArea.x = shopStockCloseIcon.x;
shopStockCloseHitArea.y = shopStockCloseIcon.y;
shopStockCloseHitArea.visible = false;
game.addChild(shopStockCloseHitArea);
// Paneli güncelleyen fonksiyon
function updateShopStockPanelContent(shop) {
while (shopStockPanelContent.children.length > 0) {
var c = shopStockPanelContent.children[0];
c.destroy && c.destroy();
shopStockPanelContent.removeChild(c);
}
if (!shop) return;
var y = 0;
var rowHeight = 60;
var leftX = -shopStockPanelBg.width / 2 + 60;
var iconSize = 40;
var textOffset = 50;
var colCount = 3;
var colSpacing = (shopStockPanelBg.width - 80) / colCount;
// Başlık: Ürünler
var urunlerTitle = new Text2("Ürünler:", {
size: 32,
fill: "#222",
fontWeight: "bold"
});
urunlerTitle.anchor.set(0, 0.5);
urunlerTitle.x = leftX;
urunlerTitle.y = y;
shopStockPanelContent.addChild(urunlerTitle);
y += rowHeight;
// Ürünler (iconlu)
if (typeof productTypes !== "undefined" && productTypes && typeof productTypes.length === "number") {
var productRowCount = Math.ceil(productTypes.length / colCount);
for (var p = 0; p < productTypes.length; p++) {
var count = shop.productBuffer && shop.productBuffer[p] ? shop.productBuffer[p] : 0;
var col = p % colCount;
var row = Math.floor(p / colCount);
var xPos = leftX + col * colSpacing + iconSize / 2;
var yPos = y + row * rowHeight;
var icon = LK.getAsset(productTypes[p].icon, {
anchorX: 0.5,
anchorY: 0.5,
x: xPos,
y: yPos,
scaleX: 0.4,
scaleY: 0.4
});
shopStockPanelContent.addChild(icon);
var label = new Text2(productTypes[p].name + ": " + count, {
size: 28,
fill: "#000"
});
label.anchor.set(0, 0.5);
label.x = xPos + textOffset;
label.y = yPos;
shopStockPanelContent.addChild(label);
}
y += productRowCount * rowHeight;
}
}
// Paneli aç/kapat fonksiyonu
var currentShopForPanel = null;
function toggleShopStockPanel(shop) {
var newVisible = !shopStockPanelBg.visible;
if (typeof shop !== "undefined") {
currentShopForPanel = shop;
}
shopStockPanelBg.visible = newVisible;
shopStockPanelTitle.visible = newVisible;
shopStockPanelContent.visible = newVisible;
shopStockCloseIcon.visible = newVisible;
shopStockCloseHitArea.visible = newVisible;
if (newVisible && currentShopForPanel) {
// Paneli ortala
shopStockPanelBg.x = 1024;
shopStockPanelBg.y = 600;
shopStockPanelTitle.x = shopStockPanelBg.x;
shopStockPanelTitle.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 60;
shopStockPanelContent.x = shopStockPanelBg.x;
shopStockPanelContent.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 120;
shopStockCloseIcon.x = shopStockPanelBg.x + shopStockPanelBg.width / 2 - 60;
shopStockCloseIcon.y = shopStockPanelBg.y - shopStockPanelBg.height / 2 + 60;
shopStockCloseHitArea.x = shopStockCloseIcon.x;
shopStockCloseHitArea.y = shopStockCloseIcon.y;
updateShopStockPanelContent(currentShopForPanel);
}
}
// Kapatma ikonuna tıklama
shopStockCloseHitArea.down = function () {
toggleShopStockPanel();
};
shopStockCloseIcon.down = function () {
toggleShopStockPanel();
};
// --- Mağaza tıklama: Her mağaza için down event ekle ---
for (var i = 0; i < shopList.length; i++) {
(function (shop) {
shop.down = function () {
toggleShopStockPanel(shop);
};
})(shopList[i]);
}
// Yeni mağaza açıldığında da down event ekle
var _oldSpawnShop = spawnShop;
spawnShop = function spawnShop() {
var shop = new Shop();
shop.x = 1024;
shop.y = 350;
shopList.push(shop);
game.addChild(shop);
shop.down = function () {
toggleShopStockPanel(shop);
};
return shop;
};
// 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);
// %10 sağa kaydır: panel genişliğinin %10'u kadar ekle
speedInfoTxt.x = panelLeft + levelPanelBg.width * 0.10;
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);
// %10 sağa kaydır: panel genişliğinin %10'u kadar ekle
labelTxt.x = panelLeft + levelPanelBg.width * 0.10;
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);
// %10 sağa kaydır: panel genişliğinin %10'u kadar ekle
valueTxt.x = panelLeft + 180 + levelPanelBg.width * 0.10;
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;
};
// Çalışanlar paneli 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;
// Çalışanlar iconlarını panel kapanınca gizle
workerMinerIcon.visible = workersPanelTitle.visible;
workerCarrierIcon.visible = workersPanelTitle.visible;
workerResearcherIcon.visible = workersPanelTitle.visible;
workerOduncuIcon.visible = workersPanelTitle.visible;
workerToplayiciIcon.visible = workersPanelTitle.visible;
// --- 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);
}
};
// --- KERVANI GÖNDER BUTONU ---
// 'Fabrika Aç' butonunun hemen altına ekle
var kervaniGonderBtn = new Text2('Kervanı Gönder', {
size: 32,
fill: "#fff",
fontWeight: "bold"
});
kervaniGonderBtn.anchor.set(0.5, 0.5);
kervaniGonderBtn.x = 0;
kervaniGonderBtn.y = 60; // Fabrika Aç butonunun altına
// Butonun işlevi: kervan varsa hemen gönder, yoksa bir şey yapma
kervaniGonderBtn.down = function () {
// Her durumda kervanı gönder
if (caravan) {
if (caravanPanelOpen) {
toggleCaravanPanel(false);
showMainPageElements(true);
}
caravan.destroy();
caravan = null;
}
caravanActive = false;
caravanArrived = false;
caravanPanelOpen = false;
caravanTradeMade = false;
caravanTimeout = null;
caravanNextArrivalTick = LK.ticks + 2 * 60 * 60;
caravanLeaveTick = 0;
};
fabrikaAcContainer.addChild(kervaniGonderBtn);
// 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);
;
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