Great Permutator — головоломка для программистов

от автора

Привет, Хабр!

Хочу представить тебе мою игру Great Permutator.

image

Сразу прошу прощения за публикацию немного не в том хабе (тут, наверно, лучше подойдет хаб «Я пиарюсь»). Как только наберется достаточное количество кармы — я перенесу топик куда ему положено (или не надо?).

Почему именно на Хабре? Дело в том, что данная игра представляет собой головоломку особого жанра, так называемого engineering puzzle. Судя по данному топику, игры подобного жанра представляют для хабровчан особый интерес. Кроме того, в том же топике поступала просьба написать пост когда проект будет «допилен».

Чтобы пост не был рекламой целиком, я опишу некоторые интересные моменты, связанные с разработкой и публикацией. Такое повествование еще называют постмортемом, но, как мне кажется, тут это слово не совсем подходит по смыслу. Заинтересовавшимся добро пожаловать под кат.

Начало

Началось все с сайта igdc.ru. Как можно понять из расшифровки аббревиатуры (Independent Games Developers Contests), данный сайт посвящен разработке инди-игр в формате конкурсов. Дело обстоит так: выбирается тема конкурса, после чего все желающие за некоторое ограниченное время должны сделать игру на заданную тему. Хотя уровень получаемых работ можно считать скорее любительским, все это происходит в теплой непринужденной атмосфере. Кроме того, это хорошая тренировка в разработке прототипов игр. Некоторые прототипы можно затем улучшить и превратить в полноценную игру.

Так и получилось с моей игрой Great Permutator. Хотя игра и заняла в конкурсе не самое высокое место, в нескольких комментариях прозвучала мысль

Хорошая головоломка, надо развивать и продавать =)

Я подумал — а почему бы и нет. Тем более что игровая механика допускала множество расширений, достаточных для того, чтобы получить что то интересное, затягивающее надолго.

Игровая механика

Имеется игровое поле размера 11×11 клеток. В верхней части игрового поля расположены входные конвееры, в нижней части — выходные. Кроме того, на самом игровом поле игрок может произвольным образом расставлять новые конвееры. На входные конвееры поступают некоторые последовательности цветных кубов. Цель игры — построить сеть конвееров таким образом, чтобы все цветные кубы с входных конвееров в нужном порядке были перемещены на выходные конвееры. Это выглядит примерно так:

image

После построения нужного механизма, его нужно запустить на выполнение и проследить за корректностью его работы.

На более поздних уровнях появляются так называемые исполнительные блоки. Исполнительный блок представляет собой агрегат размера 2х3, у которого может быть несколько входов и несколько выходов. Разные типы исполнительных блоков обладают различным поведением. Например, исполнительный блок Trigger имеет один вход и два выхода и разделяет все входящие в него кубы на два потока. Другие исполнительные блоки умеют накапливать несколько кубов с последующем одновременных освобождением, копировать кубы, сливать их вместе и даже менять цвет случайным образом.

image

На сложных уровнях количество доступных исполнительных блоков увеличивается и теперь придется поломать голову над их компактным размещением.

image

Вот трейлер игры для более точного понимания, собственно, игровой механики:

Возникновение идеи

Итак, контест на igdc.ru. Тема контеста — непрямое управление. Контест на данную тему на сайте уже был, поэтому я, для вдохновления, решил поизучать игры с прошлого конкурса с такой же темой. Первое место тогда заняла незамысловатая игра Sheeps Comes Home. Поиграв в нее, я заметил что то до боли знакомое. А именно: мы расставляем на поле какие либо объекты, после этого нажимаем кнопочку Run и следим за выполнением процесса. Конечно же, я вспомнил такие игры, как SpaceChem и LightBot!

Изначально хотелось придумать что то похожее по ощущениям на SpaceCham. Эта игра мне в свое время очень понравилась, однако не хотелось явно копировать ее игровую механику. Можно увидеть аналогию между движением молекул по трубам и движением цветных кубов по конвеерам. Реакторы же здесь предстают в виде исполнительных блоков, однако теперь их поведение носит универсальный характер. Концепция исполнительных блоков пришла в голову из описания одного контеста ICFPC. Хотя я сам в том контесте не участвовал, почитать было интересно и прилагающиеся картинки прочно осели в голове. Отсюда, собственно и размер блоков 2х3.

