Автоматизация (скрипты) - ihsoft/TimberbornMods GitHub Wiki
ПРИМЕЧАНИЕ. Этот документ время от времени обновляется по мере добавления новых функций в мод. Однако документация всегда немного отстает, и новейшие функции могут быть еще не описаны. Чтобы узнать про самые свежие функции, попробуйте применить все шаблоны в игре и проверить созданные ими правила через окно редактора правил.
Этот документ был последний раз обновлен для версии 4.7.0 5 июля 2026.
Мод поддерживает два вида правил: готовые и скриптовые. Первый вид сделан для очень конкретных задач и должен считаться "внутренним". Скриптовые правила пользователи собирают через простой скриптовый язык. Такие правила позволяют задавать условия и действия, которые можно менять прямо во время игры. Этот документ объясняет концепции скриптов, операторы и доступные функции.
-
Сигналы: предоставляют строковые или числовые значения. В основном они используются в условиях, но также могут
быть параметрами действий. Когда значение сигнала меняется, связанное правило проверяется заново; если условие
возвращает
true, выполняется действие. - Область действия: сигналы могут быть глобальными (например, смена погоды), привязанными к конкретному зданию (например, уровень ресурсов в инвентаре) или ограниченными районом (например, численность населения).
-
Действия: всегда привязаны к конкретному зданию и выполняются только на нем. Например, у шлюза есть действие
SetHeight, которое неприменимо к складу. - Выполнение: условия проверяются только при изменении сигнала, на который они ссылаются. Они не проверяются по регулярному таймеру.
- Пользовательские сигналы: игроки могут публиковать собственные глобальные сигналы. Если несколько зданий публикуют сигнал с одним именем, поддерживается агрегация: min, max, sum и т.д.
При ручном создании скриптов убедитесь, что скрипт совместим с целевым типом здания, иначе он не скомпилируется. Скрипты можно создавать через визуальный конструктор или писать вручную в редакторе правил для более сложной логики.

