﻿# ---------------------------------------------------------------------------
# GRAND CAPITULATION
# ---------------------------------------------------------------------------
# Late-game diplomatic-range ultimatum: submit, surrender the bulk of the estate and enter the actor's
# realm, or refuse. Refusal does not automatically create a war; organized resistance is a separate roll.


# Character scope. Snapshot the exact vanilla government before Grand Capitulation begins. Some vanilla
# governments (notably Nomad, Administrative, Celestial and Mandala) are eligible as automatic government
# bases when a ruler ranks up. Grand Capitulation is allowed to raise the actor's rank, but not to silently
# reform their government merely because a surrendered crown came from a different political system.
ddm_snapshot_capitulation_government_effect = {
    set_variable = { name = ddm_cap_original_government value = 0 }
    if = { limit = { has_government = feudal_government } set_variable = { name = ddm_cap_original_government value = 1 } }
    else_if = { limit = { has_government = republic_government } set_variable = { name = ddm_cap_original_government value = 2 } }
    else_if = { limit = { has_government = theocracy_government } set_variable = { name = ddm_cap_original_government value = 3 } }
    else_if = { limit = { has_government = clan_government } set_variable = { name = ddm_cap_original_government value = 4 } }
    else_if = { limit = { has_government = tribal_government } set_variable = { name = ddm_cap_original_government value = 5 } }
    else_if = { limit = { has_government = mercenary_government } set_variable = { name = ddm_cap_original_government value = 6 } }
    else_if = { limit = { has_government = holy_order_government } set_variable = { name = ddm_cap_original_government value = 7 } }
    else_if = { limit = { has_government = administrative_government } set_variable = { name = ddm_cap_original_government value = 8 } }
    else_if = { limit = { has_government = landless_adventurer_government } set_variable = { name = ddm_cap_original_government value = 9 } }
    else_if = { limit = { has_government = nomad_government } set_variable = { name = ddm_cap_original_government value = 10 } }
    else_if = { limit = { has_government = herder_government } set_variable = { name = ddm_cap_original_government value = 11 } }
    else_if = { limit = { has_government = celestial_government } set_variable = { name = ddm_cap_original_government value = 12 } }
    else_if = { limit = { has_government = japan_administrative_government } set_variable = { name = ddm_cap_original_government value = 13 } }
    else_if = { limit = { has_government = japan_feudal_government } set_variable = { name = ddm_cap_original_government value = 14 } }
    else_if = { limit = { has_government = mandala_government } set_variable = { name = ddm_cap_original_government value = 15 } }
    else_if = { limit = { has_government = wanua_government } set_variable = { name = ddm_cap_original_government value = 16 } }
    else_if = { limit = { has_government = meritocratic_government } set_variable = { name = ddm_cap_original_government value = 17 } }
    else_if = { limit = { has_government = steppe_admin_government } set_variable = { name = ddm_cap_original_government value = 18 } }
}

