26 Отредактировано SnakE (09-11-2019 04:34)

Re: Как поиск квеста "Алиса в стране чудес" сам превратился в квест

Продолжение эпопеи -- переходы между комнатами!

У комнат сквозная нумерация. Нулевая комната находится в $2/$0, там на самом деле комнаты нет и ноль используется как маркер отсутствия перехода. Далее по порядку: $2/$1 = 1, $2/$8 = 8, $3/$0 = 9 и т.д. Нумерация перепрыгивает через пропущенные треки без разрыва: $10/$8 = $86, $15/$0 = $87 и т.д. Всего в игре может быть 255 комнат, и почти все они используются.

Выходы закодированы в каждой комнате в байтах $EE-$FA:

  • $EE -- комната, в которую Алиса попадает, выйдя вверх

  • $EF -- комната снизу

  • $F0 -- комната слева

  • $F1 -- комната справа

  • $F2 -- комната, в которую Алиса попадает, выйдя через первую дверь. В этой комнате Алиса оказывается в координатах X=$F5 и Y=$F8

  • $F3 -- выход через вторую дверь, координаты перехода в $F6 и $F9

  • $F4 -- третья дверь, координаты в $F7 и $FA

Выходы $F2, $F3 и $F4 соответствуют закрытой двери, открытой двери и зеркалу, см. пост об объектах ниже.

27

Re: Как поиск квеста "Алиса в стране чудес" сам превратился в квест

Если бы здесь была кнопка "Спасибо", я бы её нажал кучу раз :)

28 Отредактировано Dohtur Frag (09-11-2019 09:41)

Re: Как поиск квеста "Алиса в стране чудес" сам превратился в квест

В коде алисы нашёл кусок, который похож на анализ комнаты.
Сначала в секторе ищется $E0 (может быть не найден), позиция значения не имеет, только сам факт наличия $E0. Если найден - тогда сохраняется содержимое ячеек $EC-$ED; $EE-$F4; $F5-$FA. Дальше начинается разбор на тетрады $FB-$FE. Потом распаковка, начиная с байта $0.
Распаковка идёт на $C000 до $C320($320 байт).
Потом берётся байт. Младшая тетрада сохраняется, старшая проверяется. Если $E0 выход, если $60 - обрабатывается отдельно, если $10,$20,$30,$40,$50,$80,$A0,$C0,
$D0,$70,$00,$90,$B0,$F0  - обрабатывается одинаково, им в соответствие приводятся значения $B4,$B7,$BA,$BB,$BC,$BD,$BE,$BF,
$C0,$CC,$FF,$FF,$FF,$FF.
Потом выбираются 2 байта адреса, причём для эпла старший байт уменьшается на #$33(оно и понятно, на эпле буфер на $8D00).
Потом пляски больше - меньше и запись этих $B4,$B7.... по верх распакованого на $C000-$C300. При этом, в зависимости от кода $B4,$B7..., решается вопрос сколько раз этот код повторить(1,2,3).
Код $60 обрабатывается схожим образом, только плясок нету(он же один).
И так по кругу, пока в $E0 не упрётся.

В общем всё как Snake написал, плюс немного подробностей, с точки зрения кода.

Немного примеров.
Допустим встретился код $13. 1 это $B4, 3 это высота(количество строк) Это значит, что будет распакована матрица вида:
$B4,$B5,$B6
$B4,$B5,$B6
$B4,$B5,$B6
Допустим встретился код $72. 7 это $CC, 2 высота. Распакуется матрица:
$CC,$CD
$CE,$CF
Код $D3. Матрица:
$C0,$C1,$C2
$C3,$C4,$C5
$C6,$C7,$C8
Код $33. Матрица:
$BA
$BA
$BA
Код $A3. Матрица:
$BE$BE$BE
$BE$BE$BE
$BE$BE$BE

Пока что, как-то так.

29

Re: Как поиск квеста "Алиса в стране чудес" сам превратился в квест

По просьбам трудящихся.
Ответы на загадки.

Всего загадок-вопросов - 7. Из них 6 это загадки и 1 вопрос(форматировать диск Y/N?).
Буфер для ввода ответа на загадку - 16 байт.
Сами отгадки могут быть не длиннее 8 байт.
Это значит что если ответ будет больше 8 байт, он всё равно будет 8 байт.
Как пример, слово Buttercup. Отвечая на загадку, можно набрать Buttercup, а можно Buttercu, а можно ButtercuMFгыгы. Все варианты будут правильными. Потому что значимые только первые 8 букв.

