zelpikukirby
re-records 1333
updated 7 years ago
special thanks: sup39, Noki doki
Emulator: Dolphin 5.0 lua core
re-records: 45151
Uses credit warp by arbitrary code execution.
cutscene underflow glitch causes it.
explanation of cutscene underflow glich(quote from noki doki) "The game has 8 “slots” to store active cutscenes, numbered 0 to 7. It also keeps track of the slot number of the last cutscene that started and the slot number of the last cutscene that ended. When a cutscene starts, the last started cutscene slot number increases, cycles back to 0 if it would go past 7, and the new cutscene gets loaded into that slot. Once the cutscene ends, the last ended cutscene slot number increases in turn, becoming equal to the last started cutscene slot number. Since both slot numbers are equal, the game knows it ended as many cutscenes as it started, so there are no more cutscenes to process.
Since there’s usually no way to end more cutscenes than you start, and the slot numbers are being used in a cycle, any time the last started and ended slot numbers don’t match up, that must mean there are cutscenes left to process, even if the last ended cutscene seems to be ahead of the last started cutscene. But when a Shine Get cutscene starts during another cutscene, for some reason, it ends twice, leaving the game with -1 cutscenes left to play, which it sees as 8-1=7.
hat if you replay a cutscene in a different area than it was originally played? For most cutscenes, nothing interesting happens: either they play normally, or they end instantly, depending on whether the associated camera movement filename was overwritten in the transition or not. But some cutscenes retain a callback to execute before and after the cutscene (even if the camera movement couldn’t be found), and a pointer to a relevant object to be passed to the callback. Most notably, Shine spawns keep a pointer to the Shine being spawned.
At the beginning of a Shine spawn cutscene, its callback will lead to one of the Shine’s virtual functions, TMapObjBase::makeObjAppeared, being called. When replaying the cutscene with cross-area cutscene underflow, its Shine pointer will be stale and the virtual call can be redirected to arbitrary code. Let S be the Shine pointer; *S will be read as a pointer to the Shine’s virtual table, and *(*S + 0x100) will be set as the instruction pointer. "
setting right bell cutscene on slot4 while peach is kidnapped. the game has some delfino plaza status, each plazas objects have different memory address. so the value of right bell cutscene(8134A65C) while peach is kidnapped will be related turbo gate address while poluted piranha appearances on ricco harbor.
By looking turbo gate on screen, the value of (8134A65C) can be changed. so setting the value to be related to controller address.(this part was made by su)
at the last, get a shine while blue coin cutscene is playing. then input codes by 4 controlles for credit warp.(this part was made by su)
"cutscene underflow glitch" と呼ばれるバグを用いてコードを実行しエンディングへ到達します
ゲームにはムービーを管理するためのメモリスロットが8つ存在し、青コインムービー等を見ると順番に埋まっていき、全て埋まるとまた1から上書きしていきます。
このスロットはビアンコなどのステージに入るとリセットされますが、ドルピックタウンでは保持されます
通常ではこのスロットを余分に参照する事はありませんが、他のムービーが流れている時にシャイン取得をすると、まだ埋まっていないスロットも参照してしまい、大抵フリーズします。(スロットが8つ全て有効な値で埋まっていればフリーズしません)
しかしメモリを調整しておけばこの時に更なるバグを引き起こせ、これがcutscene underflow glitchです。
ドルピックタウンは街の状態(どろパックンがいる、ニセマリオがいる等)によって異なるメモリアドレスが割り当てられています。
ピーチ誘拐イベント中に右ベルのシャイン出現シーンを見ると、メモリに[8134A65C]という値で保存されますが、この値はリコにどろパックンがいるドルピックタウンでは"ターボゲートの描画"のアドレスとして使われています。
描画に関わるアドレスはそれを画面に映す事で値を調整可能なので、バグの利用には都合が良いです。
そこで、コード実行パートで青コイン×2、シャイン取得ムービーの計3つのムービーを見ても上書きされないよう、スロット4に右ベルシャインの出現シーンをセットします。
リコパックンが出現したら青コインムービーを真っ先に見ます。これは時間経過でコインが消滅した直後であればラクガキを1滴で消せて再びムービーを発生させられるからです。
壁の中から完全な状態の落書きを消すのは、壁に水が当たってしまう事が大半なので現実的ではありません。
青コイン消滅までの間に、ターボゲートを画面に映して[8134A65C]からの値をコントローラ関係のアドレスになるように調整します(この位置調整はsu氏制作)。
調整が完了したら画面外に持っていく事で値の更新を防ぎ、そのまま水面抜けで地下へ行きます。
地下からマンホールの端っこギリギリに位置取りすると土管内部へ引き寄せられることなく脱出用ジャンプが可能なので、それで建物内部の即死床へ移動。
青コインの消滅まで適当に時間を潰して、消滅した瞬間に落書きを消してムービー発生、その間に鐘の下のシャインを取る事でcutscene underflow glitchを発生させます。
スロット4に残っていた右ベルシャイン出現シーン[8134A65C]を読み取ろうとした際に、アドレス[8134A65C]の値がコントローラ領域のアドレス値になっているため、コントローラ入力をコードとして実行します。
ここでコントローラを4つ接続し、エンディングへ再生するようなコードとフリーズ回避のためのコードを入力し、エンディングへ到達できます(ここもsu氏制作)。
カウントが20ピッタリになるとクリア扱いとなってしまうので、18→21と跨ぐように割り回避します。
海外版(後期版)使用なのは、ボトル同士がぶつかっても消滅しないからです。これにより、ボトルを複数同時に取得しても壊れないのでカウント重複が日本語初期版よりも多くできます。
最後にビアンコ挿入ムービーを足しているのは、リコカットでビアンコに入るとビアンコ突入時の演出時間(4秒)をカットできるのを考慮したため
ドルピック挿入ムービー数は以下の通り
シレナ先ルート
ビアンコクリア後5回
リコクリア後7回
マンマクリア後1回(2枚目は最終シャインのため洪水になる)
ピンナクリア後4回
シレナクリア後6回 土管ムービー0回
マーレクリア後7回
モンテクリア後7回
計37回
シレナ後ルート
ビアンコクリア後4回
リコクリア後0回
マンマクリア後1回(同上)
ピンナクリア後6回
シレナクリア後7回 土管ムービー7回
マーレクリア後7回
モンテクリア後3回
計28回
Y保存で黄色イカを後ろに進ませ、モンテ族との強制会話により消滅させる
同様にY保存で緑イカを後ろに進ませるが、QFを2つずらしてダイブの速度を横方向に保存する
イカに乗ったら再度QFを2つずらしてイカが動き出すと同時にジャンプする事でダイブの速度を解放する
ポーズ連打で疑似的にQF単位の操作をおこない、L字抜けをする
後はいつものチェックポイントを踏む作業
外部3F
内部(ウナギが反応するまで)9F
ウナギ戦157F
泥滑りでダイブ復帰の速度を維持する事で更新
泥滑りを継続するためにジグザグに動いています
TAS timing (start~final input) is 2:23:29.42
re-records:788703
TAS made by me(zelpikukirby)
tool developer: Goldfire, naosan, sup39
This TAS was made from May 2018 to February 2023.
some optimizations are not complete because new techniques and glitches are found during TAS making.
In the early stages, the priority is to unlock Corona Mountain in order to reduce the cutscenes in delfino plaza.
it takes 2.6 seconds to scroll from episode 8 to 1, but a cutscene takes 3 seconds.
so bianco1 skip and gelato beach skip are faster.
Exceptionally, Pinna 2 reds is collected before unlock corona because it does not play any cutscene.
00:00 opening
06:53 delfino plaza
08:38 bianco hills(1st)
16:27 gelato beach unlock
17:33 gelato beach(1st)
19:21 pianta village(1st)
28:52 pinna park(1st)
41:28 ricco harbor(1st)
50:57 bianco hills(2nd)
53:32 sirena beach(1st)
1:03:49 noki bay(1st)
1:14:01 corona mountain(1st)
1:15:10 delfino plaza
1:25:04 bianco hills(3rd)
1:34:08 noki bay(2nd)
1:40:59 pianta village(2nd)
1:46:35 pinna park(2nd)
1:52:28 gelato beach(2nd)
2:07:12 sirena beach(2nd)
2:15:04 ricco harbor(2nd)
2:21:02 corona mountain(2nd)
the strat to reach shine found by su
leaf storage found by orange
This trick can be done by getting the shine above Petey Piranha
but it is impossible normally because the cutscene of Petey Piranha surrounds the shine.
The solution is rope storage and polluted piranha plant cutscene.
if mario holds rope, his horizonal speed and vertical speed will be keeped.
to reach rope, I used leaf storage.
leaf storage happens when mario is pushed by the leaf the moment he goes water, and V speed increased by 20%.
I used this method and got 329 V speed
Then move to another leaf that was set up on land earlier and paddle to just below the rope.
spam spraying also increases V speed a bit, so increase to 337.6
when mario is on the rope, his speed released by damage.
so polluted piranha plant cutscene plays immediately after hitting the polluted ball.
while cutscen is playing, the other cutscene will not play.
you can get the shine when the shine cutscene starts as soon as the polluted piranha plant cutscene finishes playing.
If the polluted piranha plant cutscene finishes playing at the wrong time, slightly, it will crash or go into petey piranha fight.
sup39 found better setup to avoid pausing and saving
youtube.com/watch?v=OXlWpAHSn_E
youtube.com/watch?v=W02y0xoHVX8
youtube.com/watch?v=TBhxoM-OQRQ
When a sand block respawns and mario rides on it, he will be pushed out.
its distance depends on quarter frame and size of the sand block.
While working on the 120 shines TAS, I did some research on the sand block glitch and thought 0xA is possible, so I made this.
落下ダメージはどのように発生するかをTAS制作者が徹底解説します
re-records 3300
Player zelpikukirby, Goldfire
NTSC-J version
Played on Dolphin 5.0-114