Использование функций M2TW Engine Overhaul Project, связанных с метками персонажей
Для начала рекомендую ознакомиться с инструкцией к программе и её возможностями на Для просмотра ссылки Зарегистрируйтесь странице.
Перевод статьи, написанной Для просмотра ссылки Зарегистрируйтесьна твцентре.
Для просмотра ссылки Зарегистрируйтесь
Спойлер (раскрыть)
youneuoy попросил меня помочь ему с тестированием этой скриптовой возможности и, если бы я мог, объяснить другим как это работает. Так что рассмотрим её подробнее.
M2TW Engine Overhaul Project v1.16
Для начинающих немного информации о метках. Метки могут быть назначены персонажам только в файле descr_strat или персонажам, появляющимся по эвентам из campaign_script, каждый персонаж может иметь только одну, уникальную метку и эта метка позволяет делать много интересных вещей с ним(и его армией). Вы можете использовать эти метки в консольных и скриптовых командах. В общем, если бы вы знаете метку персонажа, то можете сделать с ним много интересного.
Однако для хороших скриптов этого недостаточно, если вы хотите создать более сложные вещи вам нужно что-то, что можно использовать более широко, для любого персонажа на карте в любой момент, а не только для стартовых или появляющихся по эвентам персонажей. Такие вещи, если они вообще возможны, обычно требуют безумного количества скриптинга для того, чтобы заставить это хоть как-то работать.
Возможность назначать метки любым персонажам в любое время - это то, что позволит упростить(и улучшить) всё это, а также позволит создавать совершенно новые вещи при помощи скриптов. И это именно то, что делает обновление 1.16 для M2TW Engine Overhaul Project!
1. Настройка вашего cfg файла
Первый шаг - загрузить программу и распаковать её файлы в свой мод. Основные настройки задаются в файле "limits.youneuoycfg". Тем не менее, для того, чтобы настроить метки вам нужно перейти в папку youneuoy_Data, где вы можете найти "labels.youneuoycfg" и "labels_immutable.youneuoycfg". Именно с этими двумя файлами мы и будем работать.
(логи для каждого файла вы сможете найти в папке logs)
В "labels.youneuoycfg" вы можете настроить свои новые драгоценные метки и, что более важно условия для их назначения.
Основная структура:
Имя метки состоит из трёх строк.
Это может выглядеть примерно так:
Если условия выполняются для обоих меток, то персонаж получит my_new_precious_label, так как у неё приоритет выше, чем у my_new_precious_label_2.
Следующая строка - количество условий, которые должны выполниться. Также как и приоритет задаётся одним числом. Если нужно, чтобы метка выдавалась, если истинно одно условие, пишите 1, если 2 то 2, если 3 то 3 и т.д.
Пример:
Давайте подробно разберём условия, важнейшую часть. Каждое условие состоит из трёх строк.
Первая - тип условия, может быть:
"passed_Turns" - количество ходов с начала игры
"name" - имя персонажа
"trait" - трейт, который должен быть у персонажа. Вы не можете задавать уровень трейта. То есть условие будет истинным для любого уровня трейта(если он больше 0).
"ancillary" - свита, которую персонаж должен иметь
"label" - метка, которую персонаж должен иметь(она перезапишется новой меткой)
"4_coords" - это исключение и занимает целых 6 строк. Этим вы задаёте координаты, в которых должен находиться персонаж, чтобы условие было истиной.
Вторая строка это число и оно может принимать всего 3 значения, определяющих важность условия.
0 - это значит, что условие не обязательно
1 - условие обязательно
2 - условие не должно быть исполнено
Третья строка это кодовое название для поиска, в зависимости от типа условия. То есть вы можете написать имя персонажа, название трейта, свиты или метки. Для 4_coords вы должны написать координаты x и y в 4 строках в таком порядке: xmin, ymin, xmax, ymax.(вы можете задать одинаковые min и max, чтобы проверить 1 клетку).
Таким образом, полностью рабочий триггер метки может выглядеть так:
Итак, если у персонажа метка new_precious_label_2 и он находится на координатах x 77, y 111 он получит метку my_new_precious_label
Мы использовали только обязательные условия, давайте посмотрим, как использовать необязательные:
Теперь у нас 3 условия. количество условий, которые должны выполниться - 2, так что только 2 условия должны быть истинными. Поскольку "label" имеет значение 1, а оба ancillary имеют значения 0, это значит, что для того, чтобы персонаж получил метку my_new_precious_label у него должна быть метка my_new_precious_label_2 и щит ИЛИ меч в свите.
Также мы можем задать условия, которые не должны выполняться, вот так:
Вообщем это тоже самое, что и предыдущий вариант. Однако, если у персонажа есть любой уровень трейта "too_old", то он не получит метку my_new_precious_label.
Теперь вы должны знать все возможности файла.
Подсказка - убедитесь, что после любой строки с триггером нет пробелов. Тогда все перестало бы работать.
Подсказка 2 - может быть больше триггеров для одной и той же метки.
В другом файле "tags_immutable.youneuoycfg" вы просто пишете метки, которые не могут быть перезаписаны другими вашими новыми метками. Зачем? Что ж, например, если у вас есть некоторые существующие метки, которые уже являются частью различных скриптов, событий и т. д., и вы не хотите их переопределять - просто напишите по одному на каждую строку.
Существует видео от youneuoy, охватывающее большую часть этого:
2. Настройка campaign_script
Это все хорошо, но для того, чтобы действительно использовать эти возможности, вам, естественно, нужно зайти в campaign_script и создать несколько скриптов. Я полагаю, что большинство из вас знает, как создавать скрипты, поэтому мне не нужно много говорить об этом. (и в любом случае я не один из лучших скриптеров).
Есть одно большое но, о котором вы должны знать. Несмотря на то, что многочисленные персонажи теперь могут использовать одну и ту же метку, игра всегда будет рассматривать только одного из них. Так что если у вас будет 10 персонажей, которых вы хотите убить (потому что они получили метку, основанную на вашем триггере), и вы напишите «console_command kill_character my_new_precious_label», он убьет только первого.
Так что либо нам придется создавать больше безумных скриптов, чтобы исправить новую проблему, которую мы только что создали, и как-то заставить это работать для всех помеченных персонажей, либо youneuoy что-нибудь с этим сделает. И он сделал .
Если в ваш скрипт (или если вы просто открываете консольную панель в игре) напишите это:
"give_trait my_new_precious_label try_change_this_label"
Это сотрет метку! Таким образом, после того, как вы выполните действия с одним персонажем, вы должны написать это, чтобы его my_new_precious_label стёрся, и его можно было использовать для другого персонажа с такой меткой.
Наглядный пример в другом видео от youneuoy:
Кроме того, вы также можете использовать это:
"give_trait my_new_precious_label try_change_this_label_to:newlabel"
Это изменит метку существующего персонажа с меткой my_new_precious_label (все еще первого в списке) на новую метку, названную «newlabel». В некоторых случаях это может частично заменить файл cfg.
Обе эти команды будут сообщать об ошибке, что персонаж с этой меткой не существует, но все в порядке. Скрипты все равно будут работать нормально.
Хорошо, теперь к самому скриптингу. Я уверен, вы захотите сделать что-то, что может случиться несколько раз, а не один раз. Итак, ваш скрипт должен выглядеть примерно так:
Важно, чтобы не было "terminate_monitor". В противном случае событие сработает только один раз.
Итак, давайте попробуем сделать осмысленный скрипт. Я думаю, что было бы лучше избегать «обычных» типов monitor_events, которые срабатывают в начале / конце хода, так как я предполагаю, что они могут сработать только один раз, даже если у вас будет больше помеченных персонажей. Хотя у меня не было времени, чтобы протестировать его должным образом, я полагаю, что это может сработать, если написано грамотно.
Поэтому нам лучше использовать monitor_events, которые запускаются, когда мы делаем или нажимаем на что-то. Некоторые примеры, которые я могу придумать:
Предполагаю, что my_new_precious_label был кем-то, кто это заслужил, что-то для этого сделано в cfg.
Видите, здесь нам даже не пришлось использовать команду для удаления метки, так как персонаж умер
или что-то вроде этого:
youneuoy попросил меня помочь ему с тестированием этой скриптовой возможности и, если бы я мог, объяснить другим как это работает. Так что рассмотрим её подробнее.
Пересмотр меток персонажей(улучшение скриптовых возможностей)
M2TW Engine Overhaul Project v1.16
Для начинающих немного информации о метках. Метки могут быть назначены персонажам только в файле descr_strat или персонажам, появляющимся по эвентам из campaign_script, каждый персонаж может иметь только одну, уникальную метку и эта метка позволяет делать много интересных вещей с ним(и его армией). Вы можете использовать эти метки в консольных и скриптовых командах. В общем, если бы вы знаете метку персонажа, то можете сделать с ним много интересного.
Однако для хороших скриптов этого недостаточно, если вы хотите создать более сложные вещи вам нужно что-то, что можно использовать более широко, для любого персонажа на карте в любой момент, а не только для стартовых или появляющихся по эвентам персонажей. Такие вещи, если они вообще возможны, обычно требуют безумного количества скриптинга для того, чтобы заставить это хоть как-то работать.
Возможность назначать метки любым персонажам в любое время - это то, что позволит упростить(и улучшить) всё это, а также позволит создавать совершенно новые вещи при помощи скриптов. И это именно то, что делает обновление 1.16 для M2TW Engine Overhaul Project!
1. Настройка вашего cfg файла
Первый шаг - загрузить программу и распаковать её файлы в свой мод. Основные настройки задаются в файле "limits.youneuoycfg". Тем не менее, для того, чтобы настроить метки вам нужно перейти в папку youneuoy_Data, где вы можете найти "labels.youneuoycfg" и "labels_immutable.youneuoycfg". Именно с этими двумя файлами мы и будем работать.
(логи для каждого файла вы сможете найти в папке logs)
В "labels.youneuoycfg" вы можете настроить свои новые драгоценные метки и, что более важно условия для их назначения.
Основная структура:
Спойлер (раскрыть)
имя метки приоритет количество условий, которые должны выполниться условия
Имя метки состоит из трёх строк.
- Первая всегда одинакова, это "label:". Это начало новой секции для метки.
- Вторая строка определяет как метка будет отображаться в логе.
- Третья и самая важная строка - кодовое название метки. Оно которое будет записано в метку персонажа. Это должно быть одно слово.
Это может выглядеть примерно так:
Спойлер (раскрыть)
label: My New Precious label my_new_precious_label
Приоритет сообщает программе какая метка более важна. Новая метка перезаписывает старую метку, поэтому наверняка у вас будут более важные метки, которые вы не захотите перезаписывать менее важными. Или например у вас может быть набор меток и вам нужно, чтобы персонаж сначала получил первую, только после этого вторую и т.д.
Приоритет каждой метки задаётся простым числом. Чем больше число тем выше приоритет.
Пример:
Приоритет каждой метки задаётся простым числом. Чем больше число тем выше приоритет.
Пример:
Спойлер (раскрыть)
label: My New Precious label my_new_precious_label 1 ..
label: My New Precious label 2 my_new_precious_label_2 0 ...
Если условия выполняются для обоих меток, то персонаж получит my_new_precious_label, так как у неё приоритет выше, чем у my_new_precious_label_2.
Следующая строка - количество условий, которые должны выполниться. Также как и приоритет задаётся одним числом. Если нужно, чтобы метка выдавалась, если истинно одно условие, пишите 1, если 2 то 2, если 3 то 3 и т.д.
Пример:
Спойлер (раскрыть)
label: My New Precious label my_new_precious_label 1 2 ..
Давайте подробно разберём условия, важнейшую часть. Каждое условие состоит из трёх строк.
Первая - тип условия, может быть:
"passed_Turns" - количество ходов с начала игры
"name" - имя персонажа
"trait" - трейт, который должен быть у персонажа. Вы не можете задавать уровень трейта. То есть условие будет истинным для любого уровня трейта(если он больше 0).
"ancillary" - свита, которую персонаж должен иметь
"label" - метка, которую персонаж должен иметь(она перезапишется новой меткой)
"4_coords" - это исключение и занимает целых 6 строк. Этим вы задаёте координаты, в которых должен находиться персонаж, чтобы условие было истиной.
Вторая строка это число и оно может принимать всего 3 значения, определяющих важность условия.
0 - это значит, что условие не обязательно
1 - условие обязательно
2 - условие не должно быть исполнено
Третья строка это кодовое название для поиска, в зависимости от типа условия. То есть вы можете написать имя персонажа, название трейта, свиты или метки. Для 4_coords вы должны написать координаты x и y в 4 строках в таком порядке: xmin, ymin, xmax, ymax.(вы можете задать одинаковые min и max, чтобы проверить 1 клетку).
Таким образом, полностью рабочий триггер метки может выглядеть так:
Спойлер (раскрыть)
label: My New Precious label my_new_precious_label 1 2 label 1 my_new_precious_label_2 4_coords 1 77 111 77 111
Итак, если у персонажа метка new_precious_label_2 и он находится на координатах x 77, y 111 он получит метку my_new_precious_label
Мы использовали только обязательные условия, давайте посмотрим, как использовать необязательные:
Спойлер (раскрыть)
label: My New Precious label my_new_precious_label 1 2 label 1 my_new_precious_label_2 ancillary 0 sword ancillary 0 shield
Теперь у нас 3 условия. количество условий, которые должны выполниться - 2, так что только 2 условия должны быть истинными. Поскольку "label" имеет значение 1, а оба ancillary имеют значения 0, это значит, что для того, чтобы персонаж получил метку my_new_precious_label у него должна быть метка my_new_precious_label_2 и щит ИЛИ меч в свите.
Также мы можем задать условия, которые не должны выполняться, вот так:
Спойлер (раскрыть)
label: My New Precious label my_new_precious_label 1 2 label 1 my_new_precious_label_2 ancillary 0 sword ancillary 0 shield trait 2 too_old
Вообщем это тоже самое, что и предыдущий вариант. Однако, если у персонажа есть любой уровень трейта "too_old", то он не получит метку my_new_precious_label.
Теперь вы должны знать все возможности файла.
Подсказка - убедитесь, что после любой строки с триггером нет пробелов. Тогда все перестало бы работать.
Подсказка 2 - может быть больше триггеров для одной и той же метки.
В другом файле "tags_immutable.youneuoycfg" вы просто пишете метки, которые не могут быть перезаписаны другими вашими новыми метками. Зачем? Что ж, например, если у вас есть некоторые существующие метки, которые уже являются частью различных скриптов, событий и т. д., и вы не хотите их переопределять - просто напишите по одному на каждую строку.
Существует видео от youneuoy, охватывающее большую часть этого:
Спойлер (раскрыть)
2. Настройка campaign_script
Это все хорошо, но для того, чтобы действительно использовать эти возможности, вам, естественно, нужно зайти в campaign_script и создать несколько скриптов. Я полагаю, что большинство из вас знает, как создавать скрипты, поэтому мне не нужно много говорить об этом. (и в любом случае я не один из лучших скриптеров).
Есть одно большое но, о котором вы должны знать. Несмотря на то, что многочисленные персонажи теперь могут использовать одну и ту же метку, игра всегда будет рассматривать только одного из них. Так что если у вас будет 10 персонажей, которых вы хотите убить (потому что они получили метку, основанную на вашем триггере), и вы напишите «console_command kill_character my_new_precious_label», он убьет только первого.
Так что либо нам придется создавать больше безумных скриптов, чтобы исправить новую проблему, которую мы только что создали, и как-то заставить это работать для всех помеченных персонажей, либо youneuoy что-нибудь с этим сделает. И он сделал .
Если в ваш скрипт (или если вы просто открываете консольную панель в игре) напишите это:
"give_trait my_new_precious_label try_change_this_label"
Это сотрет метку! Таким образом, после того, как вы выполните действия с одним персонажем, вы должны написать это, чтобы его my_new_precious_label стёрся, и его можно было использовать для другого персонажа с такой меткой.
Наглядный пример в другом видео от youneuoy:
Спойлер (раскрыть)
Кроме того, вы также можете использовать это:
"give_trait my_new_precious_label try_change_this_label_to:newlabel"
Это изменит метку существующего персонажа с меткой my_new_precious_label (все еще первого в списке) на новую метку, названную «newlabel». В некоторых случаях это может частично заменить файл cfg.
Обе эти команды будут сообщать об ошибке, что персонаж с этой меткой не существует, но все в порядке. Скрипты все равно будут работать нормально.
Хорошо, теперь к самому скриптингу. Я уверен, вы захотите сделать что-то, что может случиться несколько раз, а не один раз. Итак, ваш скрипт должен выглядеть примерно так:
Спойлер (раскрыть)
monitor_event .... .... do something .... end_monitor
Важно, чтобы не было "terminate_monitor". В противном случае событие сработает только один раз.
Итак, давайте попробуем сделать осмысленный скрипт. Я думаю, что было бы лучше избегать «обычных» типов monitor_events, которые срабатывают в начале / конце хода, так как я предполагаю, что они могут сработать только один раз, даже если у вас будет больше помеченных персонажей. Хотя у меня не было времени, чтобы протестировать его должным образом, я полагаю, что это может сработать, если написано грамотно.
Поэтому нам лучше использовать monitor_events, которые запускаются, когда мы делаем или нажимаем на что-то. Некоторые примеры, которые я могу придумать:
Спойлер (раскрыть)
monitor_event CharacterSelected CharacterIsLocal and I_EventCounter Lets_murder_someone > 0 and I_CharacterExists my_new_precious_label kill_character my_new_precious_label set_counter Lets_murder_someone 0 end_monitor
Предполагаю, что my_new_precious_label был кем-то, кто это заслужил, что-то для этого сделано в cfg.
Видите, здесь нам даже не пришлось использовать команду для удаления метки, так как персонаж умер
или что-то вроде этого:
Спойлер (раскрыть)
monitor_event CharacterSelected CharacterIsLocal and AgentType = priest and I_CharacterExists priest_ready_to_promotion give_ancillary priest_ready_to_promotion cardinal give_trait priest_ready_to_promotion try_change_this_label end_monitor
или вроде этого:
Спойлер (раскрыть)
monitor_event CharacterSelected CharacterIsLocal and IsFactionLeader and I_FactionLeaderTrait kingship = 3 remove_ancillary faction_leader duke give_ancillary faction_leader king create_unit faction_leader "Mailed Knights" 3 3 3 3 create_unit faction_leader "Mailed Knights" 3 3 3 3 create_unit faction_leader "Mailed Knights" 3 3 3 3 end_monitor
или вот так:
(конечно, при условии, что у вас будет хороший триггер для получения метки traitor )
(конечно, при условии, что у вас будет хороший триггер для получения метки traitor )
Спойлер (раскрыть)
monitor_event FactionTurnStart FactionIsLocal and I_CharacterExists traitor and I_EvenCounter Civil_War = 1 and not FactionBuildingExists > cathedral spawn_army faction slave, sub_faction england character random_name, named character, age 34, x 302, y 290 traits LoyaltyStarter 1 , GoodCommander 2 , ReligionStarter 1 , GoodAttacker 1 unit Rebels exp 9 armour 0 weapon_lvl 0 unit Rebels exp 9 armour 0 weapon_lvl 0 unit Rebels exp 9 armour 0 weapon_lvl 0 unit Rebels exp 9 armour 0 weapon_lvl 0 unit Rebels exp 9 armour 0 weapon_lvl 0 end end_monitor
Ну, конечно, есть много других, лучших, способов использовать это, просто что-то, что я смог придумать прямо сейчас. Я, возможно, также допустил ошибки, поэтому дайте мне знать, чтобы исправить их.
3. Реализация в вашем моде - примеры
Эта функция позволяет реализовать новые удивительные скрипты, которые раньше были невозможны. Я предлагаю всем, у кого есть идеи, как это использовать или если вы уже это сделали, покажите свои примеры, чтобы мы могли открыть для себя новые возможности скриптинга!
Некоторые собственные примеры мне удалось в короткие сроки реализовать в моём моде TES mod.
- Создание алхимического зелья из ингредиентов.
cfg часть:
3. Реализация в вашем моде - примеры
Эта функция позволяет реализовать новые удивительные скрипты, которые раньше были невозможны. Я предлагаю всем, у кого есть идеи, как это использовать или если вы уже это сделали, покажите свои примеры, чтобы мы могли открыть для себя новые возможности скриптинга!
Некоторые собственные примеры мне удалось в короткие сроки реализовать в моём моде TES mod.
- Создание алхимического зелья из ингредиентов.
cfg часть:
Спойлер (раскрыть)
label: potion making 1 potion1 1 3 ancillary 1 torchbug_thorax ancillary 1 spider_egg ancillary 1 scrib_jelly ancillary 2 potion_hitpoints_1
скриптовая часть:
Спойлер (раскрыть)
monitor_event CharacterSelected CharacterIsLocal and AgentType = merchant (and HasAncType torchbug_thorax) (and HasAncType spider_egg) (and HasAncType scrib_jelly) and I_CharacterExists potion1 remove_ancillary potion1 torchbug_thorax remove_ancillary potion1 spider_egg remove_ancillary potion1 scrib_jelly give_ancillary potion1 potion_hitpoints_1 give_trait potion1 try_change_this_label end_monitor
Это настоящий крафт в реальном времени!
И давайте приведём некоторые новые способы мучить ваши машины
cfg часть:
И давайте приведём некоторые новые способы мучить ваши машины
cfg часть:
Спойлер (раскрыть)
label: TES label 1 testestlabel 0 2 passed_Turns 1 1 ancillary 1 Almalexia label: TES label 2 testestlabel2 1 2 4_coords 1 332 192 332 192 label 1 testestlabel label: TES label 3 testestlabel 1 2 4_coords 1 370 156 370 156 label 1 testestlabel2
скриптовая часть:
Спойлер (раскрыть)
monitor_event FactionTurnStart FactionIsLocal and I_CharacterExists testestlabel repostion_character testestlabel, 332, 192 end_monitor monitor_event FactionTurnStart FactionIsLocal and I_CharacterExists testestlabel2 repostion_character testestlabel2, 370, 156 end_monitor
(да, это мог быть просто скрипт, использующий "try_change_this_label_to:testestlabel2", но я сделал это до того, как такая команда появилась, так что, по крайней мере, еще несколько примеров того, как это может выглядеть, чтобы помочь вам ...
Поделитесь своими примерами или идеями, как это использовать!
Поделитесь своими примерами или идеями, как это использовать!