Привет и добро пожаловать в очередной дневник разработчиков
Imperator Rome!
Сегодня мы расскажем о том, как назначать отрядам задачи, которые они будут выполнять, и как это можно модифицировать. Мы также в общих чертах расскажем о стартовой ситуации на Балканах и в Дакии.
Как вы могли заметить из наших стримов, автоматизация может стать неотъемлемой частью геймплея, если вы того захотите. Задачи отрядов являются способом передать управление частью армий ИИ, пользуясь практически теми же инструментами для контроля армии и флота, что и ИИ. В любое время вы можете назначить задачу любой армии или флоту, находящимся под управлением игрока (или сразу нескольким — в этом случае каждый отряд получит свою задачу), тем самым активировав ИИ этого отряда, после чего тот будет действовать почти так же, как если бы принадлежал стране под управлением ИИ.
Мы не рассматриваем подобную возможность в отношении основных армий, но она может оказаться полезной для второстепенных войск или сил, оставленных для контроля или защиты страны. Разделение, объединение армий или когорт, а также способности не используются автоматизированными юнитами кроме случаев, когда это необходимо.
Целью дизайна было упростить кодовую базу с нашей стороны, предоставить поведение отрядов мододелам в виде модулей и, в конечном счёте, дать игроку большее разнообразие в поведении NPC.
И хотя вы, возможно, не захотите передавать контроль над всеми своими армиями ИИ, задачи позволят вам передать контроль над частью, чтобы вы могли сосредоточиться на остальных.
Доступные задачи:
- Морской десант: Аналогично автоматической транспортировке из EU4. Если хотя бы у одного флота выбрана задача «Морской десант», то при приказе армии двигаться в город, куда нет доступа по суше, флот подберёт армию и перевезёт её туда.
- Автономные боевые действия: Включает обычный ИИ армии. Армия будет действовать независимо, атаковать вражеские войска, оккупировать города и т.д.
- Защита границы: Обычный ИИ, как и в предыдущем случае, но в этом варианте армия не покинет пределов страны и будет просто оборонять земли.
- Разведка: Патруль вдоль вражеской границы, сообщения о передвижении войск противника.
- Борьба с повстанцами: Армия сосредоточится на уничтожении армий, относящихся к повстанцам (включая восстания рабов).
- Оставаться в резерве: Армия будет избегать контакта с врагом, оставаясь в пределах границ страны. Добавлено главным образом из-за ситуаций в мультиплеере, когда неиспользуемые в данный момент войска уничтожались врагом, в то время как игрок был занят другими делами.
- Охота за флотами: Поиск и уничтожение вражеских флотов.
Особые задачи отрядов
Кроме того, есть множество иных задач, которые вы не можете назначать, но с которыми можете столкнуться.
Нелояльные генералы будут использовать особую задачу, которая по факту сводится к тому, что они будут делать, что им вздумается. При этом вы не сможете отдать им другой приказ или, скажем, послать на верную смерть. Аналогично,
наёмники, которым вы прекратили платить, перестанут слушаться ваших приказов и начнут действовать самостоятельно.
Также есть особая логика для восстаний рабов, под действием которой войско повстанцев направится к ближайшему богатому городу и попытается разграбить его и освободить больше своих товарищей.
Ещё один плюс системы задач отрядов в том, насколько она модифицируема. Chaingun, создатель системы, сейчас немного расскажет о ней, а потом я продолжу и обрисую ситуацию на последней оставшейся части карты.
Моддинг
Внутри игры многие варианты поведения, например, повстанцев, нелояльных генералов и войск, пытающихся присоединиться к выбранному отряду в рамках действия по пополнению отряда, также представлены в виде задач, а потому их можно модифицировать, в определённой степени.
Некоторые задачи на ранних этапах разработки были вшиты в игру, и таковыми и остались с тех пор, но они всё равно есть в файлах, так что мододелы могут их менять. Кроме того, в будущем мы можем перевести модели поведения, не относящиеся к задачам, например, пиратство или поведение варваров, в систему задач, как и, скажем, поведение субъектов из EU4. Фактически у вас уже есть возможность добавить свои варианты поведения субъектов в виде мода.
Знакомые с конечными автоматами могут провести аналогию, где отряд будет соответствовать автомату, а задача — состоянию. Если вы не понимаете, о чём речь, то не переживайте, это довольно простая концепция, обёрнутая в красивые слова. Проще говоря, это значит, что задачи взаимоисключаемы, и отряд одновременно может выполнять только одну из них. Переход от одной задачи к другой может произойти одним из следующих способов:
- Игрок выбирает новую задачу в окне интерфейса (для наличия задачи в списке, нужно, чтобы триггер interface_allow вернул значение true).
- Задача переключается автоматически, поскольку приоритет выше нуля (нужно, чтобы триггер allow вернул значение true).
- В коде зафиксировано переключение на определённые задачи (например, на высадку десанта).
И раз уж я заговорил о скриптовых особенностях, давайте взглянем на пример:
Code:
#Задача нелояльного отряда. Переключение происходит автоматически, когда командир становится нелояльным.
objective_disloyal = {
priority = 100 #Если значение выше 0, проверяется allow и идёт автоматическое переключение на эту задачу, если нет разрешённых задач с более высоким приоритетом. .
allow = {
exists = commander
OR = {
commander = {
loyalty <= 33
}
AND = {
unit_owner = {
treasury < 0
}
commander = { is_mercenary = yes }
}
}
}
interface_allow = {
always = no
}
#Настраиваемая функция оценки.
mode = add #none/add/replace
#Настраиваемая функция оценки. Область отряда. Использует scope:province для доступа к оцениваемой провинции.
#Отрицательное => лучше, положительное => хуже. Если общая сумма выше миллиона, отряд туда не пойдёт. Опасайтесь переполнения с фиксированной запятой при 2 миллионах... .
pure_weight = yes
weight = {
modifier = {
trigger = {
scope:province = {
NOT = { owner = root.unit_owner } #Родные земли предпочтительнее (поскольку мы хотим поднять там восстание)
}
}
add = {
value = 2000
}
}
modifier = {
trigger = {
scope:province = {
AND = {
owner = root.unit_owner
this = root.unit_owner.capital_scope
}
}
}
add = {
value = 1050000
}
}
}
}
Мы уже упоминали interface_allow и allow. Чтобы задача была возможной, значение allow должно быть true. Однако если задача должна быть скрытой и недоступной игроку, значение interface_allow должно быть false. Если приоритет задачи выше 0, произойдёт автоматическое переключение на неё, как только значение allow будет true, и нет задач с более высоким приоритетом.
Также существует один очень важный концепт, о котором мы ещё не рассказали: веса/очки/значения. Они в основном представляют желание юнита отправиться в определённый город, или, точнее, отображают на шкале, насколько он не хочет этого, чем выше значение, тем меньше желание. Для ИИ это в основном вспомогательная функция.
Так всё же, как изменять вспомогательную функцию? Вы можете установить в поле mode значение add, чтобы добавить собственное значение к уже существующей функции (рекомендовано) или, для более хардкордного моддинга, replace, тем самым полностью игнорируя существующую функцию. Затем, вы можете уточнить вес каждого города в поле weight, где не совсем удачно названный скоуп, province, представляет оцениваемый город (скоуп по умолчанию — отряд).
Также стоит отметить, что по умолчанию поведение вшито в игру, включая зашитую в код приоритизацию помимо простого стремления к максимализации величин. Довольно часто, чтобы получить достаточный контроль, необходимо установить pure_weight = yes, чтобы отключить эту вшитую приоритизацию, если она не подходит к тому поведению, которого вы хотите достичь. Примером этой приоритизации является выбор, стоит ли вести осаду или начать сражение, в зависимости от определённых обстоятельств, которые ортогональны для вывода вспомогательной функции.
Что значит score во вспомогательной функции? На данный момент, любое значение выше или равное миллиону означает, что юнит не пойдёт в это место. Мирное передвижение обычно находится в районе сотни тысяч, в то время как осады примерно равны пятидесяти тысячам, а битвы — двадцати тысячам.
Имейте в виду, что шкала веса может быть изменена в будущих версиях, так как используемая позаимствована из Europa Universalis 4 и имеет некоторые проблемы, связанные с переполнением с фиксированной запятой в моддинге.
Вы можете посмотреть на шкалу весов, вбив в консоль «mapmode ai» и выбрав ваш юнит (пожалуйста, убедитесь в том, что в игре пройдёт день, иначе она может вылететь). В итоге вы получите примерно такую подсказку на разукрашенной кодом карте:
При этом я должен объяснить, что обычный вывод вспомогательной функции, в отличии от некоторых нелокальных факторов, зависит от выбранной на данный момент цели, включен ли ИИ для страны (введите «ai» в консоли) и какую роль ИИ назначил для армии. Кратко о ролях юнитов: обычно армии получают назначение либо в качестве осадных армий, либо в качестве убийц-охотников, причём последние в конфигурации по умолчанию будут отдавать больший приоритет уничтожению вражеских армий, а не осадам.
Также есть ещё один концепт, с которым вы скорее всего столкнётесь, когда будете модифицировать ИИ армий: угроза, которую можно посмотреть командой unit_threat. Значение угрозы является вычислением карты влияния (извините, очередной термин ИИ). На данный момент её можно увидеть только в Release D версии в Steam, если ввести "ai.map threat" в консоли (мы разберёмся с этим, у нас проблема с движком, скрывающим большую часть консольных команд на релизе). Уровень угрозы 1.0 означает, что сила врага очень близка к вашей, уровень 10 значит, что враг примерно в 10 раз сильнее и т.д. Вот скриншот, который я сделал в старой версии:
Итак, какие задачи на данный момент использует ИИ? Только оbjective_null (по умолчанию, значит, что никаких целей нет, а также что юнит контролируется игроком или обычным ИИ) и objective_naval_landing, которая используется ИИ для транспортировки морем или автотранспортировки игроком. Цели, связанные с таким кодом, как высадка с корабля, содержат внутри множество вшитой магии и, скорее всего, их будет сложно изменить, помимо незначительных корректировок во вспомогательной функции.
И наконец, заметка о производительности: когда вы через скрипт задаёте ИИ отряда, всё говорит в пользу того, что вы не сможете использовать его без снижения производительности игры. Может помочь подстройка следующих переменных:
Используйте консольные команды "timing show" и "ai.pawns", чтобы узнать, что приводит к подтормаживанию, и насколько ИИ реагирует на команды. У ИИ есть своя система распределения времени исполнения, чтобы чаще работать с более важными отрядами (исходя из размера, близости к игроку-человеку, времени с последнего обращения и т.д.)
Спасибо, что слушали меня. Это лишь часть ИИ, и я не касался деталей, но, надеюсь, несмотря на закрытость, вы сможете создавать отличные моды.
Под конец мы бросим взгляд на последние оставшиеся без внимания дневников регионы. Балканы!
Как и многие другие регионы, о которых мы рассказывали в дневниках, Балканы и обширный дунайский регион во времена действия игры преимущественно были населены племенами. Этот регион испытывает сильное влияние со стороны эллинистического мира, кроме того, туда активно переселяются кельты. Непосредственно Балканы в будущем станут одним из направлений расширения Римской республики и часто будут становиться целью македонских походов, сначала Александра и Аргеадов, позднее диадохов, особенно Лисимаха из Фракии. Также именно здесь прошли мигрирующие галаты, кельтский народ, впоследствии поселившийся в центральной Анатолии, столкнувшись с местными племенами и греками.
Коренные жители региона, иллирийцы на западе и даки на востоке, разделены на множество мелких племенных государств. Как и в других уже описанных регионах, успешное племя может вырасти в племенную федерацию, Дакию или Иллирию.
Стартовые страны:
- Гетия: Крупнейшее в игре государство гетов. Обладает сравнительно сильными позициями в регионе, но не столь плотно заселено, как соседи с юга.
- Тирагетия: Небольшое гетское племя на реке Тирасе (по соседству с эллинистическим городом в устье реки, который мы уже упоминали в более раннем дневнике).
- Мёзия: Оседлое племя в верхней Фракии, является средней силой в регионе и потенциальной угрозой для Фракийского царства с юга и востока. О мёзах до конца эпохи, когда они столкнулись с римлянами, известно не так много.
- Дардания: Одно из сильнейших царств региона. У Дардании давняя история вмешательства в политику всех окружающих стран, включая македонян, над которыми она долго имела довольно сильное влияние. Правда до недавнего времени уже она была субъектом Македонии. Но со смертью Александра Дардания освободилась и, как Тавлантия на юге, скорее всего вновь столкнётся с Македонией.
Кельто-паннонцы:
К этому времени ряд кельтских племён уже расселились в Паннонии и по берегам Дуная. Вскоре после стартовой даты кельтские племена вторгнутся в Македонию и Анатолию, впоследствии осев и создав Галатское царство (подобная ситуация с кельтами, захватившими земли и переселившимися в Анатолию, может произойти и в игре).
Тем не менее, паннонские племена не столь многочисленны, как даки и геты на востоке и иллирийцы на западе:
- Диндария
- Тилатия
- Скордиския
- Котиния
Иллирийцы:
Западные Балканы и побережье Далмации населены множеством иллирийских племён. У многих из них налажены регулярные торговые и дипломатические контакты с италийскими и греческими государствами, но также они частенько выступают безопасными гаванями для рейдеров и пиратов, что не сильно нравится соседям. Стоит иллирийским народам объединиться и сформировать большую Иллирию, как они станут куда более серьёзной угрозой для соседей.
- Армистия
- Даорсия
- Пиерия
- Делматия
- Либерния
- Дитиония
- Озуэия
- Скордиския
- Бревкия
- Деурия
- Дитиония
- Либерния
- Катария
- Котиния
- Яподия
- Истрия
- Абрия
Дакийские народы:
Не так много известно о происхождении даков, но как и иллирийцы на западе, эти народы, скорее всего, жили здесь задолго до начала нашей эры. Дакийская культура разделена на несколько небольших племенных государств, являющихся частью более крупной дакийской идентичности. Как упоминалось выше, со временем они могут сформировать единую Дакию, которая вполне может угрожать соседям.
Как бы ни была разделена Дакия, она при этом хранит множество ценных товаров, вроде больших запасов железа, драгоценных и простых металлов.
- Потулатенсия
- Бастия
- Ратаченсия
- Буридавенсия
- Каукоенсия
- Ансаменсия
- Апулия
- Албоченсия
- Салденсия
На сегодня это всё! На следующей неделе мы вернёмся с несколько необычным дневником. В нём мы ещё глубже погрузимся в возможности моддинга в Imperator, и расскажем обо всех штуках, которые смогут делать мододелы, чтобы изменить игру.
Перевод - Официальное сообщество Paradox Interactive.