
2025/12/15 23:16
Carrier Landing in Top Gun for the NES
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary
ドキュメントは、ビデオゲームがプレイヤーの着陸が成功したかどうかを確認する方法について説明しています。着陸が成功するのは、シーケンス終了時に以下の3つの条件がすべて満たされたときだけです。
- 高度 – BCDで
に格納され、100 から 299(含む)の範囲である必要があります。$3D–$3E - 速度 – BCDで
に格納され、238 から 337(含む)の範囲である必要があります。$40–$41 - 進路 – 符号付きバイトとして
に格納されます(-32 → +32 の範囲)。0‑7 のみが許容値です。$FD
チェックルーチンはアドレス
$B6EA にあります。このルーチンは CMP #$04(高速ビット ≥ 4、すなわち 400 以上)や CMP #$38(低バイト ≥ 0x38、すなわち 338 以上)などの命令を使って BCD 値を比較します。条件が一つでも失敗すると、ルーチンは $9E に特定の失敗コードを書き込みます:
→ 8(“過度に高速または高度が高い”) – 高度が範囲外の場合LDX #$08
→ 4(“遅すぎるまたは低速”) – 速度が範囲外の場合LDX #$04
またはLDX #$02
→ 2/4 は進路が 0‑7 の範囲外の場合LDX #$04
約1分間のフライト後、ゲームはカットシーンをトリガーし、着陸が成功したかどうかに関係なく「Mission Accomplished!」で終了します。Game Genie チートコード(
AEPETA)を使用すると、これらすべてのチェックをバイパスして強制的に着陸を成功させることができます。本文
“Danger Zone”をループ再生しながら読むのがベスト
多くの人と同じように、NES版 Top Gun で航空母艦に着陸することは絶対的な専門技術かもしれません。しかし、まだこのスキルをマスターしていない少数派に属しているなら朗報です。私はちょっと逆解析を行い、着陸が正確にどう機能するのかを突き止めました。これで次回の練習セッションで本当に狙い通りにできるはずです。風車ハイファイブを温めましょう!
TL;DR:
- 高度は 100〜299(含む)
- スピードは 238〜337(含む)
- シーケンスの最後で横方向に航空母艦を狙っている必要がある
簡単なリマインダー
数十年ぶりに Top Gun をプレイしたことがないなら、ステージの着陸部分は次のようになります。
画面上の MFD に「Alt. 200 / Speed 288」というテキストが表示されるので、その中央を狙うと良いでしょう。高度と速度はスロットル入力とピッチ角で制御されます。オンスクリーンにヘディングインジケーターはありませんが、ゲームは許容範囲外かどうかを「Right ! Right !」という音声で教えてくれます。速度とヘディングの許容範囲はかなり狭いので、これらに集中してください:高度の範囲はそれよりずっと広いです。
約 1 分間飛行した後、ゲームがあなたの状態をチェックし、テキストベースの着陸か高価なファイヤーボールかを示す小さなカットシーンが再生されます。どちらにせよ「Mission Accomplished!」と表示され、次のレベルへ進みます(結局、その飛行機はあなたのものではなく、税金納付者のものですから)。
ちょっとテクノロジー好きな人向け
注目すべきメモリ位置
| アドレス | 内容 | 許容範囲(含む) |
|---|---|---|
| $40–$41 | スピード(BCDで格納) | 238 – 337 |
| $3D–$3E | 高度(BCDで格納) | 100 – 299 |
| $FD | ヘディング、-32〜+32 | 0 – 7 |
| $9E | 着陸状態チェック結果 | 0; 他の値はクラッシュカットシーン中に飛行機の軌道を変更 |
スピードと高度はバイナリ符号付き十進数(BCD)で格納されており、画面上テキストの描画を簡素化するためと思われます。例えば 1234 は 4660(16 進 0x1234)として保存されます。
$B6EA の関数が状態チェックを行い、その結果を $9E に書き込みます。友達に自慢したいだけで練習時間を割く気がないなら、Game Genie コード AEPETA を使えばマーベリックとグース(スプライヤー:安らかに眠れ)が誇れる着陸を保証できます。
アノテーション付きディスアセンブル
landing_skill_check: 06:B6EA: LDA $3E ; 高度の上位十進数をロード 06:B6EC: BEQ $B724 ; 上位が 0(高度 < 100)なら分岐 06:B6EE: CMP #$03 06:B6F0: BCS $B720 ; 上位 >= 3(高度 >= 300)なら分岐 06%B6F2: LDA $41 ; スピードの上位十進数をロード 06:B6F4: CMP #$04 06:B6F6: BCS $B720 ; スピード >= 400 なら分岐 06:B6F8: CMP #$02 06:B6FA: BCC $B724 ; スピード < 200 なら分岐 06:B6FC: BEQ $B706 ; スピードが 200〜299 の場合 speed_300s: 06:B6FE: LDA $40 ; スピードの下位十進数をロード 06:B700: CMP #$38 06:B702: BCS $B720 ; 下位 >= 38(スピード >= 338)なら分岐 06:B704: BCC $B70C ; 下位 < 338 なら分岐 speed_200s: 06:B706: LDA $40 06:B708: CMP #$38 06:B70A: BCC $B724 ; 下位 < 238 なら分岐 speed_ok: 06:B70C: LDA $FD ; ヘディングをロード 06:B70E: BMI $B718 ; ヘディングが負(左に偏りすぎ)なら分岐 06:B710: CMP #$08 06:B712: BCS $B71C ; ヘディング >= 8(右に偏りすぎ)なら分岐 06:B714: LDX #$00 ; スピードとヘディングがOK → 成功 (0) 06:B716: BEQ $B726 too_far_left: 06:B718: LDX #$02 06:B71A: BNE $B726 too_far_right: 06:B71C: LDX #$04 06:B71E: BNE $B726 too_fast_or_too_high: 06:B720: LDX #$08 06:B722: BNE $B726 too_slow_or_too_low: 06:B724: LDX #$04 return: 06:B726: STX $9E ; 結果を書き込み 06:B728: RTS
さあ、外に出て第三のワイヤーを手に入れましょう。
2025年12月14日