2016年12月8日木曜日

斜めに走るとはやいから - バニーホップしたがる人なんなの

Rogue 斜め移動問題
Rogue(としばしば、そのフォロワー達)はグリッドベースのマップを斜めに移動できる。わざとややこしい言い回しをすると、Rogueとはプレイヤーが選択できる行動を全て1:1にノーマライズしたターンベースゲームで、斜め移動は代表的な評価点が高いお得な行動の一つである。

一番上のgifを見てほしいのだけど、プレイアブルキャラクター(@)は右に隣接する杖アイテムを1ターンの移動で拾う事ができ、同様にローグルールでは右下の階段にも1ターンの移動で到達できる。しかしキャラクタと杖までの距離と、キャラクタと階段までの距離は等しくない。

縦横のグリッド移動パターン
斜めの移動パターン
とりあえずRogue斜め移動問題の答えを書いておくと、キャラクタと階段との距離は約1.414ユニットである。この差は大きい、市原仁奈と諸星きらりの身長ぐらい違う。Rogueというゲームは1ターン当たりの最大移動量が常に一定でなく、そのスケール幅は"になきら"ほどあるのだ。

になきら
90年代のFPSをプレイする上で極めて重要なテクニックの一つにストレイフラン(Strafe Run)というものがある。Strafeというのは辞書を引くと機銃掃射という意味の単語らしいのだが、id softwareがCatacomb 3DやWolfenstein 3Dにて押している間、左右の振り向きキーを左右の平行移動に切り替えるスイッチ機能の事をStrafeと呼んだので、もっぱらこの種のビデオゲームでは左右の平行移動、カニ歩きの事を指す言葉となっている。

Strafeという概念

とすると、ストレイフランとは左右に走る事だと考えるのが当然だと思うのだが、この場合は左右の平行移動を重ねて前進/後退する事を意味する…全くわけが分からないと思うが、平たく言うと斜めに移動する事をストレイフランと呼ぶのである。なんとなく察しがついているとは思うが、Wolfenstein 3DやDoomで正確なストレイフランを実行すると単純な前進/後退時より約1.414倍のスピードで移動ができる。RogueとDoomに共通する約1.414という数字は時空を超えたヘクサグラムの暗号や、になきらの尊さに基づいているわけではなく、このマジックナンバーは三平方の定理で簡単に説明できる。

Doomくんでもわかるストレイフラン

Doomくんは大変律儀な足をしているので前後左右のどの方向にも同一のスピードで動くことができ、更には前/後進(ラン)と左/右移動(ストレイフ)を重ねるとそれぞれの速度成分がふり向き角度に応じて合成される。

Doomに限らずこの現象は原始的な移動"コード"につきまとう潜在的なExploit(ゲームの抜け穴)で、ビデオゲームに没頭してきた我々は様々な局面で理論はともかく経験的にその効果を知っていた。どうそれを呼ぶかはともかく、スピードゲーミングでは基本的、代表的なアプローチであり、現実世界のウサイン・ボルトが世界記録を取るために後ろ向きや横向きに走ったりしないのと同様にDoomのトラックフィールドでは単にまっすぐ走ってはいけないのである。

Doom2 ストレイフラン効果測定
ストレイフランを実行した場合自分の発射したロケットに追いついく事が可能。


96年発売のQuakeはDoom(93年)時代のストレイフランを、明確に問題と認識して修正を施したゲームである。Quakeで前後左右に地面を走って得られる最大移動速度は320ユニット毎秒で、Doom式のストレイフランを実行すると瞬間的に約452u/s位まで加速するもののフレーム単位で実行されている速度チェック機構によって320u/sまで段階的(実時間にすると1秒にも満たない間)に減速がされる。

Quakeくんはよくわからない
Quakeくんは単に斜めに移動するだけでは1.414倍のスピードを維持できないが、この減速処理は、ある一意の角度に対する速度成分を後から数フレームかけてキャップしており、裏を返せば数フレームの猶予期間に角度を変化させる事で回避が可能だった。96-97年に発見されたストレイフランの代替テクニックはジグザグと呼ばれていて、これは常に振り向き角度を変化させつつ前進に左右移動を重ねる事で速く走るテクニックで、具体的には以下のような操作をする。


