Как избавиться от одного из наиболее проблемных операторов, чтобы ускорить быстродействие мода.
Автор: bitterhowl
Дата: 31 дек 2020, 11:18 · Просмотров: 1 065
Дата: 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 под один монитор – если будет запрос на это я, разумеется, расскажу, чтобы еще раз напомнить, для чего же все таки нужен форум Империал.