カトちゃんケンちゃん(PCE) TAS

とりあえず 07:44.10 のTASを作成 (TASVideos掲載ページ)。現在の 知識の範囲内では一応ベストを尽くしたつもり。

07:44.10 (mcmファイル)

テストラン 07:49.19 (mcmファイル)

テストランからの更新点:

区間短縮量(F)詳細
1-1-17ポテト取得、ノックバック*2、その他
清算+56体力調整
1-2-A+1着地硬直除去
1-2-B-4ノックバック*1, 着地硬直除去
清算+28体力調整
1-30
1-4-A+48ポテト回避、ハッシー処理最適化、その他
1-4-B+19ワープ処理最適化、その他
WARP+1xサブピクセル調整による着地硬直ロスの軽減
3-1-A+7着地硬直除去
3-1-B-5ノックバック*2, ハッシー処理最適化、その他
清算+28体力調整
3-2-A+1着地硬直除去
3-2-B-4ノックバック*1とそれに伴う減速、着地硬直除去
清算+49体力調整
3-3-A+5ハッシー処理最適化、着地硬直除去
3-3-B+15ワープ処理最適化、着地硬直除去
6-4-A+3着地硬直除去
6-4-B+57ハッシー処理最適化、鳥ジャンプ最適化、その他
BOSS+17ボスの後方に回らないようにしてボスのジャンプを遅らせた
+305

3-1でカレーを取ると3-3のハッシーをゴリ押し突破できますが、それでも17Fほど 遅くなってしまうようです(一応 3-3ハッシー直後まで進めたリプレイを置いておき ます)。3-1のハッシーもゴリ押しできれば逆転しそうですが、こちらはどうしてもそ の後の足場に着地できませんでした(ハッシーの出現をあと1F遅らせる方法があれば いけそうなのですが…)。

3-1ラストは、落ちてくる缶を踏んで右の横移動足場に乗ることができれば5Fほど 速くなりそうなのですが、どうしても缶を踏んだ後の着地がうまくいかないようです (3ピクセルほど足りない)。

3-2は体力調整が案外難しいです。鍾乳石*2の直後の落ちる足場からジャンプして 鳥→ヤクザで8ダメージ食らうこともできる(要yサブピクセル調整)のですが、これだ とゴールする前に体力が尽きるようです。最新TASでは後半の鳥*2のところで少し減 速を交えて8ダメージ食らっていますが、ここではどのみち減速が必要になるので、 おそらくこれが最適と思います(ノックバック2回で4ダメージ*2を食らう方法も試し ましたが、1F遅くなるようです)。

ボス戦についてはアルゴリズムをきちんと解析したわけではないのですが、どう も一度もジャンプさせないということはできないようなので、ボスの無敵時間の間隔 からしてこれがほぼ限界なのではないかと思います。

1-2, 3-2はゴール判定後青画面が表示されるまで1F余計にかかるパターンになっ てしまっており、色々試しましたが修正できませんでした。これについてはきちんと 原因を調べる必要がありそうです。

プログラム解析はほとんど手付かずに近いので、深く解析すれば新テクニックな どが見つかるかも。ワープルートに関しては多分これ以外にはないと思いますが、 100%の確信はなし。

ワープなしverも見たいところですが、相当時間がかかると思われるので自分は作 れるかどうか微妙です^^;また、加藤verは志村に比べてサブピクセル調整や着地硬直 回避が難しいので、ワープありでもかなり苦労しそうです。

各種調査

加藤の方はあまりきちんと調べてないので不十分な点があるかも。

キャラ特性

キャラ x最高速度 x加速 x自然減速 小ジャンプ初速 中ジャンプ初速 大ジャンプ初速 重力
加藤8842-49-58-653
志村9631-56-65-724

志村は加速、自然減速が小さいのでブレーキ時に大きく滑ります。ジャンプ高度/ 飛距離は加藤の方が上。

TAS的には志村の方が有利ですが、一部加藤でないと飛び越せないところがありま す(1-2の隠し足場のある大穴や、6-4後半のファイアハッシーなど)。

水平移動