人力パターン あんまり上手くない

一見すると左右にフラフラ無駄な動きをしているが、これで普通に走るより1.2倍くらい速い。マウスを使わない場合は両手でキーをガチャりまくるので当然数多のキーボードが当時は犠牲となり、Assassin 3D(後のPanther XL、トラックボールとジョイスティックが合体した当時のFPS用コントローラ)なんかもジョイスティック側がすぐにお釈迦になった。Quakeとは破壊と狂気の時代だったのだ。


スクリプト最適化パターン フレーム単位で左右に震えている

98年の暮れにThresh擁するClan Death Rowは北米Quakeシーン最大最後の賞金大会と目されたPGL 98において他の参加チームを圧倒する形で優勝しNQを完全に平定した。当時のe-Sportsシーンは次期採用タイトルとしてQuake2とStarcraftがほぼ確定しており、有り体に言ってQuakeの役目が終わった瞬間だった…が話はそこから数か月前に遡る。史上最強Death Rowはスウェーデンの覇王Clan 9とホーム/アウェイ各5ラウンド、計10ラウンドのゲームを対戦し2:8という歴史的大敗北を喫していた。

この時のスウェーデン人達の動きは完全に狂っていた。彼らはQuakeをめちゃくちゃにしていた。壁に体をこすりつけて1.414倍のスピードで直進移動し、生身の跳躍では届かないはずのキャットウォークを軽々と向こう側へ飛び越えた。彼らはThresh達の知らないキャップされたスピードを解放する様々な手法を既に発見していたのだ。

なかでもサークルジャンプと呼ばれるテクニックはQuakeを新たな段階へと飛翔させた。これは減速処理が行われない空中で振り向き角度を変化させながらストレイフを重ねると、角度の変化量に応じて左右の速度が斜め方向に際限なく合成され続けるという不可思議な現象を利用している。

サークルジャンプの角度変化イメージ

上図のように減速が発生しない空中で振り向き角度を45度シフトさせるとストレイフラン(斜め移動)の理論値は100ユニット毎秒ほど速くなる。だがしかし、どう考えてもそれはおかしい、端的に言って狂っている、おかしいと思わない奴がおかしい。マジックナンバー1.414を超えるという事は、減速の発生しない空中で更に左右方向へ加速する必要があり、地面を蹴って宙に浮いた状態で速度コントロールができるという異常な前提がなくては成り立たない。しかしビデオゲームとはその異常な前提が当然の世界だったのだ。

バニーホップ(物理250毎秒)

バニーホップはサークルジャンプを応用したトリックで、幸か不幸かQuakeが黎明期e-Sportsの賞金レースフォーミュラとしての役目を終えた後にその効果が広く確認された。これは空中で角度を変化させて無限に斜め移動を加速させつつ、地面と接地した時に発生する減速処理(摩擦)を最短のジャンプ入力によって最小化させるQuake世界では極めて合理的な動きだった。言っている意味がよくわからないし、上図の通り見た目も超オッドなのだが、これもまた斜め移動の一つなのである。

Half-Life

Quakeの超変則斜め移動メソッドは、ValveがHalf-Lifeを制作するにあたってidからエンジンをライセンスした事で奇しくも引き継がれてしまった。物理学者ゴードン・フリーマン(遅刻)の通勤風景が上図のように常軌を逸しているのはそれが主たる原因である。バニーホップしたがる人なんなのと言えば、それは斜めに速く移動しようとするからで、なぜ速くなるかと言えば現実世界でさかさまにしたコップから水がこぼれていくというルールが存在するように、自然とそうなるものだからである。では、なぜ速くするかと言えば我慢ならないアイツやしっとりさせたい誰かに向かって我々は時にコップをひっくり返して冷水をかぶせてやるように、そうするべきだからである。

ugh