HeroPlugin.lua 7.75 KB
local HeroPlugin = {}


function HeroPlugin.bind(Hero)

	function Hero:getMaxLevel()
		return math.min(#csvdb["unit_expCsv"], csvdb["unit_breakCsv"][self:getProperty("breakL")].levelLimit)
	end

	function Hero:getSPoint()
		local point = 0
		for i = 0, self:getProperty("wakeL") do
			if csvdb["unit_wakeCsv"][i] then
				point = point + csvdb["unit_wakeCsv"][i].sp
			end
		end
		return point
	end

	function Hero:getLSPoint()
		local point = self:getSPoint()
		for skill, level in pairs(self:getProperty("skillL"):toNumMap()) do
			point = point - (level - 1)
		end
		return point
	end

	--角色属性值 = 基础属性值(unit)* [ 1 + 升级属性(unit_exp)+ 突破属性(unit_break)] * [ 1 + 觉醒属性(unit_wake)+ 天赋属性(unit_talent)]
	function Hero:getBaseAttrs(params)
		params = params or {}
		local unitData  = csvdb["unitCsv"][self:getProperty("type")]
		local level = params.level or self:getProperty("level")
		local breakL = params.breakL or self:getProperty("breakL")
		local wakeL = params.wakeL or self:getProperty("wakeL")
		local talent = params.talent or self:getProperty("talent")


		local attrs = {}
		for _, attName in pairs(AttsEnumEx) do
			attrs[attName] = unitData[attName] or 0
		end
		local lData = csvdb["unit_expCsv"][level]
		local blData = csvdb["unit_breakCsv"][breakL]
		-- core
		for attr, value in pairs(attrs) do
			attrs[attr] = attrs[attr] * (100 + (lData[attr .. "Level"] or 0) + (blData[attr .. "Level"] or 0)) / 100
		end

		local talentAttrS = {}
		-- 天赋阶段属性
		for i = 1, (talent:getv(0, 1) - 1) do
			local curData = csvdb["unit_talentCsv"][i]
			local effect = curData[#curData].effect:toArray(true, "=")
			talentAttrS[AttsEnumEx[effect[1]]] = (talentAttrS[AttsEnumEx[effect[1]]] or 0) + effect[2]
		end
		-- 四个基础属性
		local curData = csvdb["unit_talentCsv"][talent:getv(0, 1)]
		if not curData then -- 已经满阶段了
			curData = csvdb["unit_talentCsv"][#csvdb["unit_talentCsv"]]
			local strength = curData[#curData].strength
			for i = 1, 4 do
				talentAttrS[AttsEnumEx[i]] = (talentAttrS[AttsEnumEx[i]] or 0) + strength
			end
		else
			for i = 1, 4 do --4个天赋
				talentAttrS[AttsEnumEx[i]] = (talentAttrS[AttsEnumEx[i]] or 0) + curData[talent:getv(i, 0)].strength
			end
		end

		--好感度
		local loveUp = {}
		for i = 0, self:getProperty("loveL") do
			local reward = csvdb["unit_love_effectCsv"][i]["reward"]
			for attrId, value in pairs(reward:toNumMap()) do
				loveUp[AttsEnumEx[attrId]] = (loveUp[AttsEnumEx[attrId]] or 0) + value
			end
		end

		--皮肤
		local skinUp = {}
		local reward = (csvdb["unit_skinCsv"][self:getSkinId()] or {})["reward"] or ""
		for attrId, value in pairs(reward:toNumMap()) do
			skinUp[AttsEnumEx[attrId]] = (skinUp[AttsEnumEx[attrId]] or 0) + value
		end

		--觉醒
		local wData = csvdb["unit_wakeCsv"][wakeL]
		for attr, value in pairs(attrs) do
			attrs[attr] = attrs[attr] * (100 + (wData[attr .. "Level"] or 0) + (talentAttrS[attr] or 0) + (loveUp[attr] or 0) + (skinUp[attr] or 0)) / 100
		end

		return attrs
	end


	--当前属性 = [ 角色属性值 + 基础装备(固定)+ 专属装备(固定)] * [ 1 + 基础装备(百分比) + 专属装备(百分比)]
	function Hero:getTotalAttrs(params)
		params = params or {}
		local attrs = self:getBaseAttrs()
		-- 装备零件
		local equipAttrs = self:getRuneEquipAttrs()

		for _, attName in pairs(AttsEnumEx) do
			attrs[attName] = ((attrs[attName] or 0) + equipAttrs.value[attName]) * (1 + equipAttrs.precent[attName] / 100)
		end

		-- 羁绊加成
	    if params.activeRelation then
	        for k, v in pairs(AttsEnumEx) do
	            attrs[v] = (attrs[v] or 0) * (1 + (params.activeRelation[v] or 0) / 100)
	        end
	    end
		return attrs
	end

	-- 当前零件和装备增加属性
	function Hero:getRuneEquipAttrs()
		local attrs = {value = {}, precent = {}}
		for _, attName in pairs(AttsEnumEx) do
			attrs.value[attName] = 0
			attrs.precent[attName] = 0
		end
		local equipSuits = {}
		-- 装备效果
		for typ,level in pairs(self:getProperty("equip"):toNumMap()) do
			if level > 0 then
				local data = csvdb["equipCsv"][typ][level]
				for k,v in pairs(data.attr1:toNumMap()) do
					attrs.value[AttsEnumEx[k]] = attrs.value[AttsEnumEx[k]] + v
				end
				for k,v in pairs(data.attr2:toNumMap()) do
					attrs.value[AttsEnumEx[k]] = attrs.value[AttsEnumEx[k]] + v
				end
				if data.suit ~= "" then
					if not equipSuits[data.suit] then equipSuits[data.suit] = {} end
					table.insert(equipSuits[data.suit], data)
				end
			end
		end
		-- 装备套装效果
		for suitId,eDatas in pairs(equipSuits) do
			local suitCsv = csvdb["equip_suitCsv"][tonumber(suitId)]
			if suitCsv then 
				local effects = suitCsv.effect:toTableArray(true)
				local count = #eDatas
				if count >= 2 then
					attrs.precent[AttsEnumEx[effects[1][1]]] = attrs.precent[AttsEnumEx[effects[1][1]]] + effects[1][2]
				end
				if count >= 3 then
					attrs.precent[AttsEnumEx[effects[2][1]]] = attrs.precent[AttsEnumEx[effects[2][1]]] + effects[1][2]
				end
				if count >= 4 then
					attrs.precent[AttsEnumEx[effects[3][1]]] = attrs.precent[AttsEnumEx[effects[3][1]]] + effects[3][2]
				end
			end
		end
		-- 零件效果
		local suits = {}
		for _, uid in pairs(self:getProperty("rune"):toNumMap()) do
			if uid > 0 then
				local rune = self.owner.runeBag[uid]
				local buildData = csvdb["rune_buildCsv"][rune:getProperty("level")]
				for k,v in pairs(rune:getProperty("attrs"):toNumMap()) do
					attrs.value[AttsEnumEx[k]] = attrs.value[AttsEnumEx[k]] + (v * (1 + buildData.effect/100))
					
				end
				local csvData = csvdb["runeCsv"][rune:getProperty("type")][rune:getProperty("id")]
				if not suits[csvData.suit] then suits[csvData.suit] = {} end
				table.insert(suits[csvData.suit],csvData)
			end
		end
		-- 零件套装效果
		for suitId,runeDatas in pairs(suits) do
			local suitCsv = csvdb["rune_suitCsv"][tonumber(suitId)]
			if suitCsv then
				local effects = suitCsv.effect:toTableArray(true)
				local count = #runeDatas
				if count >= 2 then
					attrs.precent[AttsEnumEx[effects[1][1]]] = attrs.precent[AttsEnumEx[effects[1][1]]] + effects[1][2]
				end
				if count == 6 then
					attrs.precent[AttsEnumEx[effects[3][1]]] = attrs.precent[AttsEnumEx[effects[3][1]]] + effects[3][2]
				end
			end
		end
		return attrs
	end

	-- 战斗力(当前属性)= POWER[(生命 + 防御 * 7 + 闪避 * 4)*(攻击 + 命中 * 4)*(1 + 暴击几率/100 * 暴击伤害/100)* 攻击速度 / 60000 ,0.8 ]
	function Hero:getBattleValue(activeRelation)
		local attrs = self:getTotalAttrs({activeRelation = activeRelation})
		local battleValue = ((attrs["hp"] + attrs["def"] * 7 + attrs["miss"] * 4) * (attrs["atk"] + attrs["hit"] * 4) * (1 + attrs["crit"]/100 * attrs["critHurt"]/100) * attrs["atkSpeed"] / 60000) ^ 0.8
		return math.floor(battleValue)
	end

	function Hero:saveBattleValue()
		local battleValue = self:getBattleValue()
		if battleValue ~= self:getProperty("battleV") then
			self:setProperty("battleV", battleValue)
		end
		return battleValue
	end

	-- 技能1234 对应必杀技,冒险技,被动技,战斗技
	function Hero:getSkillLevel(idx)
		return self:getProperty("skillL"):getv(idx, 1)
	end

	function Hero:getSkillData(idx, skin)
		local unitData = csvdb["unitCsv"][self:getProperty("type")]
		if idx == 1 then
			return csvdb["skill_specialCsv"][unitData.special]
		elseif idx == 2 then
			return csvdb["adv_skill_specialCsv"][unitData.adv]
		elseif idx == 3 then
			return csvdb["skill_passiveCsv"][unitData.passive]
		elseif idx == 4 then
			return csvdb["skill_blockCsv"][unitData.block]
		end
		return {}
	end

	function Hero:getSkinId(skin)
		skin = skin or self:getProperty("skin")
		if skin == 0 then
			return self:getProperty("type")
		else
			return 30000 + self:getProperty("type") * 10 + skin
		end
	end

end


return HeroPlugin