Решил разобрать последний из оставшихся крупных игровых элементов игр 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 (адреса анимаций, первый массив младшие байты адресов, второй - старшие).
Формат анимации
{ |
дальше по таймеру отлавливается загрузка следующего кадра:
кадр - индекс в массиве 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_v2.zip