User prompt
Bütün panellerin yazıları ve işlevlerini hizalı olacak şekilde panel arka planlarının boyutunu otomatik ayarlayarak sıfırdan oluştur.
User prompt
Bütün panellerin yazı fontu 36 olacak şekilde panel arka plan resmini yeniden boyutlandır.
User prompt
Bütün paneller sağ üstte açılsın.
User prompt
Bütün panellerin arkaplan resim boyutunu sıfırla.
User prompt
Şuan var olan araştırma kampı'nın panel arkaplanının dosyasını oluştur.
User prompt
Bütün paneller sağ kenarda açılsın
User prompt
Kampımız paneli sağ kenarda açılsın
User prompt
Karargah paneli sağ kenarda açılsın
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'addChild')' in or related to this line: 'self.parent.addChild(self);' Line Number: 269
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'addChild')' in or related to this line: 'self.parent.addChild(self);' Line Number: 269
User prompt
Paneller açıldığında en ön planda açılsın. Panel ekranı hariç başka birşey panelin önüne geçmesin.
User prompt
Bütün paneller açıldığında panelin arkasında kalan unsurları tamamen gizle.
User prompt
Bütün paneller açıldığında panel arka planını tamamen gizle.
User prompt
Business paneli içeriğinin tamamını 1 satır sola kaydır.
User prompt
Business paneli içeriğini panele sığacak şekilde ortala font aynı kalsın
User prompt
Business paneli sağ üstte açılsın
User prompt
Karargah resmine Karargah ismi ekle.
User prompt
Canavarın kalan gücü resminin üzerinde bar şeklinde görüntülensin.
User prompt
Canavar saldırısına göre toplu gönderilen askerlerde birkaç asker ölsün. Canavarların saldırı gücü %100 oranında artırılsın.
User prompt
Yeni canavar spawn süresini 5 dakikaya düşür.
User prompt
Savaşı kazanmak %50 oranında zorlaşsın.
User prompt
Yeni canavar kalan spawn süresi karargah notunun üzerinde görüntülensin. Bu panel kapanınca gizlensin.
User prompt
Karargah panelinin altına eklenen not, karargah paneli kapatılınca gizle.
User prompt
Asker fiyatları Yaya 200, Okçu 400, Mızrakçı 600, Zırhlı 800, Atlı 1000 olarak yeniden ayarla.
User prompt
Karargah panelinin en altına ''Not: Savaşı kaybederseniz askerler ölür.'' yazısı ekle.
/**** * 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('levelPanelBg', { anchorX: 1.0, anchorY: 0.5, x: 2048 - 40, y: 400, scaleX: 8.0, scaleY: 6.0 }); 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; } }; // 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; 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; }); // 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++) { 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++) { for (var p = 0; p < 10; p++) { if (factoryList[f].productBuffer[p] > 0) { self.goToFactory(factoryList[f]); found = true; break; } } if (found) break; } } }; return self; }); // Add level to City var City = Container.expand(function () { var self = Container.call(this); // Add city color image var citySprite = self.attachAsset('city', { anchorX: 0.5, anchorY: 0.5 }); self.level = 1; // City level self.x = 150; // Move city to upper left side, but not in the 0-100px menu area self.y = 150; // Top left, but not in the 0-100px menu area self.customerSpawnCooldown = 0; self.customerSpawnInterval = 180; // 3 seconds at 60fps self.update = function () { self.customerSpawnCooldown--; if (self.customerSpawnCooldown <= 0) { // Only spawn customer if shop has at least 1 product var canSpawn = false; if (shopList.length > 0) { // Mağazada herhangi bir ürün çeşidi var mı? for (var p = 0; p < 10; p++) { if (shopList[0].productBuffer[p] > 0) { canSpawn = true; break; } } } self.customerSpawnCooldown = Math.max(30, self.customerSpawnInterval - (self.level - 1) * 30) + Math.floor(Math.random() * 120); if (canSpawn) { spawnCustomer(); } } }; return self; }); // Customer: Walks from city to shop, buys product if available, then leaves var Customer = Container.expand(function () { var self = Container.call(this); // Pick a random customer image for this customer var customerImages = ['customer1', 'customer2', 'customer3', 'customer4', 'customer5']; var customerImgId = customerImages[Math.floor(Math.random() * customerImages.length)]; var customerSprite = self.attachAsset(customerImgId, { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5 + Math.random() * 2; self.state = 'toShop'; // 'toShop', 'leaving' self.targetShop = null; self.hasBought = false; // Each customer wants a random product type self.wantProductType = Math.floor(Math.random() * 10); self.moveTowards = function (tx, ty) { var dx = tx - self.x; var dy = ty - self.y; var dist = Math.sqrt(dx * dx + dy * dy); var moveSpeed = self.speed * getMoveMultiplier(1); // Customers have no level, always use 1 if (dist < moveSpeed) { self.x = tx; self.y = ty; return true; } self.x += dx / dist * moveSpeed; self.y += dy / dist * moveSpeed; return false; }; self.update = function () { if (self.state === 'toShop' && self.targetShop) { if (self.moveTowards(self.targetShop.x, self.targetShop.y)) { // Arrived at shop if (!self.hasBought) { if (self.targetShop.productBuffer[self.wantProductType] > 0) { // İstediği ürün varsa onu al self.targetShop.productBuffer[self.wantProductType]--; var basePrice = productTypes[self.wantProductType].price; var bonus = 0; if (typeof businessPanel !== "undefined" && businessPanel.businesses) { for (var b = 0; b < businessPanel.businesses.length; b++) { var biz = businessPanel.businesses[b]; if (biz.owned && biz.level > 0) { var def = businessPanel.rows[b] && businessPanel.rows[b].descTxt ? null : null; // just to avoid unused warning var def2 = businessPanel.businesses[b]; var defObj = businessPanel.rows && businessPanel.rows[b] ? null : null; var defn = businessPanel.businesses[b]; var defB = businessPanel.businesses[b]; var defD = businessPanel.businesses[b]; var defE = businessPanel.businesses[b]; var defF = businessPanel.businesses[b]; var defG = businessPanel.businesses[b]; var defH = businessPanel.businesses[b]; var defI = businessPanel.businesses[b]; // Use businessDefs from class definition var bdef = businessPanel.rows && businessPanel.rows.length === businessPanel.businesses.length ? null : null; // Use static businessDefs var defs = [{ baseBonus: 0.03, levelBonus: 0.02 }, { baseBonus: 0.05, levelBonus: 0.02 }, { baseBonus: 0.10, levelBonus: 0.02 }, { baseBonus: 0.15, levelBonus: 0.02 }, { baseBonus: 0.20, levelBonus: 0.02 }]; var def = defs[b]; bonus += def.baseBonus + def.levelBonus * (biz.level - 1); } } } money += Math.round(basePrice * (1 + bonus)); updateMoneyText(); self.hasBought = true; self.state = 'leaving'; self.leaveTarget = { x: self.x, y: -100 }; // leave upwards } else { // İstediği ürün yoksa, başka bir ürün var mı bak var foundOther = false; for (var p = 0; p < 10; p++) { if (self.targetShop.productBuffer[p] > 0) { self.targetShop.productBuffer[p]--; var basePrice = productTypes[p].price; var bonus = 0; if (typeof businessPanel !== "undefined" && businessPanel.businesses) { for (var b = 0; b < businessPanel.businesses.length; b++) { var biz = businessPanel.businesses[b]; if (biz.owned && biz.level > 0) { var defs = [{ baseBonus: 0.03, levelBonus: 0.02 }, { baseBonus: 0.05, levelBonus: 0.02 }, { baseBonus: 0.10, levelBonus: 0.02 }, { baseBonus: 0.15, levelBonus: 0.02 }, { baseBonus: 0.20, levelBonus: 0.02 }]; var def = defs[b]; bonus += def.baseBonus + def.levelBonus * (biz.level - 1); } } } money += Math.round(basePrice * (1 + bonus)); updateMoneyText(); self.hasBought = true; self.state = 'leaving'; self.leaveTarget = { x: self.x, y: -100 }; foundOther = true; break; } } // Eğer hiç ürün yoksa beklemeye devam et } } } } else if (self.state === 'leaving') { if (self.moveTowards(self.leaveTarget.x, self.leaveTarget.y)) { // Remove from game for (var i = 0; i < customerList.length; i++) { if (customerList[i] === self) { customerList.splice(i, 1); break; } } self.destroy(); } } }; return self; }); // --- ENEMY CLASS --- var Enemy = Container.expand(function () { var self = Container.call(this); self.enemyType = 1; self.attack = 10; self.defense = 10; self.maxHP = 50; self.hp = 50; self.reward = 100; self.sprite = null; self.lastWasIntersecting = false; self.x = 0; self.y = 0; self.setType = function (type, powerScale) { self.enemyType = type; var assetId = 'enemy' + type; if (self.sprite) self.sprite.destroy(); self.sprite = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); // --- Add health bar above enemy sprite --- if (self.hpBar) { self.hpBar.destroy(); self.hpBar = null; } self.hpBarBg = new Container(); self.hpBar = new Container(); // Bar background (gray) var barBg = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: self.sprite.width * 0.9, height: 18, color: 0x444444, shape: 'box' }); self.hpBarBg.addChild(barBg); // Bar foreground (green, will be scaled) self.hpBar.bar = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: self.sprite.width * 0.88, height: 12, color: 0x4caf50, shape: 'box' }); self.hpBar.addChild(self.hpBar.bar); // Position bar above the sprite self.hpBarBg.x = 0; self.hpBarBg.y = -self.sprite.height / 2 - 18; self.hpBar.x = 0; self.hpBar.y = -self.sprite.height / 2 - 18; self.addChild(self.hpBarBg); self.addChild(self.hpBar); // Randomize stats based on powerScale (0.5 to 2.0) // Canavarların gücü %100 artsın: attack ve defense 2x self.attack = Math.round((10 + type * 2 * powerScale) * 2); self.defense = Math.round((10 + type * 2 * powerScale) * 2); self.maxHP = Math.round(50 + type * 10 * powerScale); self.hp = self.maxHP; self.reward = Math.round(100 + (type - 1) * 100 * powerScale); // Not: Saldırı ve savunma zaten 2x olarak ayarlandı }; // 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 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 // 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 ore (was 60, now 2x slower) self.processCounter = 0; self.update = function () { if (self.oreBuffer > 0) { self.processCounter++; if (self.processCounter >= Math.max(10, self.processTime - (self.level - 1) * 10)) { self.oreBuffer--; // Pick a random product type to produce var prodType = Math.floor(Math.random() * 10); self.productBuffer[prodType]++; self.processCounter = 0; } } else { self.processCounter = 0; } }; return self; }); // Mine: Contains ore, can be depleted var Mine = Container.expand(function () { var self = Container.call(this); // Pick a random ore image for this mine var oreImages = ['ore1', 'ore2', 'ore3', 'ore4', 'ore5', 'ore6', 'ore7', 'ore8', 'ore9', 'ore10']; var oreImgId = oreImages[Math.floor(Math.random() * oreImages.length)]; var mineSprite = self.attachAsset(oreImgId, { anchorX: 0.5, anchorY: 0.5 }); self.ore = 10; // initial 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 = 'ore'; if (self.pickaxeIcon) { self.pickaxeIcon.destroy(); self.pickaxeIcon = null; } self.goToFactory(factoryList[0]); } 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 { self.setIdle(); } } } else if (self.state === 'idle') { // Find nearest mine with ore var bestMine = null; var bestDist = Infinity; for (var i = 0; i < mineList.length; i++) { var m = mineList[i]; if (m.ore > 0) { 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); } } }; return self; }); // Researcher: When a mine is depleted, finds a new mine location and spawns it var Researcher = Container.expand(function () { var self = Container.call(this); // Visual for researcher var researcherSprite = self.attachAsset('miner', { anchorX: 0.5, anchorY: 0.5 }); researcherSprite.tint = 0x1a8ffc; // blue tint for distinction self.speed = 5; self.state = 'idle'; // 'idle', 'moving', 'researching' self.target = null; self.researchTicks = 0; self.researchDuration = 90; // 1.5 seconds self.moveTowards = function (tx, ty) { var dx = tx - self.x; var dy = ty - self.y; var dist = Math.sqrt(dx * dx + dy * dy); var moveSpeed = self.speed * getMoveMultiplier(1); // Researchers have no level, always use 1 if (dist < moveSpeed) { self.x = tx; self.y = ty; return true; } self.x += dx / dist * moveSpeed; self.y += dy / dist * moveSpeed; return false; }; self.startResearch = function (tx, ty) { self.state = 'moving'; self.target = { x: tx, y: ty }; self.researchTicks = 0; }; self.update = function () { if (self.state === 'moving' && self.target) { if (self.moveTowards(self.target.x, self.target.y)) { // If we just finished research, set to idle after returning to start if (self.researchTicks >= self.researchDuration) { self.state = 'idle'; self.target = null; self.researchTicks = 0; } else { self.state = 'researching'; self.researchTicks = 0; } } } else if (self.state === 'researching') { self.researchTicks++; if (self.researchTicks >= self.researchDuration) { // Spawn new mine at this location var mine = new Mine(); mine.x = self.x; mine.y = self.y; mineList.push(mine); game.addChild(mine); // After finding ore, move researcher to starting position and wait there self.state = 'moving'; self.target = { x: 1024, // worker start image x y: 2400 // worker start image y }; } } }; 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 if (type === 'yaya') { self.attack = 10; self.defense = 8; self.speed = 3; } else if (type === 'okcu') { self.attack = 12; self.defense = 6; self.speed = 3.5; } else if (type === 'mizrakci') { self.attack = 14; self.defense = 10; self.speed = 3; } else if (type === 'zirhli') { self.attack = 18; self.defense = 18; self.speed = 2.2; } else if (type === 'atli') { self.attack = 20; self.defense = 12; 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; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Global lists for soldiers and enemy // Enemy assets (10 types) // Soldier assets // Add a background image to the game var soldierList = []; var currentEnemy = null; var lastEnemyDefeatedTime = 0; var enemyCooldown = 600; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var baseMoveMultiplier = 0.5; // Everyone moves 50% slower by default function getMoveMultiplier(level) { // Each level increases speed by 2% (so multiplier increases) // Level 1: 0.5, Level 2: 0.5*1.02, Level 3: 0.5*1.04, etc. return baseMoveMultiplier * (1 + 0.02 * (level - 1)); } var backgroundImg = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 1, scaleY: 1 }); backgroundImg.alpha = 1; game.addChildAt(backgroundImg, 0); // Add as the bottom-most layer // --- KARARGAH IMAGE & PANEL --- // Karargah image (sola, Kampımız'ın soluna) var karargahImg = LK.getAsset('city', { anchorX: 0.5, anchorY: 0.5, x: 1024 - 430, // Kampımız'ın x'i 1024, 430px sola y: 2400 }); game.addChild(karargahImg); // Karargah label 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; // 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: 1.0, anchorY: 0.5, x: 2048 - 40, // Sağ kenarda açılması için x: 2048 - 40 (ekranın sağ kenarında) y: 400, scaleX: 10.0, scaleY: 8.0 }); 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 - karargahPanelBg.width / 2; karargahPanelNoteTxt.y = karargahPanelBg.y + karargahPanelBg.height / 2 - 18; karargahPanelNoteTxt.visible = false; game.addChild(karargahPanelNoteTxt); // --- 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 - karargahPanelBg.width / 2; karargahPanelEnemyTimerTxt.y = karargahPanelNoteTxt.y - 32; // Notun hemen üstünde karargahPanelEnemyTimerTxt.visible = false; game.addChild(karargahPanelEnemyTimerTxt); // Karargah paneli başlık var karargahPanelTitle = new Text2('Karargah', { size: 38, fill: "#000", fontWeight: "bold" }); karargahPanelTitle.anchor.set(0.5, 0.5); karargahPanelTitle.x = karargahPanelBg.x - karargahPanelBg.width / 2; karargahPanelTitle.y = karargahPanelBg.y - karargahPanelBg.height / 2 + 60; karargahPanelTitle.visible = false; game.addChild(karargahPanelTitle); // 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 + 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 - 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); // 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 - 40; buyBtn.y = y; buyBtn.visible = false; (function (idx) { buyBtn.down = function () { if (money >= soldierTypes[idx].cost) { money -= soldierTypes[idx].cost; 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 }); } // Paneli güncelleyen fonksiyon function updateKarargahPanelRows() { 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; } // --- 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; 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; } // Hide/show 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; } if (newVisible) updateKarargahPanelRows(); }; // City colored image asset (example: blue city icon) // Global game state var minerList = []; var mineList = []; var factoryList = []; var shopList = []; var carrierList = []; var researcherList = []; var customerList = []; var money = 50; var city = null; function spawnCustomer() { if (shopList.length === 0) return; var customer = new Customer(); customer.x = city.x; customer.y = city.y + 40; customer.targetShop = shopList[0]; customerList.push(customer); game.addChild(customer); } function 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 spawnCarrier() { var carrier = new Carrier(); // Place at random near bottom carrier.x = 600 + Math.random() * 800; carrier.y = 2300 + Math.random() * 200; carrierList.push(carrier); game.addChild(carrier); } // UI var moneyText = new Text2('₺' + money, { size: 36, fill: 0xFFE066 }); moneyText.anchor.set(0.5, 0); LK.gui.top.addChild(moneyText); function updateMoneyText() { moneyText.setText('₺' + money); } // Add buttons for buying miners and mines // Satın alma butonları ve yazıları gizlendi (Madenci Al, Maden Aç, Fabrika Kur, Taşıyıcı Al) // (Butonlar ve ilgili eventler kaldırıldı) // Spawning functions function spawnMiner() { var miner = new Miner(); // Place at random near bottom miner.x = 400 + Math.random() * 1200; miner.y = 2300 + Math.random() * 200; minerList.push(miner); game.addChild(miner); } function spawnMine() { var mine = new Mine(); // Place at random in upper half mine.x = 300 + Math.random() * 1400; mine.y = 600 + Math.random() * 600; mineList.push(mine); game.addChild(mine); } function spawnFactory() { var factory = new Factory(); // Place at center factory.x = 1024; factory.y = 1600; factoryList.push(factory); game.addChild(factory); } function spawnShop() { var shop = new Shop(); shop.x = 1024; shop.y = 350; shopList.push(shop); game.addChild(shop); } // Initial setup // Add worker start position image at bottom center var workerStartImg = LK.getAsset('workerStart', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 2400 }); game.addChild(workerStartImg); // Başlangıç yerindeki resme tıklanınca business paneli aç/kapat workerStartImg.down = function () { businessPanel.toggle(); }; // Add 'Kampımız' label below the starting area image var kampimizLabel = new Text2('Kampımız', { size: 36, fill: "#fff" }); kampimizLabel.anchor.set(0.5, 0); kampimizLabel.x = workerStartImg.x; kampimizLabel.y = workerStartImg.y + workerStartImg.height / 2 + 10; game.addChild(kampimizLabel); // Kampımız labelına tıklanınca işletmeler panelini aç/kapat kampimizLabel.down = function () { businessPanel.toggle(); }; // --- BUSINESS PANEL INSTANCE --- var businessPanel = new BusinessPanel(); game.addChild(businessPanel); // Add Araştırma Kampı image (was restAreaImg) var researchCampImg = LK.getAsset('restAreaSide', { anchorX: 0.5, anchorY: 0.5, x: 1024 + 430, y: 2400 }); game.addChild(researchCampImg); // Add a new image to the right of the research camp var researchCampRightImg = LK.getAsset('workerPanel', { anchorX: 0.0, anchorY: 0.5, x: researchCampImg.x + 180, // 180px right of center of research camp y: researchCampImg.y }); game.addChild(researchCampRightImg); // Add a new depoWorker image above the workerPanel image var workerPanelTopImg = LK.getAsset('depoWorker', { anchorX: 0.5, anchorY: 1.0, x: researchCampRightImg.x + researchCampRightImg.width / 2, y: researchCampRightImg.y - researchCampRightImg.height / 2 - 10 }); game.addChild(workerPanelTopImg); // Add 'Depo' label above the workerPanelTopImg image var depoLabel = new Text2('Depo', { size: 36, fill: "#fff" }); depoLabel.anchor.set(0.5, 1); depoLabel.x = workerPanelTopImg.x; depoLabel.y = workerPanelTopImg.y - workerPanelTopImg.height / 2 - 10; game.addChild(depoLabel); // --- DEPO PANEL --- // Panel arka planı (Depo paneli) var depoPanelBg = LK.getAsset('depoPanelBg', { anchorX: 1.0, anchorY: 0.5, x: 2048 - 40, // sağ kenarda açılması için x: 2048 - 40 (ekranın sağ kenarında) y: 400, // ekranın ortası (2048x2732 için) scaleX: 7.0, scaleY: 5.0 }); depoPanelBg.alpha = 0.97; depoPanelBg.visible = false; game.addChild(depoPanelBg); // Depo görseli (artık shop yerine depo resmi kullanılıyor) var depoImage = LK.getAsset('depo', { anchorX: 0.5, anchorY: 1.0, x: depoPanelBg.x - depoPanelBg.width / 2, y: depoPanelBg.y - depoPanelBg.height / 2 - 10, // panelin üstüne hizala scaleX: 0.8, scaleY: 0.8 }); depoImage.visible = false; game.addChild(depoImage); // Panel başlığı var depoPanelTitle = new Text2('Depo', { size: 38, fill: "#000", fontWeight: "bold" }); depoPanelTitle.anchor.set(0.5, 0.5); depoPanelTitle.x = depoPanelBg.x - depoPanelBg.width / 2; depoPanelTitle.y = depoPanelBg.y - depoPanelBg.height / 2 + 60; depoPanelTitle.visible = false; game.addChild(depoPanelTitle); // Panel içeriği (örnek: fabrika ve mağaza ürünleri) var depoPanelContent = new Text2('', { size: 36, fill: "#000" }); depoPanelContent.anchor.set(0.5, 0); depoPanelContent.x = depoPanelBg.x - depoPanelBg.width / 2; depoPanelContent.y = depoPanelBg.y - depoPanelBg.height / 2 + 120; depoPanelContent.visible = false; game.addChild(depoPanelContent); // Depo panelini güncelleyen fonksiyon function updateDepoPanelContent() { // Fabrika ve mağaza ürünlerini 4 satırlık bloklar halinde alt alta göster var lines = []; for (var i = 0; i < factoryList.length; i++) { var factory = factoryList[i]; var prodCounts = []; for (var p = 0; p < productTypes.length; p++) { var count = factory.productBuffer[p] || 0; prodCounts.push(productTypes[p].name + ": " + count); } // 4 satırlık bloklar halinde alt alta yaz lines.push("Fabrika #" + (i + 1) + ":"); for (var row = 0; row < 4; row++) { var start = row * 3; var end = start + 3; if (start < prodCounts.length) { lines.push(" " + prodCounts.slice(start, end).join(" ")); } } } for (var i = 0; i < shopList.length; i++) { var shop = shopList[i]; var prodCounts = []; for (var p = 0; p < productTypes.length; p++) { var count = shop.productBuffer[p] || 0; prodCounts.push(productTypes[p].name + ": " + count); } lines.push("Mağaza #" + (i + 1) + ":"); for (var row = 0; row < 4; row++) { var start = row * 3; var end = start + 3; if (start < prodCounts.length) { lines.push(" " + prodCounts.slice(start, end).join(" ")); } } } depoPanelContent.setText(lines.join("\n")); } // Depo resmine tıklanınca paneli aç/kapat workerPanelTopImg.down = function () { var newVisible = !depoPanelBg.visible; depoPanelBg.visible = newVisible; depoPanelTitle.visible = newVisible; depoPanelContent.visible = newVisible; depoImage.visible = newVisible; if (newVisible) updateDepoPanelContent(); }; // Add 'Çalışanlar' label below the workerPanel image var workerPanelLabel = new Text2('Çalışanlar', { size: 36, fill: "#fff" }); workerPanelLabel.anchor.set(0.5, 0); workerPanelLabel.x = researchCampRightImg.x + researchCampRightImg.width / 2; workerPanelLabel.y = researchCampRightImg.y + researchCampRightImg.height / 2 + 10; game.addChild(workerPanelLabel); // --- ÇALIŞANLAR PANELİ --- // ÇALIŞANLAR PANELİ arka planı (sağ kenarda açılır) var workersPanelBg = LK.getAsset('levelPanelBg', { anchorX: 1.0, anchorY: 0.5, x: 2048 - 40, // sağ kenarda açılması için x: 2048 - 40 (ekranın sağ kenarında) y: 400, // Ekranın ortası (2048x2732 için) scaleX: 6.0, scaleY: 4.0 }); 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 - workersPanelBg.width / 2; 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 + 60; var workerPanelRight = workersPanelBg.x - 60; var workerPanelRowY0 = workersPanelBg.y - 30; var workerPanelRowDY = 90; var workerCountMinerText = new Text2('', { size: workerPanelFontSize, fill: "#000" }); workerCountMinerText.anchor.set(0, 0.5); workerCountMinerText.x = workerPanelLeft; workerCountMinerText.y = workerPanelRowY0; game.addChild(workerCountMinerText); var workerCountCarrierText = new Text2('', { size: workerPanelFontSize, fill: "#000" }); workerCountCarrierText.anchor.set(0, 0.5); workerCountCarrierText.x = workerPanelLeft; workerCountCarrierText.y = workerPanelRowY0 + workerPanelRowDY; game.addChild(workerCountCarrierText); var workerCountResearcherText = new Text2('', { size: workerPanelFontSize, fill: "#000" }); workerCountResearcherText.anchor.set(0, 0.5); workerCountResearcherText.x = workerPanelLeft; workerCountResearcherText.y = workerPanelRowY0 + 2 * workerPanelRowDY; game.addChild(workerCountResearcherText); // 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); buyWorkerMinerBtn.down = function () { if (money >= 100) { money -= 100; updateMoneyText(); spawnMiner(); updateWorkerCounts(); } }; var buyWorkerCarrierBtn = new Text2('Taşıyıcı Al (₺150)', { 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 >= 150) { money -= 150; updateMoneyText(); spawnCarrier(); updateWorkerCounts(); } }; var buyWorkerResearcherBtn = new Text2('Araştırmacı Al (₺200)', { 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 >= 200) { money -= 200; updateMoneyText(); spawnResearcher(); 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; workerCountMinerText.visible = false; workerCountCarrierText.visible = false; workerCountResearcherText.visible = false; // 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; workerCountMinerText.visible = newVisible; workerCountCarrierText.visible = newVisible; workerCountResearcherText.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); } // 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: 1.0, anchorY: 0.5, x: 2048 - 40, // sağ kenarda açılması için x: 2048 - 40 (ekranın sağ kenarında) y: 400, // ekranın ortası (2048x2732 için) scaleX: 5.0, scaleY: 3.0 }); 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.5, 0.5); researchCampPanelText.x = researchCampPanelBg.x - researchCampPanelBg.width / 2; researchCampPanelText.y = researchCampPanelBg.y - researchCampPanelBg.height / 2 + 80; researchCampPanelText.visible = false; game.addChild(researchCampPanelText); // Show/hide panel on image press researchCampImg.down = function () { researchCampPanelBg.visible = !researchCampPanelBg.visible; researchCampPanelText.visible = researchCampPanelBg.visible; }; spawnMine(); spawnMine(); spawnFactory(); spawnShop(); spawnMiner(); spawnCarrier(); spawnResearcher(); 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 () { // --- Yeni: Karargah paneli açıkken kalan canavar spawn süresini güncelle --- if (typeof karargahPanelEnemyTimerTxt !== "undefined" && karargahPanelEnemyTimerTxt.visible) { // Eğer bir canavar yoksa ve cooldown devam ediyorsa kalan süreyi göster if (!currentEnemy && lastEnemyDefeatedTime > 0 && LK.ticks - lastEnemyDefeatedTime < 18000) { var ticksLeft = 18000 - (LK.ticks - lastEnemyDefeatedTime); var secondsLeft = Math.ceil(ticksLeft / 60); var min = Math.floor(secondsLeft / 60); var sec = secondsLeft % 60; var timeStr = min + "dk " + (sec < 10 ? "0" : "") + sec + "sn"; karargahPanelEnemyTimerTxt.setText("Yeni canavar için kalan süre: " + timeStr); } else { karargahPanelEnemyTimerTxt.setText(""); } } 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(); } // Remove depleted mines and assign researcher to find new mine for (var i = mineList.length - 1; i >= 0; i--) { if (mineList[i].ore <= 0) { // Find an idle researcher var assigned = false; 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; } } mineList[i].destroy(); mineList.splice(i, 1); } } // --- ENEMY & SOLDIER SYSTEM --- // Enemy spawn logic if (!currentEnemy) { // 5 dakika bekleme (5*60*60 = 18000 tick, 60fps) if (lastEnemyDefeatedTime > 0 && LK.ticks - lastEnemyDefeatedTime < 18000) { // Waiting for cooldown } else { // Spawn new enemy at random location var enemyType = 1 + Math.floor(Math.random() * 10); // Calculate total soldier power var totalAttack = 0, totalDefense = 0; for (var i = 0; i < soldierList.length; i++) { totalAttack += soldierList[i].attack; totalDefense += soldierList[i].defense; } var avgPower = (totalAttack + totalDefense) / Math.max(1, soldierList.length * 2); // Power scale: sometimes strong, sometimes weak var powerScale = 0.7 + Math.random() * 1.3; // 0.7-2.0 if (Math.random() < 0.5) powerScale = Math.max(0.5, avgPower / 20 * (0.7 + Math.random() * 0.6)); var enemy = new Enemy(); enemy.setType(enemyType, powerScale); // Spawn at random place in upper half enemy.x = 400 + Math.random() * 1200; enemy.y = 600 + Math.random() * 600; game.addChild(enemy); currentEnemy = enemy; // Askerleri savaşa gönder for (var i = 0; i < soldierList.length; i++) { if (soldierList[i].state === 'idle') { soldierList[i].targetEnemy = enemy; soldierList[i].goTo(enemy.x + Math.random() * 40 - 20, enemy.y + Math.random() * 40 - 20); } } } } // Update all soldiers for (var i = 0; i < soldierList.length; i++) { soldierList[i].update(); } // Enemy and soldier fight logic if (currentEnemy) { // Soldiers attack if close enough var anyFighting = false; for (var i = 0; i < soldierList.length; i++) { var s = soldierList[i]; if (s.state === 'moving' && s.targetEnemy === currentEnemy) { // Check if close enough to fight var dx = s.x - currentEnemy.x; var dy = s.y - currentEnemy.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 60) { s.state = 'fighting'; } } if (s.state === 'fighting' && s.targetEnemy === currentEnemy) { anyFighting = true; // --- Savaş süresi %100 uzasın: Saldırıları yarı hızda uygula --- if (!s.fightTick) s.fightTick = 0; s.fightTick++; if (s.fightTick % 2 === 0) { // Sadece 2 tickte bir saldırı uygula (savaş süresi 2 katı) // Soldier attacks enemy var damage = Math.max(1, s.attack - currentEnemy.defense / 4 + Math.random() * 2); currentEnemy.hp -= damage; // Enemy attacks back (canavar saldırı gücü %100 artırıldı, yani 2x) var enemyDmg = Math.max(0, currentEnemy.attack * 2 - s.defense / 3 + Math.random() * 2); // Asker ölme şansı: toplu saldırıda birkaç asker ölsün if (Math.random() < 0.25) { // %25 ihtimalle asker ölür // Sadece savaşan askeri öldür s.destroy(); soldierList.splice(i, 1); i--; // Listeyi güncelledik, indexi azalt continue; } } // If enemy dead if (currentEnemy.hp <= 0) { // Reward var reward = Math.max(100, Math.min(1000, currentEnemy.reward)); money += reward; updateMoneyText(); // Remove enemy currentEnemy.destroy(); currentEnemy = null; lastEnemyDefeatedTime = LK.ticks; // Soldiers return to HQ for (var j = 0; j < soldierList.length; j++) { if (soldierList[j].state === 'fighting') { soldierList[j].targetEnemy = null; soldierList[j].returnToHQ(); } } break; } // --- Savaş kaybedilince askerler ölsün --- // If all soldiers are defeated (enemy still alive, but no fighting soldiers left) if (currentEnemy && // enemy exists !anyFighting && // no soldiers fighting soldierList.some(function (s) { return s.state === 'moving' || s.state === 'fighting'; }) // there were soldiers sent ) { // Remove all soldiers who were fighting or moving to fight this enemy for (var j = soldierList.length - 1; j >= 0; j--) { var s = soldierList[j]; if ((s.state === 'moving' || s.state === 'fighting') && s.targetEnemy === currentEnemy) { s.destroy(); soldierList.splice(j, 1); } } } } } // If no soldiers left fighting, enemy just waits if (!anyFighting && currentEnemy) { // If all soldiers dead or retreated, enemy could disappear after a while (not implemented) } } // Soldiers at HQ wait for next enemy for (var i = 0; i < soldierList.length; i++) { if (soldierList[i].state === 'idle' && !soldierList[i].targetEnemy) { // Place at HQ // Optionally, could move them to a waiting area } } }; // --- PRODUCT TYPES --- var productTypes = [{ name: "Ürün 1", price: 10 }, { name: "Ürün 2", price: 12 }, { name: "Ürün 3", price: 14 }, { name: "Ürün 4", price: 16 }, { name: "Ürün 5", price: 18 }, { name: "Ürün 6", price: 20 }, { name: "Ürün 7", price: 22 }, { name: "Ürün 8", price: 24 }, { name: "Ürün 9", price: 26 }, { name: "Ürün 10", price: 28 }]; // Show product/ore/factory status as text overlays var statusTexts = []; function updateStatusTexts() { // Remove old for (var i = 0; i < statusTexts.length; i++) { statusTexts[i].destroy(); } statusTexts = []; // Mines for (var i = 0; i < mineList.length; i++) { var t = new Text2('Cevher: ' + mineList[i].ore, { size: 36, fill: "#fff" }); t.anchor.set(0.5, 1); t.x = mineList[i].x; t.y = mineList[i].y - 80; game.addChild(t); statusTexts.push(t); } // Factories // (Ürün ve cevher yazıları gizlendi) // Shops // (Mağaza ürün yazıları gizlendi) } var statusTimer = LK.setInterval(updateStatusTexts, 400); // Prevent UI overlap with top left menu // (All UI is placed away from top left 100x100 px) // (Satın alma butonları kaldırıldığı için bu satırlar kaldırıldı) // --- LEVEL PANEL (BOTTOM LEFT) --- // --- LEVEL PANEL (BOTTOM LEFT) --- // Move level panel content into Araştırma Kampı panel var levelPanelBg = LK.getAsset('levelPanelBg', { anchorX: 1.0, anchorY: 0.5, x: 2048 - 40, // sağ kenarda açılması için x: 2048 - 40 (ekranın sağ kenarında) y: 400, // ekranın ortası (2048x2732 için) scaleX: 7.0, scaleY: 6.0 }); levelPanelBg.alpha = 0.97; levelPanelBg.visible = false; game.addChild(levelPanelBg); var levelPanelText = new Text2('', { size: 36, fill: "#000", // Siyah renk fontWeight: "bold" // Kalın yazı }); levelPanelText.anchor.set(0, 0); levelPanelText.x = levelPanelBg.x - levelPanelBg.width + 40; levelPanelText.y = levelPanelBg.y - levelPanelBg.height / 2 + 40; 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 }]; // Layout constants for alignment var panelLeft = levelPanelBg.x - levelPanelBg.width + 40; var panelTop = levelPanelBg.y - levelPanelBg.height / 2 + 40; var rowHeight = 100; var btnSize = 70; // Move all panel content to align with right-anchored panel var panelLeft = levelPanelBg.x - levelPanelBg.width + 40 + 250; var panelTop = levelPanelBg.y - levelPanelBg.height / 2 + 40; var rowHeight = 100; var btnSize = 70; var textSize = 60; var btnTextSize = 36; var costTextSize = 36; // Her satır için: seviye label + seviye değeri + maliyet + buton yanyana var levelLabels = []; var levelValues = []; // Hız artışı açıklama metni (Şehir label'ının üstünde) var speedInfoTxt = new Text2("Her seviye hızı %2 oranda artırır", { size: 32, fill: "#000", fontWeight: "bold" }); speedInfoTxt.anchor.set(0, 0.5); speedInfoTxt.x = panelLeft; speedInfoTxt.y = panelTop - rowHeight / 2 + textSize / 2 + 8; speedInfoTxt.visible = false; game.addChild(speedInfoTxt); for (var i = 0; i < upgradeTypes.length; i++) { // Seviye label var labelTxt = new Text2(upgradeTypes[i].label + ":", { size: 36, fill: "#000", fontWeight: "bold" }); labelTxt.anchor.set(0, 0.5); labelTxt.x = panelLeft; labelTxt.y = panelTop + i * rowHeight + textSize / 2 + 8; labelTxt.visible = false; game.addChild(labelTxt); levelLabels.push(labelTxt); // Seviye değeri var valueTxt = new Text2("", { size: 36, fill: "#000", fontWeight: "bold" }); valueTxt.anchor.set(0, 0.5); valueTxt.x = panelLeft + 180; valueTxt.y = panelTop + i * rowHeight + textSize / 2 + 8; valueTxt.visible = false; game.addChild(valueTxt); levelValues.push(valueTxt); // Cost text (hemen valueTxt'nin sağında, arada boşluk yok) var costTxt = new Text2("", { size: costTextSize, fill: "#000", fontWeight: "bold" }); costTxt.anchor.set(0, 0.5); // costTxt.x = valueTxt.x + valueTxt.width + 0; // width bilinmediği için güncelleLevelPanel'de ayarlanacak costTxt.y = panelTop + i * rowHeight + textSize / 2 + 8; costTxt.visible = false; game.addChild(costTxt); upgradeCostTexts.push(costTxt); // Upgrade button (costTxt'nin hemen sağında olacak, x'i updateLevelPanel'de ayarlanacak) var btn = new Text2("▲", { size: btnTextSize, fill: upgradeTypes[i].color, fontWeight: "bold" }); btn.anchor.set(0, 0.5); // btn.x = btnOffsetX; // x'i updateLevelPanel'de ayarlayacağız btn.y = panelTop + i * rowHeight + textSize / 2 + 8; btn.visible = false; game.addChild(btn); upgradeButtons.push(btn); } // --- LEVEL PANEL UPDATE --- function updateLevelPanel() { // Find max levels for each type var factoryLevel = 0; for (var i = 0; i < factoryList.length; i++) { if (factoryList[i].level > factoryLevel) factoryLevel = factoryList[i].level; } var shopLevel = 0; for (var i = 0; i < shopList.length; i++) { if (shopList[i].level > shopLevel) shopLevel = shopList[i].level; } var cityLevel = city && city.level ? city.level : 1; var minerLevel = 0; for (var i = 0; i < minerList.length; i++) { if (minerList[i].level > minerLevel) minerLevel = minerList[i].level; } var carrierLevel = 0; for (var i = 0; i < carrierList.length; i++) { if (carrierList[i].level > carrierLevel) carrierLevel = carrierList[i].level; } // 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]; 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(); } }; // 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; 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; }; // No background, no music, no sound, as per requirements // End of MVP code;
===================================================================
--- original.js
+++ change.js
@@ -16,10 +16,10 @@
anchorX: 1.0,
anchorY: 0.5,
x: 2048 - 40,
y: 400,
- scaleX: 1.3,
- scaleY: 1.3
+ scaleX: 8.0,
+ scaleY: 6.0
});
panelBg.alpha = 0.97;
self.addChild(panelBg);
// Panel başlığı
@@ -1084,10 +1084,10 @@
anchorY: 0.5,
x: 2048 - 40,
// Sağ kenarda açılması için x: 2048 - 40 (ekranın sağ kenarında)
y: 400,
- scaleX: 1.3,
- scaleY: 1.3
+ scaleX: 10.0,
+ scaleY: 8.0
});
karargahPanelBg.alpha = 0.97;
karargahPanelBg.visible = false;
game.addChild(karargahPanelBg);
@@ -1517,10 +1517,10 @@
x: 2048 - 40,
// sağ kenarda açılması için x: 2048 - 40 (ekranın sağ kenarında)
y: 400,
// ekranın ortası (2048x2732 için)
- scaleX: 1.3,
- scaleY: 1.3
+ scaleX: 7.0,
+ scaleY: 5.0
});
depoPanelBg.alpha = 0.97;
depoPanelBg.visible = false;
game.addChild(depoPanelBg);
@@ -1622,10 +1622,10 @@
x: 2048 - 40,
// sağ kenarda açılması için x: 2048 - 40 (ekranın sağ kenarında)
y: 400,
// Ekranın ortası (2048x2732 için)
- scaleX: 1.3,
- scaleY: 1.3
+ scaleX: 6.0,
+ scaleY: 4.0
});
workersPanelBg.alpha = 0.97;
workersPanelBg.visible = false;
game.addChild(workersPanelBg);
@@ -1761,10 +1761,10 @@
x: 2048 - 40,
// sağ kenarda açılması için x: 2048 - 40 (ekranın sağ kenarında)
y: 400,
// ekranın ortası (2048x2732 için)
- scaleX: 1.3,
- scaleY: 1.3
+ scaleX: 5.0,
+ scaleY: 3.0
});
researchCampPanelBg.alpha = 0.97;
researchCampPanelBg.visible = false;
game.addChild(researchCampPanelBg);
@@ -2050,10 +2050,10 @@
x: 2048 - 40,
// sağ kenarda açılması için x: 2048 - 40 (ekranın sağ kenarında)
y: 400,
// ekranın ortası (2048x2732 için)
- scaleX: 1.3,
- scaleY: 1.3
+ scaleX: 7.0,
+ scaleY: 6.0
});
levelPanelBg.alpha = 0.97;
levelPanelBg.visible = false;
game.addChild(levelPanelBg);
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