Основы и немного о счетчиках (Medieval 2: Total War)
Автор: Norinke
Дата: 22 мар 2020, 15:29 · Просмотров: 1 540
Дата: 22 мар 2020, 15:29 · Просмотров: 1 540
Такс, решил я тут начать по чучуть писать туториалы по скриптам, для начала возьму самое просто это счетчики, а так же затрону минимальные основы для создания скрипта
Со временем надеюсь напишу по всем командам, а так же условиям и евентам, возможно напишу докумендос по комадам на подобии зелено глазого с ТВЦ
Оффтоп (контент вне темы)
Леха только сильно не бей, просто решил отвлечься от булатки, и нет, я пока что в движок лезть не собираюсь
Это основа которую мы будем использовать
monitor_event < команда которая вызывает проверку события
terminate_monitor < отключить монитор без возможности его восстановления, все что написано после этой команды не ликвидно
end_monitor < окончание нашего монитора
А теперь более понятно на примере
|
monitor_event FactionTurnStart < когда начинается ход какой либо фракции, запускается наш монитор
terminate_monitor
end_monitor
terminate_monitor
end_monitor
Но ясно дело этого нам мало, в целом в игре есть 220 с хвостиком событый которые она проверяет
и так же 410 с хвостиком условий и 240 с чем-то команд, со временем надеюсь обясню по всем
Вот как выгляди к примеру проверка на ход Швеции
|
monitor_event FactionTurnStart FactionType sweden
terminate_monitor
end_monitor
terminate_monitor
end_monitor
FactionTurnStart < проверка события начало хода какой либо фракции
FactionType < проверка какой тип фракции начал ход, если не швеция, то игнорит
Небольшое примечание, мы не может использовать все существующие проверки к FactionTurnStart
к примеру мы не можем использовать проверку SettlementName, потому что это же не город(ваш кеп)
Мы можем использовать только те что касаются фракций, а так же универсальные, которые не имею привязки к фракции, поселению, человеку и т.д.
К примеру I_CompareCounter, является универсальным
В то время как FactionType может применятся к тем евентам, которые имеют информацию о фракции
Чтобы было еще понятнее FactionTurnStart знает только о фракциях и не более, можно проверить казну, тип фракции, религию и т.д., не более
А BecomesFactionLeader уже знает больше, это событие что персонаж становится лидером какого либо альянса, тут уже мы можем
проверять записи по персонажу, фракцию, проверить регион где стоит и еще всякое, но опять таки, здесь еще нужно следовать логике, к числу записей по персонажу подходит такая проверка как "WonBattle", но она же не логичная, у нас сработало событие, что персонаж стал лидером, а не что окончилась битва, так не забавыйте о банальной логике
Так же у нас есть кроме обычного monitor_event есть
monitor_conditions
Чем он отличается? Он работает исключительно с универсальными проверками, как I_BattleStarted(используется только во время бытвы), I_CompareCounter, I_SettlementOwner(карта глобальная) и т.д.
к примеру если нам нужно что-то сделать сразу же после того как счетчик I_CompareCounter принял значение 100, то мы можем использовать его
|
monitor_conditions I_CompareCounter TestCounter = 1
historic_event bla_bla_bla < показать сообщение
end_monitor
historic_event bla_bla_bla < показать сообщение
end_monitor
Но в таком случае не забывайте использовать terminate_monitor или изменить показания счетчика, а то вас заспамит сообщениями и ничего хорошо с этого не будет
|
monitor_conditions I_CompareCounter TestCounter = 1
historic_event bla_bla_bla < показать сообщение
set_counter TestCounter 2
end_monitor
historic_event bla_bla_bla < показать сообщение
set_counter TestCounter 2
end_monitor
Так же есть команда которая означает не, пример
|
monitor_event FactionTurnStart not FactionType sweden
terminate_monitor
end_monitor
terminate_monitor
end_monitor
Она указывает, что событие пройдет проверку, только если ход не Швеции
Так же можно вместо not поставить !
|
monitor_event FactionTurnStart ! FactionType sweden
terminate_monitor
end_monitor
terminate_monitor
end_monitor
Иногда нам нужно делать заметки, чтобы сами разобратся что мы написали, через определенное время, или к примеру хотим посмотреть что будет без определенной проверки или команды, тут нам на выручку приходя комментарии, ставятся они просто точная с зяпятой;
|
monitor_event FactionTurnStart ! FactionType sweden
;historic_event war_with_Polan отключаем ибо захотелось
set_counter war_Kiev 5 ; ставим счетчик на 5
terminate_monitor
end_monitor
;historic_event war_with_Polan отключаем ибо захотелось
set_counter war_Kiev 5 ; ставим счетчик на 5
terminate_monitor
end_monitor
все что после точки с зяпятой ; игнорируется
Надеюсь понятно объяснил основы, а теперь немножко о другом, о счетчиках и что с ними едят
Объявляем простой счетчик, который будет часто использоваться на самом то деле, хотя и может использоваться только внутри файла campaign_script
Объявление должно быть в обязательном порядке, и оно в самом начале имеет значение 0
declare_counter < команда обявление
war_start_after_2_ages < условное имя
declare_counter war_start_after_2_ages
Обьявление должно быть перед тем как мы будем использовать наш счетчик, так же оно не должно быть в monitor_event
пример
|
declare_counter war_start_after_2_ages
monitor_event FactionTurnStart FactionType sweden
terminate_monitor
end_monitor
monitor_event FactionTurnStart FactionType sweden
terminate_monitor
end_monitor
Присваиваем счетчику значение
set_counter war_start_after_2_ages 100
Мы можем просвоить любое значение сразу же после обьвяления, оно сработает только 1 раз
|
declare_counter war_start_after_2_ages
set_counter war_start_after_2_ages 100
monitor_event FactionTurnStart FactionType sweden
terminate_monitor
end_monitor
set_counter war_start_after_2_ages 100
monitor_event FactionTurnStart FactionType sweden
terminate_monitor
end_monitor
Добавляем или отнимаем к счетчику значение
inc_counter war_start_after_2_ages -50 или 10
Это условие которое проверяет показатель счетчика
I_CompareCounter
Оно может использовать в условиях монитора
Цитата
monitor_event FactionTurnStart FactionType sweden < когда фракция Швеция начнет свой год
and I_CompareCounter war_start_after_2_ages = 1 < проверяем наше значение
set_counter war_start_after_2_ages 100
end_monitor
and I_CompareCounter war_start_after_2_ages = 1 < проверяем наше значение
set_counter war_start_after_2_ages 100
end_monitor
А так же внутри монитора может использовать
|
monitor_event FactionTurnStart FactionType sweden < когда фракция Швеция начнет свой год
if I_CompareCounter war_start_after_2_ages = 1
set_counter war_start_after_2_ages 100
end_if
end_monitor
if I_CompareCounter war_start_after_2_ages = 1
set_counter war_start_after_2_ages 100
end_if
end_monitor
Операторы = > < ! думаю всем знакомы еще со школы
= равно
< меньше
> больше
<= меньше равно
>= больше равно
!= не равно
Евентовый счетчик, он может использоваться почти везде и не нужно делать объявление, в отличии от простого счетчика counter
Так же любое историческое событие является евент счетчиком, к примеру любое событие из descr_event является счетчиком
event historic new_era_begins
date 180
Когда событие не случилось стоит 0, когда оно случится(в данном случае в 180 году), счетчик примет значение 1
set_event_counter historic_event_Holy_War_2 56
Так же как и в обычном, добавить или отнять у счетчика
inc_event_counter historic_event_Holy_War_2 -50 или 10
Создается случайный счетчик и выбирается случайное число от 1 до 20(границы могут быть и другие от 30 до 100 и т.д.)
generate_random_counter RandomCounter 1 20
Команда совмещает в себе характеристики inc и random, то есть можно к примеру добавить случайное число в рамках от 10 до 20
использовать только на event_counter, к обычному не применять
random_counter_inc RandomCounter 10 20
Отличие от обычного счетчик еще в том, что здесь есть собственная проверка изменяется ли event_counter
Срабатывает в случае изменения какого либо из счетчиков
monitor_event EventCounter
Имя счетчика
EventCounterType
Проверка числа
EventCounter
|
monitor_event EventCounter EventCounterType historic_event_Holy_War_2
and EventCounter > 5
end_monitor
and EventCounter > 5
end_monitor
Так же есть как и в обычном счетчике проверка и может использоваться так же как и обычный
I_EventCounter
|
monitor_event FactionTurnStart FactionType sweden
and I_EventCounter historic_event_Holy_War_2 = 1
set_counter historic_event_Holy_War_2 100
end_monitor
and I_EventCounter historic_event_Holy_War_2 = 1
set_counter historic_event_Holy_War_2 100
end_monitor
А так же внутри монитора может использовать
|
monitor_event FactionTurnStart FactionType sweden
if I_EventCounter historic_event_Holy_War_2 = 1
set_counter historic_event_Holy_War_2 100
end_if
end_monitor
if I_EventCounter historic_event_Holy_War_2 = 1
set_counter historic_event_Holy_War_2 100
end_if
end_monitor
Он может использоватся в трейтах, анчах, тригерах гильдий и т.д., там в принципе будет все выглядить как и в обычных скриптах, кроме файла строительства и наемников
там оно будет выглядить следующим образом в EDB
recruit_pool "iqta'dar" 0 0.08 1 0 requires factions { turks, } and event_counter some_event_counter 1
в EDB так же можно использовать not
recruit_pool "iqta'dar" 0 0.08 1 0 requires factions { turks, } and not event_counter some_event_counter 1
в descr_mercenaries , здесь срабатывает проверка, если event_counter равен 1, когда 0 отключает
unit Numidian Cavalry exp 1 cost 315 replenish 0.04 - 0.13 max 2 initial 0 events { some_event_counter}
Создать событие, появится сообщение о событии, текст берется из historic_events, и так же для него создаться event_counter
historic_event rebel_attack_London
Так же событие можно ограничить по фракциям, к примеру
historic_event rebel_attack_London { england, }
Можно добавить видео
historic_event rebel_attack_London faction/rebel_attack.bik { england, }
Так же можно добавить выбор да или нет, для игрока, для ИИ разве что сделать выбор случайным,
или прописать соответствующие условия, при каких будет принимать или отвергать
historic_event rebel_attack_London true faction/rebel_attack.bik { england, }
создастя отдельно два event_counter с именем события и праставками _accepted и _declined
rebel_attack_London_accepted
rebel_attack_London_declined
Если нажали да
|
monitor_conditions I_EventCounter rebel_attack_London_accepted = 1
set_event_counter rebel_attack_London_accepted 0 или terminate_monitor если событие одноразовое
end_monitor
set_event_counter rebel_attack_London_accepted 0 или terminate_monitor если событие одноразовое
end_monitor
Если нажали нет
|
monitor_conditions I_EventCounter rebel_attack_London_declined = 1
set_event_counter rebel_attack_London_declined 0 или terminate_monitor если событие одноразовое
end_monitor
set_event_counter rebel_attack_London_declined 0 или terminate_monitor если событие одноразовое
end_monitor
Для ИИ можно сделать так
|
monitor_event *****
historic_event rebel_attack_London true faction/rebel_attack.bik { england, }
generate_random_counter random_accept 0 10
if I_EventCounter random_accept <= 5
set_event_counter rebel_attack_London_accepted 1
end_if
if I_EventCounter random_accept > 5
set_event_counter rebel_attack_London_declined 1
end_if
end_monitor
historic_event rebel_attack_London true faction/rebel_attack.bik { england, }
generate_random_counter random_accept 0 10
if I_EventCounter random_accept <= 5
set_event_counter rebel_attack_London_accepted 1
end_if
if I_EventCounter random_accept > 5
set_event_counter rebel_attack_London_declined 1
end_if
end_monitor
Надеюсь все было понятно, если что можете смело задавать вопросы, я почти не кусаюсь