ニコニコチャンネルメニュー

ブロマガ - ニコニコチャンネル

++C++; // 未確認飛行 C ブロマガ

スーパーマリオ64の並行宇宙バグ

2016/10/02 11:40 投稿

コメント:4

  • タグ:
  • TAS
  • マリオ64


昨日、勉強会真っ最中だったにも関わらず、なかなかの衝撃で見入っていたわけですが。スーパーマリオ64のTAS (ツールを使ってのスピードラン)記録が30秒以上更新されました。

スピードランって、もうこのレベルに至ると更新ってなかなか難しく、何かとんでもない発見でもない限り、せいぜいフレーム(マリオ64は30fpsなのかな。1フレーム30分の1秒)単位の更新しか起きないものです。5分の記録に対して30秒(約1割)更新されたというのは、結構革新的な発見があったということになります。それが、並行宇宙バグ(parallel universe glitch)って言われるもの。

5分切り記録

まあ、実は、この並行宇宙バグの実用化は今回が初めてでもなくて、去年の7月には実用化されています。去年、「歴史的記録が速攻で削除された…」ってボヤキをブログに書いてますけど、その時から使われています。ニコ動からは削除されているので、以下のYouTubeの投稿をご覧ください。

https://www.youtube.com/watch?v=4_N3LWaoCEg

要するに、並行宇宙バグを使って2か所短縮できそうな場所があったわけですが、そのうち片方だけでも5分の壁を越えれた、もう片方も実現できればさらに30秒は縮みそうという状態でした。案外その「もう片方」が難しくて1年以上間が開きましたが、このたび実現に至ったみたいです。

並行宇宙バグ

で、このバグがなかなか見事なんで、ついうっかり、軽く説明書きたくて、自分も約1年ぶりにニコニコのブロマガを書き出したと。

並行宇宙

マリオ64って、マリオの今いる座標は32ビット浮動小数点数(float)で管理しているっぽいんですが、床とかのヒット判定は16ビット整数(short)で計算しているそうです。なので、以下のような現象が起きる。
  • 移動自体はfloat管理なので、±32768を超える範囲にも移動できる
  • shortをオーバーフローさせることで、65536 (short 1周分)ごとに同じ床判定が存在する
  • これを「並行宇宙」(parallel univers)と呼ぶ
  • マリオ64にはBLJ(いわゆる「ケツワープ」)とか、この距離を一気に飛び越える速度を得られるバグがいくつかあるので、それを使って隣の並行宇宙に飛び乗れる
  • 並行宇宙には、床はあるけども、水とか壁とか敵とかはいない
並行宇宙に行くには実際にはいくつか課題があって、以下のような工夫が必要だそうです。
  • N64実機だと、あんまり遠い座標に飛ぶとゲームがクラッシュする。ただ、視点を固定した状態でならクラッシュしないので、固定が必要
  • 床とのヒット判定は4フレームに1回しかしてない。その判定してない3フレームの間にも、ちゃんと床のある範囲に乗っていないと死ぬので、並行宇宙4つ分(quadraple parallel universeで、QPUっていう呼び方してる。1 QPU = 4×65536 = 262144)をほぼ等速運動で移動する必要がある
で、並行宇宙に水とか壁とかがないことを利用して、本来壁に阻まれてはいれない場所とか、水抜きしてからでないと入れない場所に水抜きなしで入ったりとかができると。

解説は、まあ、大体英語しかないんですが、以下の辺りにあります。
こんなもん、よく調べたなぁ。それに、仕組みが分かったところでよく座標とか速度の管理できるなぁ…

並行宇宙を使ったTAS更新

このバグを使っての記録更新、0 star TASの場合、該当するのが以下の2か所。
  1. 炎の海のクッパ(2度目のクッパ)のステージ内を、後半をすっ飛ばしてクリアする(クッパがいる入り口に入る)
  2. 堀の水を抜かずに城の地下に強制侵入する(鍵が要らなくなる)ことで、闇の世界のクッパ(1度目のクッパ)を丸ごとスキップする
1個目を実現して5分を切ったのが去年7月の更新で、2個目が実現したことで今回の30秒短縮を達成しています。

