Ripatti's blog

By Ripatti, 12 years ago, In Russian

важный UPD в конце записи

Всем привет!

Хочу представить вам мой небольшой проект, над которым я тружусь в свободное время уже более полугода. Это игра, которая называется Great Permutator.

image

Почему здесь? Дело в том, что данная игра представляет собой головоломку особого жанра, так называемого engineering puzzle. Примеры игр такого жанра: LightBot, Manufactoria, The Codex of Alchemical Engineering и, конечно же, SpaceChem. Мне такие игры очень нравятся и, вроде бы, нравятся многим программистам.

На самом деле первоначальная версия этой статьи была подготовлена для Хабра. Но я по глупости опубликовал ее не в тот хаб и меня забанили. Когда разбанят (и разбанят ли) — непонятно, поэтому публикую здесь.

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

Начало

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

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

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

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

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

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

image

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

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

image

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

image

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

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

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

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

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

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

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

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

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

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

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

Еще один интересный момент бета-тестирования. В игре были пару уровней, которые я в начальном варианте проработки никак не мог пройти. Буквально не хватало 1 тайла, чтобы построить верное решение (вот так вот я поневоле троллил сам себя). Пришлось добавлять лишний исполнительный блок, чтобы уровень таки можно было пройти. Однако бета-тестеры таки нашли решения этих уровней без использования добавленных мной в последний момент исполнительных блоков. И в конечной версии игры эти "лишние" блоки были снова убраны.

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

Код

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

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

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

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

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

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

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

Кое-где было добавлено шифрование. Я помню момент, когда Ваня Фефер в Харькове прошел демо-версию путем правки save-файла в блокноте. Теперь такой трюк не пройдет.

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

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

Арт

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

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

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

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

image

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

Промежуточная версия обложки:

image

Финальная версия:

image

Звук и музыка

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

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

Great Permutator OST можно бесплатно послушать на Bandcamp.

Публикация

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

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

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

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

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

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

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

Заключение

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

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

Вот такая вот история.

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

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

UPD 22.03.2014

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

Еще игра вышла (и довольно давно) на Greenlight. Очень нужны голоса. На текущий момент собрано около 60% для того, чтобы попасть в сотню лучших. Числа вроде одного порядка, что дает надежду на то, что в скором времени игра пройдет на Steam.

В честь годовщины с момента релиза идет распродажа со скидкой 80% (до 25 марта). Приобрести игру можно здесь любым удобным способом.

Дополнительную информацию можно найти на официальном сайте или в группе ВКонтакте (подписывайтесь!).

  • Vote: I like it
  • +146
  • Vote: I do not like it