PGRData/Script/matrix/xmodule/xrestaurant/xworkbench/XCookingWorkBench.lua
2024-09-01 22:49:41 +02:00

245 lines
No EOL
7.7 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local XRestaurantWorkBench = require("XModule/XRestaurant/XRestaurantWorkBench")
---@class XCookingWorkBench : XRestaurantWorkBench 烹饪工作台
local XCookingWorkBench = XClass(XRestaurantWorkBench, "XCookingWorkBench")
function XCookingWorkBench:InitData(id)
self.Super.InitData(self, id)
self._AreaType = XRestaurantConfigs.AreaType.FoodArea
end
function XCookingWorkBench:GetProductIcon()
if not XTool.IsNumberValid(self._ProductId) then
return
end
return XRestaurantConfigs.GetFoodIcon(self._ProductId)
end
function XCookingWorkBench:IsInsufficient()
return not self:CheckIngredientEnough()
end
function XCookingWorkBench:CheckIngredientEnough()
if not XTool.IsNumberValid(self._ProductId) then
return false
end
local food = self:GetProduct()
return food and food:IsConsumeEnough() or false
end
function XCookingWorkBench:SortProduct()
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
---@type XFood[]
local list = viewModel:GetUnlockProductList(self._AreaType)
table.sort(list, function(a, b)
local hotA = a:GetProperty("_HotSale")
local hotB = b:GetProperty("_HotSale")
if hotA ~= hotB then
return hotA
end
local idA = a:GetProperty("_Id")
local idB = b:GetProperty("_Id")
local qualityA = XRestaurantConfigs.GetFoodQuality(idA)
local qualityB = XRestaurantConfigs.GetFoodQuality(idB)
if qualityA ~= qualityB then
return qualityA > qualityB
end
local aPriority = a:GetPriority()
local bPriority = b:GetPriority()
if aPriority ~= bPriority then
return aPriority < bPriority
end
return idA < idB
end)
return list
end
function XCookingWorkBench:GetBaseProduceSpeed()
if not XTool.IsNumberValid(self._ProductId)
or not XTool.IsNumberValid(self._CharacterId) then
return 0
end
return XRestaurantConfigs.GetFoodBaseProduceSpeed(self._ProductId)
end
function XCookingWorkBench:GetConsumption(ingredientId, timeUnit)
timeUnit = timeUnit or XRestaurantConfigs.TimeUnit.Hour
if not XTool.IsNumberValid(self._CharacterId) or
not XTool.IsNumberValid(self._ProductId) then
return 0
end
local addSpeed = self:GetProduceSingleTime()
if addSpeed <= 0 then
XLog.Error("食物的生产速度小于等于0请检查配置! foodId = ", self._ProductId)
return timeUnit
end
--单位时间内生产的个数
local count = timeUnit / addSpeed
local speed = 0
local product = self:GetProduct()
local list = product:GetProperty("_Ingredients")
for _, consume in pairs(list or {}) do
if consume:GetId() == ingredientId then
local needCount = consume:GetCount()
speed = speed + needCount * count
end
end
return XRestaurantConfigs.GetAroundValue(speed, XRestaurantConfigs.Digital.One)
end
function XCookingWorkBench:GetActualProductCount(timeUnit)
--最多能生产个数
local maxCount = self:GetProductiveness(timeUnit)
local actualCount = maxCount
local food = self:GetProduct()
for count = 1, maxCount do
if not food:IsConsumeEnough(count) then
actualCount = count - 1
break
end
end
return actualCount
end
function XCookingWorkBench:GetProduceSingleTime()
local baseSpeed = self:GetBaseProduceSpeed()
local addition = self:GetAddition()
return baseSpeed - addition
end
function XCookingWorkBench:GetProductiveness(timeUnit)
timeUnit = timeUnit or XRestaurantConfigs.TimeUnit.Hour
if not XTool.IsNumberValid(self._ProductId)
or not XTool.IsNumberValid(self._CharacterId) then
return 0
end
local produceNeedTime = self:GetProduceSingleTime()
if produceNeedTime == 0 then
return timeUnit
end
return XRestaurantConfigs.GetAroundValue(timeUnit / produceNeedTime, XRestaurantConfigs.Digital.One)
end
function XCookingWorkBench:PreviewConsume(count)
local food = self:GetProduct()
if not food then
return
end
if not food:IsConsumeEnough(count) then
return
end
food:ConsumeMaterial(count)
self.Super.PreviewConsume(self, count)
end
function XCookingWorkBench:EndOfRound(tolerances)
local product = self:GetProduct()
if not product then
return
end
self.Super.EndOfRound(self, tolerances)
--每轮生产1个
product:Produce(1)
end
function XCookingWorkBench:GetAccelerateContentAndItemData(accelerateTime)
local food = self:GetProduct()
if not food then
return
end
local trueAccelerateTime = accelerateTime + self._SimulationSecond
--生产单个时间
local produceNeedTime = self:GetProduceSingleTime()
--由于是预先扣除材料
local preProductCount = 0
if trueAccelerateTime >= produceNeedTime then
preProductCount = 1
trueAccelerateTime = trueAccelerateTime - produceNeedTime
end
local maxCount = self:GetActualProductCount(trueAccelerateTime)
local enough = food:IsConsumeEnough(maxCount)
local index = enough and 2 or 3
local content = XRestaurantConfigs.GetClientConfig("AccelerateTip", index)
content = string.format(content, accelerateTime)
if not enough then
maxCount = self:GetProductiveness(trueAccelerateTime)
end
return content, {
Count = math.floor(maxCount + preProductCount),
Icon = self:GetProductIcon()
}
end
--function XCookingWorkBench:CheckCanAccelerate()
-- if not self.Super.CheckCanAccelerate(self) then
-- return false
-- end
-- local food = self:GetProduct()
-- if not food then
-- return false
-- end
--
-- local viewModel = XDataCenter.RestaurantManager.GetViewModel()
-- --加速时间
-- local accelerateTime = viewModel:GetAccelerateTime()
-- --真实加速时间
-- local trueAccelerateTime = accelerateTime - self._CountDown
-- --真实时间下能生产的个数
-- local maxCount = math.ceil(trueAccelerateTime / self:GetProduceSingleTime())
-- --食材是否足够生产
-- local enough = food:IsConsumeEnough(maxCount)
-- return enough
--end
function XCookingWorkBench:GetInsufficientTitleAndContent()
local title = XRestaurantConfigs.GetClientConfig("ProductNotEnough", 1)
local content = XRestaurantConfigs.GetClientConfig("ProductNotEnough", 2)
local productName = self:GetProductName()
content = XUiHelper.ReplaceTextNewLine(string.format(content, productName, productName, productName))
return title, content
end
function XCookingWorkBench:GetStopTipTitleAndContent()
local key = "StopProduceTip"
local title = XRestaurantConfigs.GetClientConfig(key, 3)
local content
local name = self:GetProductName()
if self:IsWorking() then
local returnTip = ""
local food = self:GetProduct()
local list = food:GetProperty("_Ingredients")
for _, consume in pairs(list or {}) do
local id = consume:GetId()
local count = consume:GetCount()
returnTip = string.format("%s%s*%s ", returnTip, XRestaurantConfigs.GetIngredientName(id), count)
end
content = XRestaurantConfigs.GetClientConfig(key, 4)
content = string.format(content, name, returnTip)
else
content = XRestaurantConfigs.GetClientConfig(key, 5)
content = string.format(content, name)
end
return string.format(title, name), XUiHelper.ReplaceTextNewLine(content)
end
function XCookingWorkBench:GetWorkPriority()
if not XTool.IsNumberValid(self._ProductId) then
return 0
end
return XRestaurantConfigs.GetFoodPriority(self._ProductId)
end
return XCookingWorkBench