140 lines
6.8 KiB
Lua
140 lines
6.8 KiB
Lua
local BattleHelper = require "app/module/battle/helper/battle_helper"
|
|
local BattleConst = require "app/module/battle/battle_const"
|
|
|
|
local BattleFormula = {}
|
|
|
|
local DEFAULT_FACTOR = 10000
|
|
local HURT_STATE_CRIT = BattleConst.HURT_STATE_CRIT
|
|
|
|
function BattleFormula:getDamageOrCureResult(unitComp, buff, targetUnitComp)
|
|
local func = self.calculateFormula[buff:getFormula()]
|
|
if func then
|
|
return func(unitComp, buff, targetUnitComp)
|
|
end
|
|
return 0
|
|
end
|
|
|
|
function BattleFormula:getAffectedHeal(num, target)
|
|
return BattleFormula.calculateFormula[5](num, target)
|
|
end
|
|
|
|
function BattleFormula:getExpectedDamageResult(unitComp, count, targetUnitComp, skillId, atkCompMap)
|
|
-- (元素个数*攻击者攻击力+链接技能的伤害) * 受击者伤害减免
|
|
-- 普攻
|
|
local result = unitComp.unitEntity:getAtk() * count
|
|
local atkMatchType = unitComp.unitEntity:getMatchType()
|
|
local coefficient = math.max(DEFAULT_FACTOR - targetUnitComp.unitEntity:getDecDmg(atkMatchType), 0)
|
|
result = result * coefficient // DEFAULT_FACTOR
|
|
-- 技能
|
|
if skillId and atkCompMap then
|
|
local skillConfig = ConfigManager:getConfig("skill")[skillId]
|
|
if skillConfig and skillConfig.effect and skillConfig.position then
|
|
local matchType = skillConfig.position
|
|
if atkCompMap[matchType] then
|
|
local atk = atkCompMap[matchType].unitEntity:getAtk()
|
|
local dmg = 0
|
|
for _, effect in ipairs(skillConfig.effect) do
|
|
local buffConfig = ConfigManager:getConfigWithOtherKey("buff", "name")[effect.type]
|
|
if buffConfig and buffConfig.formula == 1 then -- 伤害公式
|
|
dmg = dmg + effect.num * atk
|
|
end
|
|
end
|
|
local coefficient = math.max(DEFAULT_FACTOR - targetUnitComp.unitEntity:getDecDmg(atkMatchType), 0)
|
|
result = result + (dmg * coefficient // DEFAULT_FACTOR) // DEFAULT_FACTOR
|
|
end
|
|
end
|
|
end
|
|
-- 最终伤害
|
|
result = result * (DEFAULT_FACTOR - unitComp.unitEntity:getEndDmgDecAll() + unitComp.unitEntity:getEndDmgAddtionAll()) // DEFAULT_FACTOR
|
|
return result
|
|
end
|
|
|
|
BattleFormula.calculateFormula = {
|
|
-- 局内攻击*技能倍率*(1
|
|
-- +(攻击者元素伤害增加+所有伤害增加+主动技能OR普攻增伤%+BOSS或小怪增伤%)(攻击者
|
|
-- +(受到元素伤害增加+受到所有伤害增加)(受击者
|
|
-- -(攻击者元素伤害降低+所有伤害降低)(受击者
|
|
-- -(受到元素伤害降低-受到所有伤害降低)(受击者
|
|
-- +普攻或技能增伤固定值)*暴击伤害(攻击者)*(1-最终造成伤害降低%(受击者
|
|
-- +最终造成伤害增加%(攻击者))-减伤固定值(受击者)
|
|
[1] = function(unitComp, buff, targetUnit)
|
|
local skillFixedAdd = 0
|
|
local skillPAdd = 0
|
|
local monsterDmgPAdd = 0
|
|
local hostSkill = buff:getHostSkill()
|
|
local atkMatchType = unitComp.unitEntity:getMatchType()
|
|
if hostSkill then -- 技能伤害加成
|
|
if hostSkill:getIsActiveType() then -- 主动技能
|
|
skillFixedAdd = unitComp.unitEntity:getSkillHurtFixed()
|
|
skillPAdd = unitComp.unitEntity:getSkillHurtP()
|
|
elseif hostSkill:getIsNormalType() then -- 普攻
|
|
skillFixedAdd = unitComp.unitEntity:getNormalSkillHurtFixed()
|
|
skillPAdd = unitComp.unitEntity:getNormalSkillHurtP()
|
|
end
|
|
skillPAdd = skillPAdd + unitComp.unitEntity:getAllHurtP()
|
|
end
|
|
|
|
if unitComp:checkMonsterDmgAdd() and unitComp:getSide() == BattleConst.SIDE_ATK then
|
|
if targetUnit.unitEntity:getIsBoss() then
|
|
monsterDmgPAdd = unitComp.unitEntity:getBossHurtP()
|
|
else
|
|
monsterDmgPAdd = unitComp.unitEntity:getMonsterHurtP()
|
|
end
|
|
end
|
|
|
|
local result = unitComp.unitEntity:getAtk() * buff:getEffectNum() // DEFAULT_FACTOR -- 基础值(攻击 * 技能倍率)
|
|
-- local a = unitComp.unitEntity:getDmgAddition() -- (攻击者元素伤害增加 + 所有伤害增加)
|
|
-- local b = unitComp.unitEntity:getDmgDec() -- (攻击者元素伤害降低 + 所有伤害降低)
|
|
-- local c = targetUnit.unitEntity:getWeakness(atkMatchType) -- (受击者受到元素伤害增加 + 受到所有伤害增加)
|
|
-- local d = targetUnit.unitEntity:getDecDmg(atkMatchType) -- (受击者受到元素伤害降低 + 受到所有伤害降低)
|
|
-- local e = skillPAdd + monsterDmgPAdd -- 技能增伤百分比
|
|
result = result * (DEFAULT_FACTOR
|
|
+ unitComp.unitEntity:getDmgAddition() -- (攻击者元素伤害增加 + 所有伤害增加)
|
|
- unitComp.unitEntity:getDmgDec() -- (攻击者元素伤害降低 + 所有伤害降低)
|
|
+ targetUnit.unitEntity:getWeakness(atkMatchType) -- (受击者受到元素伤害增加 + 受到所有伤害增加)
|
|
- targetUnit.unitEntity:getDecDmg(atkMatchType) -- (受击者受到元素伤害降低 + 受到所有伤害降低)
|
|
+ skillPAdd + monsterDmgPAdd) // DEFAULT_FACTOR -- 技能增伤百分比
|
|
result = result + skillFixedAdd -- 固定值
|
|
|
|
-- 暴击
|
|
local hurtState = 0
|
|
local crit = unitComp.unitEntity:getCrit()
|
|
if crit > 0 then
|
|
if BattleHelper:random(1, DEFAULT_FACTOR) <= crit then -- 暴击了
|
|
result = result * (BattleHelper:getDefaultCrittime() + unitComp.unitEntity:getCrittime()) // DEFAULT_FACTOR
|
|
hurtState = HURT_STATE_CRIT
|
|
end
|
|
end
|
|
-- 最终伤害
|
|
result = result * (DEFAULT_FACTOR - unitComp.unitEntity:getEndDmgDecAll() + unitComp.unitEntity:getEndDmgAddtionAll()) // DEFAULT_FACTOR
|
|
result = result - targetUnit.unitEntity:getDmgDecFixed() // DEFAULT_FACTOR -- 固定值
|
|
if result <= 0 then
|
|
result = 1
|
|
end
|
|
return result, hurtState
|
|
end,
|
|
-- 生命值*回合开始时的回血系数*(1 + 治疗效果增加)
|
|
[2] = function(unitComp, buff, targetUnit)
|
|
local result = targetUnit.unitEntity:getMaxHp() * buff:getEffectNum() // DEFAULT_FACTOR * (unitComp.unitEntity:getCureAddition() - unitComp.unitEntity:getCureDec() + DEFAULT_FACTOR) // DEFAULT_FACTOR
|
|
return result, 0
|
|
end,
|
|
-- 角色攻击力*技能倍率*(1+治疗效果增加)
|
|
[3] = function(unitComp, buff, targetUnit)
|
|
local result = unitComp.unitEntity:getAtk() * buff:getEffectNum() // DEFAULT_FACTOR * (unitComp.unitEntity:getCureAddition() - unitComp.unitEntity:getCureDec() + DEFAULT_FACTOR) // DEFAULT_FACTOR
|
|
return result, 0
|
|
end,
|
|
-- 释放者攻击*技能系数*(1+(攻击者元素伤害增加+所有伤害增加-攻击者元素伤害降低-所有伤害降低+受到元素伤害增加+受到所有伤害增加(受击)-受到元素伤害降低-受到所有伤害降低(受击))
|
|
[4] = function(unitComp, buff, targetUnit)
|
|
local atkMatchType = unitComp.unitEntity:getMatchType()
|
|
local result = unitComp.unitEntity:getAtk() * buff:getEffectNum() // DEFAULT_FACTOR *
|
|
(DEFAULT_FACTOR + unitComp.unitEntity:getDmgAddition() - unitComp.unitEntity:getDmgDec() + targetUnit.unitEntity:getWeakness(atkMatchType) - targetUnit.unitEntity:getDecDmg(atkMatchType)) // DEFAULT_FACTOR
|
|
return result, 0
|
|
end,
|
|
-- 治疗量 * (治疗效果增减效果)
|
|
[5] = function(num, target)
|
|
local result = num * (target.unitEntity:getCureAddition() - target.unitEntity:getCureDec() + DEFAULT_FACTOR) // DEFAULT_FACTOR
|
|
return result, 0
|
|
end
|
|
}
|
|
|
|
return BattleFormula |