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