1 ポイント 投稿者 GN⁺ 2023-07-16 | 1件のコメント | WhatsAppで共有
  • Super Mario 64の「Watch for Rolling Rocks」スターを、新たなA入力なしで、開始前から継続しているAホールドだけで取得する0.5回Aプレス攻略を解説する
  • A入力はpress、hold、releaseに分かれ、前のスターで押したAを押し続けて持ち込むと、単一スター基準では0.5、ラン全体基準では追加入力0として数えられる場合がある
  • 攻略の核心は、Scuttlebugのhome位置を移動させ、部屋のアクティブ化境界を利用して上へ持ち上げたあと、misalignmentとバウンドでスタープラットフォームの高さを確保すること
  • 必要な水平速度は、浅い水、急斜面、gate、out-of-bounds判定を組み合わせたHyper Speed Walkingで作り、速度の蓄積には約12時間かかる
  • PU移動ルートは、floor collisionのshort変換、斜面ごとのsyncing speed、QPU alignmentを合わせてmain mapへ戻り、elevatorとスタープラットフォームへ接近できるよう設計されている

0.5回Aプレスの基準

  • Aプレスは一瞬の入力ではなく、pressholdreleaseの3段階に分かれる
    • pressはMarioをジャンプさせるために使われる
    • holdは小さなkick、水中でのswim、twirl中のゆっくりした落下、Wing Cap中のゆっくりした落下に活用できる
    • releaseには現在、有用または重要な事例がない
  • 0.5回Aプレスとは、新たにAを押さず、以前に押したAをそのままholdしている状況を指す
  • Over the Rainbowの例は、この数え方を示している
    • cannon platformに到達するにはAをholdするだけでよい
    • 1回目のcannon発射と2回目のcannon発射には、それぞれA pressが必要
    • 単一スターだけを見ると3 A pressesとして数えられる
    • A Button Challengeのラン全体では、course進入に使った以前のA pressをholdし続けて、最初のhold要求を満たせる
    • そのためOver the Rainbowは、単一スター基準では2.5 A presses、ラン全体基準では追加2 A pressesになる
  • Watch for Rolling Rocks攻略でもlevel開始時点ですでにAが押された状態であり、ラン全体ではこの入力が以前のA pressから継続しているものとして数えられる

Scuttlebugの運搬と上昇

  • Scuttlebug Transportationは、Scuttlebugのhome位置がMarioと衝突したときに更新される性質を利用する
    • Scuttlebugはhome周辺の一定半径をpatrolする
    • Marioがその半径に入るとlunging attackを行う
    • ScuttlebugがMarioにぶつかると、衝突時点のScuttlebug位置が新しいhomeになる
  • 運搬には制約がある
    • Scuttlebugはnative roomの外へ出られず、doorで引っかかる
    • 現在のhomeより低すぎる位置からwallへ歩いて入り込むと消える場合があるため、運搬中は避ける必要がある
  • 目標は、Watch for Rolling Rocksスターの下にあるcorner付近へScuttlebugとhomeを移すこと
  • Scuttlebug Raisingは、rolling rocks roomのアクティブ範囲を利用してScuttlebugを上へ持ち上げる
    • Marioがrolling rocks room内、またはdoor外側の小さなyellow regionにいるときだけ、roomと内部objectがアクティブになる
    • Marioがその外にいると、roomは黒く見え、objectはinvisible状態になって動かない
    • Scuttlebugは非アクティブ状態でもMarioの方へturnし、lungeを開始できる
    • Marioがyellow regionに入ってScuttlebugをアクティブ化したあと、Scuttlebugがtrajectoryのpeakに達したときに再びyellow regionを出ると、Scuttlebugは落下せずその高さで止まる
    • この過程を繰り返してScuttlebugを継続的に上へ持ち上げる
  • Scuttlebugの感知半径はsphereではなく、上下に無限に伸びるcylinderなので、どれだけ高くなってもlungeを誘導し続けられる
  • この攻略では、Scuttlebugがhomeの方へlungeするようにしてcornerのすぐ上に留まらせる
    • MarioがScuttlebug radius内でアクティブ化すると、ScuttlebugはMarioの方へlungeしてdoor方向へ移動できる
    • その方法の方が速いが、この攻略ではcorner付近の位置が必要なため使わない

Misalignmentと高さの確保

  • corner上部にはmisalignmentと呼ばれる特性がある
    • ゲームコードではfloor collision checkingとwall collision checkingの処理方法が異なる
    • その結果、1x1 unitの領域でMarioがwallに押し出されず、floorの下へ入り込める
  • Marioがfloorの下79 units未満にいる場合、floor上へsnapされる
  • 最後はScuttlebug bounceとground poundをmisalignmentに組み合わせ、Watch for Rolling Rocks platformへ上がれるだけの高さを得る

