Как я делал web-INSTEAD, и что из этого вышло. Часть II

Как я делал web-INSTEAD
Часть I

Что из этого вышло
   В настоящий момент веб-инстед представляет собой вполне зрелую систему, неплохо проигрывающую достаточно широкий класс инстед-игр. Конечно, в аркадные, динамические игры, наподобие Miner Bold или Lode runner, играть не получится, но ведь они и не относятся к интерактивной литературе, не правда ли? Веб-инстед на ставит перед собой задачу полного, детального копирования движка INSTEAD — это вряд ли возможно, да и не имеет большого смысла. Вместо этого брались и запускались конкретные игры. Причем, как и в случае с движком-прародителем, новый функционал добавлялся в движок постепенно, по мере необходимости для той или иной игры.
   Благодаря значительному количеству уже адаптированных игр, движок развился настолько, что как правило, обычные игры, не использующие какие-то особые технические хитрости, запускаются в вебе сразу, как есть, не требуя дополнительной доработки, кроме оформления визуальной темы игры (это обычный css-файл стиля). Однако, все же попадаются и игры, которые не могут быть запущены на веб-инстеде без некоторого изменения их кода. В качестве примера можно привести игры, которые используют часто срабатывающий таймер (скажем, каждую секунду) для управления фоновым процессом проигрывания музыки.
   Или возьмем метапарсер. Это одно из последних достижений веб-инстеда, ставшее возможным благодаря тому, что Peter доработал оригинальный модуль (мы видим процесс обратного влияния веб-движка на своего прародителя — INSTEAD). И хотя игра «Клара — расхитительница варенья», работающая на метапарсере, уже перенесена в веб, я вообще решил отказался от «парсерного» стиля ввода через командную строку, напротив, используя возможность метапарсера подсказывать допустимые для ввода слова, фактически превратив тем самым игру в «менюшную», которой можно управлять выбирая нужные действия мышкой.

Клара -- расхитительница варенья
   Дело в том, что для реализации веб-интерфеса был выбран подход, при котором весь код игры выполняется на сервере, а для конечного пользователя (игрока) передаются уже только готовые результаты выполнения. Это означает, что практически при каждом действии игрока на сервер передается информация о том, какую игровую команду инициировал игрок (нажал ли он на переход в другую локацию, перетащил ли он один объект на другой, и т. д.). Сервер, соответственно, на каждом ходу обрабатывает эту команду и возвращает в браузер игрока изменившиеся по сравнению с прошлым ходом части игрового поля — текст описания сцены, заголовок и изображение, набор предметов в инвентаре, список ссылок для переходов в соседние локации. Это кардинально отличается от более распространенного решения, когда весь код игры загружается в браузер и выполняется уже на клиенте без обращения к серверу (здесь можно посмотреть пример такой реализации для игры «Возвращение квантового кота»).
   Выбранный подход, конечно, имеет как сильные, так и слабые стороны. К недостатком веб-инстеда можно отнести некоторое снижение динамичности, и даже невозможность реализации некоторых возможностей, о которых уже упомяналось. Так, скажем, срабатывание таймера — это ведь тоже игровое событие, которое влечет обращение к серверу. Допустим, мы хотим сделать катсцену в виде статической страницы, которая через несколько секунд автоматически сменяется на другую сцену. В этом случае использование таймера вполне оправдано, и веб-инстед с этим неплохо справляется. Если же таймер непрерывно срабатывает каждую секунду, то из-за очень частого обновления страницы играть становится практически невозможно. Еще одним недостатком является необходимость иметь постоянное (причем, желательно быстрое) подключение к интернету. Нет возможности скачать игру и играть оффлайн.
   Однако, мне кажется, что плюсы клиент-серверной архитектуры заметно перевешивают её недостатки. Давайте вкратце рассмотрим сильные стороны системы. Какие уникальные возможности дает веб-инстед по сравнению с браузерными реализациями и даже по сравнению с оригинальным десктопным плеером? Я опишу их как со стороны игрока, так и с точки зрения автора — разработчика игр.
   Ну, прежде всего, это то, ради чего и задумывался веб-вариант — возможность в любой момент, не скачивая ни плеер, ни саму игру, мгновенно погрузиться в игровой процесс. Достаточно наличия браузера и подключения к интернету, что в современных реалиях имеется практически у каждого. Думаю, многим игрокам это весьма упростит жизнь. Однако, и для авторов это прекрасная возможнось популяризации своих игр — достаточно разместить ссылку «Играть онлайн» в своем блоге, на тематическом форуме или просто отправить знакомому в личном сообщении. Как уже многократно показал опыт, психологический барьер в таком случае гораздо ниже, а значит — больше игроков увидят и оценят вашу прекрасную игру.
   Другим немаловажным преимуществом по сравнению как с браузерными играми, так и с классическим десктопным INSTEAD является то, что можно играть в одну и ту же игру где угодно. Вы можете начать играть на работе (в обеденный перерыв, разумеется ;) ), а вечером дома продолжить понравившуюся игру ровно с того самого места, где прервались ранее. Не нужно ничего записывать «на флешку», чтобы перенести на другой компьютер. Не нужно даже нажимать «Сохранить». Игра всегда и везде готова к продолжению. Даже если неожиданно выключился свет и ваш компьютер аварийно отключился, это отныне не проблема — просто продолжите потом.
   Неплохим бонусом по сравнению с классическим INSTEAD является максимальная кроссплатформенность. Хотя INSTEAD уже портирован на ряд операционных систем, поддержание нескольких платформ требует дополнительных усилий. Как минимум, при обновлениях движка приходится тестировать новый функционал несколько раз. В веб-инстеде мы получаем кроссплатформенность сразу, как говорится «из коробки». Даже если появится новая операционная система, то при наличии в ней браузера, поддерживающего современные веб-стандарты, мы знаем, что наши игры будут работать и там. Прошли дикие времена, когда каждый браузер придумывал свои «финтифлюшки», и написание кода, одинаково хорошо работающего во всем зоопарке браузеров, включая пресловутый Internet Explorer, было реальной проблемой и непрекращающейся головной болью для разработчиков. Благодаря постепенной стандартизации современного веба, мы можем разрабатывать в одном браузере, будучи уверенными, что если и придется затем тюнинговать конечный продукт для других браузеров, то совсем незначительно.
   Пожалуй, остальные сильные стороны веб-инстеда больше касаются разработчиков игр. Забавно, что изначально-то планировались удобства как раз для игроков, но, каким-то непостижимым образом веб-инстед внес свои коррективы. Судите сами.
   Я никогда не разрабатывал игр под классический плеер. Пётр говорит, что там тоже удобно, и у меня нет причин ему не верить. Но когда я увидел, что в процессе игры я могу параллельно править ее текст, и все изменения кода тут же отображаются на экране (если они не настолько кардинальные, что игра стала несовместимой по формату файла сохранения), я был весьма приятно удивлен. Не требуется перезапускать игру с самого сначала, не нужно даже нажимать F8/F9 (быстрое сохранение и восстановление в оригинальном плеере).
   На самом деле редко какая игра инди-разработчика (впрочем, как и любое другое программное обеспечение) выходит сразу без сучка, без задоринки. Многое зависит, конечно, от автора. Некоторые вообще бросают игры настолько сырыми, что их даже тестировать не очень хочется. Но как правило, сначала игра проходит закрытое тестирование внутри сообщества несколькими активными игроками, затем помещается в открытый репозиторий (или сначала в «песочницу»), но и после этого, со временем находятся какие-то ошибки, непредвиденные тупики, да и просто элементарные описки в тексте. Не даром в INSTEAD встроен механизм версионирования игр — в коде каждой игры указывается текущая версия, что позволяет в том числе следить за исправлениями и дополнениями в игре.
   В веб-инстеде я постарался максимально облегчить процесс выявления ошибок игроками. Пока, правда, не реализована обратная связь игрока с автором так, чтобы игрок мог прямо в процессе игры написать свои замечания или пожелания, и его сообщение сразу отправлялось электронным письмом автору вместе с текущим состоянием игры (сохранёнкой) во вложении. Но технически такая возможность в клиент-серверном варианте очень просто реализуется. Представьте, одно дело — когда после обнаружении ошибки в игре нужно как-то связаться с автором, как минимум залогиниться на форум, и там написать. Если потребуется, делать сохранение в игре и приложить его к сообщению. И совсем другое — просто нажать кнопку меню, написать в двух словах, что случилось, и тут же продолжить игру, если ошибка не критичная.
   Тем не менее есть несколько инструментов облегчающих мне жизнь. Основной из них — это, конечно, ведение логов всех игр. Когда я получаю баг-репорт, то прежде всего смотрю логи прохождения. Это позволяет в самом запущенном случае взять, и согласно логам пройти игру с самого начала (с несколькими нюансами, такими, как использование генератора случайных чисел) так же, как это делал игрок. В классическом INSTEAD в модуле метапарсера тоже есть возможность ведения логов (не знаю, как давно она там существует, но не исключаю возможности, что на ее появление тоже повлиял веб-инстед). Но, во-первых, ведение логов в метапарсере нужно включать явно, во-вторых, количество игр на метапарсере пока не так уж и велико, ну и, в-третьих, это же нужно опять таки брать эти логи и каким-то образом передавать разработчику.
   Вообще, разбор логов — это уже крайняя мера. Зачастую, для того чтобы понять суть проблемы, достаточно просмотреть текущий файла автосохранения. А этот файл есть всегда. Собственно, сама природа клиент-серверного обмена вынуждает каждый раз, при каждом ходе игрока делать чтение и сохранение текущего состояния игры. Сервер не знает, когда игрок соизволит сделать следующий ход, да и нужно освободить память для других игроков. Поэтому приходится при каждом ходе сохранять и восстанавливать состояние Lua-машины. С одной стороны из-за этого в паре игр возникали сложности, которые пришлось обходить разными путями, но зато мы попутно получили удобный инструмент для низкоуровневого анализа. Совсем недавно я пошел еще дальше, и сделал возможность так называемого «воплощения» в игрока. Выбирая в административной, закрытой части сайта специальный пункт, я фактически как-бы становлюсь на место выбранного игрока, и могу прямо в браузере, посмотреть его глазами текущее состояние игры. Это довольно удобно, и при желании можно было бы дать такую возможность самим авторам игр.
   Хорошо, пусть ваша очередная игра уже выложена в открытый доступ, достаточно отлажена, и все вроде бы прекрасно. А не интересно ли теперь вам узнать, сколько человек в нее уже играло? А сколько игроков смогли пройти ее до конца? Сколько времени игрок в среднем играет в нее — две минуты или два часа? А сравнить результаты с другими играми (вашими или даже ваших коллег) — неужели не любопытно? На все эти вопросы позволяет ответить внутренняя статистика веб-инстед, которая автоматически ведется для каждой игры. И вот это — именно то, что может дать только клиент-серверная архитектура. Для классического INSTEAD, да и других оффлайн-платформ, наиболе близким показателем может служить, пожалуй, только количество скачиваний игры из репозитория. Но, согласитесь, что этот показатель не настолько показателен (извините за невольный каламбур). Допустим, игру скачало 1000 человек, но вы не знаете даже, сколько из них прошли ее дальше первых двух-трех локаций.
   Конечно, есть и другие оригинальные «фишки», присутствующие только в веб-версии инстеда. Например, для взаимодействия предметов можно использовать перетаскивание предмета из инвентаря на другой предмет. Но, пожалуй, я не буду углубляться дальше в детали. Ведь гораздо проще взять и попробовать всё самому.
   Надеюсь, моя статья (помимо самовосхваления :) ) помогла вам представить историю развития и текущее состояние дел в веб-инстед. Для полноты картины можно было бы еще поговорить о дальнейших планах и возможных путях развития. Пожалуй, я сделаю это в следующей части. Как всегда, вопросы и комментарии приветствуются! А можно даже проголосовать за статью, я ведь старался :)

1 комментарий

jhekasoft
Да, веб-инстед огонь. Я уже не раз восхвалял его. Я предпочитаю играть на классическом, но вот обычным людям, которые не являются разработчиками игр, это то, что надо. Столько людей уже поиграли в мои Лифтёры. А когда я их выпускал, то установку Инстеда многие не осилили. Оно им и не надо было. :)