Blame view

src/adv/AdvSkill.lua 2.79 KB
1b8336a6   suhongyang   skill逻辑与player分开
1
2
3
4
5
  local Skill = class("Skill")
  
  function Skill:ctor(owner, data)
  	self.owner 	= owner
  	self.id 	= data.id
1b8336a6   suhongyang   skill逻辑与player分开
6
7
  	self.defaultTarget = data.target
  
3b0526d2   zhouhaihai   冒险demo
8
  	self.skillData 	= csvdb["adv_map_skillCsv"][self.id]
1b8336a6   suhongyang   skill逻辑与player分开
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
  	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
89338c47   zhouhaihai   技能目标
42
  			table.insert(targets, self.owner)
1b8336a6   suhongyang   skill逻辑与player分开
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
  		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