【翻译】解密《怒首领蜂》连击分翻倍bug

原文 http://electricunderground.io/the-secret-dodonpachi-scoring-glitch-revealed/
以及WTN的个人推@sof_wtn,感谢Blackisto,WTN的解析和分享
翻译by —— x91 & 遗忘之雪
前言:怒首领蜂初代的世界纪录高分,这几年发生了剧烈的变化。
原本TAS都只能做到7.5E左右,WTN在十多年前打出的的7.54亿更是比TAS还高,因为怒蜂的版面一共也就这么多分,基本也被认为是极限了。
然而就在前年A-L的记录分暴增了1.1E,B/C机体也暴增了接近1E,SHMUPS论坛的老外找到并撰文分析了导致这个情况出现的BUG。
关于正文,老外给出了一个参考视频:

可能在审核中。请结合食用

正文:
直至数年前《怒首领蜂》日本国内三机最高分(等同于世界纪录)大幅度改写,从来都没有人仔细认真地考虑过初代怒蜂里偶尔会出现的奇妙分数上浮究竟为何。因为一两千万的分数波动往往被叠加式的分数算法掩盖得很好,会被考虑成浮动分数,绝大多数人没有深入探究。
而自以KTL-NAL为首的日本玩家在2015年真正发现其内所含秘密过后,这个秘技在小范围的日本怒蜂初代玩家里得到了分享,引爆了初代怒蜂最高分的爆发式提高。但是在这些屈指可数的人之外,鲜有人能搞明白这个“bug”到底是如何触发的。
这样一个未解之谜让日本以外的STG爱好者们感到如坐针毡,甚至最近还有人打算在网上开出悬赏,期望有哪位勇士敢于站出来揭开这个谜团。实际上,根据国外论坛里讨论的说法,在2018年时,也已经有西方玩家在攻略《怒首领蜂》期间碰到了分数的莫名增加,只是他当时也仅仅停留在了疑惑的阶段。
直到2020年3月,一个决定《怒首领蜂》是否能突破10亿分大关的真相,终于开始浮出水面。
累积分
《首领蜂》系列的标志性得分系统,连击,在1997年的这一作时还是基于一个非常简朴的计算公式:
击破得分 = 当前GP + 敌机基本分
GP,所谓Get Point,其实就是整个连击过程中一点点累积起来的分数,如你所想,它是这么算:
下一Hit的GP分 = 当前GP + 敌机基本分
在击破一个敌机要使用这个算法算分时,存在一个计算的先后顺序,GP的计算先于分数的计算。记住这一点对理解后面即将发生的事情非常重要(可能也一点关系都没有)。
另一个不能混淆的概念是,GP不等于连击分。显示在游戏UI面板上的连击分是你整段连击所获得的分数而非GP,累积的GP分并非显式。
谜之敌机
在游戏的第六关,如果打的时候留心背景,会发现初代也是有“蜂巢地带”的,它的呈现方式就如同六边形的蜂格,只不过规模没有大往生5面的那么巨大,从其中伸出来的不过就是小炮台而已,不过它们在被击破后会不断刷新。
但是在这些蜂巢开始刷炮台之前,蜂巢的上方其实是有一个敌机的——只不过它实在太脆,在绝大多数正常流程下,玩家往往还没有注意到它的存在就已经把它干掉了。而正是这个谜之敌机,制造了《怒首领蜂》二十几年来最大的分数谜题。

和PC上更多偏向脚本定义和控制不同,街机游戏的敌机行动,数据和游戏系统都是硬编码在它的ROM里的(就是码农们常说的写死在代码里),游戏逻辑要使用的内存块地址也是固定的,因为内存容量有限,所以为了节省使用,一个内存块往往会被一个计算函数在流程中反复使用。
也许是CAVE的程序员在这个全6关仅于此处登场的敌机身上粗心了,这个奇怪的敌机并没有写死自己的基本分,它是个空值——一般情况下应该不会触发它参与分数计算,然而……
双重触发
在《怒首领蜂》里,有两种给GP增加10分的渠道,一种是6面出现的导弹车所发射的导弹,每发10分;另一种,则是持续的激光攻击,每50帧加10分(和1hit。Boss战的计算方式不同)。
如果在激光持续接触,获得10分加分的同时击破这个谜之敌机,原本正常工作的分数系统就出现了它意料之外的情况:
从外在看,连击几乎是瞬间增加了2hit;
而实际的分数计算函数里,却发生了这样的计算——
可以看到,在激光hit增加的10分之外,谜之敌机直接为GP翻了个倍!

