Paper Summoners: Пост-мортем

b3LMusF

Очень сложно подобрать слова чтобы описать историю этого проекта. У него была мега-сложная судьба, но я искренне рад тому, что из него в итоге получилось. Расскажу по порядку как все разрабатывалось, с картинками (и будет даже немного гифок).

Всё началось примерно через дней пять после анонса темы. Я пытался брейнштормить разные варианты, которые бы подходили под описание темы и условия, было безумно сложно придумать что-то под столь специфичный запрос: по сути вариантов было два — сделать переключение между двумя режимами или проигрывание двух режимов друг за другом последовательно. Первый вариант уже был мной сделан на Гаминатор 10 — это «Навеки Один?» которую мы делали с Кситилоном в далеком 2012 году (вот время течет, дичь!). Поэтому в основном я был сфокусирован на втором варианте — сделать последовательное прохождение двух разных кусков геймплея.

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

lUlOXyz

Первая попытка сделать цифровую card-based игру у меня была в 2019 году — это был спин-офф к игре Xitilon.HD408 W4RR-i/o-RS — W4RR-i/o-RS: Descent. Карточной её можно назвать довольно условно, но в итоге игра концептуально во многих моментах схожа с Paper Summoners, особенно в роуглайк составляющей. С другой стороны, механика и сложность программирования двух проектов находятся на принципиально разном уровне. В моей W4RR-i/o-RS палки в колеса вставлял выбранный движок (вернее отсутствие такового, игра написана на голом Паскале) — многие вещи вроде оконного интерфейса или примитивных эффектов нужно было писать с нуля руками, и на это ушла уйма времени.

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

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

o7wrSSnZWoOSCg

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

dDQG37W

Вот такие карточки я сделал в фотошопе, открыл Tabletop Simulator, и стал тестить…

bXeJhIJ
(смешной кот на рубашке, потому что меня заставили выбрать картинку и я взял первую попавшуюся)

Мда. Сказать что получилась какая-то лажа — ничего не сказать. Механики явно были интереснее в моей голове, чем в реальности. Но основная проблема, из-за которой посыпалось вообще всё — было абсолютно невозможно держать в голове обе стороны карты пока играешь. А ведь они обе имеют принципиальное влияние на геймплей! В общем всё было чрезмерно сложно, и пазлы не сходились воедино. А как всё хорошо начиналось!

Было решено пока положить эту идею обратно, дальше «мариноваться» в моей голове; дальнейшее развитие появилось только где-то через неделю. Интересным образом в моей голове офисные работники и рыцари объединились воедино и стали фентези-персонажами, основанными на канцелярских товарах. А для чего нужны канцтовары? Правильно, для манипуляций с бумагой! Соответственно появилось бумажное поле, на котором эти карты проводят свои манипуляции. Изначально планировалось, что его можно будет красить, разрезать, склеивать обратно, стирать, закреплять кнопками, протыкать, в общем, делать всё то, что обычно делают с бумагой. Что из этого осталось? Правильно, почти ничего! XD Ну, осталось самое главное — раскрашивание поля. Почему так получилось? Наверное, потому что во время брейншторма разных предметов и их способностей больше всего среди них было тех, которые красят бумагу. Было решено, что это и станет основной механикой.

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

19 апреля я впервые сел за проект, начал со спрайтов. Поделился с LLLoyd, он сказал что это всё фигня и предложил нарисовать концепты. В процессе выяснения деталей он предложил вообще нарисовать полноценные арты для игры. В этот же день я получил скетчи всех персонажей и утвердил их. Под конец проекта с графикой присоединилась помогать моя подруга MadSpacePants — бумажка и спрайты блобов на поле это её рук дело (в конкурсную заявку я её не стал добавлять, так как на гамине её пока нет).

Кстати, арты в игре ещё не готовы полностью — хоть серая подложка выглядит и стильно, планируется что в финальной игре все картинки будут в цвете. Ждите релиз полной версии!

StzAsq6
Один из первых скриншотов игры тестовой графикой. Обратите внимание на немного отличающиеся цвета.

