# Author(s): Yard1, AngriestBird # # POWER RANKING — sorts every country into a Power Status idea each quarter (super/great/large/ # minor/non_power, plus regional_power and naval_power_of_the_continent). # # Per-country state: # power_ranking_contribution GDP scaled by independence from foreign influence # percentage_of_global_factories contribution / world total; sets the tier, shown in-game # power_ranking_name_var tier id 1..5, see assign_power_ranking_value # Regional arrays (european_nations, sub_saharan_nations, middle_eastern_nations, asian_nations, # american_nations) hold each region's members with the regional-power prefix sorted descending. # # Schedule, from 00_on_actions.txt: # startup set_power_ranking_ideas_for_every_country build arrays, sort, assign ideas # month 1/4/7/10 calculate_power_ranking_contributions recompute tiers + naval hegemons # month 2/5/8/11 sort_and_assign_power_rankings select and flag regional powers # Idea text is re-applied per country over the weekly CT staggered cycle during that window. # Mid-game nations register via add_country_to_power_ranking. # Shared: compute a country's power_ranking_contribution (GDP weighted by domestic # influence) and fold it into the global denominator. Run in country scope. accumulate_power_ranking_contribution = { set_variable = { power_ranking_contribution = gdp_total } set_temp_variable = { domestic_influence_amount_temp = domestic_influence_amount } multiply_temp_variable = { domestic_influence_amount_temp = 0.01 } multiply_variable = { power_ranking_contribution = domestic_influence_amount_temp?0.5 } multiply_variable = { power_ranking_contribution = 0.01 } add_to_variable = { global.global_num_of_factories = power_ranking_contribution } } # Shared: slot a country into its regional array. Keep membership checks inside the selected # branch so an already-registered country cannot fall through into a second region. register_in_power_ranking_array = { if = { limit = { has_country_flag = european_nation_flag } if = { limit = { NOT = { is_in_array = { global.european_nations = THIS } } } add_to_array = { global.european_nations = THIS } } } else_if = { limit = { has_country_flag = african_nation_flag } if = { limit = { NOT = { is_in_array = { global.sub_saharan_nations = THIS } } } add_to_array = { global.sub_saharan_nations = THIS } } } else_if = { limit = { has_country_flag = middle_east_nation_flag } if = { limit = { NOT = { is_in_array = { global.middle_eastern_nations = THIS } } } add_to_array = { global.middle_eastern_nations = THIS } } } else_if = { limit = { has_country_flag = asian_nation_flag } if = { limit = { NOT = { is_in_array = { global.asian_nations = THIS } } } add_to_array = { global.asian_nations = THIS } } } else_if = { limit = { has_country_flag = american_nation_flag } if = { limit = { NOT = { is_in_array = { global.american_nations = THIS } } } add_to_array = { global.american_nations = THIS } } if = { limit = { has_country_flag = south_america_nation_flag NOT = { is_in_array = { global.south_american_nation = THIS } } } add_to_array = { global.south_american_nation = THIS } } } # Outside the partition: North Africa carries african_nation_flag and is claimed by the # sub-Saharan branch above, so global.middle_eastern_nations is not the MENA set that # is_middle_eastern_nation describes. Consumers that mean MENA read this array instead. if = { limit = { has_country_flag = middle_east_nation_flag NOT = { is_in_array = { global.mena_nations = THIS } } } add_to_array = { global.mena_nations = THIS } } # Also outside the partition: the Pacific island states match none of the five branches above, # so they would otherwise have no array to scan. if = { limit = { has_country_flag = oceania_nation_flag NOT = { is_in_array = { global.oceania_nations = THIS } } } add_to_array = { global.oceania_nations = THIS } } } # Registers a nation created after game start (released/breakaway) into the system. Arrays are # only built at on_startup and the quarterly passes just iterate existing members, so without # this a mid-game nation never gets a Power Status or naval idea. Run in the new country's scope # after its economy is set up (needs gdp_total). add_country_to_power_ranking = { set_country_group_flags = yes # released nations skip on_startup, so set continent flags now accumulate_power_ranking_contribution = yes register_in_power_ranking_array = yes # Give an immediate ranking + idea so it isn't blank until the next quarterly pass. if = { limit = { check_variable = { global.global_num_of_factories > 0 } } set_variable = { percentage_of_global_factories = power_ranking_contribution } divide_variable = { percentage_of_global_factories = global.global_num_of_factories } assign_power_ranking_value = yes } else = { set_variable = { power_ranking_name_var = 1 } } assign_power_ranking_ideas = yes } setup_power_ranking_idea_tokens = { clear_array = global.power_ranking_idea_token resize_array = { array = global.power_ranking_idea_token size = 1 } add_to_array = { global.power_ranking_idea_token = token:non_power } add_to_array = { global.power_ranking_idea_token = token:super_power } add_to_array = { global.power_ranking_idea_token = token:great_power } add_to_array = { global.power_ranking_idea_token = token:large_power } add_to_array = { global.power_ranking_idea_token = token:minor_power } clear_array = global.power_ranking_regional_idea_token resize_array = { array = global.power_ranking_regional_idea_token size = 1 } add_to_array = { global.power_ranking_regional_idea_token = token:non_power } add_to_array = { global.power_ranking_regional_idea_token = token:super_power } add_to_array = { global.power_ranking_regional_idea_token = token:great_power } add_to_array = { global.power_ranking_regional_idea_token = token:large_power } add_to_array = { global.power_ranking_regional_idea_token = token:regional_power } } # STARTUP ONLY: Full clear + build + sort (called once at game start from 00_on_actions.txt) set_power_ranking_ideas_for_every_country = { setup_power_ranking_idea_tokens = yes clear_array = global.european_nations clear_array = global.sub_saharan_nations clear_array = global.middle_eastern_nations clear_array = global.asian_nations clear_array = global.american_nations clear_array = global.south_american_nation clear_array = global.mena_nations clear_array = global.oceania_nations set_variable = { global.global_num_of_factories = 0 } every_country = { clr_country_flag = regional_power accumulate_power_ranking_contribution = yes register_in_power_ranking_array = yes if = { limit = { has_country_flag = european_nation_flag } add_to_array = { global.sc_updates_euro_america = THIS } } } add_to_array = { global.sc_updates_euro_america = CAN } add_to_array = { global.sc_updates_euro_america = MEX } add_to_array = { global.sc_updates_euro_america = USA } power_ranking_selection_sort_european = yes power_ranking_selection_sort_sub_saharan = yes power_ranking_selection_sort_middle_east = yes power_ranking_selection_sort_asian = yes power_ranking_selection_sort_american = yes power_ranking_evaluate_all_regions = yes game_startup_idea_set = yes } # MONTH 1/4/7/10: Calculate contribution per country and accumulate global total calculate_power_ranking_contributions = { set_variable = { global.global_num_of_factories = 0 } every_country = { clr_country_flag = regional_power accumulate_power_ranking_contribution = yes } power_ranking_evaluate_all_regions = yes } # Shared: for each region, set every member's percentage_of_global_factories, assign its # power ranking value, and grant naval_power_of_the_continent to that region's naval hegemon. # Called by both the startup build and the quarterly recalculation. power_ranking_evaluate_all_regions = { set_temp_variable = { largest_value = 0 } set_temp_variable = { largest_european_navy = 0 } for_each_loop = { array = global.european_nations value = v var:v = { set_variable = { percentage_of_global_factories = power_ranking_contribution } divide_variable = { percentage_of_global_factories = global.global_num_of_factories } if = { limit = { check_variable = { deployed_navy_manpower_k > largest_value } } set_temp_variable = { largest_value = THIS.deployed_navy_manpower_k } set_temp_variable = { largest_european_navy = THIS.id } } assign_power_ranking_value = yes } } if = { limit = { check_variable = { global.previous_largest_european_navy > 0 } NOT = { check_variable = { global.previous_largest_european_navy = largest_european_navy } } } var:global.previous_largest_european_navy = { remove_ideas = naval_power_of_the_continent } } if = { limit = { check_variable = { largest_european_navy > 0 } } var:largest_european_navy = { if = { limit = { NOT = { has_idea = naval_power_of_the_continent } } add_ideas = naval_power_of_the_continent } } } set_variable = { global.previous_largest_european_navy = largest_european_navy } set_temp_variable = { largest_value = 0 } set_temp_variable = { largest_sub_saharan_navy = 0 } for_each_loop = { array = global.sub_saharan_nations value = v var:v = { set_variable = { percentage_of_global_factories = power_ranking_contribution } divide_variable = { percentage_of_global_factories = global.global_num_of_factories } if = { limit = { check_variable = { deployed_navy_manpower_k > largest_value } } set_temp_variable = { largest_value = THIS.deployed_navy_manpower_k } set_temp_variable = { largest_sub_saharan_navy = THIS.id } } assign_power_ranking_value = yes } } if = { limit = { check_variable = { global.previous_largest_sub_saharan_navy > 0 } NOT = { check_variable = { global.previous_largest_sub_saharan_navy = largest_sub_saharan_navy } } } var:global.previous_largest_sub_saharan_navy = { remove_ideas = naval_power_of_the_continent } } if = { limit = { check_variable = { largest_sub_saharan_navy > 0 } } var:largest_sub_saharan_navy = { if = { limit = { NOT = { has_idea = naval_power_of_the_continent } } add_ideas = naval_power_of_the_continent } } } set_variable = { global.previous_largest_sub_saharan_navy = largest_sub_saharan_navy } set_temp_variable = { largest_value = 0 } set_temp_variable = { largest_middle_east_navy = 0 } for_each_loop = { array = global.middle_eastern_nations value = v var:v = { set_variable = { percentage_of_global_factories = power_ranking_contribution } divide_variable = { percentage_of_global_factories = global.global_num_of_factories } if = { limit = { check_variable = { deployed_navy_manpower_k > largest_value } } set_temp_variable = { largest_value = THIS.deployed_navy_manpower_k } set_temp_variable = { largest_middle_east_navy = THIS.id } } assign_power_ranking_value = yes } } if = { limit = { check_variable = { global.previous_largest_middle_east_navy > 0 } NOT = { check_variable = { global.previous_largest_middle_east_navy = largest_middle_east_navy } } } var:global.previous_largest_middle_east_navy = { remove_ideas = naval_power_of_the_continent } } if = { limit = { check_variable = { largest_middle_east_navy > 0 } } var:largest_middle_east_navy = { if = { limit = { NOT = { has_idea = naval_power_of_the_continent } } add_ideas = naval_power_of_the_continent } } } set_variable = { global.previous_largest_middle_east_navy = largest_middle_east_navy } set_temp_variable = { largest_value = 0 } set_temp_variable = { largest_asian_navy = 0 } for_each_loop = { array = global.asian_nations value = v var:v = { set_variable = { percentage_of_global_factories = power_ranking_contribution } divide_variable = { percentage_of_global_factories = global.global_num_of_factories } if = { limit = { check_variable = { deployed_navy_manpower_k > largest_value } } set_temp_variable = { largest_value = THIS.deployed_navy_manpower_k } set_temp_variable = { largest_asian_navy = THIS.id } } assign_power_ranking_value = yes } } if = { limit = { check_variable = { global.previous_largest_asian_navy > 0 } NOT = { check_variable = { global.previous_largest_asian_navy = largest_asian_navy } } } var:global.previous_largest_asian_navy = { remove_ideas = naval_power_of_the_continent } } if = { limit = { check_variable = { largest_asian_navy > 0 } } var:largest_asian_navy = { if = { limit = { NOT = { has_idea = naval_power_of_the_continent } } add_ideas = naval_power_of_the_continent } } } set_variable = { global.previous_largest_asian_navy = largest_asian_navy } set_temp_variable = { largest_value = 0 } set_temp_variable = { largest_american_navy = 0 } for_each_loop = { array = global.american_nations value = v var:v = { set_variable = { percentage_of_global_factories = power_ranking_contribution } divide_variable = { percentage_of_global_factories = global.global_num_of_factories } if = { limit = { check_variable = { deployed_navy_manpower_k > largest_value } } set_temp_variable = { largest_value = THIS.deployed_navy_manpower_k } set_temp_variable = { largest_american_navy = THIS.id } } assign_power_ranking_value = yes } } if = { limit = { check_variable = { global.previous_largest_american_navy > 0 } NOT = { check_variable = { global.previous_largest_american_navy = largest_american_navy } } } var:global.previous_largest_american_navy = { remove_ideas = naval_power_of_the_continent } } if = { limit = { check_variable = { largest_american_navy > 0 } } var:largest_american_navy = { if = { limit = { NOT = { has_idea = naval_power_of_the_continent } } add_ideas = naval_power_of_the_continent } } } set_variable = { global.previous_largest_american_navy = largest_american_navy } } # Map contribution share to a tier id power_ranking_name_var: # 1 non_power (<0.2%) 2 super (>15%) 3 great (>6.5%) 4 large (>2.5%) 5 minor (else) # regional_power is layered onto tier 5 during regional prefix selection. assign_power_ranking_value = { if = { limit = { check_variable = { percentage_of_global_factories < 0.002 } } set_variable = { power_ranking_name_var = 1 } } else = { if = { limit = { check_variable = { percentage_of_global_factories > 0.15 } } set_variable = { power_ranking_name_var = 2 } } else_if = { limit = { check_variable = { percentage_of_global_factories > 0.065 } } set_variable = { power_ranking_name_var = 3 } } else_if = { limit = { check_variable = { percentage_of_global_factories > 0.025 } } set_variable = { power_ranking_name_var = 4 } } else = { set_variable = { power_ranking_name_var = 5 } } } } # MONTH 2/5/8/11: select each regional-power prefix from the latest contributions. sort_and_assign_power_rankings = { power_ranking_selection_sort_european = yes power_ranking_selection_sort_sub_saharan = yes power_ranking_selection_sort_middle_east = yes power_ranking_selection_sort_asian = yes power_ranking_selection_sort_american = yes } # Partial selection of each region: pull only the regional-power prefix in descending order, # then append the unselected members. One copy per region because array names cannot be passed. power_ranking_selection_sort_european = { clear_temp_array = pr_sort_values clear_temp_array = pr_sort_nations for_each_loop = { array = global.european_nations value = v var:v = { add_to_temp_array = { pr_sort_values = power_ranking_contribution } add_to_temp_array = { pr_sort_nations = THIS } } } clear_array = global.european_nations set_temp_variable = { pr_sort_end = 7 } if = { limit = { check_variable = { pr_sort_values^num < pr_sort_end } } set_temp_variable = { pr_sort_end = pr_sort_values^num } } for_loop_effect = { end = pr_sort_end find_highest_in_array = { array = pr_sort_values index = pr_sort_idx } set_temp_variable = { pr_sort_nation = pr_sort_nations^pr_sort_idx } add_to_array = { global.european_nations = pr_sort_nation } var:pr_sort_nation = { set_country_flag = regional_power } remove_from_temp_array = { array = pr_sort_nations index = pr_sort_idx } remove_from_temp_array = { array = pr_sort_values index = pr_sort_idx } } for_each_loop = { array = pr_sort_nations value = v add_to_array = { global.european_nations = v } } clear_temp_array = pr_sort_values clear_temp_array = pr_sort_nations } power_ranking_selection_sort_sub_saharan = { clear_temp_array = pr_sort_values clear_temp_array = pr_sort_nations for_each_loop = { array = global.sub_saharan_nations value = v var:v = { add_to_temp_array = { pr_sort_values = power_ranking_contribution } add_to_temp_array = { pr_sort_nations = THIS } } } clear_array = global.sub_saharan_nations set_temp_variable = { pr_sort_end = 3 } if = { limit = { check_variable = { pr_sort_values^num < pr_sort_end } } set_temp_variable = { pr_sort_end = pr_sort_values^num } } for_loop_effect = { end = pr_sort_end find_highest_in_array = { array = pr_sort_values index = pr_sort_idx } set_temp_variable = { pr_sort_nation = pr_sort_nations^pr_sort_idx } add_to_array = { global.sub_saharan_nations = pr_sort_nation } var:pr_sort_nation = { set_country_flag = regional_power } remove_from_temp_array = { array = pr_sort_nations index = pr_sort_idx } remove_from_temp_array = { array = pr_sort_values index = pr_sort_idx } } for_each_loop = { array = pr_sort_nations value = v add_to_array = { global.sub_saharan_nations = v } } clear_temp_array = pr_sort_values clear_temp_array = pr_sort_nations } power_ranking_selection_sort_middle_east = { clear_temp_array = pr_sort_values clear_temp_array = pr_sort_nations for_each_loop = { array = global.middle_eastern_nations value = v var:v = { add_to_temp_array = { pr_sort_values = power_ranking_contribution } add_to_temp_array = { pr_sort_nations = THIS } } } clear_array = global.middle_eastern_nations set_temp_variable = { pr_sort_end = 3 } if = { limit = { check_variable = { pr_sort_values^num < pr_sort_end } } set_temp_variable = { pr_sort_end = pr_sort_values^num } } for_loop_effect = { end = pr_sort_end find_highest_in_array = { array = pr_sort_values index = pr_sort_idx } set_temp_variable = { pr_sort_nation = pr_sort_nations^pr_sort_idx } add_to_array = { global.middle_eastern_nations = pr_sort_nation } var:pr_sort_nation = { set_country_flag = regional_power } remove_from_temp_array = { array = pr_sort_nations index = pr_sort_idx } remove_from_temp_array = { array = pr_sort_values index = pr_sort_idx } } for_each_loop = { array = pr_sort_nations value = v add_to_array = { global.middle_eastern_nations = v } } clear_temp_array = pr_sort_values clear_temp_array = pr_sort_nations } power_ranking_selection_sort_asian = { clear_temp_array = pr_sort_values clear_temp_array = pr_sort_nations for_each_loop = { array = global.asian_nations value = v var:v = { add_to_temp_array = { pr_sort_values = power_ranking_contribution } add_to_temp_array = { pr_sort_nations = THIS } } } clear_array = global.asian_nations set_temp_variable = { pr_sort_end = 7 } if = { limit = { check_variable = { pr_sort_values^num < pr_sort_end } } set_temp_variable = { pr_sort_end = pr_sort_values^num } } for_loop_effect = { end = pr_sort_end find_highest_in_array = { array = pr_sort_values index = pr_sort_idx } set_temp_variable = { pr_sort_nation = pr_sort_nations^pr_sort_idx } add_to_array = { global.asian_nations = pr_sort_nation } var:pr_sort_nation = { set_country_flag = regional_power } remove_from_temp_array = { array = pr_sort_nations index = pr_sort_idx } remove_from_temp_array = { array = pr_sort_values index = pr_sort_idx } } for_each_loop = { array = pr_sort_nations value = v add_to_array = { global.asian_nations = v } } clear_temp_array = pr_sort_values clear_temp_array = pr_sort_nations } power_ranking_selection_sort_american = { clear_temp_array = pr_sort_values clear_temp_array = pr_sort_nations for_each_loop = { array = global.american_nations value = v var:v = { add_to_temp_array = { pr_sort_values = power_ranking_contribution } add_to_temp_array = { pr_sort_nations = THIS } } } clear_array = global.american_nations set_temp_variable = { pr_sort_end = 4 } if = { limit = { check_variable = { pr_sort_values^num < pr_sort_end } } set_temp_variable = { pr_sort_end = pr_sort_values^num } } for_loop_effect = { end = pr_sort_end find_highest_in_array = { array = pr_sort_values index = pr_sort_idx } set_temp_variable = { pr_sort_nation = pr_sort_nations^pr_sort_idx } add_to_array = { global.american_nations = pr_sort_nation } var:pr_sort_nation = { set_country_flag = regional_power } remove_from_temp_array = { array = pr_sort_nations index = pr_sort_idx } remove_from_temp_array = { array = pr_sort_values index = pr_sort_idx } } for_each_loop = { array = pr_sort_nations value = v add_to_array = { global.american_nations = v } } clear_temp_array = pr_sort_values clear_temp_array = pr_sort_nations } remove_power_ideas = { remove_ideas = { super_power great_power large_power regional_power minor_power non_power } } # Startup only: apply the idea to every ranked country in one pass. Post-startup this work is # instead spread across the weekly CT staggered cycle to avoid a single-tick spike. game_startup_idea_set = { for_each_loop = { array = global.european_nations value = v var:v = { assign_power_ranking_ideas = yes } } for_each_loop = { array = global.sub_saharan_nations value = v var:v = { assign_power_ranking_ideas = yes } } for_each_loop = { array = global.middle_eastern_nations value = v var:v = { assign_power_ranking_ideas = yes } } for_each_loop = { array = global.asian_nations value = v var:v = { assign_power_ranking_ideas = yes } } for_each_loop = { array = global.american_nations value = v var:v = { assign_power_ranking_ideas = yes } } } assign_power_ranking_ideas = { set_temp_variable = { power_ranking_idea_index = power_ranking_name_var } if = { limit = { OR = { check_variable = { power_ranking_idea_index < 1 } check_variable = { power_ranking_idea_index > 5 } } } set_temp_variable = { power_ranking_idea_index = 1 } } if = { limit = { has_country_flag = regional_power } set_temp_variable = { power_ranking_target_token = global.power_ranking_regional_idea_token^power_ranking_idea_index } } else = { set_temp_variable = { power_ranking_target_token = global.power_ranking_idea_token^power_ranking_idea_index } } if = { limit = { NOT = { has_idea = var:power_ranking_target_token } } remove_power_ideas = yes add_ideas = var:power_ranking_target_token } }