Commit 1b8336a6c5634c886f759da4665f7112fcd7c1e0

Authored by suhongyang
1 parent 8d8bf91a

skill逻辑与player分开

Showing 2 changed files with 114 additions and 80 deletions   Show diff stats
src/adv/AdvPlayer.lua
1 1 -- 角色
2 2 local Buff = require "adv.AdvBuff"
  3 +local Skill = require "adv.AdvSkill"
3 4 local Passive = require "adv.AdvPassive"
4 5  
5 6 local BaseObject = class("BaseObject")
... ... @@ -319,89 +320,12 @@ end
319 320  
320 321 function BaseObject:releaseSkill(skillId, skillLevel, target)
321 322 if self:hadBuff(Buff.CANT_SKILL) then return end -- 针对 怪物
322   - skillLevel = skillLevel or 1
323   - local skillData = csvdb["adv_skillCsv"][skillId][skillLevel or 1]
324   - local targetChoose = skillData.target:toArray(true, "=")
325   - local targetNum = skillData.targetNum:toArray(true, "=")
326   - --确定目标
327   - local targets = {}
328   - if targetChoose[1] == 0 then --选定一个
329   - assert(target, "error " .. self.class.__cname .. " releaseSkill id: " .. skillId .." targetChoose==0 but no target")
330   - table.insert(targets, target)
331   - elseif targetChoose[1] == 1 then --全部
332   - if not targetChoose[2] or targetChoose[2] == 0 then
333   - targets = self:getTeam(0)
334   - else --指定 monsterId
335   - local team = self:getTeam(0)
336   - for _, one in pairs(team) do
337   - if one.monsterId and one.monsterId == targetChoose[2] then
338   - table.insert(targets, one)
339   - end
340   - end
341   - end
342   - elseif targetChoose[1] == 2 then -- 我方
343   - if targetChoose[2] == 1 then
344   - table.insert(targets, self)
345   - elseif targetChoose[2] == 2 then
346   - targets = self:getTeam(1, true)
347   - elseif targetChoose[2] == 3 then
348   - targets = self:getTeam(1)
349   - end
350   - elseif targetChoose[1] == 3 then -- 敌方
351   - targets = self:getTeam(2)
352   - end
353   -
354   - if targetChoose[1] ~= 0 then -- 不是指定一个的进行 排序 和 数量筛选
355   - local tempT = targets
356   - local targets = {}
357   - local function randNum(isSort)
358   - if #tempT <= targetNum[2] then
359   - targets = tempT
360   - return
361   - end
362   - if isSort then
363   - for i = 1, targetNum[2] do
364   - table.insert(targets, tempT[i])
365   - end
366   - else
367   - for i = 1, targetNum[2] do
368   - local idx = math.randomInt(1, #tempT)
369   - table.insert(targets, tempT[idx])
370   - table.remove(tempT, idx)
371   - end
372   - end
373   - end
374   - if targetNum[1] == 0 then --任意排序
375   - randNum(false)
376   - elseif targetNum[1] == 1 then --血量从低到高
377   - table.sort(tempT, function(o1, o2)
378   - return o1.hp < o2.hp
379   - end)
380   - randNum(true)
381   - elseif targetNum[1] == 2 then --血量从高到低
382   - table.sort(tempT, function(o1, o2)
383   - return o1.hp > o2.hp
384   - end)
385   - randNum(true)
386   - else
387   - targets = tempT --all
388   - end
389   - end
  323 + local skill = Skill.new(self, {id = skillId, level = skillLevel, target = target})
390 324 --返回客户端
391   - for _, target in ipairs(targets) do
  325 + for _, target in ipairs(skill:getTargets()) do
392 326 self.battle.adv:backSkill(self.id, skillId, target.id)
393 327 end
394   - -- 增加buff
395   - for _, buffId in ipairs(skillData.selfbuff:toArray(true, "=")) do
396   - self:addBuff(buffId, self)
397   - end
398   -
399   - for _, buffId in ipairs(skillData.targetbuff:toArray(true, "=")) do
400   - for _, target_ in ipairs(targets) do
401   - target_:addBuff(buffId, self)
402   - end
403   - end
404   -
  328 + skill:doEffect()
405 329 for _, team in ipairs(self:getTeam(2)) do
406 330 team:triggerPassive(Passive.TARGET_SKILL)
407 331 end
... ...
src/adv/AdvSkill.lua 0 → 100644
... ... @@ -0,0 +1,110 @@
  1 +local Skill = class("Skill")
  2 +
  3 +function Skill:ctor(owner, data)
  4 + self.owner = owner
  5 + self.id = data.id
  6 + self.level = data.level or 1
  7 + self.defaultTarget = data.target
  8 +
  9 + self.skillData = csvdb["adv_skillCsv"][self.id][self.level]
  10 + self.targets = self:initTargets()
  11 +end
  12 +
  13 +function Skill:initTargets()
  14 + local sideFilter = self.skillData.target:toArray(true, "=")
  15 + local sType, aType = sideFilter[1], sideFilter[2]
  16 + local targets = self:filterBySide(sType, aType)
  17 + if sType ~= 0 then
  18 + targets = self:filterByNum(targets)
  19 + end
  20 + return targets
  21 +end
  22 +
  23 +function Skill:filterBySide(sideType, aimType)
  24 + local targets = {}
  25 + local targetChoose = self.skillData.target:toArray(true, "=")
  26 + --确定目标
  27 + if sideType == 0 then --选定一个
  28 + assert(self.defaultTarget, "error " .. self.class.__cname .. " releaseSkill id: " .. self.id .." targetChoose==0 but no target")
  29 + table.insert(targets, self.defaultTarget)
  30 + elseif sideType == 1 then --全部
  31 + if not aimType or aimType == 0 then
  32 + targets = self.owner:getTeam(0)
  33 + else --指定 monsterId
  34 + local team = self.owner:getTeam(0)
  35 + for _, one in pairs(team) do
  36 + if one.monsterId and one.monsterId == aimType then
  37 + table.insert(targets, one)
  38 + end
  39 + end
  40 + end
  41 + elseif sideType == 2 then -- 我方
  42 + if aimType == 1 then
  43 + table.insert(targets, self)
  44 + elseif aimType == 2 then
  45 + targets = self.owner:getTeam(1, true)
  46 + elseif aimType == 3 then
  47 + targets = self.owner:getTeam(1)
  48 + end
  49 + elseif sideType == 3 then -- 敌方
  50 + targets = self.owner:getTeam(2)
  51 + end
  52 + return targets
  53 +end
  54 +
  55 +function Skill:filterByNum(targets)
  56 + local targetNum = self.skillData.targetNum:toArray(true, "=")
  57 + -- 不是指定一个的进行 排序 和 数量筛选
  58 + local tempT = targets
  59 + local newTargets = {}
  60 + local function randNum(isSort)
  61 + if #tempT <= targetNum[2] then
  62 + newTargets = tempT
  63 + return
  64 + end
  65 + if isSort then
  66 + for i = 1, targetNum[2] do
  67 + table.insert(newTargets, tempT[i])
  68 + end
  69 + else
  70 + for i = 1, targetNum[2] do
  71 + local idx = math.randomInt(1, #tempT)
  72 + table.insert(newTargets, tempT[idx])
  73 + table.remove(tempT, idx)
  74 + end
  75 + end
  76 + end
  77 + if targetNum[1] == 0 then --任意排序
  78 + randNum(false)
  79 + elseif targetNum[1] == 1 then --血量从低到高
  80 + table.sort(tempT, function(o1, o2)
  81 + return o1.hp < o2.hp
  82 + end)
  83 + randNum(true)
  84 + elseif targetNum[1] == 2 then --血量从高到低
  85 + table.sort(tempT, function(o1, o2)
  86 + return o1.hp > o2.hp
  87 + end)
  88 + randNum(true)
  89 + else
  90 + newTargets = tempT --all
  91 + end
  92 + return newTargets
  93 +end
  94 +
  95 +function Skill:doEffect()
  96 + for _, buffId in ipairs(self.skillData.selfbuff:toArray(true, "=")) do
  97 + self.owner:addBuff(buffId, self.owner)
  98 + end
  99 + for _, buffId in ipairs(self.skillData.targetbuff:toArray(true, "=")) do
  100 + for _, target_ in ipairs(self.targets) do
  101 + target_:addBuff(buffId, self.owner)
  102 + end
  103 + end
  104 +end
  105 +
  106 +function Skill:getTargets()
  107 + return self.targets
  108 +end
  109 +
  110 +return Skill
0 111 \ No newline at end of file
... ...