• We have updated our Community Code of Conduct. Please read through the new rules for the forum that are an integral part of Paradox Interactive’s User Agreement.

HoI4 Dev Diary - Modding Changes

Hello, and welcome back to another Dev Diary for No Step back and 1.11 Barbarossa. Today we will be pulling back the veil a bit and show you how modders can affect and use the new features coming in 1.11.

For those of you who do not get unreasonably excited by hearing about new script commands and changes to databases, the long and short of it is this: We made some fundamental changes to the way the game handles some things, which will probably require your favorite mods to spend some time updating. On the flip side, those changes also allow for some exciting possibilities down the line. If you came here hoping for a release date, we must ask you for just a little more patience. We promise the announcement is very close - but not today.

Characters

Probably the biggest change is in how we handle people on the backend (or ponies, for that matter - we do not discriminate). In the current live version, the game has no real concept of a person as a distinct thing. It only knows about country leaders, military leaders, political and military advisors, and operatives. Cases where a country leader could also be a general had to be handled manually, leading to lots of exciting bugs when the country leader was removed but the general was forgotten about and other such cases.

We have overhauled that side of the game from the ground up with the introduction of characters. This should dramatically reduce the amount of potential zombie generals shambling around, which I am sure the non-zombie population will greatly appreciate.

Characters are defined in the common/character folder, and their definitions look like this:

Screenshot_4.png


Every character is defined as a container for different roles they can fulfill, like General (corps_commander), Advisor, country leader etc. Due to technical concerns, Operatives remain their own thing. On the character level itself, things like name and gender are handled. This also means that character names can now be localised and you can refer to a character by ID instead of by name (this helps a lot with character names that have non-english characters in them - turns out this broke some triggers and effects).

Screenshot_5.png


This also means that if a character is removed from play - say, through a purge - they are automatically removed from all roles that they could have, which makes such systems a lot easier to do script-side. It also means that if we wanted to allow Zhukov to become a country leader, we could simply add a country leader role for him in the character file, like this:


Screenshot_6.png

Or we could also add the role later on, via focus, event, decision... like we do here with Beriya:


Screenshot_7.png

That means there is a lot less confusion and duplication of effort necessary when putting a character into a new role, since stuff like portraits, name etc. are already handled. A broken portrait only needs to be fixed in one place instead of five etc.

Once defined, characters are recruited in the country history file in order to be added to the game. As you can see in the first screenshot, you can use visible triggers for unit leaders to ensure they are not shown if you don’t want them to be.

Characters that can potentially become country leaders are made into country leaders using the promote_character effect, like so:

Screenshot_8.png


This is a clear departure from the practice in the live version of the game, where you would create a new country leader in that effect. The old script with create_country_leader and other such effects should still be working, but obviously you don’t get any of the advantages of the unified character system.

So let’s talk about some more things you can do with it!

You can set and check character flags for nefarious purposes:

Screenshot_9.png


You can change the traits of advisors without having to make a whole new advisor:


Screenshot_10.png

You can check if a character is a certain type of character:

Screenshot_11.png


You can save the character as a variable to refer to them later, such as spamming debug messages in the console!


Screenshot_12.png

Tank Designer

Next, let’s talk a bit about how the tank designer works on the backend. It shares a lot of concepts with the ship designer, such as modules and module slots. It does, however, work a little differently in some other, important aspects.

While the system pretends that there are only a handful of chassis (light, medium, heavy, super-heavy, amphibious, modern), this is not technically true. Instead, the system maintains a whole host of other, dynamically created chassis. This allows us to make sure that tank designs with the tank destroyer role actually go into tank destroyer battalions etc.

However, these dynamic chassis are still generated from the base chassis, so any changes to them will carry over.

The roles are enabled and disabled on individual modules:

Screenshot_13.png



Screenshot_14.png

For the unlock of new module categories, you can then use this on a module to unlock that category:

Screenshot_15.png


Railways

Railways function a little differently from other buildings. While they are technically province buildings like forts, they are in reality closer to a building that connects two provinces. A railway line is effectively a series of two-province connections, and the lowest one in the chain determines the level of the railroad connection between two supply hubs.

To make it easier to change and maintain the historical railway setup, we have added an option to draw railways into the nudger tool, which you can access by using the nudge command in the console.
Screenshot_16.png


The railway setup is in the supply menu in the nudger, and you can easily add new railway lines to the existing setup in this way. It took me about a week and a half to do the entire 1936 setup, including tracking down reference maps (with a lot of help from some of our testers).

If you want to add railways through script, you have the build_railway effect. It gives you a lot of options, with the most basic one being to lay out the path one province at a time:

Screenshot_17.png


This is obviously a little cumbersome for longer railways, especially if you don’t really care about the exact path. For that, you have the option to define a start and an end province:

Screenshot_18.png


The game will then automatically generate a path from one end to the other using advanced neural network-based self-learning algorithms that use blockchain (read: I have no idea how it works but this sounds impressive).

If finding the province is too much work, or if you want to be somewhat dynamic, you can even use start and end states (also note that you can specify what level of connection should be built):

Screenshot_19.png


Note that you can’t mix these, so you can’t define a starting province and a target state for example.

There are also corresponding triggers like can_build_railway and has_railway_connection:

Screenshot_20.png


The first checks if a railway can be built between two locations, while the other checks if one such connection already exists.

Finally, there is has_railway_level, which checks if the specified state has a railway line in it with the specified level:

Screenshot_21.png

Miscellaneous new effects, triggers, modifiers

In addition to the things described above, we have added a number of useful things that some of you might find useful:

  • Building_cost_factor: a new modifier that affects the construction cost of buildings. This takes the buildings from the 00_buildings file, so it should work with mods that add more buildings.
  • Core_state scope list, allowing you to run effects and triggers on a country’s core states:
Screenshot_22.png


  • Add_equipment_to_stockpile effect can now take a variant name to ensure that you add the right kind of equipment.
That’s all for today, I hope you enjoyed these little insights and we are all excited about what crazy things you will do with the new tools at your disposal.
 
  • 106Like
  • 23Love
  • 23
  • 10
  • 2
Reactions:
In the mean time between now and a potential rethink, could you add a has_subideology condition? Currently, my and other mods just have it check for a trait but it would be a lot easier :)
Would make sense. I thought NSB would do this because of the different sects of communism.

I've wanted to be able to distinguish between Soviet Communism and Left Communism in terms of how the SOV would interact with different countries around the world.
 
This is so cool.

This also solves my question from the prior dev diaries about how the general advisors would work.

I didn't notice, but I assume we are able to assign existing advisor/minister gfx to instead of it auto-creating them? I've figured the new system would just take the general/admiral portrait and turn them into an advisor when you promoted them, but we can set specific gfx instead?

No, the portraits work more or less the same as they do now. They are separate dds files that are assigned either by path or in a GFX file. The existing GFX entries work as expected.
 
  • 6
  • 4Like
  • 1Love
Reactions:
I had an idea, what if Poland could retake land lost to the Soviets without going to war with them? What I mean is, after Poland's capitulation and Molotov-Ribbentrop Pact or ,when Poland lasts long enough, after giving up the east, the Operation Barbarossa starts and Germans manage to occupy those lands, maybe Poland could retake them from Germans and then they could flip back to Poland? It could happen after sucessful Warsaw Uprising as historically, it was the plan of the Polish Home Army, to retake Poland from Germans before the Soviets and welcome soviet armies as an existing country which doesn't need their "liberation"
 
  • 1
Reactions:
Since we are talking about modding and characters, I think that there are two missing triggers for navy leaders. The triggers attack_skill_level, defense_skill_level, planning_skill_level, and logistics_skill_level exist already, but coordination_skill_level and maneuver_skill_level are missing. The effects add_coordination and add_maneuver are present and working though.

As for other triggers, would it possible to make the trigger free_building_slots work without specifying a building type or have a generic value like "building = any"? Despite the trigger name, I don't know how to check if a state has a free building slot, meaning if the owner can build anything. Maybe you could make a workaround by checking every type of building, but I'm not sure how that would turn out. The fact that the vanilla decision "Region-wide Industrial Integration" does not do that and sometimes has no effects tells me that it's either not possible or not worth it.

Lastly, a small QoL/OCD request: since you made it possible to order division templates in the designer, could you also let us re-order army groups? I can move around armies in a army group, but I cannot move army groups. The order is fixed on creation, I have to create them in the order I want to begin with.
 
  • 1Love
