Spiiin's blog

Реверс Darkwing Duck(U) [NES]

Под впечатлением от безумного и весёлого хака управления Черного Плаща захотелось устроить исследование формата уровней этой игры.

Проверка брейкпоинтами по тому же методу, что и для Chip and Dale - куски кода идентичны, только располагаются немного по другим адресам.

Но адреса проецирования описаний блоков, макро-блоков и байт цвета из палитры остаются неизменными, так что получить их можно из дампов памяти игры по тем же смещениям:

def makeTileBlocks(data):
res = []
baseAddrs = [0xBAE0, 0xBBE0,0xBCE0,0xBDE0]
for x in xrange(256):
val = map(lambda v : data[v+x], baseAddrs)
res.append(val)
return res

def makeTilePalsBytes(data):
return data[0xBEE0:0xBEE0+256]

def makeBigTileBlocks(data):
res = []
baseAddr = 0xB6E0
for x in xrange(256):
res.append(data[baseAddr+x*4:baseAddr+x*4+4])
return res

Так можно получить описания экранов, макротайлов и тайлов.

Указатель на активный объект также хранится в байте 70, так что можно от него вычислить расположение описания врагов.

00 - Стрелок
01 - Летучая мышь
02 - Краб
03 - Каталка
04 - Балка
05 - Каталка(1-я)
06 - Каталка(2-я)
07 - Прыгающий стрелок
08 - Балка
09 - Кидатель ножей
0A - Слизняк
0B - Каталка(3-я)
0C - Висячий слизняк
0D - Пушка
0E - Чих. черепаха
0F - Резиновый робот

10 - Бриллиант
11 - Слитки
12 - Жизнь
13 - Аптечка
14 - Баночка здоровья
15 - Большая батарейка
16 - Маленькая батарейка
17 - Газ стрелок
18 - Газ тяжести
19 - Газ молний
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 - Включалка платформы
41 - Платформа из канализации
42 - Платформа из канализации влево
43 - Лампа (и темнота)
44 - Каталка средняя
45 - мерцание палитры (водопад)
46 - Что-то колючее
47 - босс-крот
48 - стрелялки у бушрута и крота?
49 - Кидалка бананов
4A - Квага
4B - Волфдак просто ходит
4C - Волфдак дышит
4D - босс-водяной
4E - босс-мегавольт
4F - босс-бушрут

50 - босс стальной клюв
51 - Лет. тарелки
52 - Лет. тарелки
53 - Лет. тарелки
54 - механизмы крота
55 - механизмы крота
56 - цепи (3)
57 - цепи (1)
58 - цепи (2)
59 - бонус 2-го уровня (между черепахами)
5A - бонус 3-го уровня (конец)
5B - бонус 3-го уровня (начало)
5C - бонус 6-го уровня (начало)
5D - бонус 6-го уровня (возле 1-й черепахи)
5E - бонус 4-го уровня (в тайнике-водопаде)
5F - бонус 4-го уровня (слева от фонаря возле первого бриллианта)

60 - бонус 5-го уровня (над первой мышью)
61 - бонус 5-го уровня (между двумя каталками)
62 - бонус 7-го уровня (возле двух метателей ножей)
63 - бонус 7-го уровня (в начале этапа с терминаторами)
64 - терминатор
65 - начало уровня
66 - вторя дорога (3 уровень, бонусы)
67 - часть мегавольта
68 - вторая дорога(4 уровень, спуск в водопад)

Адреса описаний объектов:

1 уровень - 10315-10347
2 уровень - 10438-10473
3 уровень - 10584-105C7
6 уровень - 106A0-106D5
4 уровень - 10816-10865
5 уровень - 10962-109A0
7 уровень - 10A89-10AC2

перед описаниями объектов по 4 массива с парами координат X и Y объектов.

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

Массивы экранов начинается с 1DFAO, массивы скроллов - примерно с 1E1AD, длины массивов хранятся в 1DEE7.

описание уровней.

Мост
15 XX 16 XX XX XX XX XX XX XX XX XX XX XX XX XX XX
XX XX XX XX XX 08 09 0A 0B 0C 0D 0E XX XX XX 14 14
XX XX XX XX XX 07 XX XX XX XX XX 0F 10 11 12 13 XX
01 02 03 04 05 06 XX XX XX XX XX XX XX XX XX XX XX

Город
15 XX 16 XX XX XX XX XX XX XX XX XX XX XX XX XX XX
XX XX XX XX 27 28 29 XX XX XX XX XX XX XX 34 34 34
XX XX XX XX 26 XX 2A 2B 2C 2D 2E 2F 30 31 32 33 00
21 22 23 24 25 XX XX XX XX XX XX XX XX XX XX XX XX

Канализация
41 42 43 XX XX XX 15 XX 16 XX XX XX XX XX XX XX XX
XX XX 44 45 46 XX XX XX XX XX XX XX XX XX XX XX XX
XX XX 47 48 49 4A 4B XX XX XX XX XX XX XX XX 56 XX
XX XX XX XX XX XX 4C 4D 4E 4F 50 51 52 53 54 55 XX

Вышка
15 XX 16 XX XX XX XX XX 76 76
XX XX XX XX XX XX XX 74 75 XX
XX XX XX XX XX XX XX 73 XX XX
XX XX XX XX XX XX XX 72 XX XX
XX XX XX XX XX XX XX 71 XX XX
XX XX XX XX XX XX XX 70 XX XX
XX XX 68 69 6A 6B XX 6F XX XX
XX XX 67 XX XX 6C 6D 6E XX XX
XX XX 66 XX XX XX XX XX XX XX
XX XX 65 XX XX XX XX XX XX XX
XX XX 64 XX XX XX XX XX XX XX
61 62 63 XX XX XX XX XX XX XX

Лес
81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F XX XX 97 XX
XX XX XX XX XX XX XX XX XX XX XX XX XX XX 90 91 92 XX XX
XX XX XX XX XX XX XX XX XX XX XX XX XX XX 93 94 95 96 XX

Электростанция
A1 A2 A3 A4 XX XX XX XX XX XX XX XX XX XX XX XX B3 B4 XX
XX XX XX A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 XX XX
XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX B5 XX

Корабль (к индексу экрана надо прибавлять 100)
01 02 03 04 05 XX XX XX XX 15 XX XX 98 XX 16 XX 16 XX XX
XX XX XX XX 06 07 08 09 0A XX XX XX XX XX XX XX XX XX XX
XX XX XX XX XX XX XX XX 0B 0C 0D 0E 0F 10 11 12 13 14 XX

В целом устройство намного проще и логичнее, чем в Chip and Dale. На один уровень - один блок видеопамяти, тайлов и макротайлов и в среднем по 2 палитры, в отличие от C&D, в которой эти наборы определялись сочетанием двери и номера уровня, причем было много переключений с целью сжать 2 уровня в один набор.

Типов блоков тоже оставлено только 5 (пустой, платформа, крюк, шипы, дверь), вместо 16 чипидейловых.

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

Из-за такой простоты достаточно легко добавить поддержку игры в редактор уровней Chip and Dale, рассчитанный на более замудренных бурундуков.
cad_editor_v7

скачать : emu-land или dropbox

UPDATED v0.8, добавлены редакторы врагов и раскладок скачать :
emu-land
dropbox