Когда я изучал работу игры IMPACT, чтобы вставить в нее свои уровни вместо базовых, я натолкнулся на очень любопытные глюки. Поиском по форуму я не нашел похожей темы, поэтому решил оформить небольшое исследование в виде поста-статьи.
IMPACT: Тайна 80-го уровня
Кто хоть раз проходил игру IMPACT, тот наверняка сталкивался с уровнем №80. Эту белиберду на экране не запомнить трудно:
Рис. 1 Уровень 80 в большинстве оригинальных версий игры IMPACT.
А в самом верху наблюдаем даже фиолетовый кирпичик, которого без активации фонарика быть видно не должно. В нескольких книгах по описанию игр от разных издательств, проскакивают занятные советы, которые также намекают, что автор проходил уровень именно в такой расстановке:
Рис. 2. Фрагменты описания из книг 500 и 600 игр издательств "Солон", "VA Print" и "Питер".
По поводу "желтых кирпичей" и 75 уровня, разговор отдельный. А вот по 80-му уровню совет занятный. А может ли быть такое? Меня такой "дизайн" уровня и насторожил. Есть в этом что-то неправильное, иррациональное. Многие знают, что игра состоит из 2-х частей: базовых уровней (01-80), которые включаются по умолчанию, и пользовательских 81-90, которые включаются по паролю "USER".
Догадки подтвердились, когда я расшифровал алгоритм кодировки базовых уровней (01-80) и написал процедуру кодирования и декодирования, чтобы извлечь их оттуда, и поставить вместо них свои. И сразу становится понятно, что в реальности по задумке автора, уровень должен выглядеть вот так:
Рис. 3. Правильно расшифрованный уровень 80 игры IMPACT.
Постепенно выбивая кирпичики, зелено-красно-синяя масса таяла, приобретало все явственные очертания. И теперь становилось понятно, что в конце уровня, по задумке автора, должно остаться слово END:
Рис. 4. Правильный финал 80-го уровня IMPACT.
Внимательно изучив код игры, стала понятна причина. По всей вероятности либо сам разработчик до конца не протестировал свое детище, или кто-то по невнимательности оставил отладочное значение в команде, когда монтировали сжатые уровни. В общем, вышло следующее:
Рис. 5. Дизассемблер фрагмента игры с ошибкой перехода.
При запуске последнего базового уровня после сравнения командой CP 80 (в адресе 48832), по инструкции JR NC, 48842, компьютер переходит к переброске в карту игры пользовательских несжатых уровней, захватив последний базовый зашифрованный. Следовательно шифрованный уровень перебрасывается в действующую карту игры нераспакованным. Что из этого получается, мы видели на самом первом рисунке. Для исправления ситуации достаточно вместо 80, поставить число 81, и все встанет на свои места.
Но на этом сюрпризы не заканчиваются. По окончании уровня, компьютер просто повисает, выдав на экран пиксельный мусор:
Рис. 6. Зависание IMPACT после окончания уровня 80 и его причина.
При каких обстоятельствах, была допущена такая ошибка, сказать сложно. Программа просто зацикливается на инструкции JR 56210. Какова была первоначальная задумка, остается только гадать.
Один из оптимальных вариантов решения косяка без порчи кода игры, мне видится в замене адреса 56210 на адрес 56193 (код 024, 237). В этом случае ничего не надо перемещать, и после окончания уровня, произойдет возвращение в стартовое меню.
Но желательно это сделать и чуть раньше. В предыдущей подпрограмме, с которой идет переход в это место. И тогда на экран даже не вылезет мусор. Для этого в инструкции по адресу 56107 вместо JR Z, 56196 поставьте 56193. Тогда после успешного прохождения уровня программа выйдет в начальное меню.
Подводя итог: чтобы немного подправить "авторские баги", сделайте следующие изменения в игре:
48833 ---> 81
56211 ---> 237 или 56108 ---> 84