Разработка началась где-то 22 числа с простых механик вроде рисования поля и быстро обросла разными деталями и фичами. Началось всё с разработки схемы управления — было решено сделать всё изначально основываясь на кнопках и двухмерной матрице выделения элементов (сетке). В итоге это решение немного выстрелило в ногу в части удобства, так как под конец стало понятно, что выбирать мышью поля удобней и поспешно написаны костыли которые поженили бы две системы ввода. Получилось в целом сносно, но разные приколы со скачущим выделением от этого можно наблюдать (координаты выделения вычисляются отдельно от логики перемещения самой рамки-курсора и не всегда совпадают из-за дублирующего отрисовку кода). Из-за невозможности совместить ввод на кнопках и указание мышью по полю (оно должно работать даже когда курсор вне поля, а значит захватывает весь экран) в итоге отдельно кнопки работают только если отключить ввод с мыши.

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

Сначала разрабатывалась самая простая версия интеллекта, условно я назвал её «Дурак», потому что она играет банально от своего угла и вообще не смотрит на то, как оптимально она ходит. Вторую вариацию этого ИИ я обозвал «Жадиной» потому что он научился ходить в зависимости от суммы закрашенных полей. Третья версия, названная уже просто «Продвинутой» уже очень шарила за то как надо ходить и старалась сначала занимать свободные поля, отказывая игроку в пространстве для маневра. Этой версии при прочих равных я уже начал регулярно проигрывать, что вызвало мой неподдельный интерес! Наконец-то, достойный противник! Наша схватка будет легендарной! В итоге в игре на разных этапах можно встретить разные версии интеллекта, в зависимости от того, как далеко зайти.

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

wkBVpRd

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

Вообще вся неделя с 23 по 30 напоминала один сплошной сон при температуре 39 с тем исключением, что я был в добром здравии и здравом уме, разве что программировал по 12 часов в день и спал по 6. Я жестко вкалывал каждый день, зная сколько фичей в игре ещё запланировано для минимальной играбельности и не готово. В общем, планы были наполеоновские. Удивительно, что из всего этого пришлось урезать буквально пару фич. В основном была вырезана фича под названием «экипировка» — это карты которые можно было надевать на обычные карты воинов и которые модифицировали бы их навык. Фича была урезана из-за проблем с отсутствием пространства для дизайна разных модификаторов способностей, и в итоге полностью заменена на карты поддержки (которые было проще задизайнить, а главное — закодить; хотя проблемы с дизайном и у них всё равно наблюдаются).

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

Например, я придумал как встраивать нелинейную интерполяцию на самые топорные движения и жизнь заиграла новыми красками. Еще я научился работать с такими новыми для меня штуками в GMS2 как слои эффектов и особенно секвенции. Секвенции — это прекрасный инструмент для редактирования встроенных анимаций с ЧУДОВИЩНЫМ и неюзабельным API. Даже какой-нибудь API вершин, матриц или партиклов кажется райским уголком в GMS2 на этом фоне.

Вообще, очень сильно помогали все те фичи GMS2 которые я освоил ещё во времена разработки Happy Birthday! — структы, функции и методы, упрощенное объявление массивов. Хотя 90% кода в игре сфокусированы на работе с DS_Grid, который вроде и стар как мир, но всё ещё удобен из-за простой возможности искать в них что-либо, умножать и складывать их как матрицы, в общем всё это было чрезмерно полезно и ускоряло/упрощало разработку.

31rl4MM

Кстати, ещё немного вспомнил как работать с 3D и замоделил пенал в Blender, а затем вставил его в игру. Самое сложное было анимировать этот чертов бегунок молнии, часа три я на это точно убил. А раскрытие самого пенала никак не получилось бы нормально сделать — со скелетной анимацией не дружит ни GMS2, ни я XD

q9XvUCH
(пенал делает свои первые шажочки!)

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

Ах да, и музыка. Тут всё было довольно просто — нашел один стиль и написал в нем пару треков + вариацию одного из них. Треки написаны в Caustic 3 (сайт у них умер, так что вот ссылка на плей маркет), но это не особо важно, так как кроме пары саундфонтов и эффектов в композиции ничего не используется, подошёл бы абсолютно любой DAW.