画面スクロールオフセット $2B3B と、画面内での自機x座標 $2B16 の和が自機の マップ内x座標となります(2つの値はx座標が正しくなるように互いに整合性が保たれ る)。画面内x座標は右キーを押しっぱなしにしていると 79 に固定されますが、右キー を離すとそれより大きい値にすることもできます(厳密な法則は未調査)。

現フレームでのx移動距離は $2B22(ピクセル), $2B23(サブピクセル) で管理され ており、$2B22 の値がマップ内自機x座標に加えられます。前フレームの $2B23 の値 と現フレームの自機の速度の和をとり、32で割った商が $2B22, 余りが $2B23 とな ります。ただし、壁に当たる場合は $2B22 が壁にめり込まないように修正されます。

自機のx速度は $2B24 で管理されています。1Fごとに、左右キーを入力していれ ばその方向にキャラ固有の加速値が、入力していなければ0に近づく方向にキャラ固 有の自然減速値が加えられます。ただし、絶対値はキャラ固有の最高速度を超えるこ とはありません。なお、速度計算は移動距離計算より先に行われます。また、壁に当 たっても速度には影響しません(壁に当たったまま速度を増していくこともできる)。

少々わかりにくいので計算式をまとめてみます:

  $2B24 += accel();     // 前述の通りに速度を変化させる。例えば志村で右を入力していたら3を加える
  $2B23 += $2B24;       // サブピクセルに速度を加える
  $2B22 = $2B23 / 32;   // それを32で割った商がピクセルとなる
  $2B23 %= 32;          // 余りがサブピクセルとなる

志村の場合、最高速度が96なので、そこに達してしまえば移動距離ピクセルは常 に3で、サブピクセルは変化しません。加藤の場合、最高速度が88なので、最高速で も4Fに1回移動距離ピクセルが2になります。

サブピクセル $2B23 は速度のみに依存し、面クリア以外ではリセットされません (立ち止まったり、エレベーターに乗ったり、ジャンプ台でワープしたりしても値が 維持される)。このため、ピクセル $2B22 を変化させることなくサブピクセルを調整 しておくことで、後々の移動をわずかに調整できます。例えば、志村なら最高速の状 態から右キーを1F離してまた押せばサブピクセルを1減らせます。

サブピクセルに余裕があれば、一瞬振り返って物を蹴ったりしても移動距離が変 化せずに済みます。

横移動足場の上では毎フレーム自機が1ピクセル追加で動きます。

垂直移動

自機のy座標は $2B18 (16bit, リトルエンディアン)で管理されています。

現フレームでのy移動距離は $2B21(ピクセル), $2B20(サブピクセル)で管理され ており、$2B21 の値がy座標に加えられます。前フレームの $2B20 の値と現フレーム の自機の速度の和をとり、8で割った商が $2B21, 余りが $2B20 となります。

自機のy速度は $2B1F で管理されており、キャラ固有の重力加速度 $2B32 が毎フ レーム加えられます。ただし着地した状態では0になります。なお、速度計算は移動 距離計算より先に行われます。

計算式まとめ:

  $2B1F += $2B32;       // 速度にキャラ固有の重力加速度を加える
  $2B20 += $2B1F;       // サブピクセルに速度を加える
  $2B21 = $2B20 / 8;    // それを8で割った商がピクセルとなる
  $2B20 %= 8;           // 余りがサブピクセルとなる

yサブピクセルはxサブピクセルに比べて調整が面倒(着地硬直が絡むため)ですが、 動く足場/落ちる足場を利用すると比較的容易に調整できます。なお、yサブピクセル もxサブピクセル同様、面クリア以外ではリセットされません。

ジャンプ

ジャンプ高度は3種類あり、ジャンプボタンを押す瞬間の自機の水平方向の速度に より以下のように変化します(志村、加藤共通):

ただし、上成分+ジャンプボタン、または蹴りボタン+ジャンプボタンを入力した 場合は無条件に大ジャンプとなります。

中ジャンプ、小ジャンプをうまく使うと短縮になるケースもあります。

着地硬直