Hyper Speed WalkingとParallel Universe移動

  • 必要な速度はHyper Speed Walkingで作る
    • あまりに急なslopeでは通常Marioは立っていられず、滑り落ちる
    • 浅い水に沈んだslopeのunderwater portionでは、uphillへ走ろうとすると後ろ向きに走り、速度が増え続け、upper boundがない
  • 通常は水中に落ちたりslopeが終わったりして速度を大きく蓄積するのは難しいが、gateとout-of-boundsを利用すればその場で速度を蓄積できる
    • gateのbottomはceilingとして扱われる
    • Marioがceilingのすぐ下へ近づきすぎるように移動しようとすると、ゲームは位置移動を拒否する
    • ある程度速度を得たあと方向を変え、intended next positionがwallを越えてout-of-boundsになるようにすると、ゲームはMarioをout-of-boundsに置かず、その場に留める
    • out-of-boundsは続くため、gate ceilingより長く速度を蓄積できる
  • この攻略ではgateを開け、gate ceilingで一部の速度を作ったあと、angleをout-of-bounds方向へ向けて残りの速度を蓄積する
  • 速度の蓄積には約12時間かかる

PU、QPU、syncing speed

  • Marioのpositionはfloating point numberだが、floor triangle collision testではshortに変換される
    • fractional portionはtruncatedされる
    • 大きすぎる、または小さすぎる数はmodulo operatorによって-32768から32767の範囲に入る
  • 実際の位置がこの範囲を外れていても、floor detectionに使われる位置は元のbox内へloopする
    • 実際のMario位置に地形がなくても、floor detection位置が地形上なら、ゲームはMarioが地面の上にいるものとして処理する
    • このように元のmapのコピーのように動作する領域をParallel Universe、つまりPUと呼ぶ
  • PUにはgraphicsがなく、elevatorやitem blockのようなobject、enemy、coin、star、wallもない
  • N64 consoleではcameraがPUへ追従するとcrashする可能性があるため、この攻略ではcameraをmain mapに固定してcrashを避ける
  • ゲームはMario移動の各quarter stepでfloor上にいるかを確認する
    • 単純なPU移動では、一度に4 PUを越えなければ各quarter stepが地形上に置かれない
    • 4 PUの距離をQPUと呼ぶ
  • 実際のspeedと移動に使われるde facto speedは異なる
    • de facto speedはslope steepnessに応じて、実際のspeedの一部として決まる
    • slopeが急であるほど、同じspeedでもde facto speedは小さくなる
  • QPU距離とquarter stepが一致するspeedがsyncing speedである
    • 最も低いsyncing speedは、正確に1 QPU移動する速度
    • その倍数もsyncing speedとなり、複数QPUを一度に移動できる
    • slopeごとにsyncing speedの集合は異なる
  • Secret AquariumのPU移動例では、複数のslopeのsyncing speedを順に満たす必要があり、最初のsyncing speedまでは約12時間、2つ目のsyncing speedまでは約25時間かかる
  • Watch for Rolling Rocksのルートは、25時間ではなく12時間の速度蓄積で可能になるよう組まれている
    • lakeから上がるpathは、異なるslopeを持つfloor triangle数十個で構成される
    • そのうちT1からT6までの6つのtriangleを選び、これらはsteepnessがstrictly decreasingしている
    • 6つのtriangleのheightがbottomからtopまでに必要なvertical distanceをgapなしでカバーする
    • これらのtriangleを順に利用し、initial slopeのfirst syncing speedだけでroute blueprintを完成させる

最終ルートとスター取得

  • 基本ルートは、Hyper Speed Walking slopeから始まり、lake上のpathを登り、2つのelevatorに乗り、Amazing Emergency Exit platformまで行ったあと、Watch for Rolling Rocks platformへ向けて発射される構成
  • PU移動中は、speedがsyncing speedより少し低いとrelative forward、少し高いとrelative backwardに動く
  • cardinal directionからangleが少しずれるだけでも、QPU距離のためsideways movementが大きく拡大される
  • QPU alignmentの管理が重要
    • 4 PUの倍数にあたるgridをQPU gridと呼ぶ
    • Marioがこのgrid上にいるとQPU aligned状態である
    • それ以外の量のPU移動には、out-of-boundsやslope changeのような特殊条件が必要
    • QPU misalignedになると、main mapへ戻るのが難しくなる場合がある
  • lake pathでは、T1からT6まで各triangle上でspeedをそのslopeのsyncing speed付近まで下げたあと、uphillへ移動して次のtriangleへ渡る
    • triangle遷移ごとにQPU alignmentは変わるが、ルートは最後に互いに相殺されてQPU alignedになるよう計画されている
    • 6つ目のtriangleではzigzagでmain map側へ接近する
  • elevatorはPUにobjectがないため、main mapへ戻ってから利用する必要がある
  • Aをholdし続ける理由は、Bを押して小さなkickをするため
    • kickがないとMarioはelevatorを通過してしまう
    • kickをするとelevatorに乗ってheightを得られる
  • 最後の移動は、Amazing Emergency Exit platformへkickしたあと、方向を変えてScuttlebugの方へlaunchする順序
    • この移動は右へ10 PU、下へ3 PUのdisplacementを作るため、あらかじめ3 PU上かつ10 PU左に位置してmain mapで終わるよう合わせる
    • 同時にrelative map位置も、最終移動が可能になるよう調整する
  • ScuttlebugはPU versionのroomに入った瞬間にアクティブ化され、落ちすぎる前に到達する必要があるため、final approachには数frameしか余裕がない
  • 最終的にScuttlebug bounceとmisalignmentでのground poundによって十分なheightを得てWatch for Rolling Rocks platformに上がり、スターを0.5 A pressesで取得する

1件のコメント

 
GN⁺ 2023-07-16
Hacker Newsのコメント
  • これは完璧なYouTube動画なのではと思う
    背景には素晴らしいMarioのサウンドトラックとゲームプレイ映像があり、自作のチャートが何が起きているのかを視覚的に示し、音声解説が画面を説明してくれる
    他のYouTube動画やコメントまで参照していて、ものすごく詳細で知識も深いのに、何かを売ろうともしない
    再生数より愛情で作られた感じがして、自分にとってはYouTubeの頂点だ

    • HealthyGamerGGの動画も似た感じ
      神経化学/生化学、心理学、ゲーム、人間の行動、文化と宗教、そしてそれらが時間とともにどう変わってきたかまで横断しつつ、詳細で知識が深い
      自分にとってはそういうものがYouTubeの頂点だ
    • 「レベルを始めるときにAボタンを押したまま開始し、その後はAボタンを二度と押さない」と言ったほうが、もっと分かりやすいかもしれない
    • 背景音楽に過敏でないことをありがたく思うべき
      自分は背景音楽がかなりつらい
  • pannenkoekの知識の深さと分析力には本当に驚かされる
    SM64の動画を見ているうちに目が肥えてしまって、他のゲームで同じレベルの厳密さと制作品質を見つけるのがとても難しくなった
    これまでで一番近かったのは、スピードランナーたちがWind Wakerのあるパズルで乱数を攻略した過程を扱った動画だった
    https://youtu.be/1hs451PfFzQ

  • これは純度の高いナードポルノで、本当に素晴らしい
    ゲームの衝突判定が実際には浮動小数点値を受け取ってshortに変換する、みたいな説明が妙に脳をくすぐる
    SM64のようなゲームが発売から数十年たってもなお人々を魅了し、引きつけ続けているという事実は多くを物語っている
    最近の主流ゲームで、あれほどのプレイヤーの熱量を共有している作品はだんだん少なくなっている気がする

  • Aボタンチャレンジの完全な歴史
    https://www.youtube.com/watch?v=yXbJe-rUNP8
    5時間を超える動画なので、BGM代わりに流したり時間つぶしに見たりしている
    この人たちが見せる知識量とバグ悪用のレベルはとんでもない

    • 最近これを最後まで見終えたが、少しでも興味がある人には強くおすすめする
      発見されたものの一部は本当に狂っていて、かろうじて成立している要素があまりにも多く、驚かされる
      Bismuthは全体としてもクオリティの高いYouTuberだ
  • 12時間かけて速度を積み上げる」のところで完全に吹いた
    https://youtu.be/kpk2tdsPh0A?t=640
    思考が本当に明晰だ
    インターネットにこんなにとてつもなく賢い人がたくさんいるのはいいことだ

    • 逆に見ると、ちょっと無駄にも感じる
      もちろん自分の頭をどう使おうが自由だが、30年近く前のゲームの極度に難解なバグにここまで没頭し、ツール支援なしでは実行不可能な芸当を技術的に可能だと証明することにこれほど打ち込むのは、本当に奇妙に見える
      解説動画はすばらしいが、その土台にある目標は自分には荒唐無稽に思える
  • 並行宇宙の話が好きなら、SM64 1-Keyスピードラン https://youtube.com/watch?v=iUt840BUOYA を見て、そのあとにBismuthの解説 https://youtube.com/watch?v=wjge1bVobN0 をぜひ見ることをおすすめする
    pannenkoek2012の研究に大きく基づいた、本当に驚異的な技術的成果だ

    • ゲーマーたちが、結局はゲームのバグにすぎない現象を説明するために作り上げた用語は面白い
      並行宇宙とその周辺設定はすべて、床判定コード内で16ビット整数がオーバーフローすることから生じている
      Mario 64は通常、位置を浮動小数点で保存しているが、衝突判定では16ビット整数に変換する
  • 本当に驚き
    こういう情熱に強く突き動かされて、これほど極端な献身を注ぎ込む人たちを見るたびに感嘆してしまう
    自分はここまで一生懸命に取り組ませるほどの情熱を感じたことはめったにない
    ときどき、こういう人たちが自分の才能とエネルギーを病気の治療や科学的ブレークスルーのような本当に重要なことに使ってくれたらいいのにと思う
    少なくとも本人にとっても、大きな潜在力を無駄にしなかったと感じられるだろうから
    この動画に注ぎ込まれた労力だけでも、まともな研究論文が1本は書けた気がする
    自分の仕事にもこのレベルの動機があればと思うが、全体としてはただただ感心する

  • この動画が好き
    さらに最近では、N64の具体的な技術的要素を扱った動画も作っていて、浮動小数点に注意が必要
    https://youtu.be/nYDmBdUalgo

    • この動画は、コンピュータサイエンスの授業で疑似乱数生成器とIEEE浮動小数点の入門資料として使ってもいいくらい
  • 元記事みたいなウサギの穴動画をもっとおすすめしてくれる?
    テーマは何でも構わない
    物事がどれだけ深く掘り下げられるかを見せてくれるこういう動画が好き
    今いちばん気に入っているのは https://youtu.be/_hjRvZYkAgA

    • 子どもの頃の記憶にある古いLego PCゲームを逆コンパイルし始める動画 https://www.youtube.com/watch?v=MToTEqoVv3I を最近かなり楽しく見た
    • Marcel Vos には、Roller Coaster Tycoon のゲームメカニクス、特に極限まで突き詰めたケースを扱う YouTube 動画がかなりたくさんある
      https://youtu.be/KVgoy_a_gWI
    • 同じ入力の組み合わせだけで常に Pokémon に勝つ素晴らしい動画もある
      https://youtu.be/6gjsAA_5Agk
    • Karl Jobst のスピードラン動画も良い
  • この動画は、0.5 A入力が何で、なぜそれを気にするのかも説明してくれる
    Mario 64 はボタンを離す動作を気にしないので、走者たちは離す動作を別個には数えない
    いつでもAを離さないという選択ができるため、最少A入力ランではAを離すのは再びAを押すためだけになる
    リアルタイム解説では、0.5 A が何を「意味する」のかを短く説明できるだろうが、こうした説明がないと、なぜそれを気にするのか疑問に思う可能性が高い

    • これだけ読むと、ゲームをよく知らない人には、なぜ最後に押したときだけAを押しっぱなしにしてはいけないのか分からない
      Aを押していると、Mario はAを押していないときとは違う行動をするという点も説明する必要がある
    • より正確には、ゲームがときどきAを新たに押すことを要求する一方で、あるときはAが押された状態であるだけで動作が発生する
      最初のケースでAを押して離さなければ、2番目のケースがその入力を流用できる
    • 「Mario 64 はボタンを離す動作を気にしない」というのは本当に正しいのか?
      空中キックのように押している状態を気にするなら、空中にいるがキックしていない状態のような、押していない状態も必然的に気にしていることにならないか
      空中でキック中の状態から、空中でキックしていない状態へ移るにはボタンを離さなければならない
      自分の理解が間違っているのかな?
      M64 は5分くらいしか遊んだことがないけど、いつかやろうと思ってリストには入れてあって、子どもたちに夢中になってもらって自分も遊ぶ時間を作ろうとずっと勧めている
    • ボタンを離す動作も気にしてはいる
      2回目のジャンプをするには、まずボタンを離さなければならない
      0.5 は実際には、1回のA入力が複数のレベルにまたがって持続するという概念に近い
    • keydown + keyup = keypress
      表面上は「0.5って何なんだ?」と思うけど、結局は意味論の問題にすぎない