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 (26-10-2020 20:43)

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.09.20
Байт $EC - номер НПЦ в комнате
Байт $ED - номер Объявления, значение [0-15]

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, 241 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, 260 downloads since 2019-11-23 

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

room_024_5.png, 3.47 kb, 320 x 160
room_024_5.png 3.47 kb, 237 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, 132 downloads since 2019-11-23 

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

33 Отредактировано Dohtur Frag (23-10-2020 05:21)

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

Будет корректироваться по мере изучения кода.
;<------
charDescriptor: ;48 байт
.BasePozX    ds 1 ;изначальная позиция в комнате
.BasePozY    ds 1 ;изначальная позиция в комнате
.DelayBeforAnimate    ds 1 ;
.HowMove    ds 1 ;0 - взад-назад, 1 - рандом взад-назад, 2 - не двигается
.HowAnimate    ds 1 ;0 - последовательно из .tableAnimation, !0 - рандом из .tableAnimation
.LimitMoveStep    ds 1 ;максимальное смещение во время движения. по маске $1F
.LimitLeftPozX    ds 1 ;[крайне левая позиция]
.LimitRightPozX    ds 1 ;[крайне правая позиция]
;тетрада - номер анимации [0-2]
.tableAnimation    ds 8 ;ст.тетрада - чётный шаг, мл.тетрада - не чётный шаг
.tableResponseOnCommand
;12 байт минус .Welcome
.Welcome    ds 1 ;пустая команда, только текст при появлении Алисы
.Coax        ds 1 ;номер ответной фразы
.Tease        ds 1 ;номер ответной фразы
.Calm        ds 1 ;номер ответной фразы
.Scold        ds 1 ;номер ответной фразы
.Help        ds 1 ;номер ответной фразы
.Argue        ds 1 ;номер ответной фразы
.WhoAreYou    ds 1 ;номер ответной фразы ,0 - не разговаривает
.WhereIam    ds 1 ;номер ответной фразы
.WhatAreYouDoing    ds 1 ;номер ответной фразы
.ReactionOnSing        ds 1 ;номер песни
.ReactionOnOffer    ds 1 ;номер предмета по маске $3F
.ActionSing        ds 1 ;0 - см..ActionRiddle
.ActionSayHint    ds 1 ;0 - см..ActionSing, !0 -  по маске $7F
.ActionGiveItem    ds 1 ;0 - см..ActionSayHint, !0 - по маске $3F и см..ActionSayHint
.ActionRiddle    ds 1 ;!0 - номер загадки
.isBlockAlice    ds 1 ;0 - не блокирует, !0 - блокирует
.HowBlockAlice    ds 1 ;0 - только по X, !0 - по X,Y
.PlaceAliceInRoom    ds 1 ;
.PlaceAliceInPozX    ds 1 ;
.PlaceAliceInPozY    ds 1 ;
.tableReactionOnCommand
            ds 11
;.endCharDescriptor
;конец описателя персонажа
;
;Как работает логика?
;команда !0 и фраза !0 (иначе посылает к окулисту)
;9 команд: с .Coax по .WhatAreYouDoing. Для примера возьмём .Help
;смотриться .tableReactionOnCommand:
;    если :00000000 - выводиться фраза из .Help
;    если :0xxxxxxx - через сколько часов вернётся ($7F - совсем исчезает), выводиться фраза из .Help
;    если :10000000 - смотрит .ActionGiveItem, выводиться фраза из .Help
;    если :1xxxxxxx - смотрит .ActionGiveItem, через сколько часов вернётся ($7F - совсем исчезает), выводиться фраза из .Help
;конец.
;.ActionGiveItem:
;    если !0 - выбрасыват предмет и проваливается на если 0
;    если 0 - смотрит .ActionSayHint:
;        если !0 - выводит фразу из .ActionSayHint и проваливается на если 0
;        если 0 - смотрит .ActionSing:
;            если !0 - поёт песню из .ActionSing и проваливается на если 0
;            если 0 - смотрит .ActionRiddle:
;                если !0 - выставляет флаг загадки
;конец .ActionGiveItem
;Таким образом .Help всегда выводиться последней и если .ActionSayHint !0 -
; то в .Help лежит Hint, а фраза в .ActionSayHint
;-------/>

