Spiiin's blog

Chip and Dale Hack

ROM для теста Chip ‘n Dale Rescue Rangers (U) [!].nes

ЧАСТЬ 2. Устройство уровней.

Вместо просмотра дампов памяти можно открыть ROM картриджа и попробовать найти в нём описания блоков для уровня. Делать это проще всего методом коррапта, основного инструмента начинающих ромхакеров - случайным образом менять значения байт и смотреть, что сломалось в игре.

Описания уровней идут начиная с 16 байта, сразу после заголовка NES. Экраны рисуются “строками” из блоков по 8 элементов, занимают 40 байт и расположены в памяти последовательно с нумерацией снизу вверх слева направо. Элементы являются индексами массива блоков размером 16x16 (то есть 2x2 игровых объекта).

Описания объектов хранятся отдельно и сами состоят из 4х байт, кодирующих номера тайлов в видеопамяти, и дополнительного байта, который кодирует старшие биты цвета для выбора из палитры (по 2 бита на каждый тайл). При скролле из игры каждый шаг игрока отрисовываются следующие 2 больших блока, а раз в 4 шага происходит скролл, как раз когда готов вертикальный столбец из 8 блоков. Всего в игре 278 экранов и несколько дополнительных (бонусный, глобальная карта, полет в космос между стадиями).

Чтобы было понятнее, тайл видеопамяти /объект уровня/строительный блок уровня: block0//

Дальше надо разобраться с алгоритмом вытаскивания старших бит цветов. Это место уже нашлось в ходе реверса функции горизонтального скроллинга - в отрисовке большого блока есть выборка 4х байт, для каждого из маленьких блоков по одному.

Начало таблицы маппится на адрес $BEE0 в памяти.

ROM:DFA3 LDY byte_2
ROM:DFA5 LDA $E04F,Y
ROM:DFA8 STA byte_3
ROM:DFAA LDA (0),Y
ROM:DFAC TAX
ROM:DFAD LDA $BEE0,X ;базовый адрес старших байт цвета в памяти + смещение блока

Палитру уровня можно взять из fceud (Tools->PPU viewer) и написать функцию замены цветов тайла по палитре, чтобы подмешать полученные цвета в уровень.
Результат:
остальные картинки

ЧАСТЬ 3. Описание объектов

$70 - счетчик активных предметов (враги, предметы в ящиках, скрытые бонусы и специальные объекты типа яблок или сундуков).

Ставим брейкпоинт на первое чтение при запуске уровня и останавливаемся на считывании кода врага.

ROM:80BD LDY byte_70
ROM:80BF JSR make_enemy_coord
ROM:80C2 BNE loc_80CB
ROM:80C4 JSR make_enemy
ROM:80C7 INC byte_70
ROM:80C9 BNE loc_80BD

Начала описаний объектов в ROM:

уровень 0 - 10388-103D3
уровень А - 10456
уровень B - 105A1
уровень C - 106D1-10709
уровень D - 10890-108F0
уровень E - 10A1D-10A66
уровень F - 10B0E-10B36
уровень G - 10C88-10СDA
уровень H - 10DB3-10DE7
уровень I - 10EA1-10ECD
уровень J - 10FED-11033
ИСКЛЮЧЕНИЯ (порядок описания отличный от того, как он идет в игре).
Уровень 0 - Сначала идет комната с боссом, потом комната с сыром для рокки.
Уровень D - Босс расписан перед уровнем, а не после. Не хватает одного байта описания координат, из-за долго которого ломался мой парсер. Из-за этого "проебайта" у босса за спиной не рисуется заводной ключик :)
уровень E - Кусок сначала из 4х последних экранов, потом продолжение =\

ТИПЫ ВРАГОВ

00 - механическая собака
01 - механический мышь
02 - пчела
03 - гусеница
04 - белка-летяга вправо
05 - белка-летяга влево
06 - "кидальщик 3 штучек и убегальщик":)
07 - хамелеон
08 - муха
09 - яблоко
0A - скрытая звезда
0B - цветок
0C - звезда
0D - желудь
0E - светящийся желудь
0F - светящаяся звезда

10 - ящик с баночкой
11 - ящик с сыром для Рокки
12 - ящик со светящейся звездой
13 - ящик со светящимся желудем
14 - ящик с вжиком
15 - ящик с вжиком (другие тайлы вжика)
16 - бомба (тайлы уровня B)
17 - ящик с лодкой
18 - ящик с молотком
19 - бомба (тайлы уровня E)
1A - скрытая святящаяся звезда
1B - неоткрывающийся ящик
1C - козлик с коврами
1D - птица-качок
1E - прыгающий ящик
1F - кенгуру с ракеткой

20 - птица с железным шаром
21 - игрушечная боевая юла
22 - клоун
23 - куколка бабочки
24 - жук в засаде
25 - рогатый жук
26 - крокодил в шляпе
27 - прыгающий крокодил в шляпе
28 - носорог-качок
29 - краб
2A - пеликан
2B - стрелок с присосками
2C - искра длинный
2D - искра средний
2E - искра короткий
2F - огонь под кастрюлей. безвреден.

30 - падающий насвозь металлический шар
31 - выдвижная платформа
32 - вентиль для блокировки потока
33 - катящийся металлический шар
34 - катящийся металлический шар
35 - резалка
36 - выключатель резалки
37 - падающие стены
38 - быстрый катящийся металлический шар
39 - "спихивалка" с игровых автоматов
3A - топор
3B - выключатель падающих шаров
3C - катящийся металлический шар
3D - вентилятор влево
3E - вентилятор вправо
3F - движущийся кусок?

40 - босс 1 (голова)
41 - босс 1 (левая рука)
42 - босс 1 (правая рука)
43 - босс 2 (сова)
44 - босс 3 (летающая ракета)
45 - босс 4 (сердце и метатель)
46 - босс 4 (заводной ключ)
47 - босс 4 (шины)
48 - катящийся металлический шар
49 - босс 6 (кролик в автомате)
4A - босс 5 (сом)
4B - босс 7 (сороконожка)
4C - босс 7 (часть сороконожки)
4D - босс 7 (часть сороконожки)
4E - босс 7 (часть сороконожки)
4F - босс 7 (часть сороконожки)

50 - босс 8 (толстопуз, рука с сигарой)
51 - босс 8 (толстопуз, морда)
52 - гнилая доска
53 - красный шарик
FF - невидимый непроходимый блок, конец зоны

Вот и всё :)