# HOI4 Roguelike v3.8.3 - training time safety net
#
# At -100 % division training time or lower the game never finishes training: new divisions stay in the
# deployment queue forever. v3.5.5 only capped the roguelike share (rl_mod_training_time_army_factor) at -99 %,
# but national spirits, advisors, laws, doctrines and other mods stack on top of it. These effects cap the TOTAL:
# training_time_factor + training_time_army_factor from every source together never go below -99 %.
# The roguelike share gives way first; if other sources alone already reach -99 %, it turns positive to compensate.

# Temp rl_tt_other = training time from every source except the two roguelike dynamic modifiers.
# Call it BEFORE rl_mod_/rl_counter_mod_training_time_army_factor change: until then they still match what the
# dynamic modifiers apply (every change is force-updated, and dynamic modifiers refresh daily anyway).
rl_calc_training_time_other = {
    set_temp_variable = { rl_tt_other = modifier@training_time_army_factor }
    add_to_temp_variable = { rl_tt_other = modifier@training_time_factor }
    if = {
        limit = { has_dynamic_modifier = rl_roguelike_arsenal }
        subtract_from_temp_variable = { rl_tt_other = rl_mod_training_time_army_factor }
    }
    if = {
        limit = { has_dynamic_modifier = rl_player_only_counterpower }
        subtract_from_temp_variable = { rl_tt_other = rl_counter_mod_training_time_army_factor }
    }
}

# Raises the roguelike shares just enough that the total stays at -99 % or above. Needs temp rl_tt_other.
# The arsenal (upgrades) keeps as much as possible, counterpower gets what is left.
rl_apply_training_time_total_cap = {
    # lowest value both roguelike modifiers may add together: -0.99 - other
    set_temp_variable = { rl_tt_room = -0.99 }
    subtract_from_temp_variable = { rl_tt_room = rl_tt_other }
    if = {
        limit = { has_dynamic_modifier = rl_roguelike_arsenal }
        if = {
            limit = { check_variable = { rl_mod_training_time_army_factor < rl_tt_room } }
            set_variable = { rl_mod_training_time_army_factor = rl_tt_room }
        }
        subtract_from_temp_variable = { rl_tt_room = rl_mod_training_time_army_factor }
    }
    if = {
        limit = {
            has_dynamic_modifier = rl_player_only_counterpower
            check_variable = { rl_counter_mod_training_time_army_factor < rl_tt_room }
        }
        set_variable = { rl_counter_mod_training_time_army_factor = rl_tt_room }
    }
}

# Weekly: other sources (new spirits, advisors, laws, other mods) change at any time. Recalculate from the uncapped
# values, so the bonus also comes back once those sources are gone. Only force-updates when something changed.
rl_weekly_training_time_check = {
    if = {
        limit = {
            OR = {
                has_dynamic_modifier = rl_roguelike_arsenal
                has_dynamic_modifier = rl_player_only_counterpower
            }
        }
        set_temp_variable = { rl_tt_old_arsenal = rl_mod_training_time_army_factor }
        set_temp_variable = { rl_tt_old_counter = rl_counter_mod_training_time_army_factor }
        rl_calc_training_time_other = yes
        if = {
            limit = { has_dynamic_modifier = rl_roguelike_arsenal }
            set_variable = { rl_mod_training_time_army_factor = rl_raw_training_time_army_factor }
            if = {
                limit = { check_variable = { rl_mod_training_time_army_factor < -0.99 } }
                set_variable = { rl_mod_training_time_army_factor = -0.99 }
            }
        }
        if = {
            limit = {
                has_dynamic_modifier = rl_player_only_counterpower
                has_country_flag = rl_v383_counter_tt_tracked
            }
            set_variable = { rl_counter_mod_training_time_army_factor = rl_counter_raw_training_time_army_factor }
        }
        rl_apply_training_time_total_cap = yes
        if = {
            limit = {
                OR = {
                    NOT = { check_variable = { rl_mod_training_time_army_factor = rl_tt_old_arsenal } }
                    NOT = { check_variable = { rl_counter_mod_training_time_army_factor = rl_tt_old_counter } }
                }
            }
            force_update_dynamic_modifier = yes
        }
    }
}
