Hearts of Iron IV

Hearts of Iron IV

Not enough ratings
Добавление и редактирование регионов и городов в Hearts of Iron 4
By St. Himars
В этом гайде я расскажу о том, как добавить свой или изменить существующий наземный регион или город (населенный пункт) на карте в Hearts of Iron 4.
   
Award
Favorite
Favorited
Unfavorite
Немного теории:
  • Земля и континенты на картах в Hearts of Iron 4, как стандартной, так и тех, что создаются в некоторых модах, состоят из наземных регионов. Наземный регион - это основная территориальная единица в игре, - из них состоят страны, в них строятся фабрики и заводы, в них залегают ресурсы, в них проживает население, и т.д. и т.п. Почти каждый регион является национальным для той или иной страны. Если ваша страна не имеет подконтрольных национальных регионов (или общая сумма победных очков контролируемых национальных регионов меньше 20% от подконтрольных на начало войны), то она с большой вероятностью (за редким исключением в виде скриптов или багов) проигрывает войну и капитулирует.
  • Регионы состоят из провинций - маленьких региончиков, которые изображают рельеф и по которым ходят войска. В них также можно строить маленькие сооружения (например бункеры или морские порты). Эти провинции могут изображать некоторые населенные пункты.
  • С точки зрения игры, населенный пункт - это так называемая "победная точка", то есть провинция, захват которой приносит оккупанту победные очки, а у обороняющейся стороны забирает их. Также, если в регионе присутствуют города, то их занятие будет сильно приближать вас к занятию региона (а врага - к капитуляции). Если в локации всего один город, или занятые города по количеству предоставляемых победных очков превосходят остальные города в регионе - контроль над провинциями с этими городами означает контроль над всем регионом (если же городов нет, контроль над регионом зависит от количества занятых провинций). В зависимости от количества победных очков, зависит и размер города (а именно точка, которой он помечен).

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

    ВАЖНО! Удостоверьтесь, что путь к папке с модом (общий его вид указан ниже) у вас полностью англоязычный, и не лежит где-нибудь в OneDrive, иначе мод у вас, скорее всего, запускаться не будет!

  • Когда мод создан:
    • В каталоге с нашим модом (по умолчанию - "C:\Users\Имя_Пользователя\Documents\Paradox Interactive\Hearts of Iron IV\mod\Название_мода", пример на скрине 1) создаем две основные папки - "localisation" и "history" (скрин 2).




    • Внутри папки "history" создаем папку "states". В ней мы будем непосредственно работать с регионами.



    • По пути "localisation/lang" (lang - это язык, на котором будет видна ваша локализация, в данном конкретном примере - russian), из файлов оригинальной игры копируем файлы "victory_points_l_XXXX.yml" и "state_names_l_XXXX.yml" (XXXX - это название языка, на который мы будем локализовать наши города, в этом примере, опять же - russian). Правда, лично я рекомендую не работать с оригинальными файлами, а переименовать их в еще что-нибудь (например, поставив в начало названия этих файлов название вашего мода, пример на скрине ниже).



    Совет: В папке языка с файлами локализации можно также создать дополнительно папку с названием "replace", и кидать в неё все файлы, где будут присутствовать локализационные ключи из оригинальной игры, если вам понадобится их изменять. Тогда игра при запуске будет корректнее менять их на ваши.

    Ну а если мы хотим сделать что-то более серьезное, чем небольшие косметические изменения, дополнительно ко всему создаем в директории с модом папку "map" (об этом подробнее во второй половине руководства).
Добавление региона:
  • Итак, прежде, чем мы захотим добавить регион, нужно найти место, куда его будем добавлять, тобиш ID нужных провинций. Для этого в самой игре в консоль вводим команду tdebug, и наводим на нужную провинцию, переписывая куда-нибудь значение, указанное напротив надписи Province ID (на скрине ниже - оригинальная часть карты, которую будем редачить).



  • Затем идем в папку states, и создаем в ней txt файл с названием "ID-XXXX", где ID - это идентификатор региона (два региона с одинаковым id игра не потерпит, потому ОБЯЗАТЕЛЬНО берите id, начиная с последнего из оригинальной игры - от 909 на момент написания гайда, - иначе будут вылеты), а XXXX - его название (правда оно используется только для этого файла, и больше нигде не фигурирует).



    И да. Для всех манипуляций с любый хоешным кодом настоятельно рекомендуется использовать Notepad++.

  • Структура нашего txt файла по умолчанию выглядит так (наглядный пример на скриншоте ниже):



      Свойства в блоке state:
    • id - ID нашего региона;
    • name - Ключ для локализации, а если её нет - плейсхолдер вместо неё. Имеет вид STATE_XXXX, где XXXX - ID региона;
    • manpower - Население региона;
    • state_category - Тип региона. Определяет, прежде всего, количество места под застройку. Стандартные категории регионов в оригинале лежат по пути "common\state_category", ну а про создание своих, как нибудь, в другой раз;
    • provinces = {...} - в фигурных скобках через пробел перечисляются ID провинций, из которых состоит регион.
    • resources={...} - в фигурных скобках перечисляются имеющиеся в регионе природные ресурсы по форме (тип = количество). Если их нет, данный параметр можно не указывать.
    • buildings_max_level_factor - Модификатор максимально доступного уровня зданий конкретного типа, доступных для постройки в данном регионе. По умолчанию равен 1. Необязательный параметр, сами разрабы трогать его не рекомендуют;
    • local_supplies - Отвечает за дополнительные местные припасы в регионе. Если больше 0 - улучшает общую ситуацию со снабжением в регионе. По умолчанию равен 0. Необязательный параметр;
    • impassable - Принимает значения yes/no. Если yes, то делает весь регион непроходимым - войска ходить по нему не смогут, контроль над ним переходит по мере захвата проходимых провинций в ближайших соседних регионах, не дает строить провинциальные сооружения. По умолчанию равен no. Необязательный параметр;
    • Свойства в блоке history:
      • victory_points = { x x } - Указывает, в каких провинциях будут находиться города (внутри скобок два числа: первое - ID провинции, второе - количество победных очков, которые будет давать город). Для каждого нового города данный блок прописывается отдельно;
      • buildings= { ... } - Указывает, какие сооружения построены в данном регионе по форме (тип = количество). Список всех доступных сооружений лежит в "common\buildings\00_buildings.txt". Полу-обязательной (не критически, но будет много ошибок, если не указать) является постройка типа infrastructure - транспортная инфраструктура в регионе. Провинциальные постройки (вроде бункеров или портов) следует обернуть в XXXX = { ... }, где XXXX - ID соответствующей провинции;
      • owner / controller = TAG - Первый параметр определяет владельца региона, второй - контролирующего фактически. Первый параметр фактически обязателен (но есть нюанс, он ниже), второй указывается при необходимости (например, если регион оккупирован). TAG - тэг соответствующей страны (состоит из трех букв, для конкретной страны можно узнать в tdebug-моде в игре);
      • add_core_of / add_claim_by = TAG - Первая команда указывает, для какой страны (TAG) территория является национальной, вторая - кто на неё претендует. При необходимости обе команды могут использоваться многократно;
      • DATE = { ... } - если в сценарии с другой датой необходимо отобразить какие-либо изменения в регионе (например, повесить дополнительные претензии или построить еще пару фабрик), то следует обернуть данные изменения (которые потом прибавятся к общему количеству построек или претензий) в данный блок, где DATE - любая дата перед началом сценария.

    Расположение данных свойств в файле не имеет значения. Можно разносить их как угодно (ну почти).

  • Изменяем значения на своё усмотрение, держа в голове следующие моменты:
    • ID региона в соответствующем свойстве и в его названии должны совпадать;
    • Каждая провинция может принадлежать только одному региону;
    • Провинция, в которой, размещается город, должна входить в этот регион;
    • Не следует строить сооружений больше, чем их максимально возможное количество на один регион;
    • По завершению работы следует убедиться, чтобы все провинции были приписаны к регионам - чтобы не возникало белых пятен и поводов для вылета игры;
    • Также - если ваша провинция войдет в регион, принадлежащий к другому стратегическому региону, то нам придется обращаться к папке "map" - но об этом сильно ниже.

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

  • Далее идем в файлы локализации, созданные заранее (указаны выше в руководстве, но по большей части название файла не играет большой роли - главное, чтобы оно не совпадало с оригинальным названием, иначе мод будет замещать ванилу с возможными проблемами потом). Локализация региона имеет вид STATE_XXXX:0 "...", локализация города - VICTORY_POINTS_XXXX:0 "...", где в первом случае XXXX - ID региона, а во втором - провинции.


Перестановка построек с Nudge:
Итак, регион мы сделали, но при изменении границ оных в игре неизбежно будут возникать проблемы с геометрией из-за слетающего размещения объектов на карте при строительстве чего-либо. Впрочем, это достаточно легко исправимо с помощью инструмента Nudge.
  • Но прежде чем начать, нужно этот инструмент включить, ибо в оригинальной игре его нет. Но он есть в режиме разработчика, который по умолчанию недоступен. Чтобы его включить, создаем ярлык с файла hoi4.exe (находится в папке основной игры), переносим его в удобное место, открываем свойства ярлыка (ПКМ по ярлыку/"Свойства") и в конец строки "Объект" дописываем следующее: -debug. После этого с данного ярлыка будет запускаться режим разработки, где и будет искомый Nudge .




    • Немного оффтопа. При запуске в режиме разработчика игра еще и выдаст вам список ошибок в отдельном файле, что сильно помогает в поиске и устранении проблем. Если не выдала, то:
      • Либо после вылета файл error.txt можно будет найти по пути "...\Documents\Paradox Interactive\Hearts of Iron IV\crashes\hoi4_дата_время\logs";
      • Либо просто у вас нет ошибок, что в принципе при наличии модов невозможно, да и даже обычная ванила пару ошибок в себе найдет;
      • Либо с вами случилось ровно то, про что я говорил в начале - игра работает неправильно из-за неправильного названия пути/расположения папки с документами.
    • Ну и о важном. Если ошибки не являются критическими (например, если речь идет о двойной локализации, а не о приписке региона двум странам одновременно), то их можно игнорировать. Но если их будет очень много - будет понижаться общая производительность игры, и повышаться вероятность вылета по какой-либо причине в любой момент.

  • Заходим в Nudge, ищем в меню вкладку Buildings, переходим туда. Затем методично прокликиваете все затронутые вашими изменениями регионы, и прожимаете в правом нижнем меню кнопку "Random in state". (можно и вручную порасставлять, но это очень долго, да и нужно, по большому счету, только лютым эстетам). Когда всё сделали, прожимайте кнопку "Save".



  • Затем идем в документы игры ("C:\Users\Имя_Пользователя\Documents\Paradox Interactive\Hearts of Iron IV"), копируем появившуюся здесь папку "map" и вставляем её в директорию вашего мода, при необходимости подтверждая замену. И запоминаем - все ваши изменения карты, сделанные через Nudge, будут сохраняться именно так, и заносить их в мод вам нужно вручную.

Создаем свои провинции:
Но если границы региона вам нужно изменить под свой вкус?. Не беда, потому как для этого есть папка "map". Однако манипуляций придется проделать много, ибо дело сие неблагодарное, монотонное и муторное. И это при условии, что мы не будем тут разбирать переделку других карт - высот, рельефа, рек, т.п.
Но переходим к сути:
  • Из оригинальной игры из папки "map" копируем к себе в мод (в ту же папку) файл provinces.bmp. Открываем его любым графическим редактором (лучше всего подходит Photoshop, и, как на скрине ниже, рекомендую дополнительно сохранить всё это в отдельный проект).




  • Данный файл представляет собой кучу разноцветных провинций, составляющих собой карту. Иногда существует проблема с нахождением конкретной редактируемой области, но не то чтобы слишком все же это сложно. Можно редактировать существующие провинции, можно переносить их по разным местам, можно рисовать свои. Хоть целый континент новый нарисовать. Главное - соблюдать четыре правила:
    • Цвета провинций не должны повторяться (хотя с RGB вероятность повторений крайне мала). Лучше перестраховаться заранее и скопировать в "map" из оригинала файл definition.csv - именно там указывается основная инфа о провинциях, включая их цвета (в формате RRR;GGG;BBB;), а потом для художеств избирать цвет, ориентируясь на всё вышеперечисленное;
    • Следует избегать крестовидных соединений провинций (когда четыре провинции сходятся углами друг к другу). Игра вряд ли с таким запустится, но в ошибках обязательно об этом вас уведомит (с конкретной позицией места ошибки в пикселях);
    • Также стоит избегать создания нецельных провинций (то есть таких ситуаций, когда одна провинция фактически разделена на несколько не связанных между собой частей другими, или, например, когда одна провинция окружает другую со всех сторон);
    • Ну и не создавать слишком маленьких провинций (она должна занимать хотя бы 15-20 пикселей, чтобы её хотя бы было видно на карте уже непосредственно в игре).

  • Когда всё готово - сохраняем файл с провками (в режиме RGB, формат .bmp, 24-битное растровое изображение), открываем definition.csv и листаем в конец. В конце файла нужно дописать наши новосозданные провки. Структура объявления оной: ID;RRR;GGG;BBB;L;F;U;K:
    • ID - ID провинции;
    • RRR;GGG;BBB; - цвет провинции на карте в формате RGB (три числа).
    • L - тип провинции: land - земля, lake - озеро, sea - море;
    • F - является ли провинция прибрежной (true/false);
    • U - тип местности в провинции (типов много, но по соседним провкам на карте с вашей и по внешнему виду местности подобрать можно);
    • K - континент, на котором расположена провинция (опять же, проще всего определить по соседним провинциям региона).




    Если не сделать этого вручную, игра добавит всё это за вас, но тогда файл с описанием провок также нужно будет заново копировать из документов игры. И потом избавляться от кучи unknown-ов.

  • Затем можем спокойно интегрировать данные провинции в нужные регионы. Однако следует сделать еще одну ремарку - провинции нужно засовывать в соответствующий стратегический регион, чтобы не делать белых пятен. Для этого в папку "map" переносим из ванилы папку "strategicregions", ищем нужный (можно через Nudge, можно через tdebug), а дальше редактура аналогично обычным регионам - в блок provinces дописываем либо исключаем нужные провинции. Правило о принадлежности одной провинции одному региону здесь также работает (структура подобного файла на скринах ниже).




  • В режиме Nudge для всех новых провинций, либо провинций, по сравнению с оригинальным размером изменивших свои границы, а также для всех провинций, соседствующих с первыми двумя вариантами, обязательной является процедура прохождения через инструмент Units, который поможет настроить анимации юнитов на ней (а также тут можно немного подвигать позицию точки города, чтобы она отображалась более корректно и краше соотносилась с реальным расположением города). Для этого выбираем провку и жмем Auto in prov. Когда закончили - сохраняем.



  • Следует также учесть, что в новых версиях, с наличием в игре железных дорог, появление с бухты барахты новых провинций посреди стандартной дороги поломает её напрочь. Потому рекомендуется для доработки старых и прокладки новых путей использовать в режиме Nudge инструмент Supply.


  • Если все сделано правильно и без критических ошибок, то игра разрешит вам запустить себя, и вы сможете насладиться результатом собственных трудов.

    Итоговый результат данного примера на скриншотах ниже:




Некоторые эффекты непосредственно в игре:
Данный раздел (если кому надо) касается всего, что можно изменить с помощью фокусов / решений / ивентов / скриптов / т.н. действий (on_actions) / т.п. непосредственно в ходе игры. Будет постепенно дополняться.

  • Изменение контроля над провинцией / регионом:

    • XXXX = { set_state_controller_to = TAG }; - изменяет текущего контроллера конкретного региона с одной страны на другую. TAG - тэг страны, под чей контроль передать регион, XXXX - ID региона;
    • XXXX = { transfer_state_to = TAG } - изменяет текущего владельца и контроллера конкретного региона с одной страны на другую;
    • XXXX = { set_state_owner_to = TAG } - Передаёт владение регионом без смены контроллера;
    • TAG = { set_province_controller = XXXX } - изменяет текущего контроллера конкретной провинции с одной страны на другую;

      (Касается любой работы с ID регионов) В данном случае, если XXXX образует собой блок, то ставить конкретный ID необязательно. Можно использовать массив (например every_owned_state = {...});

    • TAG = { set_state_controller = XXXX }; - аналогично первому примеру;
    • TAG = { transfer_state = XXXX } - аналогично второму примеру;
    • TAG = { set_state_owner = XXXX } - аналогично третьему примеру;

  • Изменение типа региона:

    • XXXX = { set_state_category = YYYY } - Изменяет тип региона XXXX вместо текущего на указанный YYYY;

  • Переименование города / региона:

    • XXXX = { set_state_name = "YYYY" } - Изменяет название региона XXXX вместо текущего на YYYY;
    • set_province_name = { id = XXXX name = "YYYY" } - Изменяет название провинции XXXX вместо текущего на YYYY;

      В обоих случаях выше, если убрать кавычки и указать на месте YYYY ключ локализации, то название будет соответствующим образом локализовано в игре;

    • XXXX = { reset_state_name = yes } - возвращает исходное название региону XXXX;
    • reset_province_name = XXXX - возвращает исходное название провинции XXXX;

  • Добавление победных очков городу / создание нового города:

    • add_victory_points = { province = XXXX value = YYYY } - прибавляет к имеющемуся количеству победных очков в провинции XXXX значение YYYY;
    • set_victory_points = { province = XXXX value = YYYY } - Устанавливает количество победных очков в провинции XXXX в значение YYYY;

      Здесь YYYY может принимать переменные или отрицательные значения;

  • Модификаторы провинции / региона:

    • XXXX = { add_state_modifier = { modifier = {...} } } - добавляет модификаторы, указанные в блоке modifier, к региону XXXX;
    • XXXX = { add_dynamic_modifier = { modifier = YYYY days = N } } - добавляет динамический модификатор YYYY в регион XXXX. Если он должен быть временным, количество дней N нужно указать в days, в ином разе параметр необязателен. Динамические модификаторы создаются в "common\dynamic_modifiers";
    • add_province_modifier = { static_modifiers = {...} province = XXXX } - устанавливает модификаторы из блока static_modifiers (перечисление через пробел, если их несколько) для провинции XXXX. Провинций может быть несколько, и если так, следует несколько раз повторить province = XXXX.
    • XXXX = { remove_dynamic_modifier = { modifier = YYYY } } - удаляет динамический модификатор YYYY из региона XXXX;
    • remove_province_modifier = { static_modifiers = {...} province = XXXX } - удаляет модификаторы из блока static_modifiers из провинции XXXX.

