Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Dwarf_Therapist_Manual_20.4_(russian).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.36 Mб
Скачать

10.1 Написание сложных скриптов

Теперь, когда мы освоились с базовым синтаксисом, давайте используем фильтрацию для решения нетривиальной задачи. Когда в крепость прибывает волна мигрантов, вы отбираете лучших и отправляете работать сразу, а остальных оставляете на выполнение общих задач, которые многочисленны и легко назначаются: перетаскивание вещей, уборка камня, строительство стен и других конструкций, выравнивание и гравировка жилых площадей и так далее. Интеграция новой волны в крепость — медленный, но неизбежный процесс, заключающийся в постепенном отборе дварфов для нужных задач. Один станет ювелиром, другой будет управляться с печами, третий пойдет строить систему насосов, четвертый отправится в армию, а кто-то так и останется в носильщиках.

В главе «Использование ролей» мы говорили о комбинировании группировки, сортировки и ролей для поиска идеального для конкретной задачи дварфа, но споткнулись об ограничения группировки: не существует простого способа отделить дварфов, «устроенных на полный рабочий день», вверенных своим задачам, от «частично трудоустроенных». У нас было два выхода: группировать их по волнам миграции, что вовсе не гарантирует, что мы выберем лучшего из доступных в крепости дварфа, или не группировать совсем, но тогда нужно искать среди дварфов, которые уже работают над чем-то — есть риск переключить задачи дварфа, которого вы ранее отобрали для какой-то роли (проблема обсуждалась в главе «Назначение ников»). Теперь мы собираемся искусно разрешить эту маленькую проблему с помощью скрипта.

Я собираюсь вербовать дварфов на постройку башни.

Прежде чем писать скрипты, вы должны задать себе вопрос: «дварфа с какими характеристиками я ищу» (если вы пишете добавляющий скрипт), или «дварфы с какими характеристиками мне не нужны» (если вы пишете исключающий скрипт). В данном случае мы пишем добавляющий фильтр, чтобы выявить мигрантов, доступных для работы над полезными задачами. Если мы подумаем над тем, что это в себе заключает, мы придем к некоторому набору «характеристик» таких дварфов (в порядке возрастания сложности):

  1. У них включены все работы по переноске (hauling labors). Это один из самых очевидных индикаторов дварфа из «рабочего класса», но отнюдь не достаточный.

  1. У них нет ников. Подразумевается, что вы следуете совету из главы «Назначение ников», а значит дварфы с никами уже отобраны для какой-то работы. На самом деле мы не собирается соблюдать это условие, потому что такие дварфы исключены из списка первым условием.

  1. У них включены обязанности masonry и/или stone detailing, но навык не выше «adequate» для первой профессии (т.к. производством блоков из камня занимаются опытные каменщики), и не выше «competent» во второй (я считаю достижение уровня «skilled» переломным моментом, после которого гравировщик заслуживает того, чтобы покинуть ряды пролетариата).

  1. Они не являются военными (по крайней мере не постоянно). В моей крепости арбалетчики всегда остаются арбалетчиками/охотниками.

  1. У них не включены «ключевые» обязанности, которые характеризуют избранных дварфов: горное и плотничье дело, рубка леса, резьба по камню, готовка, пивоварение, любая из задач металлообработки, ювелирного и портняжного дела. Список может варьироваться в зависимости от ваших предпочтений, но большинство игроков убеждены, что назначение конкретных задач конкретным дварфам позволяет быстро добиться высоких результатов.

  1. У них есть навык в бесполезных или нишевых задачах (ветеринария, разделка животных, разделка рыбы, пчеловодство, производство воска и мыла) и соответствующие обязанности включены. Никто не добавляет себе лишних хлопот, отключая их, до тех пор, пока дварф не понадобится для чего-то конкретного.

Теперь у нас есть достаточно всесторонний список характеристик «дварфа из рабочего класса» и над большинством из них пришлось поломать голову, потому что они совсем не очевидны. К счастью, этот набор условий ясен и достаточно точен для работы. Для написания сложного скрипта разобьем его на отдельные шаги.

Включены все работы по переноске

Проверка этого условия довольно нудная: нужно писать строку вызовов labor_enabled() == true, объединенных оператором AND. Однако, есть более умное решение, требующее меньшего труда как от нас, так и от программы. Нужно просто вызвать total_assigned_labors() дважды: с учетом работ по переноске и без них. Остается только вычесть одно из другого, чтобы получить нужное число. Поведение данной команды неочевидно: она учитывает не только обычные работы по переноске, но и две медицинские. Об этом не сказано в документации (ладно, теперь сказано). Поэтому наше волшебное число — 11:

d.total_assigned_labors(true) —

d.total_assigned_labors(false) == 11

И если вы введете это в редактор скриптов и нажмете «Test Script» (Тестировать скрипт), вы увидите следующее:

Один только этот скрипт уменьшил число кандидатов с 70 до 38! По сути, возможность фильтровать дварфов по тому, включены ли у них работы по переноске чрезвычайно полезна сама по себе, а в программе нет другого способа сделать это. Давайте оставим его! Дадим скрипту имя и нажмем «Save» (Сохранить). Можно еще быстренько написать скрипт для тех, у кого работы по переноске отключены:

