Сичевые Свитки - FAQ - "Скрипучие Медные Копи" (cкриптинг M2TW)
Существуют ли какие-нибудь общие рекомендации по работе со скриптами ?
Spoiler (expand)
Основной принцип построения скриптов в файле campaign_script.txt состоит в следующем.
Файле campaign_script.txt образно можно назвать безусловным ИИ, хотя это не совсем так. Он имеет самую высокую приоритетность. Например, прописав скрипт спауна армии и её движения в определенную точку карты, можно пронаблюдать, что указанная армия находится под управлением скрипта из данного файладо тех пор, пока не достигнет заданной точки. По завершении скрипта данную армию подхватывают условия других файлов, относящихся к стратегическому ИИ - battle_config.xml, config_ai_battle.xml. Именно поэтому при создании скрипта в campaign_script.txt следует очень тщательно заботиться о работоспособности и исправности скрипта, ибо он должен вписываться в общий стратегический ИИ, жестко контролироваться и быть хорошо протестированным.
Монитор (monitor) в campaign_script.txt проверяет, что творится на карте на каждой стадии действия игрока, а также действия ИИ. Если условия совпадают с условиями, заданными в мониторе, происходит выполнение скрипта.
Скриптовые условия и команды могут быть самыми разными. Хорошим тоном в написании скриптов-мониторов является составление такой структуры, при которой сначала идет блок условий, а уже после них выполняются конкретные действия.
Основной принцип построения скриптов в файле campaign_script.txt состоит в следующем.
Файле campaign_script.txt образно можно назвать безусловным ИИ, хотя это не совсем так. Он имеет самую высокую приоритетность. Например, прописав скрипт спауна армии и её движения в определенную точку карты, можно пронаблюдать, что указанная армия находится под управлением скрипта из данного файладо тех пор, пока не достигнет заданной точки. По завершении скрипта данную армию подхватывают условия других файлов, относящихся к стратегическому ИИ - battle_config.xml, config_ai_battle.xml. Именно поэтому при создании скрипта в campaign_script.txt следует очень тщательно заботиться о работоспособности и исправности скрипта, ибо он должен вписываться в общий стратегический ИИ, жестко контролироваться и быть хорошо протестированным.
Монитор (monitor) в campaign_script.txt проверяет, что творится на карте на каждой стадии действия игрока, а также действия ИИ. Если условия совпадают с условиями, заданными в мониторе, происходит выполнение скрипта.
Скриптовые условия и команды могут быть самыми разными. Хорошим тоном в написании скриптов-мониторов является составление такой структуры, при которой сначала идет блок условий, а уже после них выполняются конкретные действия.
Что обозначают цифры в команде wait в приведенном ниже скриптовом блоке ?
Spoiler (expand)
Цифра 3 в скриптовой команде wait означает, что задается время ожидания, равное 3 временным единицам для отображения очередности действий (ими могут быть секунды, милисекунды).
if I_CharacterExists vengenand not I_SettlementOwner rome = venicesiege_settlement vengen, rome, maintainwait 3end_if
Цифра 3 в скриптовой команде wait означает, что задается время ожидания, равное 3 временным единицам для отображения очередности действий (ими могут быть секунды, милисекунды).
Каково значение скриптовой команды remove_trait ?
Spoiler (expand)
Данная команда позволяет удалить указанный трейт. Это полезно использовать, к примеру, в тех случаях, когда необходимо временно лишить персонажа возможности передвигаться.
console_command remove_trait orcgeneral1 script
Данная команда позволяет удалить указанный трейт. Это полезно использовать, к примеру, в тех случаях, когда необходимо временно лишить персонажа возможности передвигаться.
Существует ли скриптовая команда расформирования войск? ?
Spoiler (expand)
Да, роспуск отрядов можно осуществить при помощи команды destroy_unit.
Да, роспуск отрядов можно осуществить при помощи команды destroy_unit.
Каково значение скриптовой команды character_flash_start ?
Spoiler (expand)
Эта скриптовая команда также используется для создания спецэффекта подсветки данного персонажа.
character_flash_start orcgeneral1
Эта скриптовая команда также используется для создания спецэффекта подсветки данного персонажа.
Каково значение скриптовой команды reveal_tile ?
Spoiler (expand)
Данная скриптовая команда представляет собой задание спецэффекта при движении персонажа, при котором в указанных координатах карты происходит развеивание тумана войны.
reveal_tile x, y
Данная скриптовая команда представляет собой задание спецэффекта при движении персонажа, при котором в указанных координатах карты происходит развеивание тумана войны.
Каково назначение скриптовой команды terminate_monitor ?
Spoiler (expand)
Команда terminate_monitor используется для того чтобы избежать многократного повторения скриптовых действий, что в особенности актуально в скриптовых конструкциях, где возможно циклическое срабатывание содержимого монитора.
Команда terminate_monitor используется для того чтобы избежать многократного повторения скриптовых действий, что в особенности актуально в скриптовых конструкциях, где возможно циклическое срабатывание содержимого монитора.
Как с помощью скрипта реализовать такую ситуацию, чтобы при смене определенной эпохи новые отряды появились бы только в одной фракции, а через некоторое количество ходов - во всех остальных фракциях, или постепенно (сначала у одной, затем у другой и т.д.) ?
Spoiler (expand)
В процессе создания подобного скрипта могут оказаться полезны следующие рекомендации:
1. Для начала можно создать переменную, значение которой увеличивалось бы до требуемого тебе хода (или значения).
2. Затем можно прописать, что в случае, если переменная равна данному числу, то происходит открытие новой эпохи.
В процессе создания подобного скрипта могут оказаться полезны следующие рекомендации:
1. Для начала можно создать переменную, значение которой увеличивалось бы до требуемого тебе хода (или значения).
2. Затем можно прописать, что в случае, если переменная равна данному числу, то происходит открытие новой эпохи.
Как с помощью скрипта осуществить появление ивента с выбором "Да / Нет" на старте кампании, для того чтобы принять или отклонить какой-ли скрипт ?
Spoiler (expand)
Такое реально смоделировать с помощью следующей скриптовой конструкции:
Такое реально смоделировать с помощью следующей скриптовой конструкции:
add_eventsevent_counter submoddate 0end_add_eventsmonitor_event FactionTurnStart FactionIsLocalhistoric_event sub trueterminate_monitorend_monitormonitor_conditions I_EventCounter sub_accepted = 1and I_EventCounter submod = 0and FactionIsLocalhistoric_event Sub_activset_event_counter submod 1terminate_monitorend_monitor
Как с помощью скрипта убить персонажа ?
Spoiler (expand)
Для этого существует консольная команда kill_character, вот пример ее использования:
Для этого существует консольная команда kill_character, вот пример ее использования:
kill_character Maximus
Как с помощью скрипта реализовать победу нападающей армии в режиме автобоя ?
Spoiler (expand)
Для этого существует консольная чит-команда auto_win attacker, например:
Для этого существует консольная чит-команда auto_win attacker, например:
console_command auto_win attacker
Как правильно прописать скриптовые команды осады и штурма поселения ?
Spoiler (expand)
Осада поселения персонажем (maintain):
Штурм поселения персонажем (attack):
Осада поселения персонажем (maintain):
siege_settlement Gaius Julius, Rome, maintain
Штурм поселения персонажем (attack):
siege_settlement Gaius Julius, Rome, attack
Чем отличаются между собой следующие типы событий FactionTurnStart/SettlementTurnStart/PreFactionTurnStart, определяющие работу скриптового монитора ?
Spoiler (expand)
1. Общее
При использовании вышеуказанных типов скриптовых событий монитор срабатывает на начале хода.
2. Отличия
Монитор срабатывает в начале хода фракции.
Аналогично предыдущему, только условия и действия монитора будут связаны с поселением (соответственно в таком типе монитора будут доступны скриптовые условия и команды, применяемые по отношению к поселению, например проверка на наличие здания).
Монитор срабатывает ДО всех остальных мониторов, перечисленных выше.
1. Общее
При использовании вышеуказанных типов скриптовых событий монитор срабатывает на начале хода.
2. Отличия
FactionTurnStart
Монитор срабатывает в начале хода фракции.
SettlementTurnStart
Аналогично предыдущему, только условия и действия монитора будут связаны с поселением (соответственно в таком типе монитора будут доступны скриптовые условия и команды, применяемые по отношению к поселению, например проверка на наличие здания).
PreFactionTurnStart
Монитор срабатывает ДО всех остальных мониторов, перечисленных выше.
Чем отличаются скриптовые команды перемещения персонажа в указанные координаты reposition_character и move ?
Spoiler (expand)
Общий эффект воздействия на персонажа этих двух скриптовых команд одинаковый - они позволяют переместить данного персонажа в указанную координату страткарты.
Однако, есть и отличие : команда move перемещает персонажа с показом анимации движения, а команда reposition_character осуществляет мгновенное перемещение персонажа в целевую точку карты (т.е. телепортирует юнит из одних координат в другие без показа анимации перемещения).
Общий эффект воздействия на персонажа этих двух скриптовых команд одинаковый - они позволяют переместить данного персонажа в указанную координату страткарты.
Однако, есть и отличие : команда move перемещает персонажа с показом анимации движения, а команда reposition_character осуществляет мгновенное перемещение персонажа в целевую точку карты (т.е. телепортирует юнит из одних координат в другие без показа анимации перемещения).
Можно ли при помощи скрипта изменить юниту параметры атаки / защиты ?
Spoiler (expand)
На движке M2TWK осуществить подобную идею невозможно, даже при помощи скриптовых команд.
На движке M2TWK осуществить подобную идею невозможно, даже при помощи скриптовых команд.
Можно как-то обездвижить все действия на страткарте?
Spoiler (expand)
Подобное реализовано в скриптах пролога M2TW.
Подобное реализовано в скриптах пролога M2TW.
Как принудить персонажа какой-либо фракции не перемещаться по страткарте (не атаковать другие фракции) ?
Spoiler (expand)
Способ 1 :
Можно ограничить фракцию до определенного хода или условия, аналогично фракции Ацтеков в M2TW при помощи скриптовых команд :
Способ 2 :
Также можно присвоить конкретному персонажу фракции специальную характеристику (трейт), которая сделает скорость перемещения по стратегической карте, равную 0, либо ограничит очки движения, и как следствие движение персонажа, имеющего подобный трейт, окажется принудительно заблокированным.
Способ 1 :
Можно ограничить фракцию до определенного хода или условия, аналогично фракции Ацтеков в M2TW при помощи скриптовых команд :
freeze_faction_ai aztecs; блокировка действий фракции
unfreeze_faction_ai aztecs; разблокировка действий фракции
Способ 2 :
Также можно присвоить конкретному персонажу фракции специальную характеристику (трейт), которая сделает скорость перемещения по стратегической карте, равную 0, либо ограничит очки движения, и как следствие движение персонажа, имеющего подобный трейт, окажется принудительно заблокированным.
Как с помощью скрипта прописать смерть персонажа, являющегося членом семьи ?
Spoiler (expand)
Скриптовую смерть персонажа можно прописать по примеру следующего скрипта из мода "Русичи":
Скриптовую смерть персонажа можно прописать по примеру следующего скрипта из мода "Русичи":
monitor_conditions not I_CharacterExists rus-Igorhistoric_event SMERTIGORA false factions { armenia, }terminate_monitorend_monitorБудут ли работать скрипты, которые были отредактированы и сохранены во время прожига игры ?
Spoiler (expand)
В этом случае новую игру надо начинать обязательно, так как при запуске компании происходит инициализация скриптов.
Надо полагать, что скрипты копируются в буфер при начале игры, а уже после используются. При этом, каким-то образом движок игры делает отметки, какой скрипт уже не используется, какой будет снова использован, какому только предстоит сработать.
В этом случае новую игру надо начинать обязательно, так как при запуске компании происходит инициализация скриптов.
Надо полагать, что скрипты копируются в буфер при начале игры, а уже после используются. При этом, каким-то образом движок игры делает отметки, какой скрипт уже не используется, какой будет снова использован, какому только предстоит сработать.
Как правильно прописывать идентификаторы юнитов в скриптах ?
Spoiler (expand)
В скриптах названия юнитов прописываются аналогично идентифитору type записи юнита в файле export_descr_unit.txt
Следует отметить, что идентификатор юнита с подчеркиванием типа dictionary не применяется в скриптах, так как он используется в файлах локализации игры (для того чтобы не возникало путаницы).
В скриптах названия юнитов прописываются аналогично идентифитору type записи юнита в файле export_descr_unit.txt
Следует отметить, что идентификатор юнита с подчеркиванием типа dictionary не применяется в скриптах, так как он используется в файлах локализации игры (для того чтобы не возникало путаницы).
За что отвечает скриптовое условие GarrisonToPopulationRatio ?
Spoiler (expand)
Данное условие сравнивает пропорции гарнизона и мирного населения.
and GarrisonToPopulationRatio < 0.4
Данное условие сравнивает пропорции гарнизона и мирного населения.
Как будет вести себя скрипт с ивентом, если для данного ивента не задана инфокартинка ?
Spoiler (expand)
Опыт тестирования скриптов показывает, что даже при отсутствии инфокартинки ивент все равно будет работать. Однако, если проблема заключена в самом ивенте, то скрипт хоть и будет работать, но при срабатывании ивента последует вылет. В случае, если Если не работает весь скрипт, то проблема скорее всего в нем, а не в ивенте.
Опыт тестирования скриптов показывает, что даже при отсутствии инфокартинки ивент все равно будет работать. Однако, если проблема заключена в самом ивенте, то скрипт хоть и будет работать, но при срабатывании ивента последует вылет. В случае, если Если не работает весь скрипт, то проблема скорее всего в нем, а не в ивенте.
Чем отличаются друг от друга типы скриптовых событий PreFactionTurnStart и FactionTurnStart ?
Spoiler (expand)
Отличие этих типов событий заключается во времени исполнения команд скриптового монитора.
Если PreFactionTurnStart осуществляет прожиг скрипта ДО начала хода (по нажатии конца хода), то FactionTurnStart - НА начале хода (по началу нового хода).
Отличие этих типов событий заключается во времени исполнения команд скриптового монитора.
Если PreFactionTurnStart осуществляет прожиг скрипта ДО начала хода (по нажатии конца хода), то FactionTurnStart - НА начале хода (по началу нового хода).
Как в скрипте задать проверку через определенное число ходов, кратное какому-либо числу ?
Spoiler (expand)
Для реализации подобной затеи можно установить счетчик, который равняться 1, если ход равен 12, 24, 36 и т.д.
Для реализации подобной затеи можно установить счетчик, который равняться 1, если ход равен 12, 24, 36 и т.д.
Зачем перед некоторыми скриптовыми условиями ставится знак "!" ?
Spoiler (expand)
Подобный символ является эвивалентом not, например:
Обе эти строки являются идентичными, т.е. их смысл ("Фракция НЕ Россия") абсолютно одинаковый.
В применении подобного рода синтаксиса разницы нет, в разных модах используются как обычный вариант с not , так и вышеуказанный.
Подобный символ является эвивалентом not, например:
! FactionType russia
not FactionType russia
Обе эти строки являются идентичными, т.е. их смысл ("Фракция НЕ Россия") абсолютно одинаковый.
В применении подобного рода синтаксиса разницы нет, в разных модах используются как обычный вариант с not , так и вышеуказанный.
Как реализовать ситуацию, чтобы после уничтожения фракции через некоторое время появилась возможность возникновения бунта данной фракции ?
Spoiler (expand)
Можно составить скрипт приблизительно такого плана:
Можно составить скрипт приблизительно такого плана:
declare_counter fac_deathset counter fac_death 0desclare_counter timer_for_faction1 set_counter timer_for_faction1 0monitor_event faction_eliminated england set_counter fac_death 1end_monitormonitor_event faction turn slave;(внимание - этот скрипт привязываем к повстанцам, так как это вечная фракция) and counter fac_deаth 1 increase_counter timer_for_faction1 end_monitormonitor_event faction turn slave;(внимание - этот скрипт привязываем к повстанцам, так как это вечная фракция) and counter fac_death 1 and counter timer_for_faction1 1 set_counter fac_deth 0 set_counter timer_for_faction1 0 (выполняем обнуление счетчика); Далее код аналогичен скрипту ""Восстания баронов" (M2TWK - Britania)end_monitor
Каково назначение скриптовой команды faction_emerge ?
Spoiler (expand)
faction_emerge - это команда, имитирующая гражданскую войну, она используется применительно к конкретной фракции, из которой будет возрождатся другая фракция, причем эти фракции должны быть одной культуры.
faction_emerge - это команда, имитирующая гражданскую войну, она используется применительно к конкретной фракции, из которой будет возрождатся другая фракция, причем эти фракции должны быть одной культуры.
Какова суть скриптового условия I_IsFactionAIControlled ?
Spoiler (expand)
Фракция Венеция (venice) находится под контролем исуксственного интеллекта (ИИ).
and I_IsFactionAIControlled venice
Фракция Венеция (venice) находится под контролем исуксственного интеллекта (ИИ).
Как с помощью скрипта смоделировать принудительную битву между армиями фракций ?
Spoiler (expand)
Принудительное сражение между двумя армиями фракций задается при помощи скриптовой команды engage_armies, где необходимо указать атакующего и обороняющегося персонажей (полководец / генерал / адмирал).
Пример использования такой команды:
Здесь Man и Getman - имена персонажей, задействованных в скриптовом сражении.
Принудительное сражение между двумя армиями фракций задается при помощи скриптовой команды engage_armies, где необходимо указать атакующего и обороняющегося персонажей (полководец / генерал / адмирал).
Пример использования такой команды:
engage_armies Man, Getman
Здесь Man и Getman - имена персонажей, задействованных в скриптовом сражении.
Как при помощи скрипта прописать нейтральные отношения между фракциями ?
Spoiler (expand)
Для этого существует скриптовая консольная команда, задающая дипломатические отношения между фракциями (в примере - фракции england и france):
В этой команде соответственно могут использоваться следующие значения дипломатических отношений: neutral - нейтралитет; war - война; allied - союз.
Для этого существует скриптовая консольная команда, задающая дипломатические отношения между фракциями (в примере - фракции england и france):
console_command diplomatic_stance england france neutral
В этой команде соответственно могут использоваться следующие значения дипломатических отношений: neutral - нейтралитет; war - война; allied - союз.
Как правильно прописать код спауна армии, находящейся на морской территории в кораблях?
Spoiler (expand)
Характерной особенностью такого скриптового спауна является то, что первоначально нужно задавать спаун адмирала, а уже после него выполнять спаун сухопутной армии.
Здесь следует обратить внимание, что оба блока спауна прописываются отдельно друг от друга, но поочередно (сначала флот, затем армия, размещенная в нем), с учетом обязательного указания одних и тех же координат спауна в обоих случаях.
В качестве образца подобной скриптовой конструкции может выступать следующий блок:
Характерной особенностью такого скриптового спауна является то, что первоначально нужно задавать спаун адмирала, а уже после него выполнять спаун сухопутной армии.
Здесь следует обратить внимание, что оба блока спауна прописываются отдельно друг от друга, но поочередно (сначала флот, затем армия, размещенная в нем), с учетом обязательного указания одних и тех же координат спауна в обоих случаях.
В качестве образца подобной скриптовой конструкции может выступать следующий блок:
... spawn_army faction england character random_name, admiral, age 20, x 12, y 219 unit Elven small ship exp 0 armour 0 weapon_lvl 0 unit Elven small ship exp 0 armour 0 weapon_lvl 0 end spawn_army faction england character random_name, named character, age 20, x 12, y 219 traits LoyaltyStarter 1, Upright 2, GoodCommander 4, PublicFaith 2, elf 1 unit High elf bodyguard exp 9 armour 0 weapon_lvl 0 unit Shadow warrior exp 9 armour 0 weapon_lvl 0 unit Bolt Thrower exp 3 armour 0 weapon_lvl 0 unit White lions exp 5 armour 0 weapon_lvl 1 end ...
Как с помощью скрипта реализовать передачу города от одной фракции к другой ?
Spoiler (expand)
Подобный скрипт можно составить с помощью следующей конструкции:
Примечание: можно передать поселение от ИИ игроку, а от ИИ к ИИ или от игрока к ИИ невозможно.
Подобный скрипт можно составить с помощью следующей конструкции:
monitor_event FactionTurnStart FactionIsLocal and I_TurnNumber = 1 and I_FactionLocal venice console_command capture_settlement Hades terminate_monitor end_monitor
Примечание: можно передать поселение от ИИ игроку, а от ИИ к ИИ или от игрока к ИИ невозможно.
С помощью каких команд можно использовать счетчики-переменные в скриптах ?
Spoiler (expand)
Переменные-счетчики в скриптах обычно объявляются вне монитора, например:
declare_counter ch_tilis - объявление переменной;
Присваивание или изменение значений счетчика производится уже в самом блоке скриптового монитора, например:
set_counter ch_tilis 0 - присваивание значения переменной;
and I_CompareCounter ch_tilis = 0 - условие, выполняющее проверку счетчика с определенным значением ( для сравнения текущего значения с целевым могут использоваться следующие знаки - "=" ">" ">=" "<" "<=");
inc_counter ch_tilis1 - команда, изменяющая значение переменной каждый ход на определенное значение (в данном случае увеличивает на 1, хотя можно задать и уменьшение текущего значения, прописав отрицательное число);
Переменные-счетчики в скриптах обычно объявляются вне монитора, например:
declare_counter ch_tilis - объявление переменной;
Присваивание или изменение значений счетчика производится уже в самом блоке скриптового монитора, например:
set_counter ch_tilis 0 - присваивание значения переменной;
and I_CompareCounter ch_tilis = 0 - условие, выполняющее проверку счетчика с определенным значением ( для сравнения текущего значения с целевым могут использоваться следующие знаки - "=" ">" ">=" "<" "<=");
inc_counter ch_tilis1 - команда, изменяющая значение переменной каждый ход на определенное значение (в данном случае увеличивает на 1, хотя можно задать и уменьшение текущего значения, прописав отрицательное число);
При помощи скрипта добавить денег любой фракции, управляемой игроком ?
Spoiler (expand)
Для этого необходимо прописать консольную команду выдачи денег add_money без указания фракции, например:
Либо можно пойти альтернативным путем и прописать выдачу золотых каждой фракции, например:
Для этого необходимо прописать консольную команду выдачи денег add_money без указания фракции, например:
monitor_event FactionTurnStart FactionIsLocal[code] [code]console_command add_money 2500
Либо можно пойти альтернативным путем и прописать выдачу золотых каждой фракции, например:
monitor_event FactionTurnStart FactionType spain and FactionIsLocal and Treasury < 20000 add_money spain 2500 end_monitor
Как сделать, чтобы скриптовому счетчику изначально присваивалось какое-то значение, но только в начале, а не каждый ход (проблема в том, что команда set_counter без монитора активируется каждый ход) ?
Spoiler (expand)
Изначально счетчику задано нулевое значение, которое по умолчанию остается равным 0. В остальном же при задании команды set_counter счетчик срабатывает не каждый ход.
Изначально счетчику задано нулевое значение, которое по умолчанию остается равным 0. В остальном же при задании команды set_counter счетчик срабатывает не каждый ход.
Существует ли такая скриптовая команда, которая запрещает обучать юнитов при определенных условиях ?
Spoiler (expand)
Да, подобная команда существует:
Identifier: freeze_recruit_pool
Parameters: region_name|region_id|all [true|false]
Description: Stop/start all unit pools replenish/deplenish in specified region or all regions
Sample use: freeze_recruit_pool York_Province true
Class: FREEZE_RECRUIT_POOL
Да, подобная команда существует:
Identifier: freeze_recruit_pool
Parameters: region_name|region_id|all [true|false]
Description: Stop/start all unit pools replenish/deplenish in specified region or all regions
Sample use: freeze_recruit_pool York_Province true
Class: FREEZE_RECRUIT_POOL
Каково назначение и принцип действия скриптового условия SettlementPopulationTooLow ?
Spoiler (expand)
Дословно данное условие звучит следующим образом: "численность населения слишком мала, чтобы нанимать в поселении юнитов".
Характерный пример использования такого условия можно привести в следующем скрипте:
Примечание: в M2TWK найм юнитов в поселении неосуществим, когда уровень населения составляет порядка 600-800 жителей.
Однако, отрицательные результаты тестирования подобных ситуаций показывают, что рассматриваемое условие SettlementPopulationTooLow вполне может представлять собой пережиток RTW.
Дословно данное условие звучит следующим образом: "численность населения слишком мала, чтобы нанимать в поселении юнитов".
Характерный пример использования такого условия можно привести в следующем скрипте:
monitor_event SettlementTurnEnd SettlementName Camulosadae and not SettlementIsLocal and I_SettlementOwner Camulosadae = britons and not SettlementPopulationTooLow and TrainingQueueIdleDespiteCash and I_CompareCounter ut_camulosadae = 0 and SettlementBuildingExists = muster_field_D console_command create_unit Camulosadae "celtic infantry lugoae" 1 console_command add_money britons, -859 console_command add_population Camulosadae -122 end_monitor
Примечание: в M2TWK найм юнитов в поселении неосуществим, когда уровень населения составляет порядка 600-800 жителей.
Однако, отрицательные результаты тестирования подобных ситуаций показывают, что рассматриваемое условие SettlementPopulationTooLow вполне может представлять собой пережиток RTW.
Каково назначение и принцип действия скриптовой команды give_everything_to_faction ?
Spoiler (expand)
Команда give_everything_to_faction передает все поселения, а также всех персонажей фракции hungary ("Венгрия") во владение фракции france ("Франция").
И соответственно после этого фракция hungary перестает существовать в процессе кампании.
Упоминание false используется для показа сообщения о поражении державы (в данном случае фракции hungary). Также возможно использование true для того чтобы запретить оповещение подобных сообщений во время игры.
Например, в качестве характерного примера, можно рассмотреть подобную скриптовую фишку в Bellum Crucis, где с помощью этой команды реализована возможность унаследовать страну через династический брак, то есть (частный случай) после женитьбы наследника на принцессе той же самой Венгрии, когда по истечение 10-30 лет умирают правитель и принц, а наследников больше нет (фракция ИИ), то в случае если к этому времени в Вашем генеалогическом древе имеется член семьи с трейтом "Венгерская кровь" (или что-то подобное), то все имущество Венгрии переходит в распоряжение Вашей державы):
...if I_LocalFaction france give_everything_to_faction hungary france falseend_if...
Команда give_everything_to_faction передает все поселения, а также всех персонажей фракции hungary ("Венгрия") во владение фракции france ("Франция").
И соответственно после этого фракция hungary перестает существовать в процессе кампании.
Упоминание false используется для показа сообщения о поражении державы (в данном случае фракции hungary). Также возможно использование true для того чтобы запретить оповещение подобных сообщений во время игры.
Например, в качестве характерного примера, можно рассмотреть подобную скриптовую фишку в Bellum Crucis, где с помощью этой команды реализована возможность унаследовать страну через династический брак, то есть (частный случай) после женитьбы наследника на принцессе той же самой Венгрии, когда по истечение 10-30 лет умирают правитель и принц, а наследников больше нет (фракция ИИ), то в случае если к этому времени в Вашем генеалогическом древе имеется член семьи с трейтом "Венгерская кровь" (или что-то подобное), то все имущество Венгрии переходит в распоряжение Вашей державы):
{HUNGARY_EREDE_EVENT_BODY} Ваша мудрая династическая политика дала свои плоды. Умерший без наследников мужского пола, король Венгрии не обьявил имени регента, что спровоцировало кровопролитную и бескомпромиссную борьбу за престол. В конце благородные венгры договорились и предложили корону своего государства Вашей знаменитой династии, которая теперь может быть украшена честью и титулом Короля Мадьяр! {HUNGARY_EREDE_EVENT_TITLE}Унаследован трон Венгрии!Чем отличаются скриптовые условия I_CharacterSelected и I_CharacterExists ?
Spoiler (expand)
Условие I_CharacterSelected проверяет, выделен ли в данный момент указанный персонаж, например (трейт получает указанный персонаж, если он выделен) :
Условие I_CharacterExists проверяет, существует ли на данный момент в игровой кампании указанный персонаж, например (трейт получает указанныйй персонаж, если он существует в кампании) :
Условие I_CharacterSelected проверяет, выделен ли в данный момент указанный персонаж, например (трейт получает указанный персонаж, если он выделен) :
if I_CharacterSelected bisgenerflensconsole_command give_trait bisgenerflens scriptend_if
Условие I_CharacterExists проверяет, существует ли на данный момент в игровой кампании указанный персонаж, например (трейт получает указанныйй персонаж, если он существует в кампании) :
if I_CharacterExists bisgenerflens console_command give_trait bisgenerflens script end_if
Что сильнее нагружает движок игры - триггеры в export_descr_character_traits.txt или мониторы в campaign_script.txt ?
Spoiler (expand)
Однозначно нельзя ответить на данный вопрос. Что касается скриптовых мониторов, то они могут срабатывать как только один раз в кампании, так и каждый ход. В связи с этим следует, что нагрузка на игру разная, зависящая от структуры монитора.
Однозначно нельзя ответить на данный вопрос. Что касается скриптовых мониторов, то они могут срабатывать как только один раз в кампании, так и каждый ход. В связи с этим следует, что нагрузка на игру разная, зависящая от структуры монитора.
Каково назначение скриптовой команды terminate_monitor ?
Spoiler (expand)
Команда terminate_monitor применяется для того, чтобы монитор после своего единократного срабатывания более не повторялся в текущей кампании.
Команда terminate_monitor применяется для того, чтобы монитор после своего единократного срабатывания более не повторялся в текущей кампании.
Как исправить ситуацию: если с помощью скрипта прописать появление персонажа с уже использующимся именем и дать ему какие-либо характеристики, то указанные трейты появляются только у существующего персонажа с таким же именем, а создаваемый персонаж спаунится без трейтов ? Можно ли сделать так, чтобы трейты получал только новый персонаж ?
Spoiler (expand)
Такое осуществить на движке M2TWK маловероятно, поскольку создаваемому при помощи скрипта персонажу нельзя присвоить лейбл (уникальную метку) в отличие от уже имеющегося (например, стартового) персонажа.
...monitor_event CharacterMarriesPrincess CharFactionType russia and CharacterIsLocal and Trait oIme < 1 e_select_character if I_CharacterSelected Boleslav Yurievich console_command give_trait this oBoleslav 1 console_command give_trait this oIme 1 end_if...
Такое осуществить на движке M2TWK маловероятно, поскольку создаваемому при помощи скрипта персонажу нельзя присвоить лейбл (уникальную метку) в отличие от уже имеющегося (например, стартового) персонажа.
При тестировании скрипта захвата поселения - полководец ИИ-фракции осаждает, а затем и атакует поселение - выявлено, что после победы персонаж с армией покидает поселение, и оно становится мятежным. Возможно ли каким-то образом исправить подобное поведение ИИ ?
Spoiler (expand)
Дать однозначный ответ на данный вопрос сложно, поскольку поведение ИИ нужно отслеживать путем непосредственного тестирования.
Однако, стоит обратить внимание на возможные причины таких действий со стороны ИИ:
1. Такое вполне возможно, если тестируемая ИИ-фракция прописана по типу фракции-орды. В этом случае полезно протестировать поведение ИИ-фракции обычного типа (фракция не является ордой).
2. Можно попробовать тестирование осады поселения 2 армиями ИИ-фракции (вполне возможно, что в таком случае отряды ИИ будут оставаться в захваченном поселении).
3. Попробовать прописать захватываемое поселение целевым для тестируемой ИИ-фракции (параметр hold_regions в файле descr_win_conditions.txt).
Дать однозначный ответ на данный вопрос сложно, поскольку поведение ИИ нужно отслеживать путем непосредственного тестирования.
Однако, стоит обратить внимание на возможные причины таких действий со стороны ИИ:
1. Такое вполне возможно, если тестируемая ИИ-фракция прописана по типу фракции-орды. В этом случае полезно протестировать поведение ИИ-фракции обычного типа (фракция не является ордой).
2. Можно попробовать тестирование осады поселения 2 армиями ИИ-фракции (вполне возможно, что в таком случае отряды ИИ будут оставаться в захваченном поселении).
3. Попробовать прописать захватываемое поселение целевым для тестируемой ИИ-фракции (параметр hold_regions в файле descr_win_conditions.txt).
Как с помощью скрипта прописать условие захвата определенной фракцией конкретного поселения ?
Spoiler (expand)
Проверку фракции на наличие определенного поселения можно выполнить с помощью следующей скриптовой конструкции:
Здесь I_SettlementOwner Ryazangrd = milan - команда, осуществляющая проверку того, является ли владельцем поселения Ryazangrd фракция milan.
Проверку фракции на наличие определенного поселения можно выполнить с помощью следующей скриптовой конструкции:
monitor_event PreFactionTurnStart FactionType milan
if I_SettlementOwner Ryazangrd = milan
set_counter ryazanrus 1
end_if
end_monitor
Здесь I_SettlementOwner Ryazangrd = milan - команда, осуществляющая проверку того, является ли владельцем поселения Ryazangrd фракция milan.
Существует ли скриптовая команда, посредством которой можно определить уровень дипломатических отношений между фракциями ?
Spoiler (expand)
Уровень дипломатических отношений одной фракции к какой-либо другой державе можно проверить скриптовым условием DiplomaticStanceFromFaction :
Идентификатор: DiplomaticStanceFromFaction
Требования для триггера: faction
Параметры: faction type, logic token, stance (Allied, Suspicious, Neutral, Hostile, AtWar)
Пример использования: DiplomaticStanceFromFaction
romans_julii > Suspicious
Описание: Проверяет, какая у персонажей фракции дипломатическая позиция по отношению к другой указанной фракции
Тактический/стратегический режим: И тот, и другой
Класс: DIPLOMATIC_STANCE_FROM_FACTION
Выполнение: Да
Уровень дипломатических отношений одной фракции к какой-либо другой державе можно проверить скриптовым условием DiplomaticStanceFromFaction :
Идентификатор: DiplomaticStanceFromFaction
Требования для триггера: faction
Параметры: faction type, logic token, stance (Allied, Suspicious, Neutral, Hostile, AtWar)
Пример использования: DiplomaticStanceFromFaction
romans_julii > Suspicious
Описание: Проверяет, какая у персонажей фракции дипломатическая позиция по отношению к другой указанной фракции
Тактический/стратегический режим: И тот, и другой
Класс: DIPLOMATIC_STANCE_FROM_FACTION
Выполнение: Да
Возможно ли создание с помощью скрипта ситуации, в которой при определённых условиях выполнялось уничтожение конкретного персонажа у определенной фракции и появлялся другой персонаж вместо устраненного ?
Spoiler (expand)
Теоретически создание такого скрипта осуществимо (использование скриптовой команды kill_character по отношению к уничтожаемому персонажу на каком-то конкретном ходу, затем создание нового персонажа посредством противоположной команды spawn_army с присвоением ему требуемых характеристик и юнитов), хотя есть достаточно много технических нюансов (основная проблема - невозможно передать текущие характеристики прежнего персонажа новому герою).
Теоретически создание такого скрипта осуществимо (использование скриптовой команды kill_character по отношению к уничтожаемому персонажу на каком-то конкретном ходу, затем создание нового персонажа посредством противоположной команды spawn_army с присвоением ему требуемых характеристик и юнитов), хотя есть достаточно много технических нюансов (основная проблема - невозможно передать текущие характеристики прежнего персонажа новому герою).
Как использовать скриптовую команду kill_character ?
Spoiler (expand)
Пример скриптового убийства "АнтиПапы" c применением команды kill_character (очевидно, из Stainless Steel) :
Пример скриптового убийства "АнтиПапы" c применением команды kill_character (очевидно, из Stainless Steel) :
monitor_event FactionTurnStart FactionType england and FactionIsLocal and I_EventCounter england_reconversion_accepted = 1 and I_CharacterExists Antipope kill_character Antipope historic_event england_antipope_death event/antipope_death.bik terminate_monitor end_monitor
Можно ли с помощью скрипта спланировать смерть персонажа на определенном ходу ?
Spoiler (expand)
Характерный пример подобного скрипта:
Комментарии:
monitor_event FactionTurnEnd FactionType milan - скриптовое событие совершается для фракции milan на конце хода.
and I_TurnNumber = 100 - скриптовое условие, проверяющее, равно ли число сделанных ходов значению 100.
if I_CharacterExists Tengel - открытие оператора if , скриптовое условие, проверяющее, существует ли на указанном ходу конкретный персонаж.
kill_character Tengel - скриптовая команда, осуществляющая запланированное убийство указанного персонажа ; срабатывает при выполнении всех вышеуказанных условий.
end_if - закрытие оператора if.
end_monitor - окончание скриптового события.
Характерный пример подобного скрипта:
monitor_event FactionTurnEnd FactionType milan and I_TurnNumber = 100
if I_CharacterExists Tengel
kill_character Tengel
end_if
end_monitor
Комментарии:
monitor_event FactionTurnEnd FactionType milan - скриптовое событие совершается для фракции milan на конце хода.
and I_TurnNumber = 100 - скриптовое условие, проверяющее, равно ли число сделанных ходов значению 100.
if I_CharacterExists Tengel - открытие оператора if , скриптовое условие, проверяющее, существует ли на указанном ходу конкретный персонаж.
kill_character Tengel - скриптовая команда, осуществляющая запланированное убийство указанного персонажа ; срабатывает при выполнении всех вышеуказанных условий.
end_if - закрытие оператора if.
end_monitor - окончание скриптового события.
В каких файлах игры сосредоточена информация об исторических событиях ?
Spoiler (expand)
1. Исторические события задаются при помощи скриптовой команды historic_event в campaign_script.txt.
2. Локализация ( BODY - текстовое описание, TITLE - название ) исторических событий размещается в файле historic_events.txt папки text.
3. Графический контент, используемый для исторических событий:
- Инфокартинки : data / ui / <название культуры> / eventpics
- Видеоролики : data / fmv / event
1. Исторические события задаются при помощи скриптовой команды historic_event в campaign_script.txt.
2. Локализация ( BODY - текстовое описание, TITLE - название ) исторических событий размещается в файле historic_events.txt папки text.
3. Графический контент, используемый для исторических событий:
- Инфокартинки : data / ui / <название культуры> / eventpics
- Видеоролики : data / fmv / event
Как работает монитор I_CharacterTypeNearTile ?
Spoiler (expand)
Рассмотрим пример:
2 - это расстояние от координат: если указать 0, то будет только при нахождении его в этой точке срабатывать.
Соответственно если 2, то сработает в этой точке и в точках удаленных на 1 и на 2.
Чтобы задать область можно использовать несколько таких условий с подходящими "окружностями".
Рассмотрим пример:
monitor_conditions I_CharacterTypeNearTile novgorod named_character, 2 126, 234
2 - это расстояние от координат: если указать 0, то будет только при нахождении его в этой точке срабатывать.
Соответственно если 2, то сработает в этой точке и в точках удаленных на 1 и на 2.
Чтобы задать область можно использовать несколько таких условий с подходящими "окружностями".
Как удалить юнитов в поселении после их спауна в результате срабатывания гарнизонного скрипта ?
Spoiler (expand)
Для того чтобы удалить из гарнизона поселения юнитов, появившихся в результате срабатывания спауна, необходимо прописать специальных юнитов в export_descr_unit.txt, задав приэ том новый идентификатор.
Это связано со следующей проблемой: в процессе игры может возникнуть такая ситуация, что в гарнизоне поселения во время осады окажутся те же самые юниты, что прописаны в скрипте гарнизонного спауна. В результате снятия осады целенаправленное уничтожение якобы заспаунившихся юнитов приведет к тому, что произойдет путаница - компьютер будет удалять необходимое количество отрядов, но при этом не будет делать различий между юнитами, ранее существовавшими (например, завербованные где-либо и прокачанные до определенного уровня опыта) и свежими юнитами, которых компьютер намеренно создает при помощи скрипта.
Именно поэтому гарнизонных юнитов рекомендуется прописывать как отдельные боевые единицы в списке юнитов, а уже после этого в скрипте принудительно уничтожать их после снятия осады посредством скриптовой команды destroy_units - она осуществляет уничтожение юнита в любых координатах страткарты по имени юнита для конкретной фракции.
Для того чтобы удалить из гарнизона поселения юнитов, появившихся в результате срабатывания спауна, необходимо прописать специальных юнитов в export_descr_unit.txt, задав приэ том новый идентификатор.
Это связано со следующей проблемой: в процессе игры может возникнуть такая ситуация, что в гарнизоне поселения во время осады окажутся те же самые юниты, что прописаны в скрипте гарнизонного спауна. В результате снятия осады целенаправленное уничтожение якобы заспаунившихся юнитов приведет к тому, что произойдет путаница - компьютер будет удалять необходимое количество отрядов, но при этом не будет делать различий между юнитами, ранее существовавшими (например, завербованные где-либо и прокачанные до определенного уровня опыта) и свежими юнитами, которых компьютер намеренно создает при помощи скрипта.
Именно поэтому гарнизонных юнитов рекомендуется прописывать как отдельные боевые единицы в списке юнитов, а уже после этого в скрипте принудительно уничтожать их после снятия осады посредством скриптовой команды destroy_units - она осуществляет уничтожение юнита в любых координатах страткарты по имени юнита для конкретной фракции.
В чем заключается отличие типов скриптовых мониторов monitor_event и monitor_conditions ?
Spoiler (expand)
monitor_event - тип скриптового монитора, отвечающий за срабатывание некоторого события, происходящего в игре один раз ; требует указание конкретного типа события (EVENTS), при котором можно задать проверку определенных условий (CONDITIONS) и дальнейшее срабатывание скриптовых команд (COMMANDS).
monitor_conditions - тип скриптового монитора, используемый для проверки определенного генерального скриптового условия, при выполнении которого можно также задать дополнительные условия из списка CONDITIONS, после чего осуществляется выполнение указанных команд списка COMMANDS ; не требует привязки к скриптовым событиям типа EVENTS.
monitor_event - тип скриптового монитора, отвечающий за срабатывание некоторого события, происходящего в игре один раз ; требует указание конкретного типа события (EVENTS), при котором можно задать проверку определенных условий (CONDITIONS) и дальнейшее срабатывание скриптовых команд (COMMANDS).
monitor_conditions - тип скриптового монитора, используемый для проверки определенного генерального скриптового условия, при выполнении которого можно также задать дополнительные условия из списка CONDITIONS, после чего осуществляется выполнение указанных команд списка COMMANDS ; не требует привязки к скриптовым событиям типа EVENTS.
Существует ли скриптовая команда, позволяющая сравнить состояние казны фракци с определенным значением денежной суммы ?
Spoiler (expand)
Идентификатор: Treasury
Требования для триггера: faction
Параметры: logic token, quantity
Пример использования: Treasury > 2000
Описание: Превышают ли наличные средства пороговую величину?
Тактический/стратегический режим: Стратегический
Класс: TREASURY
Выполнение: Да
Идентификатор: Treasury
Требования для триггера: faction
Параметры: logic token, quantity
Пример использования: Treasury > 2000
Описание: Превышают ли наличные средства пороговую величину?
Тактический/стратегический режим: Стратегический
Класс: TREASURY
Выполнение: Да
Для каких целей в скриптовых мониторах используется оператор while ?
Spoiler (expand)
Оператор while в скриптовых мониторах используется в тех случаях, когда возникает необходимость выполнять какое-либо действие постоянно при выполнении текущего состояния некоторого условия. Например, можно задать начисление денег в казну фракции при условии, что произвольная переменная принимает определенное значение в указанный момент срабатывания монитора:
Оператор while в скриптовых мониторах используется в тех случаях, когда возникает необходимость выполнять какое-либо действие постоянно при выполнении текущего состояния некоторого условия. Например, можно задать начисление денег в казну фракции при условии, что произвольная переменная принимает определенное значение в указанный момент срабатывания монитора:
declare_counter test; объявление (инициализация) переменной testset_counter test 5; команда, присваивающая переменной test значение, равное 5
monitor_event FactionturnStart FactionIsLocal; объявление скриптового события для фракции, управляемой игроком, на начале хода
while I_CompareCounter test > 0; открытие оператора while; проверка на соответствие переменной test положительным численным значениям
add_money novgorod 50000; команда добавления денег, начисляющая фракции novgorod 50000 золотых при условии, что test > 0
inc_counter test - 1; последующая команда, понижающая значение переменной test в процессе срабатывания монитора на 1
end_while; закрытие оператора while
end_monitor; окончание скриптового события
Существует ли скриптовая команда, позволяющая проверить, какая фракция осаждает поселение ?
Spoiler (expand)
Идентификатор: I_FactionBesieged
Требования для триггера:
Параметры: faction type
Пример использования: not I_FactionBesieged romans_julii
Описание: Есть ли где-либо поселения фракции в осаде?
Тактический/стратегический режим: Стратегический
Класс: FACTION_BESIEGED
Выполнение: Да
Идентификатор: I_FactionBesieged
Требования для триггера:
Параметры: faction type
Пример использования: not I_FactionBesieged romans_julii
Описание: Есть ли где-либо поселения фракции в осаде?
Тактический/стратегический режим: Стратегический
Класс: FACTION_BESIEGED
Выполнение: Да
Что означает идентификатор siege_assault_button в строке объявления скриптового события ?
Spoiler (expand)
siege_assault_button - это конкретный код элемента пользовательского интерфейса, в данной случае - кнопки "Начать штурм".
Так, скриптовое событие типа ButtonPressed происходит при двойном нажатии указанной клавиши (первый клик - персонаж атакует само поселение, второй клик - персонаж начинает штурм поселения).
monitor_event ButtonPressed ButtonPressed siege_assault_button
siege_assault_button - это конкретный код элемента пользовательского интерфейса, в данной случае - кнопки "Начать штурм".
Так, скриптовое событие типа ButtonPressed происходит при двойном нажатии указанной клавиши (первый клик - персонаж атакует само поселение, второй клик - персонаж начинает штурм поселения).
Можно ли с помощью скриптовой команды выполнить переименование поселения (например, в случае его захвата определенной фракцией) ?
Spoiler (expand)
Существует скриптовая команда change_settlement_name, пример использования:
Существует скриптовая команда change_settlement_name, пример использования:
change_settlement_name Constantinople Istanbul
Как реализуется в игре скриптовое событие CityRazed ?
Spoiler (expand)
Подобное скриптовое событие происходит, когда фракция, находящаяся в состоянии орды, после захвата поселения уничтожает поселение до основания и продолжает дальнейшие действие, а поселение, в свою очередь, переходит в состояние бунта и принадлежит ребелам.
Подробная информация:
Идентификатор: CityRazed
Событие: Поселение разрушено до основания
Экспортируются: faction, settlement, region_id, target_faction, target_religion
Класс: ET_SETTLEMENT_RAZED
Подобное скриптовое событие происходит, когда фракция, находящаяся в состоянии орды, после захвата поселения уничтожает поселение до основания и продолжает дальнейшие действие, а поселение, в свою очередь, переходит в состояние бунта и принадлежит ребелам.
Подробная информация:
Идентификатор: CityRazed
Событие: Поселение разрушено до основания
Экспортируются: faction, settlement, region_id, target_faction, target_religion
Класс: ET_SETTLEMENT_RAZED
Каково назначение скриптовой команды destroy_buildings ?
Spoiler (expand)
Команда destroy_buildings осуществляет принудительное разрушениер указанной постройки во всех поселениях конкретной фракции.
Команда destroy_buildings осуществляет принудительное разрушениер указанной постройки во всех поселениях конкретной фракции.
Значение счетчика, задаваемое скриптовыми командами declare_counter, inc_counter, set_counter может принимать любые значения или только такие, которые соответствуют логическим (0 и 1) ?
Spoiler (expand)
Значения скриптового счетчика, обыгрываемые указанными командами, могут быть абсолютно произвольными.
Значения скриптового счетчика, обыгрываемые указанными командами, могут быть абсолютно произвольными.
Чем отличаются друг от друга скриптовые условия SettlementName и I_SettlementExists ?
Spoiler (expand)
SettlementName - проверяет название поселения.
Идентификатор: SettlementName
Требования для триггера: settlement
Параметры: settlement name
Пример использования: SettlementName Tarquinii
Описание: Для скриптинга - имеет ли поселение это имя
Тактический/стратегический режим: И тот, и другой
Класс: SETTLEMENT_NAME
Выполнение: Да
Пример:
I_SettlementExists - проверяет, существует ли вообще поселение с таким названием:
Идентификатор: I_SettlementExists
Требования для триггера:
Параметры: settlement name
Пример использования: I_SettlementExists Segesta
Описание: Существует ли поселение с таким названием?
Тактический/стратегический режим: Стратегический
Класс: SETTLEMENT_EXISTS
Выполнение: Да
Пример:
SettlementName - проверяет название поселения.
Идентификатор: SettlementName
Требования для триггера: settlement
Параметры: settlement name
Пример использования: SettlementName Tarquinii
Описание: Для скриптинга - имеет ли поселение это имя
Тактический/стратегический режим: И тот, и другой
Класс: SETTLEMENT_NAME
Выполнение: Да
Пример:
monitor_event SettlementSelected SettlementName Bari; событие сработает при выделении поселения, если оно носит название Bari
I_SettlementExists - проверяет, существует ли вообще поселение с таким названием:
Идентификатор: I_SettlementExists
Требования для триггера:
Параметры: settlement name
Пример использования: I_SettlementExists Segesta
Описание: Существует ли поселение с таким названием?
Тактический/стратегический режим: Стратегический
Класс: SETTLEMENT_EXISTS
Выполнение: Да
Пример:
monitor_event SettlementSelected I_SettlementExists Bari; событие сработает при выделении поселения Bari, с условием, что оно существует на карте
В descr_strat.txt у каждой фракции существует так называемая "казна правителя", которая задается параметром denari_kings_purse.
Возможно ли изменять этот параметр в процессе игры скриптовым путем ?
Spoiler (expand)
Существует скриптовая команда increment_kings_purse, которая используется следующим образом:
Пример:
Существует скриптовая команда increment_kings_purse, которая используется следующим образом:
increment_kings_purse <faction> <X>
Пример:
monitor_event FactionTurnStart FactionIsLocal and I_TurnNumber = 0 and CampaignDifficulty = hard if not I_IsFactionAIControlled scotland increment_kings_purse scotland 889end_if terminate_monitor end_monitor
Как реализовать смену времен года (лето / зима) на страткарте в зависимости от ходов ?
Spoiler (expand)
Можно прописать в campaign_script.txt типичный скрипт смены времен года:
Можно прописать в campaign_script.txt типичный скрипт смены времен года:
declare_counter quarter; инициализация счетчика quarter
monitor_event PreFactionTurnStart FactionIsLocal; инициализация скриптового события, срабатывающего перед началом хода фракции, управляемой человеком
if I_CompareCounter quarter == 1; открытие оператора if, проверка на соответствие счетчика quarter значению 1
console_command season summer; консольная команда, устанавливающая летнее время года
end_if; закрытие оператора if
if I_CompareCounter quarter == 2; открытие оператора if, проверка на соответствие счетчика quarter значению 2
console_command season winter; консольная команда, устанавливающая зимнее время года
end_if; закрытие оператора if
inc_counter quarter 1; изменение значения счетчика на 1
if I_CompareCounter quarter == 3; открытие оператора if, проверка на соответствие счетчика quarter значению 3
set_counter quarter 1; присвоение счетчику quarter значения 1 (придание цикличности скрипта)
end_if; закрытие оператора if
end_monitor; окончание скриптового события
Каково назначение скриптовых условий FactionIsLocal и I_LocalFaction, чем они отличаются друг от друга ?
Spoiler (expand)
FactionIsLocal - фракцией управляет игрок ;
I_LocalFaction - фракция локальная (просто указывает конкретную фракцию) ;
Приведенные скриптовые условия используются в разных частях монитора, например:
Здесь FactionIsLocal определяет срабатывание скриптового монитора, то есть перед началом хода (PreFactionTurnStart) фракции игрока, а I_LocalFaction является всего лишь одним из условий срабатывания монитора, которое выполняет проверку, является ли есть локальной фракция poland.
Примечание: если в процессе скриптинга возникла задача исполнить проверку условия типа "если фракция находится под управлением игрока", можно воспользоваться следующим синтаксисом:
Все отличие в том, что первая команда появилась в Киндомсе а вторая успешно работала в ванили...
FactionIsLocal - фракцией управляет игрок ;
I_LocalFaction - фракция локальная (просто указывает конкретную фракцию) ;
Приведенные скриптовые условия используются в разных частях монитора, например:
monitor_event PreFactionTurnStart FactionIsLocal
and I_LocalFaction poland
and not I_CharacterExists Gotrek Gurnisson
and I_EventCounter gotrek_capitan = 0
and RandomPercent < 3
historic_event gotrek_recruitment true
terminate_monitor
end_monitor
Здесь FactionIsLocal определяет срабатывание скриптового монитора, то есть перед началом хода (PreFactionTurnStart) фракции игрока, а I_LocalFaction является всего лишь одним из условий срабатывания монитора, которое выполняет проверку, является ли есть локальной фракция poland.
Примечание: если в процессе скриптинга возникла задача исполнить проверку условия типа "если фракция находится под управлением игрока", можно воспользоваться следующим синтаксисом:
and not I_IsFactionAIControlled <целевая фракция>
FactionIsLocal - фракцией управляет игрок;I_LocalFaction - фракция локальная (просто указывает конкретную фракцию);
Все отличие в том, что первая команда появилась в Киндомсе а вторая успешно работала в ванили...
Если прописать конкретное имя персонажа в скриптовом условии, проверяющем его существование ( I_CharacterExists <имя персонажа> ), а затем указать его в файлах names.txt и descr_names.txt, будет ли это имя выдаваться рандомным персонажам, появляющимся у фракции ?
Spoiler (expand)
Увы, генерируемые персонажи все же будут получать указанное имя.
Для реализации подобной затеи можно предпринять следующие действия:
а) сделать уникальный трейт и указать в блоке условий скрипта проверку на его наличие у персонажа ;
б) задать уникальный лейбл в случае если персонаж скриптовый.
Увы, генерируемые персонажи все же будут получать указанное имя.
Для реализации подобной затеи можно предпринять следующие действия:
а) сделать уникальный трейт и указать в блоке условий скрипта проверку на его наличие у персонажа ;
б) задать уникальный лейбл в случае если персонаж скриптовый.
-Добавлено-
Как с помощью скриптовых команд заставить персонажа взять в осаду нужное поселение ? Следует ли в этом случае прописывать движение персонажа в точку расположения поселения ?
Spoiler (expand)
Для того чтобы заставить конкретного персонажа осадить требуемое поселение, надо воспользоваться скриптовой командой:
В данной команде возможно задание двух типов поведения осаждающей армии:
maintain - персонаж с армией берет поселение в осаду,
attack - персонаж с армией берет поселение в осаду и сразу же предпринимает штурм поселения.
Точку расположения поселения на карте при движении персонажа указывать обязательно, либо следует осуществлять спаун персонажа с армией вплотную к целевому поселению.
Перемещение персонажа можно задать с помощью команды move:
В рассматриваемой ситуации координаты <X> и <Y> должны соответствовать точке размещения того поселения, которое планируется взять в осаду.
Для того чтобы заставить конкретного персонажа осадить требуемое поселение, надо воспользоваться скриптовой командой:
siege_settlement <имя персонажа>, <название поселения>, maintain
В данной команде возможно задание двух типов поведения осаждающей армии:
maintain - персонаж с армией берет поселение в осаду,
attack - персонаж с армией берет поселение в осаду и сразу же предпринимает штурм поселения.
Точку расположения поселения на карте при движении персонажа указывать обязательно, либо следует осуществлять спаун персонажа с армией вплотную к целевому поселению.
Перемещение персонажа можно задать с помощью команды move:
move <имя персонажа>, <X>, <Y>
В рассматриваемой ситуации координаты <X> и <Y> должны соответствовать точке размещения того поселения, которое планируется взять в осаду.
Чем отличаются друг от друга скриптовые условия FactionIncome и Treasury ?
Spoiler (expand)
FactionIncome - сравнивает размер дохода фракции ("ожидаемая прибыль", т.е. сколькозолотых фракция получит за ход) с указанной величиной.
Идентификатор: FactionIncome
Требования для триггера: faction
Параметры: logic token, level
Пример использования: FactionIncome >= 2000
Описание: Посмотреть казну фракции
Тактический/стратегический режим: Стратегический
Класс: FACTION_INCOME
Выполнение: Да
Treasury - сравнивает размер казны фракции (уже имеющийся размер золотого запаса фракции) с указанной величиной.
Идентификатор: Treasury
Требования для триггера: faction
Параметры: logic token, quantity
Пример использования: Treasury > 2000
Описание: Превышают ли наличные средства пороговую величину?
Тактический/стратегический режим: Стратегический
Класс: TREASURY
Выполнение: Да
FactionIncome - сравнивает размер дохода фракции ("ожидаемая прибыль", т.е. сколькозолотых фракция получит за ход) с указанной величиной.
Идентификатор: FactionIncome
Требования для триггера: faction
Параметры: logic token, level
Пример использования: FactionIncome >= 2000
Описание: Посмотреть казну фракции
Тактический/стратегический режим: Стратегический
Класс: FACTION_INCOME
Выполнение: Да
Treasury - сравнивает размер казны фракции (уже имеющийся размер золотого запаса фракции) с указанной величиной.
Идентификатор: Treasury
Требования для триггера: faction
Параметры: logic token, quantity
Пример использования: Treasury > 2000
Описание: Превышают ли наличные средства пороговую величину?
Тактический/стратегический режим: Стратегический
Класс: TREASURY
Выполнение: Да
Чем отличаются обычные события, задаваемые в файле descr_events.txt от исторических событий, вводимых в campaign_script.txt скриптовым путем ?
Spoiler (expand)
Обычные события являются статическими, то есть не зависят в процессе игры от выполнения конкретных условий, в чем и состоит их отличие от исторических событий, на появление которых в первую очередь влияют скриптовые условия.
Обычные события являются статическими, то есть не зависят в процессе игры от выполнения конкретных условий, в чем и состоит их отличие от исторических событий, на появление которых в первую очередь влияют скриптовые условия.
Где в текстовых файлах игры редактируются настройки стихийных бедствий ?
Spoiler (expand)
1. Стихийные бедствия изначально можно прописать в файле descr_disasters.txt следующим образом:
2. Также стихийные бедствия можно вызывать скриптовым путем в campaign_script.txt, например:
1. Стихийные бедствия изначально можно прописать в файле descr_disasters.txt следующим образом:
event storm frequency 4 winter true summer false warning false region the sea min_scale 2 max_scale 5
2. Также стихийные бедствия можно вызывать скриптовым путем в campaign_script.txt, например:
add_events event volcano etna date 10 position 100, 50 end_add_events
Как побороть ошибку "is unavailable from event <>when testing <SettlementBuildingExists> condition", выдаваемую system.log.txt ?
Spoiler (expand)
Соответственно указанная логом строка:
Характерная ошибка при создании скриптов, связана с тем, что скриптовая команда / условие не может используется в текущем событии монитора.
Решение проблемы:
1. Применение скриптовой команды, осуществляющей проверку на наличие здания, можно выполнять только при скриптовых событиях типа SettlementTurnStart / SettlementTurnEnd.
2. Если рекомендация №1 не помогает, можно попытаться протестировать работоспособность скриптовой команды через другой оператор условия (не через if, а, к примеру, and).
02:03:28.513 [game.script] [error] Script execution error for <if>, at line 56255, in mods/Call_of_Warhammer/data/world/maps/campaign/imperial_campaign/campaign_script. txt: <settlement> is unavailable from event <>when testing <SettlementBuildingExists> condition
Соответственно указанная логом строка:
SettlementBuildingExist = citadel
Характерная ошибка при создании скриптов, связана с тем, что скриптовая команда / условие не может используется в текущем событии монитора.
Решение проблемы:
1. Применение скриптовой команды, осуществляющей проверку на наличие здания, можно выполнять только при скриптовых событиях типа SettlementTurnStart / SettlementTurnEnd.
2. Если рекомендация №1 не помогает, можно попытаться протестировать работоспособность скриптовой команды через другой оператор условия (не через if, а, к примеру, and).
Как задать при помощи скрипта появление армии (далее "спаун") в определенной точке карты ?
Spoiler (expand)
Спаун армии задается как команда в пределах одного скриптового блока (монитора).
В качестве образца можно рассматривать нижеуказанный пример:
Спаун армии задается как команда в пределах одного скриптового блока (монитора).
В качестве образца можно рассматривать нижеуказанный пример:
spawn_army
faction england character random_name, named character, x 67, y 207, label enggeneral123
traits LoyaltyStarter 1, ReligionStarter 1, Upright 2, GoodCommander 1, PublicFaith 2, elf 1
unit High elf bodyguard exp 9 armour 0 weapon_lvl 0
unit Dragon Princes exp 6 armour 2 weapon_lvl 0
unit Silver Helms exp 5 armour 1 weapon_lvl 1
end
Как с помощью скрипта смоделировать ситуацию, чтобы ИИ в начале игры (на 1 ходу) получал определенную сумму денег, с условием, что фракцией управляет ИИ ?
Spoiler (expand)
Можно почерпнуть идеи для осуществления подобной ситуации из следующих, наиболее характерных, скриптов:
1. Скрипт добавления денег ИИ-фракции при наличии в ее казне отрицательного счета:
2. Скрипт добавления денег ИИ-фракции при срабатывании определенного события:
Краткий комментарий:
monitor_event FactionTurnStart FactionIsLocal - начало скрипта - фракция под управлением игрока
and I_TurnNumber = 10 - проверяем номер хода
historic_event darkhelp true - заданное историческоне событие выполняется
end_monitor - закрываем блок скрипта
monitor_event FactionTurnStart FactionIsLocal - по аналогии с предыдущим монитором
and I_EventCounter darkhelp_accepted = 1 - если условия ивента (название в предыдущем блоке скрипта) приняты
add_money mongols 20000 - получаем 20000 фракции Монголов
end_monitor - конец скрипта
3. Скрипт, регулярно контролирующий добавление денег ИИ-фракции:
Краткий комментарий:
monitor_event FactionTurnStart FactionType hre - начало скрипта - определяет, к чему он будет относится, в данном случаи фракция СРИ.
and IsFactionAIControlled - условие, определяющее принадлежность фракции ИИ (если фракция под управлением ИИ)
and Treasury < -500 - условие, при котором дефицит бюджета составил 500$
add_money hre 8000 - команда, дающая деньги фракции СРИ в случае выполнения предыдуших условий
end_monitor - конец блока скрипта
Можно почерпнуть идеи для осуществления подобной ситуации из следующих, наиболее характерных, скриптов:
1. Скрипт добавления денег ИИ-фракции при наличии в ее казне отрицательного счета:
monitor_event FactionTurnStart
FactionType aztecs and IsFactionAIControlled
and Treasury < -5000
add_money aztecs 10000
end_monitor
monitor_event FactionTurnStart
FactionType aztecs
and I_TurnNumber > 15
and I_NumberOfSettlements aztecs < 2
and IsFactionAIControlled
add_money aztecs 20000
terminate_monitor
end_monitor
2. Скрипт добавления денег ИИ-фракции при срабатывании определенного события:
monitor_event FactionTurnStart FactionIsLocaland I_TurnNumber = 10
historic_event darkhelp true
end_monitor
monitor_event FactionTurnStart FactionIsLocaland I_EventCounter darkhelp_accepted = 1
add_money mongols 20000
end_monitor
Краткий комментарий:
monitor_event FactionTurnStart FactionIsLocal - начало скрипта - фракция под управлением игрока
and I_TurnNumber = 10 - проверяем номер хода
historic_event darkhelp true - заданное историческоне событие выполняется
end_monitor - закрываем блок скрипта
monitor_event FactionTurnStart FactionIsLocal - по аналогии с предыдущим монитором
and I_EventCounter darkhelp_accepted = 1 - если условия ивента (название в предыдущем блоке скрипта) приняты
add_money mongols 20000 - получаем 20000 фракции Монголов
end_monitor - конец скрипта
3. Скрипт, регулярно контролирующий добавление денег ИИ-фракции:
monitor_event FactionTurnStart
FactionType hre and IsFactionAIControlled
and Treasury < -500
add_money hre 8000
end_monitor
Краткий комментарий:
monitor_event FactionTurnStart FactionType hre - начало скрипта - определяет, к чему он будет относится, в данном случаи фракция СРИ.
and IsFactionAIControlled - условие, определяющее принадлежность фракции ИИ (если фракция под управлением ИИ)
and Treasury < -500 - условие, при котором дефицит бюджета составил 500$
add_money hre 8000 - команда, дающая деньги фракции СРИ в случае выполнения предыдуших условий
end_monitor - конец блока скрипта
Какие действия можно предпринимать с счетчиками при создании скриптов в игре ?
Spoiler (expand)
Существует 3 типа счетчиков:
declare_counter - задаёт счетчик и присваивает ему значение 0;
set_counter - присваивает определённое значение счетчику;
inc_counter - увеличивает счетчик на определённое число;
Примеры использования счетчиков:
При составлении скриптов можно пользоваться существующими условиями, позволяющими сравнивать / проверять значение счетчика, например:
Как правило, применительно к этим условиям применяются соответствующие операторы условий - if - end_if, либо and.
В качестве образца использования таких условий можно привести в пример следующий скрипт:
Иначе говоря, скриптовые условия счетчиков позволяют проверить, что произойдет при том или ином значении конкретного счетчика (например какое-нибудь событие), например:
Существует 3 типа счетчиков:
declare_counter - задаёт счетчик и присваивает ему значение 0;
set_counter - присваивает определённое значение счетчику;
inc_counter - увеличивает счетчик на определённое число;
Примеры использования счетчиков:
declare_counter test
monitor_event FactionTurnStart FactionIsLocal and I_LocalFaction russia
set_counter test 5
terminate_monitor
end_monitor
monitor_event FactionTurnStart FactionIsLocal and I_LocalFaction england
inc_counter test 1
terminate_monitor
end_monitor
При составлении скриптов можно пользоваться существующими условиями, позволяющими сравнивать / проверять значение счетчика, например:
if I_CompareCounter test > 1
and I_CompareCounter test 5
Как правило, применительно к этим условиям применяются соответствующие операторы условий - if - end_if, либо and.
В качестве образца использования таких условий можно привести в пример следующий скрипт:
monitor_event FactionTurnStart FactionIsLocal if I_CompareCounter test > 1end_if terminate_monitorend_monitormonitor_event FactionTurnStart FactionIsLocaland I_CompareCounter test 5 terminate_monitorend_monitor
Иначе говоря, скриптовые условия счетчиков позволяют проверить, что произойдет при том или ином значении конкретного счетчика (например какое-нибудь событие), например:
monitor_event FactionTurnStart FactionIsLocal and I_CompareCounter test 5
historic_event AMERICA_DISCOVERED
terminate_monitor
end_monitor
Как написать скрипт "несколько ходов за год" и как в этом случае будут стареть персонажи ?
Spoiler (expand)
Можно воспользоваться следующим скриптом:
Соответственно для каждого хода требуется прописать подобные блоки, приведенные в примере.
Краткие комментарии:
Оператор, устанавливающий дату.
Оператор, устанавливающий необходимый сезон (summer или winter).
Условие, проверяющее требование типа "пока длится конкретный ход". И соответственно оператор, закрывающий блок данного условия.
Команда, при наличии которой могут появляться случайные советы (то есть те, которые обычно показывает советник, например постройки зданий и т. д.).
Остальное выполняется аналогично.
Можно воспользоваться следующим скриптом:
... console_command date 1598 console_command season summer while I_TurnNumber = 1 suspend_unscripted_advice true end_while console_command date 1598 console_command season winter while I_TurnNumber = 2 suspend_unscripted_advice true end_while console_command date 1598 console_command season winter while I_TurnNumber = 3 suspend_unscripted_advice true end_while console_command date 1599 console_command season summer while I_TurnNumber = 4 suspend_unscripted_advice true end_while console_command date 1599 console_command season summer while I_TurnNumber = 5 suspend_unscripted_advice true end_while ...
Соответственно для каждого хода требуется прописать подобные блоки, приведенные в примере.
Краткие комментарии:
console_command date 1598
Оператор, устанавливающий дату.
console_command season winter
Оператор, устанавливающий необходимый сезон (summer или winter).
while I_TurnNumber = 3.. end_while
Условие, проверяющее требование типа "пока длится конкретный ход". И соответственно оператор, закрывающий блок данного условия.
suspend_unscripted_advice true
Команда, при наличии которой могут появляться случайные советы (то есть те, которые обычно показывает советник, например постройки зданий и т. д.).
Остальное выполняется аналогично.
Для чего предназначена команда date в нижеприведенных строках задания ивента ?
Spoiler (expand)
Команда date указывает интервал игрового времени (ходы), на протяжении которого данное событие должно появиться в игре.
event historic large_city_barracksdate 7 8
Команда date указывает интервал игрового времени (ходы), на протяжении которого данное событие должно появиться в игре.
Как связываются ивент и инфокартинка, где в директории мода лежат инфокартинки событий ?
Spoiler (expand)
Чтобы инфокартинка соответствовала определенному ивенту, необходимо переименовать название графического файла в идентификатор этого ивента.
Инфокартинки для ивентов располагаются в каталоге: data / ui / <название культуры> / eventpics.
Чтобы инфокартинка соответствовала определенному ивенту, необходимо переименовать название графического файла в идентификатор этого ивента.
Инфокартинки для ивентов располагаются в каталоге: data / ui / <название культуры> / eventpics.
В каких текстовых файлах регулируются настройки контратаки (вылазки) компьютера из осаждаемого поселения ?
Spoiler (expand)
Поведение ИИ во время осады редактируется в файле config_ai_battle.xml.
Поведение ИИ во время осады редактируется в файле config_ai_battle.xml.
В каком файле M2TWK прописываются квестовые задания ?
Spoiler (expand)
Квестовые задания и всевозможные миссии, которые мы видим в процессе стратегической кампании, прописываются в файле descr_missions.txt (папка data).
Квестовые задания и всевозможные миссии, которые мы видим в процессе стратегической кампании, прописываются в файле descr_missions.txt (папка data).
Как сделать в M2TW реформу изменения нанимаемых фракцией юнитов ?
Spoiler (expand)
Это обычная реформа Мария, представляет собой запрограммированную реформу.
Алгоритм создания реформы:
1. Создаем любое здание, например:
Чтобы здание не появилось в окне строительства, необходимо указать следующие строки, например:
2. Работаем со скриптами, что размещаются в файле campaign_script.txt.
Например, необходимо, чтобы реформа происходила на 46 ходу в определенных городах :
Теперь в вышеназванных городах появились здания и стало возможно осуществление реформы.
3. Возвращаемся к файлу export_desc_buildings.txt, прописываемнайм юнитов в постройках, затронутых данной реформой. Здесь необходимо предпринять следующие действия:
1) Прописываем необходимых юнитов для найма прямо в созданном здании.
2) Используем какое-либо другое здание с необходимыми юнитами и используем условие and building_present_min_level reform army, например:
3) Прописываем эту команду необходимому юниту, а тем юнитов, что должны удаляться после реформы, прописать соответственно противоположное условие
and not building_present_min_level reform army.
Это обычная реформа Мария, представляет собой запрограммированную реформу.
Алгоритм создания реформы:
1. Создаем любое здание, например:
reformlevels army…
Чтобы здание не появилось в окне строительства, необходимо указать следующие строки, например:
construction 1 cost 10
2. Работаем со скриптами, что размещаются в файле campaign_script.txt.
Например, необходимо, чтобы реформа происходила на 46 ходу в определенных городах :
monitor_event FactionTurnStart FactionIsLocaland I_TurnNumber = 46 create_building Paris army create_building Rome army create_building Kiev army create_building Kaen army create_building Bordeaux army terminate_monitor end_monitor
Теперь в вышеназванных городах появились здания и стало возможно осуществление реформы.
3. Возвращаемся к файлу export_desc_buildings.txt, прописываемнайм юнитов в постройках, затронутых данной реформой. Здесь необходимо предпринять следующие действия:
1) Прописываем необходимых юнитов для найма прямо в созданном здании.
2) Используем какое-либо другое здание с необходимыми юнитами и используем условие and building_present_min_level reform army, например:
blacksmith requires factions { barbarian, carthaginian, eastern, hun, nomad, roman, } and building_present_min_level reform army3) Прописываем эту команду необходимому юниту, а тем юнитов, что должны удаляться после реформы, прописать соответственно противоположное условие
and not building_present_min_level reform army.
Известно, что можно поменять боевую модель (battle_model) лидера фракции. Можно ли скриптом или чем-нибудь другим поменять страт-модели у ребелов ?
Spoiler (expand)
Можно воспользоваться ванильным скриптом из M2TW, который выглядит следующим образом:
Можно воспользоваться ванильным скриптом из M2TW, который выглядит следующим образом:
monitor_event BecomesFactionLeader FactionType spain change_battle_model spain leader Spanish_Viceroy end_monitor
В каких текстовиках находится триггер, отвечающий за марианскую реформу ?
Spoiler (expand)
Процесс активации реформы Мария на движке BI можно cделать :
В файле descr_strat.txt удаляем строку
После этого смотрим, есть ли в файле export_descr_buildings.txt ресурс italy - он обязательно должен быть - иначе игра вылетит.
Соответственно он должен быть прописан в файле descr_regions.txt в одной из провинций в качестве скрытого ресурса. Далее реформа Мария становится активированной.
ЗЫ Примечание: вопрос имеет отношение к кодингу RTW - BI.
Процесс активации реформы Мария на движке BI можно cделать :
В файле descr_strat.txt удаляем строку
marian_reforms_disabled
После этого смотрим, есть ли в файле export_descr_buildings.txt ресурс italy - он обязательно должен быть - иначе игра вылетит.
Соответственно он должен быть прописан в файле descr_regions.txt в одной из провинций в качестве скрытого ресурса. Далее реформа Мария становится активированной.
ЗЫ Примечание: вопрос имеет отношение к кодингу RTW - BI.
Для чего предназначена и как используется скриптовая команда send_character_off_map ?
Spoiler (expand)
Команда send_character_off_map перемещает персонажа за пределы стратегической карты. Если указанный персонаж включен в генеалогическое древо фракции (иными словами, член семьи), то при срабатывании этого действия он не будет значится умершим в родословной правителя.
Подробная информация:
Идентификатор: send_character_off_map
Параметры: character_name
Описание: Перемещает персонажа за пределы карты кампании, но оставляет его в фамильном древе.
Пример использования: send_character_off_map Edward
Класс: SEND_CHARACTER_OFF_MAP
Яркий пример реализации этой команды - скрипт Гэндальфа из В-мод (сабмод к TATW) :
В этом скрипте данный персонаж Gandalf на протяжении указанных игровых отрезков времени осуществляет переход от одной фракции к другой, оставаясь при этом "живым".
Алгоритм скрипта построен следующим образом: сначала персонаж, размещенный на старте у фракции turks, перемещается за пределы карты на 39 ходу кампании, после чего на следующем (40) ходу спаунится у фракции milan. Далее действуют циклические конструкции скрипта: на 59 ходу персонаж Gandalf фракции milan устраняется за пределы карты, на следующем (60) ходу появляется у фракции mongols, на 79 ходу так же покидает державу, на 80 ходу спаунится у фракции scotland, на 99 ходу перемещается за пределы карты, и лишь на 100 ходу возвращается к первоначальной фракции turks.
При этом герой остается живым в генеалогическом древе каждой вышеупомянутой фракции, хотя на самом деле скрипт работает с 5 персонажами - стартовым (turks) и искусственно созданными (соответственно у milan, mongols, scotland, turks). То есть на протяжении 100 ходов игры за пределами карты появятся 4 персонажа с одинаковым именем.
Однако, в игре подобное создаст эффект того, что персонаж сначала помогает одной державе, затем спешит на помощь ко второй, третьей, четвертой и т.д..
Команда send_character_off_map перемещает персонажа за пределы стратегической карты. Если указанный персонаж включен в генеалогическое древо фракции (иными словами, член семьи), то при срабатывании этого действия он не будет значится умершим в родословной правителя.
Подробная информация:
Идентификатор: send_character_off_map
Параметры: character_name
Описание: Перемещает персонажа за пределы карты кампании, но оставляет его в фамильном древе.
Пример использования: send_character_off_map Edward
Класс: SEND_CHARACTER_OFF_MAP
Яркий пример реализации этой команды - скрипт Гэндальфа из В-мод (сабмод к TATW) :
monitor_event FactionTurnStart
FactionType turks and I_TurnNumber = 39
and I_LocalFaction turks
send_character_off_map Gandal
historic_event gandalf1
terminate_monitor
end_monitor
monitor_event FactionTurnStart FactionType milan
and I_TurnNumber = 40
and I_LocalFaction milan
spawn_army
faction milan
character Gandalf, named character, age 22, x 175, y 162, battle_model gandalf, portrait Gandalf, hero_ability Wizard_blast, label grey2 traits Gandalf 1 , LoyaltyStarter 1 , GoodCommander 2 , ReligionStarter 1 , GoodAttacker 1 , Loyal 1 , Just 1 , StrategyChivalry 1
unit Ranger Sentries1 exp 3 armour 1 weapon_lvl 0
end
historic_event gandalf
terminate_monitor
end_monitor
monitor_event FactionTurnStart FactionType milan
and I_TurnNumber = 59 and I_LocalFaction milan
send_character_off_map Gandalf
historic_event gandalf1
terminate_monitor
end_monitor
monitor_event FactionTurnStart FactionType mongols
and I_TurnNumber = 60
and I_LocalFaction mongols
spawn_army
faction mongols
character Gandalf, named character, age 22, x 215, y 211, battle_model gandalf, portrait Gandalf, hero_ability Wizard_blast, label grey3 traits Gandalf 1 , LoyaltyStarter 1 , GoodCommander 2 , ReligionStarter 1 , GoodAttacker 1 , Loyal 1 , Just 1 , StrategyChivalry 1
unit Ranger Sentries1 exp 3 armour 1 weapon_lvl 0
end
historic_event gandalf
terminate_monitor
end_monitor
monitor_event FactionTurnStart FactionType mongols
and I_TurnNumber = 79 and I_LocalFaction mongols
send_character_off_map Gandalf
historic_event gandalf1
terminate_monitor
end_monitor
monitor_event FactionTurnStart
FactionType scotland
and I_TurnNumber = 80
and I_LocalFaction scotland
spawn_army
faction scotland
character Gandalf, named character, age 22, x 302, y 239, battle_model gandalf, portrait Gandalf, hero_ability Wizard_blast, label grey4 traits Gandalf 1 , LoyaltyStarter 1 , GoodCommander 2 , ReligionStarter 1 , GoodAttacker 1 , Loyal 1 , Just 1 , StrategyChivalry 1
unit Ranger Sentries1 exp 3 armour 1 weapon_lvl 0
end
historic_event gandalf
terminate_monitor
end_monitor
monitor_event FactionTurnStart
FactionType scotland and I_TurnNumber = 99
and I_LocalFaction scotland
send_character_off_map Gandalf
historic_event gandalf1
terminate_monitor
end_monitor
monitor_event FactionTurnStart
FactionType turks
and I_TurnNumber = 100
and I_LocalFaction turks
spawn_army
faction turks
character Gandalf, named character, age 22, x 224, y 250, battle_model gandalf, portrait Gandalf, hero_ability Wizard_blast traits Gandalf 1 , LoyaltyStarter 1 , GoodCommander 2 , ReligionStarter 1 , GoodAttacker 1 , Loyal 1 , Just 1 , StrategyChivalry 1
unit Ranger Sentries1 exp 3 armour 1 weapon_lvl 0
end
historic_event gandalf
terminate_monitor
end_monitor
В этом скрипте данный персонаж Gandalf на протяжении указанных игровых отрезков времени осуществляет переход от одной фракции к другой, оставаясь при этом "живым".
Алгоритм скрипта построен следующим образом: сначала персонаж, размещенный на старте у фракции turks, перемещается за пределы карты на 39 ходу кампании, после чего на следующем (40) ходу спаунится у фракции milan. Далее действуют циклические конструкции скрипта: на 59 ходу персонаж Gandalf фракции milan устраняется за пределы карты, на следующем (60) ходу появляется у фракции mongols, на 79 ходу так же покидает державу, на 80 ходу спаунится у фракции scotland, на 99 ходу перемещается за пределы карты, и лишь на 100 ходу возвращается к первоначальной фракции turks.
При этом герой остается живым в генеалогическом древе каждой вышеупомянутой фракции, хотя на самом деле скрипт работает с 5 персонажами - стартовым (turks) и искусственно созданными (соответственно у milan, mongols, scotland, turks). То есть на протяжении 100 ходов игры за пределами карты появятся 4 персонажа с одинаковым именем.
Однако, в игре подобное создаст эффект того, что персонаж сначала помогает одной державе, затем спешит на помощь ко второй, третьей, четвертой и т.д..
-Добавлено-
Можно ли смоделировать такое, чтобы на протяжении игры команды передвижения использовались не для конкретных персонажей, а для типов персонажей, например лидер фракции или атакованный персонаж ?
Spoiler (expand)
1. Для задания принудительного передвижения персонажей на страткарте используется следующие скриптовые команды:
а) move
б) reposition_character
2. Прежде всего, эти команды требуют указания конкретных целевых координат [ x ; y ], которые соответствовали бы точке назначения на карте.
Для того, чтобы осуществить суть вопроса, можно попробовать задать метку (прозвище) - label. Если, к примеру, вместо имени указать именно label, то в случае спауна армии, произойдет спаун свободного генерала, несмотря на имя. В качестве примера можно привести характерный случай использования метки в скриптах:
1. Для задания принудительного передвижения персонажей на страткарте используется следующие скриптовые команды:
а) move
б) reposition_character
2. Прежде всего, эти команды требуют указания конкретных целевых координат [ x ; y ], которые соответствовали бы точке назначения на карте.
Для того, чтобы осуществить суть вопроса, можно попробовать задать метку (прозвище) - label. Если, к примеру, вместо имени указать именно label, то в случае спауна армии, произойдет спаун свободного генерала, несмотря на имя. В качестве примера можно привести характерный случай использования метки в скриптах:
spawn_army faction venicecharacter random_name, named character, x [/spoiler], y [/spoiler], label vengen3traits LoyaltyStarter 1 , NaturalMilitarySkill 3 , GoodAttacker 1 , Energetic 1 , ReligionStarter 1 unit SE Bodyguard exp 9 armour 0 weapon_lvl 0unit Italian Spear Militia exp 9 armour 0 weapon_lvl 0unit Italian Spear Militia exp 9 armour 0 weapon_lvl 0unit Peasant Archers exp 9 armour 0 weapon_lvl 0endif I_CharacterExists vengen1console_command give_trait vengen1 scriptreposition_character vengen1, [/spoiler], [/spoiler]
Как реализовать с помощью скрипта ситуацию - если фракция потерпела поражение, то через некоторое время эта фракция возрождается ?
Spoiler (expand)
Пример подобного скрипта можно посмотреть в M2TWK - Americas.
Для осуществления подобной ситуации следует учитывать, что фракция должна быть кочевнической (ордой).
Можно в качестве примера (как вариант реализации) рассмотреть устройство следующего скрипта:
Пример подобного скрипта можно посмотреть в M2TWK - Americas.
Для осуществления подобной ситуации следует учитывать, что фракция должна быть кочевнической (ордой).
Можно в качестве примера (как вариант реализации) рассмотреть устройство следующего скрипта:
declare_counter ozhivlenie_england 0; задаём переменную, которая которая будет проверять, есть ли ещё города у Англии. monitor_event FactionTurnEnd FactionIsLocaland I_NumberOfSettlements england < 1; проверяем, если у Англии городов меньше 1. and I_CompareCounter ozhivlenie_england = 0; и если переменная Возрождение Англии ещё не активирована, and RandomPercent > 1; шанс на возрождение фракции на этом ходу 10%, сделано для того, каждый ход не появлялось по новому стеку войска and RandomPercent < 11set_counter ozhivlenie_england 1end_monitormonitor_event FactionTurnEnd FactionIsLocal and I_CompareCounter ozhivlenie_england > 0add_events; если переменная возрождения Англии активна, то создается событие "Англия возвращается" event emergent_faction england; region London_Region date 0 end_add_events spawn_army; создать армию Англии со случайным командирам по каким-либо координатам, со следующим составом войск... faction england character random_name, named character, age 19, x 22, y 51, family; появляется случайный генерал, в возрасте 19 лет, по координатам [ x; y ]; чтобы узнать координаты, надо во время нахождения в кампании навести курсор в нужную точку и ввести в консоли команду show_cursorstat unit NE Bodyguard exp 2 armour 0 weapon_lvl 0 unit Dismounted Feudal Knights exp 1 armour 0 weapon_lvl 0 unit Dismounted Feudal Knights exp 1 armour 0 weapon_lvl 0 unit Longbowmen exp 1 armour 0 weapon_lvl 0 unit Longbowmen exp 0 armour 0 weapon_lvl 0 end end_monitor(Или можно спаунить флот с десантом и генералом по нужным координатам, т.е. чтобы армия появилась не на суше, а в море на кораблях)monitor_event FactionTurnStart FactionIsLocal; проверяем в начале хода, если англичане захватили хоть один город, тогда событие "возрождение Англии" отключить. and I_CompareCounter ozhivlenieireland > 0 set_counter ozhivlenie_england 0 end_monitorЕдинственная слабость этого скрипта - пока Англия не захватит хоть один город стеки будут появляться сплошным потоком, с шансом 10%. И без проверки возможен вылет, если в точке возрождения будет торчать любой другой отряд.
Как создать скрипт с принятием / отклонением действий (например, если "ДА", то действие игры меняется полностью, а если "НЕТ", то остаётся неизменным) ?
Spoiler (expand)
В качестве примера можно рассмотреть устройство элементарного скрипта:
Далее открываем каталог data / text, находим файл historic_events.txt и добавляем в него сообщение ивента:
После этого сохраняем файл и обязательно удаляем historic_events.txt.strings.bin.
В качестве примера можно рассмотреть устройство элементарного скрипта:
declare_counter tur; создаем переменную turset_counter tur 0; присваиваем переменной tur значение 0monitor_event FactionTurnStart FactionType france; монитор события фракция Франция and I_TurnNumber > 0; любой ход начиная с первого... and FactionIsLocal france; если игрок франция and I_NumberOfSettlements france > 5; если у Франции больше 5 пров and I_CompareCounter tur = 0; и значение переменной tur = 0 historic_event gall_money true; срабатывает историческое событие gall_money end_monitor; закрываем мониторmonitor_conditions I_EventCounter gall_money_accepted = 1; новый монитор определяет ответ "ДА" if I_CompareCounter tur = 0; если переменная tur = 0 то console_command add_money -15000; Франция теряет 15000$ set_counter tur 1; присваиваем новое значение переменной tur = 1, для того чтобы скрипт не повторялся в дальнейшем (или перед end_monitor используем команду terminate_monitor - как альтернативный вариант) end_if; закрываем блок еслиend_monitor; закрываем монитор
Далее открываем каталог data / text, находим файл historic_events.txt и добавляем в него сообщение ивента:
{GALL_MONEY_TITLE}Название{GALL_MONEY_BODY}ОписаниеПосле этого сохраняем файл и обязательно удаляем historic_events.txt.strings.bin.
Как с помощью скрипта осуществить движение персонажей и их дальнейшую битву при перемещении стратегической камеры ?
Spoiler (expand)
Для создания подобного скрипта полезно руководствоваться следующими рекомендациями:
1. Задаем историческое событие (например, historic_event venecia) и указываем его в скрипте.
2. Перемещение камеры можно реализовать при помощи команд move strat_camera x, y или snap_strat_camera x, y.
3. Используем счетчик, в частности следующие команды:
declare_counter bbb - задание счетчика, с первоначальным значением, равным 0.
set_counter bbb 0 - установка значения 0 применительно к данному счетчику.
set_counter bbb 1 - установка значения 1 применительно к данному счетчику.
В зависимости от того, какое значение принимает в текущий момент вышеуказанная переменная, будет появляться историческое событие и вообще любые прочие действия нашего скрипта.
4. Для задержки времени (с целью сэкономить время для чтения игроком истории) можно воспользоваться командой wait, например:
5. Далее задается спаун армий, движение персонажей осуществляется при помощи команд move или reposition_character, а команда engage_armies заставит их впоследствии вступить в сражение. Стоит отметить, что для задания армий можно применять метку (лэйбл), имя которой может быть произвольным (за исключением повторяющегося имени или совпадения с именем персонажа).
В качестве наиболее яркого примера реализации скриптового сражения можно привести пример скрипт из мода Call of Warhammer :
Для создания подобного скрипта полезно руководствоваться следующими рекомендациями:
1. Задаем историческое событие (например, historic_event venecia) и указываем его в скрипте.
2. Перемещение камеры можно реализовать при помощи команд move strat_camera x, y или snap_strat_camera x, y.
3. Используем счетчик, в частности следующие команды:
declare_counter bbb - задание счетчика, с первоначальным значением, равным 0.
set_counter bbb 0 - установка значения 0 применительно к данному счетчику.
set_counter bbb 1 - установка значения 1 применительно к данному счетчику.
В зависимости от того, какое значение принимает в текущий момент вышеуказанная переменная, будет появляться историческое событие и вообще любые прочие действия нашего скрипта.
4. Для задержки времени (с целью сэкономить время для чтения игроком истории) можно воспользоваться командой wait, например:
wait 5
5. Далее задается спаун армий, движение персонажей осуществляется при помощи команд move или reposition_character, а команда engage_armies заставит их впоследствии вступить в сражение. Стоит отметить, что для задания армий можно применять метку (лэйбл), имя которой может быть произвольным (за исключением повторяющегося имени или совпадения с именем персонажа).
В качестве наиболее яркого примера реализации скриптового сражения можно привести пример скрипт из мода Call of Warhammer :
;Averheimdeclare_counter orcset_counter orc 0monitor_event FactionTurnEnd FactionIsLocaland I_TurnNumber = 2and I_IsFactionAIControlled turksand not I_IsFactionAIControlled venice spawn_army faction turks character random_name, named character, x 353, y 125, label orcgeneral1;command 8, dread 9, loyalty 7, piety 1 traits LoyaltyStarter 1, ReligionStarter 1, Upright 2, GoodCommander 1, PublicFaith 2, orc 1 unit Orcz bodyguard exp 4 armour 0 weapon_lvl 0 unit siege middle tower orks exp 4 armour 0 weapon_lvl 0 unit siege middle tower orks exp 4 armour 0 weapon_lvl 0 unit Savage Orcs arrer exp 4 armour 0 weapon_lvl 0 unit Savage Orcs arrer exp 4 armour 0 weapon_lvl 0 unit tortoise ram orks exp 4 armour 0 weapon_lvl 0 unit Black Orcs exp 4 armour 0 weapon_lvl 0 unit Black Orcs exp 4 armour 0 weapon_lvl 0 unit Orcz spear boyz exp 4 armour 0 weapon_lvl 0 unit Orcz spear boyz exp 4 armour 0 weapon_lvl 0 unit Orcz spear boyz exp 4 armour 0 weapon_lvl 0 unit Goblinz spearz exp 4 armour 0 weapon_lvl 0 unit Goblinz spearz exp 4 armour 0 weapon_lvl 0 unit Goblinz spearz exp 4 armour 0 weapon_lvl 0 unit Goblinz spearz exp 4 armour 0 weapon_lvl 0 unit Goblinz spearz exp 4 armour 0 weapon_lvl 0 unit Goblinz spearz exp 4 armour 0 weapon_lvl 0 end spawn_army faction turks character random_name, named character, x 358, y 122, label orcgeneral2;command 8, dread 9, loyalty 7, piety 1 traits LoyaltyStarter 1, Upright 2, GoodCommander 1, PublicFaith 2, orc 1 unit Orcz bodyguard exp 1 armour 0 weapon_lvl 0unit Orcs boar boyz exp 4 armour 0 weapon_lvl 0unit Orcs boar boyz exp 4 armour 0 weapon_lvl 0unit Orcs boar boyz exp 4 armour 0 weapon_lvl 0unit Savage Orcs boar boyz exp 4 armour 0 weapon_lvl 0unit Orcz boyz exp 4 armour 0 weapon_lvl 0unit tortoise ram orks exp 4 armour 0 weapon_lvl 0unit Orcz boyz exp 4 armour 0 weapon_lvl 0unit Orcz boyz exp 4 armour 0 weapon_lvl 0unit Orcz spear boyz exp 4 armour 0 weapon_lvl 0unit Savage Orcs boyz exp 4 armour 0 weapon_lvl 0unit Savage Orcs boyz exp 4 armour 0 weapon_lvl 0unit Big`un Orcz boyz exp 4 armour 0 weapon_lvl 0unit Black orcs destroyer exp 4 armour 0 weapon_lvl 0unit Black Orcs exp 4 armour 0 weapon_lvl 0unit Orcz Arrerz exp 4 armour 0 weapon_lvl 0unit Orcz Arrerz exp 4 armour 0 weapon_lvl 0unit Savage Orcs arrer exp 4 armour 0 weapon_lvl 0unit siege middle tower orks exp 4 armour 0 weapon_lvl 0unit siege middle tower orks exp 4 armour 0 weapon_lvl 0 end if I_CharacterExists orcgeneral1 console_command give_trait orcgeneral1 script reposition_character orcgeneral1, 352, 125 reveal_tile 352, 125 character_flash_start orcgeneral1 end_if if I_CharacterExists orcgeneral2 console_command give_trait orcgeneral2 script reposition_character orcgeneral2, 352, 127 reveal_tile 352, 127 character_flash_start orcgeneral2 point_at_character orcgeneral2 end_if campaign_wait 5 snap_strat_camera 359, 131 campaign_wait 10 if I_CharacterExists orcgeneral1 character_flash_stop orcgeneral1 end_if if I_CharacterExists orcgeneral2character_flash_stop orcgeneral2end_ifhide_all_revealed_tiles historic_event ikta terminate_monitor end_monitormonitor_event FactionTurnEnd FactionIsLocaland I_TurnNumber = 3and I_IsFactionAIControlled turksand not I_IsFactionAIControlled veniceif I_CharacterExists orcgeneral1 reposition_character orcgeneral1, 355, 138 character_flash_start orcgeneral1 reveal_tile 352, 138 end_if if I_CharacterExists orcgeneral2 reposition_character orcgeneral2, 355, 135 character_flash_start orcgeneral2 point_at_character orcgeneral2 reveal_tile 355, 135 end_if campaign_wait 10 snap_strat_camera 355, 135 campaign_wait 10 if I_CharacterExists orcgeneral1 character_flash_stop orcgeneral1 end_if if I_CharacterExists orcgeneral2character_flash_stop orcgeneral2end_ifhide_all_revealed_tiles historic_event ndaterminate_monitorend_monitor monitor_event FactionTurnEnd FactionIsLocaland I_TurnNumber = 4and I_IsFactionAIControlled turksand not I_IsFactionAIControlled veniceif I_CharacterExists orcgeneral1 console_command remove_trait orcgeneral1 script reposition_character orcgeneral1, 372, 140 character_flash_start orcgeneral1 end_if if I_CharacterExists orcgeneral2 console_command remove_trait orcgeneral2 script reposition_character orcgeneral2, 373, 139 character_flash_start orcgeneral2 point_at_settlement Averheim end_if campaign_wait 5 snap_strat_camera 373, 139 if I_CharacterExists orcgeneral1 character_flash_stop orcgeneral1 end_if if I_CharacterExists orcgeneral2character_flash_stop orcgeneral2end_ifset_counter orc 1terminate_monitorend_monitormonitor_event FactionTurnStart FactionType turks and I_CompareCounter orc = 1 and not I_SettlementOwner Averheim = turks if I_CharacterExists orcgeneral1 and not I_SettlementOwner Averheim = turks siege_settlement orcgeneral1, Averheim, maintain wait 3 end_if if I_CharacterExists orcgeneral2 and not I_SettlementOwner Averheim = turks siege_settlement orcgeneral2, Averheim, attack end_if terminate_monitor end_monitor
В чем отличие задания скриптовых команд спауна армии на территории провинции и в поселении данной провинции ?
Spoiler (expand)
1. Скриптовый спаун армии на территории провинции (пример) :
Очевидно, что:
- для спаунищейся армии можно указать тип и конкретные характеристики персонажа (полководца или генерала);
- каждый отдельный юнит требуется прописывать отдельной строкой.
2. Скриптовый спаун армии в поселении (пример) :
Очевидно, что:
- требуется указание поселение, в которое производится спаун гарнизона;
- число юнитов можно указывать конкретной цифрой, а не несколькими строками, для каждого отдельного типа юнита.
1. Скриптовый спаун армии на территории провинции (пример) :
spawn_army faction sicily character random_name, named character, age 18, x 256, y 127, label letifgondor traits GoodCommander 1 , ReligionStarter 1 , PoliticsSkill 1 , Loyal 2 unit Gondor Bodyguard exp 3 armour 1 weapon_lvl 0 unit Kingsguard exp 3 armour 0 weapon_lvl 0 unit Gondor Spearmen exp 2 armour 0 weapon_lvl 0 unit Gondor Spearmen exp 1 armour 0 weapon_lvl 0 end
Очевидно, что:
- для спаунищейся армии можно указать тип и конкретные характеристики персонажа (полководца или генерала);
- каждый отдельный юнит требуется прописывать отдельной строкой.
2. Скриптовый спаун армии в поселении (пример) :
create_unit Osgiliath-East, Kingsguard, num 1, exp 0, arm 0, wep 0
Очевидно, что:
- требуется указание поселение, в которое производится спаун гарнизона;
- число юнитов можно указывать конкретной цифрой, а не несколькими строками, для каждого отдельного типа юнита.
Как реализовать событие смены эпох в моде ?
Spoiler (expand)
Эпоха создаётся скриптовой командой:
Обычно эпоха, как условие, применяется в export_descr_buildings.txt для изменения рекрутинга - как правило, при смене эпохи, можно задействовать и соответствующее изменение типов нанимаемых в здании юнитов, что нередко применяется в большинстве различных модов.
Пример использования события смены эпохи в export_descr_buildings.txt :
В целом суть применения реформы такова: существует несколько ваниантов использования новой эры, к примеру, для открытия строительства новой постройки, либо найма войск, причем их можно как комбинировать, так и прописывать по одиночке, например:
Однако, у применения реформы к постройке есть и недостатки: очень сложно реализовать использование новой эры к постройке какой-либо одной фракции, т.к. реформа делает строение доступным сходу для всех фракций, прописанных в постройке, тем более, если постройка уже возведена, то ее иконку нет возможности поменять нет возможности или повесить для этого маркер. Аналогично обстоит дело и с юнитами: эра открывает юнит для всех фракций, прописанных в его условии (конечно, можно прописать одну фракцию, но от этого ты ничего в ровном счете не изменится, ибо нужно будет открывать новый юнит, который будет иметь пометку; проблема заключается в том, что юниты, имевшиеся в наличии (без пометки) так останутся в гарнизоне поселения, их не получится переподготовить в юнит с пометкой, и в конечном счете возникнет путаница в отличии юнитов с пометкой и без нее, т.е. при открытии нового юнита, у которого будет эта пометка, для уже навербованных юнитов эту пометку сделать не получится - аналогичная ситуация и с уже имеющимися постройками в поселении).
Эпоха создаётся скриптовой командой:
set_event_counter <name> 1
Обычно эпоха, как условие, применяется в export_descr_buildings.txt для изменения рекрутинга - как правило, при смене эпохи, можно задействовать и соответствующее изменение типов нанимаемых в здании юнитов, что нередко применяется в большинстве различных модов.
Пример использования события смены эпохи в export_descr_buildings.txt :
В целом суть применения реформы такова: существует несколько ваниантов использования новой эры, к примеру, для открытия строительства новой постройки, либо найма войск, причем их можно как комбинировать, так и прописывать по одиночке, например:
kings_stables city requires factions { venice, papal_states, } and event_counter marian 1;(данная постройка станет доступна к найму только при открытии эры "Мария") { convert_to 3 capability { stage_races 2 requires factions { venice, papal_states, }recruit_pool "praetorian_cavalry" 1 0.25 2 0 requires factions { venice, } and event_counter marian 1;(преторианская кавалерия станет доступна к найму только при открытии эры "Мария") } material wooden construction 6 cost 9600 settlement_min huge_city upgrades { } } }Однако, у применения реформы к постройке есть и недостатки: очень сложно реализовать использование новой эры к постройке какой-либо одной фракции, т.к. реформа делает строение доступным сходу для всех фракций, прописанных в постройке, тем более, если постройка уже возведена, то ее иконку нет возможности поменять нет возможности или повесить для этого маркер. Аналогично обстоит дело и с юнитами: эра открывает юнит для всех фракций, прописанных в его условии (конечно, можно прописать одну фракцию, но от этого ты ничего в ровном счете не изменится, ибо нужно будет открывать новый юнит, который будет иметь пометку; проблема заключается в том, что юниты, имевшиеся в наличии (без пометки) так останутся в гарнизоне поселения, их не получится переподготовить в юнит с пометкой, и в конечном счете возникнет путаница в отличии юнитов с пометкой и без нее, т.е. при открытии нового юнита, у которого будет эта пометка, для уже навербованных юнитов эту пометку сделать не получится - аналогичная ситуация и с уже имеющимися постройками в поселении).
Как смоделировать при помощи скрипта ситуацию, чтобы фракция не погибала при потере всех членов семьи ?
Spoiler (expand)
Подобную ситуацию можно реализовать при помощи следующего типичного скрипта:
Подробно изучим его устройство:
monitor_event FactionTurnStart FactionType sicily
Старт скриптового события для фракции типа sicily на начале нового хода.
and not FactionIsLocal
Условие, требующее наличие данной фракции под контролем ИИ.
and I_TurnNumber = 1
Условие, проверяющее номер хода в текущей кампании (в данном скрипте должно соблюдаться выполнение условия на 1-ом ходу тестируемой кампании).
spawn_army
faction sicily
character random_name, named character, age 20, x 209, y 105, family, label heir1
traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2
unit Kingsguard exp 6 armour 0 weapon_lvl 0
end
Команда создания персонажа с юнитами для текущей фракции sicily, искусственно вводится для создания нового персонажа для фракции.
end_monitor
Завершение первого скриптового события.
monitor_event FactionTurnStart FactionIsLocal
Старт последующего скриптового события для фракции, управляемой игроком, на начале нового хода.
and I_TurnNumber = 2
Аналогичное условие, что и в первом мониторе, но уже требующее выполнение действий на 2-ом ходу текущей кампании.
send_character_off_map heir1
Данная команда уничтожает случайного персонажа с меткой heir1 (создаваемого в первом событии командой спауна) на страткарте, но оставляет его в фамильном древе.
Именно таким образом при гибели всех действующих членов семьи в процессе игры "погибшая" фракция исскуственным способом остается "живой" благодаря сохранению генеалогического древа.
end_monitor
Аналогичное закрытие монитора, как и в первом событии.
Примечание: подобный скрипт используется в сабмоде Fate of Middle-Earth (The Third Age : Total War):
Подобную ситуацию можно реализовать при помощи следующего типичного скрипта:
monitor_event FactionTurnStart FactionType sicilyand not FactionIsLocaland I_TurnNumber = 1 spawn_armyfaction sicilycharacter random_name, named character, age 20, x 209, y 105, family, label heir1traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2unit Kingsguard exp 6 armour 0 weapon_lvl 0endend_monitormonitor_event FactionTurnStart FactionIsLocaland I_TurnNumber = 2send_character_off_map heir1end_monitor
Подробно изучим его устройство:
monitor_event FactionTurnStart FactionType sicily
Старт скриптового события для фракции типа sicily на начале нового хода.
and not FactionIsLocal
Условие, требующее наличие данной фракции под контролем ИИ.
and I_TurnNumber = 1
Условие, проверяющее номер хода в текущей кампании (в данном скрипте должно соблюдаться выполнение условия на 1-ом ходу тестируемой кампании).
spawn_army
faction sicily
character random_name, named character, age 20, x 209, y 105, family, label heir1
traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2
unit Kingsguard exp 6 armour 0 weapon_lvl 0
end
Команда создания персонажа с юнитами для текущей фракции sicily, искусственно вводится для создания нового персонажа для фракции.
end_monitor
Завершение первого скриптового события.
monitor_event FactionTurnStart FactionIsLocal
Старт последующего скриптового события для фракции, управляемой игроком, на начале нового хода.
and I_TurnNumber = 2
Аналогичное условие, что и в первом мониторе, но уже требующее выполнение действий на 2-ом ходу текущей кампании.
send_character_off_map heir1
Данная команда уничтожает случайного персонажа с меткой heir1 (создаваемого в первом событии командой спауна) на страткарте, но оставляет его в фамильном древе.
Именно таким образом при гибели всех действующих членов семьи в процессе игры "погибшая" фракция исскуственным способом остается "живой" благодаря сохранению генеалогического древа.
end_monitor
Аналогичное закрытие монитора, как и в первом событии.
Примечание: подобный скрипт используется в сабмоде Fate of Middle-Earth (The Third Age : Total War):
monitor_event FactionTurnStart FactionType sicilyand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction sicily character random_name, named character, age 20, x 209, y 105, family, label heir1 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Kingsguard exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType veniceand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction venice character random_name, named character, age 20, x 340, y 235, family, label heir2 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Kataphracts Bodyguard exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType milanand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction milan character random_name, named character, age 20, x 149, y 188, family, label heir3 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit rohan bodyguards exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType egyptand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction egypt character random_name, named character, age 20, x 180, y 237, family, label heir4 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Elf Nobel Mount exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType scotlandand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction scotland character random_name, named character, age 20, x 333, y 236, family, label heir5 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Bardian Archers exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType mongolsand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction mongols character random_name, named character, age 20, x 251, y 233, family, label heir6 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Elf Bodyguard exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType turksand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction turks character random_name, named character, age 20, x 126, y 281, family, label heir7 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Mounted Dunedain BG exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType franceand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction france character random_name, named character, age 20, x 158, y 178, family, label heir8 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Uruk-Hai Bodyguards exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType hreand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction hre character random_name, named character, age 20, x 218, y 303, family, label heir9 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Uruk-Hai Bodyguards exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType englandand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction england character random_name, named character, age 20, x 296, y 131, family, label heir10 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Uruk Bodyguards exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType portugaland not FactionIsLocaland I_TurnNumber = 1 spawn_army faction portugal character random_name, named character, age 20, x 199, y 297, family, label heir11 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Heavy Orcs exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType byzantiumand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction byzantium character random_name, named character, age 20, x 106, y 244, family, label heir12 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Arnor Bodyguard exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType moorsand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction moors character random_name, named character, age 20, x 303, y 269, family, label heir13 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Noble Bodyguards exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType spainand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction spain character random_name, named character, age 20, x 226, y 70, family, label heir14 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Serpent Bodyguard exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType saxonsand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction saxons character random_name, named character, age 20, x 207, y 212, family, label heir15 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Elf Guard_BG exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionType dunlandand not FactionIsLocaland I_TurnNumber = 1 spawn_army faction dunland character random_name, named character, age 20, x 143, y 188, family, label heir16 traits LoyaltyStarter 1 , GoodCommander 1 , ReligionStarter 1 , Loyal 2 unit Chieftain exp 6 armour 0 weapon_lvl 0 endend_monitormonitor_event FactionTurnStart FactionIsLocaland I_TurnNumber = 2send_character_off_map heir1send_character_off_map heir2send_character_off_map heir3send_character_off_map heir4send_character_off_map heir5send_character_off_map heir6send_character_off_map heir7send_character_off_map heir8send_character_off_map heir9send_character_off_map heir10send_character_off_map heir11send_character_off_map heir12send_character_off_map heir13send_character_off_map heir14send_character_off_map heir15send_character_off_map heir16end_monitor
Возможно ли написать скрипт, который бы управлял перемещением командира на стратегической карте, без участия в этом игрока (по принципу пролога в RTW) ?
Spoiler (expand)
Реализация подобного скрипта вполне возможна, очень похожий образец существует в моде ОиМ.
Рассмотрим основные моменты, полезные для составления необходимого нам скрипта:
- Задание срабатывания скрипта на конкретном ходу
- Задание условия, проверяющего местонахождение персонажа рядом с назначенными координатами
- Задание отключения курсора, консоли и т.д.
- Задание перемещения стратегической камеры
- Настройки подсветки
- Задание включения курсора / интерфейса
- Задание отключения советов
- Задания запуска исторического события
- Задание счетчика времени
- Задание передвижения персонажа и отображения его пути
- Задание другого исторического события
- Задание спауна (появления) персонажа (в данном скрипте - полководец с отрядами) и его передвижения с отображением пути
- Дальнейшее задание проверки счетчика времени
ui_indicator_remove 0
- Дальнейшее задание передвижения персонажа с подсветкой пути
- Включение ранее отключенного интерфейса игры
- Задание скриптового сражения между персонажами
Примечание: в данном скрипте целесообразноосуществлять запуск исторических событий в качестве запланированных советов.
Для этого нужно редактировать следующие файлы:
1. export_descr_advice.txt
Здесь уточним самые основные моменты:
- Название совета:
- Упоминание файла из папки text, первая строка - ссылка на заголовок, вторая - на текстовое описание совета:
Стоит отметить, что стандартный совет имеет еще и триггер, однако в рассматриваемой ситуации имеет место запланированный совет, поэтому можно обойтись и без триггера.
2. export_descr_advice_enums.txt
В этом файле приводятся ссылки на локализацию текстовых описаний вышеуказанных советов:
3. export_advice.txt (каталог data / text)
В этом файле размещается локализация текстовых описаний игровых советов:
Теперь поговорим о способах запуска запланированного совета.
Для запуска созданного нами совета используем команду advance_advice_thread Season_Year_Turn15_Thread в сочетании с условием хода, которую необходимо внедрить в скриптовый монитор после прописи всех команд.
Либо можно использовать альтернативный вариант годового скрипта следующей конструкции:
Реализация подобного скрипта вполне возможна, очень похожий образец существует в моде ОиМ.
Рассмотрим основные моменты, полезные для составления необходимого нам скрипта:
- Задание срабатывания скрипта на конкретном ходу
console_command date 1608console_command season summer
- Задание условия, проверяющего местонахождение персонажа рядом с назначенными координатами
and I_CharacterTypeNearTile sassanids named_character, 131, 21
- Задание отключения курсора, консоли и т.д.
disable_cursor disable_shortcuts trueinhibit_camera_input truedisable_shortcuts advisor_portrait_button falsesuspend_unscripted_advice truefilter_all_ui_commands off
- Задание перемещения стратегической камеры
move_strat_camera 96, 138zoom_strat_camera 0.3wait 2
- Настройки подсветки
ui_indicator 0 circle 585 505 colour 0 0 255 scale 0.7 ui_indicator 1 arrow_up_left 110 727 colour 255 0 0 scale 0.3
- Задание включения курсора / интерфейса
enable_cursordisable_entire_uidisable_shortcuts options_button false
- Задание отключения советов
disable_shortcuts advisor_dismiss_button falsedisable_shortcuts dismiss_advice falsedisable_shortcuts advisor_portrait_button false
- Задания запуска исторического события
dismiss_advicewhile I_AdvisorVisibleend_whileadvance_advice_thread Carth_General_Intro_1_Thread
- Задание счетчика времени
restart_timer Campaign_Map_Timerwhile I_AdvisorVisible monitor_conditions I_TimerElapsed Campaign_Map_Timer > 30000ui_indicator_remove 1ui_flash_start advisor_dismiss_button terminate_monitorend_monitorend_while
- Задание передвижения персонажа и отображения его пути
ui_flash_stopui_indicator_remove 0ui_indicator_remove 1disable_cursormove OiM-Mikhail OiM-Pozharskij, 95, 138enable_cursorwhile I_AdvisorVisibleend_while
- Задание другого исторического события
dismiss_advicewhile I_AdvisorVisibleend_whileadvance_advice_thread Carth_Mission_1_Intro_Threadsuspend_unscripted_advice true
- Задание спауна (появления) персонажа (в данном скрипте - полководец с отрядами) и его передвижения с отображением пути
spawn_armyfaction empire_eastcharacter Oim-Pavel-vkl OiM-Zolkiewski, named character, command 5, influence 5, management 1, subterfuge 1, age 36, , x 92, y 138unit rp general exp 2 armour 1 weapon_lvl 1unit rp winged hussar late exp 1 armour 0 weapon_lvl 0unit rp pushka exp 1 armour 0 weapon_lvl 0 0endconsole_command give_trait "Oim-Pavel-vkl OiM-Zolkiewski" GoodCommander 3move Oim-Pavel-vkl OiM-Zolkiewski, 94, 138ui_indicator 0 circle 420 225 colour 0 0 255 scale .7; Isto
- Дальнейшее задание проверки счетчика времени
restart_timer Campaign_Map_Timer; Dismiss to continue. If not dismissed after 10 seconds, show hint.while I_AdvisorVisiblemonitor_conditions I_TimerElapsed Campaign_Map_Timer > 10000 счетчикui_flash_start advisor_dismiss_buttonterminate_monitorend_monitorend_while
ui_indicator_remove 0
- Дальнейшее задание передвижения персонажа с подсветкой пути
point_at_strat_position 96, 138character_flash_start Oim-Pavel-vkl OiM-Zolkiewskiconsole_command mp "OiM-Mikhail OiM-Pozharskij" 55 move OiM-Mikhail OiM-Pozharskij, 96, 138character_flash_stop Oim-Pavel-vkl OiM-Zolkiewskiui_flash_stop
- Включение ранее отключенного интерфейса игры
enable_entire_uidisable_shortcuts false inhibit_camera_input falsefilter_all_ui_commands on
- Задание скриптового сражения между персонажами
if I_CharacterTypeNearTile sassanids named_character, 1 131,21 engage_armies Oim-Pavel-vkl OiM-Zolkiewski, OiM-Mikhail OiM-Pozharskij битваend_if
Примечание: в данном скрипте целесообразноосуществлять запуск исторических событий в качестве запланированных советов.
Для этого нужно редактировать следующие файлы:
1. export_descr_advice.txt
AdviceThread Season_Year_Turn15_ThreadGameArea CampaignItem Season_Year_Turn15_Text_01UninhibitableVerbosity 0 Threshold 1MaxRepeats 0 RepeatInterval 1 Attitude NormalPresentation DefaultTitle Season_Year_Turn15_Text_01_TitleText Season_Year_Turn15_Text_01_Text1
Здесь уточним самые основные моменты:
- Название совета:
AdviceThread Season_Year_Turn15_Thread
- Упоминание файла из папки text, первая строка - ссылка на заголовок, вторая - на текстовое описание совета:
Title Season_Year_Turn15_Text_01_TitleText Season_Year_Turn15_Text_01_Text1
Стоит отметить, что стандартный совет имеет еще и триггер, однако в рассматриваемой ситуации имеет место запланированный совет, поэтому можно обойтись и без триггера.
2. export_descr_advice_enums.txt
В этом файле приводятся ссылки на локализацию текстовых описаний вышеуказанных советов:
Season_Year_Turn15_Text_01_TitleSeason_Year_Turn15_Text_01_Text1
3. export_advice.txt (каталог data / text)
В этом файле размещается локализация текстовых описаний игровых советов:
{Season_Year_Turn15_Text_01_Title} Восстание Болотникова собственно говоря, сам текст совета и заголовок{Season_Year_Turn15_Text_01_Text1}Беглый холоп князя Трубецкого Иван Блотников поднял восстание в 1606 году. Дон этого он был взят в плен татарами, продан в Турцию и был гребцом на турецкой галаре. В одном из сражений с венецианцами Болотникова спасли, и он через Германию и Польшу попал в Россию. Есть сведения, что по пути мятежник встречался с Молчановым, выдающим себя за чедом спасшегося царя Дмитрия, т. е. с будующим тушенским вором. На Руси обстановка в то время была нескопойная. После свержения боярами Леджмитрия I на престол вошел Василий Шуйский, не пользовавшейся в стране большой популярностью. В южных уездах собралось много недовольных. От правительства отложился князь Трубецкой, засевший в Путивле. В это время Болотников провозгласил себя "воеводой царя Дмитрия" и поднял восстание против боярского царя.Теперь поговорим о способах запуска запланированного совета.
Для запуска созданного нами совета используем команду advance_advice_thread Season_Year_Turn15_Thread в сочетании с условием хода, которую необходимо внедрить в скриптовый монитор после прописи всех команд.
Либо можно использовать альтернативный вариант годового скрипта следующей конструкции:
console_command date 1598console_command season winterdeclare_counter Season_Year_Turn0_Threadwhile I_TurnNumber = 0 monitor_conditions I_CompareCounter Season_Year_Turn0_Thread = 0if I_CompareCounter Season_Year_Turn0_Thread = 0advance_advice_thread Season_Year_Turn15_Threadinc_counter Season_Year_Turn0_Thread 1wait 1select_ui_element advisor_portrait_buttonsimulate_mouse_click lclick_downsimulate_mouse_click lclick_upend_ifend_monitorsuspend_unscripted_advice trueend_while
-Добавлено-
Можно ли с помощью скрипта проверить наличие между фракциями торгового соглашения ?
Spoiler (expand)
В пределах скрипта в campaign_script.txt проверка существования торгового соглашения между державами осуществляется с помощью создания скриптового события (монитора) типа FactionTradeAgreementMade :
Идентификатор: FactionTradeAgreementMade
Событие: Между фракцией и указанной фракцией (target_faction) заключено торговое соглашение
Экспортируются: faction, target_faction, target_religion
Класс: ET_FACTION_TRADE_AGREEMENT_MADE
Пример использования скрипта с подобным типом события (реализация в моде Natus ob Imperium):
В пределах скрипта в campaign_script.txt проверка существования торгового соглашения между державами осуществляется с помощью создания скриптового события (монитора) типа FactionTradeAgreementMade :
Идентификатор: FactionTradeAgreementMade
Событие: Между фракцией и указанной фракцией (target_faction) заключено торговое соглашение
Экспортируются: faction, target_faction, target_religion
Класс: ET_FACTION_TRADE_AGREEMENT_MADE
Пример использования скрипта с подобным типом события (реализация в моде Natus ob Imperium):
; наличие торгового договора между фракциями.declare_counter trade_romaset_counter trade_roma 0declare_counter trade_roma_aiset_counter trade_roma_ai 0monitor_event FactionTradeAgreementMade FactionType papal_states; игрок предлагает ИИ-фракции торговый договор (ИИ-фракция разрывает торговое соглашение с игроком) and TargetFactionType venice if I_CompareCounter trade_roma = 0; игрок заключил торговый договор c ИИ-фракцией Сената and not I_CompareCounter trade_roma_ai >= 1 set_counter trade_roma 1 end_if if I_CompareCounter trade_roma = 2; ИИ-фракция разрывает торговое соглашение, если оно было заключено со стороны игрока set_counter trade_roma 0 end_if if I_CompareCounter trade_roma_ai >= 1; ИИ-фракция разрывает торговый договор set_counter trade_roma_ai 0 end_ifend_monitormonitor_event FactionTradeAgreementMade venice; игрок разрывает торговый договор с ИИ-фракцией (ИИ заключает торговое соглашение с игроком) and TargetFactionType papal_states if I_CompareCounter trade_roma >= 1; игрок разрывает торговый договор с ИИ-фракцией set_counter trade_roma 0 end_if if I_CompareCounter trade_roma_ai = 2; игрок разрывает торговое соглашение с ИИ-фракцией, если оно заключено со стороны ИИ-фракции set_counter trade_roma_ai 0 end_if if I_CompareCounter trade_roma_ai = 0; ИИ-фракция заключает торговый договор and not I_CompareCounter trade_roma >= 1 set_counter trade_roma_ai 1 end_ifend_monitor
Как сделать из скрипта с условием "принять / отклонить" (скрипт "Сигнальные огни") скрипт с условием "принято" ( просто происходит событие, которое нельзя отклонить) ?
Spoiler (expand)
Для того чтобы отключить возможность выбора "принять / отклонить" в момент появления события, необходимо в строке
заменить логическое значение true на false следующим образом :
Значение false означает, что сообщение о событии появится только у тех фракций, которых указаны в фигурных скобках (в рассматриваемом примере уведомление о событии help придет только к фракции milan).
Также помимо вышеуказанного следует исключить переменные help_accepted и help_declined и мониторы, связанные с их использованием.
monitor_event FactionTurnStart FactionIsLocal and I_CompareCounter go_beacon = 1 and I_SettlementUnderSiege Anorien and I_SettlementOwner Anorien = sicily and DiplomaticStanceFromFaction milan = Allied and I_CompareCounter go_anorien = 0 add_events event counter help_accepted event counter help_declined end_add_events historic_event help true factions { milan, } event/beacon.bik reveal_tile 239, 128 move_strat_camera 239, 128 zoom_strat_camera 0.5end_monitor;[/spoiler][/spoiler][/spoiler][/spoiler]
[/spoiler]-- accept [/spoiler][/spoiler][/spoiler][/spoiler][/spoiler]
[/spoiler][/spoiler][/spoiler][/spoiler][/spoiler]
[/spoiler][/spoiler]declare_counter go_anorienmonitor_conditions I_EventCounter help_accepted = 1 spawn_army faction milan character Theoden, named character, age 33, x 243, y 128, portrait Theoden, battle_model theoden traits Theoden 1 , LoyaltyStarter 1 , GoodCommander 2 , ReligionStarter 1 , GoodCavalryGeneral 1 , Loyal 1 , Just 1 unit eorlingas Mercs exp 3 armour 1 weapon_lvl 0 unit rohan rider Mercs exp 2 armour 0 weapon_lvl 0 unit rohan rider Mercs exp 2 armour 0 weapon_lvl 0 unit rohan rider Mercs exp 2 armour 0 weapon_lvl 0 unit rohan rider Mercs exp 2 armour 0 weapon_lvl 0 unit rohan rider Mercs exp 2 armour 0 weapon_lvl 0 unit rohan rider Mercs exp 2 armour 0 weapon_lvl 0 unit rohirrim Mercs exp 2 armour 0 weapon_lvl 0 unit rohirrim Mercs exp 2 armour 0 weapon_lvl 0 unit rohirrim Mercs exp 2 armour 0 weapon_lvl 0 end historic_event help_accepted factions { milan, } event/accept.bik set_faction_standing sicily milan 1.0 add_money milan -5000 set_event_counter help_accepted 0 set_counter go_anorien 1end_monitor;[/spoiler][/spoiler][/spoiler][/spoiler]
[/spoiler][/spoiler] reject [/spoiler][/spoiler][/spoiler][/spoiler][/spoiler]
[/spoiler][/spoiler][/spoiler][/spoiler][/spoiler]
[/spoiler][/spoiler]monitor_conditions I_EventCounter help_declined = 1 historic_event help_declined factions { milan, } event/refuse.bik set_faction_standing sicily milan -0.3 set_event_counter help_declined 0end_monitor ;[/spoiler][/spoiler][/spoiler][/spoiler][/spoiler]
[/spoiler] A.I. post-battle minas tirith [/spoiler][/spoiler][/spoiler][/spoiler]-monitor_event PostBattle FactionType milan and I_WonBattle milan and IsRegionOneOf 93 and I_CompareCounter go_anorien = 1 historic_event won_ally event/won.bik add_money milan 2500 destroy_units milan rohan rider Mercs destroy_units milan rohirrim Mercs destroy_units milan eorlingas Mercs set_counter go_anorien 0 end_monitor;[/spoiler][/spoiler][/spoiler][/spoiler]
[/spoiler][/spoiler] timer [/spoiler][/spoiler][/spoiler][/spoiler][/spoiler]
[/spoiler][/spoiler][/spoiler][/spoiler][/spoiler]
[/spoiler][/spoiler]declare_counter help1_time_limitmonitor_event FactionTurnStart FactionType sicily and I_CompareCounter go_anorien = 1 inc_counter help1_time_limit 1end_monitormonitor_event FactionTurnStart FactionType sicily and I_CompareCounter go_anorien = 1 and I_CompareCounter help1_time_limit >= 2 destroy_units milan rohan rider Mercs destroy_units milan rohirrim Mercs destroy_units milan eorlingas Mercs set_counter go_anorien 0 historic_event lose_ally event/refuse.bikend_monitorДля того чтобы отключить возможность выбора "принять / отклонить" в момент появления события, необходимо в строке
historic_event help true factions { milan, } event/beacon.bikзаменить логическое значение true на false следующим образом :
historic_event help false factions { milan, } event/beacon.bikЗначение false означает, что сообщение о событии появится только у тех фракций, которых указаны в фигурных скобках (в рассматриваемом примере уведомление о событии help придет только к фракции milan).
Также помимо вышеуказанного следует исключить переменные help_accepted и help_declined и мониторы, связанные с их использованием.
Каково назначение скриптовой команды add_settlement_turmoil ?
Spoiler (expand)
add_settlement_turmoil - добавляет волнения в указанный город.
Пример:
Не забудьте сделать то же самое для множества камер FPS.
Теперь нам нужно назначить отображение для нашего ключа, так чтобы движок знал, в какой части игры наш ярлык будет использоваться.
Идем в секцию KEY MAPPINGS и в подразделе strat , добавим ярлыки. Это то, что я сделал:
Затем удалите preferences\keys.dat, в противном случае m2tw не будет разбирать наши descr_shortcuts.txt!
Если вы хотите добавить описание ярлыков, вы можете сделать это в shortcut.strings.bin. Это описание будет отображаться в меню F1, а также в главном меню опций.
Теперь campaign_script. Сейчас мы можем определить когда сработает наш ярлык
"newShortcut" был назначен на F5, так что теперь всякий раз, когда нажата F5 и игра на страткарте, событие срабатывает.
Практическое применение
Это, конечно, будет бесполезно, если мы не можем делать интересные вещи с ним!
Например, мы можем позволить нашим генералам "покупать" определенные анчи.
Или, мы можем создать "депопуляцию" для города. Мы можем убить половину населения города в то время как завоевываем, но мы не можем сделать это когда уже правим городом.
To view the link Register
add_settlement_turmoil - добавляет волнения в указанный город.
Пример:
strat [color="#FF0000"]newShortcut F5[/color] save_stratmap S CTRL load_stratmap L CTRL speedup_ai SPACE stop_character BACKSPACE capital_zoom HOME H burdel F4 display_standards J toggle_character_labels N CTRL toggle_settlement_labels T CTRL diplomacy_overview_button D finances_button F construction_button B recruitment_button R faction_button O automerge_units M mission_button C zoom_in NUM_ADD repeating zoom_out NUM_SUBTRACT repeating reset_rally_point DEL disband D CTRL show_multi_turn_paths EQUALS select_next_selected CLOSE_BRACKET select_prev_selected OPEN_BRACKET end
Не забудьте сделать то же самое для множества камер FPS.
Теперь нам нужно назначить отображение для нашего ключа, так чтобы движок знал, в какой части игры наш ярлык будет использоваться.
Идем в секцию KEY MAPPINGS и в подразделе strat , добавим ярлыки. Это то, что я сделал:
strat [color="#FF0000"]newShortcut strat_ui[/color] save_stratmap strat_ui load_stratmap strat_ui speedup_ai strat_ui stop_character strat_ui capital_zoom strat_ui display_standards strat_ui toggle_character_labels strat_ui toggle_settlement_labels strat_ui quit strat_ui diplomacy_overview_button strat_ui finances_button strat_ui zoom_in strat_ui zoom_out strat_ui reset_rally_point strat_ui mission_button strat_ui disband card_manager show_multi_turn_paths strat_ui inc_scale radar dec_scale radar construction_button recruitment_button faction_button automerge_units campaign_hud step_l camera step_r camera step_fwd camera step_bck camera rot_l camera rot_r camera select_next_selected hud_select_next_item_cycle select_prev_selected hud_select_prev_item_cycle end
Затем удалите preferences\keys.dat, в противном случае m2tw не будет разбирать наши descr_shortcuts.txt!
Если вы хотите добавить описание ярлыков, вы можете сделать это в shortcut.strings.bin. Это описание будет отображаться в меню F1, а также в главном меню опций.
Теперь campaign_script. Сейчас мы можем определить когда сработает наш ярлык
monitor_event ShortcutTriggered ShortcutTriggered strat_ui newShortcutend_monitor
"newShortcut" был назначен на F5, так что теперь всякий раз, когда нажата F5 и игра на страткарте, событие срабатывает.
Практическое применение
Это, конечно, будет бесполезно, если мы не можем делать интересные вещи с ним!
Например, мы можем позволить нашим генералам "покупать" определенные анчи.
monitor_event ShortcutTriggered ShortcutTriggered strat_ui newShortcutand I_AgentSelected named character historic_event buying_ancillary trueend_monitormonitor_conditions I_EventCounter buying_ancillary_accepted = 1and console_command give_ancillary this <someanc> set_event_counter buying_ancillary_accepted = 0end_monitor
Или, мы можем создать "депопуляцию" для города. Мы можем убить половину населения города в то время как завоевываем, но мы не можем сделать это когда уже правим городом.
monitor_event ShortcutTriggered ShortcutTriggered strat_ui newShortcutand I_ScrollOpen own_settlement_info_scroll historic_event kill_citizens trueend_monitormonitor_conditions I_EventCounter kill_citizens_accepted = 1 if I_SettlementSelected <settlementname> console_command add_population <settlementname> -500 end_if if I_SettlementSelected <othersettlementname> console_command add_population <othersettlementname> -500 end_if ... set_event_counter kill_citizens_accepted = 0end_monitor
To view the link Register
Как совершить убийство персонажей скриптовым способом ?
Spoiler (expand)
Скрипты позволяют нам убивать отдельных персонажей с помощью команды kill_character [имя персонажа]. Если убитый таким образом персонаж является членом семьи, то он будет отмечен как «мирно скончавшийся" в генеалогическом дереве.
Это можем сделать чтобы характер смерти был различный, путем добавления доп. идентификаторов в скриптовую команду, которые перечислены ниже, например, kill_character DET_BATTLE [имя персонажа]. Это приведет к ивенту "пал смертью храбрых", и в родословной будет подписан как "героически погибший". К сожалению, это единственный вид смерти, который получает автоматическое сообщение, остальным придется использовать метод "historic_event".
Ниже находится список вариантов смерти с игровым сообщением и текстом, используемым для записи в родословной (см. фото ниже).
[code=campaign_s:0]campaign_script text\event_title text\strat скриптовая команда сообщение в игре запись в ген.древе DET_BATTLE {character_dies_heroic} {SMT_DIED_BATTLE}DET_STARVATION None {SMT_DIED_TRAGIC}DET_PLAGUE None {SMT_DIED_PLAGUE}DET_POISONED None {SMT_DIED_ASSASSINATED}DET_EXECUTED_PRISONER None {SMT_EXECUTED_PRISONER}DET_EXECUTED None {SMT_EXECUTED}DET_ASSASSINATED None {SMT_DIED_ASSASSINATED}DET_DISASTER None {SMT_DIED_TRAGIC}DET_NATURAL None {SMT_DIED}[/code]
Запись в семейном древе после использования DET_ASSASSINATED
Пример использования скрипта:
[code=monitor_ev:0]monitor_event FactionTurnStart FactionIsLocal if I_TurnNumber = 0 I_CharacterExists [character_label] kill_character DET_ASSASSINATED [character_label] historic_event [assassination event] end_if end_monitor[/code]
Скрипты позволяют нам убивать отдельных персонажей с помощью команды kill_character [имя персонажа]. Если убитый таким образом персонаж является членом семьи, то он будет отмечен как «мирно скончавшийся" в генеалогическом дереве.
Это можем сделать чтобы характер смерти был различный, путем добавления доп. идентификаторов в скриптовую команду, которые перечислены ниже, например, kill_character DET_BATTLE [имя персонажа]. Это приведет к ивенту "пал смертью храбрых", и в родословной будет подписан как "героически погибший". К сожалению, это единственный вид смерти, который получает автоматическое сообщение, остальным придется использовать метод "historic_event".
Ниже находится список вариантов смерти с игровым сообщением и текстом, используемым для записи в родословной (см. фото ниже).
[code=campaign_s:0]campaign_script text\event_title text\strat скриптовая команда сообщение в игре запись в ген.древе DET_BATTLE {character_dies_heroic} {SMT_DIED_BATTLE}DET_STARVATION None {SMT_DIED_TRAGIC}DET_PLAGUE None {SMT_DIED_PLAGUE}DET_POISONED None {SMT_DIED_ASSASSINATED}DET_EXECUTED_PRISONER None {SMT_EXECUTED_PRISONER}DET_EXECUTED None {SMT_EXECUTED}DET_ASSASSINATED None {SMT_DIED_ASSASSINATED}DET_DISASTER None {SMT_DIED_TRAGIC}DET_NATURAL None {SMT_DIED}[/code]
Запись в семейном древе после использования DET_ASSASSINATED
Пример использования скрипта:
[code=monitor_ev:0]monitor_event FactionTurnStart FactionIsLocal if I_TurnNumber = 0 I_CharacterExists [character_label] kill_character DET_ASSASSINATED [character_label] historic_event [assassination event] end_if end_monitor[/code]
Создание событий "Да" и "Нет"
Как создать событие Да\Нет ?
Spoiler (expand)
Для примера создадим скрипт, спрашивающий: желаете принятьденьги? При ответе «ДА» добавляется 5000 на ваш счет, при ответе «Нет» -вычитается.
Откройте файл campaign_script.txt в data/world/maps/campaign/imperial_campaign/
Ниже приведен основной скрипт
Убедитесь, что переименовали все counter, имеющие что-то_counter x_y_rejected одним и тем же именем.
Чтобы запустить появление сообщения с вопросом откройте historic_events.txtрасположенный в паке data/text
И измените все «historic_events что-тотам»
В нашем примере
Для примера создадим скрипт, спрашивающий: желаете принятьденьги? При ответе «ДА» добавляется 5000 на ваш счет, при ответе «Нет» -вычитается.
Откройте файл campaign_script.txt в data/world/maps/campaign/imperial_campaign/
Ниже приведен основной скрипт
;Money Extra Yes/No declare_counter extra_money_offered terminate_monitor
Убедитесь, что переименовали все counter, имеющие что-то_counter x_y_rejected одним и тем же именем.
Чтобы запустить появление сообщения с вопросом откройте historic_events.txtрасположенный в паке data/text
И измените все «historic_events что-тотам»
В нашем примере
{EXTRA_MONEY_BODY} My Lord, we've been asked if weshall accept blood money, press "Accept" to get the money, press"Decline" to refuse the offer
{EXTRA_MONEY_TITLE} Accept Blood Money?
{EXTRA_MONEY_ACCEPTED_BODY} My Lord, we haveaccepted the money offer, the 5000k denaries have been increased in your royaltreasury
{EXTRA_MONEYACCEPTED_TITLE} Money Accepted
{EXTRA_MONEY_DECLINED_BODY} My Lord, we haverefused the money offer, our royal treasury is now shorter by 5000k denaries
{EXTRA_MONEY_DECLINED_TITLE} Money Refused
Как добавить историческое событие?
Spoiler (expand)
- Распакуйте фалы
- Используйте .txt.strings.bin Converter для конвертирования data/text файлов в txt, или .txt.strings.bin Reader/Editor
- создайте, если необходимо резервную копию файлов
Редактируемые файлы:
- historic_events.txt/.txt.strings.bin
- descr_events
Добавление события
Откройте historic_events.txt/.txt.strings.bin . Формат будет выглядеть как-то так:
После последней записи можно вставить свое событие в том жеформате
Как сделать, чтобсобытие появлялось во время игры
Откройте descr_events. Увидите примерноследующее
Добавляете событие в том же формате
Название (в этом примере "test_event") должно быть таким же, как добавленное ранее.
Можно изменить дату появления, так - 2 означает, что событие произойдет на 2 ходу или 1082 (в ваниле). Не ставьте 0 или 1, так как они не отобразятся
Добавление картинки события
Откройте папку data/ui
В southern_european/eventspic скопируйтелюбую картинку. Дайте ему название события("test_event").
Всегда можно изменить картинку позже на желаемую – это только место для нее.
Автор: selenius4tsd
- Распакуйте фалы
- Используйте .txt.strings.bin Converter для конвертирования data/text файлов в txt, или .txt.strings.bin Reader/Editor
- создайте, если необходимо резервную копию файлов
Редактируемые файлы:
- historic_events.txt/.txt.strings.bin
- descr_events
Добавление события
Откройте historic_events.txt/.txt.strings.bin . Формат будет выглядеть как-то так:
{WORLD_IS_ROUND_BODY}Overthe centuries several scholars have suggested that the world could be round,but most of them were burned at the stake as heretics, so the theory hasn'tbeen particularly popular. However, with new advances in the fields ofAstronomy, enough of the learned men of the world have accepted that the theoryis well worth testing... Perhaps if someone were to establish a trade route tothe far east by sailing west, they would both bring the debate to a close, aswell as establish a trade lane that is most lucrative.
{WORLD_IS_ROUND_TITLE}TheWorld is Round
После последней записи можно вставить свое событие в том жеформате
{TEST_EVENT_BODY}Текст, появляющийся о событии
{TEST_EVENT_TITLE}Титулсобытия
Как сделать, чтобсобытие появлялось во время игры
Откройте descr_events. Увидите примерноследующее
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;; EVENT LIST ;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; event historic first_windmill date 50
Добавляете событие в том же формате
event historic test_event date 2
Название (в этом примере "test_event") должно быть таким же, как добавленное ранее.
Можно изменить дату появления, так - 2 означает, что событие произойдет на 2 ходу или 1082 (в ваниле). Не ставьте 0 или 1, так как они не отобразятся
Добавление картинки события
Откройте папку data/ui
В southern_european/eventspic скопируйтелюбую картинку. Дайте ему название события("test_event").
Всегда можно изменить картинку позже на желаемую – это только место для нее.
Автор: selenius4tsd
Как создавать события (ивенты) ?
Spoiler (expand)
Для создания событий, появляющихся непосредственно в процессе игры на определенном ходу, редактируются следующие файлы игры:
1. data / world / maps / campaign / imperial_campaign / descr_events.txt
Здесь прописывается само событие и игровое время его появления.
2. data / text / historic_events.txt
Здесь размещаются текстовые описания событий.
3. ui / <название культуры> / eventpics / <название события>.tga
Здесь размещается инфокартинка, соответствующая событию.
Примечание: название инфокартинки должно обязательно совпадать с названием события - это своего рода "привязка" между текстовым и графическим файлами.
Для создания событий, появляющихся непосредственно в процессе игры на определенном ходу, редактируются следующие файлы игры:
1. data / world / maps / campaign / imperial_campaign / descr_events.txt
Здесь прописывается само событие и игровое время его появления.
2. data / text / historic_events.txt
Здесь размещаются текстовые описания событий.
3. ui / <название культуры> / eventpics / <название события>.tga
Здесь размещается инфокартинка, соответствующая событию.
Примечание: название инфокартинки должно обязательно совпадать с названием события - это своего рода "привязка" между текстовым и графическим файлами.
Какие файлы отвечают за поведение ИИ на страткарте, а какие на тактике ?
Spoiler (expand)
Поведение исскусственного интеллекта (ИИ) задается в следующих исполнительных файлах игры:
- на стратегической карте (режим кампании): descr_campaign_ai_db.xml ;
- на тактической карте (режим битвы): battle_config.xml, config_ai_battle.xml ;
Поведение исскусственного интеллекта (ИИ) задается в следующих исполнительных файлах игры:
- на стратегической карте (режим кампании): descr_campaign_ai_db.xml ;
- на тактической карте (режим битвы): battle_config.xml, config_ai_battle.xml ;
В каких текстовых файлах игры редактируются настройки Крестового Похода / Джихада ?
Spoiler (expand)
Базовые настройки Крестового Похода / Джихада расположены в файле descr_campaign_db.xml.
Базовые настройки Крестового Похода / Джихада расположены в файле descr_campaign_db.xml.
Возможно ли составить триггер, который изменял бы характеристику персонажа каждый ход и начислял последующий уровень трейта (есть 4 навыка - "Зимний", "Весенний", "Летний", "Осенний" - как привязать их к определенному времени года?
Spoiler (expand)
Прежде всего, следует отметить, что в M2TW лишь 2 времени года - "Лето" (summer) и "Зима" (winter).
Однако скриптинг предоставляет возможность задействовать 4 времени года, добавив фиктивные "Весну" и "Осень", которые, оставаясь на карте прежними временами года, будут меняться в зависимости от числа ходов.
Например, скрипт, разделяющий время года на 4 сезона, которые сменяют друг друга на протяжении 4 ходов игры:
Прежде всего, следует отметить, что в M2TW лишь 2 времени года - "Лето" (summer) и "Зима" (winter).
Однако скриптинг предоставляет возможность задействовать 4 времени года, добавив фиктивные "Весну" и "Осень", которые, оставаясь на карте прежними временами года, будут меняться в зависимости от числа ходов.
Например, скрипт, разделяющий время года на 4 сезона, которые сменяют друг друга на протяжении 4 ходов игры:
... console_command date 1657console_command season summerwhile I_TurnNumber = 164suspend_unscripted_advice trueend_while console_command date 1657console_command season summerwhile I_TurnNumber = 165suspend_unscripted_advice trueend_while console_command date 1657console_command season winterwhile I_TurnNumber = 166suspend_unscripted_advice trueend_while console_command date 1657console_command season winterwhile I_TurnNumber = 167suspend_unscripted_advice trueend_while ...
Как написать скрипт, чтобы появляющиеся повстанцы были не глобальными, а принадлежали некоторой фракции как в скрипте "Востание баронов" ?
Spoiler (expand)
Итак, скрипт "Восстание баронов" выглядит следующим образом (примечание редактора: форматированный вариант можно найти в campaign_script.txt ванильного мода Kingdoms Britannia):
Сущность этого скрипта такова: Бароны появляются, как отдельная фракция, аналогично Монголам. Только в случае Монголов появляется большой стек, а с баронами же, им города переходят, как восставшим. Фракция Баронов появляется на ходе Англии, и им при определенных условиях переходят поселения и деньги.
В нашем случае повстанцы будут принадлежать не к Англии, а к какой-либо отдельной фракции, но по истории (ивентам) они взбунтовались в этой фракции.
Итак, скрипт "Восстание баронов" выглядит следующим образом (примечание редактора: форматированный вариант можно найти в campaign_script.txt ванильного мода Kingdoms Britannia):
;[/spoiler][/spoiler][/spoiler][/spoiler][/spoiler] [/spoiler]- BARONS ALLIANCE [/spoiler][/spoiler][/spoiler][/spoiler][/spoiler] [/spoiler]-; ;setup related event counters monitor_event FactionTurnStart FactionType england add_events event counter ba_last_spawn_timer date 0 end_add_events terminate_monitor end_monitor ;inc time since the barons alliance last spawned timer monitor_event FactionTurnStart FactionType england inc_event_counter ba_last_spawn_timer 1 end_monitor ;initial spawning ;first first spawn opportunity (lead by de_Montfort if spawned at this point in time) monitor_event FactionTurnEnd FactionType england and I_CompareCounter ba_first_emergence = 0 and I_TurnNumber > 8 and I_TurnNumber < 35 ;randomise to determine if this check should be made this turn faction_emerge barons_alliance england 6 60.0 155.0 0.9 town false simon1 Simon de_Montfort 42 if I_NumberOfSettlements barons_alliance > 0 set_counter ba_first_emergence 1 set_event_counter ba_last_spawn_timer 0 historic_event barons_emerge_montfort end_if end_monitor ;second first spawn opportunity monitor_event FactionTurnEnd FactionType england and I_CompareCounter ba_first_emergence = 0 and I_TurnNumber > 50 and I_TurnNumber < 70 faction_emerge barons_alliance england 6 60.0 140.0 0.9 town false if I_NumberOfSettlements barons_alliance > 0 set_counter ba_first_emergence 1 set_event_counter ba_last_spawn_timer 0 historic_event barons_emerge_generic end_if end_monitor ;third first spawn opportunity monitor_event FactionTurnEnd FactionType england and I_CompareCounter ba_first_emergence = 0 and I_TurnNumber > 90 and I_TurnNumber < 110 faction_emerge barons_alliance england 6 60.0 140.0 0.9 town false if I_NumberOfSettlements barons_alliance > 0 set_counter ba_first_emergence 1 set_event_counter ba_last_spawn_timer 0 historic_event barons_emerge_generic end_if end_monitor ;final first spawn opportunity monitor_event FactionTurnEnd I_CompareCounter ba_first_emergence = 0 and I_TurnNumber > 130 and I_TurnNumber < 150 faction_emerge barons_alliance england 6 60.0 140.0 0.9 town false if I_NumberOfSettlements barons_alliance > 0 set_counter ba_first_emergence 1 set_event_counter ba_last_spawn_timer 0 historic_event barons_emerge_generic end_if end_monitor ;subsequent spawn conditions ;check when England gets a new faction leader monitor_event BecomesFactionLeader FactionType england and I_NumberOfSettlements england > 15 and I_CompareCounter ba_first_emergence = 1 and I_NumberOfSettlements barons_alliance = 0 and I_EventCounter ba_last_spawn_timer > 10 faction_emerge barons_alliance england 6 70.0 140.0 0.85 town false if I_NumberOfSettlements barons_alliance > 0 set_event_counter ba_last_spawn_timer 0 historic_event barons_reemerge_new_king add_money barons_alliance 10000 end_if end_monitor ;check when English leaders authority is low monitor_event FactionTurnEnd FactionType england and I_NumberOfSettlements england > 15 and I_CompareCounter ba_first_emergence = 1 and I_NumberOfSettlements barons_alliance = 0 and I_EventCounter ba_last_spawn_timer > 10 generate_random_counter authority_value 1 100 ;the lower the faction leaders authority, the greater the chance of the barons_alliance appearing if I_FactionLeaderAttribute england Authority = 0 if I_EventCounter authority_value <= 33 faction_emerge barons_alliance england 5 50.0 145.0 0.9 town false end_if end_if if I_FactionLeaderAttribute england Authority = 1 if I_EventCounter authority_value <= 25 faction_emerge barons_alliance england 6 60.0 135.0 0.9 town false end_if end_if if I_FactionLeaderAttribute england Authority = 2 if I_EventCounter authority_value <= 20 faction_emerge barons_alliance england 6 65.0 130.0 0.85 town false end_if end_if if I_FactionLeaderAttribute england Authority = 3 if I_EventCounter authority_value <= 15 faction_emerge barons_alliance england 6 70.0 120.0 0.85 town false end_if end_if if I_FactionLeaderAttribute england Authority = 4 if I_EventCounter authority_value <= 10 faction_emerge barons_alliance england 6 80.0 120.0 0.85 town false end_if end_if if I_FactionLeaderAttribute england Authority = 5 if I_EventCounter authority_value <= 5 faction_emerge barons_alliance england 6 85.0 120.0 0.85 town false end_if end_if if I_NumberOfSettlements barons_alliance > 0 set_event_counter ba_last_spawn_timer 0 historic_event barons_reemerge_poor_king add_money barons_alliance 10000 end_if end_monitor
Сущность этого скрипта такова: Бароны появляются, как отдельная фракция, аналогично Монголам. Только в случае Монголов появляется большой стек, а с баронами же, им города переходят, как восставшим. Фракция Баронов появляется на ходе Англии, и им при определенных условиях переходят поселения и деньги.
В нашем случае повстанцы будут принадлежать не к Англии, а к какой-либо отдельной фракции, но по истории (ивентам) они взбунтовались в этой фракции.
Как реализовать при помощи скрипта ситуацию, позволяющую возвращать уничтоженные фракции, в случае мятежа в провинции, либо возродить погибшую фракцию, как это было возможно в британской компании с Фракцией Баронов, чтобы при этом она оставалась вассалом?
Spoiler (expand)
Например, можно составить скрипт подобного содержания:
Далее, в descr_sm_factions.txt, создадим повстанцев :
В дальнейшем для того чтобы был вассалитет, нужно в descr_strat.txt прописать строки наподобие следующих:
Например, можно составить скрипт подобного содержания:
;создаём счётчик количества ходов с появления фракции-повстанцевdeclare_counter byzantiumrebels 0;увеличиваем счётчик ходов со времени последнего появления фракцииmonitor_event FactionTurnStart FactionType byzantium inc_counter byzantiumrebels 1end_monitor;при появлении нового лидера фракцииmonitor_event BecomesFactionLeader FactionType byzantiumand I_NumberOfSettlements byzantium > 25and I_CompareCounter byzantiumrebels > 20 if I_FactionLeaderAttribute byzantium Authority < 5 faction_emerge bulgaria byzantium 22 130.0 120.0 0.5 village false end_if if I_FactionLeaderAttribute byzantium Authority < 4 faction_emerge bulgaria byzantium 22 140.0 130.0 0.6 village false end_if if I_FactionLeaderAttribute byzantium Authority < 3 faction_emerge bulgaria byzantium 21 150.0 140.0 0.7 village false end_if if I_FactionLeaderAttribute byzantium Authority < 2 faction_emerge bulgaria byzantium 21 160.0 150.0 0.8 village false end_if if I_FactionLeaderAttribute byzantium Authority < 1 faction_emerge bulgaria byzantium 20 170.0 160.0 0.9 village false end_if if I_FactionLeaderAttribute byzantium Authority < 0 faction_emerge bulgaria byzantium 20 180.0 170.0 1.0 village false end_if if I_NumberOfSettlements bulgaria > 0;;;;;;;;;historic_event BYZANTIUMREBELS set_counter byzantiumrebels 0 add_money bulgaria 100 set_faction_standing byzantium bulgaria -1.0 set_faction_standing bulgaria byzantium -1.0 console_command diplomatic_stance byzantium bulgaria war end_if end_monitor
Далее, в descr_sm_factions.txt, создадим повстанцев :
faction byzantium, shadowed_by bulgariaculture greekreligion orthodoxsymbol models_strat/symbol_byzantium.CASrebel_symbol models_strat/symbol_rebels.CASprimary_colour red 133, green 18, blue 137secondary_colour red 239, green 239, blue 239loading_logo loading_screen/symbols/symbol128_byzantium.tgastandard_index 8logo_index FACTION_LOGO_BYZANTIUMsmall_logo_index SMALL_FACTION_LOGO_BYZANTIUMtriumph_value 5intro_movie faction/minor_intro.bikvictory_movie faction/minor_win.bikdefeat_movie faction/minor_lose.bikdeath_movie faction/minor_lose.bikcustom_battle_availability yescan_sap yesprefers_naval_invasions yescan_have_princess yeshas_family_tree yes;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;faction bulgaria, shadowing byzantiumculture greekreligion orthodoxsymbol models_strat/symbol_bulgaria.CASrebel_symbol models_strat/symbol_rebels.CASprimary_colour red 233, green 118, blue 237secondary_colour red 100, green 100, blue 100loading_logo loading_screen/symbols/symbol128_byzantium.tgastandard_index 9logo_index FACTION_LOGO_EGYPT;;FACTION_LOGO_BULGARIAsmall_logo_index SMALL_FACTION_LOGO_EGYPT;;SMALL_FACTION_LOGO_BULGARIAtriumph_value 5intro_movie faction/minor_intro.bikvictory_movie faction/minor_win.bikdefeat_movie faction/minor_lose.bikdeath_movie faction/minor_lose.bikcustom_battle_availability nocan_sap yesprefers_naval_invasions yescan_have_princess yeshas_family_tree yes
В дальнейшем для того чтобы был вассалитет, нужно в descr_strat.txt прописать строки наподобие следующих:
set_faction_standing byzantium bulgaria 1.0console_command diplomatic_stance byzantium bulgaria _вассалитет_
Как сделать появляющуюся фракцию играбельной со старта?
Spoiler (expand)
В этом уроке я объясню, как сделать появляющуюся фракцию (монголов, тимуридов и т.д.) доступными для игры с самого начала, и в то же время позже они будут получать орды.
Очень важно внимательно прочитать урок, потому что любая ошибка может привести к вылету.
1-я часть
Нам придется изменить только descr_strat.txt, расположенный в Medieval2/data/world/maps/campaign/imperial_campaign.
Однако, Вы все равно можете создать map_faction.tga (карта исходного положения), vc_faction.tga (карта условий победы), vcs_faction.tga (условия победы в короткой кампании) и description_faction.txt. «фракция» в имени файла должно быть заменено на имя новой фракции.
Вы также можете добавить их условия победы в descr_win_conditions.txt.
2-я часть
Теперь давайте сделаем монголов играбельными с начала.
Открываем descr_strat.txt, добавляем монголов к списку playable, а затем ищем этого:
Удалите красную строку, теперь они там с самого начала. Но они все еще нуждаются в регионах, армии и членах семьи. Следующим шагом является поиск региона в descr_strat, который мы им отдадим. Вот пример:
Теперь скопируйте эти строки вашей фракции. Они должны выглядеть следующим образом:
Когда вы сделаете это, вернитесь и удалите Тбилиси с повстанцами. Это очень важно, т.к. регион может иметь только одного владелеца.
После этого мы добавим армию с лидером фракции, т.к. если мы этого не сделаем, они станут повстанцами, как только вы начнете кампанию.
Во-первых, проверьте координаты переданного им замка. Так как мы их не знаем, нам нужно запустить игру, чтобы определить их.
Примечание: Запустите игру с ванильным descr_strat.txt, в противном случае вы получите вылет, так как мы не удалили повстанческую армию из замка.
Введите в консоли show_cursorstat, когда наведете мышь на Тбилиси.
Хорошо, у нас есть координаты. Найдите их (например, х 278, у 109) в descr_strat.
Вы найдете это:
Удалите это!
Когда закончите, перейдите к вашей фракции, и добавьте следующее:
character Genghis, named character, male, leader, age 40, x 278, y 109
Мы создали члена семьи. Теперь сделаем армию. Откройте campaign_script.txt, найдите mongols, и вы увидите их скрипт орды. Прокрутите вниз, пока не найдете часть вроде этой:
Скопируйте некоторых юнитов вашему лидеру фракции.
Важно: не записывайте имена в descr_strat из campaign_script, или вы получите вылет!
Если вы не знаете имен для них, просто напишите "Blabla", игра будет показать пробел если имя отсутствует в списке.
Это должно выглядеть следующим образом:
В этом уроке я объясню, как сделать появляющуюся фракцию (монголов, тимуридов и т.д.) доступными для игры с самого начала, и в то же время позже они будут получать орды.
Очень важно внимательно прочитать урок, потому что любая ошибка может привести к вылету.
1-я часть
Нам придется изменить только descr_strat.txt, расположенный в Medieval2/data/world/maps/campaign/imperial_campaign.
Однако, Вы все равно можете создать map_faction.tga (карта исходного положения), vc_faction.tga (карта условий победы), vcs_faction.tga (условия победы в короткой кампании) и description_faction.txt. «фракция» в имени файла должно быть заменено на имя новой фракции.
Вы также можете добавить их условия победы в descr_win_conditions.txt.
2-я часть
Теперь давайте сделаем монголов играбельными с начала.
Открываем descr_strat.txt, добавляем монголов к списку playable, а затем ищем этого:
faction mongols, balanced smithai_label default [color="#FF0000"]dead_until_resurrected[/color]denari 10000denari_kings_purse 3000
Удалите красную строку, теперь они там с самого начала. Но они все еще нуждаются в регионах, армии и членах семьи. Следующим шагом является поиск региона в descr_strat, который мы им отдадим. Вот пример:
settlement castle{ level town region Tbilisi_Province year_founded 0 population 2500 plan_set default_set faction_creator moors building { type core_building stone_wall } building { type barracks town_guard }}Теперь скопируйте эти строки вашей фракции. Они должны выглядеть следующим образом:
faction mongols, balanced smithai_label default denari 10000denari_kings_purse 3000settlement castle{ level town region Tbilisi_Province year_founded 0 population 2500 plan_set default_set faction_creator moors building { type core_building stone_wall } building { type barracks town_guard }}Когда вы сделаете это, вернитесь и удалите Тбилиси с повстанцами. Это очень важно, т.к. регион может иметь только одного владелеца.
После этого мы добавим армию с лидером фракции, т.к. если мы этого не сделаем, они станут повстанцами, как только вы начнете кампанию.
Во-первых, проверьте координаты переданного им замка. Так как мы их не знаем, нам нужно запустить игру, чтобы определить их.
Примечание: Запустите игру с ванильным descr_strat.txt, в противном случае вы получите вылет, так как мы не удалили повстанческую армию из замка.
Введите в консоли show_cursorstat, когда наведете мышь на Тбилиси.
Хорошо, у нас есть координаты. Найдите их (например, х 278, у 109) в descr_strat.
Вы найдете это:
character sub_faction turks, Kuchuk Ilker, general, male, age 23, x 278, y 109 armyunit Turkish Archers exp 0 armour 0 weapon_lvl 0unit Turkish Archers exp 0 armour 0 weapon_lvl 0unit ME Town Militia exp 0 armour 0 weapon_lvl 0unit ME Town Militia exp 0 armour 0 weapon_lvl 0
Удалите это!
Когда закончите, перейдите к вашей фракции, и добавьте следующее:
character Genghis, named character, male, leader, age 40, x 278, y 109
Мы создали члена семьи. Теперь сделаем армию. Откройте campaign_script.txt, найдите mongols, и вы увидите их скрипт орды. Прокрутите вниз, пока не найдете часть вроде этой:
army unit Mongol Bodyguard exp 6 armour 0 weapon_lvl 0 unit Mongol Infantry exp 6 armour 0 weapon_lvl 0 unit Mongol Infantry exp 6 armour 0 weapon_lvl 0 unit Mongol Infantry exp 6 armour 0 weapon_lvl 0 unit Mongol Infantry exp 6 armour 0 weapon_lvl 0 unit Mongol Infantry exp 6 armour 0 weapon_lvl 0 unit Mongol Foot Archers exp 6 armour 0 weapon_lvl 0 unit Mongol Foot Archers exp 6 armour 0 weapon_lvl 0
Скопируйте некоторых юнитов вашему лидеру фракции.
Важно: не записывайте имена в descr_strat из campaign_script, или вы получите вылет!
Если вы не знаете имен для них, просто напишите "Blabla", игра будет показать пробел если имя отсутствует в списке.
Это должно выглядеть следующим образом:
character Genghis, named character, male, leader, age 40, x 278, y 109army unit Mongol Bodyguard exp 6 armour 0 weapon_lvl 0 unit Mongol Infantry exp 6 armour 0 weapon_lvl 0 unit Mongol Infantry exp 6 armour 0 weapon_lvl 0 unit Mongol Infantry exp 6 armour 0 weapon_lvl 0 unit Mongol Infantry exp 6 armour 0 weapon_lvl 0 unit Mongol Infantry exp 6 armour 0 weapon_lvl 0

t1aro
alZarif
Dr.Schmeisser
KhanBagatur
gurvinek2005
Crusader556
Haktar
Mady
Valyrian_Legionnaire
DinarMayor
Corrector
kosak4
Farin Frostgeir