Концепция оказалась довольно удачной в том плане, что теперь идеи по расширению игры полезли из головы сами собой.

Дизайн уровней

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

Сама игровая механика породила большую часть уровней. Около 60% уровней являются очевидным (хорошо, почти очевидным) следствием поведения исполнительным блоков. Еще 30% уровней получились после некоторых экспериментов (как правило, это сложные уровни, для которых помимо идеи, нужно еще постараться упаковать все блоки в небольшое игровое поле). 10% уровней вымучивались, чтобы количество уровней оказалось круглым числом. Впрочем, они получились не такими уж и плохими.

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

Некоторые идеи не очень вписывались в общую концепцию игры. А именно — предполагалось, что каждый уровень можно решить в уме, не добывая дополнительной информации из уровня с помощью экспериментов. Но эти идеи все же оказалось настолько интересны, что были оформлены в 15 бонусных уровней.

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

Этим высокопоставленным делом (дизайном уровней) я занимался около полугода. Параллельно все это время в игру добавлялись всяческие удобства, полезности и свистелки.

Код

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

Игра написана на C++ с использованием ООП. Впрочем, классов в игре использовано минимальное количество. Например, вся игровая логика прототипа состоит из следующих классов:

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

Все объекты игровой логики взаимодействуют с системой (например, считывают ввод или рисуют себя на экране) через узкие интерфейсы. Такой прием называется инверсией управления. Это позволяет, например, не переписывая все игру, портировать ее на другие платформы. Исторически сложилось так, что весь системный код реализован средствами DirectX, поэтому игра пока доступна только для Windows. Но скоро я перепишу все под OpenGL и тогда… Впрочем, об этом позже.

Следует отметить, что игра не содержит мелких классов. Например, нет класса кнопки — все доступные в игре кнопки жестко прописаны в коде. Кнопок мало, и при данном подходе можно прописать кнопки по-разному (в игре есть круглые кнопки, квадратные, в виде надписей, с подсветкой и без и т.д.), что вносит некоторое разнообразие в игровой процесс.

В полной версии число классов не слишком возросло — добавились менеджер ачивок и таблица рекордов. Опять же, единственное поле ввода имени для таблицы рекордов жестко прописано в коде без создания лишнего класса.

В ходе разработки постоянно менялся пользовательский интерфейс. Так, были добавлены возможности строить длинные конвееры одним «росчерком» мыши, перетаскивать уже стоящие на поле исполнительные блоки, отменять и повторять действия, сохранять лучшее решение для последующего улучшения, блокировать входные конвееры для отладки. Если бы игра осталась бесплатной, данные улучшения вряд ли были бы реализованы. Ну то есть остался бы минимальный функционал, достаточный для решения головоломок, но пользоваться им было бы не так удобно.

Из свистелок были добавлены: всякие опции вроде выставления режима отображения и регуляторов громкости, ачивки, общий счет и глобальная таблица рекордов. Насчет последнего пункта — готового решения для глобальной таблицы лидеров я не нашел, поэтому пришлось подымать свой сервер.

Новые фичи придумывались и добавлялись в игру довольно спонтанно. И тем не менее, я не могу припомнить случая, когда для добавления новой фичи мне приходилось кардинально переделывать архитектуру. Наверно мне просто повезло.

Арт

Внутриигровой арт нарисован мышкой в православном Paint’е и хранится в православном формате BMP. Хотя, на самом деле, пикселарт как-то так и рисуется. Теоретически можно было сделать и разрешение побольше, и арт покрасивее — технической проблемы тут нет. Но я решил рисовать все сам, а если и программировать, и рисовать в большом разрешении — это все может затянуться надолго. Впрочем, и так получилось довольно стильно.

Хотелось бы отдельно остановиться на обложке игры (так называемый box-art). Ее можно видеть в начале поста (или посмотреть тут версию в несколько большем разрешении и не листать страницу вверх). Обложка должна быть эпичной и чем то заинтересовать потенциального покупателя. Довольно скоро появилась идея изобразить на обложке большого робота, который своими огромными ручищами расставляет на игровом поле исполнительные блоки. Но тут возникла одна проблема.

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

