Spiiin's blog

Устройство игровых объектов Darkwing Duck и Chip & Dale [nes]

Решил разобрать последний из оставшихся крупных игровых элементов игр Capcom

Формат игровых объектов

После предыдущего разбора у меня были адреса хранения номеров загружаемых объектов в памяти - 05A4 - 05AF.

Точка остановки на запись по этому диапазону адресов показывает место, откуда загружаются характеристики объектов:

LDA (06), y. [cpu addr 8C57->rom addr 10C67] - 4 байта описания (жизни)
LDA (04), y. [cpu addr 8AB3->rom addr 10AC0] - 4 байта описания (характеристики)

нашлись 2 массива из 4х байтных структур, в одном из которых хранится количество жизней объектов и 3 пустых поля, а в другом характеристики объектов:

1 байт - тип объекта.
2 байт - номер функции поведения объекта
3 байт - начальный номер анимации объекта
4 байт - дополнительное поле - статус объекта или второй номер анимации.

номер функции поведения объекта попадает в память по адресу 4E0-4EF.

Остановка на чтение по этому адресу показывает массив хранения адресов функции поведения каждого игрового объекта.

(массив состоит из двух частей, в разных банках памяти) 825F , 82A7 - набор из указателей на поведение (72 штук)

1:8837 , 1:88B6 - набор из еще 128 штук указателей на поведение (первые 72 занулены).

Функции поведения позволяют детально изучить поведения врагов, но на их дизассемблирование нужно много времени, поэтому я ограничился разбором объектов только первого уровня, чтобы понять маппинг параметров в оперативную память.

Так, у всех врагов обычно есть:

4D0 - стадия (сторожит/следует за ЧП/стреляет/спит/бежит etc.)
420 - номер анимации
580 - направление движения
5A0 - оставшееся здоровье (80, если объект бессмертный)
410 - кадр анимации
430 - таймер между кадрами анимации
400 - флажки (направление движения, мерцание, присутствие на экране, etc.)

Дальше интерес представляет разворачивание номера анимации, для чего надо остановиться на считывание номера по адресам 420-42F.

Этот номер является индексом в массиве адресов 5:B4F0/B429 (адреса анимаций, первый массив младшие байты адресов, второй - старшие).

Формат анимации

{
1 байт - кол-во кадров N
1 байт. таймер
N байт - номера кадров
}

дальше по таймеру отлавливается загрузка следующего кадра:

кадр - индекс в массиве 5:9B0B/9C45 (если положительный, или если отрицательный, то 5:9C0B/9D45)

формат кадра:

{
количество тайлов в кадре
индекс описания координат
номера тайлов (через 1. тайл - аттрибуты)
}

Описание координат массив 5:AE53-AF23 (из пар байт X и Y).
данные о тайлах и координатах считываются на страницу памяти 200-2FF и передаются контролеру SpriteDMA.

Для чипа и дейла всё аналогично, адреса:

5:B55F-B4B6 (168 штук) описание анимаций
5:9CAE-9B82/
5:9DAE-9C82 (300 штук) описание кадров
5:B145-B08E (183 штук) описание координат

Утилита для просмотра анимаций и редактирования кадров:
cad_enemy_editor_v02
cad_enemy_editor_v2.zip