Как создать живой игровой мир? Динамические события НПС в 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 комментариев