SamuKata
teedeezet
teedeezet

boosty


Итоги месяца: февраль 2025

Привет всем спонсорам!
Объём работы за февраль был проделан огромный, но почти всё - сплошная техническая скукота. Поэтому пост в этот раз будет сравнительно небольшим, но при этом не менее содержательным, чем обычно.
[Grim Wild]
Лирическое отступление
Мои давние подписчики знают, что разработка проекта идёт не совсем обычным путём: вместо того, чтобы равномерно наполнять игру геймплейными новшествами, я уже несколько лет целиком и полностью делаю упор на технический фундамент.
 
Обычно я занимаюсь созданием механик, которые после активной стадии разработки ещё долго существуют в проекте в изоляции (мало для чего используются и ни на что не влияют). К таким "сиротам" относятся сейчас логические компоненты, игровое время (тики), GPU симуляции, Player Task'и, система освещения, Lua скрипты, композитные текстуры и ещё куча мелочей.
 
Многим такой подход к разработке покажется странным и глупым. Но для меня он вполне логичный: основные идеи игры ведь уже давно придуманы, и я точно знаю, какие механики мне вскоре будут нужны, и какой функционал и API они должны содержать.
 
У меня в голове есть ясная картина того, как должен работать проект и каждая его отдельно взятая часть. И то, что я реализовываю всё с разных концов - не ошибка. Это подготовка к тому, чтобы строить высокоуровневые механики на подходящей для них основе, с минимальным количеством костылей и последующих переделок.
Такой подход создаёт своеобразные странности. Например, генную инженерию для растений я изначально планировал сделать "когда-нибудь потом, ближе к релизу". Но из-за того, что возможность её существования была прописана в требованиях к моей системе виртуальных ассетов, получилось так, что всё для неё уже было сделано и протестировано. Мне теперь остаётся просто в любой удобный момент внедрить ГМ-сорта (после реализации растений). С создаваемыми игроком моделями роботов и (потенциально, но не факт) оружия - то же самое.
 
С самого начала раннего доступа у игры будет готов фреймворк, позволяющий выдержать любую идею из запланированных. Я в тот момент окажусь на большом распутье, и мне придётся решать, что именно из этого широкого списка сделать первым, а что может подождать.
 
Но пока мы вынуждены вернуться в реальность, где всего этого пока нет, но где я продолжаю усердно инвестировать своё время и силы в то, чтобы в будущем сказать: "Ну видите, я же говорил, что всё так и будет!"

Система модов: объединение механик


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

Первое изменение - это название. Раньше она называлась Package System, но после ухода от идеи DLC и, как следствие, встраивания космоса в базовую игру, прошлось это поменять. Теперь система носит имя UGC System (сокращение от User-Generated Content) и полностью фокусируется на созданном пользователями контенте - модах и мод-паках (сборках).

На самом деле, разницы между модом с сборкой с точки зрения кода нет, они имеют один и тот же функционал: импорт/экспорт из Steam Workshop; добавление нового контента и изменение существующего; перевод текста на разные языки; а также определение зависимостей от других модов и сборок.

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

Как работает модификация ассетов

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

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

Применяются слои так:

Добавление и удаление логических компонентов работает так же:

Работает всё это на основе Delta Serialization из движка. Каждый объект в игре имеет свой Архетип, и все изменённые поля сохраняются на диск именно относительно него.
Такая логика происходит и во время сохранения игровой сессии. Игровые объекты записывают на диск только отличающуюся от их Архетипа информацию (например, если у предмета 90 здоровья из 100 по умолчанию), и это значительно уменьшает размер .save файла на диске.
 
Стоит ещё уточнить, что всё это - бинарная сериализация, а не текстовая. Все данные хранятся в сыром виде, быстро читаются компьютером (что важно в рантайме; особенно при том, что ассеты подгружаются прямо во время игры) и не могут быть вручную отредактированы (только через мои инструменты для мододелов).
Система модов: обо всём кратко

