PGRData/Script/matrix/xentity/xpokemon/XPokemonMonster.lua

272 lines
8.1 KiB
Lua

local XPokemonMonsterSkillGroup = require("XEntity/XPokemon/XPokemonMonsterSkillGroup")
local type = type
local pairs = pairs
local ipairs = ipairs
local tableInsert = table.insert
local MonsterType = XPokemonConfigs.MonsterType
local FixToInt = FixToInt
local Default = {
_Id = 0,
_Level = 0,
_Star = 0,
_CreateTime = 0,
_Ability = 0, --战力
_SkillGroupIdList = {},
_SkillGroupDic = {},
_Attribute = {},
}
local XPokemonMonster = XClass(nil, "XPokemonMonster")
function XPokemonMonster:Ctor(monsterId)
for key, value in pairs(Default) do
if type(value) == "table" then
self[key] = {}
else
self[key] = value
end
end
self._Id = monsterId
self:InitSkillGroups()
XEventManager.AddEventListener(XEventId.EVENT_ATTRIBUTE_MANAGER_INIT, handler(self, self.DelayUpdateAttribute))
end
function XPokemonMonster:UpdateData(data)
if not data then return end
self._CreateTime = data.CreateTime
self:UpdateStar(data.Star)
self:UpdateLevel(data.Level)
self:UpdateUsingSkills(data.SkillIdList)
end
----------------------------------------------等级/星级相关 begin--------------------------------
function XPokemonMonster:GetStar()
return self._Star
end
function XPokemonMonster:IsMaxStar()
return self._Star == XPokemonConfigs.GetMonsterStarMaxStar(self._Id)
end
function XPokemonMonster:UpStar(addStar)
local newStar = self._Star + addStar
self:UpdateStar(newStar)
end
function XPokemonMonster:UpdateStar(star)
if not star then return end
self._Star = star
self:TryUnlockSkills()
end
function XPokemonMonster:GetLevel()
return self._Level
end
function XPokemonMonster:GetMaxLevel()
return XPokemonConfigs.GetMonsterStarMaxLevel(self._Id, self._Star)
end
function XPokemonMonster:IsMaxLevel()
return self._Level == self:GetMaxLevel()
end
function XPokemonMonster:UpLevel(addLevel)
local newLevel = self._Level + addLevel
self:UpdateLevel(newLevel)
end
function XPokemonMonster:UpdateLevel(level)
if not level then return end
self._Level = level
self:UpdateAttribute()
end
function XPokemonMonster:GetLevelUpCostItemInfo()
if self:IsMaxLevel() then return 0, 0 end
return XPokemonConfigs.GetMonsterLevelCostItemInfo(self._Id, self._Level)
end
function XPokemonMonster:GetStarUpCostItemInfo()
if self:IsMaxStar() then return 0, 0 end
return XPokemonConfigs.GetMonsterStarCostItemInfo(self._Id, self._Star)
end
----------------------------------------------等级/星级相关 end--------------------------------
----------------------------------------------属性相关 begin--------------------------------
local _WaitForUpdateAttr--属性表加载慢于属性同步接口,延迟更新
function XPokemonMonster:DelayUpdateAttribute()
if not _WaitForUpdateAttr then
return
end
self:UpdateAttribute()
_WaitForUpdateAttr = nil
end
function XPokemonMonster:UpdateAttribute()
if not XAttribManager.IsInited() then
_WaitForUpdateAttr = true
return
end
local monsterId = self._Id
local npcId = XPokemonConfigs.GetMonsterNpcId(monsterId)
self._Attribute = XAttribManager.GetNpcBaseAttribsByNpcIdWithReviseId(npcId, self._Level)
self:UpdateAbility()
end
function XPokemonMonster:UpdateAbility()
local rateMonster, rateHp, rateAttack = XPokemonConfigs.GetMonsterAbilityRate(self._Id)
self._Ability = XMath.ToMinInt(rateMonster + self:GetHp() * rateHp + self:GetAttack() * rateAttack)
end
function XPokemonMonster:GetAbility()
return self._Ability
end
function XPokemonMonster:GetHp()
return FixToInt(self._Attribute[XNpcAttribType.Life])
end
function XPokemonMonster:GetAttack()
return FixToInt(self._Attribute[XNpcAttribType.AttackNormal])
end
function XPokemonMonster:GetPreHpAndPreAttack(preLevel)
local maxLevel = self:GetMaxLevel()
preLevel = preLevel < maxLevel and preLevel or maxLevel
local npcId = XPokemonConfigs.GetMonsterNpcId(self._Id)
local attribute = XAttribManager.GetNpcBaseAttribsByNpcIdWithReviseId(npcId, preLevel)
return FixToInt(attribute[XNpcAttribType.Life]), FixToInt(attribute[XNpcAttribType.AttackNormal])
end
----------------------------------------------属性相关 end--------------------------------
----------------------------------------------技能相关 begin--------------------------------
function XPokemonMonster:InitSkillGroups()
local monsterId = self._Id
local skillIds = XPokemonConfigs.GetMonsterSkillIds(monsterId)
self._SkillGroupDic = {}
self._SkillGroupIdList = {}
for _, skillId in pairs(skillIds) do
local skillGroupId = XPokemonConfigs.GetMonsterSkillGroupId(skillId)
local skillGroup = self._SkillGroupDic[skillGroupId]
if not skillGroup then
skillGroup = XPokemonMonsterSkillGroup.New(skillGroupId)
self._SkillGroupDic[skillGroupId] = skillGroup
tableInsert(self._SkillGroupIdList, skillGroupId)
end
skillGroup:InitSkill(skillId)
end
end
function XPokemonMonster:GetSkillGroup(skillGroupId)
local skillGroup = self._SkillGroupDic[skillGroupId]
if not skillGroup then
XLog.Error("XPokemonMonster:GetSkillGroup error: 口袋妖怪怪物技能组获取失败, skillGroupId: " .. skillGroupId .. "monsterId: " .. self._Id)
return
end
return skillGroup
end
function XPokemonMonster:GetUsingSkillIdList()
local skillIds = {}
for _, skillGroupId in ipairs(self._SkillGroupIdList) do
local skillGroup = self:GetSkillGroup(skillGroupId)
local skillId = skillGroup:GetUsingSkillId()
if skillId > 0 then
tableInsert(skillIds, skillId)
end
end
return skillIds
end
function XPokemonMonster:GetCanSwitchSkillIds(skillId)
local skillGroup = self:GetSkillGroupBySkillId(skillId)
return skillGroup:GetSkillIds()
end
function XPokemonMonster:GetSkillGroupBySkillId(skillId)
local skillGroupId = XPokemonConfigs.GetMonsterSkillGroupId(skillId)
return self:GetSkillGroup(skillGroupId)
end
--设置使用中的技能
function XPokemonMonster:UpdateUsingSkills(usingSkillIds)
if usingSkillIds then
for _, skillId in pairs(usingSkillIds) do
self:SwitchSkill(skillId)
end
end
end
function XPokemonMonster:IsSkillUsing(skillId)
local skillGroup = self:GetSkillGroupBySkillId(skillId)
return skillGroup:IsSkillUsing(skillId)
end
function XPokemonMonster:IsSkillUnlock(skillId)
local skillGroup = self:GetSkillGroupBySkillId(skillId)
return skillGroup:IsSkillUnlock(skillId)
end
function XPokemonMonster:IsSkillCanSwitch(skillId)
local skillGroup = self:GetSkillGroupBySkillId(skillId)
return skillGroup:IsSkillCanSwitch()
end
function XPokemonMonster:SwitchSkill(skillId)
local skillGroup = self:GetSkillGroupBySkillId(skillId)
skillGroup:SwitchSkill(skillId)
end
--获取该星级可解锁技能Id列表
function XPokemonMonster:GetStarUnlockSkillIds(star)
local unlockSkillIds = {}
for _, skillGroup in pairs(self._SkillGroupDic) do
local skillIds = skillGroup:GetSkillIds()
for _, skillId in pairs(skillIds) do
local unlockStar = XPokemonConfigs.GetMonsterSkillUnlockStar(skillId)
if unlockStar == star then
tableInsert(unlockSkillIds, skillId)
end
end
end
return unlockSkillIds
end
--根据星级解锁所有技能
function XPokemonMonster:TryUnlockSkills()
for _, skillGroup in pairs(self._SkillGroupDic) do
local skillIds = skillGroup:GetSkillIds()
for _, skillId in pairs(skillIds) do
self:TryUnlockSkill(skillId)
end
end
end
function XPokemonMonster:IsSkillCanUnlock(skillId)
local unlockStar = XPokemonConfigs.GetMonsterSkillUnlockStar(skillId)
return self._Star >= unlockStar
end
function XPokemonMonster:TryUnlockSkill(skillId)
if not self:IsSkillCanUnlock(skillId) then return end
local skillGroup = self:GetSkillGroupBySkillId(skillId)
skillGroup:UnlockSkill(skillId)
end
----------------------------------------------技能相关 end--------------------------------
return XPokemonMonster