PGRData/Script/matrix/xmodule/xrestaurant/XRestaurantStaff.lua

253 lines
7.3 KiB
Lua
Raw Normal View History

2024-09-01 20:49:41 +00:00
local default = {
_Id = 0,
_Level = 0,
_IsRecruit = false,
_WorkBenchId = 0,
_State = XRestaurantConfigs.WorkState.Free,
_SkillIds = {},
}
---@class XRestaurantStaff : XDataEntityBase 餐厅员工类
---@field _Id number 员工Id
---@field _Level number 等级
---@field _IsRecruit boolean 是否招募
---@field _WorkBenchId number 工作台id
---@field _AreaType number 工作区域
---@field _SkillIds number[] 技能列表
---@field _State number 工作状态
local XRestaurantStaff = XClass(XDataEntityBase, "XRestaurantStaff")
function XRestaurantStaff:Ctor(id)
self:Init(default, id)
end
function XRestaurantStaff:InitData(id)
self:SetProperty("_Id", id)
end
--- 更新员工信息
---@param isRecruit boolean 是否招募
---@param level number 等级
---@return void
--------------------------
function XRestaurantStaff:UpdateInfo(isRecruit, level)
self:SetProperty("_IsRecruit", isRecruit)
self:SetProperty("_Level", level)
self:_UpdateSkill()
end
--- 招募
---@return boolean 是否招募成功
--------------------------
function XRestaurantStaff:Recruit()
local recruit = self._IsRecruit
if recruit then
return false
end
self:SetProperty("_IsRecruit", true)
self:SetProperty("_Level", XRestaurantConfigs.StaffLevel.Low)
self:_UpdateSkill()
return true
end
--- 生产
---@param workBenchId number 工作台id
---@param areaType number 工作区域
---@return void
--------------------------
function XRestaurantStaff:Produce(workBenchId, areaType)
self:SetProperty("_WorkBenchId", workBenchId)
self:SetProperty("_AreaType", areaType)
local room = XDataCenter.RestaurantManager.GetRoom()
room:AssignWork(self._Id, areaType, workBenchId)
end
--- 暂停
---@return void
--------------------------
function XRestaurantStaff:Pause()
if self._State == XRestaurantConfigs.WorkState.Pause then
return
end
self:SetProperty("_State", XRestaurantConfigs.WorkState.Pause)
self:ChangeState()
end
--- 恢复工作
---@param
---@return
--------------------------
function XRestaurantStaff:ReWork()
if self._State == XRestaurantConfigs.WorkState.Working then
return
end
self:SetProperty("_State", XRestaurantConfigs.WorkState.Working)
self:ChangeState()
end
--- 停工
---@return void
--------------------------
function XRestaurantStaff:Stop()
self:SetProperty("_WorkBenchId", 0)
self:SetProperty("_State", XRestaurantConfigs.WorkState.Free)
local room = XDataCenter.RestaurantManager.GetRoom()
room:UnAssignWork(self._Id)
end
function XRestaurantStaff:ChangeState(state)
local room = XDataCenter.RestaurantManager.GetRoom()
room:ChangeStaffState(self._Id, state)
end
function XRestaurantStaff:GetName()
return XRestaurantConfigs.GetCharacterName(self._Id)
end
function XRestaurantStaff:GetIcon()
return XDormConfig.GetCharacterStyleConfigQSIconById(self._Id)
end
function XRestaurantStaff:IsWorking()
return XTool.IsNumberValid(self._WorkBenchId)
and self._State == XRestaurantConfigs.WorkState.Working
end
function XRestaurantStaff:IsFree()
return not XTool.IsNumberValid(self._WorkBenchId) or self._State == XRestaurantConfigs.WorkState.Free
end
--- 对以解锁产品是否有加成效果
---@return boolean
--------------------------
function XRestaurantStaff:IsAdditionOnUnlockProduct()
local viewModel = XDataCenter.RestaurantManager.GetViewModel()
local unlockFoodMap = viewModel:GetProperty("_UnlockFood")
for productId, _ in pairs(unlockFoodMap or {}) do
if self:IsAddition(XRestaurantConfigs.AreaType.FoodArea, productId)
or self:IsAddition(XRestaurantConfigs.AreaType.SaleArea, productId) then
return true
end
end
local unlockIngredientMap = viewModel:GetProperty("_UnlockIngredient")
for productId, _ in pairs(unlockIngredientMap or {}) do
if self:IsAddition(XRestaurantConfigs.AreaType.IngredientArea, productId) then
return true
end
end
return false
end
--- 是否拥有加成效果
---@param areaType number
---@return boolean
--------------------------
function XRestaurantStaff:IsAddition(areaType, productId)
for _, skillId in pairs(self._SkillIds or {}) do
local type = XRestaurantConfigs.GetCharacterSkillAreaType(skillId)
if type == areaType then
local addition = XRestaurantConfigs.GetCharacterSkillAddition(skillId)
if addition[productId] then
return true
end
end
end
return false
end
--- 顶级时是否对区域加成
---@param areaType number
---@return boolean
--------------------------
function XRestaurantStaff:IsAdditionByAreaTypeWithMaxLevel(areaType)
local skillIds = XRestaurantConfigs.GetCharacterSkillIds(self._Id, XRestaurantConfigs.StaffLevel.Max)
return self:_IsAdditionByAreaType(areaType, skillIds)
end
--- 初级时是否对区域有加成效果
---@param areaType number
---@return boolean
--------------------------
function XRestaurantStaff:IsAdditionByAreaTypeWithLowLevel(areaType)
local skillIds = XRestaurantConfigs.GetCharacterSkillIds(self._Id, XRestaurantConfigs.StaffLevel.Low)
return self:_IsAdditionByAreaType(areaType, skillIds)
end
--- 当前等级对区域是否有加成效果
---@param areaType number
---@return boolean
--------------------------
function XRestaurantStaff:IsAdditionByAreaType(areaType)
return self:_IsAdditionByAreaType(areaType, self._SkillIds)
end
function XRestaurantStaff:IsAdditionByAreaTypeWithLevel(areaType, level)
if areaType == 0 then
return true
end
local skillIds = XRestaurantConfigs.GetCharacterSkillIds(self._Id, level)
return self:_IsAdditionByAreaType(areaType, skillIds)
end
function XRestaurantStaff:_IsAdditionByAreaType(areaType, skillIds)
for _, skillId in pairs(skillIds or {}) do
local type = XRestaurantConfigs.GetCharacterSkillAreaType(skillId)
if type == areaType then
return true
end
end
return false
end
--- 获取技能加成值
---@param productId number
---@return number
--------------------------
function XRestaurantStaff:GetSkillAddition(areaType, productId)
if not XTool.IsNumberValid(productId) then
return 0
end
local add = 0
for _, skillId in pairs(self._SkillIds or {}) do
local type = XRestaurantConfigs.GetCharacterSkillAreaType(skillId)
if type == areaType then
local addition = XRestaurantConfigs.GetCharacterSkillAddition(skillId)
if addition[productId] then
add = add + addition[productId]
end
end
end
return add
end
--- 更新员工技能
---@return void
--------------------------
function XRestaurantStaff:_UpdateSkill()
local skillIds = XRestaurantConfigs.GetCharacterSkillIds(self._Id, self._Level)
self:SetProperty("_SkillIds", skillIds)
end
--- 等级描述
---@return string
--------------------------
function XRestaurantStaff:GetLevelStr()
return XRestaurantConfigs.GetCharacterLevelStr(self._Level)
end
---@param staff XRestaurantStaff
---@return boolean
--------------------------
function XRestaurantStaff:Equal(staff)
if not staff then
return false
end
return self._Id == staff:GetProperty("_Id")
end
return XRestaurantStaff