﻿# Habsburgs' Creed — player dynasty marriage automation. Adult-only.
# Mode 1: same-dynasty first while respecting CK3 marriage legality.
# Mode 2: same-dynasty, strongly prefers close/extended family, still respects CK3 legality.
# Mode 3: Pure Blood; same-dynasty and strongly prioritizes congenital quality while respecting marriage legality.
# Mode 4: Absolute Creed; same-dynasty adults only and uses direct marriage, bypassing faith incest limits.

ddm_habsburg_creed_sweep_effect = {
    save_scope_as = ddm_habsburg_actor
    if = { limit = { NOT = { has_variable = ddm_habsburg_mode } } set_variable = { name = ddm_habsburg_mode value = 0 } }
    if = { limit = { NOT = { has_variable = ddm_habsburg_matches_total } } set_variable = { name = ddm_habsburg_matches_total value = 0 } }
    set_variable = { name = ddm_habsburg_matches_this_sweep value = 0 }

    if = {
        limit = { var:ddm_habsburg_mode > 0 exists = dynasty }
        dynasty = {
            every_dynasty_member = {
                limit = {
                    is_alive = yes is_adult = yes age >= 18
                    is_married = no is_betrothed = no is_concubine = no
                    this != scope:ddm_habsburg_actor
                    scope:ddm_habsburg_actor.var:ddm_habsburg_matches_this_sweep < 12
                }
                save_scope_as = ddm_habsburg_subject
                scope:ddm_habsburg_actor = { clear_variable_list = ddm_habsburg_candidates }
                dynasty = {
                    every_dynasty_member = {
                        limit = {
                            is_alive = yes is_adult = yes age >= 18
                            is_married = no is_betrothed = no is_concubine = no
                            this != scope:ddm_habsburg_subject
                            this != scope:ddm_habsburg_actor
                            OR = {
                                AND = { is_female = yes scope:ddm_habsburg_subject = { is_female = no } }
                                AND = { is_female = no scope:ddm_habsburg_subject = { is_female = yes } }
                            }
                            trigger_if = {
                                limit = { scope:ddm_habsburg_actor.var:ddm_habsburg_mode < 4 }
                                can_marry_character_trigger = { CHARACTER = scope:ddm_habsburg_subject }
                            }
                        }
                        save_temporary_scope_as = ddm_habsburg_candidate
                        scope:ddm_habsburg_actor = { add_to_variable_list = { name = ddm_habsburg_candidates target = scope:ddm_habsburg_candidate } }
                    }
                }
                scope:ddm_habsburg_actor = {
                    if = {
                        limit = { has_variable_list = ddm_habsburg_candidates }
                        ordered_in_list = {
                            variable = ddm_habsburg_candidates
                            order_by = ddm_habsburg_candidate_value
                            max = 1
                            check_range_bounds = no
                            save_temporary_scope_as = ddm_habsburg_best
                        }
                        if = {
                            limit = { exists = scope:ddm_habsburg_best scope:ddm_habsburg_subject = { is_alive = yes is_married = no is_betrothed = no } scope:ddm_habsburg_best = { is_alive = yes is_married = no is_betrothed = no } }
                            scope:ddm_habsburg_subject = { marry = scope:ddm_habsburg_best }
                            change_variable = { name = ddm_habsburg_matches_total add = 1 }
                            change_variable = { name = ddm_habsburg_matches_this_sweep add = 1 }
                        }
                    }
                    clear_variable_list = ddm_habsburg_candidates
                }
            }
        }
    }
}

# ---------------------------------------------------------------------------
# Habsburgs' Creed — four-generation pedigree analytics.
# Vanilla CK3 checks four ancestral generations for inbreeding; DDM mirrors that horizon so the
# numbers shown by the Office describe the same slice of genealogy the game's genetics care about.
# ---------------------------------------------------------------------------

