# HOI4 Roguelike v3.8.0 - bugfixes, balance and performance helpers

### MODIFIER CAPS ###
# The dynamic modifier rl_roguelike_arsenal reads rl_eff_* for these modifiers. rl_mod_* keeps the raw sum
# (so Hardcore removal stays exact), rl_eff_* is the clamped value that actually applies.
# Costs/penalties (lower is better) are floored at -80 % and capped at +50 %,
# benefits that curses can push negative are floored at -50 % (stability at -25 %).
rl_sync_modifier_caps = {
    set_variable = { rl_eff_air_accidents_factor = rl_mod_air_accidents_factor }
    clamp_variable = { var = rl_eff_air_accidents_factor min = -0.8 max = 0.5 }
    set_variable = { rl_eff_air_fuel_consumption_factor = rl_mod_air_fuel_consumption_factor }
    clamp_variable = { var = rl_eff_air_fuel_consumption_factor min = -0.8 max = 0.5 }
    set_variable = { rl_eff_air_night_penalty = rl_mod_air_night_penalty }
    clamp_variable = { var = rl_eff_air_night_penalty min = -0.8 max = 0.5 }
    set_variable = { rl_eff_air_weather_penalty = rl_mod_air_weather_penalty }
    clamp_variable = { var = rl_eff_air_weather_penalty min = -0.8 max = 0.5 }
    set_variable = { rl_eff_army_fuel_consumption_factor = rl_mod_army_fuel_consumption_factor }
    clamp_variable = { var = rl_eff_army_fuel_consumption_factor min = -0.8 max = 0.5 }
    set_variable = { rl_eff_command_abilities_cost_factor = rl_mod_command_abilities_cost_factor }
    clamp_variable = { var = rl_eff_command_abilities_cost_factor min = -0.8 max = 0.5 }
    set_variable = { rl_eff_conversion_cost_civ_to_mil_factor = rl_mod_conversion_cost_civ_to_mil_factor }
    clamp_variable = { var = rl_eff_conversion_cost_civ_to_mil_factor min = -0.8 max = 0.5 }
    set_variable = { rl_eff_equipment_upgrade_xp_cost = rl_mod_equipment_upgrade_xp_cost }
    clamp_variable = { var = rl_eff_equipment_upgrade_xp_cost min = -0.8 max = 0.5 }
    set_variable = { rl_eff_experience_loss_factor = rl_mod_experience_loss_factor }
    clamp_variable = { var = rl_eff_experience_loss_factor min = -0.8 max = 0.5 }
    set_variable = { rl_eff_industry_air_damage_factor = rl_mod_industry_air_damage_factor }
    clamp_variable = { var = rl_eff_industry_air_damage_factor min = -0.8 max = 0.5 }
    set_variable = { rl_eff_navy_fuel_consumption_factor = rl_mod_navy_fuel_consumption_factor }
    clamp_variable = { var = rl_eff_navy_fuel_consumption_factor min = -0.8 max = 0.5 }
    set_variable = { rl_eff_out_of_supply_factor = rl_mod_out_of_supply_factor }
    clamp_variable = { var = rl_eff_out_of_supply_factor min = -0.8 max = 0.5 }
    set_variable = { rl_eff_production_lack_of_resource_penalty_factor = rl_mod_production_lack_of_resource_penalty_factor }
    clamp_variable = { var = rl_eff_production_lack_of_resource_penalty_factor min = -0.8 max = 0.5 }
    set_variable = { rl_eff_supply_consumption_factor = rl_mod_supply_consumption_factor }
    clamp_variable = { var = rl_eff_supply_consumption_factor min = -0.75 max = 0.5 }
    set_variable = { rl_eff_resistance_target = rl_mod_resistance_target }
    clamp_variable = { var = rl_eff_resistance_target min = -0.8 max = 0.5 }
    set_variable = { rl_eff_min_export = rl_mod_min_export }
    clamp_variable = { var = rl_eff_min_export min = -0.8 max = 0.5 }
    set_variable = { rl_eff_consumer_goods_factor = rl_mod_consumer_goods_factor }
    clamp_variable = { var = rl_eff_consumer_goods_factor min = -0.8 max = 0.5 }

    set_variable = { rl_eff_industrial_capacity_factory = rl_mod_industrial_capacity_factory }
    clamp_variable = { var = rl_eff_industrial_capacity_factory min = -0.5 }
    set_variable = { rl_eff_research_speed_factor = rl_mod_research_speed_factor }
    clamp_variable = { var = rl_eff_research_speed_factor min = -0.5 }
    set_variable = { rl_eff_army_attack_factor = rl_mod_army_attack_factor }
    clamp_variable = { var = rl_eff_army_attack_factor min = -0.5 }
    set_variable = { rl_eff_army_org_factor = rl_mod_army_org_factor }
    clamp_variable = { var = rl_eff_army_org_factor min = -0.5 }
    set_variable = { rl_eff_army_armor_attack_factor = rl_mod_army_armor_attack_factor }
    clamp_variable = { var = rl_eff_army_armor_attack_factor min = -0.5 }
    set_variable = { rl_eff_armor_factor = rl_mod_armor_factor }
    clamp_variable = { var = rl_eff_armor_factor min = -0.5 }
    set_variable = { rl_eff_air_attack_factor = rl_mod_air_attack_factor }
    clamp_variable = { var = rl_eff_air_attack_factor min = -0.5 }
    set_variable = { rl_eff_air_maximum_speed_factor = rl_mod_air_maximum_speed_factor }
    clamp_variable = { var = rl_eff_air_maximum_speed_factor min = -0.5 }
    set_variable = { rl_eff_naval_damage_factor = rl_mod_naval_damage_factor }
    clamp_variable = { var = rl_eff_naval_damage_factor min = -0.5 }
    set_variable = { rl_eff_naval_speed_factor = rl_mod_naval_speed_factor }
    clamp_variable = { var = rl_eff_naval_speed_factor min = -0.5 }
    set_variable = { rl_eff_political_power_factor = rl_mod_political_power_factor }
    clamp_variable = { var = rl_eff_political_power_factor min = -0.5 }
    set_variable = { rl_eff_special_project_speed_factor = rl_mod_special_project_speed_factor }
    clamp_variable = { var = rl_eff_special_project_speed_factor min = -0.5 }
    set_variable = { rl_eff_stability_factor = rl_mod_stability_factor }
    clamp_variable = { var = rl_eff_stability_factor min = -0.25 }
}

### OFFER FLOW ###
# Instead of opening a second selection while one is still open (which allowed double picks),
# missed offers are queued (max. 3) and delivered one after another.
rl_schedule_offer = {
    if = {
        limit = { rl_offer_ui_busy = yes }
        if = {
            limit = { check_variable = { rl_offer_queue < 3 } }
            add_to_variable = { rl_offer_queue = 1 }
        }
    }
    else = {
        set_country_flag = { flag = rl_offer_event_scheduled days = 5 value = 1 }
        country_event = { id = rl.1 }
    }
}

rl_offer_queue_pump = {
    if = {
        limit = {
            check_variable = { rl_offer_queue > 0 }
            NOT = { rl_offer_ui_busy = yes }
        }
        add_to_variable = { rl_offer_queue = -1 }
        set_country_flag = { flag = rl_offer_event_scheduled days = 5 value = 1 }
        country_event = { id = rl.1 days = 1 }
    }
}

# Safety net for saves where an offer window was lost: event timeout is 13 days,
# so an offer flag older than 30 days can only be stale.
rl_offer_clear_stale_state = {
    if = {
        limit = { has_country_flag = { flag = rl_offers_ready days > 30 } }
        clr_country_flag = rl_offers_ready
    }
    if = {
        limit = { has_country_flag = { flag = rl_hc_management_mode days > 30 } }
        clr_country_flag = rl_hc_management_mode
    }
    if = {
        limit = { has_country_flag = { flag = rl_hc_replacement_mode days > 30 } }
        rl_hc_reject_pending_upgrade = yes
    }
}

