【調査レポート】CCM ペンギンレース

考察さむいさむいマウンテン, 仕様, 調査レポート

レポート公開日: 2020年01月22日
調査メンバー: circumark994, atmpas
Special Thanks: ミタギ, Goldrush, ツララ

私たちはさむいさむいマウンテンのペンギンレースの仕様を調査し、その結果を基に現行の100枚レーススターのルートを見てみた。

本稿では、最初にレース関連の仕様に触れ、その後、現行ルートごとに速いタイムの出し方を語る。

なお、ペンギンの仕様は『レース開始~ペンギンゴール』と『ペンギンゴール~スター取得』まで話が異なるので、分けて書いている。

★用語集★

  • 通常ルート: 100枚スター+レーススターにおいて、昔からよく使われている101枚ルートのこと。
  • atmpas specialルート: 2018年に開発された新ルートのこと。
  • 抜け道: スライダー途中にある細い通路(正規ショートカット)のこと。
  • スタータイム: スターを取るまでのタイムのこと。
  • PT: スライダーのチェックポイントのようなもの。スライダー最初は0、最後は51となっている。

レース開始~ペンギンゴールにおけるペンギンの振る舞い

ゲームの内部処理を調査したところ、レースを開始してからペンギンがゴールするまでの間、ペンギンは以下のような挙動をすることが分かった。

ペンギンの速度関連で登場する値は以下3つ

(1) ペンギンの速度: 実際のペンギンの速度のこと。

(2) Speed Target: ペンギンの目標速度値のこと。ペンギンの速度はこの値に徐々に近づくような仕様になっている。最大値150、最小値70(ペンギンがPT=35を越えると最小値60)

(3) Effort: この値によってSpeed Targetが決まる。範囲は-500から1000。

実際の仕様

手順1: Effortの修正

  • もし『ペンギンのY座標 – マリオのY座標 < 100』もしくは『PT=35以降』だったらEffortを100ずつ減算
  • それ以外ならEffortを30ずつ加算

手順2: Speed Targetの修正

Speed Target = (Effort + (ペンギンのY座標 – マリオのY座標)) / 10

この時Speed Targetが70~150の範囲外だったら範囲内に丸める(PT=35以降は60~150)

手順3: ペンギンの速度の修正

ペンギンの速度をSpeed Targetに向けて基本的に0.4ずつ減算or加算(範囲外に出た場合は範囲内に丸める)

例. 現在のペンギンの速度が100、Speed Targetが150だったら

1フレーム経つごとに、100.00 → 100.40 → 100.80 → 101.20……というような感じでSpeed Targetに向けて速度が上がっていく。

※ 実際には特定の状況でこれ以外の幅で速度が変動することもあるが、今回の話とは関係ないため割愛。

つまりどう解釈すればよい?(実際とは違うけどイメージはこんな感じ)

ペンギンがPT=35の到達するまでは

  • マリオとペンギンのY座標差が大きい(100.01以上)とペンギンが加速
  • マリオとペンギンのY座標差が小さい(100.00以下)とペンギンが減速

ペンギンがPT=35を越えたら

Speed Targetが実質60固定となる。(実際はPT=35に到着した5, 6フレーム後にSpeed Targetが60となる。)

なので、PT=35以降はペンギンの速度が0.4ずつ落ちていき、60になったらずっと60のままとなる。

例. ペンギンの速度が120.00でPT=35に到達した時

120.00から119.60, 119.20, 118.80, 118.40, …となって、最終的に60.00になる。以降は60.00固定。

ccm_penguin_pt35 pt_35_resized

(上記画像はPT=35の場所)

実質60固定の"実質"の意味は?

PT=35以降もY座標差を大きくすればSpeed Targetは上がるが、100枚レースの場合、Speed Targetが上がるほどY座標差を大きくするのは不可能なので60固定と考えて良い。

ペンギンがゴールした後のペンギンの振る舞い

ペンギンはゴールした後に正面の壁に衝突する。

壁に衝突してから一定時間経過後歩き始めると、ペンギンの角度が毎フレーム200ずつ加算されていき、65535を超えると停止する仕様となっている。

分かりやすく言い換えると、衝突する時のペンギンの角度によって最後話しかけられるようになるまでのタイムが変わるということになる。(ペンギンが左に向いているほど早く話しかけられる)

※ 分かりづらくなるため、以下で紹介する角度の値は符号なしの値で表現している。(実際は符号付き)

例1. ペンギンの角度が34947で壁に衝突した場合

(65535 + 1 – 34947) / 200 = 152.94 -> 153フレーム経つと話しかけられる。

153_1 153_2

