ROM для теста Chip ‘n Dale Rescue Rangers (U) [!].nes
ЧАСТЬ 2. Устройство уровней.
Вместо просмотра дампов памяти можно открыть ROM картриджа и попробовать найти в нём описания блоков для уровня. Делать это проще всего методом коррапта, основного инструмента начинающих ромхакеров - случайным образом менять значения байт и смотреть, что сломалось в игре.
Описания уровней идут начиная с 16 байта, сразу после заголовка NES. Экраны рисуются “строками” из блоков по 8 элементов, занимают 40 байт и расположены в памяти последовательно с нумерацией снизу вверх слева направо. Элементы являются индексами массива блоков размером 16x16 (то есть 2x2 игровых объекта).
Описания объектов хранятся отдельно и сами состоят из 4х байт, кодирующих номера тайлов в видеопамяти, и дополнительного байта, который кодирует старшие биты цвета для выбора из палитры (по 2 бита на каждый тайл). При скролле из игры каждый шаг игрока отрисовываются следующие 2 больших блока, а раз в 4 шага происходит скролл, как раз когда готов вертикальный столбец из 8 блоков. Всего в игре 278 экранов и несколько дополнительных (бонусный, глобальная карта, полет в космос между стадиями).
Чтобы было понятнее, тайл видеопамяти /объект уровня/строительный блок уровня: //
Дальше надо разобраться с алгоритмом вытаскивания старших бит цветов. Это место уже нашлось в ходе реверса функции горизонтального скроллинга - в отрисовке большого блока есть выборка 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 - счетчик активных предметов (враги, предметы в ящиках, скрытые бонусы и специальные объекты типа яблок или сундуков).
Ставим брейкпоинт на первое чтение при запуске уровня и останавливаемся на считывании кода врага.
уровень 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х последних экранов, потом продолжение =\
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 - движущийся кусок?