AdvSkill.lua
2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
local Skill = class("Skill")
function Skill:ctor(owner, data)
self.owner = owner
self.id = data.id
self.defaultTarget = data.target
self.skillData = csvdb["adv_skillCsv"][self.id]
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