真武七截阵 / 万相皆归 修复教程
1. 适用问题
本教程用于修复以下两个问题:
真武七截阵 暴击时伤害没有变成普通伤害的 2 倍。
- 学会
万相皆归 后,本应回气,实际却变成回血。
万相皆归 回气数值偏低,实际应该按武道等级回复 (0.4 / 0.8 / 1.2 / 1.6 / 2)% 的气上限。
2. 涉及文件
配置文件:
/home/ubuntu/Game2/configs/SectDesc.txt
/home/ubuntu/Game2/configs/SectInfo.txt
/home/ubuntu/Game2/configs/SkillTemplate_V1.txt
/home/ubuntu/Game2/configs/SkillData_V1.txt
/home/ubuntu/Game2/configs/StandardImpact.txt
代码文件:
/home/ubuntu/Game2/services/scene/skill/impact_logic/std_impact_003.lua
/home/ubuntu/Game2/services/scene/skill/talent_logic/std_talent_263.lua
/home/ubuntu/Game2/services/scene/obj/character.lua
3. 问题原因
3.1 真武七截阵暴击不翻倍
真武七截阵 的主伤害走的是 直接伤害 桶。
现有结算里,damage_rate 会影响外功、内功、冰火玄毒等伤害,但默认不影响 direct damage。
所以即使暴击已经把倍率写进了 damage_rate,直伤本体仍然不会翻倍。
修复思路:
- 在
std_impact_003:critical_refix() 里,暴击时除了继续写 damage_rate,还要把 直接伤害值 本身翻倍。
3.2 万相皆归回气变回血
万相皆归 的武道逻辑原本把效果写到了 DAMAGE_TYPE_BACK[4]。
但:
DAMAGE_TYPE_BACK[4] = recover_hp_rate
DAMAGE_TYPE_BACK[5] = recover_mp_rate
所以效果被系统当成回血处理了。
修复思路:
- 改成写入
DAMAGE_TYPE_BACK[5]。
3.3 万相皆归回气偏少
原先回气桶的结算公式是:
value = hp_damage_all * j.rate / 100
这表示“按造成伤害百分比回气”。
但 万相皆归 的描述是:
每个目标可为自身回复 X%(0.4/0.8/1.2/1.6/2) 气上限的气量
因此正确逻辑应为:
value = sender_maxmp * j.maxmp / 100
也就是“按气上限百分比回气”,并且每命中一个目标各回一次。
4. 配置确认
4.1 万相皆归武道等级数值
SectDesc.txt 中:
263 万相皆归 ... 0.4 0.8 1.2 1.6 2 3
说明武道等级对应数值为:
- 1级:
0.4
- 2级:
0.8
- 3级:
1.2
- 4级:
1.6
- 5级:
2
4.2 万相皆归绑定技能
SectInfo.txt 中 263 万相皆归 绑定的是技能 372,即 真武七截阵。
5. 具体修改步骤
步骤一:修改直伤暴击逻辑
文件:
/home/ubuntu/Game2/services/scene/skill/impact_logic/std_impact_003.lua
找到:
function std_impact_003:critical_refix(imp,obj)
local rate = 100
-- ...
for _,j in ipairs(self.enum_DAMAGE_TYPE_RATE) do
imp:add_rate_params(j,rate)
end
imp:mark_critical_hit_flag()
end
修改为:
function std_impact_003:critical_refix(imp,obj)
local rate = 100
-- if imp:get_features(20) then
local targetid = imp:get_caster_obj_id()
if targetid ~= -1 then
local sender = obj:get_scene():get_obj_by_id(targetid)
if sender then
local effect_value,feature_rate = sender:get_dw_jinjie_effect_details(20)
if effect_value > 0 and math.random(100) <= 25 then
rate = rate + effect_value / feature_rate
sender:features_effect_notify_client(20)
end
end
end
-- end
for _,j in ipairs(self.enum_DAMAGE_TYPE_RATE) do
imp:add_rate_params(j,rate)
end
-- Direct damage needs explicit critical scaling.
local direct_damage = self:get_damage_direct(imp)
if direct_damage and direct_damage > 0 then
self:set_damage_direct(imp, direct_damage * 2)
end
imp:mark_critical_hit_flag()
end
步骤二:修改万相皆归写入的回气桶
文件:
/home/ubuntu/Game2/services/scene/skill/talent_logic/std_talent_263.lua
原代码:
function std_talent_263:on_damage_target(talent, level, id, sender, reciver, damages, skill_id)
if self:is_specific_skill(skill_id) then
if damages and damages.damage_rate then
local recover_hp_rate = self:get_refix_value(talent, level)
if recover_hp_rate > 0 then
local idx = DAMAGE_TYPE_BACK[4]
table.insert(damages[idx],{rate = recover_hp_rate})
end
end
end
end
修改为:
function std_talent_263:on_damage_target(talent, level, id, sender, reciver, damages, skill_id)
if self:is_specific_skill(skill_id) then
if damages and damages.damage_rate then
local recover_mp_rate = self:get_refix_value(talent, level)
if recover_mp_rate > 0 then
-- Talent 263 restores mp based on max mp, not dealt damage.
local idx = DAMAGE_TYPE_BACK[5]
table.insert(damages[idx],{maxmp = recover_mp_rate})
end
end
end
end
这里有两个关键点:
- 从
recover_hp_rate 改成 recover_mp_rate
- 从
{rate = recover_mp_rate} 改成 {maxmp = recover_mp_rate}
第二点非常重要,因为这决定后面结算时是按伤害百分比回,还是按气上限百分比回。
步骤三:补充 recover_mp_rate 桶对 maxmp 的支持
文件:
/home/ubuntu/Game2/services/scene/obj/character.lua
在 on_damages() 里,找到 DAMAGE_TYPE_BACK[5] 的处理逻辑。
原代码:
local sender_maxhp = sender:get_max_hp()
key = DAMAGE_TYPE_BACK[5]
for i,j in ipairs(damages[key]) do
value = hp_damage_all * j.rate / 100
recover_mp_rate = recover_mp_rate + value
table.insert(recover_mp_rate_count,value)
end
修改为:
local sender_maxhp = sender:get_max_hp()
local sender_maxmp = sender:get_max_mp()
key = DAMAGE_TYPE_BACK[5]
for i,j in ipairs(damages[key]) do
if j.maxmp then
-- Some talents restore mp by max-mp percent instead of damage percent.
value = sender_maxmp * j.maxmp / 100
else
value = hp_damage_all * j.rate / 100
end
recover_mp_rate = recover_mp_rate + value
table.insert(recover_mp_rate_count,value)
end
这样改完后:
- 普通吸蓝类效果仍然可以继续走
j.rate
万相皆归 这种按气上限回气的效果则走 j.maxmp
兼容原逻辑,不会误伤其它系统。
6. 修复后的正确结果
6.1 真武七截阵暴击
暴击时,直接伤害 部分会被明确乘 2。
因此:
6.2 万相皆归回气
修复后回气公式为:
每命中1个目标,回复 = 自身气上限 × 武道等级百分比
等级对应:
- 1级:
0.4%
- 2级:
0.8%
- 3级:
1.2%
- 4级:
1.6%
- 5级:
2%
例如:
- 气上限
50000
- 武道等级
5级
- 命中
3个目标
则回气量为:
50000 × 2% × 3 = 3000
7. 回归验证方法
7.1 验证暴击伤害
测试条件:
- 不学习
万相皆归
- 使用
真武七截阵
- 分别记录非暴击与暴击伤害
预期:
- 暴击伤害应明显接近普通伤害的 2 倍
- 不应再出现只比普通伤害高一点点的情况
7.2 验证回气类型
测试条件:
预期:
7.3 验证回气数值
测试条件:
- 记录角色当前
气上限
- 分别测试武道 1 级和 5 级
- 记录一次命中 1 个目标、3 个目标、5 个目标时的回气量
预期:
- 1级:约为
气上限 × 0.4% × 命中目标数
- 5级:约为
气上限 × 2% × 命中目标数
8. 建议
- 修改 Lua 老文件时,尽量使用 ASCII 注释,避免旧编码文件出现乱码。
- 改完后可以执行 Lua 语法检查:
luac -p /home/ubuntu/Game2/services/scene/skill/impact_logic/std_impact_003.lua
luac -p /home/ubuntu/Game2/services/scene/skill/talent_logic/std_talent_263.lua
luac -p /home/ubuntu/Game2/services/scene/obj/character.lua
- 如果后续还有别的“按上限回蓝/回怒/回血”的技能,建议继续沿用这种结构:
table.insert(damages[idx], { maxmp = percent })
然后在统一结算层做兼容,而不是每个技能都直接手写 mana_increment()。