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 | 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 |
| @@ -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 |