# Character scope. Restore only a government we positively identified above. Unknown/modded governments are
# deliberately left alone rather than being guessed into a vanilla type.
ddm_restore_capitulation_government_effect = {
    if = { limit = { var:ddm_cap_original_government = 1 NOT = { has_government = feudal_government } } change_government = feudal_government }
    else_if = { limit = { var:ddm_cap_original_government = 2 NOT = { has_government = republic_government } } change_government = republic_government }
    else_if = { limit = { var:ddm_cap_original_government = 3 NOT = { has_government = theocracy_government } } change_government = theocracy_government }
    else_if = { limit = { var:ddm_cap_original_government = 4 NOT = { has_government = clan_government } } change_government = clan_government }
    else_if = { limit = { var:ddm_cap_original_government = 5 NOT = { has_government = tribal_government } } change_government = tribal_government }
    else_if = { limit = { var:ddm_cap_original_government = 6 NOT = { has_government = mercenary_government } } change_government = mercenary_government }
    else_if = { limit = { var:ddm_cap_original_government = 7 NOT = { has_government = holy_order_government } } change_government = holy_order_government }
    else_if = { limit = { var:ddm_cap_original_government = 8 NOT = { has_government = administrative_government } } change_government = administrative_government }
    else_if = { limit = { var:ddm_cap_original_government = 9 NOT = { has_government = landless_adventurer_government } } change_government = landless_adventurer_government }
    else_if = { limit = { var:ddm_cap_original_government = 10 NOT = { has_government = nomad_government } } change_government = nomad_government }
    else_if = { limit = { var:ddm_cap_original_government = 11 NOT = { has_government = herder_government } } change_government = herder_government }
    else_if = { limit = { var:ddm_cap_original_government = 12 NOT = { has_government = celestial_government } } change_government = celestial_government }
    else_if = { limit = { var:ddm_cap_original_government = 13 NOT = { has_government = japan_administrative_government } } change_government = japan_administrative_government }
    else_if = { limit = { var:ddm_cap_original_government = 14 NOT = { has_government = japan_feudal_government } } change_government = japan_feudal_government }
    else_if = { limit = { var:ddm_cap_original_government = 15 NOT = { has_government = mandala_government } } change_government = mandala_government }
    else_if = { limit = { var:ddm_cap_original_government = 16 NOT = { has_government = wanua_government } } change_government = wanua_government }
    else_if = { limit = { var:ddm_cap_original_government = 17 NOT = { has_government = meritocratic_government } } change_government = meritocratic_government }
    else_if = { limit = { var:ddm_cap_original_government = 18 NOT = { has_government = steppe_admin_government } } change_government = steppe_admin_government }
}

# Character scope. Stores a military-quality estimate on this ruler. CK3's current military strength is
# still the numerical base; Martial, personal Prowess and the top five knights supply a quality multiplier.
ddm_capitulation_cache_strength_effect = {
    save_temporary_scope_as = ddm_cap_strength_subject
    set_variable = { name = ddm_cap_raw_strength value = current_military_strength }
    if = { limit = { var:ddm_cap_raw_strength < 1 } set_variable = { name = ddm_cap_raw_strength value = 1 } }

    set_variable = { name = ddm_cap_quality_index value = martial }
    change_variable = { name = ddm_cap_quality_index multiply = 3 }
    set_variable = { name = ddm_cap_tmp value = prowess }
    change_variable = { name = ddm_cap_tmp multiply = 2 }
    change_variable = { name = ddm_cap_quality_index add = var:ddm_cap_tmp }

    ordered_knight = {
        order_by = prowess
        max = 5
        check_range_bounds = no
        save_temporary_scope_as = ddm_cap_quality_knight
        scope:ddm_cap_strength_subject = {
            set_variable = { name = ddm_cap_tmp value = scope:ddm_cap_quality_knight.prowess }
            change_variable = { name = ddm_cap_tmp multiply = 1.5 }
            change_variable = { name = ddm_cap_quality_index add = var:ddm_cap_tmp }
        }
    }
    if = { limit = { var:ddm_cap_quality_index > 450 } set_variable = { name = ddm_cap_quality_index value = 450 } }

    set_variable = { name = ddm_cap_quality_multiplier value = var:ddm_cap_quality_index }
    change_variable = { name = ddm_cap_quality_multiplier divide = 300 }
    change_variable = { name = ddm_cap_quality_multiplier add = 1 }
    if = { limit = { var:ddm_cap_quality_multiplier > 2.5 } set_variable = { name = ddm_cap_quality_multiplier value = 2.5 } }

    set_variable = { name = ddm_cap_effective_strength value = var:ddm_cap_raw_strength }
    change_variable = { name = ddm_cap_effective_strength multiply = var:ddm_cap_quality_multiplier }
    remove_variable = ddm_cap_tmp
}

