Как рождался Кот211

qZurIq4

Сыграю-ка я вам песнь про разработку кота!

Ещё в декабре, когда анонсировали Гаминатор, я не собирался в нём участвовать. Совсем. Ещё была бомбарда недопиленая и ATTWN недоделанная до релиза, и Behind Mirror в заброшенном состоянии, и I See your pain, Shaman Flower, Mainframent, Eyewall, You call и ещё несколько проектов, которые я бы хотел доделать. Сказал А — говори Я и весь алфавит до этого. В общем, заняться мне было явно чем и участие в местячковом конкурсе не представляло для меня особого интереса.

Такая ситуация развивалась примерно до 4-го января когда меня достало делать мануал к бомбарде и я зашёл на Гамин поглядеть как дела идут у конкурсантов. И наткнулся на пост о Коте Зиме. Взгялнул под стол — а там сидит моя собственная кошка и мявкает — просит пожрать.

WlAN4uq

Большая жратва, пожрать, кот... В тот день моя жена как раз закончила пиксельартить большого рыжего кота с вышивки (которую мы собирались подарить на НГ её родителям).

mHRCzq9

Так родилась идея сделать игру про кота, который будет хавать всё что плохо лежит. Я высказал жене свою идею сделать игру про кота и вспомнил старую игру Alley Cat, в которую часто гоняла мама когда я был мелкий и в которую я сам так ни разу не сыграл... Повдохновлявшись 40-минутным видео я решил сделать игру в таком же простеньком стиле.

6cRImQx

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

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

Ysw360j

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

S70ctZd

Но прям его брать в игру — слишком большое разрешение (он на лого игры если что). Слишком сложно анимировать и рисовать для него окружение и создавать подобный антураж. Поэтому перерисовал кота в более низком разрешении и наши с женой мнения сошлись на нём.

tWpt8gH

После того как я его отрисовал в основных позах движения (idle, run, jump, climb) и реализвал на основе движка ГГ из Mainframent, я понял что заполненность кота по лишь индикатору из UI очень непонятна.

Кстати, изначально, сардельки начинались прямо из рожи кота, и выглядело это очень странно:

VvEipfF

Потом я UI переделал из соображений юзабилити — расоположения других элементов UI

В общем, я нарисовал ОТДЕЛЬНО 4 состояния кота и набор спрайтов для каждого состояния, за исключением тех, в которых он не может находиться. Например, на третьей стадии кот не может прыгать — потому и спрайта такого нет.

pZ3PtvH

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

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

Dazj3PV

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

Меня часто спрашивают: какой смысл UX который ты так пропагандируешь? Отвечаю: в данном случае при заточке когтей у игрока вряд ли будет время смотреть на UI игры, поэтому я продублировал эту информацию блеском когтей. Если появился блеск — значит есть +1 удар. Именно такие рассуждения и есть — проектирование UX игрока. Чтобы он не испытвал болей при взаимодействии с интерфейсами игры.

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

XnXKTps

Причём работать это должно так, чтобы никого не отпугнуть от механики.

Тогда я придумал эту систему жизней и загробного мира. Жизней 9 — классическое «число кота». Но 9 жизней на тот хардкор что я задумал было явно мало.

diDAmWL

Поэтому я решил дать игрокам шанс сохранить жизнь сыграв в миниигру. Причём в первый раз у игрока 100% шанс жизнь сохранить. Это хорошо, т.к. и казуал и хардкорщики сразу поймут как жизнь сохранить. Во второй раз появляется риск жизнь потерять. Для этого я ввёл теневых котов. Которых становится всё больше с каждой смертью (то что рыжий кот из себя оставляет теневого кота я сделал позже). Но и этого мало ведь выход среди этих котов найти довольно просто и если ты знаешь где он находится и если не знаешь. Так я решил добавить ключи, которые игрок должен будет собрать. Причём чем больше раз игрок попал взагробный мир тем больше ключей (потом я вывел корреляцию 1 ключ на 2 теневых кота). Таким образом, чтобы спастись из загробного мира игрок должен будет проявлять свой скил. И это здорово!

Экраны которые появляются после выхода из загробного мира не случайны и тоже являются частью UX-проектирования. Чтобы наглядно порадовать игрока что он только что «наебал игру» и сохранил одну жизнь, и так же наглядно показать, что жизнь потеряна.

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

