| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054 |
- 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
- --匹配相同id
- function RoleLogic:Equle(_role)
- if _role.roleId == self.roleId and _role.uid == self.uid then
- return true
- end
- return false
- end
- --回滚
- function RoleLogic:RoleBack(_role)
- -- LogError("xRolbX ---------------"..self.uid)
- -- 回滚的状态及其数据
- self.position = _role.position
- self.roleData= _role.roleData
- local _data =_role.data:Clone() --< 检查状态
- self.data:RoleBack( self, _data)
- self.Rage =_role.Rage
- self.RageGrow =_role.RageGrow -- 普通技能怒气成长
- self.SuperSkillRage =_role.SuperSkillRage -- 技能需要释放的怒气值,默认为4
- self.NoRageRate =_role.NoRageRate -- 不消耗怒气值的概率
- self.Rage =_role.Rage--self.Rage + self:GetRoleData(RoleDataName.InitRage)-- 当前怒气值
- self.aiOrder =_role.aiOrder
- self.aiIndex =_role.aiIndex
- self.aiTempCount =_role.aiTempCount
- self.IsDebug =_role.IsDebug
- self.lockTarget =_role.lockTarget --嘲讽
- self.ctrl_dizzy =_role.ctrl_dizzy --眩晕 不能释放所有技能
- self.ctrl_slient =_role.ctrl_slient --沉默 只能1技能
- self.ctrl_palsy =_role.ctrl_palsy --麻痹 只能2技能
- self.ctrl_noheal =_role.ctrl_noheal --禁疗
- self.ctrl_blind =_role.ctrl_blind --致盲
- self.ctrl_frozen =_role.ctrl_frozen --< 冰冻
- self.ctrl_chaos =_role.ctrl_chaos --< 混乱
- self.ctrl_chaos_beatBack =_role.ctrl_chaos_beatBack --< 混乱中的反击
- self.ctrltimes =_role.ctrltimes --< 控制次数
- self.stop_move =_role.stop_move --< 停止行动
- self.deadFilter =_role.deadFilter -- 控制死亡,置为false则角色暂时无法死亡
- self.reliveFilter =_role.reliveFilter -- 控制复活的标志位,置为false角色将不再享受复活效果
- self.reliveHPF =_role.reliveHPF
- self.IsCanAddSkill =_role.IsCanAddSkill -- 是否可以追加技能
- self.effect218times =_role.effect218times --< effect 218 触发次数
- self.skilling =_role.skilling --< 技能间
- self.randHitPos =_role.randHitPos --< 受击位置点
- self.miss_ctrl =_role.miss_ctrl --< 无视控制
- self.warWayType =_role.warWayType --< 战法类型
- self.isBeInfect = _role.isBeInfect
- self.movementRandom01=_role.movementRandom01
- end
- function RoleLogic:Clone()
- local _copy = RoleLogic.New()
- _copy.uid = self.uid
- _copy.position = self.position
- _copy.roleData = self.roleData
- _copy.roleId = self.roleId
- _copy.data = self.data:Clone(_copy)
- _copy.data:RoleBack(_copy,self.data)
- _copy.isDead = _copy:GetRoleData(RoleDataName.Hp) <= 0
- _copy.isRealDead = _copy.isDead
- _copy.camp = self.camp --阵营 0:我方 1:敌方
- _copy.name = self.name
- _copy.element = self.element
- _copy.professionId = self.professionId
- _copy.star = self.star or 1
-
- _copy.shield=self.shield:Clone() --护盾列表
- _copy.exCalDmgList=self.exCalDmgList:Clone() --额外计算伤害列表
- _copy.buffFilter=self.buffFilter:Clone() --buff屏蔽列表
- _copy.proTranList=self.proTranList:Clone() --属性转换列表
- _copy.Event=self.Event --< 此处回滚需要屏蔽!!
- -- self.skill = data.skill
- -- self.superSkill = data.superSkill
- _copy.skillArray = self.skillArray
- --首次读条时间=速度/(20*(等级+10)
- _copy.sp = self.sp
- -- local time = self:GetRoleData(RoleDataName.Speed)/(20*(self:GetRoleData(RoleDataName.Level)+10))
- _copy.spPass = self.spPass
- -- 初始化怒气值(
- _copy.Rage = self.Rage
- _copy.RageGrow = self.RageGrow -- 普通技能怒气成长
- _copy.SuperSkillRage = self.SuperSkillRage -- 技能需要释放的怒气值,默认为4
- _copy.NoRageRate = self.NoRageRate -- 不消耗怒气值的概率
- -- 被动技能
- _copy.passiveList = {}
- _copy.passivity = self.passivity
- _copy.passivityIds = self.passivityIds or {}
- --> 之前的一维改二维 每个passivity 包含多个
- if _copy.passivity and #_copy.passivity > 0 then
- for i = 1, #_copy.passivity do
- -- --> 用于效果被动反显示技能名
- -- self.tempPassivityId = nil
- -- if data.passivityIds and data.passivityIds[i] then
- -- self.tempPassivityId = data.passivityIds[i]
- -- end
- local v = _copy.passivity[i]
- local ids = v[1]
- for k = 1, #ids do
- local args = {}
- for j = 1, #v[k + 1] do
- args[j] = v[k + 1][j]
- end
- local id = ids[k]
- if BattleUtil.Passivity[id] then
- -- BattleUtil.Passivity[id](self, args) 被动加入了列表需要注意切换的时候只同步数据
- -- 计入日志
- -- local argtx=""
- -- for i,ar in pairs(args) do
- -- argtx = argtx.." "..i..": "..ar
- -- end
-
- -- BattleLogManager.Log(
- -- "insert Passivity idx:"..id.." "..argtx,
- -- "tcamp", self.camp,
- -- "tpos", self.position,
- -- "id", self.roleId
- -- )
- -- 加入被动列表
- table.insert(_copy.passiveList, {id, args})
- else
- end
- end
-
- end
- end
- -- 初始怒气值放在被动之后计算,使被动对初始怒气的影响生效
- --> deprecated
- _copy.Rage = self.Rage--self.Rage + self:GetRoleData(RoleDataName.InitRage)-- 当前怒气值
- --
- _copy.aiOrder =self.aiOrder
- _copy.aiIndex =self.aiIndex
- _copy.aiTempCount =self.aiTempCount
- _copy.IsDebug =self.IsDebug
- _copy.lockTarget =self.lockTarget --嘲讽
- _copy.ctrl_dizzy =self.ctrl_dizzy --眩晕 不能释放所有技能
- _copy.ctrl_slient =self.ctrl_slient --沉默 只能1技能
- _copy.ctrl_palsy =self.ctrl_palsy --麻痹 只能2技能
- _copy.ctrl_noheal =self.ctrl_noheal --禁疗
- _copy.ctrl_blind =self.ctrl_blind --致盲
- _copy.ctrl_frozen =self.ctrl_frozen --< 冰冻
- _copy.ctrl_chaos =self.ctrl_chaos --< 混乱
- _copy.ctrl_chaos_beatBack =self.ctrl_chaos_beatBack --< 混乱中的反击
- _copy.ctrltimes =self.ctrltimes --< 控制次数
- _copy.stop_move =self.stop_move --< 停止行动
- _copy.deadFilter =self.deadFilter -- 控制死亡,置为false则角色暂时无法死亡
- _copy.reliveFilter =self.reliveFilter -- 控制复活的标志位,置为false角色将不再享受复活效果
- _copy.reliveHPF =self.reliveHPF
- _copy.IsCanAddSkill =self.IsCanAddSkill -- 是否可以追加技能
- _copy.effect218times =self.effect218times --< effect 218 触发次数
- _copy.skilling =self.skilling --< 技能间
- _copy.randHitPos =self.randHitPos --< 受击位置点
- _copy.miss_ctrl =self.miss_ctrl --< 无视控制
- _copy.warWayType =self.warWayType --< 战法类型
- _copy.isBeInfect = self.isBeInfect
- _copy.movementRandom01 = self.movementRandom01
- _copy:InitRoleType() --< 初始目标类型
- return _copy
- end
- function RoleLogic:Init(uid, data, position)
- self.uid = uid
- self.position = position
- self.roleData = data
- self.roleId = data.roleId
- self.data:Init(self, data.property)
- self.isDead = self:GetRoleData(RoleDataName.Hp) <= 0
- self.isRealDead = self.isDead
- self.isFlagCrit = false
- self.camp = data.camp --阵营 0:我方 1:敌方
- self.name = data.name
- self.element = data.element
- self.professionId = data.professionId
- self.star = data.star or 1
- self.shield:Clear() --护盾列表
- self.exCalDmgList:Clear() --额外计算伤害列表
- self.buffFilter:Clear() --buff屏蔽列表
- self.proTranList:Clear() --属性转换列表
- self.Event:ClearEvent()
- -- self.skill = data.skill
- -- self.superSkill = data.superSkill
- self.skillArray = data.skillArray
- self.skillArrayBase = BattleUtil.cloneTable(data.skillArray)
- self.substitute = data.isTibu
- -- if self.substitute then
- -- LogError(self.uid .." true")
- -- else
- -- LogError(self.uid .."false")
- -- end
- --首次读条时间=速度/(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)
- -- 初始化怒气值(默认2)
- self.Rage = 2
- self.RageGrow = 2 -- 普通技能怒气成长
- self.SuperSkillRage = 4 -- 技能需要释放的怒气值,默认为4
- self.NoRageRate = 0 -- 不消耗怒气值的概率
- self.isFlagCrit = false -- 暴击标记
- self.passiveList = {}
-
- self.passivity = data.passivity
- self.passivityIds = data.passivityIds or {}
- --> 之前的一维改二维 每个passivity 包含多个
- if data.passivity and #data.passivity > 0 then
- for i = 1, #data.passivity do
- -- --> 用于效果被动反显示技能名
- -- self.tempPassivityId = nil
- -- if data.passivityIds and data.passivityIds[i] then
- -- self.tempPassivityId = data.passivityIds[i]
- -- end
- local v = data.passivity[i]
- local ids = v[1]
- for k = 1, #ids do
- local args = {}
- for j = 1, #v[k + 1] do
- args[j] = v[k + 1][j]
- end
- local id = ids[k]
-
- -- if BattleUtil.Passivity[id] then
- -- BattleUtil.Passivity[id](self, args)
- if BattleUtil.Passivity[id] then
- local delay = id/100
- if delay < 0.1 then
- delay = delay*4
- elseif delay > 1 then
- delay = delay/5 + 0.18
- end
- -- LogError("roleid:"..self.roleId.." p:"..id)
- BattleUtil.Passivity[id](self, args, 0)-- id/100)
- -- 计入日志
- local argtx=""
- for i,ar in pairs(args) do
- argtx = argtx.." "..i..": "..ar
- end
-
- -- BattleLogManager.Log(
- -- "insert Passivity idx:"..id.." "..argtx,
- -- "tcamp", self.camp,
- -- "tpos", self.position,
- -- "id", self.roleId
- -- )
- -- 加入被动列表
- table.insert(self.passiveList, {id, args})
- else
- -- -- 计入日志
- -- local argtx = ""
- -- for i ,ar in pairs(args) do
- -- argtx = argtx.." "..i..": "..ar
- -- end
- -- BattleLogManager.Log(
- -- "insert Passivity idx:"..id.." "..argtx,
- -- "tcamp", self.camp,
- -- "tpos", self.position,
- -- "id", self.roleId,
- -- )
- -- table.insert(self.passiveList, {id, args})
- -- else
- end
- end
- end
- end
- -- 初始怒气值放在被动之后计算,使被动对初始怒气的影响生效
- --> deprecated
- self.Rage = 0--self.Rage + self:GetRoleData(RoleDataName.InitRage)-- 当前怒气值
- --
- 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 --致盲
- self.ctrl_frozen = false --< 冰冻
- self.ctrl_chaos = false --< 混乱
- self.ctrl_chaos_beatBack = false --< 混乱中的反击
- self.ctrltimes = 0 --< 控制次数
- self.isBeInfect = false --<是否被传染
- self.isHoldBeatingBack = true --<是否触发反击状态 true 为未触发
- self.stop_move = false --< 停止行动
- self.deadFilter = true -- 控制死亡,置为false则角色暂时无法死亡
- self.deadRoundCounter = 0 -- 不可复活 死亡回合数标记(控制何时可以复活)
- self.reliveFilter = true -- 控制复活的标志位,置为false角色将不再享受复活效果
- self.reliveHPF = 1
- self.isOutGame = false -- 永久不可复活&&移除本场游戏
- self.IsCanAddSkill = true -- 是否可以追加技能
- self.movementRandom01 = 0 --< 固定回合一次跟新随机数
- self.effect218times = 0 --< effect 218 触发次数
- self.skilling = false --< 技能间
- self.randHitPos = {} --< 受击位置点
- self.miss_ctrl = false --< 无视控制
- self.warWayType = {} --< 战法类型
- self:InitRoleType() --< 初始目标类型
- self:InitMovementSeed() --< 初始化回合变化随机数
- end
- function RoleLogic:InitMovementSeed()
- local _round = -1
- local changeSeed = function ()
- local round = BattleLogic.GetCurRound()
- if _round == round then
- return
- else
- _round=round
- if Random.Range01() <= 0.5 then
- self.movementRandom01 = 0
- else
- self.movementRandom01 = 1
- end
- end
- end
- self.Event:AddEvent(BattleEventName.RoleTurnStart,changeSeed)
- end
- local function tableKin(_tb,_k)
- for k,v in pairs(_tb) do
- if k==_k then return true end
- end
- return false
- end
- function RoleLogic:GetData(name)
- return self:GetRoleData(name)
- end
- -- 被动接受替补buff
- function RoleLogic:AddPassiveByOther(passivity)
- if passivity and #passivity > 0 then
- for i = 1, #passivity do
- -- --> 用于效果被动反显示技能名
- -- self.tempPassivityId = nil
- -- if data.passivityIds and data.passivityIds[i] then
- -- self.tempPassivityId = data.passivityIds[i]
- -- end
- local v = passivity[i]
- local ids = v[1]
- for k = 1, #ids do
- local args = {}
- for j = 1, #v[k + 1] do
- args[j] = v[k + 1][j]
- end
- local id = ids[k]
- -- LogError("~~~~~~~~~~~~~~~ByOther oooooooo"..id)
- if BattleUtil.Passivity[id] then
- BattleUtil.Passivity[id](self, args, 0)-- id/100)
- -- 加入被动列表
- -- LogError("~~~~~~~~~~~~~~~ByOther"..id)
- table.insert(self.passiveList, {id, args})
- else
- end
- end
- end
- end
- end
- local function tableKin(_tb,_k)
- for k,v in pairs(_tb) do
- if k == _k then return true end
- end
- return false
- end
- function RoleLogic:GetData(name)
- return self:GetRoleData(name)
- 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, 0)-- id/100)
-
- -- 加入被动列表
- table.insert(self.passiveList, {id, args})
- end
- function RoleLogic:CanCastSkill()
- return self.sp >= self.spPass and not self.IsDebug
- 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:SetValue(property,date)
- self.data:SetValue(property,date)
- end
- function RoleLogic:GetRoleData(property)
- local tarPro = self.data:GetData(property)
- --> 战斗加成在此处理
- if property == RoleDataName.Attack then
- tarPro = BattleUtil.FP_Mul(tarPro, (1 + self.data:GetData(RoleDataName.AttackAddition)))
- elseif property == RoleDataName.PhysicalDefence then
- tarPro = BattleUtil.FP_Mul(tarPro, (1 + self.data:GetData(RoleDataName.ArmorAddition)))
- elseif property == RoleDataName.Hp then
- tarPro = BattleUtil.FP_Mul(tarPro, (1 + self.data:GetData(RoleDataName.MaxHpPercentage)))
- elseif property == RoleDataName.MaxHp then
- tarPro = BattleUtil.FP_Mul(tarPro, (1 + self.data:GetData(RoleDataName.MaxHpPercentage)))
- elseif property == RoleDataName.Speed then
- tarPro = BattleUtil.FP_Mul(tarPro, (1 + self.data:GetData(RoleDataName.SpeedAddition)))
- end
- 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
- -- 是否为指定id,指定星级的英雄 by:王振兴 2020/07/29
- function RoleLogic:IsAssignHeroAndHeroStar(id,star)
- if self.roleId==id and self.star==star then
- return true
- end
- return false
- end
- function RoleLogic:AddBuff(buff)
- -- BattleLogManager.Log(
- -- self.roleId..": AddBuff",
- -- "camp", self.camp,
- -- "pos", self.position,
- -- "type", buff.type,
- -- -- "isRage", tostring(isRage),
- -- "id", buff.id
- -- )
- if self:IsRealDead() then
- BattleLogic.BuffMgr:PutBuff(buff)
- return
- end
- -- buff的miss率
- local missF = 0
- -- 检测被动对miss概率的影响
- local cl = {}
- local function _CallBack(v, ct)
- if v then
- table.insert(cl, {v, ct})
- end
- end
- BattleLogic.Event:DispatchEvent(BattleEventName.RoleAddBuffMiss, _CallBack, self, buff)
- missF = BattleUtil.CountChangeList(missF, cl)
- local ImmuneTrigger = function(_buff)
- buff=_buff
- end
- -- 如果概率为0 或者没有miss
- if missF == 0 or not BattleUtil.RandomAction(missF, function() BattleLogic.BuffMgr:PutBuff(buff) end) then
- for i=1, self.buffFilter.size do
- if self.buffFilter.buffer[i](buff) then
- self.Event:DispatchEvent(BattleEventName.ImmuneTrigger,buff,ImmuneTrigger)
- BattleLogic.BuffMgr:PutBuff(buff)
- return
- end
- end
- BattleLogic.BuffMgr:AddBuff(self, buff)
- end
- end
- function RoleLogic:RemoveBuff(checkFunc)
- if checkFunc then
- BattleLogic.BuffMgr:RemoveBuff(self, checkFunc)
- end
- end
- function RoleLogic:Dispose()
- self.shield:Clear() --护盾列表
- self.exCalDmgList:Clear() --额外计算伤害列表
- self.buffFilter:Clear() --buff屏蔽列表
- self.proTranList:Clear() --属性转换列表
- self.Event:ClearEvent()
- self:RemoveBuff(function(buff) return true end)
- end
- -- 判断角色是否可以释放技能
- function RoleLogic:IsAvailable()
- if self:IsRealDead() then
- return false
- end
- if self.stop_move then--< 停止行动
- return false
- end
-
- --> ctrl
- if self.miss_ctrl then
- return true
- else
- --> 眩晕
- if self.ctrl_dizzy then
- return false
- end
- --> 冰冻
- if self.ctrl_frozen then
- return false
- end
- -- 沉默麻痹同时存在
- if self.ctrl_palsy and self.ctrl_slient then
- return false
- end
- 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(_CastDone)
- -- -- 没有沉默,释放大技能
- -- 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
- skill:Cast(_CastDone)
- end
- -- 加入一个技能
- -- type 加入的技能类型 --< 修改为physical magic
- -- targets 指定目标
- -- isAdd 是否是追加技能
- -- effectData 战斗技能数据
- function RoleLogic:AddSkill(type, isAdd, targets, effectData)
-
- if not self.IsCanAddSkill and isAdd then return end
- -- local effectData = type == BattleSkillType.Normal and self.skill or self.superSkill
- SkillManager.AddSkill(self, effectData, type, targets, isAdd)
- --
- -- BattleLogManager.Log(
- -- self.roleId..":Add Skill",
- -- "camp", self.camp,
- -- "pos", self.position,
- -- "type", type,
- -- -- "isRage", tostring(isRage),
- -- "isAdd", tostring(isAdd),
- -- "targets", targets and #targets or "0"
- -- )
- end
- -- 插入一个技能
- function RoleLogic:InsertSkill(type, isAdd, targets, effectData, skillSubType)
- if not self.IsCanAddSkill and isAdd then return end
- -- local effectData = type == BattleSkillType.Normal and self.skill or self.superSkill
- SkillManager.InsertSkill(self, effectData, type, targets, isAdd, skillSubType)
- --
- -- BattleLogManager.Log(
- -- "Insert Skill",
- -- "camp", self.camp,
- -- "pos", self.position,
- -- "type", type,
- -- -- "isRage", tostring(isRage),
- -- "isAdd", tostring(isAdd),
- -- "targets", targets and #targets or "0"
- -- )
- end
- -- 设置是否可以追加技能
- function RoleLogic:SetIsCanAddSkill(isCan)
- self.IsCanAddSkill = isCan
- end
- -- 正常触发技能
- function RoleLogic:CastSkill(func)
- -- 设置轮转方法
- SkillManager.SetTurnRoundFunc(func)
- local haveSkill = false
- -- 没有沉默
- -- if not self.ctrl_slient and self.Rage >= self.SuperSkillRage then
-
- if (not self.ctrl_slient and not self.ctrl_chaos) or self.miss_ctrl then --< 混乱只释放普攻
-
- local isHave, skilldata = self:CheckSkill(SkillBaseType.Magic)
- -- 释放大技能
- if isHave then
- self:AddSkill(SkillBaseType.Magic, true, nil, skilldata)
- haveSkill = true
- else
- local isHave_p, skilldata_p = self:CheckSkill(SkillBaseType.Physical)
- if isHave_p then
- self:AddSkill(SkillBaseType.Physical, true, nil, skilldata_p)
- haveSkill = true
- else
- LogError("RoleLogic CastSkill not have physical skill_1 !!!")
- end
- end
-
- return haveSkill
- end
- -- 没有麻痹 释放普通技能
- if not self.ctrl_palsy or self.miss_ctrl then
-
- local isHave, skilldata = self:CheckSkill(SkillBaseType.Physical)
- if isHave then
- self:AddSkill(SkillBaseType.Physical, true, nil, skilldata)
- haveSkill = true
- else
- LogError("CastSkill not have physical skill_2 !!!")
- end
- return haveSkill
- end
-
- LogError("### 无法填装技能")
- return haveSkill
-
- 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:SetSubstitute(isTibu)
- self.substitute=isTibu
- end
- --判断是否为替补属性
- function RoleLogic:IsSubstitute()
- return self.substitute
- end
- -- 判断是否可以去死了
- function RoleLogic:IsCanDead()
- -- 暂时不能死
- if not self.deadFilter then
- return false
- end
- -- 还有我的技能没有释放,不能死啊
- --> 去掉死亡后释放问题
- -- if SkillManager.HaveMySkill(self) then
- -- return false
- -- end
- return true
- end
- -- 真的去死
- function RoleLogic:GoDead()
- if self:IsCanDead() then
- self.isRealDead = true
- -- self.Rage = 0
- BattleLogic.BuffMgr:ClearBuff(self)
- BattleLogic.BuffMgr:RemoveBuffQueneBy(function(buff)
- return buff.target == self
- end)
- self.Event:DispatchEvent(BattleEventName.RoleRealDead, self)
- BattleLogic.Event:DispatchEvent(BattleEventName.RoleRealDead, self)
- return true
- end
- return false
- end
- -- 设置是否可以死亡
- function RoleLogic:SetDeadFilter(filter)
- self.deadFilter = filter
- end
- -- 要死了
- function RoleLogic:SetDead()
- self.isDead = true
- RoleManager.AddDeadRole(self)
- end
- -- 判断是否死亡
- function RoleLogic:IsDead()
- return self.isDead
- end
- function RoleLogic:IsRealDead()
- return self.isRealDead
- end
- -- 是否可以复活
- function RoleLogic:IsCanRelive()
- if self.isOutGame then
- return false
- end
- if not self.reliveFilter then
- return false
- end
- if not self.isRealDead then
- return false
- end
- return true
- end
- -- 复活吧, 真的去世后才能复活
- function RoleLogic:Relive()
- if self:IsCanRelive() then
- -- 没有指定血量则满血
- self.isDead = false
- self.isRealDead = false
- --[[
- BattleLogic.WaitForTrigger(0.1, function()
- BattleLogic.BuffMgr:ClearBuff(self)
- end)
- ]]
-
- local maxHp = self.data:GetData(RoleDataName.MaxHp)
- -- RoleManager.LogCa(
- -- "curframe:"..BattleLogic.CurFrame(),
- -- "Relive:"..maxHp,
- -- "RoleDataName.Hp:"..floor(self.reliveHPF * maxHp)
- -- )
- --LogError("self.reliveHPF"..self.reliveHPF)
- --LogError("hp"..floor(self.reliveHPF * maxHp))
- self.data:SetValue(RoleDataName.Hp, floor(self.reliveHPF * maxHp))
- -- 发送复活事件
- self.Event:DispatchEvent(BattleEventName.RoleRelive, self)
- BattleLogic.Event:DispatchEvent(BattleEventName.RoleRelive, self)
- return true
- end
- return false
- end
- -- 永久死亡&移除本局游戏
- function RoleLogic:SetOutBattle()
- self.isOutGame = true
- self:SetReliveFilter(false)
- end
- -- 设置是否可以复活
- function RoleLogic:SetReliveFilter(filter)
- if self.isOutGame and filter then --移除游戏后无法复活
- return
- end
- -- LogError(self.roleId.." SetReliveFilter "..tostring(filter))
- self.reliveFilter = filter
- end
- --,hpf 复活时拥有的血量的百分比
- function RoleLogic:SetRelive(hpf)
- -- 判断是否可以复活
- if self:IsCanRelive() then
- self.reliveHPF = hpf or 1
- RoleManager.AddReliveRole(self)
- end
- return false
- end
- --> 检测技能list中 可释放的技能
- function RoleLogic:CheckSkill(skilltype)
- local CurRound, MaxRound = BattleLogic.GetCurRound()
- if CurRound == 0 then
-
- return false, nil
- end
- for k, skill in ipairs(self.skillArray) do
- while true
- do
- if skilltype == SkillBaseType.Physical and skill[8].slot ~= SkillSlotPos.Slot_0 then --< 物理技能 排除magic skill
- break
- end
- if skilltype == SkillBaseType.Magic and skill[8].slot == SkillSlotPos.Slot_0 then
- break
- end
- local skillid = skill[1]
- local cd = skill[8].cd
- local release = skill[8].release
-
- --> cd为间隔数
- if CurRound == release then --< 起始回合
-
- return true, skill
- elseif CurRound > release and (CurRound - release) % (cd + 1) == 0 then --< cd回合
-
- return true, skill
- end
- break
- end
- end
-
- return false, nil
- end
- function RoleLogic:Update()
- end
- --> 初始人物为什么类型目标
- function RoleLogic:InitRoleType()
- if self.skillArray then
- for i = 1, #self.skillArray do
- if self.skillArray[i][9] then
- for j = 2, #self.skillArray[i][9] do
- if self.skillArray[i][9][j] then
- local effectType = self.skillArray[i][9][j][1]
- if effectType == 245 then
- self.miss_ctrl = true
- end
- end
- end
- end
- end
- end
- -- if self.passivity and self.passivity[1] and self.passivity[1][1] then
- -- for i = 1, #self.passivity[1][1] do
- -- local pEffectType = self.passivity[1][1][i]
- -- if pEffectType == 314 or pEffectType == 367 then
- -- self.isReliveOrSoulRole = true
- -- end
- -- end
- -- end
- --> 战法 --目前所以被动组都在其中
- self.warWayType = {}
- for k, v in ipairs(self.passivityIds) do
- local passivityIdStr = tostring(v)
- local passivityGroup = tonumber(string.sub(passivityIdStr, 1, -2))
- self.warWayType[passivityGroup] = 0
- end
- end
|