Сообщество Империал: [Статья] Оптимизация скриптов в Medieval 2 Total War, избавляемся от monitor_conditions. - Сообщество Империал

СоциоПат

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

[Статья] Оптимизация скриптов в Medieval 2 Total War, избавляемся от monitor_conditions.
Тема создана: 31 декабря 2020, 11:18 · Автор: СоциоПат
 СоциоПат
  • Imperial
Imperial
Социолог

Дата: 31 декабря 2020, 11:18

По аналогии со старым анекдотом про «голубых» и слабительное – доктор Биттер хочет напомнить назначение форума. А именно – для конструктивного обсуждения игр, серии Тотал Вар в частности, и кооперации при создании пользовательских модификаций к ним. Троллинг и матерные срачи – твердое нет.


Несмотря на однозначное указание о вредном воздействии 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 под один монитор – если будет запрос на это я, разумеется, расскажу, чтобы еще раз напомнить, для чего же все таки нужен форум Империал.
     Похожие Темы
    TВидео Total War: Warhammer I / II/ III
    Видео Total War: Warhammer I / II/ III
    Автор К Кот
    Обновление Мин. назад
    MMedieval Kingdoms: Total War - 1212 AD
    Attila Version
    Автор i inbeat777
    Обновление 56 мин. назад
    TОбсуждение Total War: Pharaoh
    Очередная часть серии игр Total War
    Автор A Arkess
    Обновление Сегодня, 11:03
    Воспользуйтесь одной из соц-сетей для входа
    РегистрацияВход на форум 
    Сообщество ИмпериалИмперский Атриум Имперский Атриум Статьи Библиотеки Обратная Связь
    Стиль:Language: 
    «Империал» · Условия · Ответственность · Визитка · 28 мар 2024, 12:03 · Зеркала: Org, Site, Online · Эльдорадо казино · Gold казино · Счётчики