- •Раздел I Введение
- •1 Что такое Dwarf Therapist?
- •2 Установка
- •Раздел II Основы
- •3 Подключение к Dwarf Fortress
- •4 Главное окно
- •4.1 Просмотр рабочих обязанностей
- •4.2 Режимы просмотра
- •4.3 Группировка и фильтрация
- •4.4 Индикатор популяции и панель статуса.
- •4.5 Главная панель
- •4.6 Плавающие панели
- •4.7 Главное меню
- •5 Управление дварфами
- •5.1 Правка рабочих обязанностей
- •5.2 Использование группировки
- •5.3 Использование сортировки
- •5.4 Групповые указания
- •5.5 Назначение ников
- •5.6 Дополнение. Управление животными
- •6 Настройки
- •6.1 Настройка внешнего вида экрана
- •Раздел III Продвинутые возможности
- •7 Роли
- •7.1 Составляющие роли
- •7.2 Использование ролей
- •7.3 Создание пользовательских ролей
- •7.4 Экспорт и импорт пользовательских ролей
- •8 Пользовательские профессии
- •8.1 Создание пользовательских профессий
- •8.2 Экспорт и импорт профессий
- •9 Пользовательские режимы просмотра
- •9.1 Создание собственного режима просмотра
- •9.2 Экспорт и импорт режимов просмотра
- •Раздел IV Экспертные возможности
- •10 Скрипты фильтрации
- •10.1 Написание сложных скриптов
- •11 Планы оптимизации
- •11.1 Экспорт и импорт планов оптимизации
- •12 Дополнение: Сканирование памяти
- •Раздел V Приложение
- •13 Горячие клавиши
- •14 Модификация данных игры
10.1 Написание сложных скриптов
Теперь, когда мы освоились с базовым синтаксисом, давайте используем фильтрацию для решения нетривиальной задачи. Когда в крепость прибывает волна мигрантов, вы отбираете лучших и отправляете работать сразу, а остальных оставляете на выполнение общих задач, которые многочисленны и легко назначаются: перетаскивание вещей, уборка камня, строительство стен и других конструкций, выравнивание и гравировка жилых площадей и так далее. Интеграция новой волны в крепость — медленный, но неизбежный процесс, заключающийся в постепенном отборе дварфов для нужных задач. Один станет ювелиром, другой будет управляться с печами, третий пойдет строить систему насосов, четвертый отправится в армию, а кто-то так и останется в носильщиках.
В главе «Использование ролей» мы говорили о комбинировании группировки, сортировки и ролей для поиска идеального для конкретной задачи дварфа, но споткнулись об ограничения группировки: не существует простого способа отделить дварфов, «устроенных на полный рабочий день», вверенных своим задачам, от «частично трудоустроенных». У нас было два выхода: группировать их по волнам миграции, что вовсе не гарантирует, что мы выберем лучшего из доступных в крепости дварфа, или не группировать совсем, но тогда нужно искать среди дварфов, которые уже работают над чем-то — есть риск переключить задачи дварфа, которого вы ранее отобрали для какой-то роли (проблема обсуждалась в главе «Назначение ников»). Теперь мы собираемся искусно разрешить эту маленькую проблему с помощью скрипта.
Я собираюсь вербовать дварфов на постройку башни.
Прежде чем писать скрипты, вы должны задать себе вопрос: «дварфа с какими характеристиками я ищу» (если вы пишете добавляющий скрипт), или «дварфы с какими характеристиками мне не нужны» (если вы пишете исключающий скрипт). В данном случае мы пишем добавляющий фильтр, чтобы выявить мигрантов, доступных для работы над полезными задачами. Если мы подумаем над тем, что это в себе заключает, мы придем к некоторому набору «характеристик» таких дварфов (в порядке возрастания сложности):
У них включены все работы по переноске (hauling labors). Это один из самых очевидных индикаторов дварфа из «рабочего класса», но отнюдь не достаточный.
У них нет ников. Подразумевается, что вы следуете совету из главы «Назначение ников», а значит дварфы с никами уже отобраны для какой-то работы. На самом деле мы не собирается соблюдать это условие, потому что такие дварфы исключены из списка первым условием.
У них включены обязанности masonry и/или stone detailing, но навык не выше «adequate» для первой профессии (т.к. производством блоков из камня занимаются опытные каменщики), и не выше «competent» во второй (я считаю достижение уровня «skilled» переломным моментом, после которого гравировщик заслуживает того, чтобы покинуть ряды пролетариата).
Они не являются военными (по крайней мере не постоянно). В моей крепости арбалетчики всегда остаются арбалетчиками/охотниками.
У них не включены «ключевые» обязанности, которые характеризуют избранных дварфов: горное и плотничье дело, рубка леса, резьба по камню, готовка, пивоварение, любая из задач металлообработки, ювелирного и портняжного дела. Список может варьироваться в зависимости от ваших предпочтений, но большинство игроков убеждены, что назначение конкретных задач конкретным дварфам позволяет быстро добиться высоких результатов.
У них есть навык в бесполезных или нишевых задачах (ветеринария, разделка животных, разделка рыбы, пчеловодство, производство воска и мыла) и соответствующие обязанности включены. Никто не добавляет себе лишних хлопот, отключая их, до тех пор, пока дварф не понадобится для чего-то конкретного.
Теперь у нас есть достаточно всесторонний список характеристик «дварфа из рабочего класса» и над большинством из них пришлось поломать голову, потому что они совсем не очевидны. К счастью, этот набор условий ясен и достаточно точен для работы. Для написания сложного скрипта разобьем его на отдельные шаги.
Включены все работы по переноске
Проверка этого условия довольно нудная: нужно писать строку вызовов 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
не предоставляет возможность экспортировать
и импортировать скрипты. А жаль, ведь
скрипты бывают довольно сложными, а
копирование чужих скриптов вручную —
занятие нудное, к тому же любая ошибка
или опечатка вероятнее всего выведет
из строя весь скрипт. Если вам понравились
написанные нами скрипты, не создавайте
себе проблем, просто скопируйте их.
