 
        
        - •Раздел 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 Модификация данных игры
11 Планы оптимизации
Планы оптимизации (Optimization plans) — способ автоматизации назначения обязанностей, пусть и более сложный, чем ручной, которым мы пользовались до этого. Для того, чтобы воспользоваться им, откройте Optimization > New Optimization Plan (Оптимизация > Новый план оптимизации), после чего должно появиться такое окно:
 
Это не самый простой для понимания экран, так что давайте сначала взглянем на каждую опцию отдельно. Это не так очевидно, но оптимизатор обязанностей работает, назначая работы в зависимости от коэффициентов. Два числа в правом верхнем углу говорят о том, как много дварфов рассматриваются и сколько из них будут иметь обязанности, связанные с текущей схемой. Если вы не выберете никаких дварфов, оптимизатор будет работать со всеми доступными дварфами, но если вы выберете дварфа (щелкнув на его имени) или нескольких (проведя курсором по столбцу с именами нужных дварфов, зажав левую кнопку мыши; этого же можно добиться, щелкнув сначала на первом дварфе, а затем, зажав shift, на последнем), то действие оптимизатора будет ограничено этими дварфами.27 Вы можете использовать фильтры, чтобы выводить только тех, которые нужны — я рекомендую использовать скрипт «Available for Work» (Доступны для работы), который мы написали в прошлой главе.
Давайте используем оптимизатор для простой задачи — скажем, назначение избранных, оптимизированных по роли углежога (wood burner) и сталевара (furnace operator) среди нескольких кандидатов. Откройте New optimization plan снова. Установите «max jobs per dwarf» (максимальное число работ на дварфа) равным 1. Очевидно, это ограничит число работ, которые могут быть назначены дварфу до одной, что имеет смысл в свете того, что мы стремимся сделать.
Отключите «auto-assign haulers» (автоназначение носильщиков) — это более продвинутая возможность, мы скоро поговорим о ней. Пока же установите «Percent Total Jobs» на 100. Это число говорит оптимизатору, что мы хотим, чтобы все работы, которые могут быть назначены этим дварфам, были назначены в рамках нашей схемы оптимизации.
Наведите курсор мыши на пустую область окна и щелкните правой кнопкой мыши, чтобы вызвать меню рабочих обязанностей, и выберите из списка сначала «Wood Burning», затем «Smelting». Таким образом вы можете добавить в список любое число обязанностей, а также с легкостью удалить любую из уже добавленных, щелкнув на ней правой кнопкой мыши и выбрав «Remove Selected» (Удалить выбранное).
 
Первое, что вы здесь видите — работа, т.е. название обязанности, которую вы выбрали. Далее следует роль, с помощью которой оптимизатор будет проверять ваших дварфов на соответствие: по умолчанию по одному дварфу на работу. Здесь можно использовать и пользовательские роли. Для нашей задачи, впрочем, этого не требуется. Далее, priority (приоритет) изменяет вес соответствия роли при учете, позволяя, таким образом, оставить высокоприоритетные обязанности в фаворитах. Ratio (коэффициент) меняет в выборке количество дварфов, которым оптимизатор назначит эту обязанность. Коэффициент любой конкретной работы делится на сумму всех коэффициентов, что дает процент работ, которые будут назначены в рамках этой обязанности, который, в свою очередь, умножается на число работ, которые будут назначены, что дает нам последний столбец — число работников.
Здесь мы не собираемся ничего менять: все вроде в порядке, одна работа на wood burning, одна на furnace operating. Давайте назовем наш план «Test plan» и сохраним его. Теперь мы можем отредактировать или удалить этот план оптимизации из соответствующего меню. Вы можете протестировать его почти вживую, нажав кнопку «Test Optimize» (Тест оптимизации). Однако, чтобы подтвердить изменения нужно нажать на новую кнопку, появившуюся на главной панели — кнопку Optimize (Оптимизировать).
 
Этой кнопки не будет на экране, если у вас нет сохраненных планов оптимизации. Когда же у вас несколько планов оптимизации, у кнопки появляется выпадающее меню, из которого можно выбрать активный скрипт — он также делает его скриптом по умолчанию, сберегая вам один щелчок мыши.
Теперь выбор любого числа дварфов (или, что проще, никого, а следовательно — всех) и нажатие Optimize разделит их между углежогами и сталеварами. Если число выбранных дварфов нечетное, то группы будут поделены неравномерно — в моем случае вышло три сталевара, но только два углежога.
 
Давайте усложним наш план, добавив в него носильщиков. Для редактирования плана зайдите в меню «Optimizer», выберите пункт «Edit Optimization Plan», затем нужный план оптимизации. В этот раз давайте включим «auto-assign haulers» и установим его в 50%. Затем установите в 50 и «percent total jobs». Нажмите «Test Optimize» в нижней части окна, чтобы увидеть, как повлияет на дварфов этот план (в прошлый раз я специально обошел этот шаг стороной, чтобы показать использование с готовым планом и изменения на главной панели). Как вы догадались, дварфы поделятся на два лагеря: по четверти получат назначения в области сталеварения и производства угля, а оставшаяся половина станет носильщиками, у которых другие работы будут отключены. Важное замечание: планы оптимизации работают должным образом только если роли настроены по умолчанию (то, что мы назвали «рейтингом навыка» в главе «Роли»).
 
Наша маленькая группа из пяти дварфов разделилась так: один wood burner, один furnace operator, три носильщика. И снова части не равны, потому что пять не делится на два поровну. Носильщиков получилось больше, чем работников. Поэтому числа, которые указаны в окне — только примерные. Если они не сходятся, то и результат будет несколько подогнан.
Давайте углубимся еще немного. В этот раз установим максимальное число работ на дварфа равным 2 и снова протестируем скрипт, чтобы увидеть, как это отразится на результате:
 
Может быть вы очень проницательны и догадались сами, но все-таки совсем не очевидно, что здесь происходит. Почему у нас только один носильщик, черт возьми? Мы сгенерировали уже три сценария оптимизации, так что давайте используем их, чтобы разобраться в работе оптимизатора.
Параметр «percent total jobs» (общий процент работ) — ограничитель, который влияет на то, как много работ может быть назначено из числа потенциально возможных работ. В первом примере это число было установлено в 100, так что оптимизатор смог дать каждому дварфу работу. Так как параметр «max jobs per dwarf» (максимальное число работ на дварфа) был установлен в 1, то каждый дварф мог получить только одну работу. А раз уж у нас в рассмотрении две обязанности с одинаковым приоритетом, то половина дварфов получит задачу wood burning, и только ее, а другая половина — furnace operating, и больше ничего.
Во втором примере мы снизили ограничение до 50 процентов, оставив число работ на дварфа равным 1. Это значит, что пятидесяти процентам дварфов будет назначена одна работа. Действительно, половина половины дварфов получит обязанность wood burning, другая четверть — furnace operating, если не обращать внимание на небольшое жульничество со стороны программы, из-за того, что пять не делится на два нацело.
Но как ведет себя программа в последнем примере? В нем ограничение «percent total jobs» (давайте называть его просто пределом обязанностей) все еще равно 50, но «max jobs per dwarf» (будем называть его пределом работ) был установлен в 2. У нас по-прежнему две рассматриваемых обязанности, но теперь мы также имеем два «места» для их назначения. В результате пятьдесят процентов дварфов получили wood burning, но затем, независимо от этого, пятьдесят процентов получили furnace operating. Логично, что если оптимизатору позволили назначать работы дважды, а не один раз, то дварфам, которые и в том, и в другом лучше среднего по группе, получили обе работы сразу. Предел обязанностей теперь регулирует не то, как много работ могут быть назначены для двух обязанностей вместе, но то, как много их может быть назначено по-отдельности. В схеме с одной работой на дварфа, две обязанности должны соперничать друг с другом за пятидесятипроцентный предел работ, а потому каждая получала только по 25 процентов. Но в схеме с двумя работами на дварфа это уже не имеет значения, обе обязанности получают свои 50 процентов.
Иным языком, количество обязанностей, которые будут включены, определяется следующим равенством (предел обязанностей нужно делить на сто, потому что он выражен в процентах):
 