ddm_habsburg_calculate_selected_pair_effect = {
    # Run from the Marriage Planner subject. The selected partner and planner owner are already stored
    # on this row by the matchmaker cache.
    if = {
        limit = { exists = var:ddm_match_sel exists = var:ddm_match_planner_owner }
        save_scope_as = ddm_habsburg_pair_subject
        var:ddm_match_sel = { save_scope_as = ddm_habsburg_pair_partner }
        var:ddm_match_planner_owner = {
            save_scope_as = ddm_habsburg_pair_actor
            clear_variable_list = ddm_habsburg_subject_ancestors
            clear_variable_list = ddm_habsburg_partner_ancestors
            set_variable = { name = ddm_habsburg_subject_positions value = 0 }
            set_variable = { name = ddm_habsburg_partner_positions value = 0 }
            set_variable = { name = ddm_habsburg_subject_unique value = 0 }
            set_variable = { name = ddm_habsburg_partner_unique value = 0 }
            set_variable = { name = ddm_habsburg_pair_shared value = 0 }
        }

        scope:ddm_habsburg_pair_subject = {
    every_parent = {
        save_scope_as = ddm_habsburg_ancestor
        scope:ddm_habsburg_pair_actor = {
            change_variable = { name = ddm_habsburg_subject_positions add = 1 }
            add_to_variable_list = { name = ddm_habsburg_subject_ancestors target = scope:ddm_habsburg_ancestor }
        }
        every_parent = {
            save_scope_as = ddm_habsburg_ancestor
            scope:ddm_habsburg_pair_actor = {
                change_variable = { name = ddm_habsburg_subject_positions add = 1 }
                add_to_variable_list = { name = ddm_habsburg_subject_ancestors target = scope:ddm_habsburg_ancestor }
            }
            every_parent = {
                save_scope_as = ddm_habsburg_ancestor
                scope:ddm_habsburg_pair_actor = {
                    change_variable = { name = ddm_habsburg_subject_positions add = 1 }
                    add_to_variable_list = { name = ddm_habsburg_subject_ancestors target = scope:ddm_habsburg_ancestor }
                }
                every_parent = {
                    save_scope_as = ddm_habsburg_ancestor
                    scope:ddm_habsburg_pair_actor = {
                        change_variable = { name = ddm_habsburg_subject_positions add = 1 }
                        add_to_variable_list = { name = ddm_habsburg_subject_ancestors target = scope:ddm_habsburg_ancestor }
                    }
                }
            }
        }
    }
        }
        scope:ddm_habsburg_pair_partner = {
    every_parent = {
        save_scope_as = ddm_habsburg_ancestor
        scope:ddm_habsburg_pair_actor = {
            change_variable = { name = ddm_habsburg_partner_positions add = 1 }
            add_to_variable_list = { name = ddm_habsburg_partner_ancestors target = scope:ddm_habsburg_ancestor }
        }
        every_parent = {
            save_scope_as = ddm_habsburg_ancestor
            scope:ddm_habsburg_pair_actor = {
                change_variable = { name = ddm_habsburg_partner_positions add = 1 }
                add_to_variable_list = { name = ddm_habsburg_partner_ancestors target = scope:ddm_habsburg_ancestor }
            }
            every_parent = {
                save_scope_as = ddm_habsburg_ancestor
                scope:ddm_habsburg_pair_actor = {
                    change_variable = { name = ddm_habsburg_partner_positions add = 1 }
                    add_to_variable_list = { name = ddm_habsburg_partner_ancestors target = scope:ddm_habsburg_ancestor }
                }
                every_parent = {
                    save_scope_as = ddm_habsburg_ancestor
                    scope:ddm_habsburg_pair_actor = {
                        change_variable = { name = ddm_habsburg_partner_positions add = 1 }
                        add_to_variable_list = { name = ddm_habsburg_partner_ancestors target = scope:ddm_habsburg_ancestor }
                    }
                }
            }
        }
    }
        }

        scope:ddm_habsburg_pair_actor = {
            every_in_list = {
                variable = ddm_habsburg_subject_ancestors
                save_temporary_scope_as = ddm_habsburg_shared_ancestor
                scope:ddm_habsburg_pair_actor = {
                    change_variable = { name = ddm_habsburg_subject_unique add = 1 }
                    if = {
                        limit = {
                            is_target_in_variable_list = { name = ddm_habsburg_partner_ancestors target = scope:ddm_habsburg_shared_ancestor }
                        }
                        change_variable = { name = ddm_habsburg_pair_shared add = 1 }
                    }
                }
            }
            every_in_list = {
                variable = ddm_habsburg_partner_ancestors
                scope:ddm_habsburg_pair_actor = { change_variable = { name = ddm_habsburg_partner_unique add = 1 } }
            }

            set_variable = { name = ddm_habsburg_subject_collapse value = var:ddm_habsburg_subject_positions }
            change_variable = { name = ddm_habsburg_subject_collapse subtract = var:ddm_habsburg_subject_unique }
            set_variable = { name = ddm_habsburg_partner_collapse value = var:ddm_habsburg_partner_positions }
            change_variable = { name = ddm_habsburg_partner_collapse subtract = var:ddm_habsburg_partner_unique }

            # Habsburg Meter = unique shared ancestors within four generations.
            # Tier 0: none; I: 1; II: 2-3; III: 4-7; IV: 8-14; V: 15+.
            set_variable = { name = ddm_habsburg_pair_tier value = 0 }
            if = { limit = { var:ddm_habsburg_pair_shared >= 1 } set_variable = { name = ddm_habsburg_pair_tier value = 1 } }
            if = { limit = { var:ddm_habsburg_pair_shared >= 2 } set_variable = { name = ddm_habsburg_pair_tier value = 2 } }
            if = { limit = { var:ddm_habsburg_pair_shared >= 4 } set_variable = { name = ddm_habsburg_pair_tier value = 3 } }
            if = { limit = { var:ddm_habsburg_pair_shared >= 8 } set_variable = { name = ddm_habsburg_pair_tier value = 4 } }
            if = { limit = { var:ddm_habsburg_pair_shared >= 15 } set_variable = { name = ddm_habsburg_pair_tier value = 5 } }
        }

        scope:ddm_habsburg_pair_subject = {
            set_variable = { name = ddm_habsburg_pair_partner value = scope:ddm_habsburg_pair_partner }
            set_variable = { name = ddm_habsburg_pair_shared value = scope:ddm_habsburg_pair_actor.var:ddm_habsburg_pair_shared }
            set_variable = { name = ddm_habsburg_pair_tier value = scope:ddm_habsburg_pair_actor.var:ddm_habsburg_pair_tier }
            set_variable = { name = ddm_habsburg_pair_subject_collapse value = scope:ddm_habsburg_pair_actor.var:ddm_habsburg_subject_collapse }
            set_variable = { name = ddm_habsburg_pair_partner_collapse value = scope:ddm_habsburg_pair_actor.var:ddm_habsburg_partner_collapse }
        }

        scope:ddm_habsburg_pair_actor = {
            clear_variable_list = ddm_habsburg_subject_ancestors
            clear_variable_list = ddm_habsburg_partner_ancestors
            remove_variable = ddm_habsburg_subject_positions
            remove_variable = ddm_habsburg_partner_positions
            remove_variable = ddm_habsburg_subject_unique
            remove_variable = ddm_habsburg_partner_unique
            remove_variable = ddm_habsburg_subject_collapse
            remove_variable = ddm_habsburg_partner_collapse
            remove_variable = ddm_habsburg_pair_shared
            remove_variable = ddm_habsburg_pair_tier
        }
    }
}

