Типа девлог по разработке Phoenix 2 для ОКИ в двух актах

?
в блоге ОКИ



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

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


Этап 1 — ШОКИ
История берет начало весной 2020 года, в момент анонса ШОКИ. Когда я туда записывался, каких-то конкретных идей не было, но хотелось хорошей практики в новом тогда для меня годоте. Немного подумав, я решил сделать что-то наподобие олдскульного шутана с очень низкополигональной графикой (це стиль). В изначальных идеях я опирался на Dusk — игра купила меня своей динамичностью и крутой музыкой. Также она выглядела довольно просто реализуемой (но это было только на первый взгляд).

Идея добавить три расы для игрока со своими особенностями пришла самой первой.
Плюсы этой идеи очевидны. Возможность пройти игру тремя разными способами за, по сути, трех разных персонажей добавляет той самой реиграбельности, причем именно такой реиграбельности, которая звучит интересно. Проблемы были в тонкостях баланса — как сделать земнопоней интересными относительно других, а игру за пегасов — именно рубиловом, а не “пролететь от начала локации до конца и пройти уровень”? Эти вопросы приходилось решать всё время разработки игры.
(Заходя вперед, эту проблему я в итоге решил с помощью различных геймплейных мелочей. Так, для единорогов я добавил левитацию оружия (но только визуальную, по факту ничего не меняется, кроме анимаций), телепортацию и щит, блокирующий весь внешний урон. Для баланса пегасов я добавил в диздок несколько уровней в помещении — не имея никаких плюшек, кроме полета, пегасы в теории должны были проходить эти уровни с трудом. С земнопонями было сложнее всего. Они звучат как самая скучная раса даже в лоре самого сериала. В итоге я добавил им больше места в инвентаре — они же типа сильные — а затем целую отдельную силовую броню специально для одной расы.)

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

(Уже к тому моменту у меня была фраза, записанная с помощью 15.ai с голосом Флатти: “благодарим за использование нашей экспериментальной системы воскрешения, названной «феникс 2! Надеюсь, вы больше не умрете с:”, которая должна была запуститься в этот момент. В итоге я даже назвал всю игру на основе этой фразы, а в версию БОКИ она не влезла, кек)

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


Определившись с концептом, я уже по привычной методике начал расписывать свои планы пошагово — и у меня даже остался скриншот этих планов в самой первой их вариации:



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



Финальная моделька с готовыми текстурами занимала 396 полигонов и выглядела, как по мне, просто афигенно:



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



Пока я их моделил, я включил логику и задумался над тем, каким именно образом главгерой будет разваливать целую базу обученных воевать зебр в одиночку. Как раз в это же время я познакомился с творением Гения — metal gear, и постепенно начал фанатеть от этой серии. Тут же захотелось иметь у себя кусочек этого творения, а с учетом сомнений, про которые я писал в начале абзаца, я решил добавить стелс как один из вариантов прохождения уровней. Вместо изначальной цели “убить всех на уровне”, появились более логичные цели типа “украсть что-то на уровне”, а день превратился в ночь:



Постепенно на уровень добавлялись модельки и текстуры:



— Пс, не хочешь в армию к зебрам?


У меня даже сохранились первые два билда, в которых можно побегать по локации и глянуть на прогресс:
Ссылочкиdrive.google.com/file/d/1yWkqryhpOWatGwam6TxCs-0d7NJnhvC9/view?usp=sharing
drive.google.com/file/d/1DvEY3iyUDmLHrrlt-PY9CuUC8Ub2LplT/view?usp=sharing


Когда с модельками на уровне было покончено, я перешел к созданию моделек оружия. Замоделив пистолет, я повесил его на камеру и побегал с этим по локации. Пока бегал, увидел тень от пистолета и решил, что было бы прикольно вместе с тенью от пистолета видеть тень от главгероя. А в процессе моделирования подумал “почему б тогда не сделать тело для ГГ полностью видимым, прикольно жи”. Так внезапно родилась эта низкополигональная милаха:



С телом под камерой бегать по локации стало гораздо приятнее и атмосфернее:



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



Эту механику я оправдывал тем, что пистолет был со встроенным коллайдером. Как оказалось, годот не поддерживает рендеринг на разных слоях (как это было, например, в Commisioner’s Task на юнити), и отдельный слой для оружия, чтобы оно не вылезало за текстуры, сделать было невозможно. Пришлось добавлять пистолету физику. А бегать с такой балдой перед камерой и врезаться в текстуры уровня хотелось как можно реже. Плюс, появляется геймплейная необходимость смотреть на тельце, которое я старательно моделил.

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

Долго бегать по уровню и смотреть только на ноги, не имея возможность осмотреть эту милаху целиком, я не смог, и вскоре добавил в игру зеркало:



После этого в игру была успешно добавлена простенькая рейкастовая стрельба, а работу стрельбы я внезапно проверял на тех самых зеркалах:




