Компьютерные игры существуют почти столько же, сколько и сами компьютеры. Хотя в это трудно поверить, текстовая адвенчура Zork была Fortnite-ом своего времени. Но Zork был ещё и чем-то большим. Ради портируемости и экономии пространства сам Zork был написан на Zork Implementation Language (ZIL), в котором активно использовалась совершенно новая на тот момент концепция объектно-ориентированного программирования, и выполнялся в виртуальной машине. И всё это происходило в 1979 году. Разработчики использовали всевозможные хитрости, чтобы уместить как можно бОльшую часть Подземной империи в компьютеры, имевшие всего 32 КБ ОЗУ. Однако Zork стал не только технологическим прорывом, но и большой вехой в истории компьютерных игр. При этом возник он не на пустом месте.
Модуль Flip Chip компьютера DEC PDP-10
Компьютерная революция началась во время Второй мировой войны, а в 50-е и 60-е и не думала останавливаться. В продаже появлялись всё более доступные компьютерные системы, предназначенные для компаний и университетов. Лаборатории вычислительных наук (Laboratory for Computer Science, LCS) Массачусетского технологического института (MIT) повезло иметь отношение к агентству ARPA, предоставившему LCS и Лаборатории искусственного интеллекта MIT (раньше являвшегося частью Project MAC) доступ к значительным вычислительным ресурсам, в основном представленным системами DEC PDP.
В результате студенты Группы динамического моделирования MIT (Dynamic Modeling Group, части LCS) получили доступ к мейнфрейму PDP-10 KA10 — мощнейшей машине того времени. Хотя этот конкретный PDP-10 представлял собой первоначальную модель 1968 года с дискретными транзисторными модулями Flip Chip и монтажом накруткой, он был сильно модифицирован: в него добавили поддержку виртуальной памяти и страниц памяти для расширения изначальных 1 152 КБ памяти ядра.
Компьютер, работавший под управлением разработанной в MIT ОС Incompatible Timesharing System (ITS), был весьма функциональной многопользовательской системой.
Естественно, в основном его использовали, чтобы играть в игры.
Вы готовы к приключениям?
Весной 1977 года в MIT появилась игра под названием Colossal Cave Adventure (или сокращённо «Adventure»). Эта игра стала первой компьютерной игрой в жанре interactive fiction, позволяющей игроку отправиться в текстовое путешествие по большой системе пещер, которая, по слухам, была набита сокровищами. Почти как в книгах «Выбери себе приключение», игрок делает свой выбор, который перемещает его по комнатам пещеры, а в результате или обнаруживает сокровище и сбегает, или встречает свою безвременную кончину.
Вдохновлённая этой игрой группа студентов LCS поняла, что сможет превзойти этот разработанный в Стэнфорде проект. Основным слабым местом Adventure оказалось то, что она была написана на FORTRAN — языке, который не славился хорошей работой с динамическим текстом, особенно для нужд игры жанра interactive fiction. По сути, Adventure была целиком жёстко прописанной в коде, что ограничивало гибкость и усложняло расширяемость и поддержку игры.
В Adventure каждая комната имела числовой ID, с которым было связано описание, находящееся в таблице. Ещё одна таблица задавала её короткое описание. В другой таблице при помощи числовых ID перечислялось расположение комнат относительно других комнат. Это значило, что для добавления комнаты пришлось бы вручную отредактировать все эти таблицы и быть аккуратным, чтобы не вызвать проблем этими изменениями.
Конкуренция хакеров
Воспользовавшись опытом работы с естественными языками имевшимся тогда в лабораториях LCS и AI, Дейв Леблинг впервые написал простой парсер и заложил фундамент игрового движка, похожего на движок Adventure. Для этого он применил производный от LISP язык программирования MDL. Благодаря сильным возможностям обработки естественного языка Марк Бланк, Брюс Дэниелс и Тип Андерсон создали на основе работы Леблинга create — первую игру-прототип, которая со временем превратилась в то, что мы сегодня называем «Zork».
Совершённая Zork революция заключалась в том, что он, в отличие от простых команд Adventure (в которой LAMP GET и GET LAMP были эквивалентными), благодаря превосходным функциям MDL по обработке естественного языка мог справляться с целыми предложениями. Он мог обрабатывать полные предложения и даже несколько предложений (команд), объединённых в одно предложение. Наличие сильного парсера в сочетании с лёгкостью моделирования новых комнат на MDL в объектно-ориентированном стиле означало, что после написания парсера и движка игры мир можно было расширять практически неограниченно.
Комната в Zork могла задаваться при помощи такого простого фрагмента кода:
<ROOM "WHOUS"
"This is an open field west of a white house, with a boarded front door."
"West of House"
<EXIT "NORTH" "NHOUS" "SOUTH" "SHOUS" "WEST" "FORE1" "EAST" #NEXIT "The door is locked, and there is evidently no key.">
(<GET-OBJ "FDOOR"> <GET-OBJ "MAILB"> <GET-OBJ "MAT">)
<>
<+ ,RLANDBIT ,RLIGHTBIT ,RNWALLBIT ,RSACREDBIT>
(RGLOBAL ,HOUSEBIT)>
Так задаётся «белый дом» из начала игры, а также выходы из этой комнаты, особые свойства выходов (например, запертая дверь) и объекты в комнате. Это гарантирует, что все свойства комнаты, включая её описание, краткое описание, свойства и метки, будут находиться в одном месте. Движок игры тогда сможет переключать отдельные метки (биты) комнат, храня центральную базу данных всех комнат и их текущего состояния. Управление соединениями комнат во время создания дизайна игры выполняется при помощи их названий, а не числовых ID в таблице.
Громкий хит
Достаточно будет сказать, что Zork был абсолютно фантастическим на мейнфреймах. По просьбам других заинтересовавшихся геймеров его портировали по гораздо более распространённую ОС DEC TOPS-20 для PDP-10. Хотя разработчики Zork были так щедры, что раздавали его бесплатно, распространяли они зашифрованную версию только для чтения. Они даже хранили исходный код Zork в защищённой папке на мейнфрейме ITS, для чего им пришлось пропатчить полностью открытую и незащищённую ОС мейнфрейма ITS.
На этом этапе истории компьютеров в мире их всё ещё было довольно мало. Концепция домашнего компьютера только начинала зарождаться: в 1977 году появились такие компьютеры, как TRS-80 и Apple II, однако даже эта система была невероятно ограниченной по сравнению с мейнфреймами, на которых в то время играли в текстовые адвенчуры студенты США. Мысль о портировании на домашние компьютеры игры наподобие Zork — исполняемого файла размером 1 МБ — казалась сильно преждевременной.
Пока домашние компьютеры всё ещё были редки, концепция продажи ПО обычным потребителям тоже оставалась новой. Это было время, когда в рознице только что появилась Atari 2600, начав второе поколение игровых консолей, на которых при помощи вставляемых картриджей можно было играть не только в одну игру. Это был новый рынок, ставивший перед студентами MIT, Стэнфорда и других учебных заведений множество вопросов о противопоставлении хакерской культуры миру коммерческого ПО. Некоторые, например, Ричард Столлман, не изменили своих убеждений со времён студенчества в MIT.
Когда разработчики Zork выпускались из института, они осознали, что успех игры находится в их руках: у них был шанс коммерциализировать её, направить свою жизнь и карьеру в совершенно новом относительно их первоначальных целей направлении. Так, почти без малейших помех, 22 июня 1979 года была основана компания Infocom.
Теперь нам достаточно просто её портировать
В процессе переноса Zork с мейнфреймных систем PDP-10 на маленькие домашние компьютеры оставался только один небольшой нюанс: на тот момент у Infocom не было ничего, что можно было продать. Разработчики придумали различные идеи игр, которые можно было адаптировать для работы на домашних компьютерах, но главная ценность заключалась в портировании Zork. Им только нужно было решить проблему преобразования 1 мегабайта кода игры на MDL в микрокомпьютеры с 32 КБ ОЗУ (или даже меньше) и крошечными накопителями.
Кроме того, им не хотелось портировать игру по отдельности на TRS-80, Apple II, а потом и на новые системы. Что если попробовать использовать уже существующий код на MDL? Это стало началом разработки того, что вскоре станет известно под названием Z-Machine.
Разумеется, сначала они захотели решить проблему совместимости Zork с микрокомпьютерами, уменьшив игру при помощи удаления контента. Вырезав очень многое, им удалось приблизиться к размеру Adventure. Затем нечто подобное они проделали с MDL, удалив все возможности, которые не требовались Zork. Так получился Zork Implementation Language (ZIL), на который они могли легко портировать Zork с MDL. После этого компилятор ZIL мог создавать гораздо меньшие по размеру исполняемые файлы, чем компилятор MDL.
Взглянув на описание латунного фонаря Zork на ZIL, мы можем увидеть, что он читается легче, чем MDL:
<OBJECT LANTERN
(LOC LIVING-ROOM)
(SYNONYM LAMP LANTERN LIGHT)
(ADJECTIVE BRASS)
(DESC "brass lantern")
(FLAGS TAKEBIT LIGHTBIT)
(ACTION LANTERN-F)
(FDESC "A battery-powered lantern is on the trophy
case.")
(LDESC "There is a brass lantern (battery-powered)
here.")
(SIZE 15)>
Это конечно было замечательно, но всё равно не позволяло запустить Zork на TRS-80. Разумеется, на этом этапе они могли написать компилятор ZIL для каждой платформы, а также исполняемый файл ZIL, чтобы потом потратить кучу времени, настраивая каждую игру на каждой целевой платформе. Но вместо этого они решили написать виртуальную машину: Z-Machine. По сути, она являлась идеальной платформой для текстовых игр-адвенчур, напрямую поддерживающей двоичные файлы ZIL, а также реализовавшей множество оптимизаций, самой важной из которых стало упаковывание символов в 5 бит, что напоминало код Бодо.
Благодаря всем этим оптимизациям, виртуальной машине и собственному языку программирования им удалось поместить урезанный мир Zork I всего в 77-килобайтный «файл истории» вместе с интерпретатором (виртуальной машиной). Поскольку это всё равно было больше, чем 32 КБ памяти популярных тогда компьютеров, в виртуальной машине была реализована система виртуальной памяти, при которой в ОЗУ загружались только динамические данные (переменные), а все статические данные (текст) считывались при необходимости с гибкого диска.
Вперёд в будущее
Гибкие диски Apple II имели размер 140 КБ, а диски TRS-80 — 180 КБ, то есть проблема с пространством была решена. Под целевую платформу нужно было оптимизировать только интерпретатор, и это значило, что в будущем тот же интерпретатор можно будет использовать во всех играх, выпускаемых Infocom, без необходимости портирования под отдельные платформы. У них оставалось ещё много контента, вырезанного из мейнфреймной версии Zork. Они были готовы к сиквелу.
После коммерческого успеха Zork I разработчики продолжили выпускать части, вырезанные из оригинальной мейнфреймной версии, в виде Zork II и Zork III. Год за годом продажи Zork I продолжали расти, и он стал обязательной для покупки игрой, часто поставлявшейся в комплекте с новыми системами. Были разработаны новые версии Z-Machine, в которых были добавлены новые функции для ещё более сложных игр. Сегодня мы по-прежнему можем наслаждаться играми Infocom, не беспокоясь о проблемах с совместимостью: были опубликованы исходники Zork на MDL, а также исходный код других классических игр Infocom. Если вы давно или вообще никогда не играли в Zork, то попробуйте, а затем загляните, что происходит у игры «внутри». Можно без малейшей натяжки сказать, что группа хакеров из университетов США 1970-х с большой вероятностью определила будущее мира видеоигр и интерактивного повествования.