﻿# DDM 2.0.3 — Succession Council / "Screw the Rules" heir control

# Add one constituency's opinion of scope:ddm_heir_candidate to the candidate accumulator. The voter is
# the current scope; WHICH is provided by wrapper effects below.
ddm_heir_add_court_vote_effect = {
    save_temporary_scope_value_as = { name = ddm_heir_vote value = "opinion(scope:ddm_heir_candidate)" }
    scope:ddm_heir_candidate = {
        change_variable = { name = ddm_heir_court_opinion_sum add = scope:ddm_heir_vote }
        change_variable = { name = ddm_heir_court_voters add = 1 }
    }
}

ddm_heir_add_house_vote_effect = {
    save_temporary_scope_value_as = { name = ddm_heir_vote value = "opinion(scope:ddm_heir_candidate)" }
    scope:ddm_heir_candidate = {
        change_variable = { name = ddm_heir_house_opinion_sum add = scope:ddm_heir_vote }
        change_variable = { name = ddm_heir_house_voters add = 1 }
    }
}

ddm_heir_add_dynasty_vote_effect = {
    save_temporary_scope_value_as = { name = ddm_heir_vote value = "opinion(scope:ddm_heir_candidate)" }
    scope:ddm_heir_candidate = {
        change_variable = { name = ddm_heir_dynasty_opinion_sum add = scope:ddm_heir_vote }
        change_variable = { name = ddm_heir_dynasty_voters add = 1 }
    }
}

ddm_heir_add_vassal_vote_effect = {
    save_temporary_scope_value_as = { name = ddm_heir_vote value = "opinion(scope:ddm_heir_candidate)" }
    scope:ddm_heir_candidate = {
        change_variable = { name = ddm_heir_vassal_opinion_sum add = scope:ddm_heir_vote }
        change_variable = { name = ddm_heir_vassal_voters add = 1 }
    }
}