# A locked offer that is picked right away is consumed, so it cannot be taken a second time next round.
rl_consume_lock_if_selected = {
    if = {
        limit = {
            has_country_flag = rl_has_locked_offer
            check_variable = { rl_locked_offer_id = rl_selected_id }
            check_variable = { rl_locked_offer_rarity = rl_selected_rarity }
        }
        clr_country_flag = rl_has_locked_offer
        set_variable = { rl_locked_offer_id = 0 }
        set_variable = { rl_locked_offer_rarity = 0 }
    }
}

rl_pick_offer_1 = {
    if = {
        limit = { has_country_flag = rl_offers_ready }
        set_variable = { rl_selected_id = rl_offer_1_id }
        set_variable = { rl_selected_rarity = rl_offer_1_rarity }
        clr_country_flag = rl_offers_ready
        rl_consume_lock_if_selected = yes
        rl_apply_selected_upgrade = yes
    }
    rl_offer_queue_pump = yes
}

rl_pick_offer_2 = {
    if = {
        limit = { has_country_flag = rl_offers_ready }
        set_variable = { rl_selected_id = rl_offer_2_id }
        set_variable = { rl_selected_rarity = rl_offer_2_rarity }
        clr_country_flag = rl_offers_ready
        rl_consume_lock_if_selected = yes
        rl_apply_selected_upgrade = yes
    }
    rl_offer_queue_pump = yes
}

rl_pick_offer_3 = {
    if = {
        limit = { has_country_flag = rl_offers_ready }
        set_variable = { rl_selected_id = rl_offer_3_id }
        set_variable = { rl_selected_rarity = rl_offer_3_rarity }
        clr_country_flag = rl_offers_ready
        rl_consume_lock_if_selected = yes
        rl_apply_selected_upgrade = yes
    }
    rl_offer_queue_pump = yes
}

### RARITY ROLL ###
# One random number compared against the cumulative chances instead of a 100-branch chain per offer.
rl_roll_rarity_value = {
    set_temp_variable_to_random = { var = rl_rr min = 0 max = 100 }
    set_temp_variable = { rl_rt = rl_chance_common }
    if = {
        limit = { check_variable = { rl_rr < rl_rt } }
        set_temp_variable = { rl_rolled_rarity = 1 }
    }
    else = {
        add_to_temp_variable = { rl_rt = rl_chance_rare }
        if = {
            limit = { check_variable = { rl_rr < rl_rt } }
            set_temp_variable = { rl_rolled_rarity = 2 }
        }
        else = {
            add_to_temp_variable = { rl_rt = rl_chance_epic }
            if = {
                limit = { check_variable = { rl_rr < rl_rt } }
                set_temp_variable = { rl_rolled_rarity = 3 }
            }
            else = {
                add_to_temp_variable = { rl_rt = rl_chance_legendary }
                if = {
                    limit = { check_variable = { rl_rr < rl_rt } }
                    set_temp_variable = { rl_rolled_rarity = 4 }
                }
                else = {
                    set_temp_variable = { rl_rolled_rarity = 5 }
                }
            }
        }
    }
    if = {
        limit = {
            is_ai = yes
            check_variable = { rl_rolled_rarity = 5 }
            has_game_rule = { rule = rl_rule_ai_divine option = RL_AI_DIVINE_LEGENDARY }
        }
        set_temp_variable = { rl_rolled_rarity = 4 }
    }
}

rl_roll_rarity_1 = {
    rl_roll_rarity_value = yes
    set_variable = { rl_offer_1_rarity = rl_rolled_rarity }
}

rl_roll_rarity_2 = {
    rl_roll_rarity_value = yes
    set_variable = { rl_offer_2_rarity = rl_rolled_rarity }
}

rl_roll_rarity_3 = {
    rl_roll_rarity_value = yes
    set_variable = { rl_offer_3_rarity = rl_rolled_rarity }
}

