Модинг нац. фокусів (Focuses)

Увага! Це переклад оригінальної сторінки National focus modding - Hearts of Iron 4 Wiki.

Я не є автором оригінального контенту. Переклад виконано за допомогою інструментів штучного інтелекту та може містити неточності. Оригінал знаходиться за вказаним посиланням.

Дерева національних фокусів визначаються у файлах /Hearts of Iron IV/common/national_focus/*.txt. Як і більшість інших файлів, назва файлу не має значення і використовується лише для організації. Один файл може містити більше одного дерева фокусів або жодного.

1. Дерево фокусів

Дерево фокусів визначається за допомогою блоку focus_tree = { ... }. Використовуються наступні аргументи:

  • id = my_focus_tree визначає ID, який використовує дерево фокусів. Його визначення є обов'язковим, і збіг призведе до помилки. ID в основному використовується для тригера has_focus_tree та ефекту load_focus_tree, підказки яких використовують його як ключ локалізації.
  • country = { ... } — це блок MTTH (Середній час до настання події), який присвоює оцінку дереву фокусів, визначаючи, яке з них використовується в грі. Це оцінюється перед початком гри, і перевірка практично ніколи не оновлюється[a]. Дерево фокусів з найвищою оцінкою буде завантажено для країни. За замовчуванням оцінка починається з 1. Типове використання виглядає так:
    country = {
        factor = 0
        modifier = {
            add = 20
            original_tag = TRA
        }
    }
    У цьому випадку країни, що походять від Трансільванії (тобто сама країна та будь-які відгалуження громадянської війни або колабораціоністського уряду, як це забезпечується тригером original_tag), матимуть оцінку 20, тоді як усі інші країни матимуть оцінку 0. Припускаючи, що немає іншого дерева фокусів, де Трансільванія має вищу оцінку країни, це забезпечить завантаження цього дерева фокусів для неї.
  • default = yes встановлює дерево фокусів як стандартне. Загалом, має бути одне стандартне дерево фокусів, не більше і не менше. Дерево фокусів, позначене як стандартне, означає, що якщо всі інші дерева фокусів мають оцінку країни 0, замість них буде обрано це дерево. Крім того, країна, що починає з деревом фокусів, не з'явиться в розділі "малі країни" в меню "цікаві країни" перед початком гри. Якщо це пропущено в дереві фокусів, воно вважається нестандартним.
  • reset_on_civilwar = no не визначається за своїм ефектом. Натомість, так обробляються дерева фокусів у громадянських війнах, незалежно від того, чи встановлено reset_on_civilwar і як саме:
    Коли починається громадянська війна, початкова країна завжди продовжуватиме використовувати дерево фокусів. Фокус, який вона виконує, не буде призупинено або скасовано самою громадянською війною. Для повстанця дерево фокусів, яке він використовує, буде оцінено на початку громадянської війни, призначаючи одне залежно від значення country = { ... } кожного дерева. Якщо для повстанської країни використовується те саме дерево фокусів, що й для початкової країни на момент початку громадянської війни, кожен фокус, завершений початковою країною, буде завершено для повстанської країни, включаючи встановлення того ж прогресу фокуса для того, що виконується початковою країною на даний момент. В іншому випадку прогрес фокуса буде втрачено.
  • shared_focus = TAG_focusname встановлює, що дерево фокусів включатиме вказаний спільний фокус та кожен фокус, пов'язаний з ним через передумови. Встановлення цього на неіснуючий фокус спричиняє аварійне завершення гри при завантаженні в головне меню.
  • continuous_focus_position = { x = 1200 y = 100 } — це позиція верхнього лівого кута меню безперервних фокусів у пікселях. Для порівняння, за замовчуванням[b], палітра безперервних фокусів має позицію 50 по осі X та 1000 по осі Y. Якщо обидва x та y встановлені на 0 або позиція не визначена для дерева, вона скидається до стандартної позиції.
  • initial_show_position = { ... } визначає початкову позицію камери при першому відкритті дерева фокусів. Існує 2 способи її організації:
    • focus = TAG_focusname змусить камеру центруватися на вказаному фокусі зокрема. Він буде точно у верхньому центрі екрана, враховуючи зсуви.
    • x = 12 y = 0 визначає точну позицію верхнього центру камери. Це використовує ту саму систему координат, що й звичайні фокуси, за замовчуванням одиниця x дорівнює 96 пікселям, а одиниця y — 130 пікселям[c].
    Це також приймає offset = { ... }, додаючи вказані значення до відповідних позицій, якщо умови в блоці тригерів trigger = { ... } виконані для країни. Наприклад, це застосує модифікатор і призведе до позиції x = 13, y = 1, якщо країна — BHR:
    initial_show_position = {
        x = 17
        y = 0
        offset = {
            x = -4
            y = 1
            trigger = {
                tag = BHR
            }
        }
    }
  • focus = { ... } — це самі фокуси. Кожен фокус, розміщений у дереві фокусів, буде. Фокуси повинні знаходитися всередині focus_tree = { ... }, щоб гра знала, до якого саме дерева фокусів їх призначити. Якщо блок focus = { ... } опиняється поза focus_tree = { ... } або всередині іншого focus = { ... }, це позначається в лозі помилок як "focus" будучи неочікуваним токеном, що виправляється коригуванням дужок за потреби.

1.1. Приклади

Чистий мінімум, з 2 фокусами:

Середнє дерево, з 2 фокусами:

1.2. Ярлики

Ярлики використовуються для додавання навігаційних кнопок у нижньому лівому куті, які при натисканні переміщують камеру до певного фокуса.

Параметри:

  • name = lockey, локалізована назва, яка буде відображатися на кнопці.
  • target = focus_id, фокус, до якого слід перемістити камеру.
  • scroll_wheel_factor = , масштабування, чим вище значення, тим більше масштабування (між 0 та 1).
  • trigger = { ... }, блок тригерів, що визначає, чи повинна бути видима кнопка ярлика, опціонально. (Якщо істинно, це не перевизначить умови дозволу цільового фокуса.)

Приклад визначення ярлика:

shortcut = {
  name = GER_oppose_hitler_shortcut
  target = GER_oppose_hitler_ww 
  scroll_wheel_factor = 0.485
  trigger = {
    has_dlc = "Gotterdammerung"
  }
}

1.3. Вбудоване вікно

Вбудовані вікна фокусів — це загальні вбудовані компоненти, які можна додати до дерева фокусів, подібно до вікна безперервних фокусів, об'єкта скриптового GUI. Наразі підтримують лише відображення інформації та жодної взаємодії.

1.3.1. Визначення

Визначення для вбудованих вікон знаходяться в /Hearts of Iron IV/common/focus_inlay_windows/*.txt.

Для посібника, написаного розробниками гри, див. Щоденник розробників | Модинг.

Параметри:

  • window_name = gui_component_name назва скриптового GUI, який слід використовувати.
  • internal = якщо істинно, то вбудоване вікно видно лише самій країні (за замовчуванням no).
  • visible = { ... } чи повинно бути видиме вбудоване вікно, коли невидиме, жодних оцінок не буде зроблено.
  • scripted_images = { ... } список зображень, які повинні мати динамічні спрайти.
    • = { ... } назва іконки (повинна бути підкомпонентом "gui_component_name"). Список можливих gfx для іконки, вибирається перший, що оцінюється як істинний.
      • = { ... }/yes Якщо надано тригер, він буде оцінений з областю видимості країни дерева фокусів. Якщо встановлено "yes", він завжди буде використовуватися. Примітка: "yes" зазвичай є останнім записом у списку, який діє як стандартний випадок.

Приклад визначення вбудованого вікна:

inlay_window_id = {
  window_name = gui_component_name
  internal = yes
  visible = {
    visibility_triggers
  }
  scripted_images = {
    advisor_portrait = {
      gfx_name = {
        has_completed_focus = TAG_focus_name_example
      }
      gfx_name_fallback = yes
    }
  }
}

1.3.2. Оголошення

Вбудоване вікно повинно бути оголошено в дереві фокусів. Для дерева фокусів можна визначити будь-яку кількість вбудованих вікон.

Параметри:

  • id = inlay_window_id ідентифікатор вбудованого вікна.
  • position = { x = y = } позиція на дереві, той самий синтаксис та масштаб, що й позиція безперервного фокуса.

Приклад оголошення вбудованого вікна:

inlay_window = {
  id = ger_inner_circle_inlay_window
  position = { x = 4500 y = 1150 }
}

2. Національні фокуси

Це вікі, що підтримується спільнотою. Якщо ви помітили помилку, будь ласка, допоможіть її виправити.

ID для фокуса визначається за допомогою id = TAG_focusname. Хоча необов'язково додавати префікс тегу країни до ID фокуса, це краще робити, щоб уникнути збігу ID фокусів з різних дерев фокусів. Наявність однакового ID фокуса в різних деревах фокусів призводить до помилок, таких як пошкоджені лінії передумов та ефекти або тригери, наприклад complete_national_focus або has_completed_focus, що не працюють коректно. Замість цього можна використовувати спільні фокуси, щоб розмістити той самий фокус у різних деревах фокусів.

2.1. Назва та опис

Назва фокуса залежно від увімкненої мови визначається в /Hearts of Iron IV/localisation/, використовуючи ID фокуса як ключ локалізації. Зокрема, для англійської мови це визначається в будь-якому файлі /Hearts of Iron IV/localisation/english/*_l_english.yml з кодуванням UTF-8-BOM. Бажано використовувати нові файли локалізації, коли це можливо, замість перезапису файлів базової гри, щоб не доводилося змінювати це для сумісності з останніми версіями, і для цього файл повинен мати нову назву, якої немає в базовій грі, але він все одно повинен закінчуватися на _l_english.yml, щоб правильно завантажуватися. ID фокуса використовується як ключ локалізації для встановлення назви увімкненою мовою, тоді як опис використовує ID фокуса з доданим _desc:

l_english:
 TAG_focus_name: "Приклад фокуса"
 TAG_focus_name_desc: "Опис прикладу фокуса"

2.2. Позиція

Позиція фокуса визначається за допомогою атрибутів x = 5 та y = 1. За замовчуванням одиниця x дорівнює 96 пікселям, а одиниця y — 130 пікселям[c]. Іншими словами, фокус безпосередньо під іншим фокусом мав би різницю в 1 одиницю по y, тоді як фокус безпосередньо праворуч від іншого мав би різницю в 2 одиниці по x. За замовчуванням це відносно верхнього лівого кута дерева: більше значення x зміщує фокус праворуч, більше значення y — вниз.

Також можливо і бажано (для фокусів з передумовами) зробити позицію фокуса відносною до іншого фокуса за допомогою relative_position_id = TAG_other_focus. Це позиціонуватиме фокус відносно цього фокуса, додаючи значення x та y до позиції іншого фокуса (після розрахунку його власного relative_position_id). Це дозволяє більшу гнучкість у дизайні дерева фокусів, дозволяючи легко змінювати позицію всієї гілки одночасно завдяки оновленню позиціонування дочірніх фокусів. Це також дозволяє використовувати пізніший offset = { ... } лише у верхньому фокусі кожної гілки, яку потрібно перемістити. Наприклад, якщо фокус A має x = 1 y = 2, фокус B позиціонується відносно фокуса A і має x = 3 y = 4, то фокус B буде розташований загалом на 4 кроки праворуч і 6 кроків вниз від верхнього лівого кута. Фокус C, позиціонований відносно фокуса B при x = -1 y = 1, тоді буде розташований на 3 кроки праворуч і 7 кроків вниз від верхнього лівого кута. Гра може поводитися нестабільно при неправильному ID відносної позиції. Рекурсія (наприклад, фокус, позиціонований відносно самого себе, або фокус A та фокус B, позиціоновані відносно один одного) може спричинити аварійне завершення гри, оскільки неможливо визначити точну позицію фокуса, і фокус також повинен знаходитися в тому ж дереві фокусів, щоб аргумент працював належним чином.

Зміна позиції фокуса на основі виконання умови робиться за допомогою offset = { ... }. Значення x = 10 та y = -3 будуть додані до позиції фокуса, якщо умови в trigger = { ... } виконані для країни при завантаженні дерева фокусів. Це виглядає так:

offset = {
    x = -5
    trigger = {
        has_dlc = "Poland: United and Ready"
    }
}

Це, зокрема, перемістить фокус на 5 одиниць вліво, якщо увімкнено DLC "Poland: United and Ready". Цю перевірку також можна оновити під час сесії за допомогою ефекту mark_focus_tree_layout_dirty[d], застосовуючи зсув, якщо істинно.

2.3. Взаємодія з іншими фокусами

prerequisite = { focus = TAG_other_focus } визначає фокуси, необхідні для завершення, щоб цей фокус став доступним. Щонайменше один фокус у передумові повинен бути завершений, щоб позначити передумову як істинну, і кожна передумова повинна бути завершена, щоб взяти фокус. Якщо жодна з передумов не знаходиться в тому ж дереві фокусів, то фокус не з'явиться. Іншими словами, оператор АБО робиться шляхом розміщення 2 фокусів усередині передумови як prerequisite = { focus = TAG_other_focus_1 focus = TAG_other_focus_2 }, тоді як оператор І робиться шляхом розміщення двох різних передумов наступним чином:

prerequisite = { focus = TAG_other_focus_1 }
prerequisite = { focus = TAG_other_focus_2 }

Ця система не може представити кожне булеве логічне розташування, таке як A ∨ (B ∧ C) (де A, B і C представляють, чи завершено фокус) або з чимось, що використовує заперечення. У цьому випадку можна замість цього поставити оператор АБО для будь-якого з фокусів, необхідних для завершення цього, і використовувати тригер has_completed_focus у блоці available = { ... } з необхідними інструментами керування потоком. Можна використовувати власну підказку тригера, щоб гравцеві було легше зрозуміти.

mutually_exclusive = { focus = TAG_other_focus } робить цей фокус неможливим для вибору, якщо вказаний фокус було завершено. Якщо обидва фокуси взаємовиключні один до одного, то стрілки взаємної виключності будуть показані у вікні дерева фокусів. Взаємна виключність до кількох фокусів зазвичай робиться шляхом розміщення кількох focus = TAG_focusname в одному mutually_exclusive, але визначення кількох mutually_exclusive також можливе.

Ні передумови, ні взаємна виключність не вимагають, щоб інший фокус знаходився в тому ж дереві фокусів. Це означає, що його можна використовувати зі спільними фокусами для оголошення звичайного, неспільного фокуса як взаємовиключного або передумови без будь-яких помилок, навіть якщо використовується в дереві фокусів, що не містить цього фокуса.

Різниця між передумовами та використанням has_completed_focus у блоці available = { ... } полягає в тому, що передумови відображаються як лінії у вікні дерева національних фокусів і відображаються окремо від інших тригерів у підказці фокуса.

Існує проблема, яка призводить до неправильної роботи ліній передумов: дублікати ID фокусів у різних деревах фокусів. У цьому випадку гра може прийняти позицію фокусів як позицію в іншому дереві фокусів, що містить ті самі фокуси, що призводить до того, що вони, здається, пов'язані з порожніми місцями або починаються всередині них. Це також може зламати алгоритм генерації шляху та змусити його використовувати неправильні спрайти поворотів, які відображатимуться пошкодженими навіть у деревах, які не мають дублікатів. Щоб уникнути цього, слід уникати дублікатів ID фокусів. Простий спосіб значно зменшити ймовірність — це додавати префікс ID фокусів тегом країни (наприклад, TAG_focus_name) або чимось іншим, унікальним для дерева фокусів (наприклад, REGION_focus_name для спільного регіонального дерева). Якщо одне й те саме дерево фокусів слід використовувати для кількох країн, це можна зробити, маючи лише одне дерево фокусів, де country = { ... } дерева налаштовано так, щоб бажання його використовувати було найвищим для кількох країн замість однієї; якщо одну й ту саму гілку дерева фокусів слід використовувати в кількох різних деревах фокусів, то спільні фокуси можуть досягти саме цього.

Крім того, гра передбачає, що передумова фокуса розміщена над фокусом, який її вимагає, і вона не може правильно згенерувати шлях до фокуса в іншому випадку, що відображатиметься як шлях, що використовує неправильні спрайти на поворотах у 90°.

2.4. Іконка

Загальний огляд спрайтів

Для завантаження GFX гра використовує систему спрайтів. Спрайти — це визначення в коді, які прив'язують назву до файлу зображення, а також опціонально додають додаткову інформацію, таку як анімація, кількість кадрів, спосіб завантаження зображення тощо. Це означає, що розміщення зображення в папці gfx недостатньо для його роботи, спрайт також повинен використовувати цей файл зображення.

Спрайти визначаються в будь-якому файлі /Hearts of Iron IV/interface/*.gfx (це окремо від gfx/interface/), який відкривається текстовим редактором. Щоб створити новий файл .gfx, можна створити текстовий файл і перейменувати його, змінивши розширення (у Windows Провідник повинен показувати розширення, що він не робить за замовчуванням). Зокрема, спрайти визначаються всередині блоку spriteTypes = { ... }, щоб відокремити їх від шрифтів та стрілок на карті, які також визначаються в цій папці, тоді як найпростіший спрайт з найменшою кількістю обов'язкових властивостей — це spriteType = { ... }. Найпростіше визначення спрайта виглядає так:

spriteTypes = {
    spriteType = {
        name = GFX_first_sprite                         # У деяких випадках початок з GFX_ є обов'язковим для роботи.
        texturefile = gfx/interface/folder/filename.dds # Папка та назва файлу не мають значення, доки вони правильні
    }                                                   # Для розділення папок можна використовувати лише пряму косу риску '/' (може бути подвоєна як '//').
    spriteType = {                                      # Зображення не обов'язково має бути .dds, оскільки .tga та .png є прийнятними.
        name = GFX_second_sprite
        texturefile = gfx/interface/folder2/filename2.dds
        noOfFrames = 2 # Розділяє зображення на 2 половини, між якими можна динамічно перемикатися в GUI
    }
}

У цьому випадку створюється спрайт з назвою GFX_first_sprite, до якого прив'язується зображення /Hearts of Iron IV/gfx/interface/folder/filename.dds, і аналогічно другий спрайт. Другий спрайт буде розділений на 2 кадри: це визначається тим, що ліва половина зображення є першим кадром, а права половина — другим (більше кадрів далі розділятимуть зображення горизонтально). Це не робить спрайт анімованим, лише вмикає опцію перемикання між двома половинами за потреби. GFX_second_sprite:1 служить посиланням на перший кадр, і GUI можна налаштувати для зміни показаного кадру залежно від контексту, наприклад, з радіостанціями. Щоб додати анімацію, використовується frameAnimatedSpriteType.

Ніколи не є обов'язковим копіювати файл базової гри для зміни спрайта. Якщо є дублікати визначень спрайта з однаковою назвою в різних файлах, гра надасть пріоритет тому, який буде оцінено пізніше, на основі назви файлу, а старіший спрайт буде повністю проігноровано. Це можна забезпечити, починаючи назву файлу заміни символом, що знаходиться пізно в таблиці символів ASCII. Зазвичай для цієї мети використовується мала літера 'z'. Наприклад, щоб змінити кількість кадрів у GFX_idea_traits_strip на 10, можна визначити спрайт з такою назвою з 10 кадрами у файлі мода modname/interface/zz_replace.gfx замість копіювання файлу базової гри. Оскільки більшість файлів .gfx визначають невід'ємні частини користувацького інтерфейсу, їх копіювання може призвести до того, що завантажені файли мода втратять спрайти після великого оновлення гри, що відображатиметься в грі як стандартне зображення, яким за замовчуванням є собака помилок. Щоб полегшити тягар необхідності перевіряти файли інтерфейсу, найкраще ніколи не копіювати файли .gfx, якщо тільки додаткові зміни не будуть активно шкідливими для мода, як, наприклад, з interface/subuniticons.gfx.

У фокусі іконка призначається рядком icon = GFX_focus_icon. Це призначає два спрайти фокусу, зокрема:

  • Звичайний спрайт з назвою GFX_focus_icon. Використовується у вікні опису фокуса та у вікні дерева фокусів, коли фокус недоступний, виконується або був завершений.
  • Спрайт для анімації блиску з назвою GFX_focus_icon_shine_shine в кінці). Використовується у вікні дерева фокусів для фокусів, які наразі доступні, та у вікнах політики країни та дипломатії для фокуса, який наразі виконується. Оскільки гра не використовує назви файлів при оцінці, розміщення визначення spriteType у файлі з "shine" у назві не є ні необхідним, ні достатнім. Використовується лише назва спрайта, яка повинна бути такою ж, як у звичайного спрайта, з доданим _shine в кінці. Найпоширеніша помилка, коли блиск не працює, — це недотримання цього правила іменування.

Якщо один з них не визначено або визначено неправильно, замість відповідного спрайта буде використано іконку відсутності фокуса Goal unknown.png, однак робочий спрайт продовжуватиме використовуватися. Якщо texturefile посилається на неіснуючий файл, чи то неправильний шлях до папки[e], чи назва файлу, включаючи розширення, іконка фокуса відображатиметься повністю прозорою. За замовчуванням базова гра зберігає зображення для іконок фокусів у папці /Hearts of Iron IV/gfx/interface/goals/ та спрайти у файлах interface/goals.gfx та interface/goals_shine.gfx. Оскільки немає причин копіювати файли до мода, і це призведе до необхідності оновлювати файл після великого оновлення для використання нових спрайтів, найкраще створити новий файл у папці для визначень спрайтів. Нижче наведено приклад файлу інтерфейсу, який визначає обидва спрайти:

Приклад файлу інтерфейсу:

При копіюванні з шаблону зауважте, що потрібно змінити animationmaskfile в кожній анімації всередині спрайта з блиском разом з texturefile та name.

2.5. Динамічний вигляд

dynamic = yes дозволяє назві та іконці фокуса бути динамічними. Зокрема, це дозволяє використовувати скриптовану локалізацію в назвах фокусів та динамічну іконку. Якщо false або не встановлено, це все одно дозволить їх використовувати, але замість цього він обере одну на початку гри і ніколи не змінить її.

Динамічні іконки обробляються подібно до назв або описів подій: замість одного icon = GFX_focus_example фокус може містити кілька icon = { ... } одночасно, кожне з унікальним тригером. У фокусі буде використано першу можливу іконку. icon = { ... } складається з trigger = { ... }, який повинен бути виконаний країною, щоб іконка була обрана, та value = GFX_focus_example, який визначає 2 спрайти, що використовуються для фокуса.

Приклад визначення динамічного фокуса, з усіма іншими опціональними аргументами пропущеними:

focus = {
    id = TAG_political_focus # У локалізації, TAG_political_focus: "[THIS.GetRulingIdeology] політичний фокус"
    icon = {
        trigger = { has_government = democratic }
        value = GFX_focus_example_democratic
    }
    icon = {
        value = GFX_focus_example_fallback
    }
    dynamic = yes
}

2.6. Тригери

Див. також: Тригери

Щоб взяти фокус, крім передумов фокуса, повинні бути виконані умови в блоці available = { ... }. Це функціонує як блок І, тому кожен з тригерів повинен бути істинним для виконання. Області видимості можна використовувати для перевірки умов для інших країн або всередині штатів. За замовчуванням область видимості — це країна, що виконує фокус. Наприклад, цей приклад вимагає, щоб країна мала більше 10% стабільності, а штат 294 належав Катару:

available = {
    stability > 0.1
    294 = { is_owned_by = QAT }
}

bypass = { ... } схожий, але для обходу фокуса. Обхід фокуса позначає фокус як завершений, але не надає його ефектів у нагороді за завершення, замість цього фокус може мати bypass_effect = { ... }. Те саме стосується й available: це блок І, який за замовчуванням передбачає країну, що виконує фокус. bypass_if_unavailable = yes можна використовувати, щоб фокус автоматично обходився, як тільки блок available = { ... } не виконується, без необхідності переносити тригери.

allow_branch = { ... } використовується, щоб вказати, коли фокус повинен бути видимим. Це перевіряється лише при першому завантаженні дерева фокусів. Однак цю перевірку також можна оновити під час сесії за допомогою ефекту mark_focus_tree_layout_dirty[d], роблячи фокус видимим або невидимим залежно від того, чи він істинний чи ні. За замовчуванням фокус також буде заборонено, якщо будь-який з батьківських фокусів (встановлених передумовами) заборонено. Однак фокус, що містить allow_branch у своєму визначенні, перевірятиме лише свій власний статус дозволу, все ще відображаючись, якщо він має заборонених батьків. Це означає, що якщо гілка налаштована на заборону за певних умов, перший фокус у будь-якій підгілці, яка має власні умови для дозволу, також повинен містити умову батьківської гілки всередині себе, тоді як інші фокуси можуть взагалі не мати визначеного allow_branch, оскільки він успадковується від батьків.

available_if_capitulated = yes встановлює, що фокус можна завершити під час капітуляції. За замовчуванням це встановлено на false.

cancel_if_invalid = no та continue_if_invalid = yes визначають, як обробляти фокус, якщо блок available = { ... } стає хибним під час його виконання. За замовчуванням вони істинні та хибні відповідно. Якщо обидва встановлені на false, фокус призупиниться, коли блок available = { ... } буде хибним. Це не видалить статичний модифікатор gain_focus, який за замовчуванням призводить до витрати 1 політичної влади на день при виконанні фокуса.

cancel = { ... } визначає додаткові умови, які скасують фокус, якщо будуть виконані. Зазвичай це поєднується з cancel_if_invalid = no.

historical_ai = { ... } визначає, коли ШІ може обрати цей фокус з увімкненим історичним фокусом. Це не гарантує, що він обере цей фокус, а скоріше запобігає його вибору, коли хибно. Це має пріоритет над порядком фокусів, наданим у планах стратегії ШІ: якщо ШІ мав би виконати цей фокус наступним за планом, але historical_ai = { ... } хибно, а історичний фокус увімкнено, то він не зможе цього зробити.

2.7. Ефекти

Див. також: Ефекти

Основна нагорода фокуса виконується за допомогою completion_reward = { ... }. Це виконує кожен ефект у вказаних областях видимості в тому порядку, в якому вони розміщені у файлі. Передбачувана область видимості — це країна, що виконує фокус. Наприклад, це додасть 100 політичної влади країні, що виконує фокус, і запустить подію країни my_event.0 для Оману:

completion_reward = {
    add_political_power = 100
    OMA = { country_event = my_event.0 }
}

Підказку фокуса можна змінити за допомогою complete_tooltip = { ... }, який також є блоком ефектів. Це було б еквівалентно розміщенню вмісту нагороди всередині hidden_effect та використанню effect_tooltip у тій самій нагороді. Це може бути корисно, якщо підказка нагороди виглядає захаращеною. Наприклад, триразове використання random_owned_controlled_state з тим самим ефектом у кожному може призвести до захаращеної підказки, оскільки кожен штат та його ефекти відображатимуться окремо. Але якщо замість цього код встановлює прапор штату для кожного штату в нагороді, а в підказці використовує every_state, обмежений тими, що мають прапор штату, він покаже той самий ефект, що виконується для 3 штатів одночасно, скорочуючи його до третини від того, що було.

Крім того, select_effect = { ... } використовується для виконання ефекту при виборі фокуса. Це не має підказки, що відображається гравцеві. Це також автоматично робить фокус неможливим для скасування вручну. Його все ще можна скасувати автоматично, якщо налаштовано на це, тому в більшості випадків краще встановити його так, щоб він не скасовувався, якщо недійсний, щоб запобігти багаторазовому спрацьовуванню ефектів усередині, оскільки немає способу виконати ефект при скасуванні фокуса.

Крім того, bypass_effect = { ... } використовується для виконання ефекту при обході фокуса.

Фокус ще не позначено як завершений під час виконання ефектів. Це означає, що будь-яка перевірка has_completed_focus, запущена всередині, поверне false. У деяких випадках це може бути перешкодою, найчастіше при використанні allow_branch (оскільки ефект для оновлення перевірки не працюватиме належним чином, якщо розміщений у фокусі). Можна розглянути деякі альтернативи:

  • Прапори країни для відстеження завершення фокуса. Оскільки прапори країни встановлюються негайно, доки встановлення передує вимозі, це працюватиме.
  • Затримка ефектів, які вимагатимуть завершення фокуса. Зазвичай це робиться шляхом запуску прихованої події. Якщо зроблено без затримки, подія буде запущена одразу після завершення фокуса, що не призведе до помітної затримки для гравця, але все одно виконає ефекти по порядку.
  • Примусове позначення фокуса як завершеного. Це, наприклад, можна зробити за допомогою load_focus_tree для того ж дерева фокусів із збереженням завершених фокусів. Це не перерве виконання нагороди за завершення.

2.8. Фільтри пошуку

Це вікі, що підтримується спільнотою. Якщо ви помітили помилку, будь ласка, допоможіть її виправити.

Фільтри пошуку для кожного фокуса встановлюються за допомогою search_filters = { ... }. У цьому блоці кожен фільтр пошуку, який має фокус, розміщується всередині, розділений пробілами. Наприклад, наступне призначить FOCUS_FILTER_MANPOWER та FOCUS_FILTER_POLITICAL фокусу: search_filters = { FOCUS_FILTER_MANPOWER FOCUS_FILTER_POLITICAL }. Ці фільтри використовуються в меню пошуку у верхньому правому куті вікна дерева національних фокусів.

Фільтр фокуса не визначається в жодному файлі, а створюється динамічно для кожного дерева фокусів. Кожен з них використовує спрайт такий самий, як його назва, але з доданим GFX_ на початку. Наприклад, це визначення в будь-якому файлі /Hearts of Iron IV/interface/*.gfx буде використано для FOCUS_FILTER_MY_MOD:

spriteType = {
    name = GFX_FOCUS_FILTER_MY_MOD
    texturefile = gfx/interface/focusview/filter/my_mod_icon.dds
}

Як і раніше зі звичайною іконкою фокуса, точна папка, де зберігаються іконки фільтрів, не має значення, доки texturefile, вказаний у спрайті, правильний.

Ключ локалізації, що використовується для фільтра фокуса, такий самий, як його назва. Наприклад, з попереднім прикладом FOCUS_FILTER_MY_MOD, це буде визначено для англійської мови в будь-якому файлі /Hearts of Iron IV/localisation/english/*_l_english.yml як FOCUS_FILTER_MY_MOD: "Мій мод".

Список усіх фільтрів фокусів базової гри:

Крім того, можна встановити пріоритет фільтрів фокусів. Це робиться за допомогою блоку search_filter_prios = { ... } поза focus_tree = { ... }. Цей пріоритет неможливо встановити специфічно для дерева фокусів, він є глобальним. Запис у цьому блоці виконується у форматі FOCUS_FILTER_MY_MOD = 1200, де перша частина визначає фільтр, а друга — пріоритет. Фільтри фокусів з вищим пріоритетом з'являються раніше у верхньому вікні. За замовчуванням гра робить це у файлі, що містить загальне дерево фокусів: /Hearts of Iron IV/common/national_focus/generic.txt.

2.9. Стилі заголовків

Стилі використовуються для визначення зображення, що використовується для заголовка, фону, на якому відображається назва фокуса. Заголовок встановлюється за допомогою text_icon = mod_focus_style у фокусі.

Стиль, який можна використовувати у фокусах, створюється за допомогою блоку style = { ... } на кореневому рівні у файлі /Hearts of Iron IV/common/national_focus/*.txt, за замовчуванням 00_titlebar_styles.txt. Ось можливі атрибути, які можна використовувати всередині стилю:

  • name = example_style — назва стилю. Аргумент визначає, що потрібно написати в text_icon фокуса, щоб посилатися на цей стиль.
  • default = yes, якщо написано, змусить будь-який фокус без визначеного text_icon використовувати цей стиль. Лише один стиль загалом може використовувати це.
  • unavailable = GFX_focus_unavailable_example — спрайт, що використовується, коли фокус недоступний.
  • completed = GFX_focus_unavailable_example — спрайт, що використовується, коли фокус було завершено.
  • available = GFX_focus_unavailable_example — спрайт, що використовується, коли фокус доступний для завершення, але ще не вибраний.
  • current = GFX_focus_unavailable_example — спрайт, що використовується, коли фокус наразі виконується.

Приклад визначення стилю:

style = {
    name = example_style
    unavailable = GFX_focus_unavailable_example
    completed = GFX_focus_completed_example
    available = GFX_focus_can_start_example
    current = GFX_focus_current_example
}

Приклади визначень спрайтів:

2.10. Що робитиме ШІ

ai_will_do = { ... } — це блок MTTH, який визначає ймовірність того, що ШІ виконає цей фокус, якщо не встановлено план стратегії ШІ. За замовчуванням кожен фокус має оцінку 1. Аргументи base (зміна значення), add та factor (множення його) можна використовувати для її зміни. У блоці ai_will_do = { ... }, modifier = { ... } функціонує як блок тригерів, де також підтримуються попередні три аргументи, що змінюють значення. Значення буде змінено, якщо тригери істинні. Наприклад, наступне призведе до значення 15 для POL та значення 5 для кожної іншої країни:

ai_will_do = {
    base = 5
    modifier = {
        factor = 3
        tag = POL
    }
}

До ai_will_do можна додати довільно велику кількість модифікаторів, і вони застосовуватимуться в тому порядку, в якому вони розміщені в коді. Також можна використовувати змінні всередині модифікатора значення ai_will_do.

Спосіб оцінки значення для вибору фокуса ШІ полягає в тому, що при виборі фокуса для виконання він генерує випадкове десяткове значення між 0 та значенням ai_will_do для кожного з фокусів. Якщо оцінюваний фокус має фокус-передумову, який ШІ щойно завершив, згенероване значення ai_will_do множиться на 1.5 перед тим, як гра обере фокус.[1] Якщо план стратегії ШІ, якого наразі дотримується країна, має визначені focus_factors = { ... } для цього фокуса, значення множиться на вказане значення. Після цього гра обирає фокус, який має найвище згенероване значення. Якщо жоден з фокусів не має значення вище 0, ШІ не обере жодного з них, замість цього переходячи до безперервних фокусів, якщо можливо, або не роблячи нічого в іншому випадку. Через цей алгоритм низькі значення менш імовірні для вибору, ніж підказує інтуїція.

Ще раз, це оцінюється лише якщо план стратегії ШІ для країни не має встановленого порядку фокусів або якщо жоден з фокусів у цьому порядку не може бути виконаний. Порівняння шансів між фокусами таке:

2.10.1. Формули для розрахунку шансу

Оскільки загальна формула може бути складною для розрахунку без спеціального інструменту, простіші розрахунки для особливих випадків можуть бути досить корисними: чи то для наближення шансу шляхом підстановки схожих чисел, чи для розрахунку точного шансу, якщо числа збігаються. Кожен випадок буде надано з трьома абзацами — Формула в першому абзаці, приклад у другому абзаці та загальне пояснення, чому це застосовується (хоча не обов'язково суворе доведення) у третьому абзаці. Загальний шанс буде надано за шкалою 0—1; передбачається, що фокуси мають позитивне значення, оскільки негативні значення непередбачені, а фокус із шансом нуль ніколи не буде обраний ШІ гри, що означає, що їх можна виключити з розрахунку повністю; а модифікатори, що застосовуються до значення "ШІ зробить" фокуса (наприклад, з планів стратегії ШІ або бонус за продовження тієї ж гілки), вже застосовані, оскільки множення результату кинутих кубиків на число було б таким самим, як множення кінців діапазону на це число. У скороченій формі значення ai_will_do фокуса буде просто називатися "значенням фокуса".

Один фокус з великим значенням та інші фокуси з однаковим меншим значенням:

Фокуси, розділені на два різні значення:

Загальна формула:

2.11. Інше

Ще одним важливим аспектом фокуса є cost = 8. Це встановлює, скільки часу потрібно для завершення фокуса. За замовчуванням вартість 1 приймається за 7 "очок",[2] з яких за замовчуванням 1 завершується щодня, хоча можна встановити різні швидкості залежно від того, чи перебуває країна у стані війни чи миру.[3] Іншими словами, вартість 1 за замовчуванням представляє тиждень. Десяткові значення у cost підтримуються, і в грі вони будуть округлені до цілого дня.

will_lead_to_war_with = TAG використовується для позначення фокуса як такого, що веде до війни з вказаною країною. Це відображатиметься для вказаної країни та її союзників (суб'єктів, сюзерена та/або членів тієї ж фракції) як виправдання країною, що виконує фокус, приводу для війни проти них на верхній панелі сповіщень. Це також змушує ШІ готуватися до потенційної війни, як для країни, що виконує фокус, так і для країни, на яку фокус налаштований оголосити війну.

cancelable = no встановить, що фокус неможливо скасувати вручну без визначення select_effect. Це не запобігає автоматичному скасуванню фокуса. Однак cancelable = yes не робить фокус можливим для ручного скасування, якщо фокус також містить select_effect = { ... }.

2.12. Приклади

Чистий мінімум (на верхівці гілки):

Середні фокуси:

Фокус allow_branch:


3. Спільні фокуси

Це вікі, що підтримується спільнотою. Якщо ви помітили помилку, будь ласка, допоможіть її виправити.

Спільні фокуси — це ті, які можна використовувати в кількох національних деревах фокусів. Приклади включають гілку "Запросити іноземних інвесторів", присутню в деревах фокусів для Китаю, Комуністичного Китаю та Маньчжоу-Го, або гілки національних дерев фокусів "Знову приєднатися до залізниць" та "Відновити робітничу республіку" для Естонії, Латвії та Литви.

Спільний фокус визначається блоком shared_focus = { ... }, не всередині будь-якого блоку focus_tree = { ... }. У цьому блоці фокус визначається точно так само, як і звичайний фокус у дереві фокусів: кожен з аргументів, які можна використовувати у звичайному focus = { ... }, можна використовувати і в shared_focus = { ... } без будь-яких змін.

Спільний фокус додається до дерева фокусів шляхом додавання аргументу shared_focus = my_shared_focus всередині цього дерева фокусів. Це додасть вказаний спільний фокус та кожен спільний фокус, пов'язаний з ним через передумови, припускаючи, що allow_branch істинно. Навіть якщо спільний фокус має інший фокус як передумову, який не завантажено в цьому дереві фокусів, він відображатиметься як видимий. Встановлення цього на неіснуючий фокус спричиняє аварійне завершення гри при завантаженні в головне меню. Крім того, відсутність неспільних фокусів у вашому дереві під час додавання спільного фокуса призведе до аварійного завершення.

Крім того, ефект load_focus_tree можна використовувати із збереженням завершених фокусів таким чином, щоб спільні фокуси зберігалися як завершені при переході до іншого дерева:

load_focus_tree = {
    tree = my_focus_tree
    keep_completed = yes
}

Це може слугувати альтернативою використанню allow_branch = { ... } для того, щоб гілки дерева фокусів для однієї країни були видимими або ні.

Спільні фокуси можна визначати в будь-якому файлі /Hearts of Iron IV/common/national_focus/*.txt. Зазвичай їх зберігають в окремих файлах від дерев фокусів, що їх використовують, але це не обов'язково.

3.1. Спільні (Joint) фокуси

Це вікі, що підтримується спільнотою. Якщо ви помітили помилку, будь ласка, допоможіть її виправити.

Спільні фокуси — це підмножина спільних фокусів, які також ділять завершення фокусів між різними країнами. Ефекти можуть застосовуватися до того, хто завершив, лише до інших країн, або до всіх них.[4]

Спільний фокус визначається як блок joint_focus = { ... } на кореневому рівні. Кожен атрибут, можливий для використання у звичайних національних фокусах, також можливий для використання тут, з додатковими змінами та доповненнями:

  • joint_trigger = { ... } — це блок тригерів, який визначає, які країни вважаються спільними для цього конкретного фокуса. Це перевіряється для кожної країни. Завершення буде спільним для всіх країн.
  • completion_reward = { ... } функціонує аналогічно звичайним національним фокусам, але виконує ефекти для кожної спільної країни.
  • completion_reward_joint_originator = { ... } — це нагорода за завершення, що виконується лише для країни, яка безпосередньо завершила фокус.
  • completion_reward_joint_member = { ... } — це нагорода за завершення, що виконується для кожної країни, де фокус завершено, крім тієї, що безпосередньо його завершила.

В іншому спільні фокуси ідентичні звичайним спільним фокусам.

3.2. Приклад

Текст у цьому розділі за замовчуванням згорнуто.


4. Безперервні фокуси

Це вікі, що підтримується спільнотою. Якщо ви помітили помилку, будь ласка, допоможіть її виправити.

Безперервні фокуси визначаються у файлах /Hearts of Iron IV/common/continuous_focus/*.txt. Це фокуси, які можна обрати після завершення 10 національних фокусів[5] і які тривають вічно, не маючи можливості їх повністю завершити.

4.1. Палітри фокусів

Палітра безперервних фокусів неймовірно схожа на визначення національного дерева фокусів, але з меншою кількістю аргументів.

  • id = my_focus_palette визначає ID палітри фокусів. Обов'язково.
  • country = { ... } — це блок MTTH, який присвоює оцінки кожній країні для вибору палітри безперервних фокусів, точно так само, як це робиться з національними деревами фокусів.
  • default = yes призначає палітру фокусів як стандартну. Як і з національними деревами фокусів, лише одна палітра загалом повинна бути стандартною: не більше, не менше. За замовчуванням false.
  • reset_on_civilwar = no аналогічно національним фокусам, має невідомий ефект.
  • position = { x = 100 y = 1230 } призначає стандартну позицію палітри безперервних фокусів, вимірюючи в пікселях позицію верхнього лівого кута. Це буде використано, якщо національне дерево фокусів країни не вказує іншу позицію, яка не є x = 0 y = 0.
  • focus = { ... } — це самі безперервні фокуси.

Приклад:

4.2. Фокуси

Безперервні фокуси також досить схожі на національні фокуси у визначенні, але є суттєві відмінності.

  • id = TAG_focus_name — ID безперервного фокуса. Не повинно бути збігів у різних палітрах. Це також використовується як ключ локалізації для назви фокуса, а додавання _desc використовується для отримання опису фокуса.
  • icon = GFX_focus_icon_name — спрайт іконки, що використовується безперервним фокусом. Аналогічно національному фокусу, повинен бути як звичайний значок, так і блиск, щоб він завжди працював належним чином.
  • available = { ... } — блок тригерів, необхідний для виконання, щоб фокус був видимим, на відміну від національних фокусів, де це робить його можливим для вибору. Замість цього блок тригерів, що використовується для того, щоб фокус можна було обрати, — це enable = { ... }. available_if_capitulated = yes також зробить фокус можливим для вибору під час капітуляції. Якщо false, фокус все одно буде видимим, але його не можна буде обрати.
  • modifier = { ... } — блок модифікаторів, який деталізує список модифікаторів та їхні значення, що додаються при виборі фокуса. Однак існують інші способи застосування безперервних бонусів, крім модифікаторів, такі як бонуси до досліджень для конкретних категорій та бонуси до обладнання. Для них можна використовувати idea = idea_name, що додасть ідею до країни при виборі фокуса та видалить її при скасуванні фокуса. Це рекомендується робити з прихованими ідеями, оскільки це показує ефекти ідеї при наведенні на фокус.
  • select_effect = { ... } та cancel_effect = { ... } — ефекти, що виконуються при виборі та скасуванні цього фокуса відповідно. Оскільки фокус можна обрати та скасувати будь-коли безкоштовно, рекомендується зробити їх повністю протилежними один одному, щоб це не давало гравцеві жодної переваги.
  • daily_cost = 0.4 — вартість у щоденному прирості політичної влади для взяття цього фокуса порівняно з відсутністю будь-якого обраного фокуса, може бути десятковим.
  • ai_will_do = { ... } — блок MTTH, що працює точно так само, як ai_will_do у національних фокусах. Крім того, supports_ai_strategy = AI_focus робить фокус можливим для вибору ШІ, якщо він дотримується вказаного фокуса. Без цього ШІ ніколи не обере цей безперервний фокус.

Приклади:


5. Плани стратегії ШІ

Основна стаття: Модинг ШІ § Плани стратегії ШІ

Це вікі, що підтримується спільнотою. Якщо ви помітили помилку, будь ласка, допоможіть її виправити.

Плани стратегії ШІ вказують ШІ, що пріоритезувати залежно від обставин: яких радників обирати, які технології досліджувати, які стратегії ШІ застосовувати, і, що найважливіше тут, які фокуси обирати. Це короткий огляд планів стратегії ШІ суто для пріоритезації національних фокусів, повна інформація знаходиться в статті про Модинг ШІ. Одночасно може бути увімкнено кілька планів стратегії ШІ.

Плани стратегії ШІ визначаються у файлах /Hearts of Iron IV/common/ai_strategy_plans/*.txt. У цих файлах новий план стратегії створюється як новий блок, назва якого повинна бути такою ж, як внутрішній ID плану.

У цьому плані name = "Назва плану ШІ" та desc = "Опис плану ШІ" визначають назву та опис плану стратегії. Це ніколи не призначено для показу гравцеві, тому локалізувати його на різні мови ніколи не потрібно. Замість цього це використовується в консольній команді aiview, яка надає розробнику інформацію про те, що ШІ хоче пріоритезувати.

allowed = { ... }, аналогічно рішенням або ідеям, є блоком тригерів, що перевіряється лише на початку гри. В основному використовується для того, щоб вказати, для якої країни та DLC обмежувати план стратегії.

enable = { ... } перевіряється щодня, якщо allowed виконано. Якщо enable = { ... } виконано, то план стратегії ШІ буде призначено ШІ незалежно від того, чи стане enable = { ... } хибним пізніше чи ні. Зазвичай тригер has_game_rule використовується для роботи з власними ігровими правилами, що визначають, який шлях обере ШІ. is_historical_focus_on зазвичай використовується зі стандартним ігровим правилом ШІ, а прапори країни можна використовувати для рандомізації, налаштувавши on_startup для встановлення випадкового за допомогою random_list.

abort = { ... } перевіряється щодня, щоб змусити ШІ припинити використання цього плану стратегії ШІ, якщо enable = { ... } виконано. Крім того, він повинен бути хибним, щоб план стратегії ШІ можна було обрати.

ai_national_focuses = { TAG_focus_name_1 TAG_focus_name_2 } — це список національних фокусів, розділених пробілами, у тому порядку, в якому ШІ повинен їх виконувати. У цьому прикладі ШІ спочатку спробує виконати TAG_focus_name_1, якщо це можливо. Якщо його вже виконано або TAG_focus_name_1 неможливо виконати, то ШІ спробує виконати TAG_focus_name_2. Якщо обидва фокуси неможливо виконати через те, що їх завершено або вони недоступні, то він перейде до інших фокусів, враховуючи ai_will_do = { ... }. Дотримуючись порядку фокусів, він ігнорує значення ai_will_do = { ... }.

focus_factors = { ... } присвоює множник значенням ai_will_do вказаного фокуса. Запис у цьому блоці виглядає як TAG_focus_name = 3. У цьому випадку це змусить значення ai_will_do фокуса помножитися на 3, припускаючи вагу плану стратегії ШІ 1. Якщо фокус має значення ai_will_do 4 після застосування модифікаторів, воно стане 12, якщо ШІ дотримується цього плану стратегії, і буде розглядатися як таке. І, звичайно, коефіцієнт 0 змусить фокус ніколи не обиратися без вказівки в ai_national_focuses. Це може слугувати швидшим у написанні або більш рандомізованим способом змусити ШІ дотримуватися політичного шляху, роблячи фокуси, які він ніколи не повинен обирати, мати значення 0.

weight = { ... } — це блок MTTH, що присвоює загальну вагу плану. Визначений так само, як ai_will_do національного фокуса, він множить кожен коефіцієнт у плані стратегії ШІ на вагу перед їх застосуванням. Вага 1.25 перетворить коефіцієнт фокуса 4 на 5 перед його застосуванням, наприклад. Це можна використовувати, щоб змусити ШІ дотримуватися плану стратегії суворіше в одних випадках і менш суворо в інших.

5.1. Приклад

Текст у цьому розділі за замовчуванням згорнуто.


6. Примітки

[a] Динамічні країни при створенні знову пройдуть перевірку, що призначає дерево фокусів. Крім того, перезавантаження фокусів шляхом збереження поверх файлу дерева фокусів, коли увімкнено режим налагодження через налаштування запуску, також оновить цю перевірку.

[b] Стандартна позиція визначається у визначенні палітри у файлі /Hearts of Iron IV/common/continuous_focus/*.txt.

[c] Точний розмір однієї одиниці координат x та y використовує focus_spacing positionType у /Hearts of Iron IV/interface/nationalfocusview.gui.

[d] Якщо mark_focus_tree_layout_dirty розміщено в нагороді за фокус, він не буде позначено як завершений для тригера has_completed_focus на момент його виконання. Цього можна уникнути, використовуючи приховану подію, запущену негайно, яка має ефект оновлення перевірки всередині свого immediate. Альтернативно, ефект load_focus_tree, налаштований на збереження завершених фокусів, можна використовувати для позначення фокуса як завершеного перед оновленням.

[e] У шляхах до папок зворотна коса риска (\) може призвести до того, що гра не зможе прочитати папку, оскільки очікується, що вона використовуватиметься як керуючий символ. Замість цього бажано використовувати прямі косі риски, як у texturefile = gfx/interface/goals/my_file.dds.


7. Посилання

  1. NDefines.NAI.FOCUS_TREE_CONTINUE_FACTOR = 1.5 в Defines.
  2. NDefines.NFocus.FOCUS_POINT_DAYS = 7 в Defines.
  3. NDefines.NFocus.FOCUS_PROGRESS_PEACE = 1 та NDefines.NFocus.FOCUS_PROGRESS_WAR = 1 в Defines.
  4. Щоденник розробників | Модинг!, щоденник розробників Paradox за 1.13.
  5. NDefines.NCountry.MIN_FOCUSES_FOR_CONTINUOUS = 10 в Defines.

Зауважте, що при модифікації defines слід використовувати файл перевизначення define, а не копіювати весь файл, оскільки навіть інакше "незначні" оновлення можуть додавати нові defines, спричиняючи потенційні збої.