Решение, которое пришло чуть позже — изогнутая перспектива. Суть в том, что в данной перспективе параллельные линии изгибаются и сходятся в двух фокусах, причем они оба видны зрителю. В реальности такой эффект появляется если смотреть через сферическую линзу или в сферическое зеркало (эффект FishEye):

image

К сожалению, знакомые художники отказались сделать вручную обложку с подобным эффектом, объяснив это тем, что у них взрывается мозг от попыток точно построить объекты в такой перспективе. Опять пришлось все делать самому. Робот за пару вечеров был смоделирован в 3dMax, сфотографирован в сферическом зеркале, а затем за еще один вечер доработан в GIMP’е.

Звук и музыка

Звуком и музыкой занимался мой бывший одногруппник Zuick. Он давно помогал мне с озвучкой некоторых моих проектов. Большинство из этих проектов, правда, умирали довольно скоро. Но вот этот выжил.

Первым нескольким наброскам не удавалось попасть в тему игры. Но на 3ю или 4ю попытку попасть удалось и очень удачно. Этот трек стал главной темой игры, именно он звучит в демо версии. После продолжительной разработки этот трек приелся и стало очевидно, что нужно больше музыки. После этого за несколько недель саундтрек разросся до трех полноценных треков.

Great Permutator OST можно послушать на Bandcamp и скачать за любую неотрицательную цену.

Публикация

Конкурс на igdc.ru был а августе прошлого года, а хорошо допиленную версию игру я опубликовал на indieDB, gamedev.ru и TIGSource только в декабре. В промежутке от декабря прошлого до марта текущего, вышло 3 демо версии, отличающихся друг от друга только техническими улучшениями. В марте игра достигла качества, приемлемого для публикации.

Я разослал несколько запросов в известные мне магазины цифровой дистрибуции (но только в те, в которые было не стыдно отослать запрос). Некоторые ответили вежливым отказом, другие ничего не ответили. Товарищ из Desura ответил довольно быстро и стало ясно, что они не против публикации. Тем более, что indieDB и Desura — это, на самом деле одно и то же, только вид с разных сторон.

Особых проблем с публикацией не возникло. Процедура довольно формальная, у них на сайте все довольно подробно расписано. Разве что пришлось долго курить как оттуда выводить деньги и заводить долларовый счет в банке. Еще одно небольшое неудобство — переписка шла ооочень мееедленно. Обмен сообщениями — буквально по одному в сутки. Бывает напишешь им вопросы, а на следующий день придет ответ на сложнопонимаемом австралийском английском, в котором новой информации уже нет — сам за ночь разобрался что к чему.

Казалось бы, игра опубликована, можно и расслабиться. Но, похоже, головная боль только начинается. Как то так получилось, что об моей игре люди, которым она может быть интересна, толком-то и не знают. Я программист, а не пиарщик и о освещении игры в прессе как-то и не подумал. Сейчас как раз идет массированная атака инди-ресурсов, которые могли бы сделать обзоры (опять же, я пишу только туда, куда не стыдно; может быть я недостаточно наглый?).

В целом, о реакции публики можно сказать — выглядит интересно, механика тоже интересная, играть интересно, но что же блин так сложно? Впрочем, любителям головоломок нравится. Кстати, я отослал ключик Zach’у (ну вы знаете, это чувак, который сделал SpaceChem) — он был просто в восторге.

Дайте мне наконец в это поиграть!

Страничка на Desura. Там можно бесплатно (без смс и регистрации) скачать демо (чтобы не устанавливать клиент, следует выбирать standalone-версию). В демо доступны первые 15 уровней полной версии. Ну а те, кому игра понравилась, могут ее приобрести и тем самым поддержать отечественного разработчика.

Заключение

Статьи, подобные данной, называются постмортемами. Эта статья тоже в своем роде постмортем, но не в полном смысле этого слова. Постмортемы обычно пишут уже после «смерти» проекта, однако данный проект еще только начинает жить и развиваться.

Например, сейчас идет портирование игры под Linux и Mac.

Это мой первый большой коммерческий проект. Хотелось бы получить бидбек от сообщества. А именно: слова поддержки, конструктивную критику, багрепорты, советы по дальнейшему продвижению игры.

Спасибо всем, кто дочитал до конца.

ссылка на оригинал статьи http://habrahabr.ru/post/174999/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *