Сообщество Империал: Оптимизация скриптов в Medieval 2 Total War, избавляемся от monitor_conditions. - Моддинг Medieval 2: Total War - Medieval 2: Total War - Библиотека Статей - Сообщество Империал

Сообщество ИмпериалБиблиотека Статей Medieval 2: Total War Моддинг Medieval 2: Total War Оптимизация скриптов в Medieval 2 Total War, избавляемся от monitor_conditions. Проекты

Информация

bitterhowl
  • Автор: bitterhowl
  • Добавлено: 31 дек 2020, 11:18
  • Просмотров: 1 065

Последние Статьи

Актуальные бонусы в казино 888starz
Актуальные бонусы в казино 888starzФонд Игровых · 28 мар 2024, 23:35
World of Infinitas - 2024 Missions (Zero Hour)
World of Infinitas - 2024 Missions (Zero Hour)CountBagaturMonte · 25 мар 2024, 20:18
Онлайн радио и его возможности
Онлайн радио и его возможностиСоциоПат · 18 мар 2024, 22:08

Оптимизация скриптов в Medieval 2 Total War, избавляемся от monitor_conditions.

Как избавиться от одного из наиболее проблемных операторов, чтобы ускорить быстродействие мода.
Автор: bitterhowl bitterhowl
Дата: 31 дек 2020, 11:18 · Просмотров: 1 065
По аналогии со старым анекдотом про «голубых» и слабительное – доктор Биттер хочет напомнить назначение форума. А именно – для конструктивного обсуждения игр, серии Тотал Вар в частности, и кооперации при создании пользовательских модификаций к ним. Троллинг и матерные срачи – твердое нет.


Несмотря на однозначное указание о вредном воздействии monitor_conditions на кремниевые умы и сердца, даже на пороге 2021 года встречаются скрипты, активно использующие этот оператор. Следом идут отзывы пользователей о низкой производительности. Еще в 2016 году появились сведения о том, что это такое и как бороться. Сейчас, почти 5 лет спустя, есть смысл прицельно продублировать и уточнить информацию.

Оператор monitor_conditions по смыслу практически непрерывно проверяет определенные условия на предмет их совпадения с заданной величиной. Например, условие на номер хода 345 – I_TurnNumber = 345. Это значит, что с момента начала кампании движок 5 раз в секунду проверяет этот параметр на предмет совпадения условий все время, пока игрок не нажмет Exit. Полезная ли это активность все 344 хода до нужного? Сколько раз будет проверено это условие? А ведь есть вариант, что игрок и не дойдет до этого хода вообще и все проверки были впустую. Другой пример -

monitor_conditions I_EventCounter help_accepted = 1


Здесь подразумевается, что игрок сделал определенный выбор в предложенном историческом сообщении и нажал «да». А если нет? Но всю игру каждые 5 секунд движок проверяет это условие.

Специально для тех, кто хочет сделать свои моды на Второмедь более играбельными в 2021 году, есть способ. Существует такой event – EventCounter, это событие происходит, когда счетчик событий меняет значение. Это редкое событие, которое не требует рутинной проверки и не нагружает движок. Как правило, изменение значения таких счетчиков задается в коде примерно в одно и то же время – конец хода ребелов, начало/конец хода фракции игрока. Отдельно срабатывают счетчики событий да/нет, когда игрок делает выбор. В любом случае, это более оптимально, чем мониторить начало хода всех персонажей на карте через CharacterTurnStart или начало хода поселений через SettlementTurnStart и даже хода фракции через FactionTurnStart, чтобы привязать к этому событию нужные вам эффекты.

Требуется одно уточнение – для того, чтобы все условия распознавались движком под монитором EventCounter, они должны быть независимыми (если термин некорректен, программисты простите меня), т.е. иметь префикс «I_», например вот «зависимое» условие TurnNumber, а вот независимое - I_TurnNumber. Соответственно, при составлении скрипта вы ищете в Докудемонс 4.0 только те, которые имеют I_ и подходят под ваши задачи.
Дальше просто, вот например такой чудесный код из Беллума 6.3:
monitor_conditions I_EventCounter help_accepted = 1
console_command add_money -3000
set_event_counter help_accepted 0
set_event_counter help_arrival 1
end_monitor

monitor_conditions I_EventCounter help_arrival = 1
if I_SettlementSelected Roma
     create_unit Rome, Mercenary Spearmen, num 2, exp 1, arm 1, wep 0
set_event_counter help_arrival 0
end_monitor


Здесь мониторятся целых два события – положительный выбор игроком предложения о предоставлении военной помощи и получение этой военной помощи, которое происходит, если игрок выберет поселение Рим на страткарте. Вот эти вещи 5 раз в секунду проверяет движок всю дорогу, пока идет кампания.

Мы делаем вот так:
monitor_event EventCounter EventCounterType help_accepted
and EventCounter = 1
console_command add_money -3000

set_event_counter help_accepted 0
set_event_counter help_arrival 1
end_monitor


Теперь это срабатывает только в момент, когда игрок нажал ДА на историческое событие с предложением выбора. Уличная магия.

Второй монитор мы меняем вот так –
monitor_event SettlementSelected I_SettlementSelected Roma (либо SettlementName Roma, если на первый вариант ругается лог и скрипт не сработал)
if I_EventCounter help_arrival = 1
     create_unit Rome, Mercenary Spearmen, num 2, exp 1, arm 1, wep 0
set_event_counter help_arrival 0
end_if
if... - здесь мы можем привязать любые иные ситуации, когда выбран Рим на карте, но нужны другие условия, все варианты под один монитор
...end_if  
end_monitor


Есть еще способ увязать все EventCounter под один монитор – если будет запрос на это я, разумеется, расскажу, чтобы еще раз напомнить, для чего же все таки нужен форум Империал.
    Воспользуйтесь одной из соц-сетей для входа
    РегистрацияВход на форум 
    Сообщество ИмпериалБиблиотека Статей Medieval 2: Total War Моддинг Medieval 2: Total War Оптимизация скриптов в Medieval 2 Total War, избавляемся от monitor_conditions. Обратная Связь
    Стиль:Language: 
    «Империал» · Условия · Ответственность · Визитка · 24 апр 2024, 00:35 · Зеркала: Org, Site, Online · Счётчики