找回密码
 register
搜索
查看: 36|回复: 0

洱海月 真武七截阵 / 万相皆归 修复笔记 (武道效果回蓝变回血)

[复制链接]
  • 打卡等级:本地老炮
  • 打卡总天数:533
  • 打卡月天数:22
  • 打卡总奖励:530
  • 最近打卡:2026-06-24 01:45:59
Waylee 发表于 2026-3-21 19:12 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10
## 技能截图


真武七截阵 / 万相皆归 修复教程

1. 适用问题

本教程用于修复以下两个问题:

  1. 真武七截阵 暴击时伤害没有变成普通伤害的 2 倍。
  2. 学会 万相皆归 后,本应回气,实际却变成回血。
  3. 万相皆归 回气数值偏低,实际应该按武道等级回复 (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.txt263 万相皆归 绑定的是技能 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

这里有两个关键点:

  1. recover_hp_rate 改成 recover_mp_rate
  2. {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。

因此:

  • 非暴击 = 正常伤害
  • 暴击 = 直伤部分 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. 建议

  1. 修改 Lua 老文件时,尽量使用 ASCII 注释,避免旧编码文件出现乱码。
  2. 改完后可以执行 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
  1. 如果后续还有别的“按上限回蓝/回怒/回血”的技能,建议继续沿用这种结构:
table.insert(damages[idx], { maxmp = percent })

然后在统一结算层做兼容,而不是每个技能都直接手写 mana_increment()

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?register

×
您需要登录后才可以回帖 登录 | register

本版积分规则

QQ|雪舞知识库 ( 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 )|天天打卡

GMT+8, 2026-6-24 06:39 , Processed in 0.076665 second(s), 33 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表