2個目の補足ですが、扉は、ただ単にBLJの超スピードですり抜けるだけじゃダメ(裏に何もない)で、扉を開けて初めて場内のマップがロードされます。本来、水中では扉を開けませんが、並行宇宙(水がない)で扉に近づいて、1 QPUピッタリ飛んで元の世界に戻ってくれば、着水の瞬間に一瞬だけ扉を開けるフレームがあるので、そこで扉を開いてしまえるというものです。

そして、この2個目が難しかったのにはさらに以下のような理由があったみたいです。
  • 城の外で並行宇宙に行く(1QPU飛べる)速度を得ることはできない(リフトが必要)
  • お堀の透明スイッチに入れれば、その中のリフトでBLJして、その速度を保ったまま外に出てこれる(いわゆる「ケツ量保存」)。その速度を使えば目的の強制侵入ができる
  • ただ、まず最初に城の外から、水を抜かずに、お堀の透明スイッチに侵入する手段が必要で、これがなかなかできなかった
つまるところ、今回の4′21″67記録は、冒頭の、いきなりケツワープしてお堀の透明スイッチに侵入しているところにすべてが掛かっています。

1 key記録

ちなみに、今回の記録は「1 key」記録と呼ばれています。本来必須とされるものをバグを使ってすり抜けるわけですが、どこまですり抜けたかを指して、「16 stars」とか「0 star」とか呼んでいます。今回、「0 star」よりもさらにすり抜けたものが多くて、「1 key」という新しい呼び名が生まれました。

本来、マリオ64はスターを70個以上集めないと最終ステージ前の無限階段が抜けられず、クリアできないはずです。それを、ループ判定を強制突破する方法が見つかったり、ミップ(場内にいるウサギ)を使った扉抜けが見つかったりで、必要スター数が16個に減りました(ミップを出すのに必要な枚数が15枚 + ミップを捕まえたときの1枚)。これが「16 stars」。

その後、いわゆるケツワープの発見で、ミップなんて使わなくても扉を抜け放題になったので、スターなしでもどこにでも行けるようになりました。が、炎の海のクッパに直接行く手段がまだなかったので、ウォーターランドの1枚だけはスターを取る必要があって、「1 star」という状態に。ウォーターランドもケツワープですり抜けられることが発覚してからは「0 star」となりました。

この辺りの流れはnaverまとめになっていたり。


そして今回、その「0 star」からさらにすり抜けが増えたわけです。これまで「0 star」でも、クッパはちゃんと倒して2本の鍵を入手する必要がありました。それに対して、今回、1回目のクッパのスキップが実現したので、鍵すら1本で済むということで「1 key」と呼ばれることに。

コメント

ふぐおんな
No.2 (2016/10/12 21:13)
>>マリオ64はスターを70個以上集めないと最終ステージ前の無限階段が抜けられず、クリアできないはずです。それを、ループ判定を強制突破する方法が見つかったり、ミップ(場内にいるウサギ)を使った扉抜けが見つかったりで、必要スター数が16個に減りました。

厳密には無限階段のループ判定を強制突破する方法の発見で50枚、3階の扉を突破する方法で31枚に減るという過程があります。この2つはほぼ同時に発見されたようで31枚でクリアという情報は1996年の12月に発売されたじゅげむBOOKSの攻略本に載ってます。他の裏技雑誌がおそらく初出なのでもっと早い時期から知られていたはずです。

なので順序としては70→31→16が適切なのではないかと思います。
iwanaga (著者)
No.3 (2016/10/13 23:28)
>>1 >>2
にわかがばれますね…
実は実機プレイしたことない(というか64結局買わなかった)のと、1スターよりも前の時代はあまり見たことがなく。
訂正ありがとうございます。余力あるときに記事にも修正入れてみます。
メーゼ
No.4 (2016/10/18 02:53)
>床とのヒット判定は4フレームに1回しかしてない。その判定してない3フレームの間にも~

コメンタリー見る限り、「衝突判定は1フレームに4回行われている」、とするのが正しいかな、と
コメントを書き込むにはログインしてください。

いまブロマガで人気の記事