例2. ペンギンの角度が33073で壁に衝突した場合

(65535 + 1 – 33073) / 200 = 162.31 -> 163フレーム経つと話しかけられる。

163_1 163_2

このペンギンの角度は何によって決まる?

ペンギンの角度は、今までの『ペンギンの速度』や、それにより変化する『ペンギンの軌道』によって決まる。

ゆえに、乱数ではないが人間で調整できるものではないので、実質運ゲーと考えてもらって良い。

ちなみに、100枚レースの通常ルートでは、ペンギンがPT=35を通過して以降はマリオの動きに関係なくペンギンの速度は固定幅で減少する。

つまり、その時点でそれ以降のペンギンの軌道、またゴール時のペンギンの角度は確定するため、最終的なタイムも同じになる。(PT=35以降はマリオがどんな動きしても同じタイムになるということ)

実際試したところ、(条件無視で)最大差11フレーム=0.36秒まで確認できたが、通常ルート/atmpas specialルート/ワンスターで誤差のレベルが全く違うので、この後述べる各ルートのセクションで確認してほしい。(先ほどのFRM値で言うと最小が153、最大が164まで確認できた)

JP vs US

JP vs USは、テキスト差と仕様違いにより、以下のゲーム内タイム差がある。

■ レース単体の場合(100枚スターテキスト無し): JP = US – 0.06

~ 内訳 ~
最初話しかけ ⇒ +0.03
最初のテキスト分 ⇒ -0.23
最後話しかけ ⇒ +0.03
最後のテキスト分 ⇒ +0.06
スター出現 ⇒ +0.03

■ 100枚レースの場合(100枚スターテキスト有り): JP = US + 0.30

~ 内訳 ~
最初話しかけ ⇒ +0.03
最初のテキスト分 ⇒ -0.23
100枚のテキスト分 ⇒ +0.36
最後話しかけ ⇒ +0.03
最後のテキスト分 ⇒ +0.06
スター出現 ⇒ +0.03

テキスト以外の仕様違い その1

ペンギンに話しかける時の仕様がJPとUSで異なり、USのほうが1フレーム速い。これはノコノコに話しかける時なども同様である。

テキスト以外の仕様違い その2

スターの出現方法がJPとUSで異なり、USのほうが1フレーム速い。

ちなみに、スターの出現元の位置も違い、JPではペンギンがケツからスターを出すが、USでは体からスターを出す。

19_jp 20_us

以上の仕様差から、実はペンギンゴール以降のパートでは、テキストを除いて比較しても、USのほうがJPより2フレーム速いのだ。

ペンギンは乱数を持たない?

上記の仕様が正しいとするならば、ペンギンは乱数を持たないことになる。

ホントに乱数を持たないのか、70idealrun時に作成した100枚レーススターのタスを使って調べてみた。

手順:
(1) ステージイン時の乱数が異なるステートを5つ用意
(2) 同じ入力のタスを再生して、Desyncしないかチェック
(3) Desyncしなければ”ペンギンは乱数を持たない”という説が正しいことになる

実際に試したのが次の動画だ。

見ての通り、乱数が違っても全く同じ動きをするので、調査した仕様に間違いはない(ペンギンは乱数を持たない)ことが分かる。

ペンギンレースでのチート判定の仕組み

仕様によると以下の2つの条件のどちらかを満たすとチートと判定される。

(1) マリオが60フレーム(2秒)以上継続して空中にいる
(2) 抜け道の中間にあるチート検出用オブジェクトの500ユニット以内に入る(要するに抜け道を経由してゴールしてはいけないという仕様)

ccm_shortcut cheat_detection_resized

仕組みが良く分かっていない頃は『チェックポイントがある』とか『それぞれの高さの地面に触れないといけない』とか色々な推測が飛び交っていたが、実はどれも正しくないことが分かった。

RTAの場合は(2)の条件は無視でよいので、(1)の条件だけ意識すればよい。

また、先で述べた(1)(2)の観点で『ペンギンレーススター』単体のワンスターを見てみると、ワンスタールートはチートと判定されないギリギリをついていることが分かる。

ちょっと面白いところは、この条件が有効なのは『レースをスタートしてから、”ペンギン”がゴールするまで』というところだ。

例えば、ペンギンのゴールを待つ過程で、うまく壁キックなどして2秒以上空中にいた場合、スライダーをショートカットしていないにも関わらずチート判定となってしまうのである。

[通常ルート編] どうやればスタータイムが速くなる?

ペンギンを速くゴールさせるためには?

まずは以下の比較動画を見てほしい。

この動画は、左がペンギンの速度を調整したもの、右が何も考えずに滑ったものとなっている。