# Target scope. Calculates whether this ruler personally yields to the emissaries. Fear/personality and
# quality-adjusted relative force matter; refusal simply enters the political refuser pool.
ddm_capitulation_roll_response_effect = {
    set_variable = { name = ddm_cap_submit_chance value = 24 }

    if = { limit = { has_trait = craven } change_variable = { name = ddm_cap_submit_chance add = 24 } }
    if = { limit = { has_trait = content } change_variable = { name = ddm_cap_submit_chance add = 15 } }
    if = { limit = { has_trait = humble } change_variable = { name = ddm_cap_submit_chance add = 8 } }
    if = { limit = { has_trait = brave } change_variable = { name = ddm_cap_submit_chance subtract = 18 } }
    if = { limit = { has_trait = arrogant } change_variable = { name = ddm_cap_submit_chance subtract = 18 } }
    if = { limit = { has_trait = ambitious } change_variable = { name = ddm_cap_submit_chance subtract = 16 } }
    if = { limit = { OR = { has_trait = wrathful has_trait = vengeful } } change_variable = { name = ddm_cap_submit_chance subtract = 12 } }

    # The ruler compares quality-adjusted effective strength rather than troop count alone.
    set_variable = { name = ddm_cap_tmp value = var:ddm_cap_effective_strength }
    change_variable = { name = ddm_cap_tmp multiply = 2 }
    if = {
        limit = { scope:ddm_cap_actor.var:ddm_cap_effective_strength >= var:ddm_cap_tmp }
        change_variable = { name = ddm_cap_submit_chance add = 38 }
    }
    else = {
        set_variable = { name = ddm_cap_tmp value = var:ddm_cap_effective_strength }
        change_variable = { name = ddm_cap_tmp multiply = 1.5 }
        if = {
            limit = { scope:ddm_cap_actor.var:ddm_cap_effective_strength >= var:ddm_cap_tmp }
            change_variable = { name = ddm_cap_submit_chance add = 28 }
        }
        else_if = {
            limit = { scope:ddm_cap_actor.var:ddm_cap_effective_strength >= var:ddm_cap_effective_strength }
            change_variable = { name = ddm_cap_submit_chance add = 14 }
        }
        else = {
            set_variable = { name = ddm_cap_tmp value = scope:ddm_cap_actor.var:ddm_cap_effective_strength }
            change_variable = { name = ddm_cap_tmp multiply = 1.5 }
            if = { limit = { var:ddm_cap_effective_strength >= var:ddm_cap_tmp } change_variable = { name = ddm_cap_submit_chance subtract = 28 } }
            else = { change_variable = { name = ddm_cap_submit_chance subtract = 12 } }
        }
    }

    # Legitimacy changes willingness without becoming a hard immunity.
    if = { limit = { has_legitimacy_flag = massively_reduced_tributarization_acceptance } change_variable = { name = ddm_cap_submit_chance add = 12 } }
    if = { limit = { has_legitimacy_flag = extra_increased_tributarization_acceptance } change_variable = { name = ddm_cap_submit_chance subtract = 12 } }

    if = { limit = { var:ddm_cap_submit_chance < 5 } set_variable = { name = ddm_cap_submit_chance value = 5 } }
    if = { limit = { var:ddm_cap_submit_chance > 95 } set_variable = { name = ddm_cap_submit_chance value = 95 } }

    remove_variable = ddm_cap_response_submitted
    random = {
        chance = var:ddm_cap_submit_chance
        set_variable = { name = ddm_cap_response_submitted value = 1 }
        save_temporary_scope_as = ddm_cap_response_subject
        scope:ddm_cap_actor = {
            add_to_variable_list = { name = ddm_cap_submitters target = scope:ddm_cap_response_subject }
            change_variable = { name = ddm_cap_submitter_count add = 1 }
        }
    }
    if = {
        limit = { NOT = { has_variable = ddm_cap_response_submitted } }
        save_temporary_scope_as = ddm_cap_response_subject
        scope:ddm_cap_actor = {
            add_to_variable_list = { name = ddm_cap_refusers target = scope:ddm_cap_response_subject }
            change_variable = { name = ddm_cap_refuser_count add = 1 }
        }
    }
    remove_variable = ddm_cap_response_submitted
    remove_variable = ddm_cap_submit_chance
    remove_variable = ddm_cap_tmp
}

