メモリを覗いてゲーム内タイムをチェックする

Terimakasih氏のメッセージを転載


別スレッドお借りしますね。

[必要なもの]
PCとSnesエミュレータ
リアルタイムメモリエディタ(DBxSTANDとか)
関数電卓(16進数を10進へ変えられれば何でも良いです)
暇人レベルの時間

[前提]
大切なのは「再生時間」ではなく「ゲーム内の計測時間」とします。
エンディングで出るクリアタイム優先ってことです。
部屋の移動中はゲーム内タイムは計測されないことを利用する。

[やり方]
コードサーチしてメトロイド内のゲーム時間を記録しているアドレスを見つけます。下記の通り。
7E09E0 - Hours
7E09DE - Minutes
7E09DC - Seconds
7E09DA - Frame Count
です。まぁ、秒とフレームがメインになります。

メトロイドの場合、前提の通り部屋移動中は時間が停止します。
最初に部屋へ入る時の部屋切替時間中に現在のゲームタイムを書きとめます。
次に、別の部屋への部屋切替中にタイムを控えます。
後は、この差を出せば、それがその部屋で掛かった時間です。
1フレームの誤差も無く計測出来ます。

部屋の任意の場所では駄目です。フレームなんて人間が認知出来る時間の単位じゃないですから、かなりの確率で誤差が出ます。
必ず時間の計測が止まっている状態で差を出すのがポイントです~。

リアルタイムメモリエディタが必要なのは、例えばSnes9xのチート機能だけですと、値を見るのが凄く大変だからです。
DBxSTAND等ですと、一度設定してしまえば楽に値を見られます。


[注意点]
大きく2点あります。

まず、何がタイムにどれだけ影響しているかは解明されていません。
その時の敵の数、弾の数、サムスの状態、アイテムの数etc
例えば最終ボスが良い例です。
体感的にはマーダービーム使用は早く感じるかもしれないですが、
実際には別の方法が7秒も早いコトは計測から明らかになったと思います。(ご存知ないかも?(汗))
「見た目」や「体感」は一番当てになりません。
尚、Snes9xで表示しているフレームカウント数(画像に映っている数字)も信用出来ません。
これは再生時間であり、ゲームクリアタイムとは全くの別物だからです。

もう一つ、直接の注意とは違いますが。。
この方法は、正確には部屋を出る時のサムスの状態が全く同じでなければ意味がないです。
歩いて部屋を出た時と、加速して出た時では、次の部屋で大きな差が出てしまいます。

つまり、「何が最も最速か」を誰かに納得させるならば、
『ドアからドアまでの間で計測し、かつ同じ状態でドアへ入っていること』という状態で計測した結果が必要です。

計算は面倒になりますが、他人のsmvと自分のsmvにて、比較することも可能です。
私がフレーム単位で「MFさんの方が1秒と24フレ早い」と言ったりしているのは、こうやって計測したものです。
間違いがあるとすれば、私の計算ミスってコトです。
「1F」とかは良いですが、「24」とかはつい10進数への変換を忘れて差を計算してしまったりしますから。。

リアルタイムメモリエディタの使用方法は省略しましたが、以上です。
特に(Emuでは)メトロイドはフレーム単位での正確な計測は必須スキルです。
LRダッシュが無かった頃、Jecyさんと私を比較して見ましたが、彼は私より正確で速かったです。
LRダッシュ抜きで彼のセレス脱出タイムを抜ける人は居ない気がします。



チート関連

特殊な条件で実験をしたい場合はチートを使った方が便利なので、少しずつチートに関する情報を集めたいと思います。

