# Bumps the dirty counter used by the auto-agency scripted_guis so they only # refresh when queue/selection/automation state actually changed, instead of # every tick. Wraps at 10000 to stay within safe integer range. MD_auto_agency_mark_dirty = { if = { limit = { check_variable = { global.auto_agency_upgrade < 10000 } } add_to_variable = { global.auto_agency_upgrade = 1 } } else = { set_variable = { global.auto_agency_upgrade = 1 } } } # Caller must `set_temp_variable = { shrink_idx = N }` before invoking. MD_auto_agency_shrink_queue_at_index = { set_temp_variable = { last = agency_queue^num } subtract_from_temp_variable = { last = 1 } if = { limit = { check_variable = { agency_queue^num > 1 } check_variable = { shrink_idx < last } } set_temp_variable = { start_from = shrink_idx } add_to_temp_variable = { start_from = 1 } for_loop_effect = { start = start_from end = agency_queue^num value = v2 set_temp_variable = { above = v2 } subtract_from_temp_variable = { above = 1 } set_variable = { agency_queue^above = agency_queue^v2 } } clear_variable = agency_queue^last subtract_from_variable = { agency_queue^num = 1 } } else_if = { limit = { check_variable = { agency_queue^num = 1 } } clear_array = agency_queue } else = { clear_variable = agency_queue^last subtract_from_variable = { agency_queue^num = 1 } } } MD_auto_agency_toggle_dropdown = { if = { limit = { check_variable = { agency_dropdown_visible = 2 } } set_variable = { agency_dropdown_visible = 1 } } else = { set_variable = { agency_dropdown_visible = 2 } } } MD_auto_agency_verify_queue = { if = { limit = { has_variable = agency_queue^num check_variable = { agency_queue^num > 0 } } resize_array = { array = agency_upgrades_in_queue_count size = agency_upgrades_completed_and_queued^num value = 0 } if = { limit = { NOT = { check_variable = { agency_selected_upgrade = -1 } } } add_to_variable = { agency_upgrades_in_queue_count^agency_selected_upgrade = 1 } } # Compacts in place with a forward for_loop_effect: for_each_loop # iterates back-to-front and would reverse the queue every pass. set_temp_variable = { write_idx = 0 } for_loop_effect = { end = agency_queue^num value = v2 set_temp_variable = { v = agency_queue^v2 } if = { limit = { MD_auto_agency_v_index_valid = yes MD_auto_agency_v_not_maxed_in_queue = yes } set_variable = { agency_queue^write_idx = v } add_to_variable = { agency_upgrades_in_queue_count^v = 1 } add_to_temp_variable = { write_idx = 1 } } else_if = { limit = { MD_auto_agency_v_index_valid = yes check_variable = { agency_upgrades_completed_and_queued^v > 0 } } subtract_from_variable = { agency_upgrades_completed_and_queued^v = 1 } } } resize_array = { array = agency_queue size = write_idx } clear_array = agency_upgrades_in_queue_count } } MD_auto_agency_find_first_valid = { MD_auto_agency_verify_queue = yes set_variable = { agency_selected_upgrade = -1 } if = { limit = { has_intelligence_agency = yes has_variable = agency_queue^num check_variable = { agency_queue^num > 0 } } # Walk the queue top-down (index 0 first) so the first selectable item # wins; for_each_loop iterates arrays back-to-front, which would pick # the bottom of the queue instead. for_loop_effect = { end = agency_queue^num value = v2 break = MD_auto_agency_loop_break set_temp_variable = { v = agency_queue^v2 } if = { limit = { MD_auto_agency_v_index_valid = yes MD_auto_agency_v_can_select = yes } set_variable = { agency_selected_upgrade = v } set_temp_variable = { idx_to_remove = v2 } set_temp_variable = { MD_auto_agency_loop_break = 1 } } } } if = { limit = { check_variable = { agency_selected_upgrade = -1 } check_variable = { automate_agency_upgrades_choice = 2 } } MD_auto_agency_select_random = yes if = { limit = { NOT = { check_variable = { agency_selected_upgrade = -1 } } } add_to_variable = { agency_upgrades_completed_and_queued^agency_selected_upgrade = 1 } } } else_if = { limit = { NOT = { check_variable = { agency_selected_upgrade = -1 } } } set_temp_variable = { shrink_idx = idx_to_remove } MD_auto_agency_shrink_queue_at_index = yes } } MD_auto_agency_select_random = { clear_array = random_agency_upgrade_to_select for_loop_effect = { end = global.agency_upgrades^num value = v if = { limit = { MD_auto_agency_v_can_select = yes MD_auto_agency_v_slot_available = yes } add_to_array = { random_agency_upgrade_to_select = v } } } if = { limit = { has_variable = random_agency_upgrade_to_select^num check_variable = { random_agency_upgrade_to_select^num > 0 } } set_temp_variable_to_random = { var = random_num min = 0 max = random_agency_upgrade_to_select^num integer = yes } set_variable = { agency_selected_upgrade = random_agency_upgrade_to_select^random_num } } clear_array = random_agency_upgrade_to_select } MD_auto_agency_apply_selected = { set_temp_variable = { v = agency_selected_upgrade } if = { limit = { MD_auto_agency_v_index_valid = yes } meta_effect = { text = { upgrade_intelligence_agency = [AGENCY] } AGENCY = "[?global.agency_upgrades^v.GetTokenLocalizedKey]" } } set_variable = { agency_selected_upgrade = -1 } MD_auto_agency_mark_dirty = yes } MD_auto_agency_init_country_state = { # State variables first: an unset agency_selected_upgrade reads 0, not -1, and # MD_auto_agency_can_start would then refuse every start for the rest of the game. if = { limit = { NOT = { has_variable = agency_selected_upgrade } } set_variable = { agency_selected_upgrade = -1 } } if = { limit = { NOT = { has_variable = automate_agency_upgrades_choice } } set_variable = { automate_agency_upgrades_choice = 1 } } if = { limit = { NOT = { has_variable = agency_dropdown_visible } } set_variable = { agency_dropdown_visible = 2 } } resize_array = { array = agency_upgrades_completed_and_queued value = 0 size = 25 } MD_auto_agency_seed_completed_cache = yes MD_auto_agency_get_upgrade_time = yes MD_auto_agency_mark_dirty = yes } # Seeds the completion cache with levels taken outside the automation (history, focuses, # the vanilla agency UI). has_done_agency_upgrade needs a literal upgrade name, so the # index mapping from MD_auto_agency_on_actions.txt is written out statically. MD_auto_agency_seed_completed_cache = { if = { limit = { has_done_agency_upgrade = upgrade_economy_civilian } set_variable = { agency_upgrades_completed_and_queued^0 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_army_department } set_variable = { agency_upgrades_completed_and_queued^1 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_computer_servers } set_variable = { agency_upgrades_completed_and_queued^2 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_passive_defense } set_variable = { agency_upgrades_completed_and_queued^3 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_anti_partisan } set_variable = { agency_upgrades_completed_and_queued^4 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_counter_terror_operations } set_variable = { agency_upgrades_completed_and_queued^5 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_blueprint_stealing } set_variable = { agency_upgrades_completed_and_queued^6 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_portable_radios } set_variable = { agency_upgrades_completed_and_queued^7 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_invisible_ink } set_variable = { agency_upgrades_completed_and_queued^8 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_plastic_explosives } set_variable = { agency_upgrades_completed_and_queued^9 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_suicide_pills } set_variable = { agency_upgrades_completed_and_queued^10 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_training_centers } set_variable = { agency_upgrades_completed_and_queued^11 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_commando_training } set_variable = { agency_upgrades_completed_and_queued^12 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_interrogation_techniques } set_variable = { agency_upgrades_completed_and_queued^13 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_diplo_training } set_variable = { agency_upgrades_completed_and_queued^14 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_psycho_warfare } set_variable = { agency_upgrades_completed_and_queued^15 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_form_department } set_variable = { agency_upgrades_completed_and_queued^16 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_decryption_boost } set_variable = { agency_upgrades_completed_and_queued^17 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_crypto_strength } set_variable = { agency_upgrades_completed_and_queued^18 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_crypto_strength_2 } set_variable = { agency_upgrades_completed_and_queued^19 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_establish_cyber_operations_division } set_variable = { agency_upgrades_completed_and_queued^20 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_offensive_cyber_operations } set_variable = { agency_upgrades_completed_and_queued^21 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_cyber_warfare_operational_planning } set_variable = { agency_upgrades_completed_and_queued^22 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_defensive_cyber_operations } set_variable = { agency_upgrades_completed_and_queued^23 = 1 } } if = { limit = { has_done_agency_upgrade = upgrade_cyber_elite } set_variable = { agency_upgrades_completed_and_queued^24 = 1 } } } MD_auto_agency_get_upgrade_time = { set_variable = { agency_upgrade_time_days = modifier@agency_upgrade_time } add_to_variable = { agency_upgrade_time_days = 1 } multiply_variable = { agency_upgrade_time_days = global.agency_upgrade_time_days_base } clamp_variable = { var = agency_upgrade_time_days min = 1 } round_variable = agency_upgrade_time_days } MD_auto_agency_queue_push_front = { # Caller must `set_temp_variable = { push_front_val = N }` before invoking. add_to_array = { agency_queue = push_front_val } set_temp_variable = { last = agency_queue^num } subtract_from_temp_variable = { last = 1 } for_loop_effect = { start = last end = 0 value = v2 compare = greater_than add = -1 set_temp_variable = { prev = v2 } subtract_from_temp_variable = { prev = 1 } set_variable = { agency_queue^v2 = agency_queue^prev } } set_variable = { agency_queue^0 = push_front_val } } MD_auto_agency_reconcile_state = { # Stale selection recovery: mission gone, no native upgrade running, yet a # selection remains. Re-queue it at the front so it resumes before anything # already queued. if = { limit = { NOT = { has_active_mission = spy_agency_upgrade_in_progress } check_variable = { modifier@MD_auto_agency_in_progress_boolean = 0 } NOT = { check_variable = { agency_selected_upgrade = -1 } } } set_temp_variable = { push_front_val = agency_selected_upgrade } set_variable = { agency_selected_upgrade = -1 } MD_auto_agency_queue_push_front = yes MD_auto_agency_verify_queue = yes } } MD_auto_agency_update_state = { MD_auto_agency_reconcile_state = yes MD_auto_agency_begin_if_possible = yes MD_auto_agency_mark_dirty = yes } MD_auto_agency_begin_if_possible = { if = { limit = { MD_auto_agency_can_start = yes } MD_auto_agency_get_upgrade_time = yes MD_auto_agency_find_first_valid = yes if = { limit = { NOT = { check_variable = { agency_selected_upgrade = -1 } } } activate_mission = spy_agency_upgrade_in_progress } MD_auto_agency_mark_dirty = yes } } # Weekly safety pulse: resume ON / Queue-Only automation after a transient block # clears (e.g. a native manual upgrade finishing) since nothing else re-fires the # event chain. Player-only and gated on lazy-init so AI nations are never touched. MD_auto_agency_weekly_tick = { if = { limit = { is_ai = no has_variable = automate_agency_upgrades_choice check_variable = { automate_agency_upgrades_choice > 1 } } MD_auto_agency_reconcile_state = yes MD_auto_agency_begin_if_possible = yes } }