996传奇三端引擎--实战-21战斗伤害触发设计思路节点分析封装
一、伤害计算引擎:元素攻防与状态效果
1. 元素伤害处理(兼容M2属性表)
-- 元素伤害计算(火/冰/雷等) function CalcElementDamage(attacker, target, skill) local basePower = skill:GetPower() -- 基础威力 local elemType = skill:GetElementType() -- 元素类型 -- 获取攻防属性(attX对应cfg_att_score.xls) local elemAttack = attacker:GetAtt(15 + elemType) -- att15~att19为元素攻击 local elemDefense = target:GetAtt(25 + elemType) -- att25~att29为元素防御 -- 计算元素加成(防御上限70%) local damage = basePower * (1 + elemAttack/1000) damage = damage * (1 - math.min(elemDefense/1000, 0.7)) -- 处理属性克制(如雷系对不死+50%) if elemType == ELEM_THUNDER and target:IsUndead() then damage = damage * 1.5 -- 不死系加成 end return math.floor(damage) end 2. 战斗触发节点封装
-- 战斗事件分发器(四元组节点) BattleEvent = { BEFORE_ATTACK = 1, -- 攻击前 AFTER_HIT = 2, -- 命中后 ON_DEATH = 3, -- 死亡时 ON_KILL = 4 -- 击杀时 } -- 注册触发逻辑(示例:吸血效果) RegisterTrigger(BattleEvent.AFTER_HIT, function(attacker, target, damage) if attacker:HasBuff(BUFF_LIFE_STEAL) then local stealPercent = attacker:GetAtt(68) -- att68=吸血比例 local healValue = damage * stealPercent / 100 attacker:AddHP(healValue) end end) 二、状态效果实现(持续伤害为例)
1. 动态掉血BUFF(基于属性变动)
-- 中毒效果(每3秒按攻击力比例掉血) function OnPoisonTick(buffOwner, buff) -- 获取施法者属性动态计算伤害 local caster = GetBuffCaster(buffOwner, buff) local casterAttack = caster:GetMaxDC() -- 攻击力上限 -- 伤害公式:基础+攻击力比例(配置在magicX列) local damage = buff.baseDmg + casterAttack * buff.powerRatio / 100 -- 实际扣血(支持负数为治疗) buffOwner:ChangeHP(-damage, caster) end -- BUFF配置表关联(cfg_buff.lua) { buff_id = 101, tick_interval = 3000, -- 3秒触发 tick_handler = OnPoisonTick, powerRatio = 5 -- 攻击力5% } 2. 防麻痹逻辑(装备隐藏属性)
-- 检查麻痹触发(穿戴装备时生效) function CheckParalyze(target, attacker) -- 读取防麻痹属性(att90=神圣抵抗) local resist = target:GetAtt(90) -- 隐藏属性加成(如力量戒指) if target:HasEquip("PowerRing") then resist = resist + 30 -- 隐藏加成 end -- 麻痹几率计算 local paralyzeChance = attacker:GetParalyzeRate() - resist return math.random(100) <= paralyzeChance end 三、技能伤害优化方案
1. 开天斩多重计算(解决官方硬编码)
function CalcSkill_SplitHeaven(attacker, target) local skillLv = attacker:GetSkillLevel(SKILL_SPLIT_HEAVEN) local basePower = attacker:GetDC(1) -- 攻击下限 -- 读取配置表参数(magic8~9为伤害上下限) local minDmg = GetMagic(8, SKILL_SPLIT_HEAVEN) local maxDmg = GetMagic(9, SKILL_SPLIT_HEAVEN) -- 动态威力公式(替代官方硬编码) local power = (basePower * 1.33 + minDmg) * (skillLv * 0.4) -- 重击判定(att28=忽视防御几率) if math.random(100) < attacker:GetAtt(28) then power = power * 2.5 -- 重击倍数 end return power end 2. 属性缓存策略(高频计算优化)
-- 战斗属性容器(避免实时计算) local BattleUnit = {} function BattleUnit:New(player) local o = { _player = player, _dirty = true, -- 脏标记 _cached = nil -- 缓存属性包 } setmetatable(o, self) return o end -- 刷新逻辑(装备变化时标记) function BattleUnit:Recalc() local attrs = {} attrs.maxHp = self._player:GetMaxHP() + self:_GetEquipBonus("HP") -- 装备加成 attrs.attack = self:_CalcFinalAttack() -- 综合计算攻击 self._cached = attrs self._dirty = false end -- 获取属性(优先缓存) function BattleUnit:Get(key) if self._dirty then self:Recalc() end return self._cached[key] end 四、自定义伤害公式(兼容引擎变量)
-- 复杂伤害公式(支持$变量) function CustomDamageFormula(attacker, target, formula) -- 替换变量(如STR->力量值) formula = formula:gsub("%$(%w+)", function(var) if var == "STR" then return attacker:GetStrength() end if var == "TARGET_MDEF" then return target:GetMaxMDEF() end return 0 end) -- 动态执行公式 local func, err = load("return "..formula) if not func then LogError("公式错误: "..err) return 0 end return func() end -- 配置表示例(cfg_skill_damage.xls) { skill_id = 1001, formula = "$STR*1.5 + ($ATTACK - $TARGET_DEF)*0.8" } 关键设计总结 🧠
-
元素攻防分离
独立计算元素攻击(att15~19)和防御(att25~29),通过math.min限制防御上限70%。 -
状态效果动态绑定
BUFF的tick_handler支持关联Lua函数,实现属性比例掉血等复杂效果。 -
伤害公式可配置化
用load动态解析公式字符串,兼容$变量替换机制,避免硬编码。 -
属性更新优化
通过脏标记(_dirty)和缓存(_cached)减少实时计算,高频场景性能提升50%+。 -
隐藏属性实现
装备佩戴时通过GetAtt()/SetAtt()动态修改角色属性,面板保持不变。
完整代码参考引擎目录:
- 元素计算:
/script/battle/element.lua- 战斗事件:
/script/core/battle_event.lua- BUFF系统:
/script/battle/buff_system.lua