Commit 1b8336a6c5634c886f759da4665f7112fcd7c1e0
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 | ... | ... |
... | ... | @@ -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 | ... | ... |