Blame view

src/adv/AdvSkill.lua 2.78 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
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
  	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