いろいろ使えそうなアドレス、snes9xのチート→チートサーチ(アクティブ)→マークするでウィンドウ上に表示できます
敵数関係
7E0E50 撃破数をカウント
7E0E4E 部屋内の敵の総数と特殊ブロック?
7E0E52 部屋内の敵の総数、特殊な部屋(セーブ、マップ部屋)だと前の部屋のままになる
ボム関係
7E0C86 ボム爆破までのカウントダウン
7E0CD2 ボムの個数、値を0にするとボムが何個でも置けるようになるが、当たり判定が無い時がある
ドア関連
7EDF52 赤ドアの打ち込み回数のカウント

NESVideosにあったアドレス

Address Parameters Meaning
7E0AF6 2 bytes, unsigned Horizontal position
サムスの水平座標
もう一つ区間のアドレスもある模様
7E0AF8 2 bytes, unsigned Horizontal sub-pixel position[1]

7E0AFA 2 bytes, unsigned Vertical position
サムスの垂直座標
もう一つ区間のアドレスもある模様
7E0AFC 2 bytes, unsigned Vertical sub-pixel position
7E0B00 1 byte, unsigned Vertical hitbox radius

7E0B42 1 byte, unsigned Horizontal speed[2], pixels
7E0B44 2 bytes, unsigned Horizontal speed, fraction of a pixel
7E0B46 1 byte, unsigned Horizontal momentum[3], pixels
7E0B48 2 bytes, unsigned Horizontal momentum, fraction of a pixel

7E0B2E 1 byte, unsigned Vertical speed, pixels
サムスの垂直移動(ジャンプ・落下等)の速度
7E0B2C 2 bytes, unsigned Vertical speed, fraction of a pixel

7E0B3F 1 byte, unsigned Speed boost level
7E0A68 1 byte, unsigned Shinespark charge timer

7E0DC2 1 byte, unsigned Beam charge counter
ビームのチャージカウントです
7E0CCC 1 byte, unsigned Weapon cooldown timer
ビームやミサイルの連射間隔のカウント

7E0BDC 2 bytes, signed Projectile 1 X speed, 1/256th pixels[5]
7E0BF0 2 bytes, signed Projectile 1 Y speed, 1/256th pixels
7E0B64 2 bytes, unsigned Projectile 1 X position, pixels
7E0B8C 2 bytes, unsigned Projectile 1 X position, fraction of a pixel
7E0B78 2 bytes, unsigned Projectile 1 Y position, pixels
7E0BA0 2 bytes, unsigned Projectile 1 Y position, fraction of a pixel
7E0BDC 2 bytes, unsigned Projectile 1 X speed, 1/256th pixels
7E0BB4 2 bytes, unsigned Projectile 1 X hitbox radius, pixels
7E0BC8 2 bytes, unsigned Projectile 1 Y hitbox radius, pixels

7E0C86 1 byte, unsigned 1st bomb timer
7E0C88 1 byte, unsigned 2nd bomb timer
7E0C8A 1 byte, unsigned 3rd bomb timer

7E0F8C 2 bytes, unsigned First Enemy's (Most Bosses) energy
7E0FCC 2 bytes, unsigned Second Enemy's (Mother Brain) energy
7E0F9C 1 byte, unsigned First Enemy's (Most Bosses) invincibility timer

7E1842 2 bytes, unsigned In-Game frame counter[4]
7E09DE 1 byte, unsigned In-Game Minutes
7E09DC 1 byte, unsigned In-Game Seconds
7E09DA 1 byte, unsigned In-Game Frames

[1]: Samus's position and speeds are tracked down to 1/65536th of a pixel, although the effective values are all multiples of 256, ±1.
[2]: Speeds and momentums are unsigned. Regardless of which direction Samus is moving, these are always positive.
[3]: Momentum and speed together determine how far Samus moves per frame. Momentum often must reach 0 before Samus can stop or turn around.
[4]: This value increments by 1 for each frame that counts toward the in-game timer, and wraps at 65536. Useful as a frame-counter when measuring by in-game time rather than absolute time.
[5]: Add 2 to the address to get the next projectile's data. Bombs count as projectiles 6-10. Super missiles use up two projectile slots, but the second projectile used can be ignored.