Изначально мод использовал Lisp-синтаксис, и он все еще
используется внутри шаблонов. Сейчас UI по умолчанию использует Python-синтаксис, потому что он удобнее для человека.
Синтаксис по умолчанию можно переключить в настройках мода, а для конкретного скрипта можно указать префикс:
#PY для Python или #LP для Lisp.
ПРИМЕЧАНИЕ. Переопределение синтаксиса работает только внутри UI-редактора.
Примеры
-
#LP (eq Weather.Season 'DroughtWeather')разбирается как Lisp независимо от глобальных настроек. -
#PY Weather.Season == 'DroughtWeather'разбирается как Python независимо от глобальных настроек.
Структура правила:
- Условие: должно содержать хотя бы один сигнал. Оно состоит из одного или нескольких логических операторов.
-
Действие: одна инструкция действия, выполняемая когда условие возвращает
true.
Аргументом является любой элемент, возвращающий значение.
-
Строковые константы: должны быть заключены в одинарные или двойные кавычки (например,
'MapleSyrup'). Используйте\"или\', чтобы экранировать кавычки. Если строка заключена в двойные кавычки, одинарные кавычки внутри нее экранировать не нужно (например,"test'test"). -
Числовые константы: вещественные числа с двумя знаками фиксированной точности (например,
1.23). Значения округляются:1.234становится1.23, а1.235становится1.24. - Значения времени выполнения: значения, возвращенные функциями, операторами или сигналами.
ПРИМЕЧАНИЕ. Любая математическая операция округляется до двух знаков после запятой. Учитывайте это в сложных вычислениях.
Примеры
-
123/100дает результат1.23. -
1235/1000округляется до1.24. - Константа
1.235принимается, но сохраняется как1.24.
Операторы работают с аргументами. Они задают, как получить значение из переданных аргументов. Абсолютное большинство операторов имеют два аргумента (бинарные операторы), но есть несколько операторов с одним аргументом (унарные).
Это набор операторов, которые используются для проверки условий.
Как следует из названия, у них всегда ровно два аргумента. Принимаются любые значения, но корректное условие должно ссылаться хотя бы на один сигнал. Иначе оно никогда не будет вызвано: нет сигнала - нет callback при изменении.
Бинарные операторы принимают значения (математические операторы или функции) и возвращают логический результат. Логический результат можно использовать как итог правила-условия или как вход для логического оператора. Для других целей он не подходит.
Этот тип операторов является бинарным. Они требуют ровно два числовых или строковых аргумента. Аргументы могут быть любым типом значения: функцией, сигналом или другим оператором, который возвращает число или строку.
Поддерживаются следующие операторы сравнения:
-
==- равно. Работает для чисел и строк. -
!=- не равно. Работает для чисел и строк. -
>- больше. Только для числовых значений. -
>=- больше или равно. Только для числовых значений. -
<- меньше. Только для числовых значений. -
<=- меньше или равно. Только для числовых значений.
Примеры
ПРИМЕЧАНИЕ. Все числовые значения в скриптах являются вещественными числами, но их точность ограничена двумя знаками после запятой. Это может давать неожиданные эффекты.
-
1.23 == 123/100возвращаетtrue. -
1.24 == 123/100возвращаетfalse. -
1.24 == 1235/1000возвращаетtrue, потому что1.235округляется до1.24перед сравнением. -
Weather.Season == 'DroughtWeather'возвращаетtrue, когда сезон меняется на DroughtWeather. -
'DroughtWeather' == 'DroughtWeather'синтаксически допустимо, но некорректно как условие правила, потому что выражение не содержит сигнала. -
Weather.Season == Weather.Seasonвсегда возвращаетtrueи может использоваться, чтобы реагировать на любое изменение сезона.
Поддерживаются три булевых оператора: and, or и not. Первые два бинарные, последний унарный и инвертирует свой
аргумент.
Операторы имеют порядок приоритета, который влияет на вычисление выражений.
Python-синтаксис поддерживает скобки. В Lisp-синтаксисе они не нужны из-за его структуры.
Примеры
-
1 == 1 and 2 == 3 and 3 == 3возвращаетfalse. -
1 == 1 and (2 == 3 or 3 == 3)возвращаетtrue. -
1 == 1 and 2 == 3 or 3 == 3возвращаетtrue. -
2 > 1 and 3 >= 3возвращаетtrue. -
2 == 2 and not (3 != 3)возвращаетtrue.
Все математические операторы работают с вещественными числовыми аргументами. Каждый аргумент и результат ограничен двумя знаками после запятой (фиксированная точность).
Поддерживаются следующие операторы:
-
arg1 + arg2- сложение. -
arg1 - arg2- вычитание. -
arg1 * arg2- умножение. -
arg1 / arg2- деление.
Приоритет операторов следует стандартным арифметическим правилам. Скобки поддерживаются.
Если нужна логика агрегации, можно использовать функции:
-
min(arg1, arg2, ...)- возвращает минимальное значение. -
max(arg1, arg2, ...)- возвращает максимальное значение. -
round(arg1)- округляет до ближайшего целого.
Примеры
-
round(1 - 0.4). Вычитает0.4из1.0, получает0.6, затем округляет до ближайшего целого:1. -
round(0.4). Округляет0.4до ближайшего целого:0. -
min(0, 0 - 1, 2). Дает значение0:min(0, -1.0, 2.0). -
1 / 0. Ошибка выполнения скрипта: деление на ноль. Игра не упадет, но правило будет навсегда отключено.
В Python сигналы представлены как свойства. Например: Weather.Season. Они предоставляют значение и повторно
уведомляют правило, когда значение меняется.
Сигналы могут возвращать либо число, либо строку, но один и тот же сигнал никогда не работает с обоими типами. Типы проверяются при компиляции и во время выполнения.
- Если результат является строкой, то набор возможных значений заранее определен и обычно невелик.
- Если результат является числом, может применяться допустимый диапазон значений.
Обычно сигналы выполняются только на завершенных зданиях (строительство окончено). Условия и действия можно назначить
незавершенному зданию, но условие не начнет выполняться до изменения состояния. Однако есть специальные сигналы,
работающие до завершения строительства. В их имени есть строка OnUnfinished. Используйте их осторожно: действие
будет выполнено на незавершенном здании, что может привести к неожиданному поведению. Например, действие Pause на
незавершенном здании поставит на паузу строительную площадку, а не само здание.
Глобальные сигналы работают на уровне всего поселения. Они не зависят от здания или района.
| Имя сигнала | Описание |
|---|---|
Debug.Ticker |
Срабатывает каждый игровой тик и возвращает монотонно растущее числовое значение. Игра не должна быть на паузе. Чем выше скорость игры, тем чаще срабатывает сигнал. |
Science.Points |
Срабатывает, когда меняется количество доступных очков науки. Возвращает текущее количество очков науки как положительное целое число. |
Signals.<CustomSignalName> |
Срабатывает при выполнении действия Signals.Set() (см. ниже). Возвращает значение пользовательского сигнала <CustomSignalName>. Возвращаются только числа, проверка диапазона не применяется. |
Time.Day |
Срабатывает при начале нового дня. Возвращает текущий номер дня как положительное целое число. |
Time.MinuteOfDay |
Срабатывает, когда игровое время суток входит в новый 10-минутный интервал. Возвращает минуту дня как целое число в диапазоне 0 - 1430. |
Time.WorkingHours |
Срабатывает, когда поселение переключается между рабочими и нерабочими часами, а также при изменении расписания рабочих часов. Возвращает Working или OffHours. |
Weather.Season |
Срабатывает при смене погодного сезона и возвращает строку текущего сезона. Значения по умолчанию: DroughtWeather, BadtideWeather и TemperateWeather. Другие моды могут добавить больше. |
Примеры
-
Weather.Season == 'DroughtWeather'. Срабатывает при смене сезона на DroughtWeather. -
Signals.MySignal > 0. Срабатывает, когда пользовательский сигналMySignalстановится больше0. -
Time.MinuteOfDay >= 360 and Time.MinuteOfDay < 720. Срабатывает каждые 10 игровых минут, пока текущее время между 06:00 и 12:00. -
Time.WorkingHours == 'OffHours'. Срабатывает, когда рабочие часы заканчиваются или когда расписание меняется во время нерабочих часов.
Пользовательские сигналы - это способ передавать данные между зданиями, чтобы строить правила, зависящие от разных
зданий. В отличие от обычных сигналов, пользовательские сигналы запускаются скриптом через действие Signals.Set().
Вы можете создать пользовательский сигнал на любом здании (или на нескольких зданиях), а затем использовать его в
условиях и действиях того же или других зданий.
Пример:
-
На водомерной рейке можно создать пользовательский сигнал
WaterLevel, который будет равен текущему уровню воды:Если
StreamGauge.Depth > 0, тоSignals.Set('WaterLevel', StreamGauge.Depth) -
На здании с паузой (просто пример) можно поставить его на паузу, если уровень воды слишком высок:
Если
Signals.WaterLevel >= 1.0, тоPausable.Pause()
Чтобы посмотреть, как это может работать в игре, попробуйте "Signals templates."