Обо всех остальных изменениях февраля я расскажу вам кратко.

• Появились не только мод-паки, но и в принципе понятие "текущая сборка". То есть состояние игры со всеми применёнными модами. Появилась и её инициализация, и возможность смены через меню (как и обещал, перезагрузка игры для этого не требуется!).

 • Появилась обновлённая система игровых настроек: это как раз в прошлом "сирота", которая до реализации модов не могла существовать сама по себе. Дело в том, что настройки в игре - это те же самые ассеты (OptionData), которые могут добавляться модами.

• Вместе с игровыми настройками в игру была привязана и PlayerData - это "все данные об игроке", которые сохраняются на диск и в будущем в Steam Cloud. Туда входят некоторые отдельные настройки (например, разрешает ли он собирать анонимную статистику; про неё написано ниже).
• Обновлённое окно Asset Editor (старую версию мы могли видеть в седьмой серии) находится в разработке, но работы там ещё много. Как сделаю, обязательно покажу процесс создания модов.
 
• Механики, которые автоматически привязались к основной игре: Steam Workshop, моя собственная система переводов, генератор документации Lua и Data-Driven Widgets (возможность редактировать свойства объектов, ассетов и настроек через визуал).
 
Кстати, переводы на разные языки как раз хранятся на диске не в бинарном, а в читабельном формате. Я сделал их реализацию через JSON, чтобы мододелы могли менять их в любом удобном редакторе:
Но проблема пока есть с Луа-скриптами. Они на данный момент являются частью данных ассета, поэтому редактировать файл кода в стороннем редакторе нельзя.
***
 
Полный список того, что могут добавлять моды: игровые объекты (предметы, постройки, квесты...), логические компоненты, настройки, палитры UI, переводы (для своего и стороннего текста), наборы параметров сложности, элементы интерфейса и звуки/музыку.
 
Правда, с виджетами на экране сейчас есть неопределённость. Я пока не тестировал это, но мои планы заключаются в том, чтобы просто вывести весь функционал Slate из Unreal Engine в Lua. Что из этого получится - не знаю.
 
Со звуками и музыкой тоже вопросов много. Я пока не занимаюсь этой темой (да и вообще, это у меня "слабое звено", опыта работы в котором очень мало), но надеюсь, что всё сделать получится.
Сбор игровой статистики
 
В феврале я внедрил в проект плагин
GameAnalytics, который позволяет мне собирать анонимную информацию обо всех проблемах, с которыми сталкиваются игроки. Это нужно для того, чтобы оперативно исправлять их, не дожидаясь, пока хоть кто-то напишет мне об их существовании.
 
А ещё чтобы на большом массиве данных видеть, как "игра вообще играется": находить проблемы с балансом, проводить A/B тесты, смотреть на то, что игрокам нравится, а что нет.
 
Ещё раз повторю, что статистика полностью анонимна. Мне вообще не нужны данные об игроках! Я всего лишь хочу сделать разработку игры быстрее и лучше. В любом случае, от этого можно в любой момент отказаться.
Пример оповещения о проблеме: у одного пользователя два раза случилась некритичная ошибка "Hello World"

[Публичная деятельность]

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

А ведь именно с этой серии должен был начаться "пулемёт контента" с лёгкими в создании видео... Обычно я говорю вам "что ж, это было самое сложное в создании видео", имея ввиду монтаж. Но не в этот раз! Этот ролик измотал меня уже на первом этапе своего существования...

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

[Работа на март]

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

На март по этой же причине я планов не строю. Моя единственная задача - продолжать привязывать "сирот" к основной игре, а всё остальное будет решаться на месте.

Спасибо за внимание!


Итоги месяца: февраль 2025 Итоги месяца: февраль 2025 Итоги месяца: февраль 2025 Итоги месяца: февраль 2025

More Creators