Spiiin's blog

Реверс формата уровней Jungle Book [NES]

Завершение моего первого разбора формата уровней (3 года прошло).

Шаг 0x0B
По точке остановки на F540 :

>07:F540:A0 3B LDY #$3B
07:F542:B1 21 LDA ($21),Y @ $B6E3 = #$39
07:F544:99 47 00 STA $0047,Y @ $0047 = #$39
07:F547:88 DEY 07:F548:10 F8 BPL $F542

находим конфиги уровней и расшифровываем их.

Далее по брейку на запись на $83-84 :

01:856B:BC 88 DD LDY $DD88,X @ $DD89 = #$4F
01:856E:B9 00 00 LDA $0000,Y @ $004F = #$F4
>01:8571:85 83 STA $0083 = #$59
01:8573:B9 01 00 LDA $0001,Y @ $0050 = #$DB
01:8576:85 84 STA $0084 = #$DC

находим копирование из базовых адресов в расчётные (с помощью таблицы индексации) по адресу $DD88($1DD98 в роме).

Шаг 0x0C
Формат конфигов уровней:

49-4A 39A7 - описание экранов уровня.
4B-4C C8DD - указатели на проходимость блоков верхней половины.
4D-4E C8DD - указатели на проходимость блоков нижней половины.
4F-50 (83-84) F4DB - указатели на два верхних блока верхней половины.
51-52 (8B-8C) 59DC 53-54 (85-86) 49AA - указатели на два верхних блока нижней половины.
55-56 (8D-8E) C0AA 57-58 (87-88) BEDC - указатели на два нижних блока верхней половины.
59-5A (87-88) 23DD 5B-5C (89-8A) 37AB - указатели на два нижних блока нижней половины.
5D-5E (89-8A) AEAB 5F-60 (93-94) 74D9 - указатели на два верхних (опорных) микроблока верхней половины.
61-62 (93-94) F4D9 63-64 (95-96) C9A7 - указатели на два верхних (опорных) микроблока нижней половины.
65-66 (95-96) 49A8 67-68 (99-9A) 74DA - указатели на два нижних микроблока верхней половины.
69-6A (97-98) F4DA 6B-6C (9B-9C) C9A8 - указатели на два нижних микроблока нижней половины.
6D-6E (99-9A) 49A9 6F-70 (9D-9E) 74DB - палитра второй половины уровня.
71-72 C9A9 - палитра первой половины уровня.
73-74 F3BB - ?
75-76 25A8 - адрес заставки уровня.
77-78 95A7 - список объектов y.
79-7A 65A7 - список объектов x.
7B-7C 64A7 - предыдущий объект по x.
7D-7E 66A7 - следующий объект по x.
7F-80 F5A7 - список объектов d.
81-82 C5A7 - список объектов v.

Итоги
Система из блоков и макроблоков похожа на систему, используемую в играх Capcom, с отличием, что наборы блоков и макроблоков состоят из двух частей - в первой половине блоков собраны общие для всех уровней элементы (пеньки, листья, деревья - почти вся игра проходит в джунглях), а во второй - уникальные для каждого уровня элементы.

На скрине блоки только первой половины:

Такая схема позволяет сэкономить множество наборов повторяющихся для всех уровней наборов из 128 блоков. Уровень не разделен на экраны, а описан одним большим экраном, объекты отсортированы сверху-вниз и слева-направо, на описание объекта выделены 2 байта, которые кодируют его тип, и выпадающий из объекта бонус (для кристаллов ещё его порядковый номер).

Загруженный в редактор уровней CadEditor уровень: