In Hearts of Iron 4, attorno agli inizi di aprile del 1939 (storicamente il 7 aprile 1939) l’Italia completa il focus Albanian Occupation, al quale segue l’ultimatum italiano all’Albania e la conseguente occupazione. Al giocatore umano compare un messaggio come il seguente, e può scegliere se arrendersi oppure resistere. In caso di resistenza l’Italia dichiara immediatamente guerra.
Il problema sorge quando a giocare l’Albania è l’IA, che si arrende sempre, in tutte le circostanze, anche quando sarebbe avvantaggiata. Questo succede per esempio quando l’Albania si trova con un governo comunista ed è alleata del Comintern oppure fa parte dell’Alleanza Balcanica dei Lavoratori (guidata dalla Jugoslavia comunista), anche se un altro stato la sta proteggendo.
Il problema sta nel trigger degli eventi che seguono al focus tree dell’Italia. Per analizzare il bug individuiamo la cartella /events
nella radice di HOI4 (nel mio caso avendo il gioco su Steam il percorso completo è \Steam\steamapps\common\Hearts of Iron IV\events\
) e apriamo il file Italy.txt
. Le righe di codice che ci interessano sono dalla 51 alla 159.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# Albania Receives Ultimatum country_event = { id = italy.3 title = italy.3.t desc = italy.3.d picture = GFX_report_event_albanian_king_zog is_triggered_only = yes option = { # Yield name = italy.3.a ai_chance = { base = 40 modifier = { factor = 0 OR = { any_other_country = { OR = { is_major = yes tag = YUG } NOT = { tag = ITA } OR = { has_guaranteed = ROOT is_in_faction_with = ROOT } } AND = { is_subject = yes NOT = { is_subject_of = ITA } } } } modifier = { factor = 0.5 OR = { has_government = communism has_government = fascism #glorious Albania will never yield! } } modifier = { factor = 5 is_subject_of = ITA } } ITA = { country_event = { days = 1 id = italy.1 } } custom_effect_tooltip = GAME_OVER_TT } option = { # Resist name = italy.3.b ai_chance = { factor = 20 modifier = { factor = 0 OR = { AND = { is_in_faction_with = ITA ITA = { is_faction_leader = yes } } AND = { any_other_country = { OR = { is_major = yes tag = YUG } NOT = { tag = ITA } OR = { has_guaranteed = ROOT is_in_faction_with = ROOT } } is_historical_focus_on = yes } AND = { is_in_faction = no NOT = { any_other_country = { NOT = { tag = ITA } has_guaranteed = ROOT } } } } } modifier = { add = 100 is_in_faction = yes NOT = { is_in_faction_with = ITA } } modifier = { add = 100 is_subject = yes NOT = { is_subject_of = ITA } } } ITA = { effect_tooltip = { create_wargoal = { type = take_state_focus target = ALB generator = { 44 } } } country_event = { days = 1 id = italy.2 } } } } |
L’errore si trova esattamente alla riga 104. Le chance perché l’IA decida per la resistenza sono calcolate nel modo seguente:
- fattore base per la probabilità impostato a 20
- Il primo modificatore moltiplica tale fattore per 0 (qui c’è l’errore) nel caso in cui accada una delle seguenti condizioni:
- l’Albania è in fazione con l’Italia e il leader è l’Italia
- Qualunque altro paese sia principale (major) oppure sia la Jugoslavia, non sia l’Italia, e stia garantendo oppure sia in fazione con l’Albania, assieme ai focus storici attivi
- Non sia in fazione, nessun altra nazione, eccetto dell’Italia, la stia garantendo
- Il secondo modificatore aggiunge 100 se l’Albania è in una fazione, che non contenga anche l’Italia
- Il terzo aggiunge 100 se l’Albania è controllata o è oggetto di un’altra nazione che non sia l’Italia
Il secondo modificatore dovrebbe aggiungere 100 alla probabilità (rendendola quindi certezza) laddove l’Albania si trovi in una fazione che non contenga l’Italia. Purtroppo però, come è spiegato sulla guida ufficiale, il modifier
si comporta come un blocco AND, che moltiplica il risultato totale per il factor
e ci aggiunge il valore in add
. Purtroppo però vale anche un’altra regola: se il valore intermedio scende a 0 tutte le operazioni successive si fermano e nemmeno gli add
possono più modificarlo.
Questo significa che in “Qualunque altro paese sia principale (major) oppure sia la Jugoslavia, non sia l’Italia, e stia garantendo oppure sia in fazione con l’Albania, assieme ai focus storici attivi” per assurdo il fattore viene moltiplicato per 0 e quindi le possibilità che la IA resista sono del 0%. Per correggere il problema è sufficiente rimuovere le seguenti righe di codice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
AND = { any_other_country = { OR = { is_major = yes tag = YUG } NOT = { tag = ITA } OR = { has_guaranteed = ROOT is_in_faction_with = ROOT } } is_historical_focus_on = yes } |
Questo lo possiamo fare creando anche una mod.
Per creare la mod rechiamoci nella cartella C:\Users\<nome-utente>\Documents\Paradox Interactive\Hearts of Iron IV\mod
e creiamo un file chiamato CorrezioneAlbania.mod
e una cartella chiamata CorrezioneAlbania
Nel file inseriamo le seguenti definizioni (dobbiamo sostanzialmente dare un nome alla mod e scegliere a che cosa si applichi).
1 2 3 4 5 6 7 |
version="1" tags={ "Events" } name="CorrezioneAlbania" supported_version="1.10.4" path="C:/Users/<nome-utente>/Documents/Paradox Interactive/Hearts of Iron IV/mod/CorrezioneAlbania" |
Attenzione! Sostituire sempre <nome-utente> con il proprio nome utente nella cartella profilo di Windows.
Nella cartella creare un file chiamato descriptor.mod
con al suo interno il seguente codice:
1 2 3 4 5 6 |
version="1" tags={ "Events" } name="CorrezioneAlbania" supported_version="1.10.4" |
Creare infine una cartella events
nella quale metteremo un file di testo chiamato CorrezioneAlbania.txt
. Al suo interno copiamo il codice precedente corretto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
add_namespace = italy # Albania Receives Ultimatum country_event = { id = italy.3 title = italy.3.t desc = italy.3.d picture = GFX_report_event_albanian_king_zog is_triggered_only = yes option = { # Yield name = italy.3.a ai_chance = { base = 40 modifier = { factor = 0 OR = { any_other_country = { OR = { is_major = yes tag = YUG } NOT = { tag = ITA } OR = { has_guaranteed = ROOT is_in_faction_with = ROOT } } AND = { is_subject = yes NOT = { is_subject_of = ITA } } } } modifier = { factor = 0.5 OR = { has_government = communism has_government = fascism #glorious Albania will never yield! } } modifier = { factor = 5 is_subject_of = ITA } } ITA = { country_event = { days = 1 id = italy.1 } } custom_effect_tooltip = GAME_OVER_TT } option = { # Resist name = italy.3.b ai_chance = { factor = 20 modifier = { factor = 0 OR = { AND = { is_in_faction_with = ITA ITA = { is_faction_leader = yes } } AND = { is_in_faction = no NOT = { any_other_country = { NOT = { tag = ITA } has_guaranteed = ROOT } } } } } modifier = { add = 100 is_in_faction = yes NOT = { is_in_faction_with = ITA } } modifier = { add = 100 is_subject = yes NOT = { is_subject_of = ITA } } } ITA = { effect_tooltip = { create_wargoal = { type = take_state_focus target = ALB generator = { 44 } } } country_event = { days = 1 id = italy.2 } } } } |
Fatto tutto questo salviamo e avviamo il gioco. Se è andato tutto bene e l’Albania è in fazione con noi, al momento dell’ultimatum dovrebbe rifiutarlo e noi riceveremo la seguente notizia.
In tale caso prepariamoci alla guerra con l’Italia, dal momento che le ultime righe di codice dell’evento la attivano automaticamente:
1 2 3 4 5 6 7 8 9 10 |
ITA = { effect_tooltip = { create_wargoal = { type = take_state_focus target = ALB generator = { 44 } } } country_event = { days = 1 id = italy.2 } } |
Per curiosità, togliendoli questo non avviene. In caso contrario conviene armarsi.