Как создать живой игровой мир? Динамические события НПС в SPACERIFT [Voice&Event]

Сектор 21580 - скриншот от игрока SEREGA 27RUS
Сектор 21580 - скриншот от игрока SEREGA 27RUS

В продолжение темы про механику Role Task Action (RTA), которая начнет функционировать в февральском обновлении моей игры, я решил затронуть еще одну составляющую ролевой системы НПС - Voice&Event.

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

Что за Voice&Event? Зачем оно?

Voice&Event - это орган RTA, который берёт на себя задачу генерировать события исходя из обстановки вокруг НПС и его состояния. Если RTA генерирует линейный алгоритм поведения персонажа (куда лететь, что делать) и реагирует на опасность (защищаться если есть силы, убегать на базу если кончается корабль), то Voice&Event - это оживление каждой составляющей RTA, вовлекающее игрока и обращающее на себя внимание.

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

Заглянем под капот

В первую очередь я написал систему событий когда один НПС может подписаться и отслеживать события с кораблями вокруг. Это события характера "Получил урон", "Потерял щиты", "Погиб", "Улетел из сектора", и другие. Отслеживание событий необходимо для анализа обстановки и работы Voice&Event.

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

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

Поднимаемся на верхний уровень - реализация сценария

Самый приятный момент в программировании такой штуки, это когда весь низкоуровневый код написан и остается "просто добавить воды" скриптом, содержащим 50-100 строк, который расписывает всю логику сценария на уровне вызова готовых функций. Так что там у нас по сценарию? Да всё просто :)

1. Попросить помощи - происходит когда НПС получает урон, его щит меньше 70%, и он еще не просил помощи. Запрос отправляется всем в радиусе 5км

2. Отреагировать на помощь кого-либо в бою: если по текущей цели нанесен урон, мы отслеживаем "наносителя" урона, и... Дальше усложняем: Если этот корабль нам уже помогал - ничего не делаем, в противном случае - добавляем его в список Helpers(список кораблей, которые уже были добавлены до этого в "помощники").Если мы добавили помощника - отправляем ему сообщение что он красавчик.

3. Поблагодарить и выдать награду. Это событие происходит когда: Мы уже устанавливали боевую цель, а затем установили её в пустое значение (то есть бой однозначно был, а теперь целей не осталось). Дополнительно проверяем не осталось ли врагов вокруг, а затем перебираем всех помощников и рассылаем им сообщение что они красавчики, а еще деньги. Сумма награды за помощь = (1 секунда боя*8)/количество помощников, но максимально - 30 000 космических рублей.

Вот так это выглядит вживую

Извините за качество, забыл повысить битрейт в OBS после стрима :)

Конечно, я описал здесь всё поверхностно - было очень много подводных камней и задачек, над которыми пришлось поломать голову. Так, например, если в секторе воюет более одного патруля - каждый из них запускает данный сценарий, даже если они сражаются с одним пиратским кораблем, и мы слышим по 3-5 обращений сначала о помощи, потом благодарность, и собственно, 3-5 наград получаем. Эт не дело. Пришлось запилить лимит на события в рамках одного сектора. И это только одна из проблем, а сколько их ещё будет, когда я загружу это всё на закрытый сервак и пущу туда тестеров? :)

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

АКТИВНО ВЕДУ ВК (VK Video): https://vk.com/arcanum_team

АКТИВНО ВЕДУ Telegram: https://t.me/arcanumteam

SPACERIFT: Arcanum System в VK https://vk.com/spacerift

Поддержать и подписаться на Boosty: https://boosty.to/arcanumteam

6
13 комментариев

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

Тогда квест на помощь от трёх караванов (разных групп и фракций) затроится (ибо у них 3 разные фракции), а вот от трёх патрулей одной фракции - нет.

Так же если **лично** у капитана судна есть желание "дать на чай" - он может "дать на чай".

Костыли это опасно.

4

Спасибо, хороший совет. Век живи - век учись!)

Ипучие пироги! =)))) И косманафты теперь )

1

Иманеры

1

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

Баги в игре на раннем доступе не сильно отталкивают.
Из того, что хотелось бы доработать. Во время миссий нужно отключить урон по дружеским объектам (Friendly Fire). Стрелял в пирата, уничтожила база. Починка - 20к. Один раз вообще закрутило ничего сделать не смог, помогла перезагрузка.

Хотелось бы игру на геймпаде, реально ли реализовать?

Желаю процветания проекта, удачи, не бросать своё детище!

1