【凶恶】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的变量。


暂无评论
根据相关规定,发布评论前必须绑定手机前往绑定
你,确定要这么做吗?
正在处理中...