维护过 MUGEN 角色的人,几乎都遇到过这种“同一套代码换个位置就变脸”的情况:同一个拉莱耶 AI 文本,10P 放在 1P 位做隔离检测,演出杀伤一切正常;可换成 12P 放到 2P 位,同样的隔离检测却打不出伤害,甚至无法击败对手。更让人头疼的是,10P 在 1P 位先手测试没问题,一旦交换位置,行为又开始脱离预期。
这类问题之所以难查,不是因为 MUGEN 引擎有随机性,而是因为角色身上同时存在三个变量:P1/P2 位置、10P/12P 的调色板编号、以及“隔离检测”这一套独立的调试状态。如果不先把这三个变量拆开,直接去改 HitDef,结果通常是把正常的 1P 也改坏。
这篇文章的定位不是给你一个“直接复制就能赢”的补丁,而是给出一套排查和修复方法。你会理解 MUGEN 的 1P/2P 方向差异如何影响演出杀伤,10P/12P 这类高 P 数 AI 档位是怎么让同一个角色走出不同行为分支的,以及如何用最小化的 Debug 状态定位“到底是在入口没进、HitDef 没触发,还是触发了但伤害结算没有生效”。
1. 拉莱耶文本10P/12P问题:先把它拆成可验证现象
原始描述可以拆成三条独立事实,建议每条都单独记录,不要混在一起看:
| 编号 | 现象 | 环境 |
|---|---|---|
| A | 拉莱耶文本 10P 在 1P 隔离检测,演出杀伤正常 | P1 = 10P |
| B | 拉莱耶文本 12P 在 2P 隔离检测,杀伤失效,无法击败 | P2 = 12P |
| C | 拉莱耶文本 10P 在 1P 先手隔离检测有杀伤,但换位置后情况变化 | 交换方位置后 |
只看第一条,很多人会以为角色代码没有问题;只看第二条,又会以为是 12P 文件本身写得有问题。但第三条恰恰说明,问题不只是“12P 坏了”,而是某个逻辑对玩家位置或者方向敏感。
MUGEN 状态机的核心是“条件满足就执行控制器”。同一个角色文件里面,如果同时存在按palno分支的逻辑、按Facing分支的逻辑、按Pos X分支的逻辑,那么当 P1/P2 交换、或者 10P/12P 切换时,状态条件的计算结果就可能完全不同。
我的建议是:不要先怀疑某个字符打错了,而是先把问题按“状态入口、命中判定、伤害结算”三层拆开。绝大多数换位失效的问题,最后都落在第一层或第二层。
2. MUGEN里的1P/2P、P数与隔离检测基础概念
2.1 1P/2P与Facing方向
MUGEN 默认对战开始后,1P 通常站在舞台左侧,初始Facing = 1;2P 通常站在右侧,初始Facing = -1。这里的Facing是角色当前朝向,值只有 1 或 -1。
这个初始方向会带来一个很容易被忽略的事实:很多攻击动画、HitDef 偏移、特效坐标,都是相对角色自身朝向计算的。角色朝右时,X 轴的正方向在角色前方;角色朝左时,前方就变成了 X 轴负方向。如果代码里有一处没有乘以Facing,那么同一套招式的攻击判定往往只在“朝右”时正确,朝左时就整个偏到了背后。
所以,“10P 在 1P 正常、12P 在 2P 失效”这类描述里,首先要判断是“P2 这个位置失效”,还是“12P 这个档位失效”。这两者经常被混为一谈。
2.2 P数到底代表什么
在 MUGEN 中,角色选择界面有 1P、2P、3P 等调色板编号,角色内部可以用palno读取当前编号。10P、12P 本质上就是第 10 套、第 12 套 palette。
不过很多角色作者会把高 P 数当成“AI 难度档、加强模式、隐藏模式”来用。于是同一个角色,1P 和 12P 可能加载的是不同的.cns/.cmd分支。palno这个值会进入状态机,决定当前角色走哪一套 AI 逻辑。
在这个例子里,拉莱耶文本 10P 和 12P 并不是单纯的“颜色不一样”,而是两个可能带不同 AI 行为的入口。排查时必须先确认:palno = 10与palno = 12分别进入哪些状态。常见错误是作者在[State -1]里写了多个互斥入口,比如:
triggerall = palno = 10 triggerall = palno = 12如果这两段都用了同样的数值变量,后执行的分支就可能会把先执行的分支覆盖掉。结果是 10P 表现正常,12P 表现异常;或者有人把 10P 的判定带到了 12P 身上。
2.3 隔离检测与演出杀伤
“隔离检测”听起来很高端,其实就是一种调试思想:把某个技能从完整对战中抽出来,单独看它是否会按预期触发。类似单元测试中只测一个函数,不测整个流程。
“演出杀伤”可以理解成角色在播放某个演出动画时产生的攻击伤害。很多超必杀和招牌技不是一进入状态就立刻判定的,而是等动画播到某一帧、出现某个特效或者结束某个子状态时才产生 HitDef。如果这个触发条件里面带了对方向、对手位置、自身状态的假设,隔离检测时就会暴露出“这一段演出看起来正常,但打死不了人”的问题。
这三个概念对应本文调试的三个关键词:Facing负责解释位置差异,palno负责解释 10P/12P 差异,隔离检测负责把“演出状态”单独拉出来验证。
3. 行为差异的三个真实来源
给拉莱耶的这个案例做定位,不要一开始就盯 HitDef。先看三个分叉点。
3.1 状态入口分叉
MUGEN 角色每一帧会执行大量[State]控制器。10P 和 12P 通常被作者用类似的触发器区别开:
triggerall = palno = 12如果 P2 位的 12P 角色没有正常进入某个“演出状态”,那么不管 HitDef 写得多正确都不会触发。判断方法很简单:在该演出的状态定义里加一个临时声音或特效,如果 P2 位根本没有声音、没有进入动作,说明问题在入口阶段。
3.2 坐标与方向分叉
这是最典型的“换位置就失效”原因。当脚本里直接使用了舞台绝对坐标,比如Pos X大于某个阈值才触发,那么 1P 和 2P 表现必然不同。
例如某个演出的触发条件是:
trigger1 = Pos X > -50在 1P 位靠近舞台中央时,这个条件可能成立;但换到 2P 位后,角色初始坐标在舞台右侧,Pos X很可能大于 0,于是条件走向了另一个分支。这就是为什么建议尽量使用相对判定,而不是拿绝对坐标做触发条件。
还有一类是Facing被写死。如果一个 hitbox 特效需要在角色前方生成,却把X偏移写成了固定正数,那么角色在 2P 位朝左时,特效可能出现在背后或身体内部。
3.3 伤害结算分叉
如果状态进入正常、HitDef 也正常命中,但对手就是死不了,问题就来到了伤害结算