# Recalculate one character's pedigree-collapse tier. This keeps vanilla Inbred intact for compatibility;
# DDM's tier is a derived overlay. Tier V requires both an extreme collapsed pedigree and Pure-blooded.
ddm_habsburg_apply_consanguinity_tier_effect = {
    save_scope_as = ddm_habsburg_trait_target
    clear_variable_list = ddm_habsburg_trait_ancestors
    set_variable = { name = ddm_habsburg_ancestor_positions value = 0 }
    every_parent = {
        save_scope_as = ddm_habsburg_ancestor
        scope:ddm_habsburg_trait_target = {
            change_variable = { name = ddm_habsburg_ancestor_positions add = 1 }
            add_to_variable_list = { name = ddm_habsburg_trait_ancestors target = scope:ddm_habsburg_ancestor }
        }
        every_parent = {
            save_scope_as = ddm_habsburg_ancestor
            scope:ddm_habsburg_trait_target = {
                change_variable = { name = ddm_habsburg_ancestor_positions add = 1 }
                add_to_variable_list = { name = ddm_habsburg_trait_ancestors target = scope:ddm_habsburg_ancestor }
            }
            every_parent = {
                save_scope_as = ddm_habsburg_ancestor
                scope:ddm_habsburg_trait_target = {
                    change_variable = { name = ddm_habsburg_ancestor_positions add = 1 }
                    add_to_variable_list = { name = ddm_habsburg_trait_ancestors target = scope:ddm_habsburg_ancestor }
                }
                every_parent = {
                    save_scope_as = ddm_habsburg_ancestor
                    scope:ddm_habsburg_trait_target = {
                        change_variable = { name = ddm_habsburg_ancestor_positions add = 1 }
                        add_to_variable_list = { name = ddm_habsburg_trait_ancestors target = scope:ddm_habsburg_ancestor }
                    }
                }
            }
        }
    }
    set_variable = { name = ddm_habsburg_ancestor_unique value = 0 }
    every_in_list = {
        variable = ddm_habsburg_trait_ancestors
        scope:ddm_habsburg_trait_target = { change_variable = { name = ddm_habsburg_ancestor_unique add = 1 } }
    }
    set_variable = { name = ddm_habsburg_pedigree_collapse value = var:ddm_habsburg_ancestor_positions }
    change_variable = { name = ddm_habsburg_pedigree_collapse subtract = var:ddm_habsburg_ancestor_unique }

    # Vanilla Inbred is severe enough that it should never display as the mildest DDM tier.
    if = { limit = { has_trait = inbred var:ddm_habsburg_pedigree_collapse < 6 } set_variable = { name = ddm_habsburg_pedigree_collapse value = 6 } }

    remove_trait = ddm_consanguinity_1
    remove_trait = ddm_consanguinity_2
    remove_trait = ddm_consanguinity_3
    remove_trait = ddm_consanguinity_4
    remove_trait = ddm_consanguinity_5

    if = {
        limit = { var:ddm_habsburg_pedigree_collapse >= 10 has_trait = pure_blooded }
        add_trait = ddm_consanguinity_5
    }
    else_if = { limit = { var:ddm_habsburg_pedigree_collapse >= 10 } add_trait = ddm_consanguinity_4 }
    else_if = { limit = { var:ddm_habsburg_pedigree_collapse >= 6 } add_trait = ddm_consanguinity_3 }
    else_if = { limit = { var:ddm_habsburg_pedigree_collapse >= 3 } add_trait = ddm_consanguinity_2 }
    else_if = { limit = { var:ddm_habsburg_pedigree_collapse >= 1 } add_trait = ddm_consanguinity_1 }

    clear_variable_list = ddm_habsburg_trait_ancestors
    remove_variable = ddm_habsburg_ancestor_positions
    remove_variable = ddm_habsburg_ancestor_unique
}

