【凶恶】Mugen三大Bug
飞行道具的归属bug
在mugen中,由helper发出的飞行道具和由游戏者本人(下文简称为本体)发出的飞行道具一样视为由本体发出,所以飞行道具里的p1stateno改变的也是本体的状态。
状态控制器溢出
状态控制器,即sctrl,也就是statedef下的一个个state。每个statedef下最多可以有512个state,超过的话会在载入这个状态时报错。然而,当hitpausetime存在时,载入状态时只考察ignorehitpause=1的状态的数目,也就是说,只要ignorehitpause=1的state数目不超过512个,就不会报错。通过这个可以写超过512个状态在一个statedef里。每个state的persistent值都会在状态载入时写入内存中,当有hitpause存在时,ignorehitpause=0时跳过当前内存写下一个,ignorehitpause=1时则把persistent的值写入当前内存(如果当前内存里的数据为0的话。当前数据不为0的场合则减一)因为mugen只为persistent留出了512个空位,超出的话就会覆盖别的内存,从而修改本来不允许修改的数据。
野指针
指向已经被释放的内存的指针。主要是target和parentdist。
当游戏者命中对手时,对手在内存中的位置会被保存在游戏者的target下,直到游戏者的进攻结束才取消。而游戏者如果正在进行ReversalDef,它的target一直不会被取消。这就是所谓的永续target,甚至即使那个位置已经没有人了或者已经换人了也依然不受影响。这就是混线bug得以成立的根源。
此外helper的创建者即helper的parent被消除的时候,指向这个parent在内存中的位置的信息并不会消失,依然指着那个已经没有helper存在的位置。如果这时有新的helper在那个位置被创建,同时我方使用状态控制器溢出修改helper的parentID和那个新的helper一致,那个新的helper就会被认定为我们手上这个helper的parent。
攻击手段
打击(hitdef)
最朴实的进攻方法,击中以后可以造成damage也可以把对方拖入自己的状态中,如果能打中的话。会被当身。
飞行道具(proj)
和hitdef相比,proj的好处在于不会被当身,可以放心进攻。
当身(ReversalDef)
定义了反弹以后,被对方击中的场合触发反弹,视为己方击中对方。
OTHK
利用当身命中对方helper之后,在p2stateno里写proj,proj下写p1stateno,用proj归属bug控制对方本体进入有攻击框的状态,我方在这时再次当身,击中对方本体。用于捕获本体无法击中也不攻击,但helper可以被击中被当身的对手
永续target
野指针的运用,用ReversalDef保持target,一次击中对方以后就能随时用targetstate将对方拖入我方状态里。
混线
永续target的运用。击中自己的helper,然后让那些helper自灭,等待对方召唤helper。如果对方召唤的helper被分配到我方自灭的helper原先所在的位置,则会成为我们的target。之后就能通过targetstate控制这些helper了。
即死状态多重化
面对“状态号不为特定值的时候脱离”的对手,设置多个即死状态号反复尝试,直到对方不脱离为止的鸟枪法。
难以被当身的hitdef
attr前段省略,混线时攻击自己的helper的时候可以放心打,不用过于担心被当身。
大伤害
damage写个大一点的数字吧,大到能一次弄死对方为止。targetlifeadd也是不错的选择。
伤害溢出
targetlifeadd超过2的31次方的时候发生溢出。反向也可以溢出。
毒
大量小数值的targetlifeadd叠加杀害对手,回避对方的大伤害免疫。
即死投
在p2stateno中写值为零的lifeset让对方血归0.
死之宣告
在roundstate>2的时候运用targetstate和targetlifeadd杀害对手。
强制死之宣告
自杀进入roundstate3,苏生,死之宣告发动杀死对手。
落下即死
定义fall并在fall.damage下写大数值杀害对手。配合p2stateno直接送到落下状态可以增加成功率。
防御贯通炮
控制对方的helper后,再用proj归属bug让对方本体进入某个可以触发落下即死的状态,从而贯穿对方刚体。
即死返
控制对方helper后,用proj归属bug控制对方进入它自己为敌人准备的即死状态里。
TAGIN
控制对方player型helper或者本体之后放tagin,让对方的本体和player型helper进行状态跳转,解除某些状态锁定。
变数操作
取得对方本体后varset,取得对方helper后parentvarset等手段修改对方的变量,对于使用变量锁血的对手来说可以立死。
helper伪装
击中对方以后控制对方建立helper,这个helper的id和对方已有的helperid相同。这样对方如果用helper(123),var(0)为条件的话,读到的将是我们为它新建立的helper(123)的var(0).如果我们击中了对方原来的helper(123),可以顺手让其destroyself,用我们为它创建的helper(123)代替。
超即死·超即死改·超即死投·冻结当身·冻结超即死当身
把本体弄进我方状态后用状态控制器溢出bug写超过553个状态覆盖对方alive杀害对手。在当身中使用,利用对方招式本身的hitpause的就是超即死,控制对方攻击并写一个大数值的hitpausetime然后超即死就是超即死投。对方alive超过1时,一次超即死无法杀死,于是在超即死的最后写上指向超即死状态本身的状态跳转,反复循环直到对方alive为0,就是超即死改。hitpause似乎也有顺便用来封锁对方行动的用法之类的,大概吧。
helperNORMAL化,helperid变更,色表变更
同样是状态控制器溢出,将对方的helper变成normal型防止脱离,改变helper的id,改变对方的色表……从而影响对方的行动。
*亲变更
严格来说这个不是击中对方以后的事情,也不是击中对方的方法……因为根本不需要击中什么的……原理见“野指针”条目,作用就是把自己的helper的亲换成对方飞helper,从而用parentvarset修改对方helper的变量。