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 local Buff = require "adv.AdvBuff" 2 local Buff = require "adv.AdvBuff"
  3 +local Skill = require "adv.AdvSkill"
3 local Passive = require "adv.AdvPassive" 4 local Passive = require "adv.AdvPassive"
4 5
5 local BaseObject = class("BaseObject") 6 local BaseObject = class("BaseObject")
@@ -319,89 +320,12 @@ end @@ -319,89 +320,12 @@ end
319 320
320 function BaseObject:releaseSkill(skillId, skillLevel, target) 321 function BaseObject:releaseSkill(skillId, skillLevel, target)
321 if self:hadBuff(Buff.CANT_SKILL) then return end -- 针对 怪物 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 self.battle.adv:backSkill(self.id, skillId, target.id) 326 self.battle.adv:backSkill(self.id, skillId, target.id)
393 end 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 for _, team in ipairs(self:getTeam(2)) do 329 for _, team in ipairs(self:getTeam(2)) do
406 team:triggerPassive(Passive.TARGET_SKILL) 330 team:triggerPassive(Passive.TARGET_SKILL)
407 end 331 end
src/adv/AdvSkill.lua 0 → 100644
@@ -0,0 +1,110 @@ @@ -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 \ No newline at end of file 111 \ No newline at end of file