编者注:
/* 以下仅为个人分析的推测
简单点说,《怒首领蜂》的GP计算用两块内存地址用来储存分数,一块储存着当前的GP值;一块输入侧在需要计算时写入基本分值。
在需要进行分数计算时,系统会首先判断属于哪种加分,如果是激光Hit加分,基本分值这块直接写10,如果是击破的敌机,那就把敌机对应的基本分作为参数传进去;
接下来对这块内存进行加法操作,把当前的GP值加上去,得出新的GP值;
最后把这个内存块的数据再写回,覆盖掉当前GP值里的数据。
相信只要是写过点代码的人就能依靠强迫症简单找出我上面说的流程里少了啥,没错,内存归零,ZeroMemory。
当然,要相信CAVE的程序员绝对不会犯这种低级错误,他们当然会在算分函数里加上一次针对基本分内存清零的操作。但是,假如在极短的时间里,算分函数产生了两次调用,那么基本分内存块就没有被清零,还留着上一次计算的GP值数据的风险。
这个时候再来个没有写基本分的敌机,就完了蛋——由于传进来的基本分是空值,导致基本分内存没有被正确覆写(至于这个过程到底使用什么运算什么的,我不是学这个专业的,自学的东西也都忘光了,大家自行脑补吧),计算的结果就变成了:
当前GP值 + 基本分内存里储存的当前GP值 = 当前GP值 x 2……
推测结束 */
精确计算(SOF-WTN原推翻译)
海外社区公开了怒首领蜂bug相关的情报,借此机会我也将我们三人(WTN.NAL.TAC)保有的情报一并公开出来。
和海外记载的东西基本一致。
Bug发生的场所和条件
场所:6面复活炮台上的盖子
条件:拿到激光hit的同一帧打爆盖子(2hit增加)※没有做严格验证
Bug成功时发生的现象
连击基础分变成两倍(连击分替换了盖子的基本分)
GPS计算例
打到盖子上时的连击基础分 拿到激光hit时的基础分 打爆盖子时的基础分
【通常时】20000-20010-20020
【bug时】20000-20010-40020
根据这些内容,假定bug时的基础分/连击数是21500分/120hit,6面结束一共850连,那么就可以增加21500x(850-120)=1569.5万分。进一步地,由于这样的地方有4个,分数系统的平衡性遭到了致命的破坏。
Bug成功的情况和获得分数的关系(见下表)
①成功一回时
第1个 约1500万
第2-4个 约2500万
②成功两回时
第1/2个 约5000万(1/3和1/4的情况基本相同)
第2/3个 约8000万(2/4的情况基本相同)
③成功三回时
第1-3个 约1.2亿
第1、3、4个 约1.6亿
第2-4个 约1.8亿
④成功四回时
约2.6亿
算分法见下图,请点大图查看

这只是一周增加的分数,二周也是一样。也就是说,在bug使用到极致的情况下,默认设置可以轻松地爆分。
由于成功条件极其严苛,实机&默认设置下尝试爆分我个人觉得不太现实。话虽如此,“有梦想谁都了不起”这么想的人借此次情报公开的机会以高分为目标怎么样呢?
10亿之光?
由于这个双重触发的窗口非常短,所以要在紧凑的流程里完美复现其实是有一定难度的,更何况还要把连击给保住,因为一旦连击断掉,GP就被清空了。
不过,理论上来说,四个蜂巢就等于四次GP翻倍,可不要小看了。根据复现该bug的玩家Blackisto的推算,4次GP翻倍可以带来超过2亿6的额外加分,3次GP翻倍也有1.2亿左右——如果以SOF-WTN在2015年半年里的个人成绩成长作为参照,从2015年3月的7.54亿到8月的8.62亿,将近1.1亿的分数差可以推断他应该在全流程里触发了3次双倍GP bug。
然而只是理论的发现并不代表接下来的发展就会顺风顺水,先不说本身的执行窗口短,三架自机的激光伤害不同,切换时间不同,都会导致激光接触时间和bug敌机的版顶无敌时间重合难以控制,也是一个需要大量练习来掌握和巩固的技巧。
相对于现在越来越少的高分STG玩家,可能TAS人群反而会更对这个bug感兴趣。个人觉得,也许这也是日本玩家们第一时间不选择面向外界人群公开该bug的原因……道不同不相为谋,以他们的想法,还是认为让这个技巧能帮助到热爱《怒首领蜂》,而且正在苦于无法进一步提高自己成绩的玩家,就足够了。其他人知道了,也顶多是多了个茶余饭后的谈资而已,并无太大意义。
结语
91:我该说的上面都说完了,我没有按照原文的结构完全照搬,觉得那样实在太累了,而且在这个短视频横行的后4G时代,字太多其实大家也不爱看……总之,还是要感谢发现这个bug的机理并把它公诸于世的西方玩家们,让我们这些有些兴趣的吃瓜群众也能理解它到底是如何产生的。当然,如果国内真的有人以此作为自己解锁10亿分大门的钥匙,那我们再高兴也不为过。

参考来源:
Electric Undergound - http://electricunderground.io/the-secret-dodonpachi-scoring-glitch-revealed/
推- @SOF-WTN
感谢Blackisto,WTN的解析和分享