2025-08-07 00:15:18 +08:00
|
|
|
local CookManager = {}
|
|
|
|
|
local Utils = require("GamePlay.Utils")
|
|
|
|
|
local Emitter = require("Utils.Emitter")
|
2025-08-08 17:22:47 +08:00
|
|
|
local CookMaterialUtils = require("Utils.Cook.CookMaterial")
|
2025-08-07 00:15:18 +08:00
|
|
|
local ECookingHeat = import("ECookingHeat")
|
|
|
|
|
|
|
|
|
|
--- @enum ECookCheckStatus
|
|
|
|
|
local ECookCheckStatus = {
|
|
|
|
|
Normal = 0, -- 不用做任何操作
|
|
|
|
|
NextState = 1, -- 可以进入下一个阶段
|
2025-08-08 17:22:47 +08:00
|
|
|
Error = 2, -- 出现了错误
|
2025-08-07 00:15:18 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
local function TemperatureToDoneness(temperature)
|
|
|
|
|
return math.floor(temperature / 70)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function CookManager:Reset()
|
2025-08-08 17:22:47 +08:00
|
|
|
self.current_temperature = 0 -- 当前的温度
|
2025-08-07 00:15:18 +08:00
|
|
|
self.temperature_thresholds = {} -- 温度临界值,缓存表格内容
|
|
|
|
|
self.heating_record_table = {} -- 食材受热记录表
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function CookManager:Tick(temperature, delta_time)
|
|
|
|
|
local need_remove_record = {} -- 记录已经到火候,或其他原因,需要移除的食材
|
2025-08-08 17:22:47 +08:00
|
|
|
self.current_temperature = temperature
|
2025-08-07 00:15:18 +08:00
|
|
|
|
|
|
|
|
-- 遍历,为所有的食材加热
|
|
|
|
|
for cook_material_id, record_table in pairs(self.heating_record_table) do
|
2025-08-08 17:22:47 +08:00
|
|
|
local doneness = CookMaterialUtils.TemperatureToDoneness(temperature) -- 获取此时的火候
|
2025-08-07 00:15:18 +08:00
|
|
|
local record_value = record_table[doneness] or 0
|
|
|
|
|
record_table[doneness] = record_value + (delta_time * 1000)
|
|
|
|
|
|
|
|
|
|
local check_status = self:CheckHeatingStatus(cook_material_id)
|
|
|
|
|
if check_status == ECookCheckStatus.NextState then
|
|
|
|
|
local next_cook_material = self:GetCookMaterialNextState(cook_material_id, doneness)
|
|
|
|
|
if next_cook_material == "None" then -- 炸锅了
|
|
|
|
|
-- TODO 抛出事件
|
|
|
|
|
self:Reset()
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
self:AddCookMaterial(next_cook_material, true)
|
|
|
|
|
need_remove_record[cook_material_id] = true
|
|
|
|
|
end
|
|
|
|
|
print(cook_material_id, doneness, record_table[doneness])
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 移除已经加热到下一阶段的食材
|
|
|
|
|
for cook_material_id, need_remove in pairs(need_remove_record) do
|
|
|
|
|
if need_remove then
|
|
|
|
|
self.heating_record_table[cook_material_id] = nil
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function CookManager:GetCookMaterialNextState(cook_material_id, doneness)
|
|
|
|
|
local threshold = self.temperature_thresholds[cook_material_id]
|
|
|
|
|
if not threshold then return "None" end
|
|
|
|
|
local state_config = threshold.CookConfig:Get(doneness)
|
|
|
|
|
if not state_config then return "None" end
|
|
|
|
|
return state_config.NextStateID
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function CookManager:CheckHeatingStatus(cook_material_id)
|
|
|
|
|
local threshold = self.temperature_thresholds[cook_material_id]
|
|
|
|
|
local record_state = self.heating_record_table[cook_material_id]
|
|
|
|
|
if not threshold or not record_state then return ECookCheckStatus.Error end
|
|
|
|
|
local state_configs = threshold.CookConfig
|
|
|
|
|
for doneness, cook_time in pairs(record_state) do
|
|
|
|
|
local config = state_configs:Get(doneness)
|
|
|
|
|
if config and cook_time >= config.CookingDuration then
|
|
|
|
|
return ECookCheckStatus.NextState
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return ECookCheckStatus.Normal
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function CookManager:CheckFinishStatus()
|
|
|
|
|
-- 检测当前菜品是否完成
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function CookManager:AddCookMaterial(cook_material_id, is_auto_push)
|
2025-08-19 03:24:22 +08:00
|
|
|
local BusyGamePlayLibrary = import("BusyGamePlayLibrary")
|
|
|
|
|
|
2025-08-07 00:15:18 +08:00
|
|
|
local config = Utils.GetDataTableConfig(
|
|
|
|
|
"CookMaterialStateConfig", cook_material_id
|
|
|
|
|
)
|
2025-08-19 03:24:22 +08:00
|
|
|
BusyGamePlayLibrary.SetTest(config)
|
|
|
|
|
print("?>????", config)
|
2025-08-07 00:15:18 +08:00
|
|
|
if not config then
|
|
|
|
|
print("ERROR: can't find ", cook_material_id, " in CookMaterialStateConfig")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
self.heating_record_table[cook_material_id] = {}
|
|
|
|
|
self.temperature_thresholds[cook_material_id] = config
|
|
|
|
|
print("call", cook_material_id, is_auto_push)
|
|
|
|
|
Emitter.EmitEvent("cook_material_change", cook_material_id, is_auto_push)
|
|
|
|
|
end
|
|
|
|
|
|
2025-08-08 17:22:47 +08:00
|
|
|
function CookManager:UseCookware(cookward_id)
|
|
|
|
|
for cook_materiad_id, _ in pairs(self.heating_record_table) do
|
|
|
|
|
local next_state = CookMaterialUtils.GetCookwareOpNextState(
|
|
|
|
|
cookward_id, cook_materiad_id, self.current_temperature
|
|
|
|
|
)
|
|
|
|
|
if next_state ~= "None" then
|
|
|
|
|
self:AddCookMaterial(next_state, true)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
Emitter.EmitEvent("use_cookward", self.cookware_id)
|
|
|
|
|
end
|
|
|
|
|
|
2025-08-07 00:15:18 +08:00
|
|
|
|
|
|
|
|
return CookManager
|