Итак, тут будем рассматривать схемы построяния формаций для ИИ на примере нижеприведенной формации, которая входит в патч формаций для ОиМ. На примере этой формации мы постараемся объяснить использование блоков и операторов.
begin_formation ai_nomadic_line
;;; purpose flags; can use this for anything
march
ai_priority3.0
supported_factionssarmatians
;; the support cavalry (ready to charge where is needed)
begin_block 0
min_units2
max_units4
not_general
unit_typeheavy cavalry1.0
unit_typespearmen cavalry1.0
;unit_formationsquare
block_formationline
block_relative_pos0 0.0 -20.0
inter_unit_spacing10.0
priority1.0
end_block
begin_dummy_block 1
spacer 50.0 50.0 50 50
end_dummy_block
;; The center will consist infantry in mixed formations
begin_block 2
not_general
unit_typemissile_infantry1.0
unit_typeranged_missile_infantry1.0
unit_typeinfantry0.2
unit_formationshield_wall
block_formationline
block_relative_pos1 0.0 -6.0
inter_unit_spacing0.2
priority1.0
end_block
;; general at the center
begin_block 3
min_units1
max_units1
unit_typegeneral_unit1.0
;unit_formationshield_wall
;unit_densityclose
block_formationline
block_relative_pos2 0.0 -7.0
inter_unit_spacing10.0
priority1.0
end_block
begin_block 4
not_general
unit_typehandler1.0
unit_typesiege3.0
unit_typechanting_screeching3.0
;unit_formationsquare
block_formationline
block_relative_pos3 5.0 0.0
inter_unit_spacing3.0
priority1.0
end_block
begin_dummy_block 5
spans 2 3 4
end_dummy_block
;; The center will consist infantry in mixed formations (2)
begin_block 6
not_general
unit_typespearmen infantry0.8
unit_typeheavy infantry1.0
unit_typeinfantry0.6
unit_typeany0.01
unit_formationshield_wall
block_formationline
block_relative_pos5 0.0 -3.0
inter_unit_spacing0.2
priority1.0
end_block
;; Cavalry ambush left
begin_block 7
not_general
unit_typeskirmish cavalry1.0
unit_typemissile cavalry1.0
unit_typecavalry0.1
;unit_formationsquare
block_formationline
block_relative_pos1 -25.0 0.0
inter_unit_spacing6.0
priority0.5
end_block
;; support cavalry behind
begin_block 8
not_general
unit_typeheavy cavalry1.0
unit_typespearmen cavalry1.0
unit_typecavalry0.1
;unit_formationsquare
block_formationline
block_relative_pos7 0.0 -3.0
inter_unit_spacing6.0
priority0.5
end_block
;; Cavalry ambush right
begin_block 9
not_general
unit_typeskirmish cavalry1.0
unit_typemissile cavalry1.0
unit_typecavalry0.1
;unit_formationsquare
block_formationline
block_relative_pos1 25.0 0.0
inter_unit_spacing6.0
priority0.5
end_block
;; support cavalry behind
begin_block 10
not_general
unit_typeheavy cavalry1.0
unit_typespearmen cavalry1.0
unit_typecavalry0.1
;unit_formationsquare
block_formationline
block_relative_pos9 0.0 -3.0
inter_unit_spacing6.0
priority0.5
end_block
begin_dummy_block 11
spans0 1 2 3 4 5 6 7 8 9 10
end_dummy_block
begin_block 12
;not_general
unit_typechariots3.0
unit_typeelephants3.0
unit_typegeneral_unit1.5
;unit_formationwedge
;default_melee_stateskirmish
;min_unit_width80
;max_unit_width160
block_formationline
block_relative_pos11 0.0 -5.0
inter_unit_spacing5.0
priority1.0
end_block
Название формации - begin_formation
Самая первая строка – это название формации ( в данном случае ai_nomadic_line)
Вам необходимо присвоить произвольное название формации, чтобы по нему компьютер находил ее и определял, возможно ли при некоторых условиях использовать ее. В серии TW любой предмет носит какое-то название, будь то юнит, здание и т. д. Так и формация носит свое собственное название. Хочу отметить, что если вы один раз присвоили название и уже с ним запускали игру, то его стоит таким и оставить – в случае его изменения могут возникнуть проблемы с выбором формаций в тактических битвах. Названия формации можно брать как из оригинального файла формаций, так и выдумывать свои. Лучше не допускать повторения названий – могут возникнуть наложения одной формации на другую.
Цель формации - purpose flags
Цель формации – это оператор, с помощью которого компьютер определяет, при каких именно условиях возможно использование определенной формации. Существуют следующие цели формаций:
-attack
-defend
-march
-pursue
-standard_ambush_defender_deployment
Соответственно при первом значении армия будет развернута в формацию, когда атакует, при втором, когда защищается, при третьем во время передвижения по полю битвы при четвертом во время преследования и при пятом во время нахождения в засаде. Для формации лучше всего указывать две цели одновременно – attack и defend. Именно при таком подходе компьютер практически всегда безошибочно выбирает нужную формацию. Цель march также используется для армий, задействованных с качестве подкрепления. Цель pursue не всегда корректно работает, часто армии не разворачиваются в формации с этой целью. При использовании 5 цели нужно быть уверенным, что армия действительно сможет развернуться в засадной зоне – поэтому лучше делать формации с этой целью компактными и сильно не растягивать их по фронту.
Приоритет формации - ai_priority
Приоритет формации – это некое значение, которое позволяет ИИ выбрать формацию. Наряду с поддерживаемыми фракциями этот оператор – один из инструментов воздействия на компьютер при выборе формации.Лучше всего указывать число с десятичными дробями через точку (например 3.75). При отсутствии десятичных дробей надо использовать ноль (3.0). Данный оператор позволяет выстроить достаточно гибкую систему формаций. В том случае, если конкретная формация не удовлетворяет условиям (например, составу войск), будет выбрана другая формация с более низким приоритетом. Чем больше приоритет, тем компьютер охотнее выбирает формацию. Используйте высокий приоритет для самых лучших и важных формаций.
Поддерживаемые фракции - supported_factions.
Этот оператор отвечает за то, какими именно фракциями может использоваться данная формация. Фракции указываются через запятую и пробел. Если не использовать данный оператор, тогда формация будет доступна для всех фракций.
После всего вышесказанного мы имеем следующее
begin_formation ai_nomadic_line
;;; purpose flags; can use this for anything
march
ai_priority3.0
supported_factionssarmatians
Это была как бы вводная часть формации, теперь переходим к основному компоненту формаций – блокам.
Любая формация состоит из блоков. Существуют два вида блоков – основные блоки и ложные блоки (dummy block)ю Начну со второго вида блоков.
Ложные блоки (dummy block).
Данный вид блоков является вспомогательным и служит для коррекции основных блоков. он может состоять всего из двух компонентов:
-spacer
-spans
spacer устанавливает пустые блоки без юнитов – т.е просто какое-то расстояние, вокруг которого будет группироваться войска. Например, это необходимо в том случае, когда нужно установить дополнительное расстояние между двумя линиями войск, или нужно создать промежуток, не занятый юнитами, между двумя блоками войск.
Вот пример такого оператора:
begin_dummy_block 0
spacer0.0 0.0 60 30
end_dummy_block
spans нужны для объединения нескольких блоков в один. Это необходимо в том том случае, когда нужно развернуть, допустим, кавалерию на фланге не относительно какого-то блока, а целой группировки войск. То же самое можно сказать и относительно артиллерии и любого другого вида войск. Это позволяет достичь более точного расположения войск на тактической карте. Пример спанов:
begin_dummy_block 2
spans0 1 2 3 4
end_dummy_block
Обратите внимание, что нумерация любых блоков начинается с нуля. Номера спанов нужно указывать через пробел безо всяких запятых.
Теперь перейду к обычных блокам – основному компоненту любой формации.
;; the support cavalry (ready to charge where is needed)
begin_block 0
min_units2
max_units4
not_general
unit_typeheavy cavalry1.0
unit_typespearmen cavalry1.0
;unit_formationsquare
block_formationline
block_relative_pos0 0.0 -20.0
inter_unit_spacing10.0
priority1.0
end_block
Команды в блоке делятся на обязательные и необязательные. Необязательные команды я буду отмечать курсивом.
Название блока – вы можете как-то пометить блок по своему усмотрению только для удобства в работе и чтобы не запутаться. Название может быть абсолютно любым и никак не влияет на работоспособность блока.
Номер блока begin_block 0
Этот оператор отвечает за нумерацию блоков. Она начинается с нуля. Ложные и основные блоки имеют общую нумерацию. Это самая первая команда блока.
Ограничение числа юнитов
min_units 2
max_units 4
Это первая необязательная команда. Вы можете ограничить число юнитов в блоке используя эту команду, соответственно указав минимальное и максимальное количество юнитов. Можно указать в обоих операторах одинаковое число, тогда в блоке будет строго определенное количество юнитов. Блоки можно использовать по отдельности, указывая или только минимальное, или только максимальное количество юнитов. Но надо помнить, что иногда в формации может не оказаться нужного числа юнитов, тогда она не будет работать.
not_general
Этот оператор указывает на то, что в блоке не должно быть генерала. Его можно использовать почти в каждом блоке, если у вас в типах юнитов прописано general_unit (об этом ниже). В противном случае могут возникнуть некоторые осложнения, и генерал будет ставится не там, где надо. Лучше проявлять осторожность в использовании этой команды, но я все же почти всегда ее использую в большом количестве блоков.
unit_type any 0.1
Этот оператор показывает, какие именно типы юнитов могут использоваться в данном блоке. Справа от названия указывается приоритет, т. е. некое число, которое указывает, какой именно юнит будет заполнять этот блок в первую очередь. Например, в блоке стоит тяжелая пехота в приоритетом 2.0 и лучники в приоритетом 1.0. В этом случае компьютер будет стараться в первую очередь расположить именно тяжелую пехоту в блоке, а в случае ее нехватки обратится к легкой пехоте. Но если у вас легкой пехоты значительно больше, тогда она будет более интенсивно использоваться при заполнении блока.
Список доступных типов юнитов:
any
infantry
light infantry
heavy infantry
pilum_infantry
light_pilum_infantry
heavy_pilum_infantry
spearmen
spearmen infantry
non_phalanx_spear
phalanx
missile infantry
skirmish infantry
ranged_missile_infantry
cavalry
spearmen cavalry
heavy cavalry
light cavalry
missile cavalry
skirmish cavalry
elephants
heavy_chariots
handler
siege
general_unit
chanting_screeching
swimming
carrying_siege_engine ram
carrying_siege_engine ladder
carrying_siege_engine tower
default_melee_state fire_at_will_and_defend_and_skirmish
Позволяет эффективно настроить поведение юнитов в битве(максиму 3 значения).
Когда армии развернуты, большинство юнитов получают свои установки на бой, например, лучники начинают бой с активированными кнопками «огонь по желанию» и «перестрелка». Когда вы используйте оператор default_melee_state в пределах блока, в котором хотите настроить эти состояния юнитов, имейте в виду, что если вы задали лучникам fire_at_will, они больше не перестреливаются, пропишите им defend, и они болше не ведут огонь по желанию и не перестреливаются. Итак, чтобы заставить лучников выполнять все 3 эти действия, вам нужно прописать fire_at_will_and_defend_and_skirmish. Отмечаю, что в данном случае команда еще и активирует специальные виды боеприпасов, если они есть у юнита. Однако, следует еще помнить, что игра в процессе битвы может на время переделать эти настройки: вам, наверняка, приходилось видеть в начале игры лучников, стреляющих обычными стрелами, а потом заменяющих их огненными.
Также, можно отключить все эти настройки, если использовать специальные команды, как показано здесь. В данном случае лучники не стреляют и держат позицию.
default_melee_state dummy
Эта команда делает то же самое, что и:
default_melee_state anyone_homeetc etc ...
При использовании оператора defend юниты не атакуют активно противника на поле боя. Полезно данную настройку поставить генералу, тогда его удаётся сохранить длительное время живым. Настройка attack заставляет юнитов активно нападать на противника. В общем, default_melee_state следует почти всегда использовать, поскольку он очень училивает ИИ на поле битвы.
unit_formation square
unit_formation phalanx
unit_formation wedge
Это весьма полезная команда. Она позволяет все время битвы юниту сохранять заданное построение. Например, по умолчанию фалангисты становятся в фалангу, но во время битвы могут перейти в обычное построение. Использование данной команды позволять предотвратить это нежелательное событие. Команда testudo работает некорректно, поэтому ее использовать не следует.
unit_density close
unit_density loose
Это команда отвечает за плотность отряда. Во время оборонительного боя это команда вполне нормально работает, но в время наступления ИИ по собственному усмотрению меняет заданную плотность отряда.
min_unit_width 20
max_unit_width 20
Данная команда позволяет установить ширину отряда в зависимости от различных боевых задач. В формациях для игрока стоит прописывать эту команду с осторожностью – если она имеется в нескольких формациях, а в остальных ее нет, тогда возникает наложение одной формации на другую – и формация строится по параметрам других построений. Поэтому в формациях для игрока надо либо прописывать эту команду в каждой формации, либо вообще не трогать.
block_formation line
block_formation column
block_formation square
Это команда позволяет блоку построится в линию, колонную, либо в каре. Последнее часто не работает правильно, поэтому его лучше всего не использовать в формациях. Построение в линию используется чаще всего, так как оно наиболее эффективно.
- Определение позиции блока
Эта очень важная команда, от нее во многом зависит успешная работа формации.
Когда вы хотите расположить свою армию в битве, у вас есть два способа это сделать:
block_relative_pos 0 0.0 0.0
или комбинация команд:
normalised_pos 0.0 0.0
normalised_rot 0.0
Первый способ гораздо легче и более распространен, второй гораздо труднее и не всегда адекватно работает.
Вам следует помнить, что следует выбирать на всю формацию только один метод построения. Иначе в том случае, если в одном блоке вы используйте 1 метод, во втором 2, то игра вылетит.
Минимальные значения команд таковы:
normalised_pos 0.0 0.0
normalised_rot 0.0t
Максимальные значения:
normalised_pos 1.0 1.0
normalised_rot 360.0
Я сам никогда не использую второй способ в формациях, поскольку от него возникает много проблем. Теперь поясню каждую команду по порядку.
block_relative_pos 0 0.0 0.0
Первая цифра в команде обозначает, относительно какого блока будет вестись ориентирование блока, то есть относительно которого он будет располагаться. Вторая пара цифр обозначает перемещение влево или вправо относительно блока. Для перемещения вправо нужно поставить знак -. Вторая пара обозначает перемещение назад и вперед. Для перемещения назад нужно поставить знак-.
block_relative_pos 2 -4.0 5.0
В данном случае наш блок будет располагаться относительно 2 блока на 4 метра вправо и на 5 вперед.
normalised_pos 1.0 1.0
Данная команда позволяет установить развертывания блока относительно центра развертывания (примерно условный центр формации) на определенное количество единиц.
normalised_rot 360.0
Эта команда производить вращение блока относительно центра развертывания. Не работает в BI. Я не советую использовать второй способ вообще.
inter_unit_spacing 2.0
Эта команда устанавливает расстояние между юнитами в одной блоке. Например, войска развернуты в линию, и в этой случае расстояние между юнитами будет два метра.
priority 1.0
Это последняя команда, без которой не может обойтись ни один блок. Она позволяет установить приоритет для каждого блока внутри формации.
Ну и завершает любой блок команда end_block
Формации для игрока
Здесь я постараюсь объяснить некоторые отличия между ИИ формациями и формациями для игрока.
В первую очередь, нельзя добавлять в формации для игрока неограниченное количество формаций, всего существует восемь 8 формаций (столько же и кнопок формаций) и одна дополнительная формация.
-Названия формации
Насколько я понимаю, каждая формация связана с кнопками на интерфейсе посредством следующих доступных в файле названий формаций:
simple_line
ordered_single_line
simple_double_line
ordered_double_line
ordered_triple_line_1
ordered_triple_line_2
ordered_triple_line_3
column
- Выборюнита
Последняя формация используется, когда вы перемещайте или растягивайте мышью несколько юнитов (необязательно, чтобы они были сгруппированы).
-Цель и приоритет
Цель и приоритет не используются формациях для игрока, поскольку вы сами выбираете себе формацию.
-default_melee_state
После большого количества проведенных тестов удалось понять, что эта команда либо неадекватно работает в формациях для игрока, либо приводит к вылету. Лучше ее не использовать.
-Несколько примечаний по использованию формаций для игрока.
general_order Group_Formation_Single_Line
general_order Group_Formation_Sorted_Line
general_order Group_Formation_Sorted_Double_Line
general_order Group_Formation_Sorted_Double_Line
general_order Group_Formation_Missile_First_3_lines
general_order Group_Formation_Infantry_First_3_Lines
general_order Group_Formation_Cavalry_First_3_Lines
general_order Group_Formation_Column
Настройка export_descr_unit.
Также я недавно узнал, что определнные настройки в этом файле позволяют эффективно настроить поведение ИИ в битве. Это stat_charge_dist и stat_fire_delay.
Первая команда – это расстояние, с которого можно начинать атаку. Вторая – это средняя частота между использованием стрелкового и холодного оружия.
для стрелковой пехоты
В первой команде я брал радиус стрельбы и примерно умножал его на 2. Это позволяет добиться эффективного использования стрелков на поле битвы. Вторую команду для всей пехоты я указывал одинаковую – это позволяет добиться того, что юниты не разбредаются и даже такие сложные формации, как терции, держат строй.
Для рукопашной пехоты я устанавливал различные значения stat_charge_dist в зависимости от силы в рукопашном бою. Для артиллерии первый параметр следует устанавливать равным радиусу обстрела. а второй =0. Для стрелковой кавалерии первый параметр по такой же схеме, как у стрелковой пехоты, в второй -20000 и больше – это позволяет достичь исключительной маневренности данного вида войск. Для фаланги первый параметр надо устанавливать 200. У генерала можно также добиться исключительной маневренности с помощью второго параметра, но я это делать не стал из-за особенностей ОиМа. Продолжаю работу по изучению этих параметров и сообщу о ней позже.