diff --git a/src/adv/AdvPlayer.lua b/src/adv/AdvPlayer.lua index a7c7fc1..9df6cd1 100644 --- a/src/adv/AdvPlayer.lua +++ b/src/adv/AdvPlayer.lua @@ -1,5 +1,6 @@ -- 角色 local Buff = require "adv.AdvBuff" +local Skill = require "adv.AdvSkill" local Passive = require "adv.AdvPassive" local BaseObject = class("BaseObject") @@ -319,89 +320,12 @@ end function BaseObject:releaseSkill(skillId, skillLevel, target) if self:hadBuff(Buff.CANT_SKILL) then return end -- 针对 怪物 - skillLevel = skillLevel or 1 - local skillData = csvdb["adv_skillCsv"][skillId][skillLevel or 1] - local targetChoose = skillData.target:toArray(true, "=") - local targetNum = skillData.targetNum:toArray(true, "=") - --确定目标 - local targets = {} - if targetChoose[1] == 0 then --选定一个 - assert(target, "error " .. self.class.__cname .. " releaseSkill id: " .. skillId .." targetChoose==0 but no target") - table.insert(targets, target) - elseif targetChoose[1] == 1 then --全部 - if not targetChoose[2] or targetChoose[2] == 0 then - targets = self:getTeam(0) - else --指定 monsterId - local team = self:getTeam(0) - for _, one in pairs(team) do - if one.monsterId and one.monsterId == targetChoose[2] then - table.insert(targets, one) - end - end - end - elseif targetChoose[1] == 2 then -- 我方 - if targetChoose[2] == 1 then - table.insert(targets, self) - elseif targetChoose[2] == 2 then - targets = self:getTeam(1, true) - elseif targetChoose[2] == 3 then - targets = self:getTeam(1) - end - elseif targetChoose[1] == 3 then -- 敌方 - targets = self:getTeam(2) - end - - if targetChoose[1] ~= 0 then -- 不是指定一个的进行 排序 和 数量筛选 - local tempT = targets - local targets = {} - local function randNum(isSort) - if #tempT <= targetNum[2] then - targets = tempT - return - end - if isSort then - for i = 1, targetNum[2] do - table.insert(targets, tempT[i]) - end - else - for i = 1, targetNum[2] do - local idx = math.randomInt(1, #tempT) - table.insert(targets, tempT[idx]) - table.remove(tempT, idx) - end - end - end - if targetNum[1] == 0 then --任意排序 - randNum(false) - elseif targetNum[1] == 1 then --血量从低到高 - table.sort(tempT, function(o1, o2) - return o1.hp < o2.hp - end) - randNum(true) - elseif targetNum[1] == 2 then --血量从高到低 - table.sort(tempT, function(o1, o2) - return o1.hp > o2.hp - end) - randNum(true) - else - targets = tempT --all - end - end + local skill = Skill.new(self, {id = skillId, level = skillLevel, target = target}) --返回客户端 - for _, target in ipairs(targets) do + for _, target in ipairs(skill:getTargets()) do self.battle.adv:backSkill(self.id, skillId, target.id) end - -- 增加buff - for _, buffId in ipairs(skillData.selfbuff:toArray(true, "=")) do - self:addBuff(buffId, self) - end - - for _, buffId in ipairs(skillData.targetbuff:toArray(true, "=")) do - for _, target_ in ipairs(targets) do - target_:addBuff(buffId, self) - end - end - + skill:doEffect() for _, team in ipairs(self:getTeam(2)) do team:triggerPassive(Passive.TARGET_SKILL) end diff --git a/src/adv/AdvSkill.lua b/src/adv/AdvSkill.lua new file mode 100644 index 0000000..7e194e3 --- /dev/null +++ b/src/adv/AdvSkill.lua @@ -0,0 +1,110 @@ +local Skill = class("Skill") + +function Skill:ctor(owner, data) + self.owner = owner + self.id = data.id + self.level = data.level or 1 + self.defaultTarget = data.target + + self.skillData = csvdb["adv_skillCsv"][self.id][self.level] + self.targets = self:initTargets() +end + +function Skill:initTargets() + local sideFilter = self.skillData.target:toArray(true, "=") + local sType, aType = sideFilter[1], sideFilter[2] + local targets = self:filterBySide(sType, aType) + if sType ~= 0 then + targets = self:filterByNum(targets) + end + return targets +end + +function Skill:filterBySide(sideType, aimType) + local targets = {} + local targetChoose = self.skillData.target:toArray(true, "=") + --确定目标 + if sideType == 0 then --选定一个 + assert(self.defaultTarget, "error " .. self.class.__cname .. " releaseSkill id: " .. self.id .." targetChoose==0 but no target") + table.insert(targets, self.defaultTarget) + elseif sideType == 1 then --全部 + if not aimType or aimType == 0 then + targets = self.owner:getTeam(0) + else --指定 monsterId + local team = self.owner:getTeam(0) + for _, one in pairs(team) do + if one.monsterId and one.monsterId == aimType then + table.insert(targets, one) + end + end + end + elseif sideType == 2 then -- 我方 + if aimType == 1 then + table.insert(targets, self) + elseif aimType == 2 then + targets = self.owner:getTeam(1, true) + elseif aimType == 3 then + targets = self.owner:getTeam(1) + end + elseif sideType == 3 then -- 敌方 + targets = self.owner:getTeam(2) + end + return targets +end + +function Skill:filterByNum(targets) + local targetNum = self.skillData.targetNum:toArray(true, "=") + -- 不是指定一个的进行 排序 和 数量筛选 + local tempT = targets + local newTargets = {} + local function randNum(isSort) + if #tempT <= targetNum[2] then + newTargets = tempT + return + end + if isSort then + for i = 1, targetNum[2] do + table.insert(newTargets, tempT[i]) + end + else + for i = 1, targetNum[2] do + local idx = math.randomInt(1, #tempT) + table.insert(newTargets, tempT[idx]) + table.remove(tempT, idx) + end + end + end + if targetNum[1] == 0 then --任意排序 + randNum(false) + elseif targetNum[1] == 1 then --血量从低到高 + table.sort(tempT, function(o1, o2) + return o1.hp < o2.hp + end) + randNum(true) + elseif targetNum[1] == 2 then --血量从高到低 + table.sort(tempT, function(o1, o2) + return o1.hp > o2.hp + end) + randNum(true) + else + newTargets = tempT --all + end + return newTargets +end + +function Skill:doEffect() + for _, buffId in ipairs(self.skillData.selfbuff:toArray(true, "=")) do + self.owner:addBuff(buffId, self.owner) + end + for _, buffId in ipairs(self.skillData.targetbuff:toArray(true, "=")) do + for _, target_ in ipairs(self.targets) do + target_:addBuff(buffId, self.owner) + end + end +end + +function Skill:getTargets() + return self.targets +end + +return Skill \ No newline at end of file -- libgit2 0.21.2