# Lightweight current-dynasty dashboard. "Internal marriage rate" is deliberately the percentage of
# currently married living dynasts whose primary spouse is also a dynast, avoiding ambiguous pair-deduping.
ddm_habsburg_refresh_dynasty_analytics_effect = {
    save_scope_as = ddm_habsburg_analytics_actor
    set_variable = { name = ddm_habsburg_living_dynasts value = 0 }
    set_variable = { name = ddm_habsburg_married_dynasts value = 0 }
    set_variable = { name = ddm_habsburg_internal_married_dynasts value = 0 }
    set_variable = { name = ddm_habsburg_same_house_married_dynasts value = 0 }
    set_variable = { name = ddm_habsburg_inbred_dynasts value = 0 }
    set_variable = { name = ddm_habsburg_pure_dynasts value = 0 }
    set_variable = { name = ddm_habsburg_stabilized_dynasts value = 0 }
    set_variable = { name = ddm_habsburg_internal_rate value = 0 }
    set_variable = { name = ddm_habsburg_same_house_rate value = 0 }

    if = {
        limit = { exists = dynasty }
        dynasty = {
            save_scope_as = ddm_habsburg_analytics_dynasty
            every_dynasty_member = {
                limit = { is_alive = yes }
                scope:ddm_habsburg_analytics_actor = { change_variable = { name = ddm_habsburg_living_dynasts add = 1 } }
                if = { limit = { has_trait = inbred } scope:ddm_habsburg_analytics_actor = { change_variable = { name = ddm_habsburg_inbred_dynasts add = 1 } } }
                if = { limit = { has_trait = pure_blooded } scope:ddm_habsburg_analytics_actor = { change_variable = { name = ddm_habsburg_pure_dynasts add = 1 } } }
                if = { limit = { has_trait = ddm_consanguinity_5 } scope:ddm_habsburg_analytics_actor = { change_variable = { name = ddm_habsburg_stabilized_dynasts add = 1 } } }
                if = {
                    limit = { is_married = yes exists = primary_spouse }
                    scope:ddm_habsburg_analytics_actor = { change_variable = { name = ddm_habsburg_married_dynasts add = 1 } }
                    if = {
                        limit = { primary_spouse = { dynasty ?= scope:ddm_habsburg_analytics_dynasty } }
                        scope:ddm_habsburg_analytics_actor = { change_variable = { name = ddm_habsburg_internal_married_dynasts add = 1 } }
                    }
                    if = {
                        limit = {
                            exists = house
                            primary_spouse = { exists = house house ?= prev.house }
                        }
                        scope:ddm_habsburg_analytics_actor = { change_variable = { name = ddm_habsburg_same_house_married_dynasts add = 1 } }
                    }
                }
            }
        }
    }

    if = {
        limit = { var:ddm_habsburg_married_dynasts > 0 }
        set_variable = { name = ddm_habsburg_internal_rate value = var:ddm_habsburg_internal_married_dynasts }
        change_variable = { name = ddm_habsburg_internal_rate multiply = 100 }
        change_variable = { name = ddm_habsburg_internal_rate divide = var:ddm_habsburg_married_dynasts }
        set_variable = { name = ddm_habsburg_same_house_rate value = var:ddm_habsburg_same_house_married_dynasts }
        change_variable = { name = ddm_habsburg_same_house_rate multiply = 100 }
        change_variable = { name = ddm_habsburg_same_house_rate divide = var:ddm_habsburg_married_dynasts }
    }
}

