nzeemin.github.io / Сталкер/Зона/Пикник

Оригинальная игра

Запустить в онлайн-эмуляторе UKNCBTL

Это игра в жанре «рогалик» (Rogue-like), бродилка по подземельям, по мотивам повести Стругацких «Пикник на обочине». Игра называлась «Зона», «Сталкер» или «Пикник» – файл игры назывался STALK.SAV, PIKNIK.SAV или ZONA.SAV, и предназначался для советских PDP11-совместимых машин – таких как ДВК и УКНЦ.

По-видимому, игра создана в конце 1980-х, автор – программист из Ульяновска – первоначально программа выводила копирайт:
*** (С)УЛЬЯНОВСК УЛПИ "ГОЛОГРАФИЯ"***

В январе 2024 года Юрий Финкель написал в ВК:

Эта игра была написана в конце 80-х моим знакомым Сергеем Вершининым (мы работали в той самой лаборатории "Голография", упомянутой в тексте, я фактически присутствовал при её создании :) ). Тут на меня вышли с вопросом, как же всё-таки звали автора, я его сдал :), люди с ним уже связались. Заодно поиграл в эту веб-версию, вспомнил молодость. Хотя лет 5 назад я в неё тоже играл, тогда я нашёл эмулятор PDP-11 для Windows, а также образ диска с играми. Но я не знал тогда, что люди фанатеют именно с этой игры настолько, что аж декомпилировали и восстановили текст на Паскале, а затем и переписали на Javascript.

Кстати, несколько сообщений игры явно были заменены двоичным редактором. Я точно помню, что в исходной версии упоминался журнал "Уайрлесс Уорлд" (именно в таком написании), но, видимо, шутка была слишком локальная (у нас в лаборатории была подшивка этого англоязычного журнала "Wireless World"), поэтому кто-то позднее заменил на журнал "Акушерство и гинекология". Да и насчёт "отрезанной головы предыдущего Сталкера" кажется мне, что в оригинале было что-то вроде "останков предыдущего путешественника", хотя тут могу ошибаться.

На основе оригинала было создано множество вариаций игры, чаще всего они различались только выводимыми сообщениями – файл игры редактировался бинарным редактором DESS, логика игры, по-видимому, оставалась почти неизменной.

Дизасм в MACRO-11

За пару недель я получил дизассемблированный исходник игры на MACRO-11, который при компиляции давал исполнимый файл, совпадающий до байта с оригиналом. С самого начала было понятно, что оригинал написан на Паскале ДВК (судя по блоку сообщений Паскаля). Я определил начало паскалевских процедур/функций, отделил данные от кода, определил назначение части переменных игры. Эта работа была проделана с середины марта по начало апреля 2021 года.

Восстановление кода на Паскале

Используя код на MACRO-11 как основу, я стал восстанавливать код на Паскале ДВК (этот вариант Паскаля основан на OMSI Pascal). В результате компиляции с Паскаля, получается файл на MACRO-11, который затем компилируется и линкуется обычными средствами RT-11 – через MACRO и LINK.

Я продолжал комментировать код игры на ассемблере, выделял в нём паттерны паскалевских конструкций, и параллельно выписывал исходник на Паскале, компилируя и проверяя, что код получается именно таким, как в бинарнике игры. В целом конечно это была довольно большая работа, в которой мне сильно помогли участники форума zx-pk.ru, особенно Алексей Кислый (Alex_K). Мы узнали для себя много нового об этом варианте Паскаля, в том числе вещи, выходящие за стандартную документацию – например, использование конструкции GOTO.

В итоге мне удалось получить исходный код на Паскале ДВК, полностью «идентичный натуральному», но для этого пришлось ещё написать отдельную программу-«патчер» строк на C#. Дело в том, что использованный мной бинарный файл «оригинала» игры был сильно изменён – строки были переведены в 8-битную кодировку КОИ-8. Но Паскаль ДВК может работать только с 7-битной кодировкой КОИ-7. Поэтому, я компилировал паскалевский код в .MAC-файл, который затем патчил, и уже патченный файл проходил дальнейшую компиляцию.

В конце концов, бинарник, получаемый мной при компиляции с Паскаля, стал отличатся от «оригинала» всего на один байт в заголовке файла, что в общем доказывало, что паскалевский исходник полностью соответствует тому, что было в оригинале. Эту работу я завершил 17 апреля 2021 года.

Веб-версия игры на HTML/JavaScript

Запустить веб-версию STALK