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

Тема джема – только три правила. Вот они:

  1. Не делай игру в феврале;
  2. Не делай игру в марте;
  3. Не делай игру в апреле.

Шутка. Так и звучит тема. «Только три правила». Интерпретировать можно как угодно. Тема мне понравилась не сразу. Но на деле она ближе к технике, чем к сеттингу. И это прикольно.

Рождение концепции

Первой идеей было сделать очередную карточную игру. Я вообще такие игры люблю – не надо заморачиваться с анимацией, достаточно статику нарисовать. Можно даже сами карты не двигать, а телепортировать их из колоды в слоты в руке игрока. Самое то для ленивых. Но ведь это не спортивно, делать опять что-то похожее на первую игру. Так что я приступила к размышлениям.

И размышления эти очень быстро привели меня к результату. Не зря же я играла в кучу шлака на Armor Games. Вот мой источник вдохновения:

YouTube video

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

Абстрактная идея была простой: есть фигуры. Их характеризует форма, цвет и текстура. Нужно кликать по тем фигурам, которые соответствуют трем заданным критериям. Критерии постоянно меняются, вынуждая игрока адаптироваться на ходу. Например, на старте игроку показывают три критерия: “Синий”, “Квадрат”, “С точками”. Через 10 секунд последнее правило исчезнет и превратится в “Без точек”. Концепт мне понравился.

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

Сюжет

Конечно можно было так и оставить проект игрой про фигуры. Но было бы прикольно придумать мотивацию для появления этих фигур на экране. Кроме того, было не понятно откуда они должны появляться – просто статически висеть и сменяться по таймеру? Ехать слева направо? Падать сверху вниз?

Почти десять лет назад я подхватила историю про кирпичные заводы в Дагестане и принялась ее форсить на работе. Любой человек, который на работу не пришел – на самом деле попал на кирпичный завод (но это, конечно же, шутка). Каким-то образом эта мысль всплыла в моей голове. “Было бы прикольно, если бы это были разноцветные кирпичи разной формы” – подумала я.

YouTube video

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

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

Кроме всего перечисленного, меня очень обрадовало, когда я увидела флаг республики в википедии. Представляете, он зелено-сине-красный! RGB! Даже перекрашивать кирпичи не пришлось!

Имплементация

Игра опять (как и The VAN Journey) сделана на CTF + C++. В этот раз можно было обойтись без C++, но мне хотелось попрограммировать. Кода, правда, очень мало. Есть класс Rule, по которому можно проверить каждый кирпич. Есть класс Ruleset, который отвечает за ротацию правил и проверку совокупности. Есть структурка Brick, которая из uint32 делает кирпич с тремя параметрами (побайтово). Изначально была еще парочка оборачивающих классов, но от них почти ничего не осталось, так как глобальная загрузка Dll, оказывается, не поддерживается. Экспорт всего этого добра выглядит очень просто:

using BrickId = uint32_t;
using RuleId = uint32_t;

ENGINE_EXPORT void NewDay(int level);
ENGINE_EXPORT int Collect(BrickId);
ENGINE_EXPORT int Check(BrickId);
ENGINE_EXPORT RuleId AdvanceStage();

ENGINE_EXPORT RuleId GetRule(int idx);
ENGINE_EXPORT BrickId GetRandomBrick();

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

На выручку пришел iPad Pro. Так что в новой игре все нарисовано от руки. Моей руки. Кроме шрифтов, они из интернета. Графика получилась настолько плохо, что даже хорошо. И в этом был план. Немного напоминает старые флэш-игры, правда. Этого мне не очень хотелось.

На этом мои страдания не кончились! В игре ведь есть сюжет! Впервые я делаю игру с единой сюжетной линией. В то время как в голове он давно сформировался, облечь его в напечатанные буквы оказалось невероятно сложно. Я давно веду блог, но мой скилл написания художественного текста оставляет желать лучшего (хотя у меня и был опыт написания фанфиков по Ragnarok Online). Сюжет, в общем, получился немножко выстраданным. Но без него было никак.

Файн-тюнинг игрового процесса

Реализовав до конца основу механики, я запустила свое творение и… поняла что оно бесконечно уныло. Что-то было не так. Не было воодушевления в духе “Вау, оно работает и так интересно играется!”, какое возникло сразу после реализации прототипа 100 vs Minesweeper. Игру либо придется бросать, либо разбираться что же в ней не так.

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

А не так в ней оказалась динамика. Начальные уровни были слишком длинными и простыми. К ним легко привыкнуть и становится скучно играть. Более того, как только на игрока начинают сыпаться продвинутые правила, его просто прижимает когнитивной нагрузкой. Не в состоянии справиться с задачей, проще смириться со своим бессилием и смиренно глядеть на то, как фигурки просто летят слева направо. Концептуально, Дагестан – самая простая моя игра (из актуальных), но игровой процесс в ней сложнее всех прошлых вместе взятых. Здесь нужно отращивать мозг совсем не в ту сторону, в которую чаще всего требуется в видеоиграх. Если вы когда-нибудь читали сложные условия в программном коде с сочетаниями “и”, “или”, “не” – вы поймете о чем я. Если вы сами это условие не писали, придется провести за ним много времени, прежде чем его корректность станет понятной.

Пришлось сделать несколько серьезных изменений: сделать “туториал” коротким, сбросить скорость конвейера после добавления сложных условий и не засыпать игрока сразу кучей таких правил. По градациям сложности было проделано много работы и результат, как мне кажется, весьма хорош. Но это не значит что вы сможете с легкостью достичь 100% результата в последний, пятый день игры. Этот день – детектор людей с синдромом саванта. Именно они наберут в моей игре больше всего очков.

Оставалось починить фактор везения – выдавать игроку нужные кирпичи хоть иногда, чтобы избежать ситуаций, когда на ленту просто не попадает кирпич, соответствующий трем правилам. В этом аспекте твики над рандомизатором отличаются от The VAN Journey несущественно.

Резюме

Конечный результат

Я подзадолбалась. В основном от закликивания редактора CTF. Видимо, надо было делать игру на MonoGame, как в прошлый раз. CTF глючный и делает простые в реализации вещи сложными и рутинными. В нем легко натаскать объекты на экран, но сделать что-то продвинутое – сложно. Учите сразу что-то другое, CTF морально устарел.

«Дагестан», в контраст к прошлому проекту, получился настолько простым, что к нему даже ридми не требуется. Но за этой простотой скрывается монстр, который уничтожит ваш мозг и будет насмехаться над вами. Мне очень интересно посмотреть каковы будут результаты других игроков)

P.S. Поиграть во все игры с джема вы можете вот тут.

Обсуждение в telegram