Как писалась игра «Остров Клайда»

Если описать, как делалась игра «Остров Клайда», кратко, то это будет два слова: «быстро, но непросто». Подробный вариант истории содержит уже детали: как появилась задумка игры, через какое перерождение прошёл сюжет игры, и почему она получилась именно такой. Все спойлеры убраны под теги, но, наверное, перед прочтением лучше всё же пройти игру.

Перед тем как приступить к основной теме, я хочу поблагодарить Нафанина, без которого эта игра вряд ли была бы дописана, и уж точно не поучаствовала бы в конкурсе «КРИЛ». Он выступал не только главным пинальщиком (надо успеть! надо успеть!), но и вложил немало сил в интерфейс игры (по сути, интерфейс и дизайн целиком его). Однако хватит оффтопа.

История создания игры «Остров Клайда» неотделима от истории написания движка, на котором она работает. Сперва была идея создать парсерный движок для веба, в процессе его разработки требовалось на чём-то тестировать его возможности, а потом уже нужно было что-то по-быстрому доделывать, чтобы успеть на КРИЛ. Сперва-то мы с Нафаниным собирались делать всё по-взрослому: трекер, роадмапы, система управления версиями и всё такое. Но потом, как говорится, жизнь внесла свои коррективы. Это, разумеется, потому что мы спешили. Следующую версию мы уже будем делать как надо. Наверное.

Началось всё примерно 11-го августа 2015 года, когда мы в очередной раз мечтали о том, какую бы игру мы хотели бы написать:

Oleg Aleynikov:
Думал тут насчёт интерфейса под мобилки.

Иван Нарожный:
для парсера?

Oleg Aleynikov:
под разное
Рассматривал также вариант с ссылками и менюшками.
Ну в общем, со ссылками чота $#@$.
то есть лучше бы им внизу скапливаться

Иван Нарожный:
вариант
если их не стопицот понятно

Oleg Aleynikov:
С точки зрения удобства игрока
в этом плане всё есть в Undum вроде
но это нужно по-другому автору игру дизайнить
и это уже не столько игра, сколько литература выходит

Иван Нарожный:
чур меня!

Oleg Aleynikov:
а вот парсер лишён таких проблем
надо делать парсер

Иван Нарожный:
я вот тоже думаю

Oleg Aleynikov:
да
давай делать парсер

Иван Нарожный
на крил?

Oleg Aleynikov
Успеем на КРИЛ — хорошо.

Потом мы долгое время активно фантазировали на тему сюжета предполагаемой игры и лениво перебрасывались идеями по движку. Ну и заодно я выяснял у Нафанина, как вообще работает JavaScript: зачем писать var при объявлении переменной, как выглядят свойства и методы у объектов, и как к ним обращаются. В общем, технические детали. Потом я перенёс кое-какие наработки из своего фреймворка «Az» для платформы QSP — и понеслось. Но о движке как-нибудь в другой раз. Здесь — про игру.

Скоро появилась необходимость в тестовом проекте. Сперва была поляна с деревьями, но для работы с контейнерами нужно было что-то характерное. Так появился сундук и кошелёк. Изначально в сундуке лежало яблоко, а на поляне монета. Можно было положить монету в кошелёк, кошелёк в сундук. А потом я посмотрел на календарь и понял, что если я не буду тестировать всё это на реальном проекте, то на КРИЛ не успею точно. И тут мы с Нафаниным 19 сентября сходили на концерты групп «Alestorm» и «Дом ветров». И появилась пиратская тема. Трава с поляны исчезла, сама поляна была превращена в остров (чтобы ограничить игрока в передвижениях), а деревья ужались до одинокой пальмы (какой остров без пальмы?). И дальше уже идея развивалась в этом направлении.

Несколько слов о чём игра:

Главного героя, грозного пирата, во время плавания за сокровищами обманывает его подельник. Крадёт у героя карту к сокровищам, а самого высаживает на островке посреди океана. Пока стоит штиль, корабль злодея болтается на виду неподалёку от берега. А герою нужно найти способ спастись.

Oleg Aleynikov, [25.09.15 22:56]
У меня основная проблема — как брошенному пирату спастись с острова.

Сперва я прорабатывал идею о сундуке, из которого можно взять какой-нибудь предмет, который поможет герою спастись с острова. Взять предмет и оставить какой-нибудь взамен, который поможет спастись ещё кому-нибудь. К этому прилагалась записка, в котором было бы описано, какие предметы уже прошли через этот сундук, из которой игрок мог узнать, что самые удачные предметы уже расхватали: ковёр-самолёт, бутылка виски и всё такое. Ну и от сочетания «что взял / что оставил» герой спасался бы с острова разными способами.

Но вскоре я от этой идеи отказался. Во-первых, действия игрока в этом случае были бы чисто декоративные. Он не решал проблему, а лишь выбирал декорации. Во-вторых, эта идея показалась мне недостаточно «герметичной» для маленькой игры, которую я не терял надежды дописать на КРИЛ. И с каждым днём объём игры, которую я мог бы успеть сделать, становился всё меньше, а задача, решаемая игроком, — всё компактнее.

Вдобавок ко всему, я очень хотел, чтобы решение задачи проявляло возможности именно парсерной модели интерфейса. Чтобы игрок не выбирал из вариантов решения, а самостоятельно догадывался о решении и сообщал о нём игре.

И как-то ночью перед сном мне внезапно пришла идея.

Далее идут спойлеры, которые могут испортить впечатление от прохождения игры

Такой сюжет позволил мне построить достаточно компактную ситуацию, в которой перед игроком ставилась довольно сложная и интересная головоломка, что в какой-то мере компенсировало малый размер игры. И эта головоломка была реализуема именно в парсерном интерфейсе — как подобное можно сделать через меню, ума не приложу. Собственно, чего я и добивался.

Осталось переложить всё это в программный код. Разумеется, вылезла куча проблем с движком, пару раз пришлось переписывать парсерный модуль, да и по всем остальным частям движка я тоже изрядно прошёлся. В результате, на КРИЛ игра была отправлена без какого-либо стороннего тестирования, и последствия этого мне пришлось разгребать ещё какое-то время.

Но о жизни игры после выпуска я напишу в другой раз.