d.total_assigned_labors(true) –

d.total_assigned_labors(false) <= 10

Masonry или Stone Detailing включены, но уровень навыка низкий

Каменщик — обязанность под номером 13, а выравнивание стен — 12. Напишем отдельные тесты: один срабатывает, если у дварфа включена обязанность masonry, но уровень навыка в ней ниже трех, другой — если включена stone detailing, но уровень навыка ниже четырех. Теперь объединим их оператором ИЛИ. Вот как готовая должна выглядеть готовая проверка условия:

(((d.labor_enabled(13) == true

&& d.labor_rating(13) < 3)

|| d.labor_enabled(13) == false)

|| ((d.labor_enabled(12) == true

&& d.labor_rating(12) < 4)

|| d.labor_enabled(12) == false))

Создадим новый «готовый к работе» скрипт, объединив в них два условия, которые уже написали, связав их оператором И. Пока все идет хорошо. Вперед, к следующему условию!

Они не числятся военными

Это элементарно, просто проверка того, находится ли дварф в активном отряде, предваренная оператором НЕ:

!d.active_military()

Не так уж полезно для самостоятельного скрипта — для этого есть группировка. Идем дальше!

У них не включены «ключевые обязанности»

Тут придется часто подглядывать в табличку:

!d.labor_enabled(47) && !d.labor_enabled(48) &&

!d.labor_enabled(29) && !d.labor_enabled(11) &&

!d.labor_enabled(33) && !d.labor_enabled(38) &&

!d.labor_enabled(45) && !d.labor_enabled(50) &&

!d.labor_enabled(51) && !d.labor_enabled(49) &&

!d.labor_enabled(00) && !d.labor_enabled(53) &&

!d.labor_enabled(46)

Если вы уберете отрицания и используете конструкции ИЛИ вместо И, то получится список ключевых дварфов вашей крепости. Я называю его «Ключевые дварфы». Он очень полезен, когда надо избавиться от новых мигрантов, которые, будучи новичками в работе, предназначенной, скажем, моему легендарному лесорубу, чтобы они не занимали место в мастерской плотника, пока настоящий плотник сидит и бьет баклуши.

Нишевые и бесполезные обязанности до сих пор не отключены

Полная противоположность предыдущего условия: там нам нужны были отключенные ключевые обязанности, а здесь — включенные бесполезные, но т.к. это — логическое выражение (а нам не доступна конструкция if), то оно чуть сложнее. Важно знать, что уровень навыка dabbling обозначается нулем, а полное отсутствие навыка — -1. Пришло время еще больше заглядывать в таблицу:

((d.labor_rating(16) > 0 && d.labor_enabled(16))

|| (d.labor_rating(16) <= 0)) &&

((d.labor_rating(43) > 0 && d.labor_enabled(43))

|| (d.labor_rating(43) <= 0)) &&

((d.labor_rating(26) > 0 && d.labor_enabled(26))

|| (d.labor_rating(26) <= 0)) &&

((d.labor_rating(72) > 0 && d.labor_enabled(72))

|| (d.labor_rating(72) <= 0)) &&

((d.labor_rating(71) > 0 && d.labor_enabled(71))

|| (d.labor_rating(71) <= 0))

Все условия написаны. Узрите готовый скрипт!

(d.total_assigned_labors(true)-

d.total_assigned_labors(false) == 11) &&

// проверка masonry и stone detailing

(((d.labor_enabled(13) == true && d.labor_rating(13) < 3) ||

d.labor_enabled(13) == false) ||

((d.labor_enabled(12) == true && d.labor_rating(12) < 4) ||

d.labor_enabled(12) == false)) &&

!active_military() &&

(!d.labor_enabled(47) && !d.labor_enabled(48) &&

!d.labor_enabled(29) && !d.labor_enabled(11) &&

!d.labor_enabled(33) && !d.labor_enabled(38) &&

!d.labor_enabled(45) && !d.labor_enabled(50) &&

!d.labor_enabled(51) && !d.labor_enabled(49) &&

!d.labor_enabled(00) && !d.labor_enabled(53) &&

!d.labor_enabled(46)) &&

((d.labor_rating(16) > 0 && d.labor_enabled(16)) ||

(d.labor_rating(16) <= 0)) &&

((d.labor_rating(43) > 0 && d.labor_enabled(43)) ||

(d.labor_rating(43) <= 0)) &&

((d.labor_rating(26) > 0 && d.labor_enabled(26)) ||

(d.labor_rating(26) <= 0)) &&

((d.labor_rating(72) > 0 && d.labor_enabled(72)) ||

(d.labor_rating(72) <= 0)) &&

((d.labor_rating(71) > 0 && d.labor_enabled(71)) ||

(d.labor_rating(71) <= 0))

В процессе написания этого скрипта у нас получились три других полезных скрипта, которые, как я думаю, неплохо демонстрируют их применение.26 К сожалению, Dwarf Therapist не предоставляет возможность экспортировать и импортировать скрипты. А жаль, ведь скрипты бывают довольно сложными, а копирование чужих скриптов вручную — занятие нудное, к тому же любая ошибка или опечатка вероятнее всего выведет из строя весь скрипт. Если вам понравились написанные нами скрипты, не создавайте себе проблем, просто скопируйте их.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]