2019-03-12 14:05:45 +08:00
|
|
|
|
local effect = require("Modules/Battle/Logic/Base/Effect")
|
|
|
|
|
local floor = math.floor
|
|
|
|
|
local max = math.max
|
2019-03-21 14:33:56 +08:00
|
|
|
|
local min = math.min
|
2019-03-12 14:05:45 +08:00
|
|
|
|
--local BattleConst = BattleConst
|
|
|
|
|
--local RoleDataName = RoleDataName
|
|
|
|
|
--local BattleEventName = BattleEventName
|
|
|
|
|
|
2019-03-25 10:58:38 +08:00
|
|
|
|
local effectPool = BattleObjectPool.New(function ()
|
2019-04-17 21:04:32 +08:00
|
|
|
|
return { type = 0, args = {}} -- type, {args, ...}
|
2019-03-25 10:58:38 +08:00
|
|
|
|
end)
|
|
|
|
|
local effectGroupPool = BattleObjectPool.New(function ()
|
2019-04-17 21:04:32 +08:00
|
|
|
|
return { chooseId = 0, duration = 0, effects = {}} -- chooseId, duration, {effect1, effect2, ...}
|
2019-03-25 10:58:38 +08:00
|
|
|
|
end)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
|
|
|
|
|
Skill = {}
|
|
|
|
|
|
2019-03-21 14:33:56 +08:00
|
|
|
|
function Skill:New()
|
2019-10-23 13:40:57 +08:00
|
|
|
|
local o = {cd=0,effectList = BattleList.New(),owner=0,sp=0,spPass=0,isTeamSkill=false,teamSkillType=0 }
|
2019-03-21 14:33:56 +08:00
|
|
|
|
setmetatable(o, self)
|
|
|
|
|
self.__index = self
|
|
|
|
|
return o
|
|
|
|
|
end
|
|
|
|
|
|
2019-10-10 11:03:42 +08:00
|
|
|
|
function Skill:Init(role, effectData, type) --type 0 异妖 1 点技 2 滑技
|
|
|
|
|
local isTeamSkill = type == 0
|
|
|
|
|
if type == 0 then --异妖
|
2019-10-21 14:25:32 +08:00
|
|
|
|
self.cd = effectData[1] % 100 --异妖技能的cd数据为:类型*100 + 站位
|
2019-10-10 11:03:42 +08:00
|
|
|
|
self.randomInStage2 = 0
|
|
|
|
|
elseif type == 1 then --点技
|
|
|
|
|
self.cd = 0 --点技 cd为0
|
|
|
|
|
self.randomInStage2 = 0
|
|
|
|
|
elseif type == 2 then --滑技
|
|
|
|
|
self.cd = effectData[1] % 100 --上滑技的cd数据为:中期上滑概率*100000 + cd
|
|
|
|
|
self.randomInStage2 = (effectData[1] - self.cd) / 100000
|
|
|
|
|
end
|
2019-03-12 14:05:45 +08:00
|
|
|
|
|
|
|
|
|
--skill = {cd, {目标id1, 效果时间, 效果1, 效果2, ...},{目标id2, 效果时间, 效果3, 效果4, ...}, ...}
|
|
|
|
|
--效果 = {效果类型id, 效果参数1, 效果参数2, ...}
|
2019-03-21 14:33:56 +08:00
|
|
|
|
self.effectList:Clear()
|
|
|
|
|
self.owner = role
|
2019-07-25 16:20:33 +08:00
|
|
|
|
self.isTeamSkill = isTeamSkill
|
|
|
|
|
self.teamSkillType = isTeamSkill and floor(effectData[1] / 100) or 0
|
2019-03-12 14:05:45 +08:00
|
|
|
|
|
|
|
|
|
for i=2, #effectData do
|
2019-04-17 21:04:32 +08:00
|
|
|
|
local v = effectData[i]
|
2019-03-25 10:58:38 +08:00
|
|
|
|
local effectGroup = effectGroupPool:Get() -- chooseId, duration, {effect1, effect2, ...}
|
2019-04-17 21:04:32 +08:00
|
|
|
|
effectGroup.chooseId = v[1] --chooseId
|
|
|
|
|
effectGroup.duration = v[2] --duration
|
2019-03-12 14:05:45 +08:00
|
|
|
|
for j=3, #v do --effectList
|
2019-03-25 10:58:38 +08:00
|
|
|
|
local effect = effectPool:Get() -- type, {args, ...}
|
2019-04-17 21:04:32 +08:00
|
|
|
|
effect.type = v[j][1]
|
2019-03-12 14:05:45 +08:00
|
|
|
|
for k=2, #v[j] do
|
2019-04-17 21:04:32 +08:00
|
|
|
|
effect.args[k-1] = v[j][k]
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
2019-04-17 21:04:32 +08:00
|
|
|
|
effectGroup.effects[j-2] = effect
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
2019-03-21 14:33:56 +08:00
|
|
|
|
self.effectList:Add(effectGroup)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
2019-03-21 14:33:56 +08:00
|
|
|
|
end
|
2019-03-12 14:05:45 +08:00
|
|
|
|
|
2019-03-25 10:58:38 +08:00
|
|
|
|
function Skill:Dispose()
|
|
|
|
|
while self.effectList.size > 0 do
|
2019-04-17 21:04:32 +08:00
|
|
|
|
local effectGroup = self.effectList.buffer[self.effectList.size]
|
|
|
|
|
for k=1, #effectGroup.effects do
|
|
|
|
|
local effect = effectGroup.effects[k]
|
|
|
|
|
for j=1, #effect.args do
|
|
|
|
|
effect.args[j] = nil
|
2019-03-25 19:41:30 +08:00
|
|
|
|
end
|
|
|
|
|
effectPool:Put(effect)
|
2019-04-17 21:04:32 +08:00
|
|
|
|
effectGroup.effects[k] = nil
|
2019-03-25 10:58:38 +08:00
|
|
|
|
end
|
|
|
|
|
effectGroupPool:Put(effectGroup)
|
|
|
|
|
self.effectList:Remove(self.effectList.size)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2019-04-17 21:04:32 +08:00
|
|
|
|
local function takeEffect(caster, target, effects, duration)
|
|
|
|
|
for k=1, #effects do
|
|
|
|
|
local e = effects[k]
|
|
|
|
|
effect[e.type](caster, target, e.args, duration)
|
|
|
|
|
if BattleLogic.IsOpenBattleRecord then
|
|
|
|
|
BattleLogic.RecordEffect(caster, target, e.type, e.args, duration)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Skill:Cast()
|
2019-03-21 14:33:56 +08:00
|
|
|
|
for i=1, self.effectList.size do
|
|
|
|
|
local effectGroup = self.effectList.buffer[i]
|
2019-04-17 21:04:32 +08:00
|
|
|
|
local chooseId = effectGroup.chooseId
|
2019-06-05 11:29:24 +08:00
|
|
|
|
local arr = BattleUtil.ChooseTarget(self.owner, chooseId)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
if #arr > 0 then
|
2019-04-17 21:04:32 +08:00
|
|
|
|
--效果延迟1帧生效
|
|
|
|
|
BattleLogic.WaitForTrigger(BattleLogic.GameDeltaTime, function()
|
|
|
|
|
local duration = effectGroup.duration
|
|
|
|
|
local effects = effectGroup.effects
|
2019-10-23 13:40:57 +08:00
|
|
|
|
local weight = floor(chooseId % 10000 / 100)
|
2019-05-10 19:31:20 +08:00
|
|
|
|
local count = min(chooseId % 10, #arr)
|
2019-05-07 20:01:07 +08:00
|
|
|
|
if count == 0 then
|
|
|
|
|
count = #arr
|
|
|
|
|
end
|
2019-04-20 13:02:14 +08:00
|
|
|
|
if chooseId == 10000 or chooseId == 20000 then --10000 我方aoe 20000 敌方aoe
|
|
|
|
|
local camp = chooseId == 10000 and self.owner.camp or 1 - self.owner.camp
|
|
|
|
|
self.owner.Event:DispatchEvent(BattleEventName.AOE, camp)
|
2019-05-07 20:01:07 +08:00
|
|
|
|
for j=1, count do
|
2019-04-17 21:04:32 +08:00
|
|
|
|
takeEffect(self.owner, arr[j], effects, duration)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
2019-10-23 13:40:57 +08:00
|
|
|
|
elseif weight == 8 then --对位相邻的目标同时触发效果
|
2019-05-07 20:01:07 +08:00
|
|
|
|
for j=1, count do
|
2019-04-17 21:04:32 +08:00
|
|
|
|
takeEffect(self.owner, arr[j], effects, duration)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
|
|
|
|
else
|
2019-03-21 14:33:56 +08:00
|
|
|
|
local d = duration / (count + 1) --分割多人目标施加效果的时间,按照(1+1+..+2)的时间权重占比分配
|
|
|
|
|
for j=1, count do
|
2019-03-12 14:05:45 +08:00
|
|
|
|
local index = j
|
2019-03-21 14:33:56 +08:00
|
|
|
|
local cd = j == count and d * 2 or d
|
2019-03-12 14:05:45 +08:00
|
|
|
|
BattleLogic.WaitForTrigger(d * (j-1), function()
|
|
|
|
|
local r = arr[index]
|
2019-03-21 14:33:56 +08:00
|
|
|
|
if not r or r.isDead then --当被选取的目标已经死亡或者没有,则重新选取,若重新选取的目标也死亡或者没有,则从之前的目标中选取第一个不死亡的
|
2019-06-05 11:29:24 +08:00
|
|
|
|
arr = BattleUtil.ChooseTarget(self.owner, chooseId)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
r = arr[index]
|
|
|
|
|
if not r then --当没有新增的被选取目标时,可能为空
|
|
|
|
|
for i=1, #arr do
|
|
|
|
|
if not arr[i].isDead then
|
2019-04-17 21:04:32 +08:00
|
|
|
|
takeEffect(self.owner, arr[i], effects, cd)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if not r then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
2019-04-17 21:04:32 +08:00
|
|
|
|
takeEffect(self.owner, r, effects, cd)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
end
|
2019-04-17 21:04:32 +08:00
|
|
|
|
|
|
|
|
|
if not self.isTeamSkill then
|
|
|
|
|
if self.owner.superSkill == self then
|
2019-10-23 13:40:57 +08:00
|
|
|
|
--绝技读条时间=max(9-速度/(8*(等级+10)),3)
|
|
|
|
|
local time = max(9-self.owner:GetRoleData(RoleDataName.Speed)/(8*(self.owner:GetRoleData(RoleDataName.Level)+10)), 3)
|
|
|
|
|
self.owner.sp = 0
|
|
|
|
|
self.owner.spPass = floor(BattleUtil.ErrorCorrection(time) * BattleLogic.GameFrameRate)
|
2019-04-17 21:04:32 +08:00
|
|
|
|
else
|
2019-10-23 13:40:57 +08:00
|
|
|
|
--普技读条时间=max(7-速度/(8*(等级+10)),1.5)
|
|
|
|
|
local time = max(7-self.owner:GetRoleData(RoleDataName.Speed)/(8*(self.owner:GetRoleData(RoleDataName.Level)+10)), 1.5)
|
|
|
|
|
self.owner.sp = 0
|
|
|
|
|
self.owner.spPass = floor(BattleUtil.ErrorCorrection(time) * BattleLogic.GameFrameRate)
|
2019-04-17 21:04:32 +08:00
|
|
|
|
end
|
|
|
|
|
else
|
2019-07-11 15:18:00 +08:00
|
|
|
|
self.owner.curSkill = self
|
2019-04-17 21:04:32 +08:00
|
|
|
|
end
|
2019-10-23 13:40:57 +08:00
|
|
|
|
self.owner.Event:DispatchEvent(BattleEventName.SkillCast, self)
|
|
|
|
|
BattleLogic.Event:DispatchEvent(BattleEventName.SkillCast, self)
|
2019-04-17 21:04:32 +08:00
|
|
|
|
|
2019-05-07 20:01:07 +08:00
|
|
|
|
--技能的施法时间计算,根据当前目标id关联的持续时间,取其中时间最长的一个
|
2019-04-17 21:04:32 +08:00
|
|
|
|
local duration = 0
|
|
|
|
|
for i=1, self.effectList.size do
|
|
|
|
|
duration = max(duration, self.effectList.buffer[i].duration)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
BattleLogic.SetSkillUsable(self.owner.camp, false)
|
|
|
|
|
BattleLogic.WaitForTrigger(duration, function()
|
|
|
|
|
BattleLogic.SetSkillUsable(self.owner.camp, true)
|
2019-10-23 13:40:57 +08:00
|
|
|
|
self.owner.Event:DispatchEvent(BattleEventName.SkillCastEnd, self)
|
|
|
|
|
BattleLogic.Event:DispatchEvent(BattleEventName.SkillCastEnd, self)
|
2019-04-17 21:04:32 +08:00
|
|
|
|
end)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|