最後のトンネル前のコインを見てみると、右のほうが0.26秒(52.20 – 51.93)速いことが分かる。

ccm100race_1 ccm100race_2

しかし、ペンギンのゴールは右のほうが1.76秒(63.83 – 62.06)遅く、これがそのまま最終的なスタータイム差になっているのだ。(左のスタータイムは77.00秒、右のスタータイムは78.76秒)

ccm100race_3 ccm100race_4

こんな感じで、このスターでは、最後にペンギンからスターをもらう都合上、ペンギンのゴールタイムを速くする必要がある。そして、ペンギンのゴールタイムを速くするための一番重要なポイントは『PT=35以降の仕様』にある。

おさらいすると、この仕様は、「ペンギンがPT=35を越えたら、ペンギンの速度が0.4ずつ落ちていき最終的に60で速度が固定になるよ」という仕様である。

両者のPT=35のペンギンの速度を確認してみよう。左が127.49、右が95.36なのが分かる。

ccm100race_5 ccm100race_8

そしてここからコマ送りで見ていくと0.4ずつペンギンの速度が落ちていることが分かる。

左: 127.49 → 127.09 → 126.69 → …

ccm100race_5 ccm100race_6 ccm100race_7

右: 95.36 → 94.96 → 94.56 → …

ccm100race_8 ccm100race_9 ccm100race_10

最終的に速度が最低値60になるのは、レースタイマー(右下)で左が26.76、右が23.60だった。

以降は両者とも速度60で固定となり、速度60になっている時間は以下である。

左: 30.53 – 26.76 = 3.76
右: 32.30 – 23.60 = 8.70

上記から、右のほうが左と比べて長い間速度60の状態が続くことが分かり、これが右がタイムの遅い理由となる。

言い換えると、PT=35のペンギンの速度が高いと速いタイムが出るようになるとも言える。

(スライダーの最適化やペンギンの軌道もタイムに影響するので、PT=35の速度に完全比例してタイムが速くなるわけではない)

PT=35のペンギンの速度はいくつが最大?

ペンギンの速度の最大値は150なので、理論上はPT=35で150になっているのが望ましい。

しかし、このルートの場合、PT=19~25のあたりでペンギンがマリオに一度追いつくため、Y座標差が大きくなる前にPT=35にペンギンが到着してしまい、速度150は出すことができない。

実際試したところでは128前半が限界だと考えられる。(120枚TASは127台 / PlushのTASは128台)

※ 128台はまぐれで出るレベルなので、実際は127台が上限だと思って良い。

ということで、現実的な『ペンギンのゴールを速くする方法』としては、ペンギンがPT=35に到達した時点で、ペンギンの速度が128に近くなるように調整するのがベストということになる。

実践編

以上の考察から、PlushのTAS, 120枚TASなども参考にしつつ、『人間が安定して速いタイムを出せる方法』を考えた。

以下の動画を用いて、ペンギンの話しかけパートから説明しよう。

ペンギン話しかけパート

話しかけまでのアプローチは2種類ある。

  • ジャンプダイブ
  • スライディング

ジャンプダイブのほうが1フレーム速いが、話しかける位置がスライディングと比べて遠い位置となる。

ということは、ジャンプダイブのほうがペンギンを抜くまでに時間がかかる=ペンギンが速くなるまでにロスることになるので、1フレーム犠牲にしてスライディングを使うという発想も出てくる。

実際に試してみたところ、スライディングのほうがゲーム内タイムも数フレーム速いし、ペンギンを追い抜くのが速くなる分ペンギンが速く加速し始めることも分かった。また、正面ではなく左斜め向きにスライディングするとより速くなるようだ。

これだけで見ると『斜めスライディング』を選択するのが良いと考えられるのだが……。

実は、最初~5枚コイン列まで速く滑りすぎると、ペンギンの速度がつきすぎてUカーブ時点で十分に減速されなくなり、結果としてPT=35で速度が低い状態になってしまうのだ。(Uカーブは以下の画像の場所のこと)

ccm100race_11

スライディングを使ってそこそこ上手く滑った場合にこの『速すぎ現象』が起こるので、並々のマリオ64プレイヤーならスライディングは良くないと思われる。

ということで、私のオススメは『正面(真上)ジャンプダイブで並々の最適化で滑る方法』である。ジャンプダイブの場合でも最適化しすぎると『速すぎ現象』が起こるので、「余裕をもってコインを取る」ぐらいの最適化で十分である。

しかし、このオススメは練習中に試した場合の話なので、実際の120枚RTAなどの通しでかなり安定目に滑る人は『正面スライディング』を使ったほうがちょうど良い可能性がある。

