Еще одна оставшаяся нерешенной задачка из мира старых игр - алгоритм выбора пути между уровнями в Adventure Island 2.
В третьей части выбор следующей зоны зависел от того, обычным путём был закончен уровень или нахождением тайного выхода, а вот во второй главгерой мог шарится по острову по дороге к боссу довольно долго или добежать почти сразу.
Единственное, что было известно - что алгоритм выбора зависел от выбора яйца с бонусом в конце каждого уровня - так как в 3-м яйце чаще всего была спрятана жизнь, то игрок выбирал его и получал одинаковый маршрут. Поиск в интернете показал, что точного алгоритма выбора не знал никто, так что надо было выяснить его, вооружившись отладчиком.
Поиск дал немного полезной информации - на сайте у cah4e3’а нашёлся код на выбор уровня и game-genie код для перевода игры в дебаг режим. Из него доступны - выбор любой зоны, мира, бессмертие, тест звуков и предметов.
По номерам уровня можно расчерчить карту всех участков и составить планы уровней.
00-0F - горы (обычные, снежные, вулканы) 10-17 - джунгли(обычные и снежные) 18-1F - озера 20-2F - пещеры(обычные, темные и заснеженные) 30-3A - леса(обычные, закатные, морозные) 3B - логово последнего босса 3C-3F - леса 40-41 - ночные джунгли 42-43 - пики гор 44-47 - горные озёра 48-49 - ледяные пещеры 4A-4B - пустыня 4C-4D - облака 4E - логово 2-го босса 4F - вулканы 50-57 - боссы
Визуальным поиском по оперативной памяти номеров уровней в комнате бонусов можно найти, что все они располагаются в диапазоне 3E0-3FF - “мапа” уровня вперемежку с пустыми байтами. Если поменять эти байты и исследовать поведение игры, то выяснится: - Пройденная зона отмечается байтом F0, причем иногда в мапе уровня изначально присутствуют такие байты, что наводит на мысль о существовании коридоров, через которые можно ускоряться. - Если проиграть боссу, то он перемещается в свободную зону. Но, если свободных зон уже не осталось, остается в той же. Босс движется по тому же алгоритму, что и игрок. - Обычно из каждого уровня можно перейти в один из двух возможных, но бывают и исключения. Тут стоит прекратить гадание и поставить в отладчике точку остановки на запись в диапазоне памяти 3E0-3FF. 4. Остановка срабатывает по адресу: F682: LDA #$F0, STA $03E0,X В X текущая координата, относительно мапы уровней. Ячейка памяти, из которой считывается это смещение - D1.
Описание алгоритма: Берём номер яйца с бонусом в конце уровня, пытаемся перейти последовательно по одному из 8 вариантов, соотвествующих этому яйцу и прописанных в таблице переходов в ROM, по порядку (доступные смещения переходов +1,+7,+8,+9, -1,-7,-8,-9, то есть сместиться можно либо в соседний участок на острове, либо в один из дальних). Если не выходит (участок пустой или пройденный), то пытаемся хотя бы сменить уровень на тот, что уже был пройден и повторить процедуру поиска следующего уровня сначала. Если с 4х раз не получилось, берем последний доступный уровень с конца мапы. Если же все уровни пройдены, остаемся в том же.
Самые короткие и самые длинные дороги через острова: номер означает участок, через который проходит игрок, а в скобках стоит номер яйца, необходимого для перемещения к следующему участку.
**FERN ISLAND** * остров содержит бонус-сокращалку, можно не сражаться с боссом КОРОТКИЕ ПУТИ: 15 ->(0)-> 0 ->(0)-> 20 ->(0)-> 36 ->(0)-> 41 15 ->(3)-> 37 ->(4)-> 20 ->(0)-> 36 ->(0)-> 41 ДЛИННЫЕ ПУТЬ: 15 ->(0)-> 0 ->(0)-> 20 ->(0)-> 36 ->(2)-> 40 ->(2)-> 18 ->(0)-> 2A ->(0)-> 37 ->(0)-> 41