Заключение
Как видите, добавление своих регионов и городов или изменение существующих не является какой-то непосильной задачей, и с которой вполне может справится даже далекий от моддинга и элементарного программирования человек, способный сделать за компьютером больше, чем включить его на кнопку. Главное - не переборщить с некоторыми настройками и не вскрыться камнем вниз с крыши чего-нибудь из-за лютой рутины и монотонности в некоторых местах сего процесса.

Если у вас что-то не заработает, задавайте вопросы в комментариях или (что предпочтительнее) пишите в ЛС - помогу чем смогу!

Если хотите отблагодарить автора финансово, то вот: https://www.donationalerts.com/r/st_himars

Еще мои гайды:
https://steamproxy.net/sharedfiles/filedetails/?id=1856313518
https://steamproxy.net/sharedfiles/filedetails/?id=3308231607
https://steamproxy.net/sharedfiles/filedetails/?id=3008616019
30 Comments
Garik44222 3 Apr @ 10:44am 
Я автору пяточки целовал. Остаётся познать как расположение городов поменять(а то город за пределами своей провинции находится) А так я доволен, что не вылетает:BEjoyful:
sesorit 8 Jan @ 8:18pm 
Привет, как мне удостовериться, что мод лежит в onedrive и как мне его из него убрать?
SData_86 21 Nov, 2024 @ 6:38am 
Почему в регионах нет локализации, там написано "STATE_номер", хотя в блокнотах (в моде) написана вся локализация регионов?
SUPER-CEP 9 Nov, 2024 @ 1:53pm 
Мне нужно удалить кое-какие модификаторы которые остались после захвата другой страны, но я далёк от модинга и вообще не понял как мне это сделать хоть и нашёл то что мне нужно в конце. Не могли бы вы помочь?
byebye.wav 8 Jun, 2024 @ 10:08am 
Приветствую, мог бы кто подсказать, почему регионы не считаются национальными, хотя в history/states я их прописал таковыми? ошибки в теге или чего-то подобного нет, у меня подозрения, что в каталоге common отсутствуют(-ет) файлы(-ел), которые отвечают за статус национальной территории, так вот какой именно каталог внутри common отсутствует?
St. Himars  [author] 23 Apr, 2024 @ 3:03am 
@Pe4enkiSMolokom для начала попробуй переименовать файл Moscow City в Moscow Area. Конкретно эта ошибка с конфликтом ID скорее всего возникает из-за этого.
Pe4enkiSMolokom 23 Apr, 2024 @ 2:01am 
State ID conflict: Both "Москва" ( history/states/219-Moscow City.txt) and "Москва" ( C:\Program Files (x86)\Steam\steamapps\common\Hearts of Iron IV\219-Moscow Area.txt). Ну тоесть почему конфликт? Я же мод делаю почему игра ссылается на ванильные state
Pe4enkiSMolokom 23 Apr, 2024 @ 2:00am 
Я поменял регион москвы ( сделал старый регион с ванильным id только городом и создал новый регион - область ) и у меня какие то странные баги тип вроде все играбельно но игра почему то все равно делает старый регион всей областью памагите пж (дискорд pe4enkismolokom)
Karalius 14 Feb, 2024 @ 7:51am 
После создания провинций они отображаются но являются морем(Я прописал "land" в дефинишнс)
необычайно хорош 23 Jan, 2024 @ 2:01pm 
Попробую файлы проверить если не поможет то наверно переустановлю игур