なお、ペンギンの速度を上げすぎないためにわざとロスらせて滑るという発想もあるが、単純にゲーム内タイムが遅くなるので望ましくない。

アーチ状コインパート[重要パート]

このパートは注意点が2つある。ペンギンの速度に大きく影響するパートなので、どちらも意識してやったほうが良い。

基本的にこのパートで攻められているほど速いタイムが出やすい。しかし、攻めすぎる(最適化しすぎる)とペンギンが加速しすぎて調整に失敗するので注意。

(1) Y座標の仕様を考慮し最小ジャンプにすること

ここでの最小ジャンプはAボタンを4フレーム押すジャンプとなっている。

ccm100race_12

(2) スライダー着地後の動きを考慮し、左から右に行くようにジャンプして、真ん中~右目で着地すること

ここのジャンプの仕方だけで単純に0.2~0.3秒以上は差が出る。

ccm100race_13 ccm100race_14 ccm100race_14

5枚コイン列パート

ペンギンの最大速度は150と話したが、スタート~5枚コイン列までの区間では150に達することはなく、徐々に加速したり、アーチコインのところで減速したりする。

こういった速度変化を含めると、最良のロスらせ場所が『5枚コイン列』となる。

ここでのポイントは『ロスらせすぎてペンギンに抜かれてはいけない』ということ。

ペンギンに抜かれる=Y座標差が100以下になるので、再度Y座標差を100以上稼ぐまでに時間がかかってしまい、結果、ペンギンのゴールが遅くなるからだ。

以上から、120枚RTAで安定して使えることを念頭に置くと、『安定して抜かれない範囲でタイムロスさせる方法』を考えたほうが良いという結論に至った。この考えを元に、5枚コイン列あたりで『大回り』『失速』『壁に衝突』など試し、以下の方法を得た。

(1) 抜け道前の5枚コイン列に到着

ccm100race_15

(2) 5枚コイン列の1枚目の前ぐらいからスティック無入力

ccm100race_16

(3) 5枚コイン列の4枚目あたりでスティック真左

ccm100race_17

(4) 以降は普段と同じ

ccm100race_18

スライダーで最適化しまくるなら、(3)で5枚目あたりでスティック真左でも良いが、ペンギンに抜かれる可能性が出てくるので危険だと思う。

なお、この方法を使ってペンギンに抜かれなかったとしても、5枚コイン列までが速すぎると速度調整に失敗するので注意してほしい。(つまり、ここのパートの調整だけがうまくできれば良いというわけではない)

ちなみに、ペンギンの速度を見て調整がうまくいったかどうか判断したい場合は、『Uカーブのコイン1枚目のペンギンの速度』をみれば良い。

以下のグラフは

  • 縦軸: PT=35でのペンギンの速度
  • 横軸: Uカーブのコイン1枚目でのペンギンの速度

となっているが、多少の誤差はあるので傾向だけを見てほしい。

ccm100race_graph_red

グラフから分かること:

  • Uカーブの1枚目でペンギンの速度が90.4以上だとガクっと速度が落ちる。(つまり序盤で最適化しすぎているのでもう少しゆっくり滑らないといけない)
  • Uカーブの1枚目でペンギンの速度が89~90.3だと127,128が出やすい。一番速い。
  • Uカーブの1枚目でペンギンの速度が83~88あたりでも125以上は出る。

以上から『ペンギンが速すぎるパターンは絶対避けなければならない』ということが分かるだろう。サンプルを変えても同じような傾向が出るので信ぴょう性は高いと考えている。

Uカーブのパート

このパートでは、より速く15枚コイン列まで進めるようにインコースを突いて曲がるのが良い

ただし、インコースを攻めすぎるとUカーブ後の動きでタイムロスするので、後半2枚の手前で左からキレイに右に行くような導線がベストらしい。

ccm100race_19 ccm100race_20

速度調整がうまくいったかどうかの目印

Uカーブの後にある15枚コイン列を取り終えた後まで来ると、速度調整がうまくいったかどうかペンギンを見て判断することができる。

うまくいけたと思ったのに失敗パターンになってしまった場合は、序盤(レース開始~5枚コイン列)までが速すぎるのが大抵の原因なので、もう少し攻めずに滑ったほうが良い。

■ 79(80)枚目あたりでペンギンが画面に映ったら成功

ccm100race_21

■ 最後のカーブ(長いコイン列を終えた後)でペンギンが画面に映ったら失敗

ccm100race_22

■ 15枚コイン列以降でペンギンが一度も画面に映らなかったら失敗

