![](https://habrastorage.org/webt/ks/fq/ns/ksfqns7m_ubsdsjdepgudspe7k8.png)
В первой части я рассказывал про ноутбук с фанатского стенда Gravity Falls, с которым участвовал в нескольких фестивалях научной фантастики 2-3 года назад. В этом году команда вдохновилась новым фильмом по Джуманджи и решила сделать стенд по этой Вселенной. Моё отношение к нему не столь однозначно, но старый фильм и сериал были очень хороши. Когда пришло время начинать работу над интерактивом, я решил сделать мобильный аналог настольной игры для посетителей фестиваля, с возможностью совместной игры на стенде и решением загадок. Под катом — что вышло из моей реализации и как это выглядело на фестивале Старкон 2018.
Настольная игра Джуманджи (Jumanji)
В оригинальном фильме, игроки (до 4-х, по числу фигурок в игре) бросали кубики, их фигурки двигались на соответствующее значение, а в центре игры возникала загадка. У них было несколько секунд, чтобы понять, о чем она, после чего написанное начинало исполняться. Прилетали летучие мыши, возникали дикие звери — всё это приходило в наш мир из игры.
Минутка сомнений
Теоретически, игроки могли сразу же сделать следующий ход в порядке очереди и довольно быстро закончить игру. По факту, каждая загадка несла с собой всё новые трудности для продолжения процесса. В сериале был другой принцип, и такой проблемы не было.
В мульсериале игра вела себя иначе — хоть там и фигурировали те же фигурки и поле, на практике это не имело значения. Сколько бы людей (или других существ) не присутствовало рядом с полем в момент игры, их всех затягивало внутрь после появления загадки — до тех пор, пока они не разгадают её в мире игры, произнеся ответ вслух.
Реализация настольной игры
Идея была проста — скомбинировать эти варианты. Игрок бросает кубик, делает ход, после чего в центре поля появляется загадка. Пока не будет дан ответ — следующий игрок ходить не сможет. Так как я больше программист, чем крафтер, решил делать игру в виде приложения для мобильных устройств.
Я понимал, что такой интерактив влечет за собой определённые неудобства для посетителей. Если на каждом стенде фестиваля посетитель будет скачивать новое приложение, тратить трафик, батарейку, место на устройстве, то очень скоро ему это надоест. Да и в конце концов, не у всех есть мобильные устройства, и было бы несправедливо лишать людей потенциального развлечения. Поэтому решил делать две версии, мобильную (онлайн) и стационарную (оффлайн), с вводом ответа прямо на нашем планшете. Мобильную предполагалось использовать только в качестве дополнительного интерактива, хоть я и возлагал на неё большие надежды.
Оффлайн-версия
С оффлайн-версией клиента всё было довольно просто. Жена нарисовала графику, я сделал прототип в Unity — фигурка по доске ходит, загадка отображается. Красота! Я не собирался тратить много сил на интерфейс, всё-таки приложение должно было работать всего два дня и выполнять в первую очередь функцию донесения вопросов до посетителей, но и совсем сырым оставить его не мог. Добавил создание игроков (до четырех) с указанием имени, приближение камеры, разные мелочи. В первой версии были жестко зашиты вопросы из фильма. Зная политику магазинов приложений, решил выложить эту версию заранее, чтобы можно было не спеша исправить какие-нибудь косяки — всё-таки игра делалась по известному фильму, пусть без какой-либо монетизации и рекламы, но авторские права всё равно принадлежат фирме-издателю. Тогда мои опасения не оправдались — сначала Google Play, а позже и App Store без проблем подтвердили приложение, а я тем временем стал дорабатывать сервер и клиент для работы онлайн.
![](https://habrastorage.org/webt/qi/2e/m6/qi2em6to7ukz_7w77sifrs8he_8.png)
Первые оценки из Google Play
Я не добавлял локализацию, т.к. не рассчитывал на использование приложения кем-то ещё, кроме как посетителями фестиваля, но, памятуя о том, что гости могут быть из разных стран, не стал добавлять региональных ограничений на игру. Я нигде не выкладывал ссылок на первую версию (кроме как для теста среди нашей команды стендовиков), но, к моему удивлению, всё-таки стали появляться отзывы с Google Play. Среди первых же отзывов были зарубежные в духе «что отвечать на вопросы? Я не могу пройти игру» и с низкими оценками. Я побоялся, что низкий рейтинг отпугнет даже тех посетителей, кто мог бы установить приложение на фестивале, и решил в следующей версии добавить режим игры Без вопросов и сделать его активным по умолчанию, если язык устройства отличается от русского. В этом режиме игра превращалась в простейшую настольную игру в духе "бросить кубик, пройти вперёд на N клеток, кто быстрее пришел к финишу — победил", но и таких отзывов стало меньше (появились другие, об этом ниже).
Онлайн-версия
Работу над серверной частью на самом деле я начал ещё до оффлайн-версии. Я отдавал себе отчет, что Laravel — не самая подходящая платформа для игрового сервера, но мне показалось проще сделать прототип на ней и наполнять базу вопросов через сайт. На сайте были закрытые разделы, где я мог добавлять вопросы, создавать онлайн-игру и управлять её процессом (начинать игру после выбора фигур всеми участниками, подтверждать ответы на вопросы, завершать игру).
![](https://habrastorage.org/webt/xm/a_/km/xma_kmnkugxskwczdricd4tukhm.png)
Реализовал API для подключения к игре, выбора фигур, бросания кубиков. Протестировал через Postman и перешёл к клиентской части.
Опрос сервера клиентом каждые N секунд — конечно, не та реализация, которой стоит гордиться в 2018-м, но этот простейший механизм работал как надо. Сделал систему сохранения на основе небольшого ассета, добавил для приложения настройки, где можно выбрать режим игры и загрузить актуальную базу вопросов с сервера. Есть несколько списков — базовый список вопросов (вопросы из фильма, которые присутствовали ещё в первой версии), список вопросов для стационарной версии и список вопросов для онлайн-версии. Вопрос может быть сразу в нескольких списках, но обычно только в одном. Также по кнопке можно загрузить актуальную версию вопросов с сайта. Из 4 режимов игры 3 работают на основе оффлайн версии (с двумя разными списками вопросов + режим без вопросов), а последний — требует предварительного создания игры ведущим со стенда и не может быть запущен в автоматическом режиме. Желающие подробнее ознакомиться с принципом работы онлайн-версии могут прочитать следующий спойлер, где я постарался максимально (пожалуй, даже излишне) подробно всё расписать.
Принцип работы онлайн-версии
Сначала посетители (группа от 1 до 4 человек) приходят к ведущему со своими устройствами с установленными приложениями. В настройках выбирают режим игры На стенде онлайн. Теперь при старте игры на клиенте появляется окошко ввода 4-значного кода. Ведущий игры со своего устройства заходит на сайт и в закрытом разделе создает игру на сервере, после чего ему отображается уникальный код игры. В обычной ситуации это единственный код, который нужно будет вводить игрокам (кроме имени). Итак, все игроки вводят код игры, и на клиенте отображается поле выбора фигуры и ввода имени игрока. При этом начинается опрос сервера (на основе кода игры) на наличие занятых фигур — например, если игрок Питер выберет обезьяну, при следующем опросе сервера игроку Джуди станут доступны только оставшиеся три фигуры. Если Джуди попробует выбрать обезьяну после того, как её выбрал Питер, но до того, как список доступных фигур обновится — ей будет выдана ошибка, и нужно будет повторить попытку.
![](https://habrastorage.org/r/w1560/webt/-s/6b/sw/-s6bsw3blouym-8_1jpcmr-rggq.png)
После выбора фигуры игроки попадают в режим ожидания, а на клиент возвращается уникальный 7-значный идентификатор, который нигде не отображается, но используется для идентификации передаваемых игроком запросов. Здесь опять начинается опрос сервера, но уже не на наличие свободных фигур, а на получение подробной информации об игре, включая её статус. И это продолжается до тех пор, пока статус соответствует в ожидании. Также информация об игре включает поле с датой последнего обновления. Это поле также передается в запросе к серверу, чтобы тот выдавал полную информацию лишь когда дата поменяется, а в остальных случаях отправлял только уведомление, что всё по-прежнему. Наконец, когда все игроки выбрали фигуры, ведущий со своего устройства меняет статус игры на активную.
При следующем обновлении информации у посетителей открывается игровое поле. Игроки ходят в порядке очерёдности (кто раньше выбрал фигуру), если на кубиках выпал дубль — ход остается у текущего игрока. В онлайн-версии есть два вида вопросов.
![](https://habrastorage.org/r/w1560/webt/tz/t9/de/tzt9de9t0rttkeltatq0kcy7evq.png)
Была реализована также возможность переподключения к игре. Если посетитель начал онлайн-игру, а потом, скажем, вышел в меню, выбрал другой режим, поиграл в оффлайн-версию и снова решил подключиться к старой игре, либо же вообще решил продолжить игру на другом устройстве, он может это сделать при помощи ведущего. Сначала он также вводит 4-значный код игры, а после, вместо выбора свободной фигуры, ему необходимо нажать на кнопку Ввести код игрока. 7-значный код игрока, упомянутый ранее, не показан в открытом виде в интерфейсе игры, но виден ведущему наряду с именами и фигурами игроков в закрытом разделе на сайте, поэтому игрок сможет опознать себя и ввести этот дополнительный код. Если игра уже была начата, то после ввода кода игры посетителю сразу будет предложено ввести код существующего игрока. Эта возможность была протестирована, но на фестивале ни разу не использовалась, поэтому так и осталась избыточной.
![](https://habrastorage.org/webt/-s/6b/sw/-s6bsw3blouym-8_1jpcmr-rggq.png)
После выбора фигуры игроки попадают в режим ожидания, а на клиент возвращается уникальный 7-значный идентификатор, который нигде не отображается, но используется для идентификации передаваемых игроком запросов. Здесь опять начинается опрос сервера, но уже не на наличие свободных фигур, а на получение подробной информации об игре, включая её статус. И это продолжается до тех пор, пока статус соответствует в ожидании. Также информация об игре включает поле с датой последнего обновления. Это поле также передается в запросе к серверу, чтобы тот выдавал полную информацию лишь когда дата поменяется, а в остальных случаях отправлял только уведомление, что всё по-прежнему. Наконец, когда все игроки выбрали фигуры, ведущий со своего устройства меняет статус игры на активную.
При следующем обновлении информации у посетителей открывается игровое поле. Игроки ходят в порядке очерёдности (кто раньше выбрал фигуру), если на кубиках выпал дубль — ход остается у текущего игрока. В онлайн-версии есть два вида вопросов.
- Первый тип — вопросы с вводом ответа в соответствующее поле, подобно тому, как это происходит в стационарной версии. При нажатии кнопки Ответить происходит запрос к серверу, где и определяется, верен ли ответ. Чаще всего может быть несколько правильных регистронезависимых вариантов.
- Второй тип — вопросы, требующие подтверждения. Здесь нет каких-либо кнопок, кроме повторного отображения вопроса. Необходимо, чтобы ведущий сам нажал Засчитать ответ на странице игры на сайте после того, как игроки выполнят соответствующие условия из загадки и скажут об этом ведущему. После этого ход становится доступен следующему игроку в порядке очередности, и так до тех пор, пока кто-нибудь не дойдёт до центра поля. Формально, после этого ведущий должен будет нажать кнопку Завершить на сайте, после чего игра пропадет из списка активных, а попытки снова подключиться из клиента с этим кодом будут возвращать предупреждение, что игра уже закончена.
![](https://habrastorage.org/webt/tz/t9/de/tzt9de9t0rttkeltatq0kcy7evq.png)
Была реализована также возможность переподключения к игре. Если посетитель начал онлайн-игру, а потом, скажем, вышел в меню, выбрал другой режим, поиграл в оффлайн-версию и снова решил подключиться к старой игре, либо же вообще решил продолжить игру на другом устройстве, он может это сделать при помощи ведущего. Сначала он также вводит 4-значный код игры, а после, вместо выбора свободной фигуры, ему необходимо нажать на кнопку Ввести код игрока. 7-значный код игрока, упомянутый ранее, не показан в открытом виде в интерфейсе игры, но виден ведущему наряду с именами и фигурами игроков в закрытом разделе на сайте, поэтому игрок сможет опознать себя и ввести этот дополнительный код. Если игра уже была начата, то после ввода кода игры посетителю сразу будет предложено ввести код существующего игрока. Эта возможность была протестирована, но на фестивале ни разу не использовалась, поэтому так и осталась избыточной.
Внезапные трудности
Доработка финальной версии приложения заняла больше времени, чем я думал, и обновление отправилось в маркеты только за несколько дней до конвента. И, конечно же, App Store его заблокировал =) Разумеется, это моя вина — я предполагал, что использование названия фильма может быть некорректным, но оно использовалось только в контексте фанатского стенда, и с первой версией приложения проблем не было, вот я и расслабился. Сначала была заблокирована только иконка, после её смены и повторной проверки — уже описание в маркете (и то и то присутствовало в первой версии), и было вынесено уведомление, что следующая проверка приложения займёт больше времени. Вообще мне показалось странным, что обновление отклонили, а уже загруженную первую версию с «неправильными» описанием и иконкой оставили для загрузки, но хоть что-то. Я был в некоторой панике — плюс пара дней проверки, и приложение уже не будет актуально, а на фестивале для онлайн-версии моего интерактива отсекаются все посетители с iOS. Не зная, ждать ли радостного письма с подтверждением, в ночь перед конвентом я судорожно дописывал текстовую онлайн-версию — пусть не очень красивую, но зато работоспособную, с которой проходить интерактив смогли бы обладатели всех устройств с доступом к сети.
![](https://habrastorage.org/webt/ur/dq/f8/urdqf8npelmpcfjnxkgecb1ov3s.png)
Первый день фестиваля
И вот, наступил день конвента. К тому моменту я уже знал, что мое приложение для интерактива не единственное — было ещё основное приложение от Мегафона для глобального квеста по всему Старкону. Надеюсь, наличие моего приложения не создало каких-то неудобств для организаторов, но по крайней мере я об этом до сих пор не слышал. Зато стационарную версию игры удалось интегрировать в главный квест. Смысл его был в том, что посетители с установленными приложениями Старкона ходили по стендам, выполняя уникальные задания, и при успешном выполнении получали особый для каждого стенда код (который вводился участниками стенда во избежание распространения), а собрав коды со всех стендов — участвовали в розыгрыше призов. На стенде Джуманджи я вызвался отвечать за этот квест. В качестве задания от нашего стенда я предлагал пройти оффлайн-версию своей игры с достаточно простыми вопросами. Желающие могли скачать приложение себе на устройство и пройти в своем темпе, показав мне потом успешный результат, либо же под моим руководством "сыграть в Джуманджи с Аланом Пэрришем" с нашего планшета. Это, конечно, было не так канонично, как старый ноутбук для прошлых фестивалей, но с раскрашенным под Джуманджи чехлом для планшета смотрелось не так уж плохо.
![](https://habrastorage.org/webt/gl/oi/vz/gloivz0eca4va23ve4y_2vrzwis.png)
Онлайн-игра шла отдельным, независимым интерактивом. Для неё посетителям приходилось устанавливать приложение (либо воспользоваться текстовой онлайн-версией, но все выбирали приложение). Ситуация усугубилась тем, что новое приложение для iOS так и не подтвердили, и в App Store можно было найти только первую версию, без онлайн-игры и даже без возможности скачать актуальную версию вопросов. К тому же, в первый день фестиваля как обычно было больше посетителей, в том числе желающих пройти официальный квест, поэтому как итог — только пара человек с Android в первый день начали проходить онлайн-квест, но так и забросили на первых же загадках. Я был немного расстроен, ведь на онлайн версию ушло довольно много сил, было бы обидно совсем её не испытать. Но понадеялся, что второй день будет успешнее в этом плане — так и случилось.
Второй день фестиваля
Второй день начался с воодушевляющих известий — App Store наконец-то подтвердил новую версию приложения, написав также, что в случае подобной необходимости (в ответ моё письмо с рассуждениями, что приложение-то мне было нужно строго на определенные даты) следует написать дополнительное уведомление на более быструю проверку (честно говоря, с тех пор не уточнял этот момент, т.к. больше такой необходимости не было). В этот день по ощущениям было меньше посетителей, желающих проходить глобальный квест, и я чаще предлагал прохождение онлайн-версии своей игры. Загадки для онлайн-игры были сложнее, там обычно описывался какой-то другой стенд с фестиваля, и игроки должны были понять, о каком стенде идёт речь, дойти до него и описать ведущему (либо показать фотографию этого стенда). Участвовать могли команды от 1 до 4 игроков, причем, хоть каждый играл за свою фигуру, загадки им нужно было разгадывать вместе, как это было в сериале. При необходимости ведущий мог дать подсказку (если посетитель совсем не знает Вселенную стенда из загадки, а перебирать все варианты не хочется). В этот день таких желающих было больше, и практически все проходили квест целиком, чему я был несказанно рад. В общей сложности успешных игроков было порядка десяти, меньше, чем я рассчитывал, но после прошлого дня — очевидный прирост. Особенно запомнилась девушка, которая начала онлайн-игру в одиночку в первой части фестиваля, а вернулась и допрошла ближе к концу, когда мы уже стали бояться, что она забросила квест. Оказалось, она просто долго не могла решить одну из загадок, но в итоге всё выполнила успешно!)
Я думал, что в качестве особой награды за прохождение онлайн-версии я буду выдавать один значок и только тому, кто из команды быстрее дойдет до центра поля, но участников было немного, поэтому награждались все, а фонд наград пополнился самодельными, расписанными акрилом вручную магнитами в стиле Джуманджи. Надеюсь, что участники интерактива остались довольны как призами, так и самой игрой.
![](https://habrastorage.org/webt/qw/ef/e7/qwefe71igqblhvhazh3rknica2c.jpeg)
Один из уроков на будущее
Казалось бы, мне давно пора понять, что контент в такого рода проектах зачастую важнее формы, в которой он представлен. Одна из ошибок, что я допустил — сосредоточился на приложении в ущерб загадкам. Я, конечно, успел написать некоторое количество загадок, но дописывал их в автобусе с телефона по дороге в Экспофорум, что могло повлиять как на их оригинальность, так и на количество — при повторных прохождениях игры они почти наверняка будут повторяться. А ведь интересные загадки — это то, чего ждут от Джуманджи. В будущем нужно больше времени уделять таким важным вещам.
Итог
Прошло уже почти полгода с момента фестиваля. За это время я больше не обновлял игру — планировал, что она понадобится только на дни фестиваля, и не рассчитывал на дальнейшую поддержку. Как ни странно, мне до сих пор продолжают приходить новые отзывы с Google Play. И хотя большая часть из них на арабском с просьбой добавить арабский язык (может, я чего-то не знаю про этимологию слова Джуманджи? Я находил, что оно имеет скорее африканские корни), продолжают появляться отзывы с вопросами об онлайн-версии. При наличии времени в будущем я бы реализовал ещё пару вещей, чтобы игра могла функционировать без моего непосредственного вмешательства, но, я считаю, главное своё предназначение она уже выполнила. Для меня это был уникальный опыт — смотреть, как проходят твой квест с помощью твоего же приложения — очень приятно. Хочется поблагодарить всех тех, кто дал мне эту возможность — организаторов фестиваля, свою команду, и, конечно же, посетителей, кто в этом участвовал. Надеюсь, это не последний мой фестиваль и не последний интерактив =)
![](https://habrastorage.org/webt/yp/he/__/yphe__odftz-hamjcivza3m4n6e.jpeg)
Технические интерактивы на фантастических конвентах. Часть 1