Reactions:
Hello, and welcome back to another Dev Diary for No Step back and 1.11 Barbarossa. Today we will be pulling back the veil a bit and show you how modders can affect and use the new features coming in 1.11.

For those of you who do not get unreasonably excited by hearing about new script commands and changes to databases, the long and short of it is this: We made some fundamental changes to the way the game handles some things, which will probably require your favorite mods to spend some time updating. On the flip side, those changes also allow for some exciting possibilities down the line. If you came here hoping for a release date, we must ask you for just a little more patience. We promise the announcement is very close - but not today.

Characters

Probably the biggest change is in how we handle people on the backend (or ponies, for that matter - we do not discriminate). In the current live version, the game has no real concept of a person as a distinct thing. It only knows about country leaders, military leaders, political and military advisors, and operatives. Cases where a country leader could also be a general had to be handled manually, leading to lots of exciting bugs when the country leader was removed but the general was forgotten about and other such cases.

We have overhauled that side of the game from the ground up with the introduction of characters. This should dramatically reduce the amount of potential zombie generals shambling around, which I am sure the non-zombie population will greatly appreciate.

Characters are defined in the common/character folder, and their definitions look like this:

View attachment 766436

Every character is defined as a container for different roles they can fulfill, like General (corps_commander), Advisor, country leader etc. Due to technical concerns, Operatives remain their own thing. On the character level itself, things like name and gender are handled. This also means that character names can now be localised and you can refer to a character by ID instead of by name (this helps a lot with character names that have non-english characters in them - turns out this broke some triggers and effects).

View attachment 766437

This also means that if a character is removed from play - say, through a purge - they are automatically removed from all roles that they could have, which makes such systems a lot easier to do script-side. It also means that if we wanted to allow Zhukov to become a country leader, we could simply add a country leader role for him in the character file, like this:


View attachment 766438
Or we could also add the role later on, via focus, event, decision... like we do here with Beriya:


View attachment 766439
That means there is a lot less confusion and duplication of effort necessary when putting a character into a new role, since stuff like portraits, name etc. are already handled. A broken portrait only needs to be fixed in one place instead of five etc.

Once defined, characters are recruited in the country history file in order to be added to the game. As you can see in the first screenshot, you can use visible triggers for unit leaders to ensure they are not shown if you don’t want them to be.

Characters that can potentially become country leaders are made into country leaders using the promote_character effect, like so:

View attachment 766440

This is a clear departure from the practice in the live version of the game, where you would create a new country leader in that effect. The old script with create_country_leader and other such effects should still be working, but obviously you don’t get any of the advantages of the unified character system.

So let’s talk about some more things you can do with it!

You can set and check character flags for nefarious purposes:

View attachment 766441

You can change the traits of advisors without having to make a whole new advisor:


View attachment 766442
You can check if a character is a certain type of character:

View attachment 766443

You can save the character as a variable to refer to them later, such as spamming debug messages in the console!


View attachment 766444
Tank Designer

Next, let’s talk a bit about how the tank designer works on the backend. It shares a lot of concepts with the ship designer, such as modules and module slots. It does, however, work a little differently in some other, important aspects.

While the system pretends that there are only a handful of chassis (light, medium, heavy, super-heavy, amphibious, modern), this is not technically true. Instead, the system maintains a whole host of other, dynamically created chassis. This allows us to make sure that tank designs with the tank destroyer role actually go into tank destroyer battalions etc.

However, these dynamic chassis are still generated from the base chassis, so any changes to them will carry over.

The roles are enabled and disabled on individual modules:

View attachment 766445


View attachment 766446
For the unlock of new module categories, you can then use this on a module to unlock that category:

View attachment 766447

Railways

Railways function a little differently from other buildings. While they are technically province buildings like forts, they are in reality closer to a building that connects two provinces. A railway line is effectively a series of two-province connections, and the lowest one in the chain determines the level of the railroad connection between two supply hubs.

To make it easier to change and maintain the historical railway setup, we have added an option to draw railways into the nudger tool, which you can access by using the nudge command in the console.
View attachment 766451


The railway setup is in the supply menu in the nudger, and you can easily add new railway lines to the existing setup in this way. It took me about a week and a half to do the entire 1936 setup, including tracking down reference maps (with a lot of help from some of our testers).