ccm100race_23 ccm100race_24

■ 15枚コイン列でペンギンが後ろにいたら失敗

ccm100race_25

ペンギンがゴールした後のパート

通常ルートの場合、最後話しかけられるまでの差は1フレーム(161~162)しか確認できなかった。PT=35の時点でペンギンの速度が高くならないため差が出にくいのだろうか。

どちらにしても実質運ゲーなので、RTAでは気にする必要はないと思う。

[atmpas specialルート編] どうやればスタータイムが速くなる?

ペンギンを速くゴールさせるためには?

atmpas specialルートでは、通常ルートと違いペンギンに追い付かれるシーンがない。

なので、速く滑れば滑るほどその分スタータイムが速くなることになるし、ショートカット以降はある程度最適化をして滑ることさえできればペンギンのタイムは常に一定となる。

目安としては、PT=35後、Effortが700になる時点まで座標差を800以上に維持できていれば良い。

逆に言えば、ショートカット前までの動きでペンギンのゴールタイム等が確定するので、ショートカット前のパートの最適化を知っておく必要があるわけだ。

この後のセクションで速く滑るためのポイントを語るが、執筆時点の人間ベストを比較したものを以下に書いておく。

  • スライダー外部 : [通常]21.56 / [atmpas sp]26.13 (+4.56秒)
  • スライダー内部(JP): [通常]55.00 / [atmpas sp]49.70 (-5.30秒)
  • 通常ルートとatmpas specialルートの差: 0.73秒

実践編

ペンギン話しかけパート

話しかけまでのアプローチは2種類ある。

  • ジャンプダイブ
  • スライディング

先で話したが、単純にタイムを求めるなら左斜めスライディングがベストである。

このルートの場合、ズルしてスタートするという発想も出てくるが、最初話しかけるまでのロス分を回収できないので、普通に話しかけるのがベストだと思われる。

アーチ状コインパート[最重要パート]

通常ルートの時と同じで、このパートは注意点が2つある。ペンギンの速度に大きく影響するパートなので、どちらも意識してやったほうが良い。

■ Y座標の仕様を考慮し最小ジャンプにすること

ここでの最小ジャンプはAボタンを4フレーム押すジャンプとなっている。

ccm100race_12

■ スライダー着地後の動きを考慮し、左から右に行くようにジャンプして、真ん中~右目で着地すること

ここのジャンプの仕方だけで0.2~0.3秒以上は差が出る。

ccm100race_13 ccm100race_14 ccm100race_14

ショートカット後~ペンギンゴールまで

atmpas specialルートでは、ショートカットよりちょっと前にSpeed Targetが150(MAX)に達し、以降はずっと150のままでPT=35に突入する。

理想を言うのであれば、PT=35あたりで追い付かれていると2,3フレーム速く減速が始まるので、速く滑ったほうが良い。(通常ルートで紹介したような最適化をやったほうが良い)

しかし、このルートにおける一番の問題は『最速で2枚目スターを取得できるか』なので、現実的にはこちらを意識したほうが良い。

ccm100race_26 ccm100race_27

ペンギンがゴールした後のパート

atmpas specialルートの場合、最後話しかけられるまでの差は確認できた範囲で7フレーム(0.23秒)もあった。(155~162)

このルートの場合は、PT=35の時点でペンギンの速度が150なので『ペンギンの角度』が大きく変わるのかもしれない。

しかし、ずっと話してきているようにこのパートは実質運ゲーなので、RTAでは気にする必要はないと思う。

[練習時] スライダー内部タイムの目安

★通常ルート(JP)

  • 理想タイム: 1:17.00x with 54.93内部
  • PlushのTAS: 54.83内部
  • 現状のultimate sheetベスト: 1:18.16x with 55.93内部/55.70内部
  • 新しいやり方で安定して55.5内部は切れるはず

★atmpas special(JP)

  • 理想タイム: 1:16.00x with 49.56内部
  • 現状のultimate sheetベスト: 1:17.23x with 50.06内部
  • 新しいやり方で安定して50.0内部は切れるはず

★100レースにおけるタイム変換: JP = US + 0.30

★理想タイムの動画

[番外編] atmpas specialルートの面白いところ

このルートでは、途中で一気にスライダーをショートカットする。

ショートカットの間はマリオが空中にいることになるので、チートと判定されてもおかしくないはずだ。

気になったので、何フレームの間空中にいるのか調べてみた。

結果は以下。両者とも60(2秒)を下回っているので、チートと判定されていないことが分かった。

  • アーチコインジャンプ: 30
  • ショートカット : 47

ccm100race_28 ccm100race_29