/**** * 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; } };
/****
* 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;
}
};
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