着地時にy座標が地面のy座標を一時的に超える場合、1Fの硬直($2B22 が0になり、 水平移動が停止する)が発生します(1Fの間「地面に埋まった」と考えるとわかりやす いかも)。ただし、足場の右端に乗り出すように着地した場合は発生しません。また、 敵/動く足場/落ちる足場に乗る際にも発生しません。

着地硬直が起こると1F分移動が遅れてしまうので、可能な限り回避したいところ です。回避する方法は

といったところですが、どうしても避けられないケースもあります。

志村の場合、同じ高さに小/大ジャンプしたときは着地硬直が発生しません。加藤 の場合は同じ高さへの大ジャンプでも硬直が発生します。

蹴り

蹴りは一度当たるとそれ以降は判定が消えます。ただし、一度に複数の対象に当 てることはできます。

蹴りは自機の座標には影響しません。

しゃがみ/屁

しゃがむと当たり判定が若干低くなるので、ネズミや缶などをきわどいところで 避けられることもあります。

しゃがんだ時点から1Fごとにカウンタ $2B27 がインクリメントされ(「屁タイ マー」と呼称する)、この値が20になると屁が発射されます。なお、しゃがむたびに 屁タイマーは0にリセットされるので、事前にタイマーを進めておくことはできない ようです。

ポテトを取るたびに屁の射程($2B28)が1増えます。TAS的にはポテトは1つで事足 りると思います。

なお、屁の速度は2ピクセル/Fのようです。

ノックバック

ノックバックの向きは、ダメージを食らう瞬間の自機の向きに依存します。ノッ クバック時はx速度の絶対値が40に, y速度が-24に修正されます(移動ピクセル/サブ ピクセルはそのまま)。このゲームは滑りやすいので、素早く方向転換したい場合は ノックバックを利用する方がよい場合があります(と書きましたが、1-4のワープは普 通に減速した方が速いです^^;)。

ノックバックが発生すると自機点滅タイマー $2B1D が60になり、以降1Fごとにデ クリメントされます。$2B1D が15以上の間は無敵となるようです。また、食らい無敵 が解ける瞬間に再度ダメージを食らうとノックバックが発生しないようです。

志村の場合、着地状態でノックバックすれば着地硬直は発生しません。また、ノッ クバック1回につき約5Fのロスとなります(xサブピクセルを31にしておき、ノックバッ クの瞬間に左を向いた場合)。

体力

初期体力は10で、カレーを取ると最大値が2増えます。

2Fごとにカウンタ $2B25 がデクリメントされ(「体力減少タイマー」と呼称する)、 0になると体力が1減ります。体力減少タイマーは面クリアまたは体力の増減時(ポテ ト以外の食べ物を取る、ダメージを食らう)に 0xFF にリセットされます。エレベー ター、ワープではリセットされません。

なお、ボス戦では体力の自然減少は発生しません。

オブジェクト生成(缶、アイテムなど)

相方や敵が缶を投げたり、蹴りによってアイテムを出現させると、オブジェクト 生成カウンタ $2213 がインクリメントされます。このカウンタは次のオブジェクト 生成に影響を与えます。

相方の投げる缶の軌道は $2213 に依存しているようです。

アイテムの出る向きは、$2213 とフレーム数(偶数か奇数か)に依存しているよう です。ただしウンコについては自機の位置に依存するようです。

このゲームは比較的 hex-editing に優しいですが、$2213 が変わったり、奇数フ レームのずれが生じるような編集を行うとまず同じ挙動にはならないと考えるべきで す。

ゴール判定

画面を最後までスクロールさせた状態で画面内x座標が 144 以上になるとゴール とみなされるようです。

ゴール判定が行われてから青画面が表示されるまでのフレーム数は1Fのブレがあ るようです。これについては今のところ原因も対処法も不明。ゴール手前で少し減速 したりすると1F短くなるケースもあるようですが…。

面クリア時の清算処理

体力が多いとその分清算処理に時間がかかります(体力1につき7Fのロス)。よって、 可能ならば瀕死で面クリアした方が速いです。

エレベーター

エレベーターは、自機が速度0の状態で上に乗っていると動き出します。

ボスの挙動

あまり詳しいことはわかっていませんが、基本的に、後ろに回ろうとするとすぐ にジャンプしてしまうようです(半分くらいまでめり込んだ時点で確定?)