### CORE FORGE ###
# random = { chance = <variable> } is not reliably supported, so roll a number and compare.
rl_core_forge_roll = {
    set_temp_variable_to_random = { var = rl_forge_roll min = 0 max = 100 }
    if = {
        limit = { check_variable = { rl_forge_roll < rl_core_forge_chance } }
        random_owned_controlled_state = {
            limit = { NOT = { is_core_of = ROOT } }
            add_core_of = ROOT
        }
    }
}

### TECH FALLBACK ###
rl_tech_pool_exhausted_reward = {
    add_to_variable = { rl_fate_shards = 2 }
    add_to_variable = { rl_tech_fallback_count = 1 }
}

### VERSION MIGRATION ###
rl_v38_migrate_country = {
    if = {
        limit = { NOT = { has_country_flag = rl_v38_initialized } }
        set_country_flag = rl_v38_initialized
        set_variable = { rl_offer_queue = 0 }
        set_variable = { rl_tech_fallback_count = 0 }
        rl_apply_curse_rule_bans = yes
        clr_country_flag = rl_rarity_synced
    }
}

### CURSE RULE ###
# Game rule 'Cursed upgrades: disabled' removes all cursed upgrades from the offer pool (reuses the banish flags).
rl_apply_curse_rule_bans = {
    if = {
        limit = { has_game_rule = { rule = rl_rule_curses option = RL_CURSES_OFF } }
        set_country_flag = rl_banned_97
        set_country_flag = rl_banned_98
        set_country_flag = rl_banned_99
        set_country_flag = rl_banned_198
        set_country_flag = rl_banned_199
        set_country_flag = rl_banned_200
        set_country_flag = rl_banned_224
        set_country_flag = rl_banned_229
        set_country_flag = rl_banned_261
        set_country_flag = rl_banned_266
        set_country_flag = rl_banned_270
        set_country_flag = rl_banned_274
        set_country_flag = rl_banned_277
        set_country_flag = rl_banned_280
        set_country_flag = rl_banned_286
        set_country_flag = rl_banned_290
        set_country_flag = rl_banned_302
        set_country_flag = rl_banned_306
        set_country_flag = rl_banned_312
        set_country_flag = rl_banned_331
        set_country_flag = rl_banned_379
        set_country_flag = rl_banned_383
        set_country_flag = rl_banned_389
        set_country_flag = rl_banned_393
        set_country_flag = rl_banned_395
        set_country_flag = rl_banned_397
        set_country_flag = rl_banned_400
        set_country_flag = rl_banned_420
        set_country_flag = rl_banned_425
        set_country_flag = rl_banned_429
        set_country_flag = rl_banned_436
        set_country_flag = rl_banned_462
        set_country_flag = rl_banned_467
        set_country_flag = rl_banned_483
        set_country_flag = rl_banned_485
        set_country_flag = rl_banned_488
        set_country_flag = rl_banned_504
        set_country_flag = rl_banned_508
        set_country_flag = rl_banned_513
        set_country_flag = rl_banned_517
        set_country_flag = rl_banned_522
        set_country_flag = rl_banned_533
        set_country_flag = rl_banned_538
        set_country_flag = rl_banned_542
        set_country_flag = rl_banned_547
        set_country_flag = rl_banned_551
        set_country_flag = rl_banned_556
        set_country_flag = rl_banned_560
        set_country_flag = rl_banned_563
        set_country_flag = rl_banned_565
        set_country_flag = rl_banned_572
        set_country_flag = rl_banned_574
        set_country_flag = rl_banned_577
        set_country_flag = rl_banned_584
        set_country_flag = rl_banned_592
        set_country_flag = rl_banned_593
        set_country_flag = rl_banned_596
        set_country_flag = rl_banned_597
        set_country_flag = rl_banned_599
        set_country_flag = rl_banned_600
    }
}


