require("Modules.Battle.Logic.SkillManager") RoleLogic = {} RoleLogic.__index = RoleLogic --local RoleLogic = RoleLogic --local RoleDataName = RoleDataName --local BattleLogic = BattleLogic local Random = Random local floor = math.floor local max = math.max local min = math.min local skillPool = BattleObjectPool.New(function () return Skill:New() end) function RoleLogic.New() local instance = {uid=0,roleData=0,data=RoleData.New(),camp=0,name=0,aiIndex=1,position=0,sp=0,spPass=0, shield=BattleList.New(), exCalDmgList=BattleList.New(), proTranList=BattleList.New(), buffFilter=BattleList.New(), Event=BattleEvent:New(),passiveList={},isDead=false,IsDebug=false} setmetatable(instance, RoleLogic) return instance end function RoleLogic:Init(uid, data, position) self.uid = uid self.position = position self.roleData = data self.data:Init(self, data.property) self.isDead = self:GetRoleData(RoleDataName.Hp) <= 0 self.camp = data.camp --阵营 0:我方 1:敌方 self.name = data.name self.element = data.element self.shield:Clear() --护盾列表 self.exCalDmgList:Clear() --额外计算伤害列表 self.buffFilter:Clear() --buff屏蔽列表 self.proTranList:Clear() --属性转换列表 self.Event:ClearEvent() self.skill = data.skill self.superSkill = data.superSkill --首次读条时间=速度/(20*(等级+10) self.sp = 0 local time = self:GetRoleData(RoleDataName.Speed)/(20*(self:GetRoleData(RoleDataName.Level)+10)) self.spPass = floor( BattleUtil.ErrorCorrection(time) * BattleLogic.GameFrameRate) -- self.passiveList = {} if data.passivity and #data.passivity > 0 then for i = 1, #data.passivity do local v = data.passivity[i] local id = v[1] local args = {} for j = 2, #v do args[j-1] = v[j] end if BattleUtil.Passivity[id] then BattleUtil.Passivity[id](self, args) -- 加入被动列表 table.insert(self.passiveList, {id, args}) else print("被动技能"..id.."不存在") end end end -- 初始化怒气值(默认2) self.Rage = 2 + self:GetRoleData(RoleDataName.InitRage)-- 当前怒气值 self.RageGrow = 2 -- 普通技能怒气成长 self.SuperSkillRage = 4 -- 技能需要释放的怒气值 self.NoRageRate = 0 -- 不消耗怒气值的概率 self.aiOrder = data.ai self.aiIndex = 1 self.aiTempCount = 0 self.IsDebug = false self.lockTarget = nil --嘲讽 self.ctrl_dizzy = false --眩晕 不能释放所有技能 self.ctrl_slient = false --沉默 只能1技能 self.ctrl_palsy = false --麻痹 只能2技能 self.ctrl_noheal = false --禁疗 self.ctrl_blind = false --致盲 end -- 添加一个被动技能 function RoleLogic:AddPassive(id, args, isRepeat) --判断是否可以叠加 if not isRepeat then -- 不可以叠加, 如果重复则不再加入 for _, pst in ipairs(self.passiveList) do if pst[1] == id then return end end end -- 被动生效 BattleUtil.Passivity[id](self, args) -- 加入被动列表 table.insert(self.passiveList, {id, args}) end -- function RoleLogic:CanCastSkill() return self.sp >= self.spPass and not self.IsDebug and BattleLogic.GetSkillUsable(self.camp) end -- 废弃的方法 function RoleLogic:GetSkillCD() return max(self.spPass - self.sp, 0) end -- 废弃的方法 function RoleLogic:AddSkillCD(value, type) self.Event:DispatchEvent(BattleEventName.RoleCDChanged) if value == 0 then --为0直接清CD self.sp = self.spPass return end local cdTotal = self.spPass local delta = 0 if type == 1 then --加算 delta = floor(value * BattleLogic.GameFrameRate) elseif type == 2 then --乘加算(百分比属性加算) delta = floor(value * cdTotal) elseif type == 3 then --减算 delta = -floor(value * BattleLogic.GameFrameRate) elseif type == 4 then --乘减算(百分比属性减算) delta = -floor(value * cdTotal) end if delta > 0 then --加cd加cd最大值 self.spPass = self.spPass + delta else --减cd减cd当前值 delta = -delta self.sp = min(self.sp + delta, self.spPass) end end -- 改变怒气值 function RoleLogic:AddRage(value, type) local delta = 0 if type == 1 then --加算 delta = value elseif type == 2 then --乘加算(百分比属性加算) delta = floor(value * self.SuperSkillRage) elseif type == 3 then --减算 delta = -value elseif type == 4 then --乘减算(百分比属性减算) delta = -floor(value * self.SuperSkillRage) end -- self.Event:DispatchEvent(BattleEventName.RoleRageChange, delta) --怒气值不可为负值 self.Rage = max(self.Rage + delta, 0) end function RoleLogic:GetRoleData(property) local tarPro = self.data:GetData(property) local item for i=1, self.proTranList.size do item = self.proTranList.buffer[i] if item.proName == property then local value if item.changeType == 1 then --加算 value = item.tranFactor elseif item.changeType == 2 then --乘加算(百分比属性加算) value = BattleUtil.ErrorCorrection(self.data:GetData(item.tranProName) * item.tranFactor) elseif item.changeType == 3 then --减算 value = -item.tranFactor elseif item.changeType == 4 then --乘减算(百分比属性减算) value = -BattleUtil.ErrorCorrection(self.data:GetData(item.tranProName) * item.tranFactor) end tarPro = tarPro + value end end return tarPro end --proA替换的属性,factor系数,proB被替换的属性, duration持续时间 --读取proB属性时,得到的值为proB + proA * factor function RoleLogic:AddPropertyTransfer(proA, factor, proB, ct, duration) local proTran = {proName = proB, tranProName = proA, tranFactor = factor, changeType = ct} self.proTranList:Add(proTran) local index = self.proTranList.size if duration then BattleLogic.WaitForTrigger(duration, function () self:RemovePropertyTransfer(index, proTran) end) end return index, proTran end -- 删除临时属性 function RoleLogic:RemovePropertyTransfer(index, tran) if index <= self.proTranList.size and tran == self.proTranList.buffer[index] then self.proTranList:Remove(index) end end function RoleLogic:AddBuff(buff) if self.isDead then BattleLogic.BuffMgr:PutBuff(buff) return end for i=1, self.buffFilter.size do if self.buffFilter.buffer[i](buff) then BattleLogic.BuffMgr:PutBuff(buff) return end end BattleLogic.BuffMgr:AddBuff(self, buff) end function RoleLogic:Dispose() end -- 判断角色是否可以释放技能 function RoleLogic:IsAvailable() -- 眩晕 -- 死亡 if self.ctrl_dizzy or self.isDead then return false end -- 沉默麻痹同时存在 if self.ctrl_palsy and self.ctrl_slient then return false end -- 麻痹同时怒气不足 if self.ctrl_palsy and self.Rage < self.SuperSkillRage then return false end return true end -- 释放技能 function RoleLogic:SkillCast(skill, func) local _CastDone = function() if func then func() end end -- 角色不可用直接结束技能释放 if not skill or not self:IsAvailable() then _CastDone() return end -- 没有麻痹,释放普通攻击 if skill.type == BattleSkillType.Normal and not self.ctrl_palsy then local function _CheckRage() -- 后成长怒气 if skill.isRage then -- 检测被动技能对怒气成长的影响 local grow = self.RageGrow local _RageGrowPassivity = function(finalGrow) grow = finalGrow end self.Event:DispatchEvent(BattleEventName.RoleRageGrow, grow, _RageGrowPassivity) -- self.Rage = self.Rage + grow end -- 释放完成 _CastDone() end -- 释放普技 skill:Cast(_CheckRage) -- 没有沉默,释放大技能 elseif skill.type == BattleSkillType.Special and not self.ctrl_slient then -- 先消耗怒气 if skill.isRage then if self.Rage < self.SuperSkillRage then -- 怒气值不足不能释放技能 _CastDone() return end -- 检测被动技能对怒气消耗的影响 local costRage = self.SuperSkillRage local noRageRate = self.NoRageRate local _RageCostPassivity = function(rate, cost) noRageRate = noRageRate + rate costRage = costRage + cost end self.Event:DispatchEvent(BattleEventName.RoleRageCost, costRage, noRageRate, _RageCostPassivity) -- 计算消耗怒气的概率,并消耗怒气 local costRate = 1 - noRageRate costRate = costRate > 1 and 1 or costRate costRate = costRate < 0 and 0 or costRate BattleUtil.RandomAction(costRate, function() self.Rage = self.Rage - costRage end) end -- 释放绝技 skill:Cast(_CastDone) -- 没有符合条件的技能直接进入下一个技能检测 else _CastDone() end end -- 加入一个技能 -- type 加入的技能类型 -- targets 指定目标 -- isAdd 是否是追加技能 -- isRage 是否正常操作怒气值 function RoleLogic:AddSkill(type, isRage, isAdd, targets) if not self.SkillNum then self.SkillNum = 0 end self.SkillNum = self.SkillNum + 1 local effectData = type == BattleSkillType.Normal and self.skill or self.superSkill SkillManager.AddSkill(self, effectData, type, targets, isAdd, isRage) end -- 正常触发技能 function RoleLogic:CastSkill(func) -- 设置轮转方法 SkillManager.SetTurnRoundFunc(func) -- 没有沉默 if not self.ctrl_slient and self.Rage >= self.SuperSkillRage then -- 释放大技能 self:AddSkill(BattleSkillType.Special, true, false, nil) return end -- 没有麻痹 释放普通技能 if not self.ctrl_palsy then self:AddSkill(BattleSkillType.Normal, true, false, nil) return end -- end -- 强制释放技能,测试技能时使用 -- type 追加的技能类型 1=普技 2=特殊技 -- targets 追加技能的目标 nil则自动选择目标 -- func 追加技能释放完成回调 function RoleLogic:ForceCastSkill(type, targets, func) -- 清除技能控制 self.ctrl_dizzy = false --眩晕 不能释放技能 self.ctrl_slient = false --沉默 只能1技能 self.ctrl_palsy = false --麻痹 只能2技能 -- 设置轮转方法 SkillManager.SetTurnRoundFunc(func) -- 释放技能 if type == 1 and self.skill then self:AddSkill(BattleSkillType.Normal, true, false, nil) elseif type == 2 and self.superSkill then if self.Rage < self.SuperSkillRage then self.Rage = self.SuperSkillRage end self:AddSkill(BattleSkillType.Special, true, false, nil) end end -- 设置我被杀死时的信息 function RoleLogic:SetkillMeInfo(caster, skill) self.killCaster = caster self.killSkill = skill end function RoleLogic:Update() if self:GetRoleData(RoleDataName.Hp) <= 0 then self.isDead = true BattleLogic.BuffMgr:ClearBuff(self) self.Event:DispatchEvent(BattleEventName.RoleDead, self.killCaster) self.killCaster.Event:DispatchEvent(BattleEventName.RoleKill, self) BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoleDead, self, self.killCaster) end end