30

Re: Как поиск квеста "Алиса в стране чудес" сам превратился в квест

Объекты!

Итак, в списке объектов встречаются записи, состоящие всего из трёх байт: кода объекта и его координат.

Старшие 4 бита кода -- это тип объекта. Он определяет горизонтальные размеры и внешний вид.
Младшие 4 бита кода -- всегда высота объекта в тайлах.

Типы объектов:

  • $1, $2 -- лестницы. В ширину состоят из тайлов $B4-$B6 и $B7-$B9 соответственно, которые повторяются в высоту.

  • $3, $4, $5 -- верёвки. В ширину состоят из одного тайла: $BA, $BB и $BC соответственно, повторяются в высоту.

  • $7 -- листок объявления. Первая строка состоит из тайлов $CC и $CD, вторая из $CE и $CF.

  • $8 -- закрытая дверь. Строка состоит из трёх тайлов $BD и повторяется в высоту.

  • $A -- открытая дверь. Строка состоит из трёх тайлов $BE (сплошной чёрный) и повторяется в высоту.

  • $C -- зеркало. Строка состоит из трёх тайлов $BF и повторяется в высоту.

  • $D -- часы. Первая строка  -- тайлы $C0-$C2, вторая $C3-$C5, третья $C6-$C8.

  • $0, $9, $B, $F -- видимо, не используются.

В комнате может быть только одна дверь каждого типа. Закрытая дверь ведёт в выход $F2, открытая в $F3 и зеркало в $F4, см. пост про переходы между комнатами.

Предполагаю, что по высоте двери игра решает, может ли Алиса в её нынешнем размере пройти в дверь.

Спасибо Андрею Frag за информацию о преобразованиях, которые игра делает с кодами!

P.S.: Из комнаты можно выйти не только влево-вправо, но и вверх-вниз. Эти выходы описаны в байтах $EE и $EF описателя комнаты. Я поправлю пост про переходы.

Post's attachments

objects2.png, 2.01 kb, 280 x 160
objects2.png 2.01 kb, 4 downloads since 2019-11-08 

31

Re: Как поиск квеста "Алиса в стране чудес" сам превратился в квест

Детективная работа немного застопорилась, поэтому расскажу, что нам с Андреем удалось выяснить про персонажей.

Post's attachments

room_006_6.png, 3.25 kb, 320 x 160
room_006_6.png 3.25 kb, 4 downloads since 2019-11-23 

room_009_2.png, 2.44 kb, 320 x 160
room_009_2.png 2.44 kb, 2 downloads since 2019-11-23 

room_024_5.png, 3.47 kb, 320 x 160
room_024_5.png 3.47 kb, 2 downloads since 2019-11-23 

32

Re: Как поиск квеста "Алиса в стране чудес" сам превратился в квест

Персонажи раскиданы почти по всем трекам второго диска в секторах $9-$E. Один персонаж занимает два сектора.

Сначала идут спрайты. У каждого персонажа 3 кадра анимации. каждый кадр состоит из двух спарйтов 24х21 в аппаратном формате Комодора, склеенных вертикально. Каждый спрайт занимает 64 байта. Итого 6 спрайтов по 64 байта = $180 байт.

http://forum.agatcomp.ru//misc.php?action=pun_attachment&item=684&download=0

Сразу за спрайтами идёт таблица $30 байт длиной. Достоверно известно, что первые два байта этой таблицы -- координаты персонажа в комнате в тайлах. Про остальные данные информации нет. Наверняка там хранится анимация -- какой кадр сколько времени показывать. Возможно, там же хранятся смещения для персонажей, которые перемещаются.

Кроме этого в коде игры есть таблица, по которой для избранных комнат корректируются байты 0, 1, 5, 6 и 7 в таблице персонажа. Например, персонаж $3B встречается в четырёх комнатах, везде в разных местах. Изменяя байты 0 и 1 в его таблице, игра ставит его на нужное место.

http://forum.agatcomp.ru//misc.php?action=pun_attachment&item=683&download=0

Post's attachments

Attachment icon chars_ids.png 12.06 kb, 1 downloads since 2019-11-23 

mined-char.png, 364 b, 72 x 42
mined-char.png 364 b, 2 downloads since 2019-11-23