ddm_prepare_heir_advice_effect = {
    save_scope_as = ddm_heir_owner
    clear_variable_list = ddm_heir_candidates
    clear_variable_list = ddm_heir_candidates_page
    clear_variable_list = ddm_heir_court_rank
    clear_variable_list = ddm_heir_house_rank
    clear_variable_list = ddm_heir_dynasty_rank
    clear_variable_list = ddm_heir_vassal_rank
    clear_variable_list = ddm_heir_primary_current
    clear_variable_list = ddm_heir_player_current
    set_variable = { name = ddm_heir_candidate_count value = 0 }
    if = { limit = { NOT = { has_variable = ddm_heir_advice_view } } set_variable = { name = ddm_heir_advice_view value = 1 } }

    if = { limit = { exists = primary_heir } primary_heir = { save_temporary_scope_as = ddm_current_primary_heir } add_to_variable_list = { name = ddm_heir_primary_current target = scope:ddm_current_primary_heir } }
    if = { limit = { exists = player_heir } player_heir = { save_temporary_scope_as = ddm_current_player_heir } add_to_variable_list = { name = ddm_heir_player_current target = scope:ddm_current_player_heir } }

    # Direct children are deliberately the force-designation universe. Modern CK3 explicitly tightened
    # designated-heir assignment around direct children after circular/non-child succession crashes.
    every_child = {
        limit = { is_alive = yes }
        save_scope_as = ddm_heir_candidate
        set_variable = { name = ddm_heir_advice_owner value = scope:ddm_heir_owner }
        set_variable = { name = ddm_heir_court_score value = ddm_heir_court_base_value }
        set_variable = { name = ddm_heir_house_score value = ddm_heir_house_base_value }
        set_variable = { name = ddm_heir_dynasty_score value = ddm_heir_dynasty_base_value }
        set_variable = { name = ddm_heir_vassal_score value = ddm_heir_vassal_base_value }
        set_variable = { name = ddm_heir_court_opinion_sum value = 0 }
        set_variable = { name = ddm_heir_house_opinion_sum value = 0 }
        set_variable = { name = ddm_heir_dynasty_opinion_sum value = 0 }
        set_variable = { name = ddm_heir_vassal_opinion_sum value = 0 }
        set_variable = { name = ddm_heir_court_voters value = 0 }
        set_variable = { name = ddm_heir_house_voters value = 0 }
        set_variable = { name = ddm_heir_dynasty_voters value = 0 }
        set_variable = { name = ddm_heir_vassal_voters value = 0 }

        # Court consensus.
        scope:ddm_heir_owner = {
            every_courtier = {
                limit = { is_alive = yes this != scope:ddm_heir_candidate }
                ddm_heir_add_court_vote_effect = yes
            }
        }
        # House consensus: at most fifty high-value living members. This keeps a late-game mega-house
        # from turning one page refresh into thousands of opinion calculations per child.
        if = {
            limit = { exists = scope:ddm_heir_owner.dynasty exists = scope:ddm_heir_owner.house }
            scope:ddm_heir_owner.dynasty = {
                ordered_dynasty_member = {
                    limit = { is_alive = yes this != scope:ddm_heir_candidate house = scope:ddm_heir_owner.house }
                    order_by = ddm_dynastic_value
                    max = 50
                    check_range_bounds = no
                    ddm_heir_add_house_vote_effect = yes
                }
            }
        }
        # Dynasty consensus: sample the fifty highest-value living dynasty members. This is an elite
        # political caucus rather than an O(N dynasty * N children) world scan.
        if = {
            limit = { exists = scope:ddm_heir_owner.dynasty }
            scope:ddm_heir_owner.dynasty = {
                ordered_dynasty_member = {
                    limit = { is_alive = yes this != scope:ddm_heir_candidate }
                    order_by = ddm_dynastic_value
                    max = 50
                    check_range_bounds = no
                    ddm_heir_add_dynasty_vote_effect = yes
                }
            }
        }
        # Direct-vassal consensus.
        scope:ddm_heir_owner = {
            every_vassal = {
                limit = { is_alive = yes this != scope:ddm_heir_candidate }
                ddm_heir_add_vassal_vote_effect = yes
            }
        }

        if = { limit = { var:ddm_heir_court_voters > 0 } change_variable = { name = ddm_heir_court_opinion_sum divide = var:ddm_heir_court_voters } change_variable = { name = ddm_heir_court_score add = var:ddm_heir_court_opinion_sum } }
        if = { limit = { var:ddm_heir_house_voters > 0 } change_variable = { name = ddm_heir_house_opinion_sum divide = var:ddm_heir_house_voters } change_variable = { name = ddm_heir_house_score add = var:ddm_heir_house_opinion_sum } }
        if = { limit = { var:ddm_heir_dynasty_voters > 0 } change_variable = { name = ddm_heir_dynasty_opinion_sum divide = var:ddm_heir_dynasty_voters } change_variable = { name = ddm_heir_dynasty_score add = var:ddm_heir_dynasty_opinion_sum } }
        if = { limit = { var:ddm_heir_vassal_voters > 0 } change_variable = { name = ddm_heir_vassal_opinion_sum divide = var:ddm_heir_vassal_voters } change_variable = { name = ddm_heir_vassal_score add = var:ddm_heir_vassal_opinion_sum } }

        scope:ddm_heir_owner = {
            add_to_variable_list = { name = ddm_heir_candidates target = scope:ddm_heir_candidate }
            change_variable = { name = ddm_heir_candidate_count add = 1 }
        }
    }

    if = { limit = { has_variable_list = ddm_heir_candidates }
        ordered_in_list = { variable = ddm_heir_candidates order_by = var:ddm_heir_court_score max = 5 check_range_bounds = no save_temporary_scope_as = ddm_heir_row scope:ddm_heir_owner = { add_to_variable_list = { name = ddm_heir_court_rank target = scope:ddm_heir_row } } }
        ordered_in_list = { variable = ddm_heir_candidates order_by = var:ddm_heir_house_score max = 5 check_range_bounds = no save_temporary_scope_as = ddm_heir_row scope:ddm_heir_owner = { add_to_variable_list = { name = ddm_heir_house_rank target = scope:ddm_heir_row } } }
        ordered_in_list = { variable = ddm_heir_candidates order_by = var:ddm_heir_dynasty_score max = 5 check_range_bounds = no save_temporary_scope_as = ddm_heir_row scope:ddm_heir_owner = { add_to_variable_list = { name = ddm_heir_dynasty_rank target = scope:ddm_heir_row } } }
        ordered_in_list = { variable = ddm_heir_candidates order_by = var:ddm_heir_vassal_score max = 5 check_range_bounds = no save_temporary_scope_as = ddm_heir_row scope:ddm_heir_owner = { add_to_variable_list = { name = ddm_heir_vassal_rank target = scope:ddm_heir_row } } }
    }

    ddm_build_heir_candidate_page_effect = yes
}