Пользовательские сигналы можно агрегировать через суффиксы имени: .Min, .Max, .Sum, .Avg и .Count. Агрегация
выполняется по всем зданиям, у которых есть сигнал с тем же именем. Агрегация доступна только для числовых значений.
Одно здание может испускать один и тот же сигнал несколько раз, но для агрегации используется только последнее значение.
| Суффикс агрегатора | Описание |
|---|---|
Signals.<CustomSignalName>.Min |
Возвращает минимальное значение пользовательского сигнала <CustomSignalName> среди всех зданий, которые задают этот сигнал. Если таких зданий нет, результат 0. |
Signals.<CustomSignalName>.Max |
Возвращает максимальное значение пользовательского сигнала <CustomSignalName> среди всех зданий, которые задают этот сигнал. Если таких зданий нет, результат 0. |
Signals.<CustomSignalName>.Sum |
Возвращает сумму всех значений пользовательского сигнала <CustomSignalName> среди всех зданий, которые задают этот сигнал. Если таких зданий нет, результат 0. |
Signals.<CustomSignalName>.Avg |
Возвращает среднее значение пользовательского сигнала <CustomSignalName> среди всех зданий, которые задают этот сигнал. Если таких зданий нет, результат 0. |
Signals.<CustomSignalName>.Count |
Возвращает количество зданий, которые задают пользовательский сигнал <CustomSignalName>. Значение является положительным целым числом. Если таких зданий нет, результат 0. |
Примеры
-
Signals.MyCustomSignal.Min == 1.0. Срабатывает, когда минимальное значение пользовательского сигналаMyCustomSignalровно1. -
Signals.MyCustomSignal.Max > 10. Срабатывает, когда максимальное значение пользовательского сигналаMyCustomSignalбольше10. -
Signals.MyCustomSignal.Count == 2. Срабатывает, если есть два здания, которые могут задавать сигналMyCustomSignal. Правила на этих зданиях не обязаны реально задавать сигнал, но в их скрипте должно быть действиеSignals.Set. Если ни одно здание не может задавать сигнал, результат будет0, и условие не сработает.
Сигналы района доступны только районным зданиям, то есть зданиям, которым требуется соединение дорогой с районным центром.
| Имя сигнала | Описание |
|---|---|
District.Beavers |
Срабатывает при изменении количества бобров, взрослых и детенышей. Возвращает текущее количество бобров как положительное целое число. Если здание не подключено ни к одному району, результат 0. |
District.Bots |
Срабатывает при изменении количества ботов в районе. Возвращает текущее количество ботов как положительное целое число. Если здание не подключено ни к одному району, результат 0. |
District.NumberOfBeds |
Срабатывает при изменении количества спальных мест для бобров. Возвращает общее количество кроватей как положительное целое число. Если здание не подключено ни к одному району, результат 0. |
District.ResourceCapacity.<GoodId> |
Срабатывает при изменении общей вместимости запасов в районе. Вместимость считается только по складам. Выходные инвентари производств не учитываются, хотя могут хранить ресурс. При расчете доли будьте готовы к значениям выше 100%. |
District.ResourceStock.<GoodId> |
Срабатывает при изменении общего запаса ресурса в районе. Возвращаемое значение включает запасы во всех складах и выходных инвентарях зданий. |
Примеры
-
District.Beavers > 0. Срабатывает каждый раз, когда рождается новый бобер. -
District.Bots > 5. Начинает срабатывать, когда количество ботов в районе превышает 5. -
District.Bots > 5.01. Не скомпилируется, потому что аргумент должен быть целым числом, а5.01не является целым. -
District.ResourceStock.Gear / District.ResourceCapacity.Gear < 0.5. Срабатывает, когда заполненность районного инвентаря шестеренками падает ниже 50%. Осторожно: вместимость может быть 0, это вызовет ошибку. -
District.ResourceCapacity.Gear > 0 and District.ResourceStock.Gear / District.ResourceCapacity.Gear < 0.5. Такое громоздкое условие обработает случай нулевой вместимости, но вам, вероятно, понадобится парное правило для случая, когда вместимость равна нулю.
| Имя сигнала | Описание |
|---|---|
Automator.State |
Доступен на зданиях, которые могут передавать сигнал встроенной автоматизации игры. Срабатывает при изменении состояния передатчика и возвращает 1, когда автоматизатор включен, или 0, когда выключен. |
BreedingPod.Progress |
Срабатывает при изменении прогресса капсулы размножения. Возвращает текущий прогресс как процент: 0.0 - 1.0. Обычно значение изменяется шагами по 0.01 и может кратко вернуть 1.0, когда цикл роста завершается. |
Collectable.Ready |
Возвращает количество тайлов, с которых здание может собирать ресурсы. |
Constructable.OnUnfinished.Progress |
Срабатывает при продвижении строительства и возвращает текущий прогресс как процент: 0.0 - 1.0. Когда максимальное значение достигнуто, сигнал больше не срабатывает. |
Constructable.OnUnfinished.State |
Срабатывает, когда строительство здания завершено. Пока строительство идет, значение сигнала - пустая строка, и сигнал не срабатывает. Когда строительство завершено, значение становится finished. Этот переход возможен только один раз за жизнь здания. |
Floodgate.Height |
Срабатывает при изменении высоты шлюза и возвращает текущую настройку высоты. Значение находится в диапазоне от 0.0 до максимальной высоты шлюза. |
Inventory.InputGood.<GoodId> |
Возвращает количество ресурса во входном инвентаре здания. "InputGood" означает ресурс, который носильщики и работники могут принести в здание. Обычно это ингредиент рецепта или топливо. Часть <GoodId> указывает проверяемый ресурс. Ресурс должен быть определен в инвентаре здания в момент компиляции или выполнения скрипта. Некоторые здания могут менять ресурсы инвентаря в зависимости от выбора, поэтому успешно скомпилированный скрипт может позже начать падать, если выбор изменился. На производствах ингредиенты текущего рецепта могут быть допустимыми input-сигналами, даже если они приходят из выбранного рецепта, а не из фиксированного списка инвентаря. |
Inventory.OutputGood.<GoodId> |
По сути то же, что Inventory.InputGood, но возвращает количество ресурса в выходном инвентаре здания (продукт, если это производство). На производствах продукты текущего рецепта могут быть допустимыми output-сигналами, даже если они приходят из выбранного рецепта, а не из фиксированного списка инвентаря. В складах все ресурсы считаются "output", хотя носильщики также могут приносить их туда. |
Manufactory.Recipe |
Срабатывает при смене текущего рецепта производства и возвращает ID текущего рецепта как строку. Если текущего рецепта нет, возвращается пустая строка. |
Manufactory.FinishedRecipe |
Срабатывает, когда производство завершает цикл или когда меняется текущий рецепт. Возвращает количество завершенных производственных циклов для текущего рецепта как неотрицательное целое число. Счетчик сбрасывается в 0 при смене рецепта. |
Plantable.Ready |
Возвращает количество тайлов, на которые здание может сажать растения. |
Power.Supply, Power.Demand
|
Доступны на зданиях, подключенных к механической энергосети. Срабатывают при изменении текущей выработки или потребления сети. Значения являются неотрицательными целыми числами в лошадиных силах. Если здание сейчас не привязано к графу энергосети, результат 0. |
Power.BatteryCharge, Power.BatteryCapacity
|
Доступны на зданиях, подключенных к механической энергосети. Срабатывают при изменении заряда или емкости батарей сети. Значения являются неотрицательными целыми числами в единицах энергии. Если в сети нет батарей или текущего графа энергосети, результат 0. |
Power.BatteryChargeLevel |
Доступен на зданиях, подключенных к механической энергосети. Срабатывает при изменении уровня заряда батарей сети. Возвращает текущую долю заряда батарей как процентное значение: 0.0 - 1.0. Если в сети нет батарей или текущего графа энергосети, результат 0. |
StreamGauge.Depth, StreamGauge.Current, StreamGauge.Contamination
|
Срабатывают при изменении соответствующей характеристики водомерной рейки. Загрязнение является процентным значением в диапазоне 0.0 - 1.0. Остальные характеристики представлены положительными числами: 0.0 и выше. |
Workplace.AssignedWorkers |
Срабатывает при изменении количества работников, назначенных на рабочее место. Возвращает текущее количество назначенных работников как положительное целое число. |
Примеры
-
Inventory.InputGood.Plank > 100.0. Срабатывает каждый раз, когда инвентарь меняется и в нем больше100досок. -
Inventory.OutputGood.Plank == 100. Срабатывает, когда количество меняется и новое значение ровно100предметов. -
BreedingPod.Progress >= 0.99. Срабатывает, когда капсула размножения почти готова. -
Automator.State == 1. Срабатывает, когда передатчик встроенной автоматизации игры включается. -
Power.Demand > Power.Supply. Срабатывает, когда в механической сети выбранного здания не хватает мощности. -
Power.BatteryCapacity > 0 and Power.BatteryChargeLevel < 0.25. Срабатывает, когда в сети есть батареи и их заряд падает ниже 25%. -
StreamGauge.Contamination > 0. Срабатывает при каждом изменении загрязнения. -
StreamGauge.Contamination < 1.01. Не скомпилируется, потому что максимальное допустимое значение1.0. -
Manufactory.Recipe == 'LogsToPlanks'. Срабатывает, когда выбранный рецепт производства становитсяLogsToPlanks. -
Manufactory.FinishedRecipe > 0. Срабатывает после того, как производство завершило хотя бы один цикл текущего рецепта.
Оператор действия выполняет реальный эффект на здании. Его синтаксис - вызов метода в Python:
NameOfTheAction(arg1, arg2, ...). Некоторые действия имеют аргументы, некоторые нет. Аргумент действия должен быть
оператором значения (например, константой или сигналом).
Обычно действие должно выполняться каждый раз, когда условие вычисляется как true. Но иногда действие нужно выполнить
один раз и перестать влиять на здание. Для этого можно усложнить условие или использовать специальный механизм
"run once". Чтобы его использовать, добавьте суффикс .Once к имени действия. Действие будет выполнено, а затем все
правило будет удалено.
ПРИМЕЧАНИЕ. Числовые аргументы в действиях ниже указаны в Python-формате, если не сказано иначе. То есть высота шлюза "1" означает "1.00".
Некоторые действия меняют то же состояние здания, которым может управлять встроенная автоматизация игры. Активные правила Advanced Automation с такими действиями могут блокировать назначение конфликтующей встроенной автоматизации или сами могут быть заблокированы уже настроенной встроенной автоматизацией.
| Имя действия | Описание |
|---|---|
Clutch.Engage(), Clutch.Disengage()
|
Включает или отключает силовую муфту. |
Debug.LogStr(<StringArg>),Debug.LogNum(<NumberArg>)
|
Принимает один аргумент типа number или string и пишет его в игровой лог. Строка в логе содержит ссылку на тип здания и его координаты. Это хороший способ проверять условия правил без реального эффекта на здании. Числовое значение логируется в Lisp-синтаксисе (число 100 означает 1.0). |
Debug.Log(<Format>, ...) |
Продвинутая форма действия логирования, доступная только в режиме редактора скриптов. Позволяет форматировать аргументы. Аргумент Format является строковым литералом, его синтаксис соответствует C# String.Format. Количество placeholders в строке формата должно совпадать с количеством аргументов. Это действие логирует числа как float (Python-синтаксис). |
Dynamite.DetonateAndRepeat(<RepeatTimes>) |
То же, что ниже, но после взрыва динамита новый динамит размещается на том же месте. <RepeatTimes> - целое число, задающее количество повторов размещения. |
Dynamite.Detonate() |
Взрывает динамит. Проверяет, что в области 5x5 вокруг динамита нет бобров или ботов. Однако соседний динамит может сдетонировать автоматически, и для него такая проверка уже не выполняется. |
FillValve.Open(), FillValve.Close(), FillValve.SetHeight(<Height>)
|
Управляет целевой глубиной Fill Valve. Open() задает максимальную поддерживаемую зданием целевую глубину, Close() задает 0, а SetHeight(<Height>) задает указанное значение. Значение должно быть между 0.0 и максимальной целевой глубиной клапана. |
Floodgate.SetHeight(<Height>) |
Устанавливает шлюз на указанное значение. Единственный аргумент действия - желаемая высота шлюза. Это должно быть положительное число, не превышающее максимальную высоту шлюза. |
FlowControl.Open(), FlowControl.Close()
|
Открывает или закрывает поток воды на зданиях с управляемым регулятором источника воды. |
Gate.SetState(<State>) |
Устанавливает состояние ворот. <State> - строковый литерал: open, closed или automated. |
Inventory.StartEmptying(), Inventory.StopEmptying()
|
Включает или выключает режим "очистки" склада. Это действие предлагается только на зданиях с выходным инвентарем и без отдельных входных ресурсов, чтобы случайно не вынести ингредиенты производства. |
Lever.SetState(<State>) |
Устанавливает состояние рычага. <State> - строковый литерал: on или off. |
Manufactory.SetRecipe(<RecipeId>) |
Устанавливает рецепт производства. <RecipeId> - строковый литерал, который должен быть одним из рецептов, доступных производству. Доступность рецепта зависит от конфигурации здания (blueprints рецептов). Если рецепт недоступен в момент выполнения действия, будет вызвана ошибка, а правило будет навсегда отключено. |
Notifications.SetNoticeIcon(<Icon>, <StatusText>) |
Показывает на здании не-alert статус с плавающей иконкой. <Icon> - имя статусной иконки. <StatusText> - обычный текст или ключ локализации с префиксом #. |
Notifications.SetAlert(<Icon>, <StatusText>, <AlertText>) |
Показывает на здании alert-статус. <Icon> - имя статусной иконки. <StatusText> и <AlertText> - обычный текст или ключи локализации с префиксом #. |
Notifications.SetStatus(<Icon>, <StatusText>, <AlertText>, <NeedFloatingIcon>, <IsPriority>) |
Продвинутое действие для ручных скриптов, создающее пользовательский статус здания. <NeedFloatingIcon> и <IsPriority> - числовые boolean-значения: 0 означает false, любое положительное значение означает true. Это действие может не отображаться в визуальном конструкторе. |
Notifications.ClearStatus() |
Очищает текущий notification-статус, заданный notification-действиями. |
Pausable.Pause(), Pausable.Unpause()
|
Ставит здание на паузу или снимает с паузы. Если применить к незавершенному зданию, на паузу будет поставлена/снята строительная площадка. |
Prioritizable.SetHaulers(), Prioritizable.ResetHaulers()
|
Включает или сбрасывает режим здания "Приоритет для носильщиков". Действие успешно включит режим даже если в районе еще нет Hauling Post. Настройка начнет действовать, когда пост будет построен. |
Signals.Set(<SignalName>, <Value>) |
Задает пользовательский сигнал, указанный строковым литералом <SignalName>, в float-значение <Value>. Сигнал с соответствующим именем сработает, и условия на других зданиях смогут отреагировать. Это способ заставить одно здание выполнять правила на основе значений другого здания. Сигнал сработает только если новое значение отличается от предыдущего.ВНИМАНИЕ. Этим механизмом легко создать циклические сигналы, которые будут бесконечно запускать друг друга. Скриптовый движок умеет обнаруживать такие случаи и отключать плохие правила, но отладка может быть болезненной. Рекомендуется включить "verbose logging" в моде, воспроизвести проблему и изучить логи. |
ThrottlingValve.Open(), ThrottlingValve.Close(), ThrottlingValve.SetFlow(<Flow>)
|
Управляет лимитом выходного потока Throttling Valve. Open() отключает лимит и выставляет его на максимум, Close() включает лимит и выставляет 0, а SetFlow(<Flow>) включает лимит и задает указанное значение. Значение должно быть между 0.0 и максимальным лимитом выходного потока клапана. |
Workplace.SetWorkers(<NumWorkers>), Workplace.RemoveWorkers()
|
Задает количество работников в мастерской или полностью убирает их. <NumWorkers> - целое число, новое количество работников. Значение должно быть между 0 и максимальным количеством работников здания.Если все работники убраны, только носильщики смогут приносить ингредиенты в мастерскую. |
Workplace.SetPriority(<Priority>) |
Устанавливает приоритет рабочего места. <Priority> - строковый литерал, новый уровень приоритета. Поддерживаемые значения: VeryLow, Low, Normal, High и VeryHigh. |
Примеры
-
Debug.LogStr('Hello!'). Создаст запись вроде "[DistrictCenter.Folktails@(131, 138, 3)] [Debug Log]: Hello!" -
Debug.LogNum(Floodgate.Height). Запишет текущую высоту шлюза примерно как "[Floodgate.Folktails@(131, 138, 3)] [Debug Log]: 100", где100означает1.0(Lisp-синтаксис!). -
Debug.Log('Floodgate height is: {0}', Floodgate.Height). Запишет текущую высоту шлюза примерно как "[Floodgate.Folktails@(131, 138, 3)] [Debug Log]: Floodgate height is: 1.0". -
Floodgate.SetHeight(1.23). Устанавливает высоту шлюза в1.23, но только если его максимальная высота 2 или выше. Иначе будет ошибка. -
Floodgate.SetHeight(Signals.MyCustomSignal). Устанавливает высоту шлюза в текущее значение пользовательского сигналаMyCustomSignal. В этом случае проверку диапазона нельзя выполнить при парсинге, поэтому скрипт всегда скомпилируется, но может упасть во время выполнения. -
Gate.SetState('automated'). Возвращает ворота в режим встроенной автоматизации игры. -
Lever.SetState('on'). Включает рычаг. -
Notifications.SetAlert('IgorZ.Automation/Alarm', 'Check this building', 'Automation alert'). Показывает alert-статус на здании. -
ThrottlingValve.SetFlow(2.5). Задает лимит выходного потока Throttling Valve в2.5, но только если максимальный лимит позволяет такое значение. -
Pausable.Pause.Once(). Поставит здание на паузу и удалит правило.
ВНИМАНИЕ. Если вы используете значение сигнала как аргумент, помните, что действие привязано к условию. Если условие не сработало, действие не выполнится. Поэтому если вы используете сигнал как значение для действия и хотите, чтобы действие повторно выполнялось при изменении сигнала, этот сигнал также должен быть частью условия правила.
Эти операторы получают данные из реальных игровых компонентов (C# классов), назначенных зданию. Это функциональность для продвинутого скриптинга, поэтому нужно понимать, что вы делаете и какое свойство игрового компонента что означает. Компонент должен существовать на здании, иначе возникнет ошибка парсинга.
-
getvalue(<FullPropertyName>). Возвращает значение свойства. АргументFullPropertyName- строковый литерал форматаClassName.PropertyName, гдеClassName- имя игрового компонента на здании, аPropertyName- имя свойства для чтения. Поддерживаемые типы значений: string, integer, float и boolean. В случае booleantrueявляется значением1, аfalse-0. -
getlen(<FullPropertyName>)возвращает количество элементов в коллекции, если свойство является коллекцией (list, array и т.д.). Для не-коллекции парсинг завершится ошибкой. -
getelement(<FullPropertyName>, <Index>)возвращает элемент коллекции по указанному<Index>(с нуля). Если свойство не является коллекцией или элементов недостаточно, будет ошибка.
В отличие от сигналов, операторы доступа не уведомляют связанное условие об изменении значения свойства. Всегда используйте их вместе с сигналами.
Ниже перечислены распространенные свойства, полезные в скриптах и шаблонах. Это не полный справочник компонентов.
Помните, что эти свойства сами по себе не запускают правила. Используйте их вместе с сигналами.
-
Inventory.Capacity- общая вместимость инвентаря здания. Если инвентарь допускает несколько ресурсов, вместимость будет кратна количеству ресурсов и их вместимостей. -
Inventory.TotalAmountInStock- общее количество всех ресурсов в инвентаре. -
Inventory.IsFull,Inventory.IsEmpty- показывают, полон или пуст инвентарь. Это boolean-значения:true=>1,false=>0. -
Inventory.HasAnyUnreservedStock- показывает, есть ли в инвентаре ресурсы, не зарезервированные носильщиками или работниками. -
Inventory.HasUnwantedStock- показывает, содержит ли инвентарь ресурсы, которые больше не разрешены его текущей конфигурацией. -
Inventory.InputGoods- полный список ID ресурсов, которые инвентарь может принимать (input). -
Inventory.OutputGoods- полный список ID ресурсов, которые инвентарь может отдавать (output). -
SingleGoodAllower.AllowedGood- единственный ресурс, разрешенный на здании. Обычно это склад. -
SingleGoodAllower.HasAllowedGood- показывает, выбран ли ресурс для хранения. В компоненте значение boolean, но в скрипте оно числовое:0=>false; любое другое значение =>true.
-
Workplace.MaxWorkers- максимальное количество работников, которые могут работать на здании. -
Workplace.DesiredWorkers- желаемое количество работников, сейчас выставленное на здании. -
Workplace.NumberOfAssignedWorkers- количество работников, фактически назначенных на здание. -
Workplace.Understaffed,Workplace.Overstaffed- показывают, слишком мало или слишком много работников сейчас на рабочем месте. Это boolean-значения. -
Manufactory.ProductionProgress- текущий прогресс производства:0.0-1.0. -
Manufactory.FuelRemaining- текущий прогресс топлива для активного рецепта:0.0-1.0. -
Manufactory.HasFuel,Manufactory.HasAllIngredients,Manufactory.IsReadyToProduce- boolean-помощники состояния производства.
-
MechanicalNode.NominalBatteryCharge- текущий номинальный заряд батареи в единицах энергии. -
MechanicalNode.NominalBatteryCapacity- текущая номинальная емкость батареи в единицах энергии. -
MechanicalNode.NominalBatteryChargeLevel- доля заряда батареи:0.0-1.0. -
MechanicalNode.Powered- показывает, запитана ли механическая сеть сейчас. -
MechanicalNode.ActiveAndPowered- показывает, активно ли здание и получает ли оно энергию. -
MechanicalNode.PowerEfficiency- текущая эффективность механической сети:0.0-1.0.
-
Floodgate.MaxHeight- максимальная высота шлюза. -
FillValve.MinTargetHeight,FillValve.MaxTargetHeight- абсолютные границы целевой высоты Fill Valve. -
FillValve.TargetDepth,FillValve.AutomationTargetDepth- ручная и stock-automation целевая глубина Fill Valve, измеренная от минимальной целевой высоты. -
ThrottlingValve.MaxOutflowLimit- максимальный лимит выходного потока Throttling Valve. -
ThrottlingValve.OutflowLimit,ThrottlingValve.OutflowLimitEnabled- текущий ручной лимит выходного потока и включен ли он. -
WaterSourceRegulator.IsOpen,WaterSourceRegulator.OpenMode,WaterSourceRegulator.ClosedMode,WaterSourceRegulator.AutomatedMode- текущее состояние управляемого регулятора источника воды.
-
BlockObject.IsFinished,BlockObject.IsUnfinished- показывают, завершено ли здание или все еще строится. -
BlockableObject.IsUnblocked- показывает, что здание не заблокировано. -
PausableBuilding.Paused- показывает, стоит ли pausable-здание сейчас на паузе. -
Emptiable.IsMarkedForEmptying- показывает, помечено ли здание сейчас для очистки.
Скрипты могут содержать инструкции, которые выполняются во время парсинга. Результат таких инструкций заменяет их текст. После этого итоговое выражение разбирается как обычно. Эта семантика имеет смысл только в template blueprints - инструкции препроцессора выполняются при применении шаблона к зданию, поэтому здание получает кастомизированный скрипт.
Инструкции препроцессора оборачиваются тегами {% и %}. Они не могут быть вложенными. Все, что находится внутри тегов,
будет разобрано и выполнено как Lisp-скрипт. Python-синтаксис в препроцессоре не поддерживается. Даже с префиксом
переопределения синтаксиса, потому что он работает только в UI-редакторе.
Инструкции препроцессора также могут быть логическими операторами. В этом случае результат препроцессинга всегда пустая
строка, но выражение обязано вычислиться в true. Если нет, будет ошибка, и правило нельзя будет применить к зданию.
Примеры
- Выражение
(act Floodgate.SetHeight {% (getvalue Floodgate.MaxHeight) %})превратится в(act Floodgate.SetHeight 200)на шлюзе высотой2.00. - Предусловие
{% (ge (getvalue Floodgate.MaxHeight) 200) %}(act Floodgate.SetHeight 200)будет отклонено на шлюзах, максимальная высота которых меньше 2.