34 Отредактировано Dohtur Frag (18-10-2020 22:15)

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

Это номера предметов - так сказать настоящие номера:
item_Stick    ds 1                ;0
item_Baby    ds 1                ;1
item_Rattle    ds 1                ;2
item_Muffin    ds 1                ;3
item_Memo    ds 1                ;4
item_Whisker    ds 1            ;5
item_CricketBat    ds 1            ;6
item_Brooch    ds 1                ;7
item_Fan    ds 1                ;8
item_BreadAndButterfly    ds 1    ;9
item_Cravat    ds 1                ;10
item_PaperCrown    ds 1            ;11
item_SeaShell    ds 1            ;12
item_Key    ds 1                ;13
item_Marmalade    ds 1            ;14
item_TopHat    ds 1                ;15
item_Parasol    ds 1            ;16
item_TinOfComfits    ds 1        ;17
item_TeaCup    ds 1                ;18
item_TeaPot    ds 1                ;19
item_PurpleMushroom    ds 1        ;20
item_WhiteMushroom    ds 1        ;21
item_Elixir    ds 1                ;22
item_Cake    ds 1                ;23
item_QueenKey    ds 1            ;24
А это - то как предметы представлены в игре:
ConvertItemIDtoTrueID:
;на Входе A = ItemID
;до 19 - один в один
;A=[19-21]    - item_TeaPot
;A=[22-27]    - item_PurpleMushroom
;A=[28-33]    - item_WhiteMushroom
;A=[34-47]    - item_Elixir
;A=[49-254]    - item_Cake
;на Выходе Y = TrueID
;----/>
;это базовые таблицы, в начале игры, для размещения предметов
;по ходу игры подвергаются изменениям
;номер предмета для размещения является индексом в этих 3-х таблицах
;номера комнат в которых нужно разместить предметы
        dfb $00,$9b,$00,$4b,$00,$00,$00,$00
        dfb $00,$ba,$00,$00,$28,$22,$15,$00
        dfb $00,$00,$37,$30,$30,$30,$00,$00
        dfb $00,$00,$00,$00,$00,$00,$00,$00
        dfb $00,$00,$00,$25,$25,$25,$25,$25
        dfb $25,$24,$93,$52,$52,$24,$a6,$a6
        dfb $a7,$22,$22,$22,$22,$25,$25,$25
        dfb $24,$91,$52,$52,$24,$a6,$a7,$a7
;1-я позиция в строке, предмет занимает 2 позиции в подряд
        dfb $00,$15,$00,$14,$00,$00,$00,$00
        dfb $00,$14,$00,$00,$23,$05,$19,$00
        dfb $00,$00,$11,$0f,$11,$17,$00,$00
        dfb $00,$00,$00,$00,$00,$00,$00,$00
        dfb $00,$00,$00,$18,$22,$22,$18,$1c
        dfb $1e,$05,$14,$21,$05,$05,$06,$25
        dfb $1d,$1a,$1c,$21,$23,$04,$09,$07
        dfb $05,$11,$1f,$07,$05,$17,$10,$04
;старшие 3 бита - флаги
;B7=1 - предмет не доступен
;B6=1 - отобразить предмет; =0 - не отображать
;B5=1 - предмет у Алисы; =0 - предмет в комнате
;остальные биты - номер строки в комнате
        dfb $00,$48,$00,$4f,$00,$00,$00,$00
        dfb $00,$49,$00,$00,$4c,$42,$46,$00
        dfb $00,$00,$45,$42,$42,$44,$80,$80
        dfb $80,$80,$80,$80,$80,$80,$80,$80
        dfb $80,$80,$80,$4e,$4e,$48,$48,$44
        dfb $44,$47,$52,$4b,$4b,$50,$52,$4c
        dfb $4c,$42,$42,$42,$42,$49,$49,$4b
        dfb $4e,$4d,$4b,$4b,$49,$4c,$52,$4c