OP処理

志村を使う場合、155FにRUN, 156FにSELECT, 157FにRUN, 164FにRUN, として、 294Fから入力受付開始となります。

雑多なこと

メーカーロゴは多分飛ばせないと思います。

ラグカウンタを見る限り、基本的にラグは発生しないようです。

frame ruleの類は多分存在しないと思います(1F短縮すればその後もずっと1F速い ままということ)。ただ、鳥が画面外に出てから再出現するタイミングに関しては frame rule のようなものが存在するかも。

左右同時押しは左が、上下同時押しは上が優先されます。また、下+ジャンプは単 にしゃがむだけです。

敵を蹴ると1Fだけ魚のグラフィックが表示されます。

各ワールドの4面でゴールラインを通過し、ボス戦の音楽が流れ始めた後に死ぬと、 そのまま画面停止してハマります(音楽は鳴りっぱなし)。

テクニック

文章だけ読んでもわかりにくいと思うので、メモリを見つつ読んでもらえれば。

着地硬直を利用したxサブピクセル調整

着地硬直が避けられない場合、硬直フレームではxピクセルが0になるので、この フレームを利用してxサブピクセルを調整することができます。例えば、志村でxサブ ピクセル0, x速度96の状態で着地硬直する場合、硬直フレームで右キーを離せばxサ ブピクセルを31まで回復できます。

着地硬直によるロスの軽減

ワープ直後など、着地硬直フレームで自機が最高速度に到達していない場合は、 事前にxサブピクセルを調整しておくことで着地硬直によるロスを1ピクセル減らせる ことがあります。最新のTASでは、1-4からワープゾーンに移動する際にこのテクニッ クを使用し、ワープゾーンを1F短縮しています。

開幕空中ジャンプ

面開始1Fのみ空中ジャンプが可能です(ワープ直後は不可)。志村の場合、面開始 直後は必ず着地硬直が発生し、右押しっぱなしで普通に着地すると1ピクセル、開幕 空中大ジャンプだと3ピクセルのロスとなります。これだけ見ると空中ジャンプは損 なのですが、開幕空中大ジャンプを行うとyサブピクセルが4になるため、これによっ てその後の着地硬直を回避できるならば、差し引き1ピクセル得になります。ワープ ありだとこの技は出番がない(最新TASでは1-1で行っているが、ポテトを取っている 関係で結果的に損得なし)ですが、ワープなしならば使える面があるかも。

スクロール調整

画面内x座標を増加させてスクロールを一時的に抑制すると、敵の出現タイミング を微妙に変化させることができるようです。テストランの時点から6-4-Aのハエジャ ンプ地帯ではこれを利用しています。

まだ画面内x座標とスクロールオフセットの関係について厳密に調べてはいないの で、もしかするとこの技で短縮可能なところがまだあるかもしれません。

エレベーターの乗り降り

乗り方は、ギリギリで大ジャンプして限界まで右押しっぱなし→全力で減速、と するのが最速だと思います(事前にサブピクセルを調整したり、減速し始めは自然減 速にするなど微調整の余地はありますが)。中ジャンプを使う方法も試しましたが、 中ジャンプのための減速によるロスの方が大きいようです(小ジャンプは言わずもが な)。当然ながら、可能ならばxサブピクセル調整を行うべきです。

降りる際は、志村ならばyサブピクセルを4未満にしておいて中ジャンプすれば硬 直なしで降りられます。というわけで、エレベーターに乗る前はyサブピクセルも調 整しておく必要があります。

壁めり込み

このゲームは「天井にぶつかる」という概念がないようで、ブロックの下からジャ ンプすると普通にすり抜けます。たとえば、6-4ラストの落ちる足場3連続のところは、 最後の落ちる足場に乗ったまま隣の床下に潜り込んでジャンプすることで下から地面 にめり込むことができます:

床下から地面にめり込む図

この状態からジャンプすればブロックの上に抜けられます。

ワープありの場合、6-4ではどのみち鳥を待たなければならないので、これを行っ ても短縮にはならないと思いますが、ワープなしならば使えるかも。

資料

mednafen-rr メモも参照。

関連リンク


Back