
Для многих игроков посадка на авианосец в классической Top Gun для NES стала настоящим камнем преткновения. Если вы так и не смогли освоить этот маневр в детстве, у меня есть хорошие новости: я провел реверс-инжиниринг кода игры и выяснил точные алгоритмы, отвечающие за успешное приземление. Теперь ваши вылеты всегда будут заканчиваться триумфально.
Коротко о главном (TL;DR): чтобы зацепиться за трос, высота (Altitude) должна быть в пределах от 100 до 299, скорость (Speed) — от 238 до 337 включительно, а нос самолета в финальной фазе должен быть точно ориентирован по центру палубы.
Для тех, кто забыл или не играл: финальный этап каждого уровня в Top Gun выглядит следующим образом:

Игра дает прямую подсказку на многофункциональном дисплее: «Alt. 200 / Speed 288». Это идеальные медианные значения. Высота и скорость регулируются углом тангажа и положением дросселя. Индикатора рыскания (отклонения влево/вправо) на приборной панели нет, но игра предупреждает о критическом смещении голосовыми командами (например, «Right! Right!»). Диапазоны допустимой скорости и угла атаки довольно узкие, поэтому на них стоит сосредоточиться в первую очередь — допуски по высоте значительно лояльнее.
Примерно через минуту после начала снижения система проверяет текущие параметры и запускает катсцену: либо вы изящно садитесь, либо устраиваете эффектную катастрофу. Примечательно, что даже после крушения вы увидите надпись «Mission Accomplished!» и перейдете на следующий уровень — судя по всему, командование не слишком переживает о потере дорогостоящего истребителя за счет налогоплательщиков.

Технические подробности для любознательных
Ниже представлены ключевые адреса в оперативной памяти:
| Адрес | Описание данных | Допустимый диапазон |
|---|---|---|
| $40-$41 | Скорость (в формате BCD) | 238 – 337 |
| $3D-$3E | Высота (в формате BCD) | 100 – 299 |
| $FD | Рыскание (от -32 до +32) | 0 – 7 |
| $9E | Флаг результата посадки | 0 — успех; прочее — тип аварии |
Использование двоично-десятичного кода (BCD) обусловлено упрощением вывода цифр на экран. Например, значение 1234 хранится в памяти как шестнадцатеричное 0x1234 (или десятичное 4660).
Логика проверки реализована в функции по адресу $B6EA. Если вы не хотите тратить время на тренировки, но желаете удивить знакомых мастерством, воспользуйтесь кодом Game Genie AEPETA — он гарантирует мягкую посадку при любых условиях.
Дизассемблированный фрагмент кода с комментариями:
landing_skill_check:
06:B6EA: LDA $3E ; Читаем сотни высоты
06:B6EC: BEQ $B724 ; Ошибка, если высота < 100
06:B6EE: CMP #$03
06:B6F0: BCS $B720 ; Ошибка, если высота >= 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, идем на детальную проверку
speed_300s:
06:B6FE: LDA $40 ; Читаем десятки и единицы скорости
06:B700: CMP #$38
06:B702: BCS $B720 ; Ошибка, если скорость >= 338
06:B704: BCC $B70C ; Скорость в норме (300-337)
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 ; Слишком сильно вправо
06:B714: LDX #$00 ; Параметры идеальны, X=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
Теперь, вооружившись знаниями о работе движка, самое время вернуться в кабину F-14 и доказать, что вы достойны звания лучшего пилота!



