200X年、非想天則はバグの炎に包まれた!

今年最後の金曜日ということで、牛角に焼肉を食べに行きました。お好み焼きが満員アウツだけだったけど…。
で、0時を回り、終電アウツになった三毛猫さんを筆頭に、三毛猫さん・スミスくん・nkmr先生が私の家に来ました。早速異常行動に定評のあるnkmrさんが道にめちゃくちゃ迷った挙句、2時間ほどかけて家からノートPCを持ってきてくれました。家を出て坂を下りたら右です。家から出たばっかりだったらすぐにガーキャンしてください。まあ私もこの辺は通学ルート以外は無茶苦茶迷うんですけどね。
PC2台を用意し、やり込み勢(三毛猫・nkmr)による一晩中に及ぶ研究とプログラマ勢(yappy・スミス)による談義により、時折見られるバグ(仕様)の詳細が次々と明らかになっていきました。


星取りバグ
星取りはメモリ中の補正フラグ(以下の論理和で表される)

Rift Attack 1
Smash Attack 2
Border Resist 4
Chain Arts 8
Chain Spell 16
Counter Hit 32

の変数を見て判断しているが(およびLimitを見ての魔方陣判定もある)、「論理和が前フレームから変化しており」かつ「次式を満たす」

// Counter Hit
(ttype1 & 32) ||
// Rift Attack & Smash Attack 
((ttype1 & 1) && (ttype1 & 2)) || 
// Border Resist
(ttype1 & 4)

ときのみ星が減るので、例えば次のような場合でも

// カウンターヒットした
Frame1: Counter Hit
// スペルキャンセルした
Frame2: Counter Hit + Chain Spell

星が減ってしまいます。ある程度元ゲーを研究している人ならChain Arts・Chain Spellはキャンセル成立時に追加され、キャンセル前に撃った弾がキャンセル後にヒットした場合、補正でダメージが下がることを知っていると思います。というわけで、キャンセル先の技が当たろうが当たるまいが関係なく、星取り条件を1度満たしたところからスキル・スペルキャンセルした瞬間にさらに1つ減ります。なにも攻撃に当たっていないのに自然に星が減っていったのはこれのせいです。また、普通に(つまりスキル・スペルとキャンセルしていき)コンボを決めると(特にBorderResistから始めた場合スキキャン・スペキャンでそれぞれ-1確定)星が異常にモリモリ取れるのもこれのせいでした。なお、これは次のバグの難易度とも密接に関係します。
私による解決策の提案は、

prev_cor != cur_cor

論理和全体で変化しているか調べる前に、使う1,2,4,32のビット以外をAND演算で消してしまうのがとりあえずのところは手っ取り早いというものです。近々適用予定。グレイヴ(Rift)+必殺技(Arts)とか究極奥義(Spell)で星1などとすると本家に近づきますが、前述の通りChain補正はキャンセルした瞬間適用されるので悪用が心配されます。落ちついてきたら、補正ビットはコンボがつながって増えるか1ヒット目の状態にリセットされるかなのでちょっといじってみていいかもしれません。
ちなみに、補正情報はコンボが終了しても最終情報を保持したままなので、次のコンボの1Hit目で最後のコンボと全く同じ補正状態になった場合、変化を検出できず星が取れません。コンボ数の変化も見れば検出可能例は増えますが、(1Hit, CH)→(1Hit, CH)と推移されると無理です。それほど問題になるわけでもないので仕様として放置します。また、「1フレームごとに」「前フレームと補正の論理和が異なり」「条件のどれかを満たしていれば」「星を1減らす」としているので、1フレームに2つ以上の条件を同時に満たしても星は1個しかとれません。まあこれは比較的簡単に満たせるでしょう。


蓄積バグ*1
ラウンドを取った後、ある条件を満たすと次のラウンドが相手のHPが非常に少ない状態で開始する。
1本取っている状態において、相手の七星ゲージが0のときスペカを発動すると(暗転フラグ?で認識)、相手のHPが0になり、何か当たれば即死状態になる。0にする前のHPは記憶されており、暗転が解除されるとそれを復元する。(注:暗転とは時間停止のみではなくそこから少しの間続く。暗転中は画面をよく見ると背景に変な模様がアルファブレンドされている。暗転時間はスペカごとに異なる。元ゲー知識としては暗転中は結界不可。)
ある方法を用いて「1本→HP全回復→満タンになったHPを元のHP(通常かなり少ないでしょう)で上書き」という状況を作り出すことで、次のラウンドがふざけた状態で始まります。基本的なやり方は、KO→スペカキャンセルで死体殴りです。KOした瞬間に両者の星が1つずつ回復しますが、非想天則はKO後に少し行動可能時間があるので死体殴りにより星をすぐに再度取り直し、0にします。私の推測ではここで1本ラウンド取得+スペカ暗転が成り立ち、HP0効果が(見えないが)発動していると思われます。相手がダウンから回復するとHPが両者全回復し、次のラウンドが始まりますが、HP回復のタイミングの後まで暗転解除のタイミングがずれこむと、HP全回復した後にテレッテ失敗(暗転解除がトリガ)の処理が行われ、前ラウンドのHPで上書きされてしまいます。
検証勢による情報

  • 条件1:KOした瞬間星が1回復するが、死体殴りで星を0にすること。
    • 前述の星取りバグにより、スペカキャンセルをするだけで星が取れるので、現状では全キャラ非常に容易。
  • 条件2:前ラウンドでスペカ暗転が起こり(ここでHP保存)、HP全回復した後に暗転解除(保存されたHPの復元)が起きること。
    • 基本的に暗転が長いスペカの方がよい。また、相手が起き上がってからHPが回復するため、相手が弾んだり高いところから落ちてきたりするのはよくない。
    • つまりのところは相手の起き上がりを早めるためにはスペカを空振りするのが最善である。ただし、スペカを空振りしながら条件1を同時に満たすためには星取りバグがないと不可能。
    • バグキャラ認定された者たち:妖夢・天子・小町
    • 上記のキャラは死体殴りするとバグが起きるスペカを多く持つ、スペカへのつなぎ方が現実的である、などの特徴を持つ。なお、現在はスペカ空振りにより、ほとんどのキャラが可能であると思われる。スペカヒットによりバグを起こせるキャラは全体の1/3ほどであると言われている。


Chain Arts・Chain Spellは完全に無視するようにする方針ですので、蓄積バグは難易度・キャラ限ともに厳しくなると思われます。ヒットさせつつ回復後まで暗転が継続するスペカはかなり少なく、KO後にスペカヒットで星を取るためにはそのスペカでSmash Hit+Rift Attackを成立させるか魔方陣を出すしかないからです(Counter Hit・Border Resistは無理、Smash+RiftはSmash Hitをコンボに入れつつRift付きのスペカを当てるかその逆)。


感想
星取りの新しい条件を考えたりしている自分が嫌になってきます。蓄積バグの詳細発見の発端はnkmrさんのパチュリーのサイレントセレナだったようです。セレナでKOした後途中で魔方陣が出て早めにHP回復が起こったようです(多分)。順当に書いたはずのプログラムから全く予期しない現象が起こり、研究勢によって詳細条件や実用性が検証されていく姿は北斗を思い出させました。そして、スペカごとに設定されている絶妙な暗転時間に、全て最速ではうまくいかないが練習すれば安定してくるリズムアクション、すべてがうまくいったときそれまでとは全く違ったバウンドを見せる達成感、世紀末バスケコンボが重なって見えたのです。我々はこれを神バランスだとか神ゲーだとか呼んでいる…。
アリスについて
2人が全キャラ全スペカでバグ可能か調べ、だいたいの基準がわかったあたりで(空振りが見つかったのはこの後かな)私が出てアリスのスペカを検証し始たのですが、一番それっぽかった上海人形がだめ、レギオン・ウォーはLimit0で魔方陣が出ずに無理(魔方陣条件だと思われていたので、というかまだよく理解していなかった可能性あり)、トリップはKO時に人形が全て消滅するので強制不発、キューティもだめ(最後にLimit100%の蹴りがあるが…)、で最後に出てきた未来文楽がやってくれました。一時はトリップのようにKO時強制的に戻されるかと思われましたがそんなことはなく、次のラウンドまで持ち越しになり、しかも発動中はずっと暗転(おそらく全キャラ中最長)。文楽中は結界不可能であることを思い出しました。今回発動時6Aが自動発動になり、9キャラ以外にはしゃがみでスカるようになり、さらに悲しみを背負った文楽がやってくれました。星取りバグ修正後も6AがSmash属性でRiftつきKOから死体殴りで蓄積が乗ります。また、6A > B > Cで魔方陣。千槍を好きなところからダメージ調整しつつキャンセルで出し、BでKOしつつCで死体殴り魔方陣してもできそうです。暗転が長すぎて安心感がやばい。
nkmr「この人形を爆破してから3秒後にお前は死ぬ」
yappy「これぞ天をも握る最長の暗転!」

*1:北斗の蓄積バグとは正直全然違う。何となく同じ名前をつけてしまったようだ。とりあえず初めの呼称であるHPバグと言ってもいいと思う。