Devlog 2026.04
Вдоволь напрокрастинировавшись с ASMDEFами я решил таки вернуться к игре и сделать что-то полезное для ее развития. Чем-то полезным я решил выбрать не абилки персонажей для развития боевки, а награды и квесты.
Механизм окончания боя у меня появился почти сразу. Мне было важно сразу ограничить количество уровней в этапе и сразу сделать UI, который показывал бы выигрыш или проигрыш и позволял легально выйти из боя через эндгейм или паузу. Ну и до кучи контроллер UIя, с которым можно было бы удобно взаимодействовать. Так что тут все работает довольно давно и без каких-либо проблем. Хоть и переделывалось пару раз. Как иначе.
Система вознаграждения тут давно напрашивалась. Не то чтобы у меня был какой-то план как именно ее реализовывать, но получилось все довольно просто. Награда у меня может быть как собственно наградой, так и контейнером наград. Собственно награда - это что-то типа Изменятора из боевой системы, который может начислить какое-то значение какому-то параметру какой-то карточки. А контейнер - это список наград которые могут выпадать как гарантированно так и случайно в соответствии с установленным весом.
Так как и контейнер и сама награда являются собственно наградой, то можно как выдать одиночную награду так и сделать целую иерархию из контейнеров, которые будут реализовывать разные вариации случайных выпадений. Сейчас это не очень важно, мне было интересно иметь саму возможность.
С квестами получилось более интересно. В основном потому что мне самому были менее понятны требования к ним. Я потратил какое-то время на эксперименты пытаясь по старой традиции создать что-то универсальное, но все время получалась какая-то фигня. В основном из-за того что я пытался придумать что-то новое.
Прежде всего квест - это штука, которая проверяет состояние какого-то счетчика. Когда счетчик достигает нужного значения квест открывает возможность забрать связанную с квестом награду (вот зачем на самом деле мне была нужна система вознаграждения).
Так работает абсолютно любой квест. И тот, условием которого является убийство мобов, и тот условием которого является выполнение других квестов. Всякие трофироуды, сезоны, дейлики - это тоже квесты. Примерно по той же причине по которой и валюты, и энергия - это Счетчик. Просто они ведут себя как контейнеры. Но при этом имеют ровно тот же набор характеристик что и обычные квесты. Только если обычный квест смотрит за убийством мобов, то контейнер… смотрит только за собой.
Я довольно долго сопротивлялся, но счетчики и контейнеры все же добились своего. Оказалось что вместо того чтобы придумывать какую-то новую структуру легче всего сделать квест Карточкой. Просто не как персонажи, а как боевые режимы и этапы, у которых тоже есть какаие-то дополнительные свойства типа списка вложенных объектов, стоимости входа и других прибитых гвоздями опций.
Таким образом квесты инициализируются аналогично всем карточкам и имеют те же свойства. Кроме счетчиков можно добавить например стат, от которого будет зависеть количество монстров, которых надо убить. Условие выполнения квеста это даже не совсем условие, а фильтр который проверяет соответствие “аналитического” сигнала тому что я хочу в конкретном квесте учитывать.
Проверкой достижения нужного значения занимается стат, который работает аналогично счетчику опыта у персонажей. При достижении определенного значения стат говорит UIю вывести кнопку левелапа, или в случае квестов закрытия квеста и получения награды. Я все еще думаю должна ли награда быть частью левелапа или храниться в квесте отдельно.
Тут надо сделать пару важных отступлений. Во-первых я обратно разобрал механизм статов на две отдельные части. С полгода назад я потратил довольно много времени чтобы сделать из двух статов один. Это была ошибка.
- Одна часть теперь называется Прогрессом и отвечает за проверку накапливаемого опыта текущему уровню по таблице опыта. Когда опыт достигает значения очередного уровня Прогресс отправляет сигнал, к котором можно например привязать кнопку левелапа.
- Вторая часть теперь называется Конвертер и отвечает за получение какого-то значения из другого значения через таблицу. Звучит очень похоже, но работает настолько иначе, что получилось все-таки два отдельных механизма.
Конвертер не создает никаких дополнительных событий кроме собственно обновления конвертируемого значения и на вход принимает 1 параметр, а не 2, как Прогресс. Прогрессу важно знать не только текущее значение опыта, но и текущее значение уровня так как левелап не происходит автоматически, а так или иначе должен быть кем-то инициализирован: игроком или алгоритмом - не важно.
Еще одним важным отличием Прогресса от Конвертера является то, что кажется я хочу запихнуть в прогресс два дополнительных свойства: цена левелапа и вознаграждение. Это значительно усложняет всю структуру прогресса, так как позволяет например связать и цену, и награду со значением текущего уровня. И в том числе сделать так чтобы само увеличение текущего уровня было не захардкожено, а происходило из того самого вознаграждения.
Правда все это привело к тому что собственно Статов у меня в игре больше нет. Возможно, Статами должны быть Конвертеры, но мне от этого не уютно. Что делают Конвертеры я знаю, а что делают Статы - нет. Мне тупо не хватает опыта в ролевых играх. Зато я понимаю на кой хрен люди бывают придумывают какие-то совершенно левые термины, которые мешают сопоставлять на самом деле одинаковые вещи. Вот именно на этот хрен и придумывают.
Во-вторых, про “аналитические” сигналы. В игре есть набор событий, которые можно обложить буквально сигналами обычной сигнальной шины Зенджекта, да святится имя его. Этот механизм все равно так или иначе будет нужен просто потому что игре будет нужна аналитика. Так что придумывать какие-то другие способы ловли событий, которые можно было бы учитывать в квестах кажется совершенно лишним.
В результате два зайца случайно убиваются одним выстрелом.
В третьих, у меня снова появился термин Атрибут. Изначально Атрибутами я называл разные типы Счетчиков. Но так как Счетчики - это просто Счетчики, дополнительно называть их Атрибутами показалось мне странным и я выпилил их упоминание, на сколько мог. Теперь же у Атрибутов появился новый, более устойчивый смысл.
Атрибут - это что-то типа Тега, который позволяет собственно атрибуцировать Карточку. Теги у меня уже заняты, хотя правильнее их было бы называть не Тегами, а Ключами, но не суть. Атрибут же как свойство карточки должен помогать в фильтрации карточек в разных случаях.
Например, я могу повесить на персонажа Атрибут “монстр” и вместо того чтобы ловить сигналом отдельно события убийства монстров и персонажей игрока, я могу ловить только сигнал смерти а какого-то персонажа, а фильтровать уже на уровне квеста с помощью Атрибута. Так же через Атрибуты и Модификаторы можно будет сделать разные бонусы стихий и еще что-нибудь прикольненькое.
Почему Атрибуты - не Теги? Потому что Теги - часть архитектуры, которая помогает налаживать связи между объектами на уровне бэкэнда. Атрибуты же - это часть игровой механики, которая должна помогать в фильтрации. А значит атрибуты должны выводиться в различных меню, а значит иметь тексты или быть с ними связанными.
Пойду Теги в Ключи переименую.
В результате система квестов получилась с одной стороны простой, а с другой стороны необычайно универсальной и при этом вытягивает за собой довольно много дополнительных и важных для игры механик. Отдельные квесты типа дейликов и ачивок, квестовые системы типа трофироудов и сезонов - все делается буквально одной системой. Разве что только диалоги не поддерживаются пока.
Я продолжаю думать о том какой странной и противоречивой штукой является идея “универсальности” различных систем игры. Уже полтора года назад я собственно начал с того что пытался сделать что-то мега-универсальное. Это было следствием моей неопытности и не понимания того что за что должно отвечать. Я боялся что какие-то вещи у меня будут недостаточно универсальными, но при этом ломался об попытки предусмотреть все варианты их использования. И я даже пару раз запрыгивал на эти грабли, когда например объединил будущие Прогресс и Конвертер в один единый Стат, хотя изначально они у меня были отдельны.
Я довольно долго страдал выделяя различные системы, но в итоге пришел к тому что в основе всего у меня таки находятся просто мега-универсальные вещи. Карточки отвечают в игре буквально за все сущности у которых есть какие-либо свойства. Свойства одинаково подходят и персонажам, и квестам. Даже система классов персонажей в итоге привела к тому, что из всего обилия свойств Квестов я просто переопределяют Прогресс, так как он у всех квестов очевидно, хоть и не обязательно, отличается. Все это одинаково, а значит надежно инициализируется и просто работает без каких-то дополнительных танцев с бубном. И это с моей точки зрения жутко удивительно.
Get mineNimble
mineNimble
More posts
- Devlog 2026.0248 days ago
- Update 2026.02.2255 days ago
- Devlog 2025.12Dec 14, 2025
- Update 2025.12.01Dec 11, 2025
Leave a comment
Log in with itch.io to leave a comment.