Стоит отметить, что игру я делал не совсем в одиночку — у меня было как минимум два тестировщика (StaSyaN (на момент ШОКИ не был оргом) и Phelanhik , который сделал просто афигенную авторскую музыку для игры). Спасибо им большое за помощь.
С ними я советовался и спорил все время разработки, многие из их советов и предложений в результате было добавлено в игру. Одним из таких предложений была камера от третьего лица. Признаюсь, я долго сопротивлялся этой идее, т.к. не считал анимации поняхи достаточно проработанными для игры от третьего лица. В принципе, даже сейчас я не считаю их такими. Однако стоило мне передвинуть камеру чуть позади главгероини и поиграть так немного, как все сомнения развеялись — даже с такими анимациями играть от третьего лица было очень прикольно.

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

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

Этап 2 — БОКИ
В конце 2020 случился анонс БОКИ со сроком в год, и я, недолго думая, решил снова наступить на те же грабли и записался на конкурс. Некоторое время думал, какую игру хотел бы сделать, но быстро забил на разработку новой игры с нуля и пошел продолжать делать феникса.

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


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

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

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


Данные о вещичках я решил хранить в виде жсонов

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

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

Помня про баги в сохранениях-чекпоинтах, я решил переписать и их, сделав трушную системой сохранений в любом месте игры.
Вместо сохранения предметов по отдельности, я добавил общий интерфейс и его обработчик. Этот обработчик должен был проходить по всем объектам, реализующим интерфейс, и вызвать методы “сохранить” или “загрузить” независимо от того, каким образом они делаются в каждом конкретном объекте. Короче, перенес реализацию сохраняшек с самих сохраняшек на объекты, которые они должны сохранять.
Все было прекрасно до того момента, как в игре не начали спавниться новые объекты и удаляться старые. Вся система поехала, и пришлось её дорабатывать.
В обработчик также добавился массив созданных и удаленных объектов, а файл сохраняшек вырос в два раза, сохраняя кроме текущих объектов на сцене, еще и созданные/удаленные. Багов в этой системе было полно, и вдаваться в подробности не хочется. Скажу лишь, что вроде бы все уже исправил, и система сохраняшек на данный момент работает стабильно как часы и сохраняет уровень в любой момент по желанию игрока.

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

Также в игру добавилась система диалогов. Изначально я планировал использовать для них озвучку 15.ai и анимирование персонажей примерно как в Commisioner’s Task. Даже честно пытался все это реализовать, но поскольку вместо реальных глаз/ртов на модельках поней были текстуры, анимировать их было сложно. Кроме этого, сервис лежал практически все время разработки, поэтому пришлось забить на это. Взяв за основу диалоговую систему из сталкера, я сделал такую же прокручиваемую менюшку на весь экран, а чтобы она не мозолила глаза людям своим ярко-зеленым цветом, добавил настройку для цвета всего игрового интерфейса.
Это решение позволило мне добавлять и исправлять диалоги на ходу, поэтому я о нем не жалею. Благодаря нему в игре существуют редкие сайд-квесты.

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

10 комментариев

Тяжела и неказиста жизнь простого ОКИ-программиста.
Буп! Делай, ждём.

А я пока буду собирать список своих ошибок и пелить свою исторью розроботки

P.S. Вообще, я хотел сделать сделать псевдо3д игру про поней, когда-то давно, с графикой как в вульфентейне3д или тес: Арене. Что думаешь? Я спрашиваю по той причине, что твоя графика, несмотря на трёхмерность, создаёт ощущение игры в Даггерфолл, который хоть и был уже в 3д, но ещё не далеко ушёл от псевдо3д, в том числе по разрешению текстур и всё ещё спрайтовым персонажам.

П.П.С. Можешь в личке (ну или здесь) поделиться кодом или описанием работы терминалов? Я и в комментах, и на стриме, и теперь уже здесь не перестану повторять, что это офигенная фича. Ну, строго говоря меня интересует не то, как они работают в игре в виде натянутых текстур или типа того, а именно код его «ОС»
Собираешься сделать псевдо-3д с кастомным движком? А я вроде помню, что ты и раньше собирался сделать что-то подобное, но не помню, чем все закончилось.

Окей, скину чуть позже
Закончилось тем, что я набаловался модулем GraphABC для PascalABC.NET, начал переходить на SFML, а потом временно забил

Выглядело так youtu.be/byADmVcfGuM?list=PLa88KCxJAf72fYmd4q6XMC66V4so71JsM
но не помню, чем все закончилось.

тем, что он не успел с ней разобраться и в итоге быстренько сделал игру про кидание пирогов в бизонов
П.П.П.С. Так же хочу чтобы в игре могли не только убить но и отрубить крыло или рог и если пользователя не вылечат то он умрет, так же выколоть глаз но пользователь может не умереть а просто пол экрана не видеть, или достать или купить протез, если ногу тоже либо умреш либо будеш ползать либо на коляске котаться, или самое хорошее… поставить протез.
И чтоб домики деревянные набигали! Я джва года ждать могу!
вспомнил как на одном из прошлых ОКИ были бегающие замки в какой-то из игр…
Оно то вроде бы и набигающие дома, а вроде и ярчайший эпизод в индустрии шутероф как раз был про это
Phelanhik, который сделал просто афигенную авторскую музыку для игры

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.