Panama Joe. Запасной путь обхода.
Об этой игре слышали многие. Играли тоже. Кто полностью проходил лабиринт Panama Joe, тот знает – налево пойдешь, клад найдешь. Направо пойдешь – терпение и время потеряешь. Если пойти вправо по лабиринту, то в конечном итоге, вы наткнетесь на экран, который будет как-бы бесконечно повторяться. В картах лабиринта, которые я нашел где-то в интернете, так и говорится, что он бесконечный. А так ли это на самом деле? А может все-таки какой-то тайный аварийный выход там есть? А что тогда там за ним?
Если поверхностно ознакомиться с игрой, то видно, что процедура идентификации смежных экранов расположена по адресу 35698. Если не ошибаюсь, то работает она так:
-------------------
35698: LD B,03 ; количество циклов прохода для записи смежных экранов на 4 стороны (1+3)
LD IY, (24833) ;ячейка размещения адреса вертикальных экранов сверху и снизу от текущего -1
LD HL, 28796 ;начало ячеек для записи номеров экранов (лево-право-верх-низ)
LD A, (24832) ;загружается номер текущего экрана
DEC A ;вычитается и получается левый соседний экран
LD (HL), A ;заносится в рабочую ячейку (28796)
INC A
INC A ;прибавляется 2 и получается номер правого экрана от действующего
35714: INC HL ;переходим к следующей ячейке (точка входа в цикл)
INC IY ;перейти к номеру вертикальных экранов (повторно после цикла)
LD (HL), A ;записать правый/верхний/нижний экраны
LD A, (IY+00) ;извлечь номер верхнего/нижнего экрана
DJNZ 35714 ;повторить цикл 3 раза для записи всех значений на 4 стороны от текущего
-------------------
Таким образом, процедура формирует в ячейках:
28796 – номер экрана слева от текущего
28797 – номер экрана справа от текущего
28798 – номер экрана сверху от текущего
28799 – номер экрана снизу от текущего
Зная это, давайте пройдем в левую сторону лабиринта, и остановимся перед зацикленным уровнем на предыдущем:
Рис 1. Panama Joe. В шаге от аномального уровня.
Мы видим, что дальше расположен тот самый загадочный уровень и его идентификационный номер 40. Попробуем в него войти:
Рис 2. Первый аномальный зацикленный уровень.
Мы видим, что ячейка, отвечающая за правый экран показывает, что за ним стоит следующий уровень под номером 41. Пройдите до противоположного прохода и загляните дальше. Вы окажетесь в следующем точно таком-же экране:
Рис. 3. Panama Joe. 2-й повторившийся уровень.
Как видим из рисунка, теперь номер будущего уровня установился 42, предыдущего 40, а текущего 41. Таким образом, проходя этот лабиринт снова и снова, номер экрана будет приращиваться, а графика лабиринта оставаться неизменной (о структуре уровней как-нибудь потом). Через какое-то время номер уровня справа станет 255, что будет пределом значения однобайтовой переменной. Как вы понимаете, после переполнения произойдет сброс обратно в 0.
А что это за таинственный уровень 0, предлагаю проверить любителям игры. Для многих результат окажется неожиданным
Кто желает попробовать, для начала включите игру с бесконечной жизнью. Дойдите и войдите, в так называемый «зацикленный» уровень, и через Debugger в ячейке 28797 (правого смежного экрана) поставьте значение 255. Пройдите текущий повторяющийся, и войдите в следующий такой-же уровень. Только при этом нельзя разбиваться, иначе придется выставить значение заново.
Карта смежных экранов поменяется и теперь вы уже в 255 уровне. Предыдущим станет 254, а следующим обещает быть таинственный уровень номер 0. Осталось за малым - пройти несколько шагов вправо. Может там и есть выход на свободу из этого душного лабиринта? Но нет, там нолик, а уровень все тот-же. Зато следующим стоит уровень 1
В последний раз пройдите этот экран, и ваши мучения в лабиринте окончатся достойно… ))))))))
Вот такой эпический финал с сюрпризом может ожидать упорного геймера, который отважится пройти этот экран 218 раз подряд в правую сторону. Для сохранения интриги, что будет я пока не скажу, а ответ с результатом может опубликовать ниже любой желающий.