Wander: забытые истоки IF

Введение


Любой поклонник интерактивной литературы знает, что начало жанру положила знаменитая Colossal Cave Adventure (1975). Конечно же текстовые игры на мэйнфреймах существовали и до нее. Можно вспомнить, например, Highnoon (1970) или The Oregon Trail (1971). Тем не менее, их сложно назвать текстовыми приключениями в классическом смысле. И вот сейчас, похоже, пришла пора внести некоторые коррективы в известную нам историю жанра. Речь пойдет о системе для создания «недетерминированных фантастических сюжетов» под названием Wander.



Питер Лэнгстон


Это имя хорошо знакомо специалистам по истории компьютерных игр. Лэнгстон — человек незаурядный и обладает многими талантами: UNIX-хакер (в классической интерпретации этого слова), профессиональный музыкант и, конечно же, разработчик знаменитых компьютерных игр. C середины 70-х он начал бесплатно рассылать сборник игр собственного сочинения под названием «PSL Games Tape» (среди которых была, например, известная Empire) на магнитной ленте по всему миру. Неудивительно, что именно Лэнгстону не кто иной, как Эд Кэтмелл (нынешний президент Pixar Animation Studios) предложил возглавить еще не сформированный на тот момент отдел в Lucasfilm по созданию компьютерных игр. С этого момента началась славная история Lucasfilm Games, но об этом как-нибудь в другой раз. Сейчас важно, что в той «магнитной коллекции» из 70-х была и Wander.

Система Wander


Первую версию Wander автор реализовал на языке HP Basic еще в 1973 году. Затем, в 1974, система была переписана на Си под UNIX. В интернете доступен архив с Wander более поздней версии, он датирован 1978 годом. Что же содержит этот архив?

В нем можно обнаружить интерпретатор игровых сюжетов в виде объектного файла, а также три игры-приключения в текстовом формате. Одна из таких игр, Library, происходит в мире постапокалипсиса, в руинах библиотеки, где имеются сокровища и разнообразные опасности. Встречающиеся в игре комнаты, посвященные Муркоку, Андрэ Нортон и Дюне напоминают о популярной фантастике того времени. Еще одна игра из архива, Aldebaran III, представляет собой своеобразный фанфик на произведения Кейта Лаумера, еще одного известного фантаста. По сюжету третьей игры, Castle, герой проваливается в сказочный мир сквозь экран телевизора.

Хотя эти игры и представляют известный интерес, более существенно в историческом отношении, что они написаны на удобном скриптовом языке с использованием инструментария Wander, созданном еще до выхода знаменитой ADVENT. Игры разбиваются на два файла: файл с общеигровой информацией (вводный текст, синонимы, начальные позиции объектов, состояния переменных, глобальные действия) и файл с локациями (в нем задаются локальные действия и описания). Любопытно, что выбор действий в Wander задается с помощью высокоуровневого механизма сопоставления с образцом. Далее разбирается код одной из игровых локаций.

Пример кода


#1      Aldebaran III Spaceport
You're in the Aldebaran III spaceport.  An electrified chain link fence
surrounds the area with gates leading west and south.
     south   2
     west    100
     north|east|ne|nw|se|sw  m="ZZZAAAAPPPP!       OUCH!"
     take\ card  o?card  t+card  m="\
Done
Your account has 50 credits left.
(You can type "balance" any time to find current status)."
     drop\ card  t?card  o+card@101  m="\
Done
A southeast wind blows your credit card over the fence."
     drop\ papers  t?papers  o+papers@2  m="\
Done
A brisk north wind blows your identity papers away."


В первой строке указан номер локации (по этому номеру в нее можно вернуться) и краткое описание. Далее идет подробное описание. Остальные строки представляют собой правила, где описываются действия и их результаты. Правила «south 2» и «west 100» означают, что если пользователь ввел «south», то следует перейти в локацию 2, а если же было введено «west», то переход осуществляется в локацию с номером 100. Если были введены прочие стороны света (они задаются единообразно с помощью оператора альтернативы), выдается сообщение. Если пользователь ввел «take card» и объект «card» находится в данной локации, то забираем его и выдаем сообщение. При вводе «drop card» и наличии самой карты она «улетает» в локацию 101. Наконец, при вводе «drop papers» и наличии этих самых бумаг они тоже «улетают», теперь в локацию с номером 2.

Выводы


Помимо очевидного исторического значения данная система может представлять некоторый интерес и для любопытствующих создателей IF-движков. Подробную документацию по Wander из архива 1978 года я перевел в html-формат, тексты доступны ниже. За первоначальную информацию о Wander я благодарю Virgil'а.

Ссылки


Wander (1974) — a lost mainframe game is found! ahopeful.wordpress.com/2015/04/22/wander-1974-a-lost-mainframe-game-is-found/

Wander (1974) release, and questions answered (тут же имеется ссылка на архив с Wander)
bluerenga.wordpress.com/2015/04/23/wander-1974-release-and-questions-answered/

Сайт Питера Лэнгстона www.langston.com/

Выдержка из книги Droidmaker: George Lucas And the Digital Revolution
www.gamasutra.com/features/20051221/Droidmaker.Ch18.pdf

Документация
sovietov.com/tmp/wander/wander.html
sovietov.com/tmp/wander/misc.html
sovietov.com/tmp/wander/wrld.html

4 комментария

avatar
Отличная статья.
avatar
Как ни крути, а на декларативном языке код получается чуть короче. В императивном стиле секция с переходом будет выглядеть немногим больше:
function walkTo (direction){
if(direction == "south") 
   player_move(4) 
elseif(direction == "west") 
   player_move(100) 
else
   message("ZAAP") 
}
Такой код кажется даже более понятным, самодокументированным. Да и порог вхождения в него поменьше: нет необходимости читать примеры со справочником по игровому API, выискивая, что это за четвертка или почему последняя строка записана через прямую черту.
Но для искушенного пользователя он выглядит избыточным — все что ему нужно, это по-быстрому задать три соответствия направление-комната. А приходится вбивать еще и это набившее оскомину обрамление.
Как вариант, можно использовать сниппеты — которые сгенерируют обрамление по заранее созданному шаблону. Если кто заинтересовался — вот немного о сниппетах под vim

За статью спасибо!
avatar
Буквально вчера я думал о том, что движки игр, как и языки программирования, бывают в той или иной степени декларативными/процедурными, императивными/функциональными, специализированными/универсальными.
Никакой особой глубины в этой мысли нет, но когда сравниваю разные движки (я немного знаю INSTEAD, читал документацию по URQ, и недавно заглядывал в ЯРИЛ, в коем документация отсутствует), невольно ловлю себя на мысли, что «вот примерно то же самое я видел в таком-то языке», или «а вот это похоже на такой-то язык программирования». Забавно.
avatar
Да, всё уже придумано до нас. Остаётся только копировать чужие идеи =)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.