If you want to add railways through script, you have the build_railway effect. It gives you a lot of options, with the most basic one being to lay out the path one province at a time:

View attachment 766452

This is obviously a little cumbersome for longer railways, especially if you don’t really care about the exact path. For that, you have the option to define a start and an end province:

View attachment 766453

The game will then automatically generate a path from one end to the other using advanced neural network-based self-learning algorithms that use blockchain (read: I have no idea how it works but this sounds impressive).

If finding the province is too much work, or if you want to be somewhat dynamic, you can even use start and end states (also note that you can specify what level of connection should be built):

View attachment 766454

Note that you can’t mix these, so you can’t define a starting province and a target state for example.

There are also corresponding triggers like can_build_railway and has_railway_connection:

View attachment 766455

The first checks if a railway can be built between two locations, while the other checks if one such connection already exists.

Finally, there is has_railway_level, which checks if the specified state has a railway line in it with the specified level:

View attachment 766456
Miscellaneous new effects, triggers, modifiers

In addition to the things described above, we have added a number of useful things that some of you might find useful:

  • Building_cost_factor: a new modifier that affects the construction cost of buildings. This takes the buildings from the 00_buildings file, so it should work with mods that add more buildings.
  • Core_state scope list, allowing you to run effects and triggers on a country’s core states:
View attachment 766458

  • Add_equipment_to_stockpile effect can now take a variant name to ensure that you add the right kind of equipment.
That’s all for today, I hope you enjoyed these little insights and we are all excited about what crazy things you will do with the new tools at your disposal.
Can we have a random_province scope?
 
@Archangel85
would it be possible to add the ability to change the intervals AIs make decisions (advisors laws etc) this freezes the game at midnight for mods with lots of nations for 2-3 seconds, would be awesome if it could be changed to every week or every month for performance
 
  • 1
Reactions:
Paradox, please fix -hands_off mode in NSB patch. It is broken since the last patch and it doesn't allow to run observer games anymore without using human_ai (which requires additional manual actions for each game)
I have run my handsoff games with human_ai for years? What exact issue are you running into here?
 
  • 4Like
  • 1Love
  • 1
  • 1
Reactions:
I have run my handsoff games with human_ai for years? What exact issue are you running into here?
Before 1.10.8 we used steam argument "-hands_off", which automatically started the game at speed 5 as PAR (in vanilla). 1.10.8 broke it - the game just doesn't start with this argument. Here is the report created earlier. Here is a description from hoi4 wiki:
  • -hands_off: starts a human_ai game as URG, enabling ai_view, speed 4, and various other settings
We actively used it to run AFK games to gather game data, logs and profiler files - it required fewer actions (exactly 1 - to launch the game) than using 'human_ai' console command (launch the game - pick the country - start the game - open console - enter command - unpause the game). Thanks in advance!
 
  • 1
Reactions:
It seems that you didn't take the opportunity given by this new character craetion paradigm to correct the bad design of portraits assignment.
portrait_hard_linking.png

you once again missed the chance to use the more flexible
Code:
[...]
  army = {
    ...
    large = "GFX_portrait_sov_georgy_zhukov"
    }
or even large = "GFX_portrait_sov_georgy_zhukov_army" (in the case of a character like De Gaulle which could have a military and a political portrait... whether they actually link to the same texture in vanilla or not! a modder might draw two distinct portraits)

with the addition of a .gfx file that contains
Code:
spriteTypes = {
    ...
    spriteType = {
        name = "GFX_portrait_sov_georgy_zhukov"
        texturefile = "gfx/leaders/SOV/Portrait_Soviet_Georgy_Zhukov.dds"
    }
    ...
}

It might look similar at first on this example, but for any leader or corps commander which has a generic portrait, the change is more obvious.

Let's illustrate this with a simple example:
Code:
TAG_RANDOM_MINOR_DUDE = {
  name = "Random Minor Dude"
  portraits = {
    army = {
      #large = "gfx/leaders/Europe/portrait_europe_generic_land_1.dds"   # HARD VERSION = BAD
      #large = "GFX_portrait_europe_generic_land_1"    # generic reference = FAKE SOFT VERSION = BAD, just as rigid as hard version
      large = "GFX_portrait_tag_random_minor_dude"    # SOFT VERSION = GOOD!
    }
  }
  ...
}