# The expensive part is intentionally manual: one click recalculates four generations for every living
# dynast and applies the derived tier. Newborns are handled separately by an on_birth hook.
ddm_habsburg_refresh_blood_tiers_effect = {
    save_scope_as = ddm_habsburg_tier_actor
    set_variable = { name = ddm_habsburg_tiers_refreshed value = 0 }
    if = {
        limit = { exists = dynasty }
        dynasty = {
            every_dynasty_member = {
                limit = { is_alive = yes }
                ddm_habsburg_apply_consanguinity_tier_effect = yes
                scope:ddm_habsburg_tier_actor = { change_variable = { name = ddm_habsburg_tiers_refreshed add = 1 } }
            }
        }
    }
    ddm_habsburg_refresh_dynasty_analytics_effect = yes
}



# ---------------------------------------------------------------------------
# Pedigree Loop Report — four-generation non-graphical loop analysis.
# The report is intentionally numerical instead of attempting to replace CK3's genealogy GUI.
# A repeated ancestor is counted once as a person but every occupied pedigree position is retained,
# so "pedigree collapse" directly measures the loops the vanilla tree represents by duplicated cards.
# ---------------------------------------------------------------------------

ddm_habsburg_note_pedigree_ancestor_effect = {
    # ROOT/current scope = one ancestor occurrence. The actor carries the depth and paternal/maternal branch.
    if = { limit = { NOT = { has_variable = ddm_pedigree_occurrences } } set_variable = { name = ddm_pedigree_occurrences value = 0 } }
    change_variable = { name = ddm_pedigree_occurrences add = 1 }

    if = {
        limit = { NOT = { has_variable = ddm_pedigree_depth_first } }
        set_variable = { name = ddm_pedigree_depth_first value = scope:ddm_pedigree_actor.var:ddm_pedigree_current_depth }
    }
    else_if = {
        limit = { scope:ddm_pedigree_actor.var:ddm_pedigree_current_depth < var:ddm_pedigree_depth_first }
        set_variable = { name = ddm_pedigree_depth_second value = var:ddm_pedigree_depth_first }
        set_variable = { name = ddm_pedigree_depth_first value = scope:ddm_pedigree_actor.var:ddm_pedigree_current_depth }
    }
    else_if = {
        limit = {
            OR = {
                NOT = { has_variable = ddm_pedigree_depth_second }
                scope:ddm_pedigree_actor.var:ddm_pedigree_current_depth < var:ddm_pedigree_depth_second
            }
        }
        set_variable = { name = ddm_pedigree_depth_second value = scope:ddm_pedigree_actor.var:ddm_pedigree_current_depth }
    }

    if = {
        limit = { scope:ddm_pedigree_actor.var:ddm_pedigree_branch = 1 }
        set_variable = { name = ddm_pedigree_seen_paternal value = 1 }
    }
    else = { set_variable = { name = ddm_pedigree_seen_maternal value = 1 } }

    save_scope_as = ddm_pedigree_ancestor
    scope:ddm_pedigree_actor = {
        change_variable = { name = ddm_pedigree_known_positions add = 1 }
        if = {
            limit = { NOT = { is_target_in_variable_list = { name = ddm_pedigree_ancestors target = scope:ddm_pedigree_ancestor } } }
            add_to_variable_list = { name = ddm_pedigree_ancestors target = scope:ddm_pedigree_ancestor }
        }
    }
}