RAtoroa

Здесь же я придумал хаззарды — воду, которую многие коты терпеть не могут, а так же боссов. И их абилки. НО!

Уже здесь стало понятно, что игра будет хардкором. Делать лечение на чекпоинтах я не хотел просто потому что игрок будет бегать между ними и хиляться. Тогда я придумал единственный способ пополнить здоровье — наестся на максимум и тогда из какхи выпадет личилка. Логика такая что наевшись кот пополняет жизненные силы. Долго думал как это реализовать лучше. Например, кот мог просто полежать секнуд 5 всё переварил бы и восстановил себе 1 ХП. Но такой способ ставит крест на мобильности в сражениях с боссами. С другой стороны, хотелось чтобы от отъевшегося состоянияя была немалая польза. Восстановить всё ХП  — вполне равноценный обмен. Но отъестся как оказалось — не так просто. Поэтому я сделал что за среднюю какаху +1 ХП, а за большую МАКС ХП. Решил сделать именно из какахи потому что ещё хер знает куда она улетит — дополнительный челлендж.

Итак, движок готов. Теперь уровни. Я поклонник огромного мира и бесшовных карт и решил что GMS2 вполне потянет мою задумку, но вот какого размера будет карта? Сколько экранов вы высоту и ширину чтобы поместилось четыре локации? Мой вердикт: 60 экранов в ширину, и 40 в высоту

B7Wiu4p

Реально размер картры меньше — экранов 50x25

Окружение решено было делать максимально простым без особых текстур с незначительными задниками (желательно силуэтными). По задумке окружение с которым игрок взаимодейстует — яркое. Фон — блёклый и одноцветный. Пришлось изрядно помучиться чтобы подобрать этот зелёный цвет фона и синеватый цвет задников.

OaHnLjc

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

Я так же думал вспользоваться функцией автотайлинка которая есть в GMS2, но тоже передумал. Точнее я сперва нарезал нужный тайлсет, попробовал и потом передумал. Так что всё окружение расставлено вручную.

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

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

siO71QZ

И что коты частенько спят в корзинках

EYV9LoG

Итого точками сохранения стали именно корзинки

TuEMDCX

Я планировал сделать уровни за неделю. Но даже несмотря на все блага которые даёт GMS2 проектирование только водяной локации заняло у меня целую неделю вместе с отладкой (поэтому водная локация — самая проработанная). Плюс ко всему я решил внедрить три фичи:

  1. Нелинейность. Я устал от метроидваний, и хотел сделать эксплорэейшон. А это значит что посещать локации можно будет в любом порядке. Есть отличный позитивный опыт в MMZX и MMZXA.
  2. Но нелинейность усложняет проработку уровней, обязывая делать разные пути для игрока.
    Выбор сложности. Я хотел сделать так чтобы игрок мог выбрать путь по которому идти — более короткий но более сложный или длинный но более простой. А так же чтобы игрок мог влиять на сложность босса путём выбора комнаты в которой с ним будет сражаться. Так я сделал на каждого босса две комнаты, которые формируют разный паттерн сражения.
  3. Уникальный опыт. Уровни постренные из кусочков — это неплохо и очень хорошо в руках мастера, но когда есть уникальные элементы — они задают акценты левелдизайну. На водной локации это был сектор с павающим уровнем воды и отрезок с поднимающейся водой.

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

gVfv1tL

Первого босса я придумал давно — большая рыба, но какая? Из хищных рыб в голову сразу приходит только пиранья, но они уже были как стандартные враги. Тогда я вспомнил про щуку. Эта длинная рыба... и довольно сложно её сделать боссом.. Но я нашёл способ и вроде получилось просто отлично!

KIUiOTy

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

На этом моменте мог быть конец разработки и вы играли бы лишь в водную локацию... К счастью есть продление. Но всё равно нужно ускориться и сделать две локации за оставшуюся неделю (этим объясняется их низкое качество).

В этот момент мне написал dyytch, сказал что ему нравится проект и не нужна ли мне музыка. А мне музыка ещё как нужна! Уже осознавая объёмы работ на музыку времени катастрофически не хватало. Я не знал как у меня сложатся отношения с музыкантом, поэтому как альтернативу я оставил простой эмбиент в чиптюн-стиле на коленке за 20 минут. В любой ситуации главное — план Б.

Работать с dyytch-ем очень круто. Я накидал список локаций и референсы (то что я бы примерно хотел слышать там по духу) и далее работали по схеме: набросок-аппрув-трек-аппрув-финал. Хоть на этапе наброска были откинуты варианты треков, но это были наброски, потеря которых не так демотивирует как потеря финал -трека. Очень меня порадовало что у dyytch-а такое отношение к реворку. В итоге мы получили крутые саундтреки с минимумом издержек! Единственная музыка, которая попала в релиз от меня — это музыка в меню (переработка трека из лудумовской игры про параллельные миры) и зацикленный звук для загробного мира (который я сгенерил на bfxr)

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

Я довольно долго мурыжыл подвалы. Ведь процесс проектированя локаций включает в себя:

  1. Расстановку тайлов-границ стен
  2. Наполнение каждой комнаты объектами
  3. Расстановка тайлов задников
  4. Расстановка анимирванных обхектов (вода/трава)
  5. Расстановка еды (цветы/паучкибабочки)
  6. Расстановка физических объектов (границы стен, сетки)

6zYTYAf

Это занимает ОЧЕНЬ много времени и тут я понял что замахнулся на очень большие объёмы. Но ни разу (почти!) об этом не пожалел, мир получился живым и большим.

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

ASecsbe

Здесь для ясности я поясню, что на период конкурса я поделил свой день на несколько частей чтобы успеть максимум:

утром 3 часа на игру
1 час на сборы на работу
1 час на дорогу до работы
9 часов на работе
1 час на дорогу домой
2 часа на общение с семьёй и ужин
3 часа на игру
4 часа на сон (хоть и мало, да...)


Несмотря на то что я выделял на игру 6 часов ежедневно, я мог потратить некоторое время на обмозговывание идей (например дорога на работу и с работы). Но так же стоило принимать во внимание, что после работы я был почти ни на что ни годен. Т.е. 3 утренних часа нужно было тратить на проектирование и работы требующие мозговой деятельности, а 3 вечерних часа на черновую работу типа текстурирования стен и исправления мелких багов.

Второго босса так быстро сделал благодаря именно утренним часам + 1-2 часа вечером на исправление багов. А вот расстановка объектов по пунктам 2)-6) затянулась аж до четверга и я даже не успел ничего протестировать. В итоге к лесной локации я приступил только в пятницу и в тот же день сделал босса коршуна, который использует таки механику поедания. Именно здесь я решил что какахи кота должны нести дополнительный смысл кроме лечения, а именно — нести возмездие врагам!

Вернёмся ко второму боссу. На него меня вдохновила фотка:

La0cxZ9

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

XNLnJkj

Только в субботу ночью я доделал деревья и тоже не протестировал их.

hZZGyaO

Пару раз я просто терял прогресс. Редактор комнат зависал при попытке заюзать каике-то функции тайлов и пришлось восстанавливать сохранения

Пока что неоптимизированная работа с большим количеством объектов. Если на слое много объектов, то их добавление начинает тормозить и лагать. Создание нового слоя отчасти решает проблему. Но под конец работы с уровнем тормозило вне зависимости от этого.

Ещё один момент который чуть не поставил под угрозу весь релиз — дикие тормоза. После того как я сделал лесную локацию, всё дико тормозило. Я установил MVS2018 и скомпилировал игру в YYC, но это не дало никакого эффекта. Так ещё несколько часов воскресенья я потратил на оптимизацию и управление объектами.

Ещё часть воскресенья я потратил на так-называемые WIN-скрины. Это победно-проигрышные экраны показывающие игроку его прогресс и цели и усиливающие эмоции. Таких экранов у меня было 4: потеря жизни, сохранение жизни, победа, проигрыш. Все их я выполнил в одном стиле — объекты на светло чёрном фоне и текст (который я рисовал, т.к. шрифт пилить для него не было времени). Кстати если кто не понял, основной шрифт для проекта я взял из игры «Ваш звонок...»

Далее главное меню. Заголовок для него рисовала моя жена ещё в самом начале разработки. А вот идея сделать меню с иконками пришлка ко мне в пятницу. Я решил сделать реальное меню с чекбоксами (как было в анонсе гаминатора).

jiFbyix

Функционал для одноуровневого меню делается за час времени, ещё час я делал переходы. Точнее я сделал его в самом начале, но потом переделал.

И ещё где-то полчаса было потрачено на лого гаминатора.. А ведь осталось примерно 4 часа до полуночти по НСК + 2-3 часа до реального дедлайна.

Остаток я потратил на звуки и музыку — их вставку в игру. Сами звуки я подобрал в bfxr заранее — в перерывах между задачами на работе. Стоит отметить что dyytch меня не подвёл и музыка подоспела вовремя. Я везде в коде расставил звуки, добавил музыку (но не определил объекты локаций).

Далее самое ложное в работе со звуком — выравнивание громкости, обычно процесс выглядит так:

  1. Запустить игру
  2. Проверить кусочек со звуками
  3. Внести поправки в громкость
  4. Повторять c 1) до полного выравнивания

НО! В GMS2 была заявлена фича — микшер. Как раз для того чтобы провести отладку в IDE. И я решил проверить как она работает.

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

fLdnuOh

Итак, я сперва выровнял громкость фононой музыки относительно друг друга, а потом быстро прошёлся по всем остальным звукам, которых немало (около 50). Итого всё это заняло у меня час. Если бы я проверял по своему старому алгоритму — это заняло бы ГОРАЗДО больше времени.

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

dFRi8fE

Первая мысль — косяк GMS2, реальня громкость не соответсвует уставновленной. Но прежде чем заводить баг на helpdesk YoYo я ещё раз проанализировал и понял что тупица я сам. В моей системе стояла проверка громкости на 1 как условие проигрывания следующего трека. А на деле громкость музыки была ни разу не 1, а то тчо я установил. Я переписал и отладил систему так чтобы это учитывалось.

Всё! Релиз!

А теперь начинается постмортем.

gSss4Qi

Всю неделю я играл в игру и обнаружил в ней хуилиард ошибок. Как технических так и логических.

Из технических:

  1. Не везде поставлены платформы и стены
  2. Игрок имеет возможность бить с лианы и зависать там
  3. Есть эксплойт восстановления жизней на чекпоинтах — выйти и зайти
  4. Некторые окороки невозможно собрать
  5. Улучшения взятые после воскрешения остаются взятыми.

Из логических :

  1. Самый большой косяк — это плохой UX всего флоу игры: 20% времени игрок тратит на поиск и сражение с боссами и ещё 80% времени на поиск и сбор всех окороков по локациям которые он затёр до дыр.
  2. Жизни. Их 9. Сбор 120 окороков занимает ОЧЕНЬ много времени, которое игрок запросто просрёт раньше чем за 9 жизней. Нужна система пополнения жизней.
  3. Невозможно атаковать некоторых противников и нет возможности атаковать из прыжка.
  4. За крысу слишком слабая способность, не влияющая на платформинг и боёвку.
  5. Загробный мир имеет слишком простую механику и не развивается с ростом игрока
  6. Мир не развивается с ростом игрока
  7. Много ошибок недотестированности левелдизайна — криво распооложенные враги сбор вещей не так как зудывалось.

С женой обсудили стороны развития игры. Развивать надо в этакий симулятор кота.

Жизни будут отображаться котятами в корзинках в стартовом доме. На локациях будут кошки которых можно будет трахать и которые будут давать потомство через некоторое время. При этом часть котят рыжие, а часть — нет. Рыжих котят можно будет носить к себе домой в корзинки тем самым пополняя жизни (если игрок дойдёть с котёном ни разу не умеревв). После потери жизни игрок будет перерождаться в доме в корзинке одного из живых котёнков (рейкарнация йопта!). Котята кончились — проиграл! Так я хочу убрать из игры фатализм, т.е. сейчас проблема в том что когда у игрока мало жизней — мало мотивации продолжать играть. С такой системой хоть и сложно, но можно будет восстанавливать жизни.

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

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

Чтобы решить проблему с атакой в воздухе, нужно решить заодно проблему со слабой наградой за крысу. Давать игроку за крысу возможность бить из полёта вниз (возможно за две энергии) смэшем, да ещё и короткие волны пуская в стороны. Как это делает крыса после прыжка.

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

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

Большой урок мне на будущее при работе с GMS2 — не делать огромные открытые миры. Лучше разбивать игру на локации.