I have listed some of the perks of this methods:
  1. Achievements compatibility for portraits mods
    adding a simple
    Code:
    spriteTypes = {    ...
        spriteType = {
            name = "GFX_portrait_tag_random_minor_dude"
            texturefile = "gfx/leaders/TAG/Portrait_SomeCountry_Random_Minor_Dude.dds"   # unique portrait drawn by a graphic modder!
        }
        ...
    }
    in a .gfx file (created and uniquely named early in alphanumerical order by the modder eg .../_00_my_unique_portrait_collection.gfx) takes precedence over the generic vanilla spriteType, thus gives a new unique portrait. Without altering the checksum.
  2. Lighter mods, also compatible with patch/updates
    Portraits mods with only textures and .gfx files wouldn't require to change large files in the database, often for a single line modification. Not the first time. Not for any next update. A virtually permanently valid spriteType!
  3. Mods inter-complementarity
    Imagine a database file (a country history file "/history/countries/TAG - SomeCountry.txt" for example), with 2 characters who each have a generic portrait.
    Say a first modder creates a mod where the file is edited to give the first character a unique portrait, and a second modder creates a mod where the same file is edited to give the other character a unique portrait.
    A user will have to decide which modded "TAG - SomeCountry.txt" will overwrite the other one, and will only experience one unique portrait instead of two, with the second texture never being called by the UI.
    This wouldn't be the case with spriteTypes, given the modders do not pick the same name for their respective .gfx file.
  4. "Save compatibility"
    Last time I have checked it (few years ago), if you started a game with a character who had a portrait assigned by spriteType, then relaunched the same game with his spriteType linking to a different texture path, the new texture would show up, ie you could start a game with "Random Minor Dude" having his generic vanilla portrait, find a mod giving him a unique portrait and have this new portrait active next time you'd load the game.
 
Last edited:
  • 3Like
  • 1
Reactions:
Since we are talking about modding and characters, I think that there are two missing triggers for navy leaders. The triggers attack_skill_level, defense_skill_level, planning_skill_level, and logistics_skill_level exist already, but coordination_skill_level and maneuver_skill_level are missing. The effects add_coordination and add_maneuver are present and working though.

As for other triggers, would it possible to make the trigger free_building_slots work without specifying a building type or have a generic value like "building = any"? Despite the trigger name, I don't know how to check if a state has a free building slot, meaning if the owner can build anything. Maybe you could make a workaround by checking every type of building, but I'm not sure how that would turn out. The fact that the vanilla decision "Region-wide Industrial Integration" does not do that and sometimes has no effects tells me that it's either not possible or not worth it.

Lastly, a small QoL/OCD request: since you made it possible to order division templates in the designer, could you also let us re-order army groups? I can move around armies in a army group, but I cannot move army groups. The order is fixed on creation, I have to create them in the order I want to begin with.
1) Good points, I will put it on the list
2) The building slots for "proper" buildings are interchangeable, so you can just check for arms_factory and cover the regular building slots. For the other limitations like Airbases and radar stations you'd have to check for those separately.
3) also good point, but I make no promises
Can we have a random_province scope?
There are about 800 states in the game, and using any_state excessively already causes measurable slowdown. There are 17000 provinces.
 
  • 18
  • 3Like
  • 1Love
Reactions:
May I please ask that is it possible to let two countries get the same generals by the same code?
For example, using the code "SOV_georgy_zhukov" from this diary for two different countries and then they can both have this character, does it work? If not then what should I do? Can I delete the code of "legacy_id = 410"?
The most important is that, "Characters are defined in the common/character folder", so is it still possible to add new generals by events, focus and decisions whiout writing the specific country tag? In other words, creating new generals by events and decisions.
Some mods are used to add new generals for any countries which the player is controling, it's impossible to specificly write that which tag it is...
I'm the developer of Maid Corps, I really hope to know it...
 
Last edited:
  • 1Like
Reactions:
Can leader portraits, names and traits be updated by the old scripts?
Yeah, are the old commands create_corps_commander, create_country_leader, etc. still valid?
It seems that characters are a new type of objects, and are given unique identifiers (eg SOV_georgy_zhukov), so there are reason to doubt the compatibility of old methods.