# Actor scope with scope:ddm_cap_target. Peaceful submission transfers 80% of liquid standing and roughly
# 80% of eligible personal titles. Crown titles that would prevent vassalization are necessarily surrendered
# first; the capital county and institutional titles are preserved.
ddm_apply_grand_capitulation_submission_effect = {
    set_variable = { name = ddm_cap_transfer_gold value = scope:ddm_cap_target.gold }
    change_variable = { name = ddm_cap_transfer_gold multiply = 0.80 }
    set_variable = { name = ddm_cap_transfer_prestige value = scope:ddm_cap_target.prestige }
    change_variable = { name = ddm_cap_transfer_prestige multiply = 0.80 }
    set_variable = { name = ddm_cap_transfer_piety value = scope:ddm_cap_target.piety }
    change_variable = { name = ddm_cap_transfer_piety multiply = 0.80 }
    if = { limit = { var:ddm_cap_transfer_gold < 0 } set_variable = { name = ddm_cap_transfer_gold value = 0 } }
    if = { limit = { var:ddm_cap_transfer_prestige < 0 } set_variable = { name = ddm_cap_transfer_prestige value = 0 } }
    if = { limit = { var:ddm_cap_transfer_piety < 0 } set_variable = { name = ddm_cap_transfer_piety value = 0 } }

    add_gold = var:ddm_cap_transfer_gold
    add_prestige = var:ddm_cap_transfer_prestige
    add_piety = var:ddm_cap_transfer_piety
    scope:ddm_cap_target = {
        add_gold = { value = scope:ddm_cap_actor.var:ddm_cap_transfer_gold multiply = -1 }
        add_prestige = { value = scope:ddm_cap_actor.var:ddm_cap_transfer_prestige multiply = -1 }
        add_piety = { value = scope:ddm_cap_actor.var:ddm_cap_transfer_piety multiply = -1 }
        if = {
            limit = { has_legitimacy = yes }
            # CK3 exposes legitimacy changes but not a stable direct current-point script value. Apply a
            # deliberately severe collapse scaled to current legitimacy flags rather than silently fake 80%.
            add_legitimacy = -600
        }
        add_character_flag = { flag = ddm_grand_capitulation_recent_submitter years = 10 }
    }
    if = { limit = { has_legitimacy = yes } add_legitimacy = 100 }

    create_title_and_vassal_change = {
        type = granted
        save_scope_as = ddm_cap_title_change
        add_claim_on_loss = yes
    }

    # First remove every transferable crown at or above the actor's current rank so the submitter can
    # actually become a subordinate. This can elevate a three-kingdom King into an Emperor naturally.
    scope:ddm_cap_target = {
        every_held_title = {
            limit = {
                ddm_grand_capitulation_transferable_title_trigger = yes
                tier >= scope:ddm_cap_actor.highest_held_title_tier
            }
            change_title_holder = {
                holder = scope:ddm_cap_actor
                change = scope:ddm_cap_title_change
                government_base = scope:ddm_cap_actor
            }
            scope:ddm_cap_actor = { change_variable = { name = ddm_cap_titles_taken add = 1 } }
        }
    }

    # Then draw approximately eighty percent of the remaining eligible personal estate.
    scope:ddm_cap_target = {
        every_held_title = {
            limit = { ddm_grand_capitulation_transferable_title_trigger = yes }
            random = {
                chance = 80
                change_title_holder = {
                    holder = scope:ddm_cap_actor
                    change = scope:ddm_cap_title_change
                    government_base = scope:ddm_cap_actor
                }
                scope:ddm_cap_actor = { change_variable = { name = ddm_cap_titles_taken add = 1 } }
            }
        }
    }
    resolve_title_and_vassal_change = scope:ddm_cap_title_change

    # Rank-up may select the surrendered crown's government as a vanilla base. Undo that side effect before
    # vassalization logic continues; political conquest is not an automatic government reform.
    ddm_restore_capitulation_government_effect = yes

    # If the preserved capital leaves the ruler below the new overlord's rank, swear fealty immediately.
    if = {
        limit = {
            scope:ddm_cap_target = {
                is_landed = yes
                is_independent_ruler = yes
                highest_held_title_tier < scope:ddm_cap_actor.highest_held_title_tier
                NOT = { government_has_flag = cannot_be_vassal_or_liege }
            }
        }
        create_title_and_vassal_change = { type = swear_fealty save_scope_as = ddm_cap_vassal_change add_claim_on_loss = no }
        scope:ddm_cap_target = {
            change_liege = { liege = scope:ddm_cap_actor change = scope:ddm_cap_vassal_change }
        }
        resolve_title_and_vassal_change = scope:ddm_cap_vassal_change
    }

    remove_variable = ddm_cap_transfer_gold
    remove_variable = ddm_cap_transfer_prestige
    remove_variable = ddm_cap_transfer_piety
}

# Actor scope. The ten strongest refusers form the political-military core at FULL quality-adjusted
# effective strength. Refusal breadth adds a modest organization bonus; actual membership is still rolled
# ruler by ruler, so the credibility test does not need an additional 75% coordination handicap.
ddm_roll_grand_capitulation_coalition_effect = {
    set_variable = { name = ddm_cap_top10_effective value = 0 }
    set_variable = { name = ddm_cap_top10_quality value = 0 }
    set_variable = { name = ddm_cap_top10_count value = 0 }
    set_variable = { name = ddm_cap_coalition_chance value = 0 }
    remove_variable = ddm_cap_coalition_formed
    clear_variable_list = ddm_cap_top10_refusers
    clear_variable_list = ddm_cap_coalition_members

    if = {
        limit = { has_variable_list = ddm_cap_refusers }
        ordered_in_list = {
            variable = ddm_cap_refusers
            order_by = ddm_capitulation_cached_strength_value
            max = 10
            check_range_bounds = no
            save_temporary_scope_as = ddm_cap_top_refuser
            scope:ddm_cap_actor = {
                add_to_variable_list = { name = ddm_cap_top10_refusers target = scope:ddm_cap_top_refuser }
                change_variable = { name = ddm_cap_top10_effective add = scope:ddm_cap_top_refuser.var:ddm_cap_effective_strength }
                change_variable = { name = ddm_cap_top10_quality add = scope:ddm_cap_top_refuser.var:ddm_cap_quality_index }
                change_variable = { name = ddm_cap_top10_count add = 1 }
                if = { limit = { scope:ddm_cap_top_refuser = { OR = { has_trait = brave has_trait = wrathful has_trait = ambitious has_trait = vengeful has_trait = arrogant } } } change_variable = { name = ddm_cap_coalition_chance add = 2 } }
                if = { limit = { scope:ddm_cap_top_refuser = { OR = { has_trait = craven has_trait = content } } } change_variable = { name = ddm_cap_coalition_chance subtract = 2 } }
            }
        }
    }

    if = {
        limit = { var:ddm_cap_top10_count > 0 }
        set_variable = { name = ddm_cap_coalition_benchmark value = var:ddm_cap_top10_effective }
        set_variable = { name = ddm_cap_top10_avg_quality value = var:ddm_cap_top10_quality }
        change_variable = { name = ddm_cap_top10_avg_quality divide = var:ddm_cap_top10_count }

        # More widespread refusal makes coordination politically easier without pretending every small ruler's
        # army belongs to the top-ten military core. This is deliberately modest: +0 / +2 / +5 / +8 / +10.
        set_variable = { name = ddm_cap_breadth_bonus value = 0 }
        if = { limit = { var:ddm_cap_refuser_count >= 75 } set_variable = { name = ddm_cap_breadth_bonus value = 10 } }
        else_if = { limit = { var:ddm_cap_refuser_count >= 50 } set_variable = { name = ddm_cap_breadth_bonus value = 8 } }
        else_if = { limit = { var:ddm_cap_refuser_count >= 25 } set_variable = { name = ddm_cap_breadth_bonus value = 5 } }
        else_if = { limit = { var:ddm_cap_refuser_count >= 10 } set_variable = { name = ddm_cap_breadth_bonus value = 2 } }
        change_variable = { name = ddm_cap_coalition_chance add = var:ddm_cap_breadth_bonus }

        # Base chance curve requested by design: overwhelming player power can reduce resistance to a
        # token chance, while a coalition benchmark twice the player's effective power reaches ~82%.
        set_variable = { name = ddm_cap_tmp value = var:ddm_cap_effective_strength }
        change_variable = { name = ddm_cap_tmp multiply = 2 }
        if = { limit = { var:ddm_cap_coalition_benchmark >= var:ddm_cap_tmp } change_variable = { name = ddm_cap_coalition_chance add = 82 } }
        else = {
            set_variable = { name = ddm_cap_tmp value = var:ddm_cap_effective_strength }
            change_variable = { name = ddm_cap_tmp multiply = 1.5 }
            if = { limit = { var:ddm_cap_coalition_benchmark >= var:ddm_cap_tmp } change_variable = { name = ddm_cap_coalition_chance add = 65 } }
            else = {
                set_variable = { name = ddm_cap_tmp value = var:ddm_cap_effective_strength }
                change_variable = { name = ddm_cap_tmp multiply = 1.2 }
                if = { limit = { var:ddm_cap_coalition_benchmark >= var:ddm_cap_tmp } change_variable = { name = ddm_cap_coalition_chance add = 50 } }
                else = {
                    set_variable = { name = ddm_cap_tmp value = var:ddm_cap_coalition_benchmark }
                    change_variable = { name = ddm_cap_tmp multiply = 1.2 }
                    if = { limit = { var:ddm_cap_effective_strength <= var:ddm_cap_tmp } change_variable = { name = ddm_cap_coalition_chance add = 35 } }
                    else = {
                        set_variable = { name = ddm_cap_tmp value = var:ddm_cap_coalition_benchmark }
                        change_variable = { name = ddm_cap_tmp multiply = 1.5 }
                        if = { limit = { var:ddm_cap_effective_strength <= var:ddm_cap_tmp } change_variable = { name = ddm_cap_coalition_chance add = 20 } }
                        else = {
                            set_variable = { name = ddm_cap_tmp value = var:ddm_cap_coalition_benchmark }
                            change_variable = { name = ddm_cap_tmp multiply = 2 }
                            if = { limit = { var:ddm_cap_effective_strength <= var:ddm_cap_tmp } change_variable = { name = ddm_cap_coalition_chance add = 10 } }
                            else = { change_variable = { name = ddm_cap_coalition_chance add = 5 } }
                        }
                    }
                }
            }
        }
        if = { limit = { var:ddm_cap_coalition_chance < 3 } set_variable = { name = ddm_cap_coalition_chance value = 3 } }
        if = { limit = { var:ddm_cap_coalition_chance > 85 } set_variable = { name = ddm_cap_coalition_chance value = 85 } }

        random = {
            chance = var:ddm_cap_coalition_chance
            set_variable = { name = ddm_cap_coalition_formed value = 1 }
        }
    }

    if = {
        limit = { has_variable = ddm_cap_coalition_formed }
        # Safety layer remains, but the war is now allowed to be genuinely dangerous. Better-quality refusers
        # may assemble to 175% of the player's raw strength; equal/worse quality can mass to 225%.
        set_variable = { name = ddm_cap_coalition_raw_cap value = var:ddm_cap_raw_strength }
        if = {
            limit = { var:ddm_cap_top10_avg_quality > var:ddm_cap_quality_index }
            change_variable = { name = ddm_cap_coalition_raw_cap multiply = 1.75 }
        }
        else = { change_variable = { name = ddm_cap_coalition_raw_cap multiply = 2.25 } }
        set_variable = { name = ddm_cap_coalition_raw_total value = 0 }
        set_variable = { name = ddm_cap_coalition_member_count value = 0 }

        ordered_in_list = {
            variable = ddm_cap_refusers
            order_by = ddm_capitulation_cached_strength_value
            max = 100
            check_range_bounds = no
            save_temporary_scope_as = ddm_cap_join_candidate
            scope:ddm_cap_actor = {
                set_variable = { name = ddm_cap_join_chance value = 52 }
                if = { limit = { scope:ddm_cap_join_candidate = { OR = { has_trait = brave has_trait = wrathful has_trait = ambitious has_trait = vengeful } } } change_variable = { name = ddm_cap_join_chance add = 18 } }
                if = { limit = { scope:ddm_cap_join_candidate = { has_trait = arrogant } } change_variable = { name = ddm_cap_join_chance add = 8 } }
                if = { limit = { scope:ddm_cap_join_candidate = { OR = { has_trait = craven has_trait = content } } } change_variable = { name = ddm_cap_join_chance subtract = 22 } }
                if = { limit = { var:ddm_cap_join_chance < 10 } set_variable = { name = ddm_cap_join_chance value = 10 } }
                if = { limit = { var:ddm_cap_join_chance > 90 } set_variable = { name = ddm_cap_join_chance value = 90 } }

                set_variable = { name = ddm_cap_projected_raw value = var:ddm_cap_coalition_raw_total }
                change_variable = { name = ddm_cap_projected_raw add = scope:ddm_cap_join_candidate.var:ddm_cap_raw_strength }
                if = {
                    limit = { var:ddm_cap_projected_raw <= var:ddm_cap_coalition_raw_cap }
                    random = {
                        chance = var:ddm_cap_join_chance
                        add_to_variable_list = { name = ddm_cap_coalition_members target = scope:ddm_cap_join_candidate }
                        set_variable = { name = ddm_cap_coalition_raw_total value = var:ddm_cap_projected_raw }
                        change_variable = { name = ddm_cap_coalition_member_count add = 1 }
                        if = {
                            limit = { var:ddm_cap_coalition_member_count = 1 }
                            scope:ddm_cap_join_candidate = { save_scope_as = ddm_cap_coalition_leader }
                        }
                    }
                }
            }
        }

        if = {
            limit = { var:ddm_cap_coalition_member_count > 0 exists = scope:ddm_cap_coalition_leader }
            scope:ddm_cap_coalition_leader = {
                start_war = { casus_belli = ddm_grand_capitulation_coalition_cb target = scope:ddm_cap_actor }
                every_character_war = {
                    limit = {
                        using_cb = ddm_grand_capitulation_coalition_cb
                        casus_belli = { primary_attacker = scope:ddm_cap_coalition_leader primary_defender = scope:ddm_cap_actor }
                    }
                    save_scope_as = ddm_cap_coalition_war
                }
            }
            if = {
                limit = { exists = scope:ddm_cap_coalition_war }
                every_in_list = {
                    variable = ddm_cap_coalition_members
                    limit = { this != scope:ddm_cap_coalition_leader }
                    save_temporary_scope_as = ddm_cap_extra_attacker
                    scope:ddm_cap_coalition_war = {
                        set_called_to = scope:ddm_cap_extra_attacker
                        add_attacker = scope:ddm_cap_extra_attacker
                    }
                }
                set_variable = { name = ddm_cap_coalition_war_started value = 1 }
            }
        }
        else = { remove_variable = ddm_cap_coalition_formed }
    }

    remove_variable = ddm_cap_tmp
    remove_variable = ddm_cap_join_chance
    remove_variable = ddm_cap_projected_raw
}

# Actor scope. Full mass-resolution pass. No individual ruler events are generated.
ddm_execute_grand_capitulation_effect = {
    save_scope_as = ddm_cap_actor
    clear_variable_list = ddm_cap_targets
    clear_variable_list = ddm_cap_submitters
    clear_variable_list = ddm_cap_refusers
    clear_variable_list = ddm_cap_top10_refusers
    clear_variable_list = ddm_cap_coalition_members
    set_variable = { name = ddm_cap_target_count value = 0 }
    set_variable = { name = ddm_cap_submitter_count value = 0 }
    set_variable = { name = ddm_cap_refuser_count value = 0 }
    set_variable = { name = ddm_cap_titles_taken value = 0 }
    remove_variable = ddm_cap_coalition_war_started

    # Preserve the government's identity across any King -> Emperor rank-up caused by surrendered crowns.
    ddm_snapshot_capitulation_government_effect = yes
    ddm_capitulation_cache_strength_effect = yes

    every_independent_ruler = {
        limit = { ddm_grand_capitulation_target_trigger = yes }
        save_temporary_scope_as = ddm_cap_target_candidate
        scope:ddm_cap_actor = {
            add_to_variable_list = { name = ddm_cap_targets target = scope:ddm_cap_target_candidate }
            change_variable = { name = ddm_cap_target_count add = 1 }
        }
        ddm_capitulation_cache_strength_effect = yes
        ddm_capitulation_roll_response_effect = yes
    }

    # Apply peaceful submissions before checking whether the refusers organize. Submitters are barred from
    # the immediate coalition and are tagged so a coalition victory can shake them loose.
    if = {
        limit = { has_variable_list = ddm_cap_submitters }
        every_in_list = {
            variable = ddm_cap_submitters
            limit = { is_alive = yes is_landed = yes }
            save_temporary_scope_as = ddm_cap_target
            scope:ddm_cap_actor = { ddm_apply_grand_capitulation_submission_effect = yes }
        }
    }

    # Reassert once more after the full peaceful-transfer pass, then re-cache the player's real post-submission
    # strength. Submitted vassals can alter the levy base, but surrendered governments must not alter the actor.
    ddm_restore_capitulation_government_effect = yes
    ddm_capitulation_cache_strength_effect = yes
    ddm_roll_grand_capitulation_coalition_effect = yes
    add_character_flag = { flag = ddm_grand_capitulation_cooldown years = 5 }
}

# Manual cleanup after the summary event. Per-ruler cached strength variables are cleared from only the
# diplomatic-range targets touched by this run, not from every ruler in the world.
ddm_cleanup_grand_capitulation_effect = {
    if = {
        limit = { has_variable_list = ddm_cap_targets }
        every_in_list = {
            variable = ddm_cap_targets
            remove_variable = ddm_cap_raw_strength
            remove_variable = ddm_cap_quality_index
            remove_variable = ddm_cap_quality_multiplier
            remove_variable = ddm_cap_effective_strength
            remove_variable = ddm_cap_tmp
        }
    }
    clear_variable_list = ddm_cap_targets
    clear_variable_list = ddm_cap_submitters
    clear_variable_list = ddm_cap_refusers
    clear_variable_list = ddm_cap_top10_refusers
    # Coalition member list is intentionally left through war start; it is harmless and cleared on next use.
    remove_variable = ddm_cap_raw_strength
    remove_variable = ddm_cap_quality_index
    remove_variable = ddm_cap_quality_multiplier
    remove_variable = ddm_cap_effective_strength
    remove_variable = ddm_cap_top10_effective
    remove_variable = ddm_cap_top10_quality
    remove_variable = ddm_cap_top10_count
    remove_variable = ddm_cap_top10_avg_quality
    remove_variable = ddm_cap_breadth_bonus
    remove_variable = ddm_cap_coalition_chance
    remove_variable = ddm_cap_original_government
    remove_variable = ddm_cap_coalition_raw_cap
    remove_variable = ddm_cap_coalition_raw_total
    remove_variable = ddm_cap_join_chance
    remove_variable = ddm_cap_projected_raw
}
