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

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

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

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

Началось всё примерно 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]
У меня основная проблема — как брошенному пирату спастись с острова.

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

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

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

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

Далее идут спойлеры, которые могут испортить впечатление от прохождения игры
Игрока высадили на необитаемом острове. Если отбросить всякие Deus ex machina, то забрать его оттуда могут лишь те, кто его там оставил. С чего бы им возвращаться? Забыли что-то ценное. Как на это может повлиять игрок? Да никак. Вряд ли они обнимались на прощание, чтобы игрок мог успеть вытащить из кармана противника что-нибудь ценное. Кроме того, любой контакт с другими персонажами подразумевал какие-то диалоги, модуль которых ещё не был готов. Так что же делать?

Когда я размышляю над подобными задачами, я пытаюсь представить себя на месте персонажа. Поэтому я сидел рядом с героем игры на сундуке под пальмой, смотрел на море и прикидывал всякое… Так, ну что мешает мне добавить немного магии? Для пиратского сеттинга это не такая уж и дичь. Пусть сундук, на котором я сижу, будет магический. И я могу достать из него… да любую вещь. Тогда я могу достать из него тот самый ценный предмет, ради которого (тут же нарисовалась фигура главного злодея) главгад будет готов вернуться обратно, думая, что он это обронил или ещё чего.

Хорошо, злодея мы вернули, но как уговорить его забрать игрока обратно на корабль? Без модуля диалогов, заметьте! Учитывая вполне оправданное плохое отношение игрока к злодею, решение данной проблемы нашлось сразу же — насилие. Нужно только раздобыть оружие повнушительней, что, имея под рукой магический сундучок, не представляет проблемы.

Далее пошла полировка.

Почему-то изначально ценным предметом была табакерка. Когда я попытался рассказать об этой идее другим людям, то запнулся, поняв, что мне нужно что-то более естественное для восприятия. Что представляет ценность для пирата? Карта сокровищ. Отлично, её и оставим! Тем более, что сразу же появилась и причина, по которой игрока оставили на острове — из-за этой карты всё и произошло. Тут сошлось.

Теперь с оружием. Чтобы немного расставить акценты и усилить внимание игрока (игра же планировалась маленькая), я решил, что игроку достаточно головоломки с картой, а оружие уж положу просто так рядом. Из-за такого разделения появился волшебный мешочек, а сундук стал обычным. Кстати, семизарядные пистолеты не (моя) выдумка — поищите вот в этой статье по словосочетанию «семь раз». Буду в Праге — обязательно загляну. Столь внушительное оружие вполне сойдёт за аргумент в любой дискуссии. Принято.

Ну и напоследок. Небольшая мелочь всё не давала мне покоя — с чего бы это злодей, оставив игроку пистолет, просто так приплывёт на остров, не боясь, что игрок его пристрелит. Ха, да очень просто! Он не забьёт пулю в ствол. Так заодно снялась проблема с лишним предметом в игре — пулей, которая оказалась бы у игрока после того, как он разберёт пистолет. Ну и уверенность персонажа в том, что его оружие на самом деле не заряжено, в какой-то мере оправдывает лёгкость, с которой он решается разобрать пистолет, чтобы добыть из него порох. Подходит.

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

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

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