AdvSkill.lua 2.78 KB
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)
		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