А число назначений для каждой обязанности по-отдельности, которое зависит от ratio (коэффициента), определяется по формуле:
 
Подведем итог: что случится если мы оставил предел работ равным 2, а предел обязанностей повысим до ста процентов? По логике получается, что каждая потенциально возможная работа будет назначена — и это подтверждается тестом. Действительно, вот что выходит:
 
Так что же со странным назначением задач по переноске в третьем примере? Если вы следовали моим примерам и не смотрели на всплывающую подсказку в блоке Hauler Percent (Процент для носильщика), вы могли (ошибочно) прийти к заключению, основанному на поведении параметра в первом и втором примерах, где оптимизатор назначил работы точному числу дварфов из выборки. Все не так: этот процент скорее что-то вроде заключительного этапа оптимизации, где каждый дварф рассматривается с точки зрения того, сколько обязанностей ему уже назначено.
По сути, оптимизатор назначает обязанности, а затем проходит по списку и спрашивает каждого дварфа сколько обязанностей ему назначено: одна? две? ни одной? Затем он сравнивает полученный результат со значением «Hauler Percent» (с этого момента «порог носильщика») и, если процент назначенных работ по отношению к максимально допустимому меньше этого числа, то ему будут назначены работы по переноске. В примере выше у каждого дварфа включены две работы, поэтому никто из дварфов не попадает в пятидесятипроцентный порог, соответственно, работы по переноске назначать некому. Во втором примере трое дварфов после назначения не получили обязанностей совсем, поэтому им были присвоены работы по переноске.
Третий же пример демонстрирует тот аспект поведения оптимизатора, который важно знать: ограничение числа носильщиков строгое. Первый и пятый дварфы имеют по одной назначенной обязанности, а это половина от двух — максимального числа обязанностей, которое им может быть назначено. Получается пятьдесят процентов. Это число на границе порога, но не ниже его. Чтобы получить поведение, которого мы хотим, порог нужно повысить до ста процентов:
 
Да, требуемое число — 100, а не 51 процент, таково уж поведение программы.
Осталось добавить только одно: вы можете исключить некоторые группы дварфов прямо из окна оптимизации, сняв соответствующие флажки:
 
Слева направо: исключить активных военных, исключить отряды, исключить знать, исключить госпитализированных.
Исключение госпитализированных дварфов важно, если вы хотите, чтобы к работе приступили сразу, но не так важно, если никто не травмирован (или никто из выборки), но может быть даже вредно, если значительное число ваших дварфов имеют излечимые увечья. Исключение дворян как правило не оправдывает себя: назначенные будут работать как обычно, а дворяне, приближенные ко двору, будут бездельничать несмотря на количество назначенных работ. Обычно нет смысла учитывать дворян. Потому не исключать их — здравое решение. Между «активными военными» и «отрядами» есть некоторое совпадение: дварфы считаются находящимися на активной службе, когда они на вызове и, соответственно, отображаются в игре по их военной должности. Конечно, сначала им надо вступить в отряд. Исключать отряды важно, когда ваши военные отданы своему ремеслу, но едва ли полезно, если у вас есть ополчение, которое используется только чтобы «атаковать эту тварь прямо сейчас» и никогда не распускается.
Оказалось, что пятый дварф в наших примерах на самом деле знатного положения, просто я не исключал его из процесса оптимизации. Если же сделать это, получится именно то, чего вы ожидаете — он будет проигнорирован. В качестве приятного побочного эффекта он еще и избавил нас от проблемы «пять делить на два».
 