### HARDCORE REMOVAL OF PERMANENT PARTS ###
# v3.8.0: Hardcore removal also reverts permanent one-shot parts (research slots, offsite factories)
# of slot-bound upgrades. Generated from rl_apply_selected_upgrade_direct / _v26.
rl_hc_remove_permanent_parts = {
    if = {
        limit = { check_variable = { rl_selected_id = 230 } }
        if = {
            limit = { check_variable = { rl_selected_rarity = 1 } }
            add_offsite_building = { type = arms_factory level = -1 }
            add_to_variable = { rl_factories_added = -1 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 2 } }
            add_offsite_building = { type = arms_factory level = -1 }
            add_to_variable = { rl_factories_added = -1 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 3 } }
            add_offsite_building = { type = arms_factory level = -2 }
            add_to_variable = { rl_factories_added = -2 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 4 } }
            add_offsite_building = { type = arms_factory level = -3 }
            add_to_variable = { rl_factories_added = -3 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 5 } }
            add_offsite_building = { type = arms_factory level = -6 }
            add_to_variable = { rl_factories_added = -6 }
        }
    }
    else_if = {
        limit = { check_variable = { rl_selected_id = 385 } }
        if = {
            limit = { check_variable = { rl_selected_rarity = 3 } }
            add_research_slot = -1
            add_to_variable = { rl_research_slots_granted = -1 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 4 } }
            add_research_slot = -2
            add_to_variable = { rl_research_slots_granted = -2 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 5 } }
            add_research_slot = -3
            add_to_variable = { rl_research_slots_granted = -3 }
        }
    }
    else_if = {
        limit = { check_variable = { rl_selected_id = 386 } }
        if = {
            limit = { check_variable = { rl_selected_rarity = 3 } }
            add_research_slot = -2
            add_to_variable = { rl_research_slots_granted = -2 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 4 } }
            add_research_slot = -3
            add_to_variable = { rl_research_slots_granted = -3 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 5 } }
            add_research_slot = -4
            add_to_variable = { rl_research_slots_granted = -4 }
        }
    }
    else_if = {
        limit = { check_variable = { rl_selected_id = 399 } }
        if = {
            limit = { check_variable = { rl_selected_rarity = 1 } }
            add_offsite_building = { type = arms_factory level = -1 }
            add_offsite_building = { type = industrial_complex level = -1 }
            add_to_variable = { rl_factories_added = -2 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 2 } }
            add_offsite_building = { type = arms_factory level = -2 }
            add_offsite_building = { type = industrial_complex level = -2 }
            add_to_variable = { rl_factories_added = -4 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 3 } }
            add_offsite_building = { type = arms_factory level = -4 }
            add_offsite_building = { type = industrial_complex level = -4 }
            add_to_variable = { rl_factories_added = -8 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 4 } }
            add_offsite_building = { type = arms_factory level = -8 }
            add_offsite_building = { type = industrial_complex level = -8 }
            add_to_variable = { rl_factories_added = -16 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 5 } }
            add_offsite_building = { type = arms_factory level = -16 }
            add_offsite_building = { type = industrial_complex level = -16 }
            add_to_variable = { rl_factories_added = -32 }
        }
    }
    else_if = {
        limit = { check_variable = { rl_selected_id = 581 } }
        if = {
            limit = { check_variable = { rl_selected_rarity = 1 } }
            add_offsite_building = { type = arms_factory level = -1 }
            add_offsite_building = { type = industrial_complex level = -1 }
            add_offsite_building = { type = dockyard level = -1 }
            add_to_variable = { rl_factories_added = -3 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 2 } }
            add_offsite_building = { type = arms_factory level = -2 }
            add_offsite_building = { type = industrial_complex level = -2 }
            add_offsite_building = { type = dockyard level = -2 }
            add_to_variable = { rl_factories_added = -6 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 3 } }
            add_offsite_building = { type = arms_factory level = -4 }
            add_offsite_building = { type = industrial_complex level = -4 }
            add_offsite_building = { type = dockyard level = -4 }
            add_to_variable = { rl_factories_added = -12 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 4 } }
            add_offsite_building = { type = arms_factory level = -8 }
            add_offsite_building = { type = industrial_complex level = -8 }
            add_offsite_building = { type = dockyard level = -8 }
            add_to_variable = { rl_factories_added = -24 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 5 } }
            add_offsite_building = { type = arms_factory level = -20 }
            add_offsite_building = { type = industrial_complex level = -20 }
            add_offsite_building = { type = dockyard level = -20 }
            add_to_variable = { rl_factories_added = -60 }
        }
    }
    else_if = {
        limit = { check_variable = { rl_selected_id = 587 } }
        if = {
            limit = { check_variable = { rl_selected_rarity = 3 } }
            add_research_slot = -1
            add_to_variable = { rl_research_slots_granted = -1 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 4 } }
            add_research_slot = -3
            add_to_variable = { rl_research_slots_granted = -3 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 5 } }
            add_research_slot = -6
            add_to_variable = { rl_research_slots_granted = -6 }
        }
    }
    else_if = {
        limit = { check_variable = { rl_selected_id = 595 } }
        if = {
            limit = { check_variable = { rl_selected_rarity = 1 } }
            add_offsite_building = { type = dockyard level = -1 }
            add_to_variable = { rl_factories_added = -1 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 2 } }
            add_offsite_building = { type = dockyard level = -3 }
            add_to_variable = { rl_factories_added = -3 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 3 } }
            add_offsite_building = { type = dockyard level = -6 }
            add_to_variable = { rl_factories_added = -6 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 4 } }
            add_offsite_building = { type = dockyard level = -15 }
            add_to_variable = { rl_factories_added = -15 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 5 } }
            add_offsite_building = { type = dockyard level = -40 }
            add_to_variable = { rl_factories_added = -40 }
        }
    }
    else_if = {
        limit = { check_variable = { rl_selected_id = 597 } }
        if = {
            limit = { check_variable = { rl_selected_rarity = 3 } }
            add_research_slot = -1
            add_to_variable = { rl_research_slots_granted = -1 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 4 } }
            add_research_slot = -3
            add_to_variable = { rl_research_slots_granted = -3 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 5 } }
            add_research_slot = -5
            add_to_variable = { rl_research_slots_granted = -5 }
        }
    }
    else_if = {
        limit = { check_variable = { rl_selected_id = 599 } }
        if = {
            limit = { check_variable = { rl_selected_rarity = 1 } }
            add_offsite_building = { type = arms_factory level = -1 }
            add_offsite_building = { type = industrial_complex level = -1 }
            add_offsite_building = { type = dockyard level = -1 }
            add_to_variable = { rl_factories_added = -3 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 2 } }
            add_offsite_building = { type = arms_factory level = -3 }
            add_offsite_building = { type = industrial_complex level = -3 }
            add_offsite_building = { type = dockyard level = -3 }
            add_to_variable = { rl_factories_added = -9 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 3 } }
            add_offsite_building = { type = arms_factory level = -6 }
            add_offsite_building = { type = industrial_complex level = -6 }
            add_offsite_building = { type = dockyard level = -6 }
            add_to_variable = { rl_factories_added = -18 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 4 } }
            add_offsite_building = { type = arms_factory level = -15 }
            add_offsite_building = { type = industrial_complex level = -15 }
            add_offsite_building = { type = dockyard level = -15 }
            add_to_variable = { rl_factories_added = -45 }
        }
        else_if = {
            limit = { check_variable = { rl_selected_rarity = 5 } }
            add_offsite_building = { type = arms_factory level = -40 }
            add_offsite_building = { type = industrial_complex level = -40 }
            add_offsite_building = { type = dockyard level = -40 }
            add_to_variable = { rl_factories_added = -120 }
        }
    }
    if = { limit = { check_variable = { rl_research_slots_granted < 0 } } set_variable = { rl_research_slots_granted = 0 } }
    if = { limit = { check_variable = { rl_factories_added < 0 } } set_variable = { rl_factories_added = 0 } }
}

