User prompt
Bank panelinin içini olduğu gibi 2 satır yukarı kaydır.
User prompt
Bank panelinin içini olduğu gibi 2 satır yukarı kaydır.
User prompt
Credit ve Deposit kısımlarının tamamı panel içinde alt alta gelecek şekilde yeniden hizala.
User prompt
Bank panelinin arkaplan resim boyutunu yazıları içine alacak şekilde büyüt.
User prompt
Rivals panelinin arkaplan resim boyutunu yazıları içine alacak şekilde büyüt.
User prompt
Bu sorunu düzelt lütfen.
User prompt
Money ile Bank arasında arkaplanda çalan müziği açıp kapatmak için icon ekle.
User prompt
''Cost'' yerine ''Ortalama'' kelimesinin ingilizcesini yaz.
User prompt
Rivals panelinde bulunan ''Fiyat, Maliyet, Hisse'' kelimelerini ingilizceye çevir.
User prompt
Başlangıç parası 2000 olsun
User prompt
Oyunda ki, Türkçe kelime ve yazıların tamamını, İngilizce olarak değiştir.
User prompt
Bank butonunun 1 satır sağına ''How to Play?'' isimli buton oluştur ve açılan panel ekle. Açılan panelde oyun hakkında bilgi ve oyunun nasıl oynanacağı hakkında bilgi yazısı olsun.
User prompt
Başlangıç parası 1500 olsun
User prompt
Başlangıç parası 1000 olsun
User prompt
Garsonun yemek götüreceği zaman beklemesini çözebilir misin?
User prompt
Hız yükseltmesi yapılmış iken, yeni bir restaurant açınca, mevcut restaurant'da garson hızı yavaşlıyor.
User prompt
Yeni Restaurant alınca, Mevcut restaurant'da ki yükseltmeler o an ki restaurant'a özel olsun. Aynı yükseltmeler hepsine etki etmesin. Her restaurantın yükseltmesi farklı olsun.
User prompt
Yeni Restaurant satın alındığı zaman, Mevcut restaurant'da ki yükseltmelerin etkisi gidiyor. Bunu düzelt.
User prompt
Yeni Restaurant alınca, Mevcut restaurant'da ki yükseltmelerin etkisi gidiyor. Bunu düzelt.
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'storage.resetFlag = undefined;' Line Number: 694 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Reload yapıyorum. Hala ilerleme duruyor. Sıfırlanmasını istiyorum. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Yenileyince ve Reset yapınca tamamen sıfırla.
User prompt
Garson takılı kalıyor max yapınca.
User prompt
Kodda ki mantık hatalarını düzelt.
User prompt
Bu sorunu tamamen düzelt. Kodda değişiklik ve düzenleme yap.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Chef = Container.expand(function () { var self = Container.call(this); var chefGraphics = self.attachAsset('chef', { anchorX: 0.5, anchorY: 0.5 }); self.cooking = false; self.cookTime = 0; self.currentFoodType = -1; // Track which food type is being cooked self.targetTableIndex = -1; // Track which table the food is for self.update = function () { if (chefHasOrder && !self.cooking && !foodReady) { self.cooking = true; self.cookTime = 0; self.currentFoodType = currentOrderFoodType; // Remember which food to cook self.targetTableIndex = currentOrderTableIndex; // Remember which table it's for // Log which table number's order is being cooked if (self.targetTableIndex >= 0 && self.targetTableIndex < tables.length) { console.log('Chef cooking for table number: ' + tables[self.targetTableIndex].tableNumber); } chefHasOrder = false; } if (self.cooking) { self.cookTime++; if (self.cookTime > cookingSpeed) { self.cooking = false; foodReady = true; // Pass cooked food info back through globals currentOrderFoodType = self.currentFoodType; currentOrderTableIndex = self.targetTableIndex; // Reset order taken for the specific table if (self.targetTableIndex >= 0 && self.targetTableIndex < orderTaken.length) { orderTaken[self.targetTableIndex] = false; } } } }; return self; }); var Customer = Container.expand(function () { var self = Container.call(this); // Pick a random customer image from 10 options var customerImageIds = ['customer1', 'customer2', 'customer3', 'customer4', 'customer5', 'customer6', 'customer7', 'customer8', 'customer9', 'customer10']; self.customerImageId = customerImageIds[Math.floor(Math.random() * customerImageIds.length)]; var customerGraphics = self.attachAsset(self.customerImageId, { anchorX: 0.5, anchorY: 0.5 }); self.targetTable = null; self.targetTableIndex = -1; // Track which table index is reserved self.state = 'entering'; // entering, seated, waiting, eating, paying, leaving self.eatingTime = 0; self.waitTime = 0; self.foodType = Math.floor(Math.random() * foodTypes.length); // Random food type self.drinkType = Math.floor(Math.random() * drinkTypes.length); // Random drink type self.drinkImage = null; // Will hold the drink image above customer self.update = function () { if (self.state === 'entering') { if (self.targetTable) { // Only allow sitting if table is not occupied and no customer is still at the table if (!self.targetTable.occupied && !self.targetTable.customer) { var dx = self.targetTable.x - self.x; var dy = self.targetTable.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 5) { self.x += dx / dist * customerSpeed; self.y += dy / dist * customerSpeed; } else { self.state = 'seated'; self.targetTable.occupied = true; self.targetTable.customer = self; } } else { // Table is not available, clear assignment and wait self.targetTable = null; self.targetTableIndex = -1; } } else { // Wait in line near exit (register) if no table available // Move downwards from the register position (registerY) if (self.y < registerY + 200) { self.y += customerSpeed; } } } else if (self.state === 'eating') { // Show food image above customer and shrink it as food is eaten if (!self.foodImage) { // Attach food image above customer head self.foodImage = self.attachAsset(foodImageIds[self.foodType], { anchorX: 0.5, anchorY: 1.0, x: 0, y: -customerGraphics.height / 2 - 10, scaleX: 1, scaleY: 1 }); self.foodImage.baseScale = 1; } // Show drink image above customer head (to the right of food) if (!self.drinkImage) { self.drinkImage = self.attachAsset(drinkImageIds[self.drinkType], { anchorX: 0.5, anchorY: 1.0, x: 30, // right of food y: -customerGraphics.height / 2 - 10, scaleX: 1, scaleY: 1 }); self.drinkImage.baseScale = 1; } self.eatingTime++; // Shrink food image as eating progresses if (self.foodImage) { var progress = Math.min(1, self.eatingTime / 180); var scale = 1 - 0.7 * progress; // Shrink to 30% of original size if (scale < 0.3) scale = 0.3; self.foodImage.scaleX = scale; self.foodImage.scaleY = scale; } // Shrink drink image as eating progresses if (self.drinkImage) { var progress = Math.min(1, self.eatingTime / 180); var scale = 1 - 0.7 * progress; if (scale < 0.3) scale = 0.3; self.drinkImage.scaleX = scale; self.drinkImage.scaleY = scale; } if (self.eatingTime > 180) { // 3 seconds at 60fps self.state = 'paying'; // Remove food image above customer if (self.foodImage) { self.foodImage.destroy(); self.foodImage = null; } // Remove drink image above customer if (self.drinkImage) { self.drinkImage.destroy(); self.drinkImage = null; } if (self.targetTable) { self.targetTable.foodDelivered = false; if (self.targetTable.food) { self.targetTable.food.destroy(); self.targetTable.food = null; } // Remove drink from table if present if (self.targetTable.drink) { self.targetTable.drink.destroy(); self.targetTable.drink = null; } } } } else if (self.state === 'paying') { var dx = registerX - self.x; var dy = registerY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 5) { self.x += dx / dist * customerSpeed; self.y += dy / dist * customerSpeed; } else { // Add money based on food type price, with 25% more per upgradeSpeedLevel (active branch) var activeBranchUpgradeLevel = typeof upgradeSpeedLevel !== "undefined" ? upgradeSpeedLevel : 0; var earningMultiplier = Math.pow(1.25, activeBranchUpgradeLevel); var foodEarn = Math.round(foodPrices[self.foodType] * earningMultiplier); var drinkEarn = drinkPrices[self.drinkType]; money += foodEarn + drinkEarn; // Increment food sales count if (typeof foodSales !== "undefined" && self.foodType >= 0 && self.foodType < foodSales.length) { foodSales[self.foodType]++; } // (Do not increment drink sales for Top 5 panel!) // Optionally: you could track drink sales in a separate array if needed. self.state = 'leaving'; if (self.targetTable) { self.targetTable.occupied = false; self.targetTable.customer = null; self.targetTable.orderPlaced = false; self.targetTable.orderedFoodType = -1; // Reset food type } // Clear reservation if (self.targetTableIndex >= 0) { tableReservations[self.targetTableIndex] = false; } } } else if (self.state === 'leaving') { self.y += customerSpeed; if (self.y > 2800) { // Remove food image above customer if still present if (self.foodImage) { self.foodImage.destroy(); self.foodImage = null; } // Remove drink image above customer if still present if (self.drinkImage) { self.drinkImage.destroy(); self.drinkImage = null; } // Clear reservation before destroying if (self.targetTableIndex >= 0) { tableReservations[self.targetTableIndex] = false; } // Clean up food on table if still present if (self.targetTable && self.targetTable.food) { self.targetTable.food.destroy(); self.targetTable.food = null; self.targetTable.foodDelivered = false; self.targetTable.orderPlaced = false; self.targetTable.orderedFoodType = -1; } // Clean up drink on table if still present if (self.targetTable && self.targetTable.drink) { self.targetTable.drink.destroy(); self.targetTable.drink = null; } self.destroy(); var index = customers.indexOf(self); if (index > -1) customers.splice(index, 1); } } else if (self.state === 'seated') { self.waitTime++; if (self.waitTime > 120) { // 2 seconds self.targetTable.orderPlaced = true; self.targetTable.orderedFoodType = self.foodType; // Set the food type on table self.state = 'waiting'; } } }; return self; }); var Table = Container.expand(function () { var self = Container.call(this); var tableGraphics = self.attachAsset('table', { anchorX: 0.5, anchorY: 0.5 }); var chair = self.attachAsset('chair', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 60 }); self.occupied = false; self.customer = null; self.food = null; self.drink = null; // Add drink property for table self.orderPlaced = false; self.foodDelivered = false; self.orderedFoodType = -1; // Store which food type was ordered self.tableNumber = -1; // Table number for tracking // Create table number text self.numberText = new Text2('', { size: 50, fill: 0xFFFFFF, font: "'GillSans',Impact,'Arial Black',Tahoma" // Remove bold font }); self.numberText.anchor.set(0.5, 0.5); self.addChild(self.numberText); // Method to set table number self.setTableNumber = function (number) { self.tableNumber = number; self.numberText.setText('' + number); }; return self; }); var Waiter = Container.expand(function () { var self = Container.call(this); var waiterGraphics = self.attachAsset('waiter', { anchorX: 0.5, anchorY: 0.5 }); self.state = 'idle'; // idle, goingToTable, goingToFridge, goingToKitchen, deliveringFood self.targetTable = null; self.hasFood = false; self.food = null; self.carryingFoodType = -1; // Track which food type waiter is carrying self.targetTableIndex = -1; // Track which table the order/food is for self.servingTableIndex = -1; // Track which table is being served until order is complete // --- New for drink delivery --- self.hasDrink = false; self.drink = null; self.carryingDrinkType = -1; self.update = function () { if (self.state === 'idle') { // If currently serving a table, check for ready food for that table if (self.servingTableIndex >= 0 && foodReady && !foodBeingDelivered && currentOrderTableIndex === self.servingTableIndex) { // If food is ready, but waiter hasn't picked up drink yet, go to fridge first if (!self.hasDrink) { self.state = 'goingToFridge'; } else { self.state = 'goingToKitchen'; } } else if (self.servingTableIndex < 0) { // Only take new orders when not serving any table // Find the first table with an order that is not being served var foundTable = false; for (var i = 0; i < tables.length; i++) { // Check if any other waiter is already serving this table var beingServed = false; // Check main waiter if (typeof waiter !== "undefined" && waiter !== self && waiter.servingTableIndex === i) beingServed = true; // Check extra waiters if (typeof game !== "undefined" && game.extraWaiters) { for (var w = 0; w < game.extraWaiters.length; w++) { if (game.extraWaiters[w] !== self && game.extraWaiters[w].servingTableIndex === i) { beingServed = true; break; } } } // Only serve table if not being served by any waiter, and not already assigned to another waiter if (tables[i].orderPlaced && !orderTaken[i] && !beingServed && (self.servingTableIndex === -1 || self.servingTableIndex !== i)) { self.state = 'goingToTable'; self.targetTable = tables[i]; self.targetTableIndex = i; self.servingTableIndex = i; // Start serving this table // Log which table number is being served console.log('Waiter serving table number: ' + tables[i].tableNumber); foundTable = true; break; } } // If no table found, remain idle, but do not allow waiter to be idle if there are waiting orders if (!foundTable) { // Check if there are any tables with orderPlaced and not being served for (var i = 0; i < tables.length; i++) { var beingServed = false; if (typeof waiter !== "undefined" && waiter !== self && waiter.servingTableIndex === i) beingServed = true; if (typeof game !== "undefined" && game.extraWaiters) { for (var w = 0; w < game.extraWaiters.length; w++) { if (game.extraWaiters[w] !== self && game.extraWaiters[w].servingTableIndex === i) { beingServed = true; break; } } } if (tables[i].orderPlaced && !orderTaken[i] && !beingServed) { // Assign this waiter to this table self.state = 'goingToTable'; self.targetTable = tables[i]; self.targetTableIndex = i; self.servingTableIndex = i; break; } } } } } else if (self.state === 'goingToTable') { var dx = self.targetTable.x - self.x; var dy = self.targetTable.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 5) { // Prevent overshooting: if step is larger than dist, snap to target var step = waiterSpeed; if (step > dist) step = dist; self.x += dx / dist * step; self.y += dy / dist * step; } else { orderTaken[self.targetTableIndex] = true; self.carryingFoodType = self.targetTable.orderedFoodType; // Remember the food type // --- New: Remember the drink type for this customer --- if (self.targetTable.customer && typeof self.targetTable.customer.drinkType === "number") { self.carryingDrinkType = self.targetTable.customer.drinkType; } else { self.carryingDrinkType = Math.floor(Math.random() * drinkTypes.length); } // Pass order details to chef through global variables currentOrderFoodType = self.carryingFoodType; currentOrderTableIndex = self.targetTableIndex; chefHasOrder = true; // --- New: Go to fridge first to pick up drink --- self.state = 'goingToFridge'; } } else if (self.state === 'goingToFridge') { // Move to fridge position (fridge.x, fridge.y) var fridgeX = kitchenX - 2 * 400; var fridgeY = kitchenY; var dx = fridgeX - self.x; var dy = fridgeY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 5) { // Prevent overshooting: if step is larger than dist, snap to target var step = waiterSpeed; if (step > dist) step = dist; self.x += dx / dist * step; self.y += dy / dist * step; } else { // Pick up drink (show drink image above waiter) if (!self.hasDrink) { if (self.drink) { self.drink.destroy(); self.drink = null; } self.drink = self.attachAsset(drinkImageIds[self.carryingDrinkType], { anchorX: 0.5, anchorY: 1.0, x: 30, y: -70, scaleX: 1, scaleY: 1 }); self.hasDrink = true; } // After picking up drink, go to kitchen to pick up food self.state = 'goingToKitchen'; } } else if (self.state === 'goingToKitchen') { var dx = kitchenX - self.x; var dy = kitchenY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 5) { // Prevent overshooting: if step is larger than dist, snap to target var step = waiterSpeed; if (step > dist) step = dist; self.x += dx / dist * step; self.y += dy / dist * step; } else { // Check if food is ready for pickup if (foodReady && !self.hasFood && currentOrderTableIndex === self.servingTableIndex) { self.hasFood = true; foodReady = false; foodBeingDelivered = true; self.carryingFoodType = currentOrderFoodType; // Remember which food type self.targetTableIndex = currentOrderTableIndex; // Remember target table if (self.food) { self.food.destroy(); self.food = null; } self.food = self.attachAsset(foodImageIds[self.carryingFoodType], { anchorX: 0.5, anchorY: 0.5, y: -40 }); // Deliver to the specific table that ordered this food if (self.targetTableIndex >= 0 && self.targetTableIndex < tables.length) { self.targetTable = tables[self.targetTableIndex]; self.state = 'deliveringFood'; } } else { // If not serving any table and not carrying food, reset to idle so waiter doesn't get stuck at kitchen if (!self.hasFood && (self.servingTableIndex === -1 || typeof self.servingTableIndex === "undefined")) { self.state = 'idle'; self.targetTable = null; self.targetTableIndex = -1; // --- New: Drop drink if waiter was carrying one but order is cancelled --- if (self.hasDrink && self.drink) { self.drink.destroy(); self.drink = null; } self.hasDrink = false; self.carryingDrinkType = -1; } } // Stay at kitchen waiting for food - don't go back to idle unless above } } else if (self.state === 'deliveringFood') { var dx = self.targetTable.x - self.x; var dy = self.targetTable.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 5) { // Prevent overshooting: if step is larger than dist, snap to target var step = waiterSpeed; if (step > dist) step = dist; self.x += dx / dist * step; self.y += dy / dist * step; } else { // Remove food and drink from waiter if (self.food) { self.food.destroy(); self.food = null; } if (self.drink) { self.drink.destroy(); self.drink = null; } self.hasFood = false; self.hasDrink = false; foodBeingDelivered = false; // Mark food delivered and reset order state so waiter doesn't deliver again self.targetTable.foodDelivered = true; // Place food on table self.targetTable.food = self.targetTable.attachAsset(foodImageIds[self.carryingFoodType], { anchorX: 0.5, anchorY: 0.5, y: -20 }); // Place drink on table (to the right of food) if (typeof self.carryingDrinkType === "number" && self.carryingDrinkType >= 0) { if (self.targetTable.drink) { self.targetTable.drink.destroy(); self.targetTable.drink = null; } self.targetTable.drink = self.targetTable.attachAsset(drinkImageIds[self.carryingDrinkType], { anchorX: 0.5, anchorY: 0.5, x: 30, y: -20, scaleX: 1, scaleY: 1 }); } self.targetTable.orderPlaced = false; // Reset orderPlaced so waiter doesn't deliver again orderTaken[self.targetTableIndex] = false; // Reset orderTaken for this table self.targetTable.orderedFoodType = -1; // Reset food type for this table if (self.targetTable.customer) { // Remove any artificial wait before eating, customer starts eating immediately self.targetTable.customer.waitTime = 121; // >120 triggers eating state in Customer self.targetTable.customer.state = 'eating'; } self.servingTableIndex = -1; // Order complete, can serve another table self.targetTable = null; self.carryingDrinkType = -1; // Always immediately pick up next waiting order if available var foundNextTable = false; for (var i = 0; i < tables.length; i++) { // Check if any other waiter is already serving this table var beingServed = false; if (typeof waiter !== "undefined" && waiter !== self && waiter.servingTableIndex === i) beingServed = true; if (typeof game !== "undefined" && game.extraWaiters) { for (var w = 0; w < game.extraWaiters.length; w++) { if (game.extraWaiters[w] !== self && game.extraWaiters[w].servingTableIndex === i) { beingServed = true; break; } } } // Only serve table if not being served by any waiter, and not already assigned to another waiter if (tables[i].orderPlaced && !orderTaken[i] && !beingServed && (self.servingTableIndex === -1 || self.servingTableIndex !== i)) { self.state = 'goingToTable'; self.targetTable = tables[i]; self.targetTableIndex = i; self.servingTableIndex = i; // Start serving this table console.log('Waiter immediately serving next table number: ' + tables[i].tableNumber); foundNextTable = true; break; } } if (!foundNextTable) { // If there are still waiting orders, do not allow waiter to be idle for (var i = 0; i < tables.length; i++) { var beingServed = false; if (typeof waiter !== "undefined" && waiter !== self && waiter.servingTableIndex === i) beingServed = true; if (typeof game !== "undefined" && game.extraWaiters) { for (var w = 0; w < game.extraWaiters.length; w++) { if (game.extraWaiters[w] !== self && game.extraWaiters[w].servingTableIndex === i) { beingServed = true; break; } } } if (tables[i].orderPlaced && !orderTaken[i] && !beingServed) { self.state = 'goingToTable'; self.targetTable = tables[i]; self.targetTableIndex = i; self.servingTableIndex = i; break; } } if (self.state !== 'goingToTable') { self.state = 'idle'; } } } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xF5DEB3 }); /**** * Game Code ****/ // New assets for New Restaurant and Branches buttons // Add main menu background image (covers full game area) 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); } // Use background image at its native resolution, do not scale up var mainMenuBg = game.addChild(LK.getAsset('mainMenuBg', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); // Game variables // Food image assets (replace with your own images as needed) // For full reset, if storage.resetFlag is set, delete all storage keys if (typeof storage.resetFlag !== "undefined" && storage.resetFlag === true) { // Delete all own keys except resetFlag itself (to avoid issues during iteration) var keysToDelete = []; for (var key in storage) { if (storage.hasOwnProperty(key) && key !== "resetFlag") { keysToDelete.push(key); } } for (var i = 0; i < keysToDelete.length; i++) { delete storage[keysToDelete[i]]; } // Unset resetFlag after clearing delete storage.resetFlag; } // Start game from scratch on launch var money = typeof storage.money !== "undefined" ? storage.money : 2000; var restaurantLevel = storage.restaurantLevel || 1; var tableCount = storage.tableCount || 2; var tableReservations = []; // Track which tables are reserved by customers // Food types var foodTypes = ['pizza', 'burger', 'pasta', 'salad', 'soup', 'sushi', 'steak', 'curry', 'taco', 'dumpling']; var foodNames = ['Pizza', 'Burger', 'Pasta', 'Salad', 'Soup', 'Sushi', 'Steak', 'Curry', 'Taco', 'Dumpling']; var foodImageIds = ['food_pizza', 'food_burger', 'food_pasta', 'food_salad', 'food_soup', 'food_sushi', 'food_steak', 'food_curry', 'food_taco', 'food_dumpling']; var foodColors = [0xff6347, 0x8b4513, 0xffa500, 0x32cd32, 0xffd700, 0x6ad1e3, 0x8b0000, 0xf7b32b, 0xf4a259, 0xf7e7ce]; // Food prices: multiples of 6, each next is 10% more (rounded to nearest integer) var foodPrices = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15]; // Will be set below // Calculate food prices as 6, 6*1.1, 6*1.21, ... for all foodTypes (rounded) foodPrices[0] = 6; for (var i = 1; i < foodTypes.length; i++) { foodPrices[i] = Math.round(foodPrices[i - 1] * 1.1); } // --- Drink types, images, and prices --- var drinkTypes = ['cola', 'fanta', 'sprite', 'ayran', 'soda', 'water', 'ice_tea', 'lemonade', 'orange_juice', 'coffee']; var drinkNames = ['Cola', 'Fanta', 'Sprite', 'Ayran', 'Soda', 'Water', 'Ice Tea', 'Lemonade', 'Orange Juice', 'Coffee']; var drinkImageIds = ['drink_cola', 'drink_fanta', 'drink_sprite', 'drink_ayran', 'drink_soda', 'drink_water', 'drink_icetea', 'drink_lemonade', 'drink_orangejuice', 'drink_coffee']; // Register drink images as assets (dummy id for now, should be replaced with real image ids) // Drink prices: 2, 4, 6, ..., 20 var drinkPrices = []; for (var i = 0; i < drinkTypes.length; i++) { drinkPrices[i] = 2 * (i + 1); } // Speed variables (lower is faster) var customerSpeed = 3; var waiterBaseSpeed = 4; // Use this as the base for scaling waiterSpeed var waiterSpeed = waiterBaseSpeed; var cookingSpeed = 180; // 3 seconds at 60fps // Game state var tables = []; var customers = []; var orderTaken = []; var chefHasOrder = false; var foodReady = false; var foodBeingDelivered = false; var currentOrderFoodType = -1; // Track current order food type var currentOrderTableIndex = -1; // Track current order table index // Positions var kitchenX = 1024; var kitchenY = 400; var registerX = 1024; var registerY = 2400; // UI Elements var moneyText = new Text2('Money: $0', { size: 36, fill: 0xFFFFFF, font: "'GillSans',Tahoma" // Remove bold font }); moneyText.anchor.set(0.5, 0); LK.gui.top.addChild(moneyText); // --- Day Counter --- var day = typeof storage.day !== "undefined" ? storage.day : 1; var dayText = new Text2('Day: 1', { size: 32, fill: 0xFFFF00, font: "'GillSans',Tahoma" }); dayText.anchor.set(0.5, 0); dayText.x = moneyText.x; dayText.y = moneyText.y + moneyText.height + 4; LK.gui.top.addChild(dayText); // --- Current Branch Name Display (under day counter) --- var currentBranchNameText = new Text2('', { size: 36, fill: 0xFFFFFF, font: "'GillSans',Tahoma" }); currentBranchNameText.anchor.set(0.5, 0); currentBranchNameText.x = moneyText.x; currentBranchNameText.y = dayText.y + dayText.height + 4; LK.gui.top.addChild(currentBranchNameText); function updateCurrentBranchNameText() { if (branches && branches[currentBranchIndex] && branches[currentBranchIndex].name) { currentBranchNameText.setText(branches[currentBranchIndex].name); } else { currentBranchNameText.setText(''); } } updateCurrentBranchNameText(); // --- Bank Button and Panel --- // --- Music Toggle Icon/Button --- // Use a simple text icon for music (🔊/🔇), or you can use an image asset if available var musicOn = true; var musicIcon = new Text2('🔊', { size: 36, fill: 0xFFFFFF, font: "'GillSans',Tahoma" }); musicIcon.anchor.set(0, 0); musicIcon.x = moneyText.x + moneyText.width + 40; // 1 row to the right of Money musicIcon.y = moneyText.y; musicIcon.interactive = true; musicIcon.buttonMode = true; LK.gui.top.addChild(musicIcon); // Play music at start LK.playMusic('Background', { loop: true }); // Toggle music on icon press musicIcon.down = function () { if (musicOn) { LK.stopMusic(); musicIcon.setText('🔇'); musicOn = false; } else { LK.playMusic('Background', { loop: true }); musicIcon.setText('🔊'); musicOn = true; } }; // --- Bank Button and Panel --- var bankButton = new Text2('Bank', { size: 36, fill: 0x00FFCC, font: "'GillSans',Tahoma" }); bankButton.anchor.set(0, 0); bankButton.x = musicIcon.x + musicIcon.width + 40; // 1 row to the right of music icon bankButton.y = moneyText.y; bankButton.interactive = true; bankButton.buttonMode = true; LK.gui.top.addChild(bankButton); // --- How to Play Button and Panel --- var howToPlayButton = new Text2('How to Play?', { size: 36, fill: 0x00CCFF, font: "'GillSans',Tahoma" }); howToPlayButton.anchor.set(0, 0); // Place 1 row to the right from Bank button (use width + margin) howToPlayButton.x = bankButton.x + bankButton.width + 40; howToPlayButton.y = bankButton.y; howToPlayButton.interactive = true; howToPlayButton.buttonMode = true; LK.gui.top.addChild(howToPlayButton); var howToPlayPanel = null; function hideHowToPlayPanel() { if (howToPlayPanel && howToPlayPanel.parent) { howToPlayPanel.parent.removeChild(howToPlayPanel); howToPlayPanel = null; } } function showHowToPlayPanel() { hideHowToPlayPanel(); howToPlayPanel = new Container(); // Panel background (reuse branchesPanelBg, 800x1080) // Use panel background at its native resolution, do not scale up var panelBg = LK.getAsset('branchesPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366 }); panelBg.alpha = 0.98; howToPlayPanel.addChild(panelBg); // Title var panelTitle = new Text2('How to Play', { size: 54, fill: 0x00CCFF, font: "'GillSans',Tahoma" }); panelTitle.anchor.set(0.5, 0); panelTitle.x = 1024; panelTitle.y = 900; howToPlayPanel.addChild(panelTitle); // Info text (multi-line, word wrap) var infoText = new Text2("Welcome to Restaurant Tycoon!\n\n" + "• Customers will arrive and sit at available tables.\n" + "• Waiters take orders, pick up food and drinks, and deliver them to tables.\n" + "• Earn money by serving food and drinks. Upgrade your restaurant for faster service and more customers.\n" + "• Use the Bank to take credits or open deposits for extra money.\n" + "• Open new branches to expand your business. Each branch has its own upgrades.\n" + "• Compete with rival companies and buy shares to increase your wealth.\n\n" + "Tip: Upgrade your speed and advertisement to serve more customers and earn more money!\n\n" + "Good luck and have fun!", { size: 32, fill: 0xFFFFFF, wordWrap: true, wordWrapWidth: 700, font: "'GillSans',Tahoma" }); infoText.anchor.set(0.5, 0); infoText.x = 1024; infoText.y = 980; howToPlayPanel.addChild(infoText); // Close button var closeBtn = new Text2('Close', { size: 36, fill: 0xFFFFFF }); closeBtn.anchor.set(1, 0); closeBtn.x = 1024 + 400 - 24; closeBtn.y = 900 + 16; closeBtn.interactive = true; closeBtn.buttonMode = true; closeBtn.down = function () { hideHowToPlayPanel(); }; howToPlayPanel.addChild(closeBtn); howToPlayPanel.visible = true; game.addChild(howToPlayPanel); } howToPlayButton.down = function () { showHowToPlayPanel(); }; var bankPanel = null; var bankCreditActive = false; var bankCreditAmount = 0; var bankCreditDueTick = 0; var bankDepositActive = false; var bankDepositAmount = 0; var bankDepositDueTick = 0; // Helper to close bank panel function hideBankPanel() { if (bankPanel && bankPanel.parent) { bankPanel.parent.removeChild(bankPanel); bankPanel = null; } } // Show Bank Panel function showBankPanel() { hideBankPanel(); bankPanel = new Container(); // 50% scale up factor for more space var scaleFactor = 1.5; // Panel background (800x1080 -> 1200x1620) and shift 20% to the right var bankPanelBgWidth = 1200; // 800 * 1.5 var bankPanelBgHeight = 1620; // 1080 * 1.5 var bankPanelBgX = 1024 + (bankPanelBgWidth - 800 * scaleFactor) / 2; // 20% to the right, keep similar logic // Use panel background at its native resolution, do not scale up var panelBg = LK.getAsset('branchesPanelBg', { anchorX: 0.5, anchorY: 0.5, x: bankPanelBgX, y: 1366, width: bankPanelBgWidth, height: bankPanelBgHeight }); panelBg.alpha = 0.98; bankPanel.addChild(panelBg); // New panel width and alignment references var panelWidth = bankPanelBgWidth; var panelHeight = bankPanelBgHeight; var leftX = bankPanelBgX - panelWidth / 2 + 80 * scaleFactor; var rightX = bankPanelBgX + 80 * scaleFactor; // Move all Bank panel content up by 2 rows (180px) var sectionY = 950 * scaleFactor / 1.25 + 20 * scaleFactor - 180; // Shift up by 180px (2 rows) // Title var panelTitle = new Text2('Bank', { size: 48 * scaleFactor, fill: 0x00FFCC, font: "'GillSans',Tahoma" }); panelTitle.anchor.set(0.5, 0); panelTitle.x = 1024; panelTitle.y = sectionY; bankPanel.addChild(panelTitle); // --- Vertically stacked Credit and Deposit sections inside the panel --- // Start Y for first section (Credit) var sectionStartY = sectionY + 90 * scaleFactor; // --- Credit Section --- var creditTitle = new Text2('Credit', { size: 36 * scaleFactor, fill: 0xFFFFFF, font: "'GillSans',Tahoma" }); creditTitle.anchor.set(0, 0); creditTitle.x = leftX; creditTitle.y = sectionStartY; bankPanel.addChild(creditTitle); var canTakeCredit = !bankCreditActive; var creditOffer = Math.floor(money * 0.2); var creditInfoLine1, creditInfoLine2; if (canTakeCredit) { creditInfoLine1 = 'Take a credit of $' + creditOffer; creditInfoLine2 = '(10 days, 10% interest)'; } else { creditInfoLine1 = 'Active Credit: $' + bankCreditAmount; var creditDueDay = typeof bankCreditDueDay !== "undefined" ? bankCreditDueDay : day + 10; var daysLeft = Math.max(0, creditDueDay - day); creditInfoLine2 = '(Due in ' + daysLeft + ' days)'; } var creditText1 = new Text2(creditInfoLine1, { size: 28 * scaleFactor, fill: 0xFFFFFF, font: "'GillSans',Tahoma" }); creditText1.anchor.set(0, 0); creditText1.x = leftX; creditText1.y = creditTitle.y + 60 * scaleFactor; bankPanel.addChild(creditText1); var creditText2 = new Text2(creditInfoLine2, { size: 24 * scaleFactor, fill: 0xCCCCCC, font: "'GillSans',Tahoma" }); creditText2.anchor.set(0, 0); creditText2.x = leftX; creditText2.y = creditText1.y + creditText1.height + 2 * scaleFactor; bankPanel.addChild(creditText2); var creditBtn = new Text2('Take Credit', { size: 32 * scaleFactor, fill: canTakeCredit ? 0x00FF00 : 0x888888, font: "'GillSans',Tahoma" }); creditBtn.anchor.set(0, 0); creditBtn.x = leftX; creditBtn.y = creditText2.y + creditText2.height + 12 * scaleFactor; creditBtn.interactive = canTakeCredit; creditBtn.buttonMode = canTakeCredit; creditBtn.down = function () { if (!bankCreditActive) { bankCreditActive = true; bankCreditAmount = creditOffer; bankCreditDueDay = day + 10; bankCreditDueTick = LK.ticks + 10 * 60 * 60 * 24; money += bankCreditAmount; storage.money = money; storage.bankCreditDueDay = bankCreditDueDay; hideBankPanel(); showBankPanel(); } }; bankPanel.addChild(creditBtn); var payableAmount = 0; if (bankCreditActive) { payableAmount = Math.floor(bankCreditAmount * 1.10); } else { payableAmount = Math.floor(creditOffer * 1.10); } var payableText = new Text2("Payable: $" + payableAmount, { size: 24 * scaleFactor, fill: 0xFF8888, font: "'GillSans',Tahoma" }); payableText.anchor.set(0, 0); payableText.x = creditBtn.x + creditBtn.width + 32 * scaleFactor; payableText.y = creditBtn.y + 4 * scaleFactor; bankPanel.addChild(payableText); var infoTextCredit = new Text2("You can take a credit for 10 days at 10% interest (max 20% of your current money).", { size: 24 * scaleFactor, fill: 0xFFFFCC, wordWrap: true, wordWrapWidth: 400 * scaleFactor, font: "'GillSans',Tahoma" }); infoTextCredit.anchor.set(0, 0); infoTextCredit.x = leftX; infoTextCredit.y = creditBtn.y + creditBtn.height + 12 * scaleFactor; bankPanel.addChild(infoTextCredit); // --- Deposit Section (stacked below Credit) --- var depositSectionStartY = infoTextCredit.y + infoTextCredit.height + 48 * scaleFactor; var depositTitle = new Text2('Deposit', { size: 36 * scaleFactor, fill: 0xFFFFFF, font: "'GillSans',Tahoma" }); depositTitle.anchor.set(0, 0); depositTitle.x = leftX; depositTitle.y = depositSectionStartY; bankPanel.addChild(depositTitle); var canDeposit = !bankDepositActive && money > 0; var depositOffer = Math.floor(money * 0.5); var depositInfoLine1, depositInfoLine2; if (bankDepositActive) { depositInfoLine1 = 'Active Deposit: $' + bankDepositAmount; var depositDueDay = typeof bankDepositDueDay !== "undefined" ? bankDepositDueDay : day + 10; var depositDaysLeft = Math.max(0, depositDueDay - day); depositInfoLine2 = '(Due in ' + depositDaysLeft + ' days)'; } else { depositInfoLine1 = 'Open a deposit up to $' + depositOffer; depositInfoLine2 = '(10 days, 20% interest)'; } var depositText1 = new Text2(depositInfoLine1, { size: 28 * scaleFactor, fill: 0xFFFFFF, font: "'GillSans',Tahoma" }); depositText1.anchor.set(0, 0); depositText1.x = leftX; depositText1.y = depositTitle.y + 60 * scaleFactor; bankPanel.addChild(depositText1); var depositText2 = new Text2(depositInfoLine2, { size: 24 * scaleFactor, fill: 0xCCCCCC, font: "'GillSans',Tahoma" }); depositText2.anchor.set(0, 0); depositText2.x = leftX; depositText2.y = depositText1.y + depositText1.height + 2 * scaleFactor; bankPanel.addChild(depositText2); var depositBtn = new Text2('Open Deposit', { size: 32 * scaleFactor, fill: canDeposit ? 0x00FF00 : 0x888888, font: "'GillSans',Tahoma" }); depositBtn.anchor.set(0, 0); depositBtn.x = leftX; depositBtn.y = depositText2.y + depositText2.height + 12 * scaleFactor; depositBtn.interactive = canDeposit; depositBtn.buttonMode = canDeposit; depositBtn.down = function () { if (!bankDepositActive && money > 0) { bankDepositActive = true; bankDepositAmount = depositOffer; bankDepositDueDay = day + 10; bankDepositDueTick = LK.ticks + 10 * 60 * 60 * 24; money -= bankDepositAmount; storage.money = money; storage.bankDepositDueDay = bankDepositDueDay; hideBankPanel(); showBankPanel(); } }; bankPanel.addChild(depositBtn); var receivableAmount = 0; if (bankDepositActive) { receivableAmount = Math.floor(bankDepositAmount * 1.20); } else { receivableAmount = Math.floor(depositOffer * 1.20); } var receivableText = new Text2("Receivable: $" + receivableAmount, { size: 24 * scaleFactor, fill: 0x88FF88, font: "'GillSans',Tahoma" }); receivableText.anchor.set(0, 0); receivableText.x = depositBtn.x + depositBtn.width + 32 * scaleFactor; receivableText.y = depositBtn.y + 4 * scaleFactor; bankPanel.addChild(receivableText); var infoTextDeposit = new Text2("You can open a deposit for 10 days at 20% interest (max 50% of your current money).", { size: 24 * scaleFactor, fill: 0xFFFFCC, wordWrap: true, wordWrapWidth: 400 * scaleFactor, font: "'GillSans',Tahoma" }); infoTextDeposit.anchor.set(0, 0); infoTextDeposit.x = leftX; infoTextDeposit.y = depositBtn.y + depositBtn.height + 12 * scaleFactor; bankPanel.addChild(infoTextDeposit); // General info text at the bottom var infoTextGeneral = new Text2("You can only have one active credit and one active deposit at a time.", { size: 22 * scaleFactor, fill: 0xFFFFCC, wordWrap: true, wordWrapWidth: 700 * scaleFactor, font: "'GillSans',Tahoma" }); infoTextGeneral.anchor.set(0.5, 0); // Move up slightly to ensure it fits inside the panel and doesn't overlap infoTextGeneral.x = 1024; infoTextGeneral.y = sectionY + panelHeight - 120 * scaleFactor; bankPanel.addChild(infoTextGeneral); // Close button var closeBtn = new Text2('Close', { size: 36 * scaleFactor, fill: 0xFFFFFF }); closeBtn.anchor.set(1, 0); closeBtn.x = 1024 + panelWidth / 2 - 32 * scaleFactor; closeBtn.y = sectionY + 16 * scaleFactor; closeBtn.interactive = true; closeBtn.buttonMode = true; closeBtn.down = function () { hideBankPanel(); }; bankPanel.addChild(closeBtn); bankPanel.visible = true; game.addChild(bankPanel); } bankButton.down = function () { showBankPanel(); }; // --- Reset Game Button (to the left of the coin) --- var resetButton = new Text2('Reset', { size: 48, fill: 0xFFFFFF, wordWrap: true, wordWrapWidth: 140 }); resetButton.anchor.set(1, 0); // right-top anchor resetButton.x = moneyText.x - 180 - 2048 * 0.05; // Move 5% of screen width further left resetButton.y = moneyText.y + 8; // Align vertically with moneyText resetButton.interactive = true; resetButton.buttonMode = true; resetButton.down = function () { // Yeniden başlatınca storage.resetFlag ayarla, sonraki açılışta tüm storage silinsin storage.resetFlag = true; LK.showGameOver(); // This will reset the game state }; LK.gui.top.addChild(resetButton); // --- Top 5 Most Sold Foods Panel (below Son Satış) --- var foodSales = []; for (var i = 0; i < foodTypes.length; i++) { foodSales[i] = 0; } // Panel background image for Top 5 Most Sold Foods var top5PanelBg = LK.getAsset('top5PanelBg', { anchorX: 1, anchorY: 0, x: 2048, y: 120, width: 500, height: 385 // 350 * 1.1 = 385 }); top5PanelBg.alpha = 0.92; game.addChild(top5PanelBg); var top5Title = new Text2('TOP 5', { size: 40, fill: 0xFFFFFF, font: "'GillSans',Tahoma" // Remove bold font }); // Anchor left-top top5Title.anchor.set(0, 0); // Align to left edge of the panel (panel x = 2048, width = 500) top5Title.x = 2048 - 500 + 20; top5Title.y = 140; game.addChild(top5Title); var top5TextLines = []; for (var i = 0; i < 5; i++) { var txt = new Text2('', { size: 36, fill: 0xFFFFFF, font: "'GillSans',Tahoma" // Remove bold font }); // Anchor left-top txt.anchor.set(0, 0); // Align to left edge of the panel (panel x = 2048, width = 500) txt.x = 2048 - 500 + 20; txt.y = 200 + i * 55; game.addChild(txt); top5TextLines.push(txt); } // Add fridge image to the left of the kitchen, 2 satır (columns) left var fridge = game.addChild(LK.getAsset('fridge', { anchorX: 0.5, anchorY: 0.5, x: kitchenX - 2 * 400, // 2 kitchen widths left y: kitchenY })); // Create kitchen var kitchen = game.addChild(LK.getAsset('kitchen', { anchorX: 0.5, anchorY: 0.5, x: kitchenX, y: kitchenY })); // Create register var register = game.addChild(LK.getAsset('register', { anchorX: 0.5, anchorY: 0.5, x: registerX, y: registerY })); // Create chef var chef = game.addChild(new Chef()); chef.x = kitchenX; chef.y = kitchenY; // Create waiter var waiter = game.addChild(new Waiter()); // Spawn main waiter in front of the register (kasa) waiter.x = registerX - 120; waiter.y = registerY + 60; // Always initialize extraWaiters as an array so new waiters can be added and updated game.extraWaiters = []; // Create initial tables function createTable(index) { var table = game.addChild(new Table()); // Arrange tables in rows of 5 var row = Math.floor(index / 5); var col = index % 5; table.x = 300 + col * 300; table.y = 800 + row * 300; table.setTableNumber(index + 1); // Set table number (1-based) tables.push(table); orderTaken.push(false); tableReservations.push(false); // Initialize reservation status } for (var i = 0; i < tableCount; i++) { createTable(i); } // Upgrade speed button var upgradeButton = game.addChild(LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, x: 500, y: 2200 })); var upgradeText = new Text2('Upgrade Speed $50', { size: 36, fill: 0xFFFFFF, wordWrap: true, wordWrapWidth: 260 }); upgradeText.anchor.set(0.5, 0.5); upgradeText.x = 500; upgradeText.y = 2200; game.addChild(upgradeText); // Track upgrade cost and max level var upgradeSpeedLevel = typeof storage.upgradeSpeedLevel !== "undefined" ? storage.upgradeSpeedLevel : 0; var upgradeSpeedCost = typeof storage.upgradeSpeedCost !== "undefined" ? storage.upgradeSpeedCost : 50; var UPGRADE_SPEED_MAX_LEVEL = 10; function updateUpgradeText() { if (upgradeSpeedLevel >= UPGRADE_SPEED_MAX_LEVEL) { upgradeText.setText('Upgrade Speed (MAX)'); } else { upgradeText.setText('Upgrade Speed $' + upgradeSpeedCost); } } upgradeButton.down = function () { if (upgradeSpeedLevel < UPGRADE_SPEED_MAX_LEVEL && money >= upgradeSpeedCost) { money -= upgradeSpeedCost; upgradeSpeedLevel++; upgradeSpeedCost = Math.floor(upgradeSpeedCost * 1.5); restaurantLevel++; // Only update current branch's upgradeSpeedLevel and derived stats if (branches[currentBranchIndex]) { branches[currentBranchIndex].upgradeSpeedLevel = upgradeSpeedLevel; // waiterSpeed: Each level increases speed by 50% (waiterSpeed = base * 1.5^level), max 20 if (typeof waiterBaseSpeed === "undefined") { waiterBaseSpeed = 4; } branches[currentBranchIndex].waiterSpeed = Math.min(20, waiterBaseSpeed * Math.pow(1.5, upgradeSpeedLevel)); if (branches[currentBranchIndex].waiterSpeed > 20) branches[currentBranchIndex].waiterSpeed = 20; branches[currentBranchIndex].cookingSpeed = Math.max(60, 180 - 20 * upgradeSpeedLevel); // Save waiterSpeed and cookingSpeed to branch after upgrade waiterSpeed = branches[currentBranchIndex].waiterSpeed; cookingSpeed = branches[currentBranchIndex].cookingSpeed; branches[currentBranchIndex].waiterSpeed = waiterSpeed; branches[currentBranchIndex].cookingSpeed = cookingSpeed; } // Update local variables from branch waiterSpeed = branches[currentBranchIndex].waiterSpeed; cookingSpeed = branches[currentBranchIndex].cookingSpeed; storage.restaurantLevel = restaurantLevel; storage.money = money; storage.upgradeSpeedLevel = upgradeSpeedLevel; storage.upgradeSpeedCost = upgradeSpeedCost; LK.effects.flashObject(upgradeButton, 0x00FF00, 500); updateUpgradeText(); } }; updateUpgradeText(); // --- Advertisement Upgrade Button below Upgrade Speed --- var advertisementLevel = typeof storage.advertisementLevel !== "undefined" ? storage.advertisementLevel : 0; var advertisementButton = game.addChild(LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, x: 500, y: 2280 })); var advertisementText = new Text2('Advertisement $100', { size: 36, fill: 0xFFFFFF, wordWrap: true, wordWrapWidth: 260 }); advertisementText.anchor.set(0.5, 0.5); advertisementText.x = 500; advertisementText.y = 2280; game.addChild(advertisementText); // Track advertisement upgrade cost, default to 100 * (advertisementLevel+1) var advertisementCost = typeof storage.advertisementCost !== "undefined" ? storage.advertisementCost : 100 * (advertisementLevel + 1); function updateAdvertisementText() { if (advertisementLevel >= ADVERTISEMENT_MAX_LEVEL) { advertisementText.setText('Advertisement (MAX)'); } else { advertisementText.setText('Advertisement $' + advertisementCost); } } var ADVERTISEMENT_MAX_LEVEL = 5; advertisementButton.down = function () { if (advertisementLevel >= ADVERTISEMENT_MAX_LEVEL) { LK.effects.flashObject(advertisementButton, 0xFF0000, 500); return; } if (money >= advertisementCost) { money -= advertisementCost; advertisementLevel++; advertisementCost = 100 * (advertisementLevel + 1); storage.advertisementLevel = advertisementLevel; storage.advertisementCost = advertisementCost; storage.money = money; LK.effects.flashObject(advertisementButton, 0x00FF00, 500); updateAdvertisementText(); } }; updateAdvertisementText(); // --- Customer Speed Upgrade Button below Advertisement --- var customerSpeedLevel = typeof storage.customerSpeedLevel !== "undefined" ? storage.customerSpeedLevel : 0; var customerSpeedCost = typeof storage.customerSpeedCost !== "undefined" ? storage.customerSpeedCost : 50; var CUSTOMER_SPEED_MAX_LEVEL = 5; var customerSpeedButton = game.addChild(LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, x: 500, y: 2360 })); var customerSpeedText = new Text2('Customer Speed $' + customerSpeedCost, { size: 36, fill: 0xFFFFFF, wordWrap: true, wordWrapWidth: 260 }); customerSpeedText.anchor.set(0.5, 0.5); customerSpeedText.x = 500; customerSpeedText.y = 2360; game.addChild(customerSpeedText); function updateCustomerSpeedText() { if (customerSpeedLevel >= CUSTOMER_SPEED_MAX_LEVEL) { customerSpeedText.setText('Customer Speed (MAX)'); } else { customerSpeedText.setText('Customer Speed $' + customerSpeedCost); } } customerSpeedButton.down = function () { if (customerSpeedLevel < CUSTOMER_SPEED_MAX_LEVEL && money >= customerSpeedCost) { money -= customerSpeedCost; customerSpeedLevel++; customerSpeedCost = customerSpeedCost * 2; // Only update current branch's customerSpeedLevel and derived stats if (branches[currentBranchIndex]) { branches[currentBranchIndex].customerSpeedLevel = customerSpeedLevel; branches[currentBranchIndex].customerSpeed = 3 * Math.pow(1.2, customerSpeedLevel); } // Update local variable from branch customerSpeed = branches[currentBranchIndex].customerSpeed; storage.customerSpeedLevel = customerSpeedLevel; storage.customerSpeedCost = customerSpeedCost; storage.money = money; LK.effects.flashObject(customerSpeedButton, 0x00FF00, 500); updateCustomerSpeedText(); } }; updateCustomerSpeedText(); // Add table button var addTableButton = game.addChild(LK.getAsset('addTableButton', { anchorX: 0.5, anchorY: 0.5, x: 1500, y: 2200 })); var addTableCost = typeof storage.addTableCost !== "undefined" ? storage.addTableCost : 200 * (tableCount - 1 + 1); // 200, 400, 600, ... var addTableText = new Text2('Add Table $' + addTableCost, { size: 36, fill: 0xFFFFFF, wordWrap: true, wordWrapWidth: 260 }); addTableText.anchor.set(0.5, 0.5); addTableText.x = 1500; addTableText.y = 2200; game.addChild(addTableText); function updateAddTableText() { addTableText.setText('Add Table $' + addTableCost); } addTableButton.down = function () { if (money >= addTableCost && tables.length < 20 && branches.length <= 5) { money -= addTableCost; createTable(tables.length); tableCount++; addTableCost = 200 * (tableCount - 1 + 1); storage.tableCount = tableCount; storage.addTableCost = addTableCost; storage.money = money; LK.effects.flashObject(addTableButton, 0x00FF00, 500); updateAddTableText(); } else if (branches.length > 5) { LK.effects.flashObject(addTableButton, 0xFF0000, 500); } }; updateAddTableText(); // --- New Restaurant Button --- var branches = typeof storage.branches !== "undefined" ? storage.branches : [{ name: "Main Branch", // Remove per-branch money, use only global money restaurantLevel: restaurantLevel, tableCount: tableCount, addTableCost: addTableCost, advertisementLevel: advertisementLevel, advertisementCost: advertisementCost, customerSpeedLevel: customerSpeedLevel, customerSpeedCost: customerSpeedCost, foodSales: foodSales.slice() // Add more per-branch state as needed }]; var currentBranchIndex = typeof storage.currentBranchIndex !== "undefined" ? storage.currentBranchIndex : 0; function saveBranches() { try { // Deep clone branches to avoid circular references and non-serializable objects var serializableBranches = []; for (var i = 0; i < branches.length; i++) { var b = branches[i]; var branchCopy = {}; for (var key in b) { // Only copy serializable properties (skip objects/functions) if (_typeof(b[key]) !== "object" && typeof b[key] !== "function") { branchCopy[key] = b[key]; } else if (Array.isArray(b[key])) { // Shallow copy arrays (e.g. foodSales) branchCopy[key] = b[key].slice(); } } // Always save upgradeSpeedLevel for background upgrades if (typeof b.upgradeSpeedLevel !== "undefined") { branchCopy.upgradeSpeedLevel = b.upgradeSpeedLevel; } serializableBranches.push(branchCopy); } storage.branches = serializableBranches; storage.currentBranchIndex = currentBranchIndex; } catch (e) { console.log("Error saving branches to storage:", e); } } function loadBranch(idx) { // Save current branch state before switching if (branches[currentBranchIndex]) { // Do not save per-branch money, only save other state branches[currentBranchIndex].restaurantLevel = restaurantLevel; branches[currentBranchIndex].tableCount = tableCount; branches[currentBranchIndex].addTableCost = addTableCost; branches[currentBranchIndex].advertisementLevel = advertisementLevel; branches[currentBranchIndex].advertisementCost = advertisementCost; branches[currentBranchIndex].customerSpeedLevel = customerSpeedLevel; branches[currentBranchIndex].customerSpeedCost = customerSpeedCost; branches[currentBranchIndex].foodSales = foodSales.slice(); // Save waiterSpeed and cookingSpeed for this branch branches[currentBranchIndex].waiterSpeed = waiterSpeed; branches[currentBranchIndex].cookingSpeed = cookingSpeed; // Add more per-branch state as needed } // Load new branch state var b = branches[idx]; if (b) { // Do not load per-branch money, always use global money restaurantLevel = b.restaurantLevel; tableCount = b.tableCount; addTableCost = b.addTableCost; advertisementLevel = b.advertisementLevel; advertisementCost = b.advertisementCost; customerSpeedLevel = b.customerSpeedLevel; customerSpeedCost = b.customerSpeedCost; upgradeSpeedLevel = typeof b.upgradeSpeedLevel !== "undefined" ? b.upgradeSpeedLevel : 0; for (var i = 0; i < foodSales.length; i++) foodSales[i] = b.foodSales[i] || 0; // Always restore all upgrade effects from the selected branch waiterSpeed = typeof b.waiterSpeed !== "undefined" ? b.waiterSpeed : 4; customerSpeed = typeof b.customerSpeed !== "undefined" ? b.customerSpeed : 3; cookingSpeed = typeof b.cookingSpeed !== "undefined" ? b.cookingSpeed : 180; // Reset tables, customers, etc. // Remove old tables for (var i = tables.length - 1; i >= 0; i--) { if (tables[i] && tables[i].destroy) tables[i].destroy(); tables.splice(i, 1); orderTaken.splice(i, 1); tableReservations.splice(i, 1); } // Re-create tables for (var i = 0; i < tableCount; i++) { createTable(i); } // Remove all customers for (var i = customers.length - 1; i >= 0; i--) { if (customers[i] && customers[i].destroy) customers[i].destroy(); customers.splice(i, 1); } // Remove waiter and reset active order if (typeof waiter !== "undefined" && waiter && waiter.destroy) { waiter.destroy(); } waiter = game.addChild(new Waiter()); // Spawn main waiter in front of the register (kasa) waiter.x = registerX - 120; waiter.y = registerY + 60; // Reset waiter's state waiter.state = 'idle'; waiter.targetTable = null; waiter.hasFood = false; waiter.food = null; waiter.carryingFoodType = -1; waiter.targetTableIndex = -1; waiter.servingTableIndex = -1; waiter.hasDrink = false; waiter.drink = null; waiter.carryingDrinkType = -1; // Reset upgrades UI updateAddTableText(); updateAdvertisementText(); updateCustomerSpeedText(); updateUpgradeText(); // Update current branch name display if (typeof updateCurrentBranchNameText === "function") updateCurrentBranchNameText(); // Reset last sold food info lastSoldFoodName = ''; lastSoldFoodPrice = 0; // Save currentBranchIndex = idx; saveBranches(); } } // --- New Restaurant Cost: 5000, 10000, 15000, ... (her yeni şube için 5000 artar) --- var newRestaurantCost = 5000 * branches.length; // 1. şube: 5000, 2. şube: 10000, 3. şube: 15000, ... if (branches.length === 0) newRestaurantCost = 5000; // fallback for 0 branch edge case // New Restaurant button with background image var newRestaurantButtonBg = game.addChild(LK.getAsset('newRestaurantButton', { anchorX: 0.5, anchorY: 0.5, x: 1500, y: 2280 })); var newRestaurantButton = new Text2('New Restaurant $' + newRestaurantCost, { size: 36, fill: 0xFFFFFF, wordWrap: true, wordWrapWidth: 260 }); newRestaurantButton.anchor.set(0.5, 0.5); newRestaurantButton.x = 1500; newRestaurantButton.y = 2280; game.addChild(newRestaurantButton); function updateNewRestaurantButton() { newRestaurantCost = 5000 * branches.length; if (branches.length === 0) newRestaurantCost = 5000; newRestaurantButton.setText('New Restaurant $' + newRestaurantCost); } newRestaurantButton.interactive = true; newRestaurantButton.buttonMode = true; newRestaurantButton.down = function () { if (branches.length >= 5) { LK.effects.flashObject(newRestaurantButtonBg, 0xFF0000, 500); return; } if (money >= newRestaurantCost) { money -= newRestaurantCost; // All upgrades start at 0 for new branch var newBranch = { name: "Branch " + (branches.length + 1), restaurantLevel: 1, tableCount: 2, addTableCost: 200, advertisementLevel: 0, advertisementCost: 100, customerSpeedLevel: 0, customerSpeedCost: 50, upgradeSpeedLevel: 0, waiterSpeed: 4, customerSpeed: 3, cookingSpeed: 180, foodSales: function () { var arr = []; for (var i = 0; i < foodTypes.length; i++) arr[i] = 0; return arr; }() }; // Recalculate waiterSpeed for new branch (should be base speed) if (typeof waiterBaseSpeed === "undefined") { waiterBaseSpeed = 4; } waiterSpeed = typeof branches[currentBranchIndex] !== "undefined" && typeof branches[currentBranchIndex].waiterSpeed !== "undefined" ? branches[currentBranchIndex].waiterSpeed : waiterBaseSpeed; cookingSpeed = typeof branches[currentBranchIndex] !== "undefined" && typeof branches[currentBranchIndex].cookingSpeed !== "undefined" ? branches[currentBranchIndex].cookingSpeed : 180; branches.push(newBranch); saveBranches(); updateNewRestaurantButton(); LK.effects.flashObject(newRestaurantButtonBg, 0x00FF00, 500); } }; updateNewRestaurantButton(); // --- Rivals Button (2 rows above register) --- var rivalsButtonBg = game.addChild(LK.getAsset('branchesButton', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: registerY - 2 * 80 - 40 // 2 rows above register, 80px per row, 40px margin })); var rivalsButton = new Text2('Rivals', { size: 36, fill: 0xFFFFFF, wordWrap: true, wordWrapWidth: 260 }); rivalsButton.anchor.set(0.5, 0.5); rivalsButton.x = 1024; rivalsButton.y = registerY - 2 * 80 - 40; game.addChild(rivalsButton); rivalsButton.interactive = true; rivalsButton.buttonMode = true; // --- Rivals Panel --- var rivalsPanel = null; // Helper to hide panel (set visible = false) function hideRivalsPanel() { if (rivalsPanel) { rivalsPanel.visible = false; } } var rivalCompanies = [{ name: "Foodify", color: 0xff6347 }, { name: "QuickBite", color: 0x8b4513 }, { name: "Mealio", color: 0xffa500 }, { name: "Snackster", color: 0x32cd32 }, { name: "DineDash", color: 0xffd700 }, { name: "ChowNow", color: 0x6ad1e3 }, { name: "SliceBox", color: 0x8b0000 }, { name: "Lunchly", color: 0xf7b32b }, { name: "Eatzy", color: 0xf4a259 }, { name: "Grubster", color: 0xf7e7ce }]; // Persistent state for shares and prices if (typeof storage.rivalShares === "undefined") { storage.rivalShares = []; for (var i = 0; i < rivalCompanies.length; i++) storage.rivalShares[i] = 0; } if (typeof storage.rivalPrices === "undefined") { storage.rivalPrices = []; for (var i = 0; i < rivalCompanies.length; i++) storage.rivalPrices[i] = 1000 + Math.floor(Math.random() * 500); } var rivalShares = storage.rivalShares; var rivalPrices = storage.rivalPrices; // Helper to save rivals state function saveRivals() { storage.rivalShares = rivalShares.slice(); storage.rivalPrices = rivalPrices.slice(); } // Randomly update rival prices every 5 seconds if (typeof game.rivalPriceTimer === "undefined") { game.rivalPriceTimer = 0; } game.updateRivalPrices = function () { // Each price can move randomly, but must stay between -10% and +20% of its initial value for (var i = 0; i < rivalPrices.length; i++) { // Store initial price for each company (if not already) if (!storage.rivalInitialPrices) storage.rivalInitialPrices = []; if (typeof storage.rivalInitialPrices[i] !== "number") { storage.rivalInitialPrices[i] = rivalPrices[i]; } var initial = storage.rivalInitialPrices[i]; var minPrice = Math.round(initial * 0.9); var maxPrice = Math.round(initial * 1.2); // Randomly move up or down by 1% to 5% of initial price var direction = Math.random() < 0.5 ? -1 : 1; var percent = 0.01 + Math.random() * 0.04; // 1% to 5% var delta = Math.round(initial * percent) * direction; var newPrice = rivalPrices[i] + delta; if (newPrice < minPrice) newPrice = minPrice; if (newPrice > maxPrice) newPrice = maxPrice; rivalPrices[i] = newPrice; } saveRivals(); }; game.rivalPriceTimer = 0; // Show Rivals Panel function showRivalsPanel() { if (rivalsPanel && rivalsPanel.parent) { rivalsPanel.parent.removeChild(rivalsPanel); rivalsPanel = null; return; } rivalsPanel = new Container(); // Panel background // Use panel background, enlarged to fit all text and controls var rivalsPanelBgWidth = 1200; var rivalsPanelBgHeight = 1100; var panelBg = LK.getAsset('rivalsPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 1024 + 240, y: 1366, width: rivalsPanelBgWidth, height: rivalsPanelBgHeight }); panelBg.alpha = 0.98; rivalsPanel.addChild(panelBg); // Title var panelTitle = new Text2('Rivals', { size: 48, fill: 0xFFFFFF, font: "'GillSans',Tahoma" }); panelTitle.anchor.set(0.5, 0); // Center title on new panel background panelTitle.x = 1024 + 240; panelTitle.y = 900; rivalsPanel.addChild(panelTitle); // List companies for (var i = 0; i < rivalCompanies.length; i++) { (function (idx) { var yBase = 1000 + idx * 90; // Company name var nameText = new Text2(rivalCompanies[idx].name, { size: 36, fill: rivalCompanies[idx].color, font: "'GillSans',Tahoma" }); nameText.anchor.set(0, 0); // Align to left edge of new panel (panel x = 1024+240, width = 1200) nameText.x = 1024 + 240 - 600 + 40; nameText.y = yBase; rivalsPanel.addChild(nameText); // Price var priceText = new Text2('Price: $' + rivalPrices[idx], { size: 32, fill: 0xFFFFFF, font: "'GillSans',Tahoma" }); priceText.anchor.set(0, 0); // Place price 300px to the right of name priceText.x = 1024 + 240 - 600 + 340; priceText.y = yBase; rivalsPanel.addChild(priceText); // Cost label under price // Calculate average cost per share as the average of actual prices paid for shares var avgCost = 0; if (!storage.rivalAvgCosts) storage.rivalAvgCosts = []; if (typeof storage.rivalAvgCosts[idx] === "number") { avgCost = storage.rivalAvgCosts[idx]; } else { avgCost = 0; } var avgCostDisplay = '-'; // Only show average cost if shares are owned and cost is > 0 if (rivalShares[idx] > 0 && storage.rivalAvgCosts && typeof storage.rivalAvgCosts[idx] === "number" && storage.rivalAvgCosts[idx] > 0) { avgCostDisplay = '$' + Math.round(storage.rivalAvgCosts[idx]); } var costText = new Text2('Average: ' + avgCostDisplay, { size: 28, fill: 0xCCCCCC, font: "'GillSans',Tahoma" }); costText.anchor.set(0, 0); // Place cost label directly under price (about 36px lower) costText.x = priceText.x; costText.y = priceText.y + 36; rivalsPanel.addChild(costText); // Shares owned var sharesText = new Text2('Shares: %' + rivalShares[idx] * 10, { size: 32, fill: 0xFFFF00, font: "'GillSans',Tahoma" }); sharesText.anchor.set(0, 0); // Place shares 300px to the right of price sharesText.x = 1024 + 240 - 600 + 640; sharesText.y = yBase; rivalsPanel.addChild(sharesText); // Buy button var buyBtn = new Text2('Buy (10%)', { size: 28, fill: 0x00FF00, font: "'GillSans',Tahoma" }); buyBtn.anchor.set(0.5, 0.5); // Place buy button 200px to the right of shares buyBtn.x = 1024 + 240 - 600 + 940; buyBtn.y = yBase + 20; buyBtn.interactive = true; buyBtn.buttonMode = true; buyBtn.down = function () { if (rivalShares[idx] < 10) { // Use the actual price paid for this share (not the rounded 10% cost) var sharePrice = rivalPrices[idx]; var cost = Math.round(sharePrice * 0.1); if (money >= cost) { money -= cost; rivalShares[idx]++; // --- Average cost tracking --- if (!storage.rivalAvgCosts) storage.rivalAvgCosts = []; if (typeof storage.rivalAvgCosts[idx] !== "number") storage.rivalAvgCosts[idx] = 0; var prevShares = rivalShares[idx] - 1; var prevAvg = storage.rivalAvgCosts[idx]; // Use the actual price paid for this share (sharePrice) if (prevShares > 0) { storage.rivalAvgCosts[idx] = (prevAvg * prevShares + sharePrice) / (prevShares + 1); } else { storage.rivalAvgCosts[idx] = sharePrice; } saveRivals(); LK.effects.flashObject(buyBtn, 0x00FF00, 500); showRivalsPanel(); } else { LK.effects.flashObject(buyBtn, 0xFF0000, 500); } } else { LK.effects.flashObject(buyBtn, 0xFF0000, 500); } }; rivalsPanel.addChild(buyBtn); // Sell button var sellBtn = new Text2('Sell (10%)', { size: 28, fill: 0xFF0000, font: "'GillSans',Tahoma" }); sellBtn.anchor.set(0.5, 0.5); // Place sell button 150px to the right of buy sellBtn.x = 1024 + 240 - 600 + 1090; sellBtn.y = yBase + 20; sellBtn.interactive = true; sellBtn.buttonMode = true; sellBtn.down = function () { if (rivalShares[idx] > 0) { var gain = Math.round(rivalPrices[idx] * 0.1); money += gain; rivalShares[idx]--; // --- Average cost tracking on sell --- if (!storage.rivalAvgCosts) storage.rivalAvgCosts = []; if (typeof storage.rivalAvgCosts[idx] !== "number") storage.rivalAvgCosts[idx] = 0; // If all shares sold, reset average cost to 0 if (rivalShares[idx] === 0) { storage.rivalAvgCosts[idx] = 0; } saveRivals(); LK.effects.flashObject(sellBtn, 0x00FF00, 500); showRivalsPanel(); } else { LK.effects.flashObject(sellBtn, 0xFF0000, 500); } }; rivalsPanel.addChild(sellBtn); })(i); } // Close button var closeBtn = new Text2('Close', { size: 36, fill: 0xFFFFFF }); closeBtn.anchor.set(1, 0); // Place close button at top right of new panel background (1200px wide, centered at x=1024+240) closeBtn.x = 1024 + 240 + 600 - 24; closeBtn.y = 900 + 16; closeBtn.interactive = true; closeBtn.buttonMode = true; closeBtn.down = function () { if (rivalsPanel && rivalsPanel.parent) { rivalsPanel.parent.removeChild(rivalsPanel); rivalsPanel = null; } }; rivalsPanel.addChild(closeBtn); rivalsPanel.visible = true; game.addChild(rivalsPanel); } rivalsButton.down = function () { showRivalsPanel(); }; // --- Branches Button --- // Branches button with background image var branchesButtonBg = game.addChild(LK.getAsset('branchesButton', { anchorX: 0.5, anchorY: 0.5, x: 1500, y: 2360 })); var branchesButton = new Text2('Branches', { size: 36, fill: 0xFFFFFF, wordWrap: true, wordWrapWidth: 260 }); branchesButton.anchor.set(0.5, 0.5); branchesButton.x = 1500; branchesButton.y = 2360; game.addChild(branchesButton); branchesButton.interactive = true; branchesButton.buttonMode = true; // --- Branches Panel --- var branchesPanel = null; // Helper to hide panel (set visible = false) function hideBranchesPanel() { if (branchesPanel) { branchesPanel.visible = false; } } function showBranchesPanel() { if (branchesPanel && branchesPanel.parent) { branchesPanel.parent.removeChild(branchesPanel); branchesPanel = null; return; } branchesPanel = new Container(); // Panel background // Use panel background at its native resolution, do not scale up var panelBg = LK.getAsset('branchesPanelBg', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366 }); panelBg.alpha = 0.98; branchesPanel.addChild(panelBg); // Title var panelTitle = new Text2('Branches', { size: 48, fill: 0xFFFFFF, font: "'GillSans',Tahoma" }); panelTitle.anchor.set(0.5, 0); panelTitle.x = 1024; panelTitle.y = 900; branchesPanel.addChild(panelTitle); // List branches // --- Layout constants for alignment --- var panelCenterX = 1024; var panelStartY = 1000; var branchRowHeight = 170; var nameY = 0; var earningsY = 38; var upgradeY = 68; var btnY = 110; var spacerY = 150; var nameFontSize = 44; var earningsFontSize = 32; var upgradeFontSize = 26; var btnFontSize = 32; var nameColor = 0xFFFFFF; var earningsColor = 0xFFFF00; var upgradeColor = 0x00FFFF; var btnColor = 0xFFFFFF; var branchPanelWidth = 800; var leftColX = panelCenterX - branchPanelWidth / 2 + 40; var rightColX = panelCenterX + branchPanelWidth / 2 - 40; for (var i = 0; i < branches.length; i++) { (function (idx) { var b = branches[idx]; var yBase = panelStartY + idx * branchRowHeight; var branchBtn = new Text2((idx === currentBranchIndex ? '▶ ' : '') + b.name, { size: nameFontSize, fill: nameColor, font: "'GillSans',Tahoma" }); branchBtn.anchor.set(0.5, 0); branchBtn.x = panelCenterX; branchBtn.y = yBase + nameY; branchBtn.interactive = true; branchBtn.buttonMode = true; branchBtn.down = function () { if (idx !== currentBranchIndex) { loadBranch(idx); showBranchesPanel(); } }; branchesPanel.addChild(branchBtn); // --- Show per-branch total earnings under each branch --- var branchTotalEarnings = 0; if (b.foodSales && Array.isArray(b.foodSales)) { for (var fs = 0; fs < b.foodSales.length; fs++) { var price = typeof foodPrices !== "undefined" && foodPrices[fs] !== undefined ? foodPrices[fs] : 0; var branchPanelUpgradeLevel = typeof b.upgradeSpeedLevel !== "undefined" ? b.upgradeSpeedLevel : 0; var branchPanelEarningMultiplier = Math.pow(1.25, branchPanelUpgradeLevel); branchTotalEarnings += (b.foodSales[fs] || 0) * Math.round(price * branchPanelEarningMultiplier); } } var branchEarningsText = new Text2('Total Earnings: $' + branchTotalEarnings, { size: earningsFontSize, fill: earningsColor, font: "'GillSans',Tahoma" }); branchEarningsText.anchor.set(0.5, 0); branchEarningsText.x = panelCenterX; branchEarningsText.y = yBase + earningsY; branchesPanel.addChild(branchEarningsText); // Show upgrade level for background earnings var branchUpgradeLevel = typeof b.upgradeSpeedLevel !== "undefined" ? b.upgradeSpeedLevel : 0; var branchUpgradeText = new Text2('Background Speed Upgrade: Level ' + branchUpgradeLevel, { size: upgradeFontSize, fill: upgradeColor, font: "'GillSans',Tahoma" }); branchUpgradeText.anchor.set(0.5, 0); branchUpgradeText.x = panelCenterX; branchUpgradeText.y = yBase + upgradeY; branchesPanel.addChild(branchUpgradeText); // --- Upgrade button (except for main branch) --- if (idx > 0) { var upgradeLevel = typeof b.upgradeSpeedLevel !== "undefined" ? b.upgradeSpeedLevel : 0; var upgradeCost = 500 * (upgradeLevel + 1); var branchUpgradeBtnText = new Text2(upgradeLevel >= 5 ? "Upgrade (MAX)" : "Upgrade $" + upgradeCost, { size: btnFontSize, fill: btnColor, font: "'GillSans',Tahoma" }); branchUpgradeBtnText.anchor.set(0.5, 0.5); branchUpgradeBtnText.x = panelCenterX; branchUpgradeBtnText.y = yBase + btnY; branchUpgradeBtnText.interactive = true; branchUpgradeBtnText.buttonMode = true; branchUpgradeBtnText.down = function () { var upgradeLevel = typeof b.upgradeSpeedLevel !== "undefined" ? b.upgradeSpeedLevel : 0; var upgradeCost = 500 * (upgradeLevel + 1); if (money >= upgradeCost && upgradeLevel < 5) { money -= upgradeCost; b.upgradeSpeedLevel = upgradeLevel + 1; saveBranches(); LK.effects.flashObject(branchUpgradeBtnText, 0x00FF00, 500); showBranchesPanel(); } else { LK.effects.flashObject(branchUpgradeBtnText, 0xFF0000, 500); } }; branchesPanel.addChild(branchUpgradeBtnText); // --- Add white text row between branches (except after last) --- var spacerText = new Text2(' ', { size: 36, fill: 0xFFFFFF, font: "'GillSans',Tahoma" }); spacerText.anchor.set(0.5, 0); spacerText.x = panelCenterX; spacerText.y = yBase + spacerY; branchesPanel.addChild(spacerText); } })(i); } // Close button var closeBtn = new Text2('Close', { size: 36, fill: 0xFFFFFF }); // Anchor top right closeBtn.anchor.set(1, 0); // Place at top right of the panel background (800px wide, centered at x=1024) closeBtn.x = 1024 + 400 - 24; // 1024 + half width - margin closeBtn.y = 900 + 16; // panel top y + margin closeBtn.interactive = true; closeBtn.buttonMode = true; closeBtn.down = function () { if (branchesPanel && branchesPanel.parent) { branchesPanel.parent.removeChild(branchesPanel); branchesPanel = null; } }; branchesPanel.addChild(closeBtn); branchesPanel.visible = true; game.addChild(branchesPanel); } branchesButton.down = function () { showBranchesPanel(); }; // Customer spawn timer var customerSpawnTimer = 0; // Game update game.update = function () { // Update rival prices every 5 seconds game.rivalPriceTimer++; if (game.rivalPriceTimer >= 300) { game.updateRivalPrices(); game.rivalPriceTimer = 0; } // Update all waiters (main and extra) if (typeof waiter !== "undefined" && waiter.update) waiter.update(); if (typeof game !== "undefined" && game.extraWaiters) { for (var w = 0; w < game.extraWaiters.length; w++) { if (game.extraWaiters[w] && game.extraWaiters[w].update) game.extraWaiters[w].update(); } } // Update all chefs (main and extra) if (typeof chef !== "undefined" && chef.update) chef.update(); if (typeof game !== "undefined" && game.extraChefs) { for (var c = 0; c < game.extraChefs.length; c++) { if (game.extraChefs[c] && game.extraChefs[c].update) game.extraChefs[c].update(); } } // --- Bank Credit/Deposit Processing --- // Use day counter for due checks if (bankCreditActive) { if (typeof bankCreditDueDay === "undefined" && typeof storage.bankCreditDueDay !== "undefined") { bankCreditDueDay = storage.bankCreditDueDay; } if (typeof bankCreditDueDay === "undefined") { // Fallback to tick-based if not set if (LK.ticks >= bankCreditDueTick) { var payAmount = Math.floor(bankCreditAmount * 1.10); if (money >= payAmount) { money -= payAmount; bankCreditActive = false; bankCreditAmount = 0; bankCreditDueTick = 0; } else { money = 0; bankCreditActive = false; bankCreditAmount = 0; bankCreditDueTick = 0; } storage.money = money; } } else if (day >= bankCreditDueDay) { var payAmount = Math.floor(bankCreditAmount * 1.10); if (money >= payAmount) { money -= payAmount; bankCreditActive = false; bankCreditAmount = 0; bankCreditDueTick = 0; bankCreditDueDay = undefined; storage.bankCreditDueDay = undefined; } else { money = 0; bankCreditActive = false; bankCreditAmount = 0; bankCreditDueTick = 0; bankCreditDueDay = undefined; storage.bankCreditDueDay = undefined; } storage.money = money; } } if (bankDepositActive) { if (typeof bankDepositDueDay === "undefined" && typeof storage.bankDepositDueDay !== "undefined") { bankDepositDueDay = storage.bankDepositDueDay; } if (typeof bankDepositDueDay === "undefined") { // Fallback to tick-based if not set if (LK.ticks >= bankDepositDueTick) { var returnAmount = Math.floor(bankDepositAmount * 1.20); money += returnAmount; bankDepositActive = false; bankDepositAmount = 0; bankDepositDueTick = 0; storage.money = money; } } else if (day >= bankDepositDueDay) { var returnAmount = Math.floor(bankDepositAmount * 1.20); money += returnAmount; bankDepositActive = false; bankDepositAmount = 0; bankDepositDueTick = 0; bankDepositDueDay = undefined; storage.bankDepositDueDay = undefined; storage.money = money; } } // Update money display moneyText.setText('Money: $' + money); // --- Day update --- if (typeof game.lastDayTick === "undefined") game.lastDayTick = 0; if (typeof game.lastDay === "undefined") game.lastDay = day; if (LK.ticks - game.lastDayTick >= 1440) { // 1440 ticks = 24 hours at 60fps day++; game.lastDayTick = LK.ticks; storage.day = day; } dayText.setText('Day: ' + day); // --- Live update for Rivals Panel --- if (rivalsPanel && rivalsPanel.visible) { // Find all children and update their text if they are price/cost/shares for (var i = 0; i < rivalCompanies.length; i++) { // Find priceText, costText, sharesText for this idx var yBase = 1000 + i * 90; for (var j = 0; j < rivalsPanel.children.length; j++) { var child = rivalsPanel.children[j]; // Price if (child && child.x === 1024 + 240 - 600 + 340 && child.y === yBase) { child.setText('Price: $' + rivalPrices[i]); } // Cost if (child && child.x === 1024 + 240 - 600 + 340 && child.y === yBase + 36) { var avgCostDisplay = '-'; if (rivalShares[i] > 0 && storage.rivalAvgCosts && typeof storage.rivalAvgCosts[i] === "number" && storage.rivalAvgCosts[i] > 0) { avgCostDisplay = '$' + Math.round(storage.rivalAvgCosts[i]); } child.setText('Average: ' + avgCostDisplay); } // Shares if (child && child.x === 1024 + 240 - 600 + 640 && child.y === yBase) { child.setText('Shares: %' + rivalShares[i] * 10); } } } } // --- Live update for Branches Panel --- // --- Live update for current branch name --- if (typeof updateCurrentBranchNameText === "function") updateCurrentBranchNameText(); if (branchesPanel && branchesPanel.visible) { for (var i = 0; i < branches.length; i++) { var b = branches[i]; var yBase = 1000 + i * 170; var branchTotalEarnings = 0; if (b.foodSales && Array.isArray(b.foodSales)) { for (var fs = 0; fs < b.foodSales.length; fs++) { var price = typeof foodPrices !== "undefined" && foodPrices[fs] !== undefined ? foodPrices[fs] : 0; var branchPanelUpgradeLevel = typeof b.upgradeSpeedLevel !== "undefined" ? b.upgradeSpeedLevel : 0; var branchPanelEarningMultiplier = Math.pow(1.25, branchPanelUpgradeLevel); branchTotalEarnings += (b.foodSales[fs] || 0) * Math.round(price * branchPanelEarningMultiplier); } } // Update earnings text and upgrade level text for (var j = 0; j < branchesPanel.children.length; j++) { var child = branchesPanel.children[j]; // Earnings if (child && child.x === 1024 && child.y === yBase + 38) { child.setText('Total Earnings: $' + branchTotalEarnings); } // Upgrade level if (child && child.x === 1024 && child.y === yBase + 68) { var branchUpgradeLevel = typeof b.upgradeSpeedLevel !== "undefined" ? b.upgradeSpeedLevel : 0; child.setText('Background Speed Upgrade: Level ' + branchUpgradeLevel); } // Upgrade button (for non-main branches) if (i > 0 && child && child.x === 1024 && child.y === yBase + 110) { var upgradeLevel = typeof b.upgradeSpeedLevel !== "undefined" ? b.upgradeSpeedLevel : 0; var upgradeCost = 500 * (upgradeLevel + 1); child.setText(upgradeLevel >= 5 ? "Upgrade (MAX)" : "Upgrade $" + upgradeCost); } // Branch name (show selector arrow if current) if (child && child.x === 1024 && child.y === yBase) { child.setText((i === currentBranchIndex ? '▶ ' : '') + b.name); // Always force white color for branch name child.setStyle({ fill: 0xFFFFFF }); } } } } // Update Top 5 Most Sold Foods Panel // Find top 5 indices by sales count (only foodSales, not drinks) var topIndices = []; for (var i = 0; i < foodSales.length; i++) topIndices.push(i); topIndices.sort(function (a, b) { return foodSales[b] - foodSales[a]; }); for (var i = 0; i < 5; i++) { var idx = topIndices[i]; if (foodSales[idx] > 0) { // Show food icon, count, and total earned // Create icon if not already present if (!top5TextLines[i].foodIcon) { var icon = LK.getAsset(foodImageIds[idx], { anchorX: 0.5, anchorY: 0.5, // Place icon to the left of the text, with a small margin x: top5TextLines[i].x - 50, y: top5TextLines[i].y + 20, width: 40, height: 40 }); game.addChild(icon); top5TextLines[i].foodIcon = icon; } else { // Update icon to correct food type and position top5TextLines[i].foodIcon.setAsset(foodImageIds[idx]); // Place icon to the left of the text, with a small margin top5TextLines[i].foodIcon.x = top5TextLines[i].x - 50; top5TextLines[i].foodIcon.y = top5TextLines[i].y + 20; top5TextLines[i].foodIcon.visible = true; } // Calculate total earned for this food, with 25% per-upgrade multiplicative bonus for active branch var activeBranchUpgradeLevel = typeof upgradeSpeedLevel !== "undefined" ? upgradeSpeedLevel : 0; var earningMultiplier = Math.pow(1.25, activeBranchUpgradeLevel); var totalEarned = foodSales[idx] * Math.round(foodPrices[idx] * earningMultiplier); top5TextLines[i].setText(i + 1 + '. ' + foodNames[idx] + ' - ' + foodSales[idx] + ' pcs $' + totalEarned); } else { top5TextLines[i].setText(''); // Hide icon if present if (top5TextLines[i].foodIcon) { top5TextLines[i].foodIcon.visible = false; } } } // Spawn customers customerSpawnTimer++; if (customerSpawnTimer > 300) { // Every 5 seconds customerSpawnTimer = 0; // Check if there are waiting customers first var hasWaitingCustomer = false; for (var j = 0; j < customers.length; j++) { if (customers[j].state === 'entering' && !customers[j].targetTable) { hasWaitingCustomer = true; // Set waiting customer's position to the exit (register) location customers[j].x = registerX; customers[j].y = registerY; // Try to assign a table to waiting customer for (var k = 0; k < tables.length; k++) { if (!tables[k].occupied && !tables[k].customer && !tableReservations[k]) { customers[j].targetTable = tables[k]; customers[j].targetTableIndex = k; tableReservations[k] = true; // Reserve the table break; } } break; } } // Only spawn new customer if no one is waiting if (!hasWaitingCustomer) { // Başlangıçta müşteri sayısı 1, her reklam yükseltmesinde +2 müşteri var advLevel = typeof advertisementLevel !== "undefined" ? advertisementLevel : typeof storage.advertisementLevel !== "undefined" ? storage.advertisementLevel : 0; var spawnCount = 1 + 2 * advLevel; for (var spawnIdx = 0; spawnIdx < spawnCount; spawnIdx++) { var customer = game.addChild(new Customer()); // Customers now enter from the exit (register) location customer.x = registerX; customer.y = registerY; customers.push(customer); // Try to find available table for (var i = 0; i < tables.length; i++) { if (!tables[i].occupied && !tables[i].customer && !tableReservations[i]) { customer.targetTable = tables[i]; customer.targetTableIndex = i; tableReservations[i] = true; // Reserve the table break; } } // If no table available, customer will wait } } } // Simulate background sales for all branches (except current) // Background branches earn at 10% speed, but can be increased by upgrades if (LK.ticks % 60 === 0 && branches.length > 1) { for (var bidx = 0; bidx < branches.length; bidx++) { if (bidx === currentBranchIndex) continue; var b = branches[bidx]; // Calculate background earning multiplier: base 0.1 (10%), each upgrade increases by 25% multiplicatively var branchUpgradeLevel = typeof b.upgradeSpeedLevel !== "undefined" ? b.upgradeSpeedLevel : 0; var backgroundMultiplier = 0.1 * Math.pow(1.25, branchUpgradeLevel); if (backgroundMultiplier > 1) backgroundMultiplier = 1; // Simulate a small number of sales per tick (e.g. 0-2 random sales) var salesCount = Math.floor(Math.random() * 3); // 0, 1, or 2 // Apply multiplier (simulate fractional sales probabilistically) var effectiveSales = 0; for (var s = 0; s < salesCount; s++) { if (Math.random() < backgroundMultiplier) { effectiveSales++; } } for (var s = 0; s < effectiveSales; s++) { // Pick a random food type var foodIdx = Math.floor(Math.random() * foodTypes.length); if (!b.foodSales) b.foodSales = []; if (typeof b.foodSales[foodIdx] !== "number") b.foodSales[foodIdx] = 0; b.foodSales[foodIdx]++; // Add money to global money if (typeof foodPrices[foodIdx] === "number") { money += foodPrices[foodIdx]; } } } } // Save periodically if (LK.ticks % 300 === 0) { storage.money = money; } };
===================================================================
--- original.js
+++ change.js
Chair - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Chef - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Müşteri - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Bayan Müşteri - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Müşteri - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Garson - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Üstten görünüm table - Yazısız - Gerçekçi. In-Game asset. 2d. High contrast. No shadows
Masa ve sandalyesiz - üstten görünüm restaurant gerçekçi - yazısız. In-Game asset. 2d. High contrast. No shadows
Mutfak - üstten görünüm - gerçekçi - yazısız. In-Game asset. 2d. High contrast. No shadows
Üstten Bakış Yazar Kasa - Yazısız - Gerçekçi. In-Game asset. 2d. High contrast. No shadows
Yemek - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Burger - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Curry - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
dumpling - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
pasta - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Pizza - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
salad - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Soup - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Steak - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Tabakta Sushi - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Tabakta Taco - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
İçindeki içecekler görünen, meşrubat dolabı, gerçekçi - yazısız. In-Game asset. 2d. High contrast. No shadows
Ayran - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
caffee - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Cola - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Fanta - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
İcetea - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
OrangeJuice - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Maden suyu - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows
Su şişesi - Gerçekçi - Yazısız. In-Game asset. 2d. High contrast. No shadows