В дополнение к основному гарнизонному скрипту также был создан дополнительный. По объему он гораздо меньше, т.к. затрагивает только исключительные поселения.
Суть этого добавочного скрипта такова: у каждой конкретной фракции мода есть свои "уникальные" поселения, которые предоставляют возможность в случае неожиданной вражеской осады призывать сильный гарнизон, характерный исключительно для рассматриваемой державы сразу после взятия поселения в осаду. Если противник собирается продержать тако поселение еще один ход в осаде, то уже ему придется немного посложнее, т.к. вступит в действие выше упомянутый мною основной территориальный спаун ополчения. Поэтому назначение такого скрипта - предоставить ИИ дополнительную возможность сохранения под контролем собственных ключевых поселений. Так, если игрок продумает уничтожить фракцию методом молниеносной войны, ему достаточно будет овладеть подобными ключевыми поселениями, ведь в оставшихся городах / замках ИИ останется лишь действие основного гарнизонного скрипта, которое можно обойти стремительным штурмом сразу после осады. Т.е. потеря таких поселений с возможностью мгновенного спауна будет серьезным ударом для ИИ-фракция, в случае если она не готова к блицкригу противника... Соответственно число таких поселений ограничено - они носят статус важнейших опорных пунктов фракции.
Теперь привожу сам код и его краткое истолкование:
declare_counter Imladris_Noldorsdeclare_counter Mithlond_Noldorsdeclare_counter Dvimorden_Loriendeclare_counter Elven-Mirkwood_Silvandeclare_counter Erebor_Dwarvesdeclare_counter Misty-Mountains_Dwarvesdeclare_counter Bree_Eriadordeclare_counter Shire_Eriadordeclare_counter Esgaroth_Daledeclare_counter Dale_Daledeclare_counter Kings-Land_Rohandeclare_counter Helms-Deep_Rohandeclare_counter Anorien_Gondordeclare_counter Lebennin_Gondordeclare_counter Belfalas_Gondordeclare_counter Lake_Evendim_Arnordeclare_counter Arthedain_Arnordeclare_counter Weather_Hills_Arnordeclare_counter Gorgoroth_Mordordeclare_counter Morgul-Vale_Mordordeclare_counter Udun_Mordordeclare_counter Deep-Mirkwood_Mordordeclare_counter Mt-Gundabad_Northerndeclare_counter Carn-Dum_Northerndeclare_counter High-Pass_Gommdeclare_counter Misty-Mountains_Gommdeclare_counter Nan-Curunir_Isengarddeclare_counter Dunland_Dunlanddeclare_counter Mistrand_Rhundeclare_counter Harad_Haraddeclare_counter Umbar_Umbardeclare_counter Sindanor_Avarideclare_counter Morn_Penni_Vindansdeclare_counter Nimir_Kadar_Arthanordeclare_counter Arhanor_Pharasainmonitor_event ButtonPressed ButtonPressed siege_maintain_button if I_SettlementUnderSiege Imladris and I_CompareCounter Imladris_Noldors = 0 and I_SettlementOwner Imladris = noldors create_unit Imladris, noldors elite unit, num 5, exp 0, arm 0, wep 0 set_counter Imladris_Noldors 1 end_if if I_SettlementUnderSiege Mithlond and I_CompareCounter Mithlond_Noldors = 0 and I_SettlementOwner Mithlond = noldors create_unit Mithlond, noldors elite unit, num 5, exp 0, arm 0, wep 0 set_counter Mithlond_Noldors 1 end_if if I_SettlementUnderSiege Dvimorden and I_CompareCounter Dvimorden_Lorien = 0 and I_SettlementOwner Dvimorden = lorien create_unit Dvimorden, lorien elite unit, num 5, exp 0, arm 0, wep 0 set_counter Dvimorden_Lorien 1 end_if if I_SettlementUnderSiege Elven-Mirkwood and I_CompareCounter Elven-Mirkwood_Silvan = 0 and I_SettlementOwner Elven-Mirkwood = silvan create_unit Elven-Mirkwood, silvan elite unit, num 5, exp 0, arm 0, wep 0 set_counter Elven-Mirkwood_Silvan 1 end_if if I_SettlementUnderSiege Erebor and I_CompareCounter Erebor_Dwarves = 0 and I_SettlementOwner Erebor = dwarves create_unit Erebor, dwarves elite unit, num 5, exp 0, arm 0, wep 0 set_counter Erebor_Dwarves 1 end_if if I_SettlementUnderSiege Misty-Mountains and I_CompareCounter Misty-Mountains_Dwarves = 0 and I_SettlementOwner Misty-Mountains = dwarves create_unit Misty-Mountains, dwarves elite unit, num 5, exp 0, arm 0, wep 0 set_counter Misty-Mountains_Dwarves 1 end_if if I_SettlementUnderSiege Bree and I_CompareCounter Bree_Eriador = 0 and I_SettlementOwner Bree = eriador create_unit Bree, eriador elite unit, num 5, exp 0, arm 0, wep 0 set_counter Bree_Eriador 1 end_if if I_SettlementUnderSiege Shire and I_CompareCounter Shire_Eriador = 0 and I_SettlementOwner Shire = eriador create_unit Shire, eriador elite unit, num 5, exp 0, arm 0, wep 0 set_counter Shire_Eriador 1 end_if if I_SettlementUnderSiege Esgaroth and I_CompareCounter Esgaroth_Dale = 0 and I_SettlementOwner Esgaroth = dale create_unit Esgaroth, dale elite unit, num 5, exp 0, arm 0, wep 0 set_counter Esgaroth_Dale 1 end_if if I_SettlementUnderSiege Dale and I_CompareCounter Dale_Dale = 0 and I_SettlementOwner Dale = dale create_unit Dale, dale elite unit, num 5, exp 0, arm 0, wep 0 set_counter Dale_Dale 1 end_if if I_SettlementUnderSiege Kings-Land and I_CompareCounter Kings-Land_Rohan = 0 and I_SettlementOwner Kings-Land = rohan create_unit Kings-Land, rohan elite unit, num 5, exp 0, arm 0, wep 0 set_counter Kings-Land_Rohan 1 end_if if I_SettlementUnderSiege Helms-Deep and I_CompareCounter Helms-Deep_Rohan = 0 and I_SettlementOwner Helms-Deep = rohan create_unit Helms-Deep, rohan elite unit, num 5, exp 0, arm 0, wep 0 set_counter Helms-Deep_Rohan 1 end_if if I_SettlementUnderSiege Anorien and I_CompareCounter Anorien_Gondor = 0 and I_SettlementOwner Anorien = gondor create_unit Anorien, gondor elite unit, num 5, exp 0, arm 0, wep 0 set_counter Anorien_Gondor 1 end_if if I_SettlementUnderSiege Lebennin and I_CompareCounter Lebennin_Gondor = 0 and I_SettlementOwner Lebennin = gondor create_unit Lebennin, gondor elite unit, num 5, exp 0, arm 0, wep 0 set_counter Lebennin_Gondor 1 end_if if I_SettlementUnderSiege Belfalas and I_CompareCounter Belfalas_Gondor = 0 and I_SettlementOwner Belfalas = gondor create_unit Belfalas, gondor elite unit, num 5, exp 0, arm 0, wep 0 set_counter Belfalas_Gondor 1 end_if if I_SettlementUnderSiege Lake_Evendim and I_CompareCounter Lake_Evendim_Arnor = 0 and I_SettlementOwner Lake_Evendim = arnor create_unit Lake_Evendim, arnor elite unit, num 5, exp 0, arm 0, wep 0 set_counter Lake_Evendim_Arnor 1 end_if if I_SettlementUnderSiege Arthedain and I_CompareCounter Arthedain_Arnor = 0 and I_SettlementOwner Arthedain = arnor create_unit Arthedain, arnor elite unit, num 5, exp 0, arm 0, wep 0 set_counter Arthedain_Arnor 1 end_if if I_SettlementUnderSiege Weather_Hills and I_CompareCounter Weather_Hills_Arnor = 0 and I_SettlementOwner Weather_Hills = arnor create_unit Weather_Hills, arnor elite unit, num 5, exp 0, arm 0, wep 0 set_counter Weather_Hills_Arnor 1 end_if if I_SettlementUnderSiege Gorgoroth and I_CompareCounter Gorgoroth_Mordor = 0 and I_SettlementOwner Gorgoroth = mordor create_unit Gorgoroth, mordor elite unit, num 5, exp 0, arm 0, wep 0 set_counter Gorgoroth_Mordor 1 end_if if I_SettlementUnderSiege Morgul-Vale and I_CompareCounter Morgul-Vale_Mordor = 0 and I_SettlementOwner Morgul-Vale = mordor create_unit Morgul-Vale, mordor elite unit, num 5, exp 0, arm 0, wep 0 set_counter Morgul-Vale_Mordor 1 end_if if I_SettlementUnderSiege Udun and I_CompareCounter Udun_Mordor = 0 and I_SettlementOwner Udun = mordor create_unit Udun, mordor elite unit, num 5, exp 0, arm 0, wep 0 set_counter Udun_Mordor 1 end_if if I_SettlementUnderSiege Deep-Mirkwood and I_CompareCounter Deep-Mirkwood_Mordor = 0 and I_SettlementOwner Deep-Mirkwood = mordor create_unit Deep-Mirkwood, mordor elite unit, num 5, exp 0, arm 0, wep 0 set_counter Deep-Mirkwood_Mordor 1 end_if if I_SettlementUnderSiege Mt-Gundabad and I_CompareCounter Mt-Gundabad_Northern = 0 and I_SettlementOwner Mt-Gundabad = northern create_unit Mt-Gundabad, northern elite unit, num 5, exp 0, arm 0, wep 0 set_counter Mt-Gundabad_Northern 1 end_if if I_SettlementUnderSiege Carn-Dum and I_CompareCounter Carn-Dum_Northern = 0 and I_SettlementOwner Carn-Dum = northern create_unit Carn-Dum, northern elite unit, num 5, exp 0, arm 0, wep 0 set_counter Carn-Dum_Northern 1 end_if if I_SettlementUnderSiege High-Pass and I_CompareCounter High-Pass_Gomm = 0 and I_SettlementOwner High-Pass = gomm create_unit High-Pass, gomm elite unit, num 5, exp 0, arm 0, wep 0 set_counter High-Pass_Gomm 1 end_if if I_SettlementUnderSiege Misty-Mountains and I_CompareCounter Misty-Mountains_Gomm = 0 and I_SettlementOwner Misty-Mountains = gomm create_unit Misty-Mountains, gomm elite unit, num 5, exp 0, arm 0, wep 0 set_counter Misty-Mountains_Gomm 1 end_if if I_SettlementUnderSiege Nan-Curunir and I_CompareCounter Nan-Curunir_Isengard = 0 and I_SettlementOwner Nan-Curunir = isengard create_unit Nan-Curunir, isengard elite unit, num 5, exp 0, arm 0, wep 0 set_counter Nan-Curunir_Isengard 1 end_if if I_SettlementUnderSiege Dunland and I_CompareCounter Dunland_Dunland = 0 and I_SettlementOwner Dunland = dunland create_unit Dunland, dunland elite unit, num 5, exp 0, arm 0, wep 0 set_counter Dunland_Dunland 1 end_if if I_SettlementUnderSiege Mistrand and I_CompareCounter Mistrand_Rhun = 0 and I_SettlementOwner Mistrand = rhun create_unit Mistrand, rhun elite unit, num 5, exp 0, arm 0, wep 0 set_counter Mistrand_Rhun 1 end_if if I_SettlementUnderSiege Harad and I_CompareCounter Harad_Harad = 0 and I_SettlementOwner Harad = harad create_unit Harad, harad elite unit, num 5, exp 0, arm 0, wep 0 set_counter Harad_Harad 1 end_if if I_SettlementUnderSiege Umbar and I_CompareCounter Umbar_Umbar = 0 and I_SettlementOwner Umbar = umbar create_unit Umbar, umbar elite unit, num 5, exp 0, arm 0, wep 0 set_counter Umbar_Umbar 1 end_if if I_SettlementUnderSiege Sindanor and I_CompareCounter Sindanor_Avari = 0 and I_SettlementOwner Sindanor = avari create_unit Sindanor, avari elite unit, num 5, exp 0, arm 0, wep 0 set_counter Sindanor_Avari 1 end_if if I_SettlementUnderSiege Morn_Penni and I_CompareCounter Morn_Penni_Vindans = 0 and I_SettlementOwner Morn_Penni = vindans create_unit Morn_Penni, vindans elite unit, num 5, exp 0, arm 0, wep 0 set_counter Morn_Penni_Vindans 1 end_if if I_SettlementUnderSiege Nimir_Kadar and I_CompareCounter Nimir_Kadar_Arthanor = 0 and I_SettlementOwner Nimir_Kadar = arthanor create_unit Nimir_Kadar, arthanor elite unit, num 5, exp 0, arm 0, wep 0 set_counter Nimir_Kadar_Arthanor 1 end_if if I_SettlementUnderSiege Arhanor and I_CompareCounter Arhanor_Pharasain = 0 and I_SettlementOwner Arhanor = pharasain create_unit Arhanor, pharasain elite unit, num 5, exp 0, arm 0, wep 0 set_counter Arhanor_Pharasain 1 end_ifend_monitor
Общее устройство скрипта носит аналогичный характер, поэтому в своем обзоре сосредоточусь на описании основных команд, используемых для одного поселения.
declare_counter Imladris_Noldors
Индивидуальная переменная для конкретного поселения, находящегося под контролем указанной фракции (ее действие будет связано с поселением "Ривенделл" (Imladris), принадлежащим фракции "Высшие эльфы" (noldors)).
monitor_event ButtonPressed ButtonPressed siege_maintain_button
Рассматриваемый скрипт состоит из одного монитора. Здесь для осуществления мгновенного спауна гарнизона целесообразно воспользоваться характерным скриптовым событием типа ButtonPressed (действие при нажатии клавиши). Соотвественно в нашем случае будет нужна клавиша siege_maintain_button ("Начать осаду") игрового интерфейса.
Далее структура скрипта подразделяется на серию однообразных конструкций, каждая из которых предназначена для проверки того или иного поселения на условия срабатывания спауна и само создание новых гарнизонных юнитов. В рамках одного монитора подобная инициализация указанных поселений осуществляется при помощи оператора условий if-end_if.
Рассмотрим подробнее один из них (для взятого в качестве примера поселения Imladris) :
if I_SettlementUnderSiege Imladris and I_CompareCounter Imladris_Noldors = 0 and I_SettlementOwner Imladris = noldors create_unit Imladris, noldors elite unit, num 5, exp 0, arm 0, wep 0 set_counter Imladris_Noldors 1end_if
I_SettlementUnderSiege Imladris
Это скриптовое условие требует, чтобы данное поселение находилось в момент прожига скрипта в состоянии осады.
and I_CompareCounter Imladris_Noldors = 0
Следующее условие требует, чтобы текущее значение переменной (на момент выполнения монитора) было равно "0", т.е. исходному состоянию счетчика.
and I_SettlementOwner Imladris = noldors
И последнее в этом блоке условие проверяет, принадлежит ли поселение требуемой целевой фракции noldors.
Наконец, после положительного исхода на проверку всех условий действует команда создания гарнизонных отрядов:
create_unit Imladris, noldors elite unit, num 5, exp 0, arm 0, wep 0
В примере показано, что в поселении Imladris будет автоматически создано 5 отрядов типа noldors elite unit (тестовый юнит, как и в предыдущем обзоре) с нулевыми навыками опыта, апгрейда оружия и брони.
После того как задуманное действие реализовано, нельзя забывать о том, что скрипт будт действовать циклически (особенно при употреблении оператора if), поэтому во избежание повторного срабатывания монитора следует возвратиться к переменной Imladris_Noldors и присвоить ему новое значение:
set_counter Imladris_Noldors 1
Благодаря этому скрипт будет срабатывать при осаде лишь единожды, т.е. мы получим нормальный эффект при тестировании осады - спаун необходимого числа отрядов в гарнизоне (при отсутствии последнего действия с изменением значения счетчика спаун действует неоднократно и "забивает под завязку" юнитами весь гарнизон, что ненормально).
Тем самым, для каждого поселения в скрипте развитие событий происходит по аналогичному алгоритму.
И в заключение обзора приведу скриншоты, сделанные при тестировании (игрок - "Мордор", ИИ (Ривенделл) - "Высшие эльфы") подобного скрипта (в сочетании со стандартным территориальным спауном):
1 - Перед осадой (поселение, казалось бы, "на блюдечке"...):
Нажмите, чтобы прочитать 2 - Начинаем осаду (до щелчка кнопки осады):
Нажмите, чтобы прочитать 3 - Выбираем осаду и получаем сюрприз в виде мгновенного спауна у ИИ:
Нажмите, чтобы прочитать 4 - Продолжаем осаду и получаем на слледующий ход дополнительную проблему в лице территориального (срабатывающего позднее) спауна (+5 отрядов "светлого" городского гарнизона, т.к.такое количество предусматривает максимальный. используемый в поселении уровень стен ):
Нажмите, чтобы прочитать То есть после суммарного действия двух таких скриптов штурм поселения намного усложняется для игрока, который с легкостью хотел разделаться с поселением ИИ.
На этом обзор второго скрипта подошел к концу