Автор: Пётр Косых
Ссылка:
http://ifprint.org/articles/insteadstory/
От редактора: В этой статье Петр Косых, создатель INSTEAD, известной платформы для текстовых и 2D игр, рассказывает о том, как появилась на свет эта платформа. Данная статья публиковалась раньше на сайте INSTEAD, в нашем журнале выходит ее дополненная редакция.
Почти 5 лет назад, увидела свет первая публичная версия INSTEAD и первая же игра под него — «Возвращение квантового кота». В то же время я написал статью в электронный журнал LGT о том, как создавался движок…
Стать режиссёром
Кто из нас не ставил себя на место режиссёра или писателя после просмотра захватывающего фильма или чтения полюбившейся книги? Подобрать актеров. Продумать сюжет. Сделать все так, как кажется правильным. Что касается меня, то я всегда мечтал написать свою историю. В эпоху постмодернизма большинство сюжетов — это циничные (хотя и изысканные) истории. Я хорошо помню чувство разочарования, когда мы с другом выходили из кинотеатра, посмотрев только что вышедшие новые «Звездные Войны». Я же всегда хотел написать историю, в которой бы смешались романтика и фантастика. Я хотел создать «классическую» историю. Но я не был режиссёром, не был писателем, я был программистом.
Еще учась в институте мы с моим другом, воспитанные лучшими квестами Lucas Arts, пытались написать свой графический квест, но как это часто бывает нам не хватило мотивации да и терпения… Я писал тогда на смеси ассемблера и C. В результате не был написан даже движок.
Несколько лет назад, уже работая с Linux, я узнал о таком старом жанре компьютерных игр, как Interactive Fiction (интерактивная литература). Было похоже, что это то, что нужно! Днем рождения жанра считается 1975 год, когда Уилл Кроутер написал первый текстовый квест, Adventure. В этом квесте общение с игроком осуществлялось посредством ввода и вывода текстовой информации. Эта особенность и стала ключевой для игр жанра IF. Многие IF-игры очень похожи на книги. Кроме того, так как вывод игры представляет собой текст, автор не обязан быть художником, и создание IF игры в целом гораздо проще создания графического квеста в стиле 90х. При этом, как и в случае интересной книги, сюжет определяет все. Фактически, написание такой игры — это написание сценария, огромный простор для творчества, причем посильный для одного человека.
На данный момент самыми популярными и старыми платформами для создания IF игр являются TADS и Inform. Для своего первого квеста я выбрал Inform. Но тут возникла сложность — русский язык гораздо тяжелее анализировать (парсить). К счастью, на тот момент Денисом Гаевым уже была сделана русификация Inform компилятора, и я начал писать пробную историю на Inform.
Inform был удивителен! Я понял, что применение объектно-ориентированного подхода в программировании объектов реального мира — захватывающая и творческая задача. Помню, как программировал поведение лифта, имитируя его движения с этажа на этаж, раскрытие дверей, состояние кнопок… Через несколько дней я дал попробовать то, что получалось, коллегам по работе и сделал следующие неутешительные выводы:
* Фанатов IF в ее чистом виде крайне мало. Независимо от того, как я отношусь к своему творению, в мою игру вряд-ли кто-то будет играть.
* IF литература на русском в следствии богатства русского языка сложна не только для автора, но и, что важнее, для игрока.
Русский Inform был отложен. Но я все еще хотел написать свой квест.
Первая попытка
Состояние жанра IF в Росии далеко от того, чтобы вызывать оптимизм. Тем не менее существуют проекты, которые, являясь платформами для IF-игр, не реализуют парсерный ввод. В качестве примеров можно привести платформы URQ и QSP. Игры на этих платформах относят к так называемому «менюшному» типу, когда пользователь фактически выбирает варианты действий, хотя вывод игры по-прежнему является текстом. Графика и звуки тоже могут поддерживаться движком, но они скорее дополнение — как иллюстрации в книге.
Потратив некоторое время на изучение существующих движков, я понял, что они не подходят. Я уже был «испорчен» Inform в том смысле, что мне нравилась объектная ориентированность языка. Кроме того, я был в то время «фанатичным» и последовательным «линуксоидом», а данные платформы изначально были написаны для DOS и Windows. Качество существующих квестов под эти платформы меня тоже не удовлетворило, особенно, в сравнении с английскими аналогами. В итоге я начал продумывать свой движок.
В качестве языка я сначала планировал использовать какой-нибудь простой BASIC-подобный скриптовый язык, но как-то наткнулся на Lua и был поражён его простотой, расширяемостью и лёгкостью его встраивания в C. И я просто начал писать движок на Lua.
В качестве идеи была выбрана следующая модель:
Внутри мир игры является объектно-ориентированным. Что-то вроде упрощённого Inform.
Диалоги должны выглядеть в стиле квестов 90-х. Вообще диалоги всегда были одной из любимых особенностей графических квестов.
Игра по своему геймплею должна выглядеть так же, как квесты 90-х в том смысле, что единственным отличием является текстовый вывод, но в остальном движок ни чем не ограничен, и игровой процесс более динамичен, чем в классических IF играх.
Схема взаимодействий объектов выбрана примерно такая, как она сделана в игре «Goblins» — игрок выбирает мышкой объект или действует объектом на другой объект — тоже мышкой, щелкая по словам, представляющим объекты. Также игрок может переходить с локации на локацию, щёлкая по названиям локаций.
Первоначальная версия движка на Lua оказалась очень простой — несколько сотен строк. Кроме того движок писался одновременно с игрой — я просто включал в движок все то, что упрощало код игры. Так родилась тестовая версия квеста о сотрудниках института, в котором я работал, и об их борьбе со злом. Движок, как я уже сказал, представлял собой просто скрипт на Lua. Взаимодействие с движком осуществлялось через стандартный ввод/вывод. Это позволило реализовать графический интерфейс просто как надстройку, написанную на TCL/TK. Это был unix way — очень просто. Выглядело, конечно, грубовато, но в качестве концепта годилось. Весь проект — чуть больше 1000 строк, не считая 2000 строк самой игры.
Идея графического интерфейса была предельно проста. Слева — текст с игрой. Справа — столбец с объектами инвентаря. Кликая мышкой, можно было взаимодействовать с объектами и комбинировать их.
Квест я отдал на тестирование друзьям и знакомым, и по их отзывам понял, что, в общем, у меня получилось почти то, что я хотел. После этого я забросил это занятие еще на год.
Обратно в 80-е
Все это время в моем подсознании зрела мысль, что квест еще не написан, а движок — не идеален… Я прочитал документацию по Lua еще раз и понял что все, что я написал, — это хлам. К счастью, хлама было не много, и я переписал движок с чистого листа, учитывая ошибки и узкие места игры-концепта. На этот раз получилось около полутора тысяч строк на Lua, все еще достаточно просто и гораздо проще (и, надеюсь, довольно гибко), чем существующие «менюшные» движки. И вот, дописывая движок, меня прорвало — я начал писать свой «первый» настоящий квест о хакере дауншифтире и парадоксах квантовой механики. Как и в случае с концептом, движок дорабатывался во время написания игры. В отличие от игры-концепта я изначально планировал консольное, а не графическое управление игрой. С одной стороны, это добавляло шарма и сближало игру с классическими IF играми, с другой стороны — использование библиотеки readline делало управление игрой довольно комфортной.
В качестве ноу-хау была использована идея сокращений, то есть, например, набрав команду «g» (идти) и нажав табуляцию, игрок получал список возможных локаций, с каждой из которых связан номер. Игрок мог набрать часть имени локации и нажать табуляцию, или же он мог набрать номер локации и нажать табуляцию. Такой принцип был использован везде.
Игру я писал «запоем» около месяца, и когда, наконец, она была готова, я с трепетом отдал ее знакомым друзьям-программистам.
Игру встретили хорошо, пару недель мы отлавливали ошибки и шероховатости в игровых ситуациях, и потом я попытался подсунуть игру жене. Это был провал. Текстовый ввод — то, что мне представлялось достоинством — оказалось непреодолимым барьером.
Поэтому, я не стал выкладывать игру в открытый доступ и просто отложил её на неопределённое время.
Графика
Не знаю, как пришла идея сделать игру похожей на визуальную новеллу. Наверное, это стало следствием понимания необходимости написания для игры графического интерфейса. Интерфейс TCL/TK, конечно, не тянул на то, чтобы стать основным, и я начал писать библиотеку для отрисовки текста на основе SDL. Идея была в том, чтобы написать среду для запуска игр, созданных для движка, с возможностью менять вид интерфейса в зависимости от игры. Кроме того, после изучения некоторых движков, в том числе и движка для визуальных новелл, я решил, что такая среда должна быть очень простой.
Написав основу, я ради интереса попробовал вставить произвольную картинку на первую страницу игры, над текстом описания сцены и… понял, что у меня получается новая игра. Тогда я не выдержал и достал свой недорогой планшет Wacom Graphire, когда-то купленный мной для обработки фотографий и благополучно забытый, запустил Gimp и попробовал нарисовать картинку для первой сцены. Просто сделал набросок, как мог… Посмотрев результат в игре я понял, что нужно рисовать дальше…
Я осознавал, что я не художник, и поэтому я решил обратить этот недостаток в достоинство, выбрав в качестве иллюстраций простые наброски… Подтверждение того, что идея может сработать, я обнаружил в детской книге про медвежонка Паддингтона, которую я купил для своей дочки, и в которой было полно подобных простеньких рисунков. Они смотрелись вполне гармонично, несмотря на примитивизм, и даже обладали каким-то своим шармом. Я стал рисовать, и игра, по мере заполнения её простыми черно-белыми набросками, стала походить на книжку с авторскими (какими они, собственно, и являлись) рисунками. В некоторых случаях я брал фотографии и стилизовывал их под наброски, сначала выделяя границы в Gimp, а затем прорисовывая и корректируя их руками.
Для этого использовалась следующая нехитрая техника:
1. Создать копию слоя.
2. На верхнем слое: инвертировать цвет.
3. Гауссовое размытие верхнего слоя.
4. 50% прозрачности верхнего слоя.
5. Объеденить видимые слои.
6. Порог.
7. Ручная работа.
Первоначально я не собирался рисовать картинку для каждой сцены, но рисование так сильно меня захватило, что в некоторых случаях я рисовал даже по нескольку кадров на сцену — добиваясь эффекта простой анимации.
Параллельно шла работа над графической средой, которая действительно оказалась довольно простой в реализации. Всего менее четырех с половиной тысяч строк кода на C. Это было гораздо проще всего того, что я видел.
В конце встал вопрос по поводу оформления интерфейса моей первой игры. Для рисования графических элементов я использовал Inkscape, который успел полюбить при разработке прошлой SDL игры — Color Lines. Основной проблемой стал подбор удачной подложки под текст и графику. Изначально я думал использовать просто белый фон, да и картинки были нарисованы с учётом белого фона. Но посидев пару часов со своим другом Сергеем, была выбрана подложка в виде старой книжной страницы для текста и ещё одна замысловатая текстура — для подложки под инвентарь. Правда возникла проблема — наброски были нарисованы на белом фоне и просто так рисовать их поверх текстуры было нельзя. Но, как оказалось, в Gimp это решалось очень просто — переводом слоя в альфа-канал. (Слой→Прозрачность→Цвет в альфа-канал). Результат нам очень понравился.
Звук
Примерно в это время команда с websound.ru выпустила диск ремэйков «олдскульных» треков — reTracked #2. Закачав его в свою Nokia N800, я был очарован композицией Liberty. Я и раньше подумывал о звуковом сопровождении игры, но теперь я знал точно, что будет играть в последней сцене.
Итак, для музыкального сопровождения я искал старые «олдскульные» модули и пытался осмысленно их распределить по эпизодам моей первой истории. Со стороны движка никаких сложностей не было, библиотека SDL-mixer умеет играть модули практически всех форматов.
Эффект LOR
Несколько недель я дорисовывал графику, подбирал музыку и проходил снова и снова свой квест, пока мне не начало казаться, что это груда хлама. И тогда я понял, что пора ставить точку. Я хотел, чтобы в мою игру поиграли люди.
Небольшое сообщество, собранное вокруг IF игр в России это в основном Windows пользователи, и я собирался попросить кого-нибудь портировать мою игрушку под эту систему — сам я не использовал Windows с тех пор, как перестал под неё программировать. Теоретически, процесс обещал быть простым. SDL и Lua — кросс-платформенные вещи и давно собраны для Windows. Но так вышло, что единственный знакомый мне Windows-программист (кстати, он же портировал «Color Lines») был занят другими делами и я, сделав «тарболл», просто выложил его на страничку, быстро созданную на Google Sites. Потом я кинул ссылку на linux.org.ru и уехал домой.
Результат меня поразил. Посетители linux.org.ru пробовали мою игру, и она им нравилась! Вы должны знать особенности данного ресурса, чтобы понять, что это означало для меня. Фактически, не было ни одного негативного отзыва. Люди играли в мою игру! Конечно, играли те, кто так или иначе был знаком с жанром, но все-таки это оказалось для меня неожиданностью. В результате превышения трафика (я так и не нашел информации, какая именно граница считается у них лимитирующей) Google Sites временно отключил мою страничку, и мне пришлось переносить проект в Google Code, и на всякий случай — на SourceForge. Потом несколько человек писали мне в Jabber, и я исправил пару ошибок в движке.
Что было дальше?
Первую редакцию своей статьи я закончил такими словами: «Что касается развития платформы, то я придерживаюсь той мысли, что платформа — это средство, а не цель. Главное — это интересная история. Движок — всего лишь способ запустить игру. Если найдутся люди, которые напишут что-нибудь на INSTEAD, и потребуется расширение возможностей движка — они будут расширены»
Сейчас, оглядываясь назад, я понимаю, что вряд ли мог предполагать, что мой небольшой проект выльется в то, чем он стал сейчас.
Изначально INSTEAD (так я назвал свой движок 5 лет назад) собирался только в Unix среде. Потом мой знакомый собрал первую версию для Windows, которая поначалу имела множество недостатков, но работала! Вокруг проекта стали собираться люди, многие из которых вложили в него свое время и творческие силы. Вот некоторые из них:
* Вадим Балашов начал портировать квесты с ZX спектрум. Без него не было бы поддержки анимированных GIF и глагольного меню. А также многих других фич, которые появлялись, когда ему что-то не хватало в движке;
* Александр Соборов (excelenter) — автор многих музыкальных треков, создатель обучающей игры, поддержка Wiki, основатель Jabber конференции и держатель доменного имени instead-games.ru;
* Андрей Лобанов (spline1986) — неофициальный репозиторий instead-games.ru;
* Егор Харват — флеш версия INSTEAD, первый неофициальный репозиторий;
* Алексей Махно — автор порта для Android;
* .dm бессменный автор Mac OS X порта;
* Илья Рындин — первый порт под Windows, первоначальный хостинг форума;
* Василий Воронков — идея IFprint.org, автор игры «Переход».
И многие другие, кто писал и пишет игры или помогает проекту. А также те, кто просто любит наши другие игры. :)
INSTEAD попал в некоторые дистрибутивы Linux и находится в портах FreeBSD.
Сейчас для выпусков INSTEAD я использую систему сборки, состоящую из нескольких виртуальных машин и скриптов, автоматизирующих этот процесс, так как количество поддерживаемых платформ значительно увеличилось, и сборка вручную отнимала бы слишком много времени. Объем исходного кода движка возрос в несколько раз. Написана нормальная актуальная документация для разработчиков. Продолжают появляться хорошие игры. INSTEAD научился запускать квесты из «Космических Рейнджеров» и многие URQ игры. В нем появились функции простого 2D движка.
В общем за прошедшее время INSTEAD заметно «вырос», пройдя путь от игры-эксперимента к довольно большому проекту с открытым кодом. Почему так получилось? Помогла ли ему в этом удачно выбранная архитектура, открытая модель разработки или что то-еще? Не знаю, но мне хочется верить, что в проект вложено что-то такое, что привлекло и продолжает привлекать творческих людей. Нечто такое, что заставляет и меня самого заниматься движком с тем же интересом, что и раньше.
Я не знаю, что это, но время от времени я вспоминаю, как все начиналось, и мне снова хочется повторить те слова, которыми заканчивалась та первая статья:
«И хотя у меня нет сильных иллюзий на этот счет, кто знает, может быть вы недавно купили планшет и часто задумываетесь о чем-то, когда едете в метро?»