ddm_habsburg_prepare_pedigree_loop_report_effect = {
    # Requires scope:ddm_pedigree_actor and scope:ddm_pedigree_target.
    remove_variable = ddm_pedigree_subject
    remove_variable = ddm_pedigree_top_1
    remove_variable = ddm_pedigree_top_2
    remove_variable = ddm_pedigree_top_3
    remove_variable = ddm_pedigree_top_1_count
    remove_variable = ddm_pedigree_top_2_count
    remove_variable = ddm_pedigree_top_3_count
    set_variable = { name = ddm_pedigree_known_positions value = 0 }
    set_variable = { name = ddm_pedigree_unique_ancestors value = 0 }
    set_variable = { name = ddm_pedigree_collapse value = 0 }
    set_variable = { name = ddm_pedigree_repeated_people value = 0 }
    set_variable = { name = ddm_pedigree_cross_branch value = 0 }
    set_variable = { name = ddm_pedigree_earliest_convergence value = 0 }
    set_variable = { name = ddm_pedigree_loop_severity value = 0 }
    clear_variable_list = ddm_pedigree_ancestors
    set_variable = { name = ddm_pedigree_subject value = scope:ddm_pedigree_target }

    # Paternal half of the four-generation pedigree.
    if = {
        limit = { scope:ddm_pedigree_target = { exists = father } }
        set_variable = { name = ddm_pedigree_branch value = 1 }
        set_variable = { name = ddm_pedigree_current_depth value = 1 }
        scope:ddm_pedigree_target.father = {
            ddm_habsburg_note_pedigree_ancestor_effect = yes
            every_parent = {
                scope:ddm_pedigree_actor = { set_variable = { name = ddm_pedigree_current_depth value = 2 } }
                ddm_habsburg_note_pedigree_ancestor_effect = yes
                every_parent = {
                    scope:ddm_pedigree_actor = { set_variable = { name = ddm_pedigree_current_depth value = 3 } }
                    ddm_habsburg_note_pedigree_ancestor_effect = yes
                    every_parent = {
                        scope:ddm_pedigree_actor = { set_variable = { name = ddm_pedigree_current_depth value = 4 } }
                        ddm_habsburg_note_pedigree_ancestor_effect = yes
                    }
                }
            }
        }
    }

    # Maternal half. An ancestor seen in both halves is a true cross-branch loop.
    if = {
        limit = { scope:ddm_pedigree_target = { exists = mother } }
        set_variable = { name = ddm_pedigree_branch value = 2 }
        set_variable = { name = ddm_pedigree_current_depth value = 1 }
        scope:ddm_pedigree_target.mother = {
            ddm_habsburg_note_pedigree_ancestor_effect = yes
            every_parent = {
                scope:ddm_pedigree_actor = { set_variable = { name = ddm_pedigree_current_depth value = 2 } }
                ddm_habsburg_note_pedigree_ancestor_effect = yes
                every_parent = {
                    scope:ddm_pedigree_actor = { set_variable = { name = ddm_pedigree_current_depth value = 3 } }
                    ddm_habsburg_note_pedigree_ancestor_effect = yes
                    every_parent = {
                        scope:ddm_pedigree_actor = { set_variable = { name = ddm_pedigree_current_depth value = 4 } }
                        ddm_habsburg_note_pedigree_ancestor_effect = yes
                    }
                }
            }
        }
    }

    every_in_list = {
        variable = ddm_pedigree_ancestors
        save_temporary_scope_as = ddm_pedigree_unique_ancestor
        scope:ddm_pedigree_actor = { change_variable = { name = ddm_pedigree_unique_ancestors add = 1 } }
        if = {
            limit = { var:ddm_pedigree_occurrences >= 2 }
            scope:ddm_pedigree_actor = {
                change_variable = { name = ddm_pedigree_repeated_people add = 1 }
                if = {
                    limit = {
                        OR = {
                            var:ddm_pedigree_earliest_convergence = 0
                            scope:ddm_pedigree_unique_ancestor.var:ddm_pedigree_depth_second < var:ddm_pedigree_earliest_convergence
                        }
                    }
                    set_variable = { name = ddm_pedigree_earliest_convergence value = scope:ddm_pedigree_unique_ancestor.var:ddm_pedigree_depth_second }
                }
            }
        }
        if = {
            limit = { has_variable = ddm_pedigree_seen_paternal has_variable = ddm_pedigree_seen_maternal }
            scope:ddm_pedigree_actor = { change_variable = { name = ddm_pedigree_cross_branch add = 1 } }
        }
    }

    set_variable = { name = ddm_pedigree_collapse value = var:ddm_pedigree_known_positions }
    change_variable = { name = ddm_pedigree_collapse subtract = var:ddm_pedigree_unique_ancestors }

    # Severity describes loops only; it is deliberately separate from the beneficial Tier-V blood trait.
    if = { limit = { var:ddm_pedigree_collapse >= 1 } set_variable = { name = ddm_pedigree_loop_severity value = 1 } }
    if = { limit = { var:ddm_pedigree_collapse >= 3 } set_variable = { name = ddm_pedigree_loop_severity value = 2 } }
    if = { limit = { var:ddm_pedigree_collapse >= 6 } set_variable = { name = ddm_pedigree_loop_severity value = 3 } }
    if = { limit = { var:ddm_pedigree_collapse >= 10 } set_variable = { name = ddm_pedigree_loop_severity value = 4 } }
    if = { limit = { var:ddm_pedigree_collapse >= 15 } set_variable = { name = ddm_pedigree_loop_severity value = 5 } }

    ordered_in_list = {
        variable = ddm_pedigree_ancestors
        limit = { var:ddm_pedigree_occurrences >= 2 }
        order_by = var:ddm_pedigree_occurrences
        position = 0
        check_range_bounds = yes
        save_temporary_scope_as = ddm_pedigree_top1_scope
    }
    ordered_in_list = {
        variable = ddm_pedigree_ancestors
        limit = { var:ddm_pedigree_occurrences >= 2 }
        order_by = var:ddm_pedigree_occurrences
        position = 1
        check_range_bounds = yes
        save_temporary_scope_as = ddm_pedigree_top2_scope
    }
    ordered_in_list = {
        variable = ddm_pedigree_ancestors
        limit = { var:ddm_pedigree_occurrences >= 2 }
        order_by = var:ddm_pedigree_occurrences
        position = 2
        check_range_bounds = yes
        save_temporary_scope_as = ddm_pedigree_top3_scope
    }
    if = {
        limit = { exists = scope:ddm_pedigree_top1_scope }
        set_variable = { name = ddm_pedigree_top_1 value = scope:ddm_pedigree_top1_scope }
        set_variable = { name = ddm_pedigree_top_1_count value = scope:ddm_pedigree_top1_scope.var:ddm_pedigree_occurrences }
    }
    if = {
        limit = { exists = scope:ddm_pedigree_top2_scope }
        set_variable = { name = ddm_pedigree_top_2 value = scope:ddm_pedigree_top2_scope }
        set_variable = { name = ddm_pedigree_top_2_count value = scope:ddm_pedigree_top2_scope.var:ddm_pedigree_occurrences }
    }
    if = {
        limit = { exists = scope:ddm_pedigree_top3_scope }
        set_variable = { name = ddm_pedigree_top_3 value = scope:ddm_pedigree_top3_scope }
        set_variable = { name = ddm_pedigree_top_3_count value = scope:ddm_pedigree_top3_scope.var:ddm_pedigree_occurrences }
    }

    # Temporary traversal metadata belongs to the analysis pass, not to the characters themselves.
    every_in_list = {
        variable = ddm_pedigree_ancestors
        remove_variable = ddm_pedigree_occurrences
        remove_variable = ddm_pedigree_depth_first
        remove_variable = ddm_pedigree_depth_second
        remove_variable = ddm_pedigree_seen_paternal
        remove_variable = ddm_pedigree_seen_maternal
    }
    clear_variable_list = ddm_pedigree_ancestors
    remove_variable = ddm_pedigree_current_depth
    remove_variable = ddm_pedigree_branch
}