# The force-designation universe can be much larger than the five-candidate constituency rankings.
# Four rows per page keeps large families inside the Household Office instead of pushing the note/footer
# below the window. The full ddm_heir_candidates list remains authoritative for succession logic.
ddm_build_heir_candidate_page_effect = {
    if = { limit = { NOT = { has_variable = ddm_heir_candidate_page } } set_variable = { name = ddm_heir_candidate_page value = 0 } }
    clear_variable_list = ddm_heir_candidates_page
    set_variable = { name = ddm_heir_candidate_page_size value = 4 }
    set_variable = { name = ddm_heir_candidate_last_page value = 0 }
    set_variable = { name = ddm_heir_candidate_page_fill value = 0 }

    if = {
        limit = { has_variable_list = ddm_heir_candidates }
        every_in_list = {
            variable = ddm_heir_candidates
            prev = {
                if = {
                    limit = { var:ddm_heir_candidate_page_fill >= var:ddm_heir_candidate_page_size }
                    change_variable = { name = ddm_heir_candidate_last_page add = 1 }
                    set_variable = { name = ddm_heir_candidate_page_fill value = 0 }
                }
                change_variable = { name = ddm_heir_candidate_page_fill add = 1 }
            }
        }
    }

    if = { limit = { var:ddm_heir_candidate_page < 0 } set_variable = { name = ddm_heir_candidate_page value = 0 } }
    if = { limit = { var:ddm_heir_candidate_page > var:ddm_heir_candidate_last_page } set_variable = { name = ddm_heir_candidate_page value = var:ddm_heir_candidate_last_page } }

    set_variable = { name = ddm_heir_candidate_first value = var:ddm_heir_candidate_page }
    change_variable = { name = ddm_heir_candidate_first multiply = var:ddm_heir_candidate_page_size }
    set_variable = { name = ddm_heir_candidate_stop value = var:ddm_heir_candidate_first }
    change_variable = { name = ddm_heir_candidate_stop add = var:ddm_heir_candidate_page_size }
    set_variable = { name = ddm_heir_candidate_index value = 0 }

    if = {
        limit = { has_variable_list = ddm_heir_candidates }
        every_in_list = {
            variable = ddm_heir_candidates
            save_temporary_scope_as = ddm_heir_candidate_page_row
            prev = {
                if = {
                    limit = {
                        var:ddm_heir_candidate_index >= var:ddm_heir_candidate_first
                        var:ddm_heir_candidate_index < var:ddm_heir_candidate_stop
                    }
                    add_to_variable_list = { name = ddm_heir_candidates_page target = scope:ddm_heir_candidate_page_row }
                }
                change_variable = { name = ddm_heir_candidate_index add = 1 }
            }
        }
    }

    set_variable = { name = ddm_heir_candidate_page_display value = var:ddm_heir_candidate_page }
    change_variable = { name = ddm_heir_candidate_page_display add = 1 }
    set_variable = { name = ddm_heir_candidate_pages_display value = var:ddm_heir_candidate_last_page }
    change_variable = { name = ddm_heir_candidate_pages_display add = 1 }
}
