AdvSkill.lua
2.79 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_map_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.owner)
		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