forked from endernon/PGRData
183 lines
5.8 KiB
Lua
183 lines
5.8 KiB
Lua
|
|
|||
|
|
|||
|
local XRestaurantProduct = require("XModule/XRestaurant/XRestaurantProduct")
|
|||
|
|
|||
|
---@class XConsumeIngredient 消耗食材类
|
|||
|
---@field _Id number 食材Id
|
|||
|
---@field _Count number 食材数量
|
|||
|
local XConsumeIngredient = XClass(nil, "XConsumeIngredient")
|
|||
|
|
|||
|
function XConsumeIngredient:Ctor(id, count)
|
|||
|
self._Id = id
|
|||
|
self._Count = count
|
|||
|
end
|
|||
|
|
|||
|
function XConsumeIngredient:GetCount()
|
|||
|
return self._Count
|
|||
|
end
|
|||
|
|
|||
|
function XConsumeIngredient:GetId()
|
|||
|
return self._Id
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
---@class XFood : XRestaurantProduct 食物类
|
|||
|
---@field _SellSpeed number 售卖速度
|
|||
|
---@field _SellPrice number 售卖价格
|
|||
|
---@field _Ingredients XConsumeIngredient[] 消耗食材列表
|
|||
|
---@field _HotSaleAddition number 热销加成
|
|||
|
---@field _Quality number 品质
|
|||
|
local XFood = XClass(XRestaurantProduct, "XFood")
|
|||
|
|
|||
|
function XFood:InitData(id)
|
|||
|
self.Super.InitData(self, id)
|
|||
|
self._HotSaleAddition = 0
|
|||
|
self:SetProperty("_SellSpeed", XRestaurantConfigs.GetFoodBaseSellSpeed(id))
|
|||
|
self:SetProperty("_SellPrice", XRestaurantConfigs.GetFoodBasePrice(id))
|
|||
|
self:SetProperty("_Speed", XRestaurantConfigs.GetFoodBaseProduceSpeed(id))
|
|||
|
self:SetProperty("_Name", XRestaurantConfigs.GetFoodName(id))
|
|||
|
self:SetProperty("_Quality", XRestaurantConfigs.GetFoodQuality(id))
|
|||
|
self:_InitIngredients()
|
|||
|
end
|
|||
|
|
|||
|
--- 初始化食材列表
|
|||
|
---@private _InitIngredients
|
|||
|
---@return void
|
|||
|
--------------------------
|
|||
|
function XFood:_InitIngredients()
|
|||
|
local list = {}
|
|||
|
self._Ingredients = {}
|
|||
|
for _, data in ipairs(XRestaurantConfigs.GetIngredientList(self._Id) or {}) do
|
|||
|
local ingredient = XConsumeIngredient.New(data.ItemId, data.Count)
|
|||
|
table.insert(list, ingredient)
|
|||
|
end
|
|||
|
self:SetProperty("_Ingredients", list)
|
|||
|
end
|
|||
|
|
|||
|
--- 餐馆升级
|
|||
|
---@overload
|
|||
|
---@return void
|
|||
|
--------------------------
|
|||
|
function XFood:OnRestaurantLevelUp(level)
|
|||
|
self:SetProperty("_Limit", XRestaurantConfigs.GetProductLimit(XRestaurantConfigs.AreaType.FoodArea, level, self._Id))
|
|||
|
end
|
|||
|
|
|||
|
function XFood:ConsumeMaterial(count)
|
|||
|
if not self:IsConsumeEnough(count) then
|
|||
|
return
|
|||
|
end
|
|||
|
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
|||
|
for _, consume in pairs(self._Ingredients or {}) do
|
|||
|
local ingredient = viewModel:GetProduct(XRestaurantConfigs.AreaType.IngredientArea, consume:GetId())
|
|||
|
if ingredient then
|
|||
|
ingredient:Consume(consume:GetCount())
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XFood:IsUnlock()
|
|||
|
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
|||
|
local unlock = viewModel:CheckFoodUnlock(self._Id)
|
|||
|
if not unlock then
|
|||
|
return false
|
|||
|
end
|
|||
|
if not self:IsDefault() then
|
|||
|
return false
|
|||
|
end
|
|||
|
for _, consume in pairs(self._Ingredients or {}) do
|
|||
|
local id = consume:GetId()
|
|||
|
local product = viewModel:GetProduct(XRestaurantConfigs.AreaType.IngredientArea, id)
|
|||
|
if product and not product:IsUnlock() then
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
function XFood:IsDefault()
|
|||
|
local isDefault = XRestaurantConfigs.GetFoodIsDefault(self._Id)
|
|||
|
if not isDefault then
|
|||
|
--这里的Item为菜谱,无法消耗,仅能获取
|
|||
|
local items = XRestaurantConfigs.GetFoodUnlockItems(self._Id)
|
|||
|
for _, item in ipairs(items) do
|
|||
|
local id = item.Id
|
|||
|
if XDataCenter.ItemManager.GetCount(id) < item.Count then
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
function XFood:GetProductIcon()
|
|||
|
if not XTool.IsNumberValid(self._Id) then
|
|||
|
return
|
|||
|
end
|
|||
|
return XRestaurantConfigs.GetFoodIcon(self._Id)
|
|||
|
end
|
|||
|
|
|||
|
--- 食材是否足够
|
|||
|
---@return boolean
|
|||
|
--------------------------
|
|||
|
function XFood:IsConsumeEnough(count)
|
|||
|
count = count or 1
|
|||
|
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
|||
|
for _, consume in pairs(self._Ingredients or {}) do
|
|||
|
local id = consume:GetId()
|
|||
|
local need = consume:GetCount() * count
|
|||
|
local ingredient = viewModel:GetProduct(XRestaurantConfigs.AreaType.IngredientArea, id)
|
|||
|
if not ingredient:IsSufficient(need) then
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
function XFood:IsSingleConsumeEnough(ingredientId)
|
|||
|
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
|||
|
local need = 0
|
|||
|
for _, consume in pairs(self._Ingredients or {}) do
|
|||
|
if consume:GetId() == ingredientId then
|
|||
|
need = consume:GetCount()
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
local ingredient = viewModel:GetProduct(XRestaurantConfigs.AreaType.IngredientArea, ingredientId)
|
|||
|
return ingredient:IsSufficient(need)
|
|||
|
end
|
|||
|
|
|||
|
function XFood:UpdateHotSale(isHotSale, addition)
|
|||
|
addition = isHotSale and addition or 0
|
|||
|
self:SetProperty("_HotSale", isHotSale)
|
|||
|
self:SetProperty("_HotSaleAddition", addition)
|
|||
|
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
|||
|
local foodUnlock = self:IsUnlock()
|
|||
|
for _, consume in pairs(self._Ingredients or {}) do
|
|||
|
local ingredient = viewModel:GetProduct(XRestaurantConfigs.AreaType.IngredientArea, consume:GetId())
|
|||
|
if ingredient and foodUnlock then
|
|||
|
ingredient:SetProperty("_HotSale", isHotSale)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--- 最终价格(基础价格 * (1 + (hotAddition + levelAddition)/ 100)
|
|||
|
---@return number
|
|||
|
--------------------------
|
|||
|
function XFood:GetFinalPrice()
|
|||
|
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
|
|||
|
if not self._HotSale then
|
|||
|
return self._SellPrice
|
|||
|
end
|
|||
|
local additionByLv = XRestaurantConfigs.GetHotSaleAdditionByRestaurantLevel(viewModel:GetProperty("_Level"))
|
|||
|
return math.ceil(self._SellPrice * (1 + (additionByLv + self._HotSaleAddition) / 100))
|
|||
|
end
|
|||
|
|
|||
|
function XFood:GetQualityIcon(is3d)
|
|||
|
return XRestaurantConfigs.GetFoodQualityIcon(self._Quality, is3d)
|
|||
|
end
|
|||
|
|
|||
|
function XFood:GetPriority()
|
|||
|
return XRestaurantConfigs.GetFoodPriority(self._Id)
|
|||
|
end
|
|||
|
|
|||
|
return XFood
|