09-05-2010
Как все начиналось

Уже больше года назад, увидела свет первая публичная версия 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’ом в том смысле, что мне нравилась объектная ориентированность языка. Кроме того, я был в то время «фанатичным» и последовательным Linux’оидом, а данные платформы изначально были написаны для 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 и попробовал нарисовать картинку для первой сцены. Просто сделал набросок, как мог… Посмотрев результат в игре я понял, что нужно рисовать дальше…

Альфа версия INSTEAD

Я осознавал, что я не художник, и поэтому я решил обратить этот недостаток в достоинство, выбрав в качестве иллюстраций простые наброски… Подтверждение того, что идея может сработать, я обнаружил в детской книге про медвежонка Паддингтона, которую я купил для своей дочки, и в которой было полно подобных простеньких рисунков. Они смотрелись вполне гармонично, не смотря на примитивизм, и даже обладали каким-то своим шармом. Я стал рисовать и игра, по мере заполнения её простыми черно-белыми набросками, стала походить на книжку с авторскими (какими они, собственно, и являлись) рисунками. В некоторых случаях я брал фотографии и стилизовал их под наброски, сначала выделяя границы в gimp, а затем прорисовывая и корректируя их руками.

Для этого использовалась следующая нехитрая техника:

  1. Создать копию слоя.
  2. На верхнем слое: инвертировать цвет.
  3. Гауссовое размытие верхнего слоя.
  4. 50% прозрачности верхнего слоя.
  5. Объеденить видимые слои.
  6. Порог.
  7. Ручная работа.

Первоначально я не собирался рисовать картинку для каждой сцены, но рисование так сильно меня захватило, что в некоторых случаях я рисовал даже по нескольку кадров на сцену — добиваясь эффекта простой анимации.

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

В конце встал вопрос по поводу оформления интерфейса моей первой игры. Для рисования графических элементов я использовал Inkscape, который успел полюбить при разработке прошлой SDL игры — Color Lines. Основной проблемой стал подбор удачной подложки под текст и графику. Изначально я думал использовать просто белый фон, да и картинки были нарисованы с учётом белого фона. Но посидев пару часов со своим другом Сергеем, была выбрана подложка в виде старой книжной страницы для текста и ещё одна замысловатая текстура — для подложки под инвентарь. Правда возникла проблема — наброски были нарисованы на белом фоне и просто так рисовать их поверх текстуры было нельзя. Но, как оказалось, в gimp это решалось очень просто — переводом слоя в альфа-канал. (Слой->Прозрачность->Цвет в альфа-канал). Результат нам очень понравился.

Звук

Примерно в это время команда с websound.ru выпустила диск ремэйков олдскул треков — reTracked #2 (http://retracked.org). Закачав его в свою 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 (http://instead.googlecode.com), и на всякий случай — на sourceforge. Потом, несколько человек писали мне в jabber и я исправил несколько ошибок в движке.

Что дальше?

Instead — так я назвал платформу, легко собирается в Unix среде, например, практически без изменений он собрался для Nokia N8XX, но все-еще не собран для Windows пользователей. Я думаю, что рано или поздно версия для Windows должна появиться, но пока её нет. Что касается развития платформы, то я придерживаюсь той мысли, что платформа это средство, а не цель. Главное — это интересная история. Движок — всего лишь способ запустить игру. Если найдутся люди, которые напишут что-нибудь на instead, и потребуется расширение возможностей движка — они будут расширены.

И хотя у меня нет сильных иллюзий на этот счет, кто знает, может быть вы недавно купили планшет и часто задумываетесь о чем-то, когда едете в метро?

До встречи,
Peter Kosyh в 12:58