Spiiin's blog

Исследование Addams Family(E) [NES]

"Семья Аддамсов" - одна из самых запутанных игр на NES.

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

Сначала с помощью поиска читов необходимо отсеять ячейки памяти, которые изменяются вместе с игровой зоной. Чтобы это сделать в эмуляторе fceuxd sp надо много раз, меняя комнату, в меню Tools->Cheats просеивать ячейки кнопками Equal и Not Equal. Когда останется примерно тридцать ячеек можно с помощью монитора памяти (Tools->Hex editor), следить за ними в реальном времени. При этом опытному ромхакеру в глаза сразу должна броситься ячейка $613, которая со всех сторон окружена нулями, а сама меняется с номером комнаты или при сборе предметов. В игре есть только один параметр, который меняется при таких условиях - подсказка с названием комнаты внизу экрана.

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

lda x, $71 ;переносим в x значение из ячейки $71  
lda c7d2,x ;загружаем номер строки с названием  
sta $613 ;записываем номер строки в ячейку $613

Проверка подтверждает, что номер комнаты сохраняется в ячейке $71. Теперь можно создать мобильный телепорт - переставить точку остановки на запись на ячейку $71, и после срабатывания, вручную подменять её на любое число, чтобы получить таблицу игровых комнат.

#	ROOM	ПОЯСНЕНИЕ
00	THE GARDEN	Сад
01	THE TREE	Дерево в саду
02	THE CRYPT	Склеп в саду
03	THE HALLWAY	Холл
04	THE DINING ROOM	Столовая снизу справа от входа
05	THE GALLERY	Галерея снизу слева от холла
06	THE LANDING	Коридок сверху слева, в сторону чердака
07	THE LANDING	Коридор сверху справа, в сторону балкона
08	THE FESTER'S ROOM	Комната Фестера
09	THE PUGSLEY'S ROOM	Комната Пагсли
0A	THE TOY ROOM	Комната игрушек
0B	THE WEDNESDAY'S ROOM	Комната Венсдей
0C	THE ATTIC	Чердак
0D	THE ROOF	Крыша
0E	THE POND	Пруд в лесу
0F	THE SECRET ROOM	Тайник в комнате MASTER'S BEDROOM
10	THE SECRET ROOM	Тайник в шкафу на чердаке
11	THE SECRET ROOM	Тайник справа в пруду
12	THE CHIMNEY	Камин. Вход в трубе на крыше
13	THE BATHROOM	Ванная
14	THE BALLROOM	Зал с привидениями, центральная дверь в холле
15	THE WOOD	Лес за залом
16	THE KITCHEN	Кухня, дверь справа в холле
17	THE LIBRARY	Библиотека
18	THE CHAIN ROOM	Комната с цепями. Выходы в комнаты 19,02,16,23,09
19	THE SECRET RIVER	Секретная река
1A	THE TREASURY	Сокровищница
1B	THE SECRET ROOM	Тайник в камине с огнем в столовой
1C	THE PIT	Яма-ловушка с шипами. Тупик снизу-справа в склепе
1D	THE BONE ROOM	Дверь сверху-слева в склепе
1E	THE BONE ROOM	Дверь снизу-слева в склепе
1F	THE BONE ROOM	Дверь сверху-слева в склепе
20	THE GOMEZ'S ROOM	Последняя комната
21	THE FREEZER	Холодильник в кухне
22	THE FURNACE	Печка, вход справа в кухне
23	THE PIT	Яма-ловушка в комнате с ценями
24	THE STUDY	Вход в библиотеку

Аналогичным отсевом можно найти в памяти место хранения полученных предметов. Если в ячейке по адресу записан 0 - предмет отсутствует, если 1 - предмет уже найден. Другие числа означают разновидность предмета. Таблица предметов (собрана для проверки существования тайного ключа от двери в холле):

ADDRESS	ITEM	ПОЯСНЕНИЕ
630	SNORREL	Маска для плавания в пруду
631	UMBRELLA	Зонт для спуска в вертикальных комнатах
632	BUCKET	Ведро. 1 - пустое ведро, 2 - с водой
633	HOUSE	Ключ от входа в дом
634	TREE	Ключ от двери в дереве
635	ATTIC	Ключ от чердака
636	MUSIC SCORE	Ноты. 1,2,3 - тип нот
637	FOG	Туман из трубы
638	BONE	Туман из трубы
639	BLUE EGG	Туман из трубы
63A	MORTICIA	Спасенные члены семьи
63B	PUGSLEY	~
63C	GRANNY	~
63D	WEDNESDAY	~
63E	LURCH	~
63F	THING	~
640	SPANNER	Гаечный ключ
```

Никаких секретов =\

Еще для надежности можно провести исследование кода вывода надписи `Locked Door`, которая появляется, если нету при попытке зайти в закрытую дверь. Для этого точка остановки снова перемещается на ячейку $613, игра стопится на попытке зайти в любую закрытую дверь, память дампится в файл и загружается в дизассемблер. Анализ процедуры, на которой остановилось выполнение, показывает 5 переходов на вывод сообщения о закрытой двери. По таблице номеров комнат и предметов легко расшифровываются условия.

```
ADDRESS	Условие
E76D	Секретная река. Закрыто, если не спасен PUGSLEY
E78E	Комната в холле. Код ниже
E781	Нужен ключ от входа на чердак
E7A2	Нужен ключ от двери в дереве
xxxx	Нужен ключ от входа в дом
```

Проверка условия на двери в холле

```asm
E74C: LDA byte\_71 ;загрузка номера текущей комнаты  
...  
E784: CMP #3 ; если в холле  
E786: BNE loc\_E793  
E788: LDY #0  
E78A: LDA ($A),Y  
E78C: CMP #7 ; если вход в дверь номер 7 (та самая загадочная дверь)  
E78E: BEQ $E7AC  
E7AC: LDA #$32 ; показать строку номер 32 "locked door"  
E7AE: STA byte\_613 ; дверь закрыта всегда =\

С нотами такая же штука. В момент, когда Гомез передаёт дворецкому манускрипт, единственное, что происходит в коде - выставляется значение номера мелодии в ячейку $623. Если записать в эту ячейку другие числа, можно послушать все 5 музыкальных тем игры или заставить дворецкого играть нойз из кода игры. Ячейка с номером мелодии постоянно считывается только в комнатах Library(открывается секретный проход в комнату цепей нотами 1) и Ballroom (призраки начинают танцевать и открывается вход в лес, если были выбраны ноты 3). Ноты номер 2 не используются нигде =\

Секретов нет, но теперь это хотя бы проверено.

update Ненужная нота в библиотеке - это отсылка к старому черному белому сериалу