The best kittens, technology, and video games blog in the world.

Monday, August 15, 2016

Analysis and critique of Hearts of Iron 4 resistance and suppression system

Charlotte by Gattou - Lucie Provencher from flickr (CC-SA)

I wanted to write an analysis and critique of Hearts of Iron 4 resistance system, but that can't be done without a lot of math - more than can fit into reddit comment.

tl;dr is: spam divisions with 1 cavalry battalion and nothing else; or just turn resistance off.

The goal is to suppress the whole world

In all calculations we'll try different strategies to suppress the whole map at once. Of course you'll deal with less than that, but it just scales things down proportionally without affecting optimal strategy to significant degree.

We're also going to assume no partisan bonuses or penalties.

Resistance is based on number of victory points in state vs total suppression of all divisions present in state. It doesn't matter where you put those divisions within particular state, and divisions in other states don't affect resistance.

Occupied states with your cores (like in let's say China-PRC war) and states not completely occupied don't generate any resistance, but we're going to ignore those effects.

Since we're going to suppress the whole world, any resistance growth due to resistance in neighbouring states is just temporary and can be ignored.

Resistance generation

As baseline every 1 victory point in state requires 1 suppression point to prevent divisions present, but we have a choice of occupation policies:
  • harshest - 1 suppression needed / 1 vp
  • harsh - 0.8 suppression needed / 1 vp
  • gentle - 0.6 suppression needed / 1 vp - this is default setting
  • gentlest - 0.4 suppression needed / 1vp 
Important caveat is that this is rounded down, on state level. So state with total of 1 vp, at harsh policy, will require 0.8 suppression, rounded down to 0. So anything below harshest saves you from having to police low vp states completely.

List of states by victory point totals

For reference, notice how vast majority of states with nonzero vp have just a small number:
  • 1: Abruzzo, Abu Dhabi, Aden, Akmolinsk, Aleppo, Alföld, Alpes, Anhui, Antalya, Antofagasta, Aragon, Arequipa, Arkansas, Armenia, Attu Island, Bahia, Baku, Bialystok, Bihar, Bursa, Cebu, Central islands, Chelyabinsk, Coahuila, Corsica, Crete, Crisana, Dalmatia, Dodecanese, East Bengal, Eritrea, Fiji, French Guiana, Gansu, Ghana, Gilbert Islands, Goa, Granada, Guam, Gujarat, Hainan, Henan, Herat, Hyderabad, Iceland, Isfahan, Istria, Izmit, Jalisco, Jordan, Kalimantan, Kazan, Kentucky, Kenya, Kerman, Khabarovsk, Khorasan, Khuzestan, Konya, Krasnoyarsk, Kuwait, Languedoc, Lappland, Leon, Lodz, Lucknow, Macau, Macedonia, Madurai, Maranhao, Mecklenburg, Mendoza, Mesopotamia, Midway Island, Mississippi, Moldova, Montana, Moravia, Mosul, Mozambique, Munster, Murcia, Mysore, Nauru, Nebraska, New Caledonia, Nigeria, Nord-Norge, Norrland, North Borneo, North Dakota, North Korea, Northern Malay, Oklahoma, Olonets, Oregon, Palau, Perm, Polesie, Pommern, Puerto Rico, Rhodesia, Rzhev, Saipan, Salla, Scottish Highlands, Siaulai, Sierra Leone, Småland, South Carolina, South Dakota, South Sakhalin, Southern Slovakia, Sverdlovsk, Tamaulipas, Tanganyika, Tartu, Tasmania, Tikhvin, Tonkin, Transylvania, Trondelag, Tucuman, Ufa, Utah, Veracruz, Vestlandet, Voroshilovgrad, Wake Island, West Papua, Wilno, Yakutsk, Zaporozhe, Zulia
  • 2: Alabama, Angola, Hejaz, Kirin, Luzon, Mandalay, Palestine, South Island, Sumatra, Zhejiang
  • 3: Alberta, Alma-Ata, Arizona, Astrakhan, Auvergne, Azerbaijan, Azores, Benghasi, Bhutan, Ceylon, Costa Rica, Croatia, Damascus, El Salvador, Emilia Romagna, Gabon, Galicia, Guangxi, Guatemala, Guizhou, Honduras, Hong Kong, Indochina, Iowa, Irkutsk, Jiangxi, Jutland, Karjala, Kuibyshev, Liberia, Mindanao, Navarre, Nepal, Nicaragua, North Carolina, Nova Scotia, Novosibirsk, Oman, Omsk, Pohjanmaa, Pskov, Rio Grande Sul, Sardinia, Shanxi, Sind, Slovenia, Somaliland, South Chahar, Sulawesi, Tannu Tuva, Tashkent, Tennessee, Trabzon, Tula, Urumqi, Western Australia, Yemen
  • 4: Adana, Alaska, Fars, Fujian, Khartoum, Leopoldville, Liaotung, Marshall Islands, Natal, Papua, Shaanxi, Solomon Islands, South Korea
  • 5: Albania, Arkhangelsk, Bismarck, Bosnia, Bourgogne, Brabant, Burgas, Burma, Cairo, Central Macedonia, Colorado, Derna, East Anglia, Florida, Gloucestershire, Grozny, Guangzhou, Haiti, Harju, Hubei, Indiana, Iwo Jima, Izmir, Kabul, Kaunas, Kursk, La Paz, Lebanon, Leinster, Lima, Limousin, Loire, Luxemburg, Lwow, Malta, Manitoba, Midi Pyrenees, Minnesota, Miranda, Murmansk, Nejd, New Jersey, North Transylvania, Northern Ireland, Northern Territory, Novgorod, Panama, Panama Canal, Paraguay, Plovdiv, Poitou, Poznan, Saratov, Senegal, Spanish Africa, Thüringen, Tibet, Transdanubia, Tuscany, Tyrol, Uruguay, Valencia, Vitebsk, Voronezh, Wales, Weser-Ems, West Bengal, Westfalen, Wisconsin, Württemberg, Yaroslavl
  • 6: Baghdad, Caroline Islands, Castille, Cuba, Dominican Republic, Ecuador, Krasnodar, La Libertad, Mongolia, Queensland, Savoy, Scania, Taiwan, Vidzeme
  • 7: Andalusia, Ethiopia
  • 8: Georgia, Java, Rio Grande, Shandong
  • 10: Algiers, Ankara, Bombay, Bryansk, Cape, Casablanca, Champagne, Cornwall, Cundinamarca, Danzig, Eastern Switzerland, Franken, Georgia, Gibraltar, Gomel, Gorki, Hokuriku, Kalinin, Kharkov, Krakow, Lorraine, Louisiana, Mexico City, Moselland, Nanning, Niederschlesien, Northern England, Odessa, Okinawa, Orel, Ostpreussen, Porto, Rhone, Sachsen, Santiago, Shikoku, Stalino, Tehran, Transvaal, Tripoli, Upper Austria, Veneto, Virginia, Western Slovakia
  • 11: Alexandria, Dnipropetrovsk, Lothian, Pampas, Provence, Tunisia, Västergötland, Washington
  • 12: Siam, Singapore
  • 13: Qinghai, Yunnan
  • 14: Sao Paulo
  • 15: British Columbia, Calabria, Catalonia, Delhi, Hannover, Hawaii, Hunan, Koshinetsu, Lanark, Lombardy, North Island, Ohio, Ostlandet, Piedmont, Rhineland, Rostov, Serbia, Smolensk, Sofia, Switzerland, Vladivostok, Wallonie
  • 16: Manila, Rio de Janerio
  • 17: Uusimaa
  • 20: Alsace, Aquitaine, Campania, Crimea, Hessen, Hokkaido, Istanbul, Michigan, Minsk, Northern Hungary, Svealand, Thessaly, Tohoku, Warszawa
  • 21: Beijing, Missouri, Texas
  • 22: New England
  • 23: Saint Lawrence
  • 25: Bohemia, Centre, Kiev, Normandy, Schleswig-Holstein, Sichuan, Sjaelland, Victoria, West Midlands, Yorkshire
  • 26: Brittany
  • 28: Muntenia, Tokai
  • 30: Chugoku, Illinois, Leningrad, Lisbon, Madrid, Oberbayern, Pas de Calais, Shanghai, Sicily, Southern Ontario, Stalingrad
  • 33: New York
  • 35: Lancashire, Lower Austria, Pennsylvania, Sussex
  • 40: Kansai
  • 45: Latium, Maryland
  • 50: Greater London Area, Ile de France, Kanto, Moscow
  • 51: New South Wales
  • 55: Brandenburg, Kyushu
  • 65: Holland, Vlaanderen
  • 71: California

Division design

Using your regular army for suppression is a very poor idea as classic 7inf2art has abysmally low 7 suppression points for huge manpower and production cost. You pretty much need dedicated suppression divisions.

The only relevant units are:
  • cavalry - 1000 manpower and 120 infantry equipment for 2 suppression
  • military police - 500 manpower, 40 infantry, and 10 support equipment for suppression bonus between +20% and +50% depending on technology.
I'm going to assume they'll be using weapons 1, but it doesn't change calculations much. In such case both cost exactly 60 production (0.5 production per infantry equipment and 4 production per support equipment).

Suppression is rounded down per division, so if you have 5 divisions of 1cav+MP with 40% bonus (at level 3) in a state, their 5x 2.8 is actually just 10 not 14 (even though template dialog displays fractional part, implying otherwise). Fortunately this complication disappears at max level MP, as 2+50% is 3, and it's not affected by rounding.

The first thing to notice is that unless you include military police, there's absolutely no reason to ever produce cavalry divisions with multiple battalions. 10cav division has exactly the same suppression and cost as 10 1cav divisions - except with big divisions most of that suppression will be wasted as you can't place just the right amount of cavalry in each state, and excess suppression is completely wasted.

The second thing to notice is that military police is only worth it if you have a lot of cavalry in your divisions.

So the only designs to consider are:
  • 1cav
  • Ncav + military police, for somewhat big N

Suppressing the world with 1cav

The first strategy to try is to spam 1cav only.
  • On harshest - 2036 divisions, 2036k men, 112k production
  • On harsh - 1429 divisions, 1429k men, 86k production
  • On gentle - 1146 divisions, 1146k men, 69k production
  • On gentlest - 740 divisions, 740k men, 44k production
Number of divisions required is very high, but manpower cost is surprisingly reasonable, and production cost is absolutely trivial - even without trying anything cute like opening special basic equipment production line just for your cavalry.

In further discussion I'll ignore production, and only focus on saving manpower.

How bad in Ncav spam actually?

We already know that Ncav spam for any N>1 is strictly worse than 1cav spam, but let's see how much worse?

On harshest:
  • 1cav - 2036 divisions, 2036k men
  • 2cav - 1174 divisions, 2348k men
  • 3cav - 851 divisions, 2553k men
  • 4cav - 741 divisions, 2964k men
  • 5cav - 634 divisions, 3170k men
  • 6cav - 605 divisions, 3630k men
  • 7cav - 579 divisions, 4053k men
  • 8cav - 541 divisions, 4328k men
  • 9cav - 527 divisions, 4743k men
  • 10cav - 510 divisions, 5100k men
On harsh:
  • 1cav - 1429 divisions, 1429k men
  • 2cav - 756 divisions, 1512k men
  • 3cav - 611 divisions, 1833k men
  • 4cav - 487 divisions, 1948k men
  • 5cav - 453 divisions, 2265k men
  • 6cav - 407 divisions, 2442k men
  • 7cav - 393 divisions, 2751k men
  • 8cav - 373 divisions, 2984k men
  • 9cav - 367 divisions, 3303k men
  • 10cav - 350 divisions, 3500k men
On gentle:
  • 1cav - 1146 divisions, 1146k men
  • 2cav - 664 divisions, 1328k men
  • 3cav - 487 divisions, 1461k men
  • 4cav - 447 divisions, 1788k men
  • 5cav - 398 divisions, 1990k men
  • 6cav - 373 divisions, 2238k men
  • 7cav - 366 divisions, 2562k men
  • 8cav - 348 divisions, 2784k men
  • 9cav - 335 divisions, 3015k men
  • 10cav - 332 divisions, 3320k men
On gentlest:
  • 1cav - 740 divisions, 740k men
  • 2cav - 474 divisions, 948k men
  • 3cav - 396 divisions, 1188k men
  • 4cav - 362 divisions, 1448k men
  • 5cav - 340 divisions, 1700k men
  • 6cav - 325 divisions, 1950k men
  • 7cav - 317 divisions, 2219k men
  • 8cav - 316 divisions, 2528k men
  • 9cav - 314 divisions, 2826k men
  • 10cav - 309 divisions, 3090k men
And similar story on intermediate levels. 2cav to 5cav is not totally crazy if you want to save yourself from some micromanagement, especially if you want to oppress everybody more, but going for huge divisions is just bad.

It's not difficult to understand why - most states that need suppression need just a few points of suppression, so you'll be wasting a lot of it.

How bad is Ncav+MP spam?

Because of rounding down on division level, with low levels of MP technology, MP bonus is even lower than it's supposed to be. For example 2cav+MP with 1936 tech gives 4.8 suppression, rounded down to 4, no better than 2cav alone.

But let's assume best case for MPs, 1945 technology (even though most campaigns are over or basically so by that point), as 50% suppression bonus never results in any rounding issues.

And it's still bad. Optimal strategy by level is:
  • harshest: 2cav+mp - 851 divisions, 2127k men (vs 2036k for 1cav)
  • harsh: 2cav+mp - 611 divisions, 1527k men (vs 1429k for 1cav)
  • gentle: 1cav+mp - 756 divisions, 1134k men (vs 1146k for 1cav)
  • gentlest: 1cav+mp - 600 divisions, 900k men (vs 740k for 1cav)
So considering just the absolutely best case for max technology level MPs is that on gentle they save you approximately 1% manpower (and cost of 32% more production, but it's not like that matters much), on other levels and on lower tech they're strictly worse.

Suppressing with two division types

Big divisions with MP offer good suppression to manpower ratio. The main reason they end up being horrible is that suppression is calculated on state level, so they end up wasting a lot of suppression in wrong places.

What if we mixed a few division types? I decided to try Ncav+MP and 1cav mix, with semi-greedy algorithm. This actually results in better results than pure 1cav:

Optimal on harshest:
  • 2036x 1cav - 2036k men
  • 743x 1cav and 224x 4cav+mp - 1751k men
Optimal on harsh:
  • 1429x 1cav - 1429k men
  • 613x 1cav and 137x 4cav+mp - 1229k men
Optimal on gentle:
  • 1146x 1cav - 1146k men
  • 525x 1cav and 137x 3cav+mp - 1004k men
Optimal on gentlest:
  • 740x 1cav - 740k men
  • 335x 1cav and 135x 2cav+mp - 672k men
You can even squeeze some savings on low MP technology, but they will be much smaller and apply to fewer states.

The strategy is to put big divisions in high vp states, then top it up with as many 1cavs as needed - and in small states use just 1cavs.

You could try even more types - for example California on harshest treatment could be suppressed by one monstrous division of 24cav+MP (24.5k men) instead of 5x 5cav+MP (27.5k men), but that template would be too big for literally every single other state.

This is horrible design and developer should feel ashamed

Now that we established the numbers and various possible strategies, let's talk about the most important issue here. This is absolutely atrocious game design! It's 100% meaningless micromanagement with zero strategic depth.

To add insult to injury it has awful interface as the only way to get the right number of units to the right state is to:
  • ignore alert on top of the screen, as it points at wrong states anyway
  • switch to resistance map mode
  • mouseover a state because relevant information is only on the tooltip
  • decode numbers on the tooltip and do the math how many divisions that actually means in your head
  • put your finger on the screen to point at the right state, as there won't be any indication which one that was after this point
  • switch to regular map mode
  • select right number of divisions
  • press strategic redeployment button and actually send them there (or make 1-province fallback line)
  • repeat that for every state, over and over
And as if that wasn't bad enough - nobody told AI that it needs to do that, so all its lands are always wrecked by 100% resistance!

This is horrible! A checkbox on occupation policy screen subtracting appropriate number of manpower and infantry equipment from your pool would have just as much strategic depth for 1% of meaningless and miserable clicking.

If devs absolutely insist on police units appearing on the map, the absolute minimum would be to group states into something like air regions or whole occupied countries, and count any resistance and suppression on that level. And then fix the damn UI so when you are in suppression mode big number of suppression needed appears directly on the map (not in tooltip) and you can move units without switching mode.


If you're not trying to chase "achievements", just turn the whole miserable thing off by dropping file like this:


into common/defines/no_resistance.lua

Warning - this makes game significantly harder, as AI Germany will be able to use French, Belgian, and Polish factories to build its equipment instead of having them all wrecked in a few months of occupation while its units all sit in "wrong" states.

No comments: