﻿ddm_initialize_settings_effect = {
    if = { limit = { NOT = { has_variable = ddm_family_scope_mode } } set_variable = { name = ddm_family_scope_mode value = 3 } }
    if = { limit = { NOT = { has_variable = ddm_power_policy } } set_variable = { name = ddm_power_policy value = 2 } }
    if = { limit = { NOT = { has_variable = ddm_purge_method } } set_variable = { name = ddm_purge_method value = 2 } }
    if = { limit = { NOT = { has_variable = ddm_purge_stage } } set_variable = { name = ddm_purge_stage value = 3 } }
    if = { limit = { NOT = { has_variable = ddm_min_dynasty_floor } } set_variable = { name = ddm_min_dynasty_floor value = 8 } }
    if = { limit = { NOT = { has_variable = ddm_regard_mode } } set_variable = { name = ddm_regard_mode value = 1 } }
    if = {
        limit = { NOT = { has_variable = ddm_scoring_model_v14 } }
        if = { limit = { var:ddm_purge_stage >= 5 } set_variable = { name = ddm_purge_stage value = 3 } }
        set_variable = { name = ddm_scoring_model_v14 value = 1 }
    }
    if = { limit = { NOT = { has_variable = ddm_protect_player_heir } } set_variable = { name = ddm_protect_player_heir value = 1 } }
    # 1 = Absolute Core (legacy behavior), 2 = Best-Effort Core (default).
    if = { limit = { NOT = { has_variable = ddm_core_policy } } set_variable = { name = ddm_core_policy value = 2 } }
    # Domain-core mode: 1 = adaptive best-domain core (default), 2 = locked snapshot. The adaptive core
    # explicitly marks the best domain_limit holdings before any surplus grant.
    if = { limit = { NOT = { has_variable = ddm_domain_core_mode } } set_variable = { name = ddm_domain_core_mode value = 1 } }
    # Alliance policy: 0 = off, 1 = all dynastic landed recipients, 2 = direct vassals only, 3 = dukes
    # and above only. Migrate legacy saves that only knew the binary ddm_auto_alliance variable.
    if = {
        limit = { NOT = { has_variable = ddm_alliance_policy } }
        if = {
            limit = { has_variable = ddm_auto_alliance var:ddm_auto_alliance = 0 }
            set_variable = { name = ddm_alliance_policy value = 0 }
        }
        else = { set_variable = { name = ddm_alliance_policy value = 1 } }
    }
    # Succession influence: 1 = Neutral (default), 2 = Respect Current Heir, 3 = Preserve Primary Estate.
    # Succession modifies rightfulness only.
    if = { limit = { NOT = { has_variable = ddm_succession_policy } } set_variable = { name = ddm_succession_policy value = 1 } }
    if = {
        limit = { NOT = { has_variable = ddm_scoring_model_v17 } }
        set_variable = { name = ddm_scoring_model_v17 value = 1 }
    }
    # Align automatic grants with active succession gender law. Male/Female Only hard-filters recipients;
    # preference laws influence ranking rather than ban.
    if = { limit = { NOT = { has_variable = ddm_gender_alignment } } set_variable = { name = ddm_gender_alignment value = 1 } }
    # Realm-integrity heuristic penalizes recipients whose current primary heir is outside the player's
    # realm.
    if = { limit = { NOT = { has_variable = ddm_realm_integrity } } set_variable = { name = ddm_realm_integrity value = 1 } }
    # Construction reserve in gold. Bulk projects stop before crossing this reserve.
    if = { limit = { NOT = { has_variable = ddm_build_reserve } } set_variable = { name = ddm_build_reserve value = 1000 } }
    if = { limit = { NOT = { has_variable = ddm_outsider_policy } } set_variable = { name = ddm_outsider_policy value = 0 } }
    # 1.4 Hegemony reporting counter. Existing saves initialize lazily and remain compatible.
    if = { limit = { NOT = { has_variable = ddm_last_empires_granted } } set_variable = { name = ddm_last_empires_granted value = 0 } }

    if = { limit = { NOT = { has_variable = ddm_outsider_recipient_mode } } set_variable = { name = ddm_outsider_recipient_mode value = 0 } }
    if = { limit = { NOT = { has_variable = ddm_educator_scope_mode } } set_variable = { name = ddm_educator_scope_mode value = 3 } }
    if = { limit = { NOT = { has_variable = ddm_auto_education_enabled } } set_variable = { name = ddm_auto_education_enabled value = 1 } }
    # Ruler household mode: 0 = normal marriage, 1 = DDM harem registry. Harem mode never mutates vanilla
    # spouse/concubine relationships; dynasty-wide marriage planning and faith doctrine remain untouched.
    if = { limit = { NOT = { has_variable = ddm_household_mode } } set_variable = { name = ddm_household_mode value = 0 } }
    # Marriage Planner: 1 = Best Children, 2 = Love + Good Children, 3 = Love Match.
    if = { limit = { NOT = { has_variable = ddm_match_policy } } set_variable = { name = ddm_match_policy value = 1 } }
    # Dynasty matching: 0 = avoid close/extended kin, 1 = allow dynasty/kin where vanilla permits,
    # 2 = Pure-Blood Program (same dynasty only, with kinship risk still scored).
    if = { limit = { NOT = { has_variable = ddm_match_dynasty_mode } } set_variable = { name = ddm_match_dynasty_mode value = 0 } }
    # Marriage Planner presentation / sorting.
    # View: 0 = Solo recommendations, 1 = non-conflicting Pairs board.
    if = { limit = { NOT = { has_variable = ddm_match_view_mode } } set_variable = { name = ddm_match_view_mode value = 0 } }
    # Solo sort: 0 = office priority, 1 = dynastic value, 2 = age, 3 = fertility, 4 = total skills.
    if = { limit = { NOT = { has_variable = ddm_match_sort_mode } } set_variable = { name = ddm_match_sort_mode value = 0 } }
    if = { limit = { NOT = { has_variable = ddm_match_sort_direction } } set_variable = { name = ddm_match_sort_direction value = 1 } }
    # Pair sort: 0 = total match score, 1 = child score, 2 = love score, 3 = kinship/risk, 4 = direct-finalization first.
    if = { limit = { NOT = { has_variable = ddm_match_pair_sort_mode } } set_variable = { name = ddm_match_pair_sort_mode value = 0 } }
    if = { limit = { NOT = { has_variable = ddm_match_pair_sort_direction } } set_variable = { name = ddm_match_pair_sort_direction value = 1 } }
    # Cache generation. Explicit Refresh Marriage Planner raises it; ordinary planner preparation/re-entry does not.
    if = { limit = { NOT = { has_variable = ddm_match_scan_generation } } set_variable = { name = ddm_match_scan_generation value = 0 } }
    # Incoming relationship-bounty pressure for the human player: 0 Off, 1 Light (4/year),
    # 2 Standard (8/year), 3 High (12/year, default), 4 Relentless (12/year/no Defied immunity).
    if = { limit = { NOT = { has_variable = ddm_bounty_pressure } } set_variable = { name = ddm_bounty_pressure value = 3 } }
    # Eight hunter victories in one survivor window normally clear active writs and grant three years of
    # bounty-hunter immunity. Relentless pressure explicitly overrides that protection reward.
    if = { limit = { NOT = { has_variable = ddm_defied_writ_protection } } set_variable = { name = ddm_defied_writ_protection value = 1 } }
    if = { limit = { NOT = { has_variable = ddm_recipient_page } } set_variable = { name = ddm_recipient_page value = 0 } }
    if = { limit = { NOT = { has_variable = ddm_outsider_page } } set_variable = { name = ddm_outsider_page value = 0 } }
    if = { limit = { NOT = { has_variable = ddm_review_page } } set_variable = { name = ddm_review_page value = 0 } }
    if = { limit = { NOT = { has_variable = ddm_review_sort_mode } } set_variable = { name = ddm_review_sort_mode value = 0 } }
    if = { limit = { NOT = { has_variable = ddm_review_sort_direction } } set_variable = { name = ddm_review_sort_direction value = 1 } }
    # Holding-list organization: 0 = de-jure hierarchy A-Z, 1 = development, 2 = county faith affinity, 3
    # = county culture affinity. Direction 1 is the natural order for the selected mode; -1 reverses it.
    if = { limit = { NOT = { has_variable = ddm_title_sort_mode } } set_variable = { name = ddm_title_sort_mode value = 0 } }
    if = { limit = { NOT = { has_variable = ddm_title_sort_direction } } set_variable = { name = ddm_title_sort_direction value = 1 } }

    if = {
        limit = { NOT = { has_variable = ddm_migrated_explicit_core_v18 } }
        set_variable = { name = ddm_migrated_explicit_core_v18 value = 1 }
        remove_variable = ddm_domain_plan_limit
        clear_variable_list = ddm_domain_review_queue
        every_held_title = {
            limit = {
                OR = {
                    tier = tier_county
                    AND = { tier = tier_barony is_capital_barony = no }
                }
            }
            remove_variable = ddm_manual_core
            remove_variable = ddm_manual_shed
            remove_variable = ddm_manual_neutral
        }
        if = {
            limit = { exists = capital_county }
            capital_county = { set_variable = ddm_manual_core }
        }
    }

    if = {
        limit = { NOT = { has_variable = ddm_succession_model_v19 } }
        set_variable = { name = ddm_succession_model_v19 value = 1 }
        set_variable = { name = ddm_succession_policy value = 1 }
        # This variable remains only for pruning protection compatibility. It no longer participates in
        # land-recipient eligibility or succession policy.
        set_variable = { name = ddm_protect_player_heir value = 1 }
    }

    if = {
        limit = { NOT = { has_variable = ddm_rightfulness_model_v110 } }
        set_variable = { name = ddm_rightfulness_model_v110 value = 1 }
        set_variable = { name = ddm_succession_policy value = 1 }
    }

    if = {
        limit = { NOT = { has_variable = ddm_distribution_target_model_v111 } }
        set_variable = { name = ddm_distribution_target_model_v111 value = 1 }
        set_variable = { name = ddm_protected_domain_target value = 0 }
        every_held_title = {
            limit = {
                has_variable = ddm_manual_core
                OR = {
                    tier = tier_county
                    AND = { tier = tier_barony is_capital_barony = no }
                }
            }
            holder = { change_variable = { name = ddm_protected_domain_target add = 1 } }
        }
        if = {
            limit = { var:ddm_protected_domain_target < 1 }
            set_variable = { name = ddm_protected_domain_target value = domain_limit }
            if = { limit = { domain_size < var:ddm_protected_domain_target } set_variable = { name = ddm_protected_domain_target value = domain_size } }
            if = { limit = { var:ddm_protected_domain_target < 1 } set_variable = { name = ddm_protected_domain_target value = 1 } }
        }
    }

    if = {
        limit = { NOT = { has_variable = ddm_domain_gui_model_v19 } }
        set_variable = { name = ddm_domain_gui_model_v19 value = 1 }
        remove_variable = ddm_domain_plan_limit
        clear_variable_list = ddm_domain_review_queue
        clear_variable_list = ddm_domain_planner_titles

        # Migration must never destroy a Crown Estate that the player already saved in an older build.
        # Preserve all explicit Keep / Give Away / Office Choice classifications. Only create a default
        # Steward's Choice estate when there is no existing protected holding information at all.
        set_variable = { name = ddm_migration_manual_core_count value = 0 }
        every_held_title = {
            limit = {
                OR = {
                    tier = tier_county
                    AND = { tier = tier_barony is_capital_barony = no }
                }
            }
            remove_variable = ddm_planner_original_core
            if = { limit = { has_variable = ddm_manual_core } holder = { change_variable = { name = ddm_migration_manual_core_count add = 1 } } }
        }
        if = {
            limit = { var:ddm_migration_manual_core_count < 1 }
            ddm_refresh_adaptive_domain_core_internal_effect = yes
            every_held_title = {
                limit = { has_variable = ddm_auto_core }
                set_variable = ddm_manual_core
            }
        }
        ddm_mark_capital_as_explicit_core_effect = yes
        remove_variable = ddm_migration_manual_core_count
    }
}

ddm_refresh_one_subject_regard_effect = {
    # Run from the subject. scope:ddm_actor must be saved.
    set_variable = { name = ddm_family_regard value = 0 }
    set_variable = { name = ddm_family_regard_count value = 0 }
    save_scope_as = ddm_subject

    if = {
        limit = { scope:ddm_actor.var:ddm_regard_mode = 2 }
        dynasty = {
            every_dynasty_member = {
                limit = { is_alive = yes this != scope:ddm_subject }
                save_temporary_scope_value_as = { name = ddm_observer_opinion value = "opinion(scope:ddm_subject)" }
                scope:ddm_subject = {
                    change_variable = { name = ddm_family_regard add = scope:ddm_observer_opinion }
                    change_variable = { name = ddm_family_regard_count add = 1 }
                }
            }
        }
    }
    else = {
        every_close_or_extended_family_member = {
            limit = { is_alive = yes exists = dynasty dynasty = scope:ddm_actor.dynasty }
            save_temporary_scope_value_as = { name = ddm_observer_opinion value = "opinion(scope:ddm_subject)" }
            scope:ddm_subject = {
                change_variable = { name = ddm_family_regard add = scope:ddm_observer_opinion }
                change_variable = { name = ddm_family_regard_count add = 1 }
            }
        }
        if = {
            limit = { exists = house.house_head house.house_head != this }
            house.house_head = { save_temporary_scope_value_as = { name = ddm_observer_opinion value = "opinion(scope:ddm_subject)" } }
            change_variable = { name = ddm_family_regard add = scope:ddm_observer_opinion }
            change_variable = { name = ddm_family_regard_count add = 1 }
        }
    }
    if = {
        limit = { var:ddm_family_regard_count > 0 }
        change_variable = { name = ddm_family_regard divide = var:ddm_family_regard_count }
    }
}

ddm_refresh_all_dynasty_regard_effect = {
    save_scope_as = ddm_actor
    dynasty = {
        every_dynasty_member = {
            limit = { is_alive = yes }
            ddm_refresh_one_subject_regard_effect = yes
        }
    }
}

ddm_build_partition_settlement_pool_effect = {
    save_scope_as = ddm_actor
    set_variable = { name = ddm_partition_pool_count value = 0 }
    dynasty = { every_dynasty_member = { remove_character_flag = ddm_partition_settlement_pool } }

    if = {
        limit = { ddm_actor_uses_partition_trigger = yes }

        if = {
            limit = { OR = { var:ddm_succession_policy = 1 var:ddm_succession_policy = 3 } }
            every_child = {
                limit = {
                    ddm_is_eligible_partition_recipient_trigger = yes
                    trigger_if = {
                        limit = {
                            OR = {
                                scope:ddm_actor = { has_realm_law = male_preference_law }
                                scope:ddm_actor.primary_title = { has_title_law = male_preference_law }
                            }
                            is_female = yes
                        }
                        scope:ddm_actor = { NOT = { any_child = { is_male = yes ddm_is_eligible_partition_recipient_trigger = yes } } }
                    }
                    trigger_if = {
                        limit = {
                            OR = {
                                scope:ddm_actor = { has_realm_law = female_preference_law }
                                scope:ddm_actor.primary_title = { has_title_law = female_preference_law }
                            }
                            is_male = yes
                        }
                        scope:ddm_actor = { NOT = { any_child = { is_female = yes ddm_is_eligible_partition_recipient_trigger = yes } } }
                    }
                }
                add_character_flag = ddm_partition_settlement_pool
                scope:ddm_actor = { change_variable = { name = ddm_partition_pool_count add = 1 } }
            }
        }

        # Policy 2: literal current succession. Deduplicate title current heirs.
        else_if = {
            limit = { var:ddm_succession_policy = 2 }
            every_held_title = {
                limit = { tier >= tier_county exists = current_heir }
                current_heir = {
                    if = {
                        limit = {
                            ddm_is_eligible_partition_recipient_trigger = yes
                            NOT = { has_character_flag = ddm_partition_settlement_pool }
                        }
                        add_character_flag = ddm_partition_settlement_pool
                        scope:ddm_actor = { change_variable = { name = ddm_partition_pool_count add = 1 } }
                    }
                }
            }
        }

        # Unusual representation/succession fallback.
        if = {
            limit = { var:ddm_partition_pool_count = 0 }
            every_heir = {
                limit = {
                    ddm_is_eligible_partition_recipient_trigger = yes
                    NOT = { has_character_flag = ddm_partition_settlement_pool }
                }
                add_character_flag = ddm_partition_settlement_pool
                scope:ddm_actor = { change_variable = { name = ddm_partition_pool_count add = 1 } }
            }
        }
    }
}

# Prepare a mass land-grant run. The family-regard cache is refreshed before ranking begins, then a
# per-batch grant counter discourages repeatedly enriching the same branch unless merit, succession, or
# de-jure continuity still wins.
ddm_prepare_land_distribution_batch_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    # Clean all temporary per-batch fairness state first.
    dynasty = {
        every_dynasty_member = {
            limit = { is_alive = yes }
            remove_variable = ddm_batch_land_grants
        }
    }
    every_vassal_or_below = { remove_variable = ddm_batch_land_grants }

    ddm_build_partition_settlement_pool_effect = yes
    set_variable = { name = ddm_last_partition_heirs_available value = var:ddm_partition_pool_count }
    ddm_refresh_all_dynasty_regard_effect = yes
}

ddm_clear_land_distribution_batch_effect = {
    # Temporary candidate markers must never leak into a later ruler/batch.
    save_scope_as = ddm_actor
    dynasty = {
        every_dynasty_member = {
            remove_character_flag = ddm_partition_settlement_pool
        }
    }
}

# Direct scripted title changes bypass the special Grant Titles interaction's on_accept block. Reapply
# the vanilla recipient-opinion modifier for the title tier and record this recipient for fairness within
# the current mass-grant run.
ddm_apply_grant_social_effect = {
    # Run from actor with scope:ddm_recipient and scope:ddm_title saved.
    if = {
        limit = { exists = scope:ddm_recipient exists = scope:ddm_title }
        scope:ddm_recipient = {
            if = {
                limit = { scope:ddm_title = { tier = tier_barony } }
                hidden_effect = { add_opinion = { target = scope:ddm_actor modifier = received_title_barony } }
            }
            else_if = {
                limit = { scope:ddm_title.tier = tier_county }
                hidden_effect = { add_opinion = { target = scope:ddm_actor modifier = received_title_county } }
            }
            else_if = {
                limit = { scope:ddm_title.tier = tier_duchy }
                hidden_effect = { add_opinion = { target = scope:ddm_actor modifier = received_title_duchy } }
            }
            else_if = {
                limit = { scope:ddm_title.tier = tier_kingdom }
                hidden_effect = { add_opinion = { target = scope:ddm_actor modifier = received_title_kingdom } }
            }
            else_if = {
                limit = { scope:ddm_title.tier = tier_empire }
                hidden_effect = { add_opinion = { target = scope:ddm_actor modifier = received_title_empire } }
            }
            if = { limit = { NOT = { has_variable = ddm_batch_land_grants } } set_variable = { name = ddm_batch_land_grants value = 0 } }
            change_variable = { name = ddm_batch_land_grants add = 1 }
        }
    }
}


# ---------- explicit protected-domain core ----------

ddm_refresh_adaptive_domain_core_internal_effect = {
    save_scope_as = ddm_actor

    every_held_title = {
        limit = {
            OR = {
                tier = tier_county
                AND = { tier = tier_barony title_province = { is_county_capital = no } }
            }
        }
        remove_variable = ddm_auto_core
    }

    if = {
        limit = { domain_limit > 0 }
        ordered_held_title = {
            limit = {
                OR = {
                    tier = tier_county
                    AND = { tier = tier_barony title_province = { is_county_capital = no } }
                }
                NOT = { has_variable = ddm_manual_shed }
            }
            order_by = ddm_holding_retention_priority
            max = ddm_core_last_index
            check_range_bounds = no
            set_variable = ddm_auto_core
        }
    }
}

ddm_refresh_adaptive_domain_core_effect = {
    ddm_initialize_settings_effect = yes
    ddm_refresh_adaptive_domain_core_internal_effect = yes
}

ddm_lock_recommended_domain_core_effect = {
    # Freeze the current adaptive recommendation. Only the top domain_limit holdings are locked, so using
    # this while above the limit does not accidentally protect the whole over-limit domain.
    set_variable = { name = ddm_domain_core_mode value = 1 }
    ddm_refresh_adaptive_domain_core_effect = yes
    every_held_title = {
        limit = { has_variable = ddm_manual_core }
        remove_variable = ddm_manual_core
    }
    every_held_title = {
        limit = { has_variable = ddm_auto_core }
        set_variable = ddm_manual_core
        remove_variable = ddm_manual_shed
        remove_variable = ddm_manual_neutral
        remove_variable = ddm_auto_core
    }
    set_variable = { name = ddm_domain_core_mode value = 2 }
}

ddm_use_adaptive_domain_core_effect = {
    # Flexible mode preserves explicit player locks. It merely refreshes the recommended core used for
    # preview and ranking.
    set_variable = { name = ddm_domain_core_mode value = 1 }
    ddm_refresh_adaptive_domain_core_effect = yes
}

ddm_clear_manual_domain_core_effect = {
    every_held_title = { remove_variable = ddm_manual_core }
    set_variable = { name = ddm_domain_core_mode value = 1 }
    ddm_refresh_adaptive_domain_core_effect = yes
}

# Additive convenience presets. They never replace existing manual locks.
ddm_protect_capital_duchy_holdings_effect = {
    save_scope_as = ddm_actor
    if = {
        limit = { exists = capital_county.de_jure_liege }
        every_held_title = {
            limit = {
                tier = tier_county
                de_jure_liege = scope:ddm_actor.capital_county.de_jure_liege
            }
            set_variable = ddm_manual_core
            remove_variable = ddm_manual_shed
            remove_variable = ddm_manual_neutral
        }
    }
    set_variable = { name = ddm_domain_core_mode value = 2 }
    ddm_refresh_adaptive_domain_core_effect = yes
}

ddm_protect_stationed_maa_holdings_effect = {
    save_scope_as = ddm_actor
    every_held_title = {
        limit = {
            tier = tier_county
            title_province = { has_stationed_regiment = yes }
        }
        set_variable = ddm_manual_core
        remove_variable = ddm_manual_shed
        remove_variable = ddm_manual_neutral
    }
    set_variable = { name = ddm_domain_core_mode value = 2 }
    ddm_refresh_adaptive_domain_core_effect = yes
}

ddm_clear_manual_shed_effect = {
    every_held_title = { remove_variable = ddm_manual_shed }
}


ddm_mark_capital_as_explicit_core_effect = {
    if = {
        limit = { exists = capital_county }
        capital_county = {
            set_variable = ddm_manual_core
            remove_variable = ddm_manual_shed
            remove_variable = ddm_manual_neutral
        }
    }
}

ddm_reset_all_domain_choices_effect = {
    remove_variable = ddm_domain_plan_limit
    every_held_title = {
        limit = {
            OR = {
                tier = tier_county
                AND = { tier = tier_barony title_province = { is_county_capital = no } }
            }
        }
        remove_variable = ddm_manual_core
        remove_variable = ddm_manual_shed
        remove_variable = ddm_manual_neutral
    }
    ddm_mark_capital_as_explicit_core_effect = yes
    ddm_refresh_adaptive_domain_core_effect = yes
}

ddm_begin_domain_choice_review_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    ddm_mark_capital_as_explicit_core_effect = yes
    clear_variable_list = ddm_domain_review_queue

    every_held_title = {
        limit = {
            OR = {
                tier = tier_county
                AND = { tier = tier_barony is_capital_barony = no }
            }
            this != scope:ddm_actor.capital_county
            NOT = {
                OR = {
                    has_variable = ddm_manual_core
                    has_variable = ddm_manual_shed
                    has_variable = ddm_manual_neutral
                }
            }
        }
        scope:ddm_actor = {
            add_to_variable_list = {
                name = ddm_domain_review_queue
                target = prev
            }
        }
    }
}

ddm_begin_full_domain_choice_review_effect = {
    # Full reset, then build a persistent title queue. The capital is marked KEEP automatically; every
    # other domain holding must receive an explicit player instruction before the surplus distributor is
    # allowed to touch it.
    ddm_reset_all_domain_choices_effect = yes
    save_scope_as = ddm_actor
    clear_variable_list = ddm_domain_review_queue

    every_held_title = {
        limit = {
            OR = {
                tier = tier_county
                AND = { tier = tier_barony is_capital_barony = no }
            }
            this != scope:ddm_actor.capital_county
        }
        scope:ddm_actor = {
            add_to_variable_list = {
                name = ddm_domain_review_queue
                target = prev
            }
        }
    }
}

ddm_finish_domain_choice_review_effect = {
    set_variable = { name = ddm_domain_plan_limit value = domain_limit }
    ddm_mark_capital_as_explicit_core_effect = yes
    ddm_refresh_adaptive_domain_core_effect = yes
    ddm_prepare_dashboard_effect = yes
    set_variable = { name = ddm_protected_domain_target value = var:ddm_dash_manual_core_count }
    if = { limit = { var:ddm_protected_domain_target < 1 } set_variable = { name = ddm_protected_domain_target value = 1 } }
}

ddm_classify_all_remaining_domain_as_neutral_effect = {
    every_in_list = {
        variable = ddm_domain_review_queue
        set_variable = ddm_manual_neutral
        remove_variable = ddm_manual_core
        remove_variable = ddm_manual_shed
    }
    clear_variable_list = ddm_domain_review_queue
    ddm_finish_domain_choice_review_effect = yes
}

ddm_classify_all_remaining_domain_as_shed_effect = {
    every_in_list = {
        variable = ddm_domain_review_queue
        set_variable = ddm_manual_shed
        remove_variable = ddm_manual_core
        remove_variable = ddm_manual_neutral
    }
    clear_variable_list = ddm_domain_review_queue
    ddm_finish_domain_choice_review_effect = yes
}

ddm_continue_domain_choice_review_effect = {
    # Called after one KEEP/GIVE/DELEGATE choice. The current title has already been removed from
    # ddm_domain_review_queue by the event option.
    ddm_prepare_dashboard_effect = yes

    # If the player has filled every personal-domain slot with explicit KEEP choices, everything left in
    # the review queue is necessarily surplus.
    if = {
        limit = {
            domain_size > domain_limit
            var:ddm_dash_manual_core_count >= domain_limit
        }
        every_in_list = {
            variable = ddm_domain_review_queue
            set_variable = ddm_manual_shed
            remove_variable = ddm_manual_core
            remove_variable = ddm_manual_neutral
        }
        clear_variable_list = ddm_domain_review_queue
        ddm_finish_domain_choice_review_effect = yes
        trigger_event = ddm_manager.1022
    }
    else_if = {
        limit = {
            any_in_list = {
                variable = ddm_domain_review_queue
                count >= 1
            }
        }
        trigger_event = ddm_manager.1021
    }
    else = {
        ddm_finish_domain_choice_review_effect = yes
        trigger_event = ddm_manager.1022
    }
}

ddm_prepare_dashboard_effect = {
    ddm_initialize_settings_effect = yes
    set_variable = { name = ddm_dash_living_dynasty value = 0 }
    set_variable = { name = ddm_dash_landed_dynasty value = 0 }
    set_variable = { name = ddm_dash_non_dynasty_rulers value = 0 }
    set_variable = { name = ddm_dash_protected_people value = 0 }
    set_variable = { name = ddm_dash_distributable_counties value = 0 }
    set_variable = { name = ddm_dash_distributable_baronies value = 0 }
    set_variable = { name = ddm_dash_soft_core_counties value = 0 }
    set_variable = { name = ddm_dash_stationed_counties value = 0 }
    set_variable = { name = ddm_dash_safe_county_recipients value = 0 }
    set_variable = { name = ddm_dash_auto_core_count value = 0 }
    set_variable = { name = ddm_dash_manual_core_count value = 0 }
    set_variable = { name = ddm_dash_manual_neutral_count value = 0 }
    set_variable = { name = ddm_dash_manual_shed_count value = 0 }
    set_variable = { name = ddm_dash_unclassified_domain_count value = 0 }
    set_variable = { name = ddm_dash_personal_domain value = domain_size }
    set_variable = { name = ddm_dash_domain_limit value = domain_limit }
    set_variable = { name = ddm_dash_vassal_count value = vassal_count }
    set_variable = { name = ddm_dash_vassal_limit value = vassal_limit }
    set_variable = { name = ddm_dash_vassal_overage value = 0 }
    if = {
        limit = { vassal_count > vassal_limit }
        set_variable = { name = ddm_dash_vassal_overage value = vassal_count }
        change_variable = { name = ddm_dash_vassal_overage subtract = vassal_limit }
    }
    set_variable = { name = ddm_dash_held_duchies value = 0 }
    set_variable = { name = ddm_dash_held_kingdoms value = 0 }
    set_variable = { name = ddm_dash_held_empires value = 0 }
    set_variable = { name = ddm_dash_managed_top_rank value = 0 }
    set_variable = { name = ddm_dash_top_rank_target value = 0 }
    save_scope_as = ddm_actor
    ddm_refresh_adaptive_domain_core_effect = yes

    dynasty = {
        every_dynasty_member = {
            limit = { is_alive = yes }
            scope:ddm_actor = { change_variable = { name = ddm_dash_living_dynasty add = 1 } }
            if = { limit = { is_landed = yes } scope:ddm_actor = { change_variable = { name = ddm_dash_landed_dynasty add = 1 } } }
            if = { limit = { has_character_flag = ddm_protected_from_automation } scope:ddm_actor = { change_variable = { name = ddm_dash_protected_people add = 1 } } }
            if = { limit = { ddm_safe_for_additional_county_trigger = yes } scope:ddm_actor = { change_variable = { name = ddm_dash_safe_county_recipients add = 1 } } }
        }
    }
    every_vassal_or_below = {
        limit = {
            is_landed = yes
            OR = { NOT = { exists = dynasty } dynasty != scope:ddm_actor.dynasty }
        }
        scope:ddm_actor = { change_variable = { name = ddm_dash_non_dynasty_rulers add = 1 } }
    }
    every_held_title = {
        if = { limit = { tier = tier_duchy } scope:ddm_actor = { change_variable = { name = ddm_dash_held_duchies add = 1 } } }
        if = { limit = { tier = tier_kingdom } scope:ddm_actor = { change_variable = { name = ddm_dash_held_kingdoms add = 1 } } }
        if = { limit = { tier = tier_empire } scope:ddm_actor = { change_variable = { name = ddm_dash_held_empires add = 1 } } }
        if = { limit = { has_variable = ddm_auto_core } scope:ddm_actor = { change_variable = { name = ddm_dash_auto_core_count add = 1 } } }
        if = { limit = { has_variable = ddm_manual_core } scope:ddm_actor = { change_variable = { name = ddm_dash_manual_core_count add = 1 } } }
        if = { limit = { has_variable = ddm_manual_shed } scope:ddm_actor = { change_variable = { name = ddm_dash_manual_shed_count add = 1 } } }
        if = { limit = { has_variable = ddm_manual_neutral } scope:ddm_actor = { change_variable = { name = ddm_dash_manual_neutral_count add = 1 } } }
        if = {
            limit = {
                OR = {
                    tier = tier_county
                    AND = { tier = tier_barony title_province = { is_county_capital = no } }
                }
                this != scope:ddm_actor.capital_county
                NOT = {
                    OR = {
                        has_variable = ddm_manual_core
                        has_variable = ddm_manual_shed
                        has_variable = ddm_manual_neutral
                    }
                }
            }
            scope:ddm_actor = { change_variable = { name = ddm_dash_unclassified_domain_count add = 1 } }
        }
        if = {
            limit = { tier = tier_county }
            if = { limit = { ddm_county_can_be_distributed_trigger = yes } scope:ddm_actor = { change_variable = { name = ddm_dash_distributable_counties add = 1 } } }
            if = { limit = { ddm_title_is_protected_core_trigger = yes } scope:ddm_actor = { change_variable = { name = ddm_dash_soft_core_counties add = 1 } } }
            if = { limit = { title_province = { has_stationed_regiment = yes } } scope:ddm_actor = { change_variable = { name = ddm_dash_stationed_counties add = 1 } } }
        }
        if = {
            limit = { ddm_barony_can_be_distributed_trigger = yes }
            scope:ddm_actor = { change_variable = { name = ddm_dash_distributable_baronies add = 1 } }
        }
    }

    dynasty = { save_scope_as = ddm_dash_dynasty }
    if = {
        limit = { highest_held_title_tier = tier_hegemony scope:ddm_dash_dynasty = { has_variable = ddm_managed_empire_total } }
        set_variable = { name = ddm_dash_managed_top_rank value = scope:ddm_dash_dynasty.var:ddm_managed_empire_total }
    }
    else_if = {
        limit = { highest_held_title_tier = tier_empire scope:ddm_dash_dynasty = { has_variable = ddm_managed_kingdom_total } }
        set_variable = { name = ddm_dash_managed_top_rank value = scope:ddm_dash_dynasty.var:ddm_managed_kingdom_total }
    }
    else_if = {
        limit = { highest_held_title_tier = tier_kingdom scope:ddm_dash_dynasty = { has_variable = ddm_managed_duchy_total } }
        set_variable = { name = ddm_dash_managed_top_rank value = scope:ddm_dash_dynasty.var:ddm_managed_duchy_total }
    }
    if = {
        limit = { var:ddm_dash_managed_top_rank > 0 }
        set_variable = { name = ddm_dash_top_rank_target value = var:ddm_dash_managed_top_rank }
        change_variable = { name = ddm_dash_top_rank_target multiply = 0.4 }
    }
    clear_saved_scope = ddm_dash_dynasty
}

ddm_alliance_policy_allows_recipient_effect = {
    # Run from actor with scope:ddm_recipient saved. Sets ddm_alliance_allowed when policy permits.
    remove_variable = ddm_alliance_allowed
    if = {
        limit = {
            exists = scope:ddm_recipient
            scope:ddm_recipient = { is_alive = yes is_landed = yes this != scope:ddm_actor }
            var:ddm_alliance_policy > 0
        }
        if = {
            limit = { var:ddm_alliance_policy = 1 }
            set_variable = { name = ddm_alliance_allowed value = 1 }
        }
        else_if = {
            limit = {
                var:ddm_alliance_policy = 2
                scope:ddm_recipient = { exists = liege liege = scope:ddm_actor }
            }
            set_variable = { name = ddm_alliance_allowed value = 1 }
        }
        else_if = {
            limit = {
                var:ddm_alliance_policy = 3
                scope:ddm_recipient = { highest_held_title_tier >= tier_duchy }
            }
            set_variable = { name = ddm_alliance_allowed value = 1 }
        }
    }
}

ddm_make_dynastic_alliance_effect = {
    ddm_alliance_policy_allows_recipient_effect = yes
    if = {
        limit = {
            has_variable = ddm_alliance_allowed
            scope:ddm_recipient = { exists = dynasty dynasty = scope:ddm_actor.dynasty }
            NOT = { is_allied_to = scope:ddm_recipient }
        }
        set_variable = { name = ddm_alliance_refresh_pending value = 1 }
    }
    remove_variable = ddm_alliance_allowed
    if = { limit = { has_variable = ddm_alliance_refresh_pending } ddm_schedule_post_settlement_alliance_event_effect = yes }
}

ddm_schedule_post_settlement_alliance_event_effect = {
    if = {
        limit = {
            has_variable = ddm_alliance_refresh_pending
            NOT = { has_variable = ddm_alliance_event_scheduled }
        }
        set_variable = { name = ddm_alliance_event_scheduled value = 1 }
        if = {
            limit = { NOT = { has_variable = ddm_ui_processing_settlement } }
            trigger_event = { id = ddm_manager.0110 days = 1 }
        }
    }
}

ddm_refresh_dynastic_alliances_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    remove_variable = ddm_alliance_refresh_pending
    remove_variable = ddm_alliance_event_scheduled
    set_variable = { name = ddm_last_alliances_created value = 0 }
    every_vassal_or_below = {
        limit = {
            is_landed = yes
            exists = dynasty
            dynasty = scope:ddm_actor.dynasty
            NOT = { is_allied_to = scope:ddm_actor }
        }
        save_scope_as = ddm_recipient
        scope:ddm_actor = {
            ddm_alliance_policy_allows_recipient_effect = yes
            if = {
                limit = { has_variable = ddm_alliance_allowed }
                hidden_effect = {
                    allow_alliance = scope:ddm_recipient
                    create_alliance = scope:ddm_recipient
                }
                change_variable = { name = ddm_last_alliances_created add = 1 }
            }
            remove_variable = ddm_alliance_allowed
        }
    }
}

ddm_grant_barony_to_best_recipient_effect = {
    # Run from actor. scope:ddm_title must be a non-county-capital barony held by actor.
    save_scope_as = ddm_actor
    remove_variable = ddm_found_recipient
    remove_variable = ddm_grant_success

    dynasty = {
        ordered_dynasty_member = {
            limit = {
                ddm_is_eligible_land_recipient_trigger = yes
                is_landed = no
            }
            order_by = ddm_land_recipient_score
            position = 0
            check_range_bounds = no
            save_scope_as = ddm_recipient
            scope:ddm_actor = { set_variable = { name = ddm_found_recipient value = 1 } }
        }
    }
    # Conservative score fallback for landless barony recipients.
    if = {
        limit = { NOT = { has_variable = ddm_found_recipient } }
        dynasty = {
            ordered_dynasty_member = {
                limit = {
                    ddm_is_eligible_land_recipient_trigger = yes
                    is_landed = no
                }
                order_by = ddm_land_recipient_failsafe_score
                position = 0
                check_range_bounds = no
                save_scope_as = ddm_recipient
                scope:ddm_actor = { set_variable = { name = ddm_found_recipient value = 1 } }
            }
        }
    }

    if = {
        limit = { has_variable = ddm_found_recipient exists = scope:ddm_recipient }
        create_title_and_vassal_change = { type = granted save_scope_as = ddm_title_change add_claim_on_loss = yes }
        scope:ddm_title = {
            change_title_holder = { holder = scope:ddm_recipient change = scope:ddm_title_change government_base = scope:ddm_actor }
        }
        resolve_title_and_vassal_change = scope:ddm_title_change
        scope:ddm_title = {
            remove_variable = ddm_manual_shed
            remove_variable = ddm_manual_neutral
            remove_variable = ddm_auto_core
        }
        change_variable = { name = ddm_last_baronies_granted add = 1 }
        set_variable = { name = ddm_grant_success value = 1 }
        ddm_apply_grant_social_effect = yes
        ddm_make_dynastic_alliance_effect = yes
    }
    remove_variable = ddm_found_recipient
}

ddm_grant_county_to_best_recipient_effect = {
    # Run from actor. scope:ddm_title must be a county held by actor.
    save_scope_as = ddm_actor
    remove_variable = ddm_found_recipient
    remove_variable = ddm_grant_success
    set_variable = { name = ddm_last_recipient_search_stage value = 0 }

    if = {
        limit = {
            ddm_actor_uses_partition_trigger = yes
            var:ddm_succession_policy >= 1
            var:ddm_last_partition_heirs_available > 0
        }
        dynasty = {
            ordered_dynasty_member = {
                limit = {
                    has_character_flag = ddm_partition_settlement_pool
                    ddm_is_eligible_partition_recipient_trigger = yes
                }
                order_by = ddm_land_recipient_score
                position = 0
                check_range_bounds = no
                save_scope_as = ddm_recipient
                scope:ddm_actor = {
                    set_variable = { name = ddm_found_recipient value = 1 }
                    set_variable = { name = ddm_last_recipient_search_stage value = 1 }
                }
            }
        }
    }

    # Stage 2: if succession planning is off or no legal heir is usable, fall back to the configured
    # dynasty-wide pool under ordinary power-safety caps.
    if = {
        limit = { NOT = { has_variable = ddm_found_recipient } }
        dynasty = {
            ordered_dynasty_member = {
                limit = { ddm_safe_for_additional_county_trigger = yes }
                order_by = ddm_land_recipient_score
                position = 0
                check_range_bounds = no
                save_scope_as = ddm_recipient
                scope:ddm_actor = {
                    set_variable = { name = ddm_found_recipient value = 1 }
                    set_variable = { name = ddm_last_recipient_search_stage value = 2 }
                }
            }
        }
    }

    if = {
        limit = {
            NOT = { has_variable = ddm_found_recipient }
            var:ddm_last_partition_heirs_available > 0
        }
        dynasty = {
            ordered_dynasty_member = {
                limit = {
                    has_character_flag = ddm_partition_settlement_pool
                    ddm_is_eligible_partition_recipient_trigger = yes
                }
                order_by = ddm_land_recipient_failsafe_score
                position = 0
                check_range_bounds = no
                save_scope_as = ddm_recipient
                scope:ddm_actor = {
                    set_variable = { name = ddm_found_recipient value = 1 }
                    set_variable = { name = ddm_last_recipient_search_stage value = 3 }
                }
            }
        }
    }

    if = {
        limit = { NOT = { has_variable = ddm_found_recipient } }
        dynasty = {
            ordered_dynasty_member = {
                limit = { ddm_safe_for_additional_county_trigger = yes }
                order_by = ddm_land_recipient_failsafe_score
                position = 0
                check_range_bounds = no
                save_scope_as = ddm_recipient
                scope:ddm_actor = {
                    set_variable = { name = ddm_found_recipient value = 1 }
                    set_variable = { name = ddm_last_recipient_search_stage value = 4 }
                }
            }
        }
    }

    if = {
        limit = { has_variable = ddm_found_recipient exists = scope:ddm_recipient }
        create_title_and_vassal_change = { type = granted save_scope_as = ddm_title_change add_claim_on_loss = yes }
        scope:ddm_title = {
            change_title_holder = { holder = scope:ddm_recipient change = scope:ddm_title_change government_base = scope:ddm_actor }
        }
        resolve_title_and_vassal_change = scope:ddm_title_change
        scope:ddm_title = {
            remove_variable = ddm_manual_shed
            remove_variable = ddm_manual_neutral
            remove_variable = ddm_auto_core
        }
        change_variable = { name = ddm_last_counties_granted add = 1 }
        set_variable = { name = ddm_grant_success value = 1 }
        ddm_apply_grant_social_effect = yes
        ddm_make_dynastic_alliance_effect = yes

        # A new count goes under the existing de jure dynasty duke when possible.
        if = {
            limit = {
                scope:ddm_recipient = { highest_held_title_tier = tier_county }
                exists = scope:ddm_title.de_jure_liege.holder
                scope:ddm_title.de_jure_liege.holder = {
                    this != scope:ddm_actor
                    exists = dynasty
                    dynasty = scope:ddm_actor.dynasty
                    highest_held_title_tier >= tier_duchy
                    is_vassal_or_below_of = scope:ddm_actor
                }
            }
            create_title_and_vassal_change = { type = granted save_scope_as = ddm_vassal_change add_claim_on_loss = yes }
            scope:ddm_recipient = { change_liege = { liege = scope:ddm_title.de_jure_liege.holder change = scope:ddm_vassal_change } }
            resolve_title_and_vassal_change = scope:ddm_vassal_change
        }
    }
    remove_variable = ddm_found_recipient
}


ddm_v18_build_recipient_lists_effect = {
    save_scope_as = ddm_actor
    set_variable = { name = ddm_last_partition_heirs_available value = 0 }
    set_variable = { name = ddm_last_general_recipients_available value = 0 }

    # Ordinary dynasty pool. This retains vanilla's broad Grant Titles gate. Succession does not replace
    # this pool; separately tracked heirs exist only for score modifiers and the narrow vanilla
    # grant-gate bypass.
    dynasty = {
        every_dynasty_member = {
            limit = { ddm_is_eligible_land_recipient_trigger = yes }
            add_to_temporary_list = ddm_v18_recipient_pool
            scope:ddm_actor = { change_variable = { name = ddm_last_general_recipients_available add = 1 } }
        }
    }

    # Optional non-dynastic pool. Courtiers and existing vassals are merged into one concrete list. The
    # transient marker prevents a landed courtier/vassal from being inserted twice by overlapping
    # iterators.
    every_courtier = { remove_character_flag = ddm_recipient_listed_this_pass }
    every_vassal_or_below = { remove_character_flag = ddm_recipient_listed_this_pass }

    if = {
        limit = { var:ddm_outsider_recipient_mode = 1 }
        every_courtier = {
            limit = {
                ddm_is_eligible_outsider_recipient_trigger = yes
                has_variable = ddm_outsider_favored_for_land
                NOT = { has_character_flag = ddm_recipient_listed_this_pass }
            }
            add_character_flag = ddm_recipient_listed_this_pass
            add_to_temporary_list = ddm_v18_recipient_pool
            scope:ddm_actor = { change_variable = { name = ddm_last_general_recipients_available add = 1 } }
        }
        every_vassal_or_below = {
            limit = {
                ddm_is_eligible_outsider_recipient_trigger = yes
                has_variable = ddm_outsider_favored_for_land
                NOT = { has_character_flag = ddm_recipient_listed_this_pass }
            }
            add_character_flag = ddm_recipient_listed_this_pass
            add_to_temporary_list = ddm_v18_recipient_pool
            scope:ddm_actor = { change_variable = { name = ddm_last_general_recipients_available add = 1 } }
        }
    }
    else_if = {
        limit = { var:ddm_outsider_recipient_mode = 2 }
        every_courtier = {
            limit = { ddm_is_eligible_outsider_recipient_trigger = yes NOT = { has_character_flag = ddm_recipient_listed_this_pass } }
            add_character_flag = ddm_recipient_listed_this_pass
            add_to_temporary_list = ddm_v18_recipient_pool
            scope:ddm_actor = { change_variable = { name = ddm_last_general_recipients_available add = 1 } }
        }
        every_vassal_or_below = {
            limit = { ddm_is_eligible_outsider_recipient_trigger = yes NOT = { has_character_flag = ddm_recipient_listed_this_pass } }
            add_character_flag = ddm_recipient_listed_this_pass
            add_to_temporary_list = ddm_v18_recipient_pool
            scope:ddm_actor = { change_variable = { name = ddm_last_general_recipients_available add = 1 } }
        }
    }

    if = {
        limit = { ddm_actor_uses_partition_trigger = yes }

        # Track direct legal children for inheritance context and the narrow vanilla grant-gate bypass.
        # This is never the main allocation universe.
        if = {
            limit = { OR = { var:ddm_succession_policy = 1 var:ddm_succession_policy = 3 } }
            every_child = {
                limit = {
                    ddm_is_eligible_partition_recipient_trigger = yes

                    # Under preference laws, the non-preferred sex enters only if no otherwise-eligible
                    # child of the preferred sex exists.
                    trigger_if = {
                        limit = {
                            NOR = {
                                scope:ddm_actor = { has_realm_law = male_only_law }
                                scope:ddm_actor.primary_title = { has_title_law = male_only_law }
                                scope:ddm_actor = { has_realm_law = female_only_law }
                                scope:ddm_actor.primary_title = { has_title_law = female_only_law }
                            }
                            OR = {
                                scope:ddm_actor = { has_realm_law = male_preference_law }
                                scope:ddm_actor.primary_title = { has_title_law = male_preference_law }
                            }
                            is_female = yes
                        }
                        scope:ddm_actor = {
                            NOT = { any_child = { is_male = yes ddm_is_eligible_partition_recipient_trigger = yes } }
                        }
                    }
                    trigger_if = {
                        limit = {
                            NOR = {
                                scope:ddm_actor = { has_realm_law = male_only_law }
                                scope:ddm_actor.primary_title = { has_title_law = male_only_law }
                                scope:ddm_actor = { has_realm_law = female_only_law }
                                scope:ddm_actor.primary_title = { has_title_law = female_only_law }
                            }
                            OR = {
                                scope:ddm_actor = { has_realm_law = female_preference_law }
                                scope:ddm_actor.primary_title = { has_title_law = female_preference_law }
                            }
                            is_male = yes
                        }
                        scope:ddm_actor = {
                            NOT = { any_child = { is_female = yes ddm_is_eligible_partition_recipient_trigger = yes } }
                        }
                    }
                }
                add_character_flag = ddm_partition_settlement_pool
                add_to_temporary_list = ddm_v18_partition_pool
                scope:ddm_actor = { change_variable = { name = ddm_last_partition_heirs_available add = 1 } }
            }
        }

        # Policy 2: Respect Current Heir. Track each held title's current_heir so that character can
        # receive the modest title-specific legitimacy bonus.
        else_if = {
            limit = { var:ddm_succession_policy = 2 }
            every_held_title = {
                limit = { tier >= tier_county exists = current_heir }
                current_heir = {
                    if = {
                        limit = {
                            ddm_is_eligible_partition_recipient_trigger = yes
                            NOT = { has_character_flag = ddm_partition_settlement_pool }
                        }
                        add_character_flag = ddm_partition_settlement_pool
                        add_to_temporary_list = ddm_v18_partition_pool
                        scope:ddm_actor = { change_variable = { name = ddm_last_partition_heirs_available add = 1 } }
                    }
                }
            }
        }

        # Representation/unusual succession fallback.
        if = {
            limit = { var:ddm_last_partition_heirs_available = 0 }
            every_heir = {
                limit = { ddm_is_eligible_partition_recipient_trigger = yes }
                add_character_flag = ddm_partition_settlement_pool
                add_to_temporary_list = ddm_v18_partition_pool
                scope:ddm_actor = { change_variable = { name = ddm_last_partition_heirs_available add = 1 } }
            }
        }
    }

    # Family regard is refreshed for both pools because a legal partition child may intentionally bypass
    # the ordinary vanilla-recipient gate.
    every_in_list = { list = ddm_v18_recipient_pool ddm_refresh_one_subject_regard_effect = yes }
    every_in_list = { list = ddm_v18_partition_pool ddm_refresh_one_subject_regard_effect = yes }
    every_courtier = { remove_character_flag = ddm_recipient_listed_this_pass }
    every_vassal_or_below = { remove_character_flag = ddm_recipient_listed_this_pass }
}

ddm_v18_build_surplus_title_list_effect = {
    save_scope_as = ddm_actor
    set_variable = { name = ddm_last_titles_queued value = 0 }

    every_held_title = {
        limit = {
            tier <= tier_empire
            ddm_title_not_faith_protected_trigger = yes
            OR = {
                AND = {
                    tier = tier_barony
                    is_capital_barony = no
                    ddm_barony_can_be_distributed_trigger = yes
                }
                AND = {
                    tier = tier_county
                    is_titular = no
                    ddm_county_can_be_distributed_trigger = yes
                }
            }
        }
        save_scope_as = ddm_v18_pool_title
        add_to_temporary_list = ddm_v18_surplus_titles
        scope:ddm_actor = {
            change_variable = { name = ddm_last_titles_queued add = 1 }
        }
    }
}

ddm_rank_dynasty_effect = {
    save_scope_as = ddm_actor
    ddm_refresh_all_dynasty_regard_effect = yes

    dynasty = {
        every_dynasty_member = {
            limit = { is_alive = yes }
            remove_variable = ddm_rank
            remove_variable = ddm_rank_quota
            remove_character_flag = ddm_rightful_pool
        }
    }
    every_courtier = { remove_character_flag = ddm_rightful_pool }
    every_vassal_or_below = { remove_character_flag = ddm_rightful_pool }

    # every eligible dynast is ranked. No bottom-quarter purge.
    set_variable = { name = ddm_ranked_total value = 0 }
    dynasty = {
        every_dynasty_member = {
            limit = {
                is_alive = yes
                this != scope:ddm_actor
                ddm_is_rankable_dynast_trigger = yes
            }
            scope:ddm_actor = { change_variable = { name = ddm_ranked_total add = 1 } }
        }
    }
    set_variable = { name = ddm_ranked_kept value = var:ddm_ranked_total }

    set_variable = { name = ddm_rank_cursor value = 0 }
    while = {
        limit = { var:ddm_rank_cursor < var:ddm_ranked_total }
        change_variable = { name = ddm_rank_cursor add = 1 }
        remove_variable = ddm_rank_assigned
        dynasty = {
            ordered_dynasty_member = {
                limit = {
                    is_alive = yes
                    this != scope:ddm_actor
                    ddm_is_rankable_dynast_trigger = yes
                    NOT = { has_variable = ddm_rank }
                }
                order_by = ddm_rightful_ruler_value
                position = 0
                check_range_bounds = no
                set_variable = { name = ddm_rank value = scope:ddm_actor.var:ddm_rank_cursor }
                add_character_flag = ddm_rightful_pool
                scope:ddm_actor = { set_variable = { name = ddm_rank_assigned value = 1 } }
            }
        }
    }

    set_variable = { name = ddm_ranked_kept value = var:ddm_rank_cursor }

    # Non-dynasty candidates do not receive a dynastic rank number, but they do enter the same rightful
    # pool so title-specific scoring and hierarchy can compare them directly with dynasts.
    every_in_list = {
        list = ddm_v18_recipient_pool
        limit = { OR = { NOT = { exists = dynasty } dynasty != scope:ddm_actor.dynasty } }
        add_character_flag = ddm_rightful_pool
    }

    remove_variable = ddm_rank_cursor
    remove_variable = ddm_rank_assigned
}

ddm_clear_dynasty_ranking_effect = {
    dynasty = {
        every_dynasty_member = {
            limit = { is_alive = yes }
            remove_variable = ddm_rank
            remove_variable = ddm_rank_quota
            remove_character_flag = ddm_rightful_pool
        }
    }
    every_courtier = {
        remove_variable = ddm_rank
        remove_variable = ddm_rank_quota
        remove_character_flag = ddm_rightful_pool
    }
    every_vassal_or_below = {
        remove_variable = ddm_rank
        remove_variable = ddm_rank_quota
        remove_character_flag = ddm_rightful_pool
    }
    remove_variable = ddm_ranked_total
    remove_variable = ddm_ranked_kept
    remove_variable = ddm_rank_weight_total
    remove_variable = ddm_rank_fair_cap
}

ddm_v18_choose_recipient_effect = {
    remove_variable = ddm_found_recipient
    set_variable = { name = ddm_last_recipient_search_stage value = 0 }

    # A direct title reservation is processed before every scored path. It is an explicit one-title
    # instruction, so it may name a legal dynast, courtier or existing vassal even when the broad
    # recipient policy is Dynasty Only.
    if = {
        limit = {
            exists = scope:ddm_title
            scope:ddm_title = {
                exists = var:ddm_reserved_recipient
                var:ddm_reserved_recipient = { ddm_is_eligible_manual_reservation_recipient_trigger = yes }
            }
        }
        scope:ddm_title = { var:ddm_reserved_recipient = { save_scope_as = ddm_recipient } }
        set_variable = { name = ddm_found_recipient value = 1 }
        set_variable = { name = ddm_last_recipient_search_stage value = 1 }
    }
    else_if = {
        limit = { exists = scope:ddm_title scope:ddm_title = { exists = var:ddm_reserved_recipient } }
        # Stale reservations should never strand settlement. If the named person is dead, has left
        # court/realm, or is no longer a legal grantee, clear the stale instruction and continue through
        # ordinary scoring.
        scope:ddm_title = { remove_variable = ddm_reserved_recipient }
    }

    # Primary path: rank the complete active recipient pool for THIS title. The score is recalculated
    # after every grant, so territorial state and the player's selected-outsider first-pass priorities
    # update immediately.
    if = {
        limit = { NOT = { has_variable = ddm_found_recipient } any_in_list = { list = ddm_v18_recipient_pool count >= 1 } }
        ordered_in_list = {
            list = ddm_v18_recipient_pool
            limit = { ddm_rank_quota_remaining_trigger = yes }
            order_by = ddm_rightful_title_recipient_value
            position = 0
            check_range_bounds = no
            save_scope_as = ddm_recipient
            scope:ddm_actor = {
                set_variable = { name = ddm_found_recipient value = 1 }
                set_variable = { name = ddm_last_recipient_search_stage value = 5 }
            }
        }
    }

    # Conservative whole-dynasty legal fallback.
    if = {
        limit = { NOT = { has_variable = ddm_found_recipient } }
        ordered_in_list = {
            list = ddm_v18_recipient_pool
            limit = {
                trigger_if = {
                    limit = { scope:ddm_title = { tier = tier_county } }
                    ddm_safe_for_additional_county_trigger = yes
                }
                trigger_if = {
                    limit = { scope:ddm_title = { tier = tier_barony } }
                    ddm_is_eligible_active_recipient_trigger = yes
                }
            }
            order_by = ddm_rightful_title_recipient_value
            position = 0
            check_range_bounds = no
            save_scope_as = ddm_recipient
            scope:ddm_actor = {
                set_variable = { name = ddm_found_recipient value = 1 }
                set_variable = { name = ddm_last_recipient_search_stage value = 2 }
            }
        }
    }

    # Partition bypass comes LAST. It exists only for heirs hidden by vanilla's grant-interaction
    # restriction; it never turns succession into the pool.
    if = {
        limit = {
            NOT = { has_variable = ddm_found_recipient }
            any_in_list = { list = ddm_v18_partition_pool count >= 1 }
        }
        ordered_in_list = {
            list = ddm_v18_partition_pool
            limit = { ddm_safe_partition_candidate_trigger = yes }
            order_by = ddm_rightful_title_recipient_value
            position = 0
            check_range_bounds = no
            save_scope_as = ddm_recipient
            scope:ddm_actor = {
                set_variable = { name = ddm_found_recipient value = 1 }
                set_variable = { name = ddm_last_recipient_search_stage value = 3 }
            }
        }
    }

    # Mechanical last resort from the already validated dynasty pool.
    if = {
        limit = { NOT = { has_variable = ddm_found_recipient } }
        random_in_list = {
            list = ddm_v18_recipient_pool
            limit = {
                trigger_if = {
                    limit = { scope:ddm_title = { tier = tier_county } }
                    ddm_safe_for_additional_county_trigger = yes
                }
                trigger_if = {
                    limit = { scope:ddm_title = { tier = tier_barony } }
                    ddm_is_eligible_active_recipient_trigger = yes
                }
            }
            save_scope_as = ddm_recipient
            scope:ddm_actor = {
                set_variable = { name = ddm_found_recipient value = 1 }
                set_variable = { name = ddm_last_recipient_search_stage value = 4 }
            }
        }
    }
}

ddm_v18_transfer_selected_title_effect = {
    # Run from actor with scope:ddm_title and scope:ddm_recipient saved.
    remove_variable = ddm_grant_success

    if = {
        limit = {
            exists = scope:ddm_title
            exists = scope:ddm_recipient
            scope:ddm_title = { holder = scope:ddm_actor }
        }

        clear_saved_scope = ddm_v18_title_change
        create_title_and_vassal_change = {
            type = granted
            save_scope_as = ddm_v18_title_change
            add_claim_on_loss = yes
        }
        scope:ddm_title = {
            change_title_holder = {
                holder = scope:ddm_recipient
                change = scope:ddm_v18_title_change
                government_base = scope:ddm_actor
            }
        }
        resolve_title_and_vassal_change = scope:ddm_v18_title_change

        if = {
            limit = {
                scope:ddm_title = { holder = scope:ddm_recipient }
            }

            # If the new holder did not automatically become a vassal below the actor, perform a separate
            # liege-change transaction.
            if = {
                limit = {
                    scope:ddm_recipient = {
                        is_landed = yes
                        NOT = { is_vassal_or_below_of = scope:ddm_actor }
                        highest_held_title_tier < scope:ddm_actor.highest_held_title_tier
                    }
                }
                clear_saved_scope = ddm_v18_liege_change
                create_title_and_vassal_change = {
                    type = granted
                    save_scope_as = ddm_v18_liege_change
                    add_claim_on_loss = yes
                }
                scope:ddm_recipient = {
                    change_liege = {
                        liege = scope:ddm_actor
                        change = scope:ddm_v18_liege_change
                    }
                }
                resolve_title_and_vassal_change = scope:ddm_v18_liege_change
            }

            scope:ddm_title = {
                remove_variable = ddm_manual_shed
                remove_variable = ddm_manual_neutral
                remove_variable = ddm_auto_core
                remove_variable = ddm_reserved_recipient
            }

            if = {
                limit = { scope:ddm_title = { tier = tier_barony } }
                change_variable = { name = ddm_last_baronies_granted add = 1 }
            }
            else_if = {
                limit = { scope:ddm_title = { tier = tier_county } }
                change_variable = { name = ddm_last_counties_granted add = 1 }
            }

            set_variable = { name = ddm_grant_success value = 1 }
            ddm_apply_grant_social_effect = yes
            ddm_make_dynastic_alliance_effect = yes
        }
    }
}

ddm_distribute_surplus_counties_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    clear_saved_scope = ddm_title
    clear_saved_scope = ddm_recipient

    ddm_refresh_adaptive_domain_core_effect = yes

    dynasty = {
        every_dynasty_member = {
            limit = { is_alive = yes }
            remove_variable = ddm_batch_land_grants
            remove_character_flag = ddm_partition_settlement_pool
        }
    }
    every_courtier = { remove_variable = ddm_batch_land_grants }
    every_vassal_or_below = { remove_variable = ddm_batch_land_grants }

    set_variable = { name = ddm_last_baronies_granted value = 0 }
    set_variable = { name = ddm_last_counties_granted value = 0 }
    set_variable = { name = ddm_last_titles_left value = 0 }
    set_variable = { name = ddm_last_baronies_left value = 0 }
    set_variable = { name = ddm_last_distribution_stalled value = 0 }
    set_variable = { name = ddm_last_recipient_search_stage value = 0 }
    set_variable = { name = ddm_last_distribution_start_surplus value = domain_size }
    change_variable = { name = ddm_last_distribution_start_surplus subtract = var:ddm_protected_domain_target }
    if = {
        limit = { var:ddm_last_distribution_start_surplus < 0 }
        set_variable = { name = ddm_last_distribution_start_surplus value = 0 }
    }

    # These effects populate temporary lists in the SAME unbroken effect chain.
    ddm_v18_build_recipient_lists_effect = yes
    ddm_v18_build_surplus_title_list_effect = yes

    # Rank the entire eligible dynasty before any title moves. the current model has no artificial 15%
    # cap or equal-share quota; concentration is controlled by live domain/power state and title-specific
    # rightfulness.
    ddm_rank_dynasty_effect = yes

    remove_variable = ddm_v18_loop_exhausted

    while = {
        limit = {
            ddm_above_protected_domain_target_trigger = yes
            any_in_list = {
                list = ddm_v18_surplus_titles
                count >= 1
            }
        }

        remove_variable = ddm_grant_success
        remove_variable = ddm_found_title
        remove_variable = ddm_found_recipient
        clear_saved_scope = ddm_title
        clear_saved_scope = ddm_recipient

        # Prefer the player's explicit GIVE AWAY orders, then secondary baronies, then the least valuable
        # delegated county.
        ordered_in_list = {
            list = ddm_v18_surplus_titles
            limit = {
                holder = scope:ddm_actor
                OR = {
                    AND = {
                        tier = tier_barony
                        is_capital_barony = no
                        ddm_barony_can_be_distributed_trigger = yes
                    }
                    AND = {
                        tier = tier_county
                        is_titular = no
                        ddm_county_can_be_distributed_trigger = yes
                    }
                }
            }
            order_by = ddm_v18_title_shed_priority
            position = 0
            check_range_bounds = no
            save_scope_as = ddm_title
            scope:ddm_actor = { set_variable = { name = ddm_found_title value = 1 } }
        }

        # Mechanical fallback: if weighted ordering returns nothing, take a literal member of the already
        # validated list.
        if = {
            limit = { NOT = { has_variable = ddm_found_title } }
            random_in_list = {
                list = ddm_v18_surplus_titles
                limit = {
                    holder = scope:ddm_actor
                    OR = {
                        AND = {
                            tier = tier_barony
                            is_capital_barony = no
                            ddm_barony_can_be_distributed_trigger = yes
                        }
                        AND = {
                            tier = tier_county
                            is_titular = no
                            ddm_county_can_be_distributed_trigger = yes
                        }
                    }
                }
                save_scope_as = ddm_title
                scope:ddm_actor = { set_variable = { name = ddm_found_title value = 1 } }
            }
        }

        if = {
            limit = {
                has_variable = ddm_found_title
                exists = scope:ddm_title
            }
            ddm_v18_choose_recipient_effect = yes
        }

        if = {
            limit = {
                has_variable = ddm_found_recipient
                exists = scope:ddm_recipient
                exists = scope:ddm_title
            }
            ddm_v18_transfer_selected_title_effect = yes
        }

        if = {
            limit = { has_variable = ddm_grant_success }
            # remove_from_list removes CURRENT scope, so deliberately switch back to the exact title that
            # was just transferred.
            scope:ddm_title = {
                remove_from_list = ddm_v18_surplus_titles
            }
        }
        else = {
            set_variable = { name = ddm_last_distribution_stalled value = 1 }
            # A title that could not be placed this iteration is retired from the queue so the run
            # continues with the next title instead of aborting the whole distribution.
            if = {
                limit = {
                    has_variable = ddm_found_title
                    exists = scope:ddm_title
                }
                scope:ddm_title = {
                    remove_from_list = ddm_v18_surplus_titles
                }
            }
        }

        if = {
            limit = { NOT = { has_variable = ddm_found_title } }
            set_variable = { name = ddm_v18_loop_exhausted value = 1 }
        }

    }

    # A transient rejected title is not a stalled settlement if the player still reached the chosen
    # protected-domain target through other grants.
    if = { limit = { NOT = { ddm_above_protected_domain_target_trigger = yes } } set_variable = { name = ddm_last_distribution_stalled value = 0 } }

    if = {
        limit = { ddm_above_protected_domain_target_trigger = yes }
        every_in_list = {
            list = ddm_v18_surplus_titles
            limit = { holder = scope:ddm_actor }
            if = {
                limit = { tier = tier_barony }
                scope:ddm_actor = { change_variable = { name = ddm_last_baronies_left add = 1 } }
            }
            else_if = {
                limit = { tier = tier_county }
                scope:ddm_actor = { change_variable = { name = ddm_last_titles_left add = 1 } }
            }
        }
    }

    dynasty = {
        every_dynasty_member = {
            remove_character_flag = ddm_partition_settlement_pool
            remove_variable = ddm_batch_land_grants
        }
    }
    every_vassal_or_below = { remove_variable = ddm_batch_land_grants }

    remove_variable = ddm_grant_success
    remove_variable = ddm_found_title
    remove_variable = ddm_found_recipient
    remove_variable = ddm_v18_loop_exhausted
    remove_variable = ddm_batch_grant_cap
    ddm_clear_dynasty_ranking_effect = yes

    # "Distribute" is a complete settlement command, not county-only. Once the personal domain reaches
    # its selected target, place duchies and kingdoms into the dynastic hierarchy and then queue one
    # alliance event.
    ddm_organize_dynastic_hierarchy_effect = yes
    ddm_schedule_post_settlement_alliance_event_effect = yes

    clear_saved_scope = ddm_title
    clear_saved_scope = ddm_recipient
    clear_saved_scope = ddm_v18_title_change
    clear_saved_scope = ddm_v18_liege_change
}


ddm_transfer_one_direct_vassal_to_proper_liege_effect = {
    save_scope_as = ddm_transfer_vassal
    clear_saved_scope = ddm_proper_liege
    clear_saved_scope = ddm_proper_liege_candidate
    clear_saved_scope = ddm_dejure_level_1
    clear_saved_scope = ddm_dejure_level_2
    clear_saved_scope = ddm_dejure_level_3
    scope:ddm_actor = { remove_variable = ddm_proper_liege_resolved }

    # De-jure level 1 (county -> duchy, duchy -> kingdom, kingdom -> empire).
    if = {
        limit = { primary_title = { exists = de_jure_liege } }
        primary_title.de_jure_liege = { save_scope_as = ddm_dejure_level_1 }
        if = {
            limit = { scope:ddm_dejure_level_1 = { exists = holder holder = scope:ddm_actor } }
            scope:ddm_actor = { set_variable = { name = ddm_proper_liege_resolved value = 1 } }
        }
        else_if = {
            limit = { scope:ddm_dejure_level_1 = { exists = holder } }
            scope:ddm_dejure_level_1.holder = { save_scope_as = ddm_proper_liege_candidate }
            if = {
                limit = { scope:ddm_proper_liege_candidate = { ddm_is_valid_proper_liege_target_trigger = yes } }
                scope:ddm_proper_liege_candidate = { save_scope_as = ddm_proper_liege }
                scope:ddm_actor = { set_variable = { name = ddm_proper_liege_resolved value = 1 } }
            }
            clear_saved_scope = ddm_proper_liege_candidate
        }
    }

    # De-jure level 2. Only search higher when the nearer held title did not already establish the proper
    # reporting line.
    if = {
        limit = {
            scope:ddm_actor = { NOT = { has_variable = ddm_proper_liege_resolved } }
            exists = scope:ddm_dejure_level_1
            scope:ddm_dejure_level_1 = { exists = de_jure_liege }
        }
        scope:ddm_dejure_level_1.de_jure_liege = { save_scope_as = ddm_dejure_level_2 }
        if = {
            limit = { scope:ddm_dejure_level_2 = { exists = holder holder = scope:ddm_actor } }
            scope:ddm_actor = { set_variable = { name = ddm_proper_liege_resolved value = 1 } }
        }
        else_if = {
            limit = { scope:ddm_dejure_level_2 = { exists = holder } }
            scope:ddm_dejure_level_2.holder = { save_scope_as = ddm_proper_liege_candidate }
            if = {
                limit = { scope:ddm_proper_liege_candidate = { ddm_is_valid_proper_liege_target_trigger = yes } }
                scope:ddm_proper_liege_candidate = { save_scope_as = ddm_proper_liege }
                scope:ddm_actor = { set_variable = { name = ddm_proper_liege_resolved value = 1 } }
            }
            clear_saved_scope = ddm_proper_liege_candidate
        }
    }

    # De-jure level 3 (the farthest possible step for a county).
    if = {
        limit = {
            scope:ddm_actor = { NOT = { has_variable = ddm_proper_liege_resolved } }
            exists = scope:ddm_dejure_level_2
            scope:ddm_dejure_level_2 = { exists = de_jure_liege }
        }
        scope:ddm_dejure_level_2.de_jure_liege = { save_scope_as = ddm_dejure_level_3 }
        if = {
            limit = { scope:ddm_dejure_level_3 = { exists = holder holder = scope:ddm_actor } }
            scope:ddm_actor = { set_variable = { name = ddm_proper_liege_resolved value = 1 } }
        }
        else_if = {
            limit = { scope:ddm_dejure_level_3 = { exists = holder } }
            scope:ddm_dejure_level_3.holder = { save_scope_as = ddm_proper_liege_candidate }
            if = {
                limit = { scope:ddm_proper_liege_candidate = { ddm_is_valid_proper_liege_target_trigger = yes } }
                scope:ddm_proper_liege_candidate = { save_scope_as = ddm_proper_liege }
                scope:ddm_actor = { set_variable = { name = ddm_proper_liege_resolved value = 1 } }
            }
            clear_saved_scope = ddm_proper_liege_candidate
        }
    }

    if = {
        limit = { exists = scope:ddm_proper_liege }
        create_title_and_vassal_change = {
            type = granted
            save_scope_as = ddm_proper_liege_change
            add_claim_on_loss = no
        }
        scope:ddm_transfer_vassal = {
            change_liege = {
                liege = scope:ddm_proper_liege
                change = scope:ddm_proper_liege_change
            }
        }
        resolve_title_and_vassal_change = scope:ddm_proper_liege_change
        scope:ddm_actor = { change_variable = { name = ddm_last_proper_liege_transfers add = 1 } }
        clear_saved_scope = ddm_proper_liege_change
    }

    scope:ddm_actor = { remove_variable = ddm_proper_liege_resolved }
    clear_saved_scope = ddm_proper_liege
    clear_saved_scope = ddm_proper_liege_candidate
    clear_saved_scope = ddm_dejure_level_1
    clear_saved_scope = ddm_dejure_level_2
    clear_saved_scope = ddm_dejure_level_3
    clear_saved_scope = ddm_transfer_vassal
}

# One structural pass. Uses a persistent actor-local snapshot because vassal relationships are mutated
# during the pass; the wrapper repeats this until no new move is possible.
ddm_distribute_to_proper_lieges_one_pass_effect = {
    clear_variable_list = ddm_proper_liege_transfer_pool_live
    every_vassal = {
        limit = {
            is_alive = yes
            is_landed = yes
            highest_held_title_tier > tier_barony
            highest_held_title_tier < scope:ddm_actor.highest_held_title_tier
            NOT = { is_at_war_with = scope:ddm_actor }
            trigger_if = { limit = { exists = scope:ddm_actor.diarch } this != scope:ddm_actor.diarch }
        }
        save_temporary_scope_as = ddm_proper_liege_pool_member
        scope:ddm_actor = { add_to_variable_list = { name = ddm_proper_liege_transfer_pool_live target = scope:ddm_proper_liege_pool_member } }
    }

    every_in_list = { variable = ddm_proper_liege_transfer_pool_live limit = { highest_held_title_tier = tier_county liege = scope:ddm_actor } ddm_transfer_one_direct_vassal_to_proper_liege_effect = yes }
    every_in_list = { variable = ddm_proper_liege_transfer_pool_live limit = { highest_held_title_tier = tier_duchy liege = scope:ddm_actor } ddm_transfer_one_direct_vassal_to_proper_liege_effect = yes }
    every_in_list = { variable = ddm_proper_liege_transfer_pool_live limit = { highest_held_title_tier = tier_kingdom liege = scope:ddm_actor } ddm_transfer_one_direct_vassal_to_proper_liege_effect = yes }
    every_in_list = { variable = ddm_proper_liege_transfer_pool_live limit = { highest_held_title_tier = tier_empire liege = scope:ddm_actor } ddm_transfer_one_direct_vassal_to_proper_liege_effect = yes }
    clear_variable_list = ddm_proper_liege_transfer_pool_live
}

ddm_distribute_to_proper_lieges_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    set_variable = { name = ddm_last_proper_liege_transfers value = 0 }
    set_variable = { name = ddm_proper_liege_pass_transfers value = 1 }
    set_variable = { name = ddm_proper_liege_pass_guard value = 0 }

    # A move can expose another vassal as a now-valid de-jure subordinate. Repeat from a fresh direct-
    # vassal snapshot until the realm is stable. The safety cap prevents pathological modded hierarchies
    # from looping forever; ordinary realms converge in only a few passes.
    while = {
        limit = { var:ddm_proper_liege_pass_transfers > 0 var:ddm_proper_liege_pass_guard < 24 }
        set_variable = { name = ddm_proper_liege_before_pass value = var:ddm_last_proper_liege_transfers }
        ddm_distribute_to_proper_lieges_one_pass_effect = yes
        set_variable = { name = ddm_proper_liege_pass_transfers value = var:ddm_last_proper_liege_transfers }
        change_variable = { name = ddm_proper_liege_pass_transfers subtract = var:ddm_proper_liege_before_pass }
        change_variable = { name = ddm_proper_liege_pass_guard add = 1 }
    }

    clear_variable_list = ddm_proper_liege_transfer_pool_live
    remove_variable = ddm_proper_liege_before_pass
    remove_variable = ddm_proper_liege_pass_transfers
    remove_variable = ddm_proper_liege_pass_guard
    ddm_prepare_dashboard_effect = yes
    clear_saved_scope = ddm_actor
}

ddm_hier_reset_counts_effect = {
    every_in_list = {
        list = ddm_v18_recipient_pool
        set_variable = { name = ddm_hier_held value = 0 }
    }
    scope:ddm_actor = {
        set_variable = { name = ddm_hier_total value = 0 }
        set_variable = { name = ddm_hier_half value = 0 }
        remove_variable = ddm_hier_found
    }
}

ddm_prepare_top_rank_retention_effect = {
    save_scope_as = ddm_actor
    set_variable = { name = ddm_top_rank_total value = 0 }
    set_variable = { name = ddm_top_rank_keep_target value = 0 }
    set_variable = { name = ddm_top_rank_retained_count value = 0 }
    set_variable = { name = ddm_last_top_rank_retained value = 0 }

    every_held_title = {
        remove_variable = ddm_top_rank_retained
        remove_variable = ddm_top_rank_military_density
        remove_variable = ddm_top_rank_counties
    }

    scope:ddm_actor.dynasty = { save_scope_as = ddm_retention_dynasty }

    if = {
        limit = { highest_held_title_tier = tier_hegemony }
        scope:ddm_retention_dynasty = {
            if = { limit = { NOT = { has_variable = ddm_managed_empire_total } } set_variable = { name = ddm_managed_empire_total value = 0 } }
        }
        every_held_title = {
            limit = {
                tier = tier_empire
                ddm_title_not_faith_protected_trigger = yes
            }
            if = {
                limit = { NOT = { has_variable = ddm_top_rank_managed_title } }
                set_variable = ddm_top_rank_managed_title
                scope:ddm_retention_dynasty = { change_variable = { name = ddm_managed_empire_total add = 1 } }
            }
            save_scope_as = ddm_retention_title
            set_variable = { name = ddm_top_rank_military_density value = 0 }
            set_variable = { name = ddm_top_rank_counties value = 0 }
            every_de_jure_county = {
                if = {
                    limit = {
                        exists = holder
                        holder = { ddm_is_in_actor_realm_trigger = yes }
                    }
                    holder = {
                        save_scope_as = ddm_retention_holder
                        set_variable = { name = ddm_retention_strength_sample value = current_military_strength }
                        if = { limit = { domain_size > 0 } change_variable = { name = ddm_retention_strength_sample divide = domain_size } }
                    }
                    scope:ddm_retention_title = {
                        change_variable = { name = ddm_top_rank_military_density add = scope:ddm_retention_holder.var:ddm_retention_strength_sample }
                        change_variable = { name = ddm_top_rank_counties add = 1 }
                    }
                    scope:ddm_retention_holder = { remove_variable = ddm_retention_strength_sample }
                }
            }
            if = {
                limit = { var:ddm_top_rank_counties > 0 }
                change_variable = { name = ddm_top_rank_military_density divide = var:ddm_top_rank_counties }
            }
            add_to_temporary_list = ddm_top_rank_titles
        }
        set_variable = { name = ddm_top_rank_total value = scope:ddm_retention_dynasty.var:ddm_managed_empire_total }
    }
    else_if = {
        limit = { highest_held_title_tier >= tier_empire }
        scope:ddm_retention_dynasty = {
            if = { limit = { NOT = { has_variable = ddm_managed_kingdom_total } } set_variable = { name = ddm_managed_kingdom_total value = 0 } }
        }
        every_held_title = {
            limit = {
                tier = tier_kingdom
                ddm_title_not_faith_protected_trigger = yes
            }
            if = {
                limit = { NOT = { has_variable = ddm_top_rank_managed_title } }
                set_variable = ddm_top_rank_managed_title
                scope:ddm_retention_dynasty = { change_variable = { name = ddm_managed_kingdom_total add = 1 } }
            }
            save_scope_as = ddm_retention_title
            set_variable = { name = ddm_top_rank_military_density value = 0 }
            set_variable = { name = ddm_top_rank_counties value = 0 }
            every_de_jure_county = {
                if = {
                    limit = {
                        exists = holder
                        holder = { ddm_is_in_actor_realm_trigger = yes }
                    }
                    holder = {
                        save_scope_as = ddm_retention_holder
                        set_variable = { name = ddm_retention_strength_sample value = current_military_strength }
                        if = { limit = { domain_size > 0 } change_variable = { name = ddm_retention_strength_sample divide = domain_size } }
                    }
                    scope:ddm_retention_title = {
                        change_variable = { name = ddm_top_rank_military_density add = scope:ddm_retention_holder.var:ddm_retention_strength_sample }
                        change_variable = { name = ddm_top_rank_counties add = 1 }
                    }
                    scope:ddm_retention_holder = { remove_variable = ddm_retention_strength_sample }
                }
            }
            if = {
                limit = { var:ddm_top_rank_counties > 0 }
                change_variable = { name = ddm_top_rank_military_density divide = var:ddm_top_rank_counties }
            }
            add_to_temporary_list = ddm_top_rank_titles
        }
        set_variable = { name = ddm_top_rank_total value = scope:ddm_retention_dynasty.var:ddm_managed_kingdom_total }
    }
    else_if = {
        limit = { highest_held_title_tier = tier_kingdom }
        scope:ddm_retention_dynasty = {
            if = { limit = { NOT = { has_variable = ddm_managed_duchy_total } } set_variable = { name = ddm_managed_duchy_total value = 0 } }
        }
        every_held_title = {
            limit = {
                tier = tier_duchy
                ddm_title_not_faith_protected_trigger = yes
            }
            if = {
                limit = { NOT = { has_variable = ddm_top_rank_managed_title } }
                set_variable = ddm_top_rank_managed_title
                scope:ddm_retention_dynasty = { change_variable = { name = ddm_managed_duchy_total add = 1 } }
            }
            save_scope_as = ddm_retention_title
            set_variable = { name = ddm_top_rank_military_density value = 0 }
            set_variable = { name = ddm_top_rank_counties value = 0 }
            every_de_jure_county = {
                if = {
                    limit = {
                        exists = holder
                        holder = { ddm_is_in_actor_realm_trigger = yes }
                    }
                    holder = {
                        save_scope_as = ddm_retention_holder
                        set_variable = { name = ddm_retention_strength_sample value = current_military_strength }
                        if = { limit = { domain_size > 0 } change_variable = { name = ddm_retention_strength_sample divide = domain_size } }
                    }
                    scope:ddm_retention_title = {
                        change_variable = { name = ddm_top_rank_military_density add = scope:ddm_retention_holder.var:ddm_retention_strength_sample }
                        change_variable = { name = ddm_top_rank_counties add = 1 }
                    }
                    scope:ddm_retention_holder = { remove_variable = ddm_retention_strength_sample }
                }
            }
            if = {
                limit = { var:ddm_top_rank_counties > 0 }
                change_variable = { name = ddm_top_rank_military_density divide = var:ddm_top_rank_counties }
            }
            add_to_temporary_list = ddm_top_rank_titles
        }
        set_variable = { name = ddm_top_rank_total value = scope:ddm_retention_dynasty.var:ddm_managed_duchy_total }
    }

    if = {
        limit = { var:ddm_top_rank_total > 0 }
        set_variable = { name = ddm_top_rank_keep_target value = var:ddm_top_rank_total }
        change_variable = { name = ddm_top_rank_keep_target multiply = 0.40 }
        if = { limit = { var:ddm_top_rank_keep_target < 1 } set_variable = { name = ddm_top_rank_keep_target value = 1 } }

        # Keep the capital duchy as part of (not in addition to) a king's 40% retained tier. This
        # preserves the personal core without silently making a king retain 40% + one extra duchy.
        if = {
            limit = {
                highest_held_title_tier = tier_kingdom
                exists = capital_county.de_jure_liege
                capital_county.de_jure_liege = {
                    holder = scope:ddm_actor
                    tier = tier_duchy
                    ddm_title_not_faith_protected_trigger = yes
                }
            }
            capital_county.de_jure_liege = {
                set_variable = ddm_top_rank_retained
            }
            change_variable = { name = ddm_top_rank_retained_count add = 1 }
            change_variable = { name = ddm_last_top_rank_retained add = 1 }
        }

        while = {
            limit = { var:ddm_top_rank_retained_count < var:ddm_top_rank_keep_target }
            remove_variable = ddm_top_rank_found
            ordered_in_list = {
                list = ddm_top_rank_titles
                limit = {
                    holder = scope:ddm_actor
                    NOT = { has_variable = ddm_top_rank_retained }
                    NOT = { has_variable = ddm_reserved_recipient }
                }
                order_by = ddm_top_rank_retention_value
                position = 0
                check_range_bounds = no
                set_variable = ddm_top_rank_retained
                scope:ddm_actor = {
                    change_variable = { name = ddm_top_rank_retained_count add = 1 }
                    change_variable = { name = ddm_last_top_rank_retained add = 1 }
                    set_variable = { name = ddm_top_rank_found value = 1 }
                }
            }
        }
    }

    every_in_list = {
        list = ddm_top_rank_titles
        remove_variable = ddm_top_rank_military_density
        remove_variable = ddm_top_rank_counties
    }
    remove_variable = ddm_top_rank_found
    clear_saved_scope = ddm_retention_dynasty
}

ddm_organize_dynastic_hierarchy_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor

    ddm_v18_build_recipient_lists_effect = yes
    ddm_rank_dynasty_effect = yes

    # Kings decide which 40% of duchies to retain before the duchy pass. Empires wait until duchies are
    # organized, then evaluate kingdom military density from the finished lower-level structure.
    if = { limit = { highest_held_title_tier = tier_kingdom } ddm_prepare_top_rank_retention_effect = yes }

    set_variable = { name = ddm_last_duchies_granted value = 0 }
    set_variable = { name = ddm_last_kingdoms_granted value = 0 }
    set_variable = { name = ddm_last_empires_granted value = 0 }
    set_variable = { name = ddm_last_top_rank_retained value = 0 }

    if = {
        limit = { highest_held_title_tier >= tier_kingdom }
        every_held_title = {
            limit = {
                tier = tier_duchy
                this != scope:ddm_actor.primary_title
                ddm_title_not_faith_protected_trigger = yes
                trigger_if = {
                    limit = { exists = scope:ddm_actor.capital_county.de_jure_liege }
                    this != scope:ddm_actor.capital_county.de_jure_liege
                }
                trigger_if = {
                    limit = { scope:ddm_actor.highest_held_title_tier = tier_kingdom }
                    NOT = { has_variable = ddm_top_rank_retained }
                }
            }
            add_to_temporary_list = ddm_hier_duchy_list
        }

        every_in_list = {
            list = ddm_hier_duchy_list
            limit = { holder ?= scope:ddm_actor }
            save_scope_as = ddm_hier_title
            save_scope_as = ddm_title
            ddm_hier_reset_counts_effect = yes

            # Count de jure counties, and how many each dynast holds.
            every_de_jure_county = {
                scope:ddm_actor = { change_variable = { name = ddm_hier_total add = 1 } }
                if = {
                    limit = {
                        exists = holder
                        holder = { is_alive = yes has_character_flag = ddm_rightful_pool }
                    }
                    holder = { change_variable = { name = ddm_hier_held add = 1 } }
                }
            }
            scope:ddm_actor = {
                set_variable = { name = ddm_hier_half value = var:ddm_hier_total }
                change_variable = { name = ddm_hier_half multiply = 0.5 }
            }

            if = {
                limit = { exists = var:ddm_reserved_recipient }
                if = {
                    limit = {
                        var:ddm_reserved_recipient = {
                            ddm_is_eligible_manual_reservation_recipient_trigger = yes
                            is_landed = yes
                            ddm_is_in_actor_realm_trigger = yes
                        }
                    }
                    var:ddm_reserved_recipient = { save_scope_as = ddm_hier_recipient }
                    scope:ddm_actor = { set_variable = { name = ddm_hier_found value = 1 } }
                }
                else_if = {
                    # Still a legal candidate: hold the reservation for a later settlement after that
                    # person receives qualifying land.
                    limit = { var:ddm_reserved_recipient = { ddm_is_eligible_manual_reservation_recipient_trigger = yes } }
                }
                else = {
                    # Truly stale reservation: clear it and return to scored allocation.
                    remove_variable = ddm_reserved_recipient
                ordered_in_list = {
                    list = ddm_v18_recipient_pool
                    limit = {
                        ddm_is_ranked_title_candidate_trigger = yes
                        has_variable = ddm_hier_held
                        var:ddm_hier_held > 0
                    }
                    order_by = ddm_hier_duchy_rightful_value
                    position = 0
                    check_range_bounds = no
                    save_scope_as = ddm_hier_recipient
                    scope:ddm_actor = { set_variable = { name = ddm_hier_found value = 1 } }
                }
                }
            }
            else = {
                # Local territorial control is the dominant ordinary input; the rightfulness judgment
                # resolves which plausible ruler becomes duke.
                ordered_in_list = {
                    list = ddm_v18_recipient_pool
                    limit = {
                        ddm_is_ranked_title_candidate_trigger = yes
                        has_variable = ddm_hier_held
                        var:ddm_hier_held > 0
                    }
                    order_by = ddm_hier_duchy_rightful_value
                    position = 0
                    check_range_bounds = no
                    save_scope_as = ddm_hier_recipient
                    scope:ddm_actor = { set_variable = { name = ddm_hier_found value = 1 } }
                }
            }

            if = {
                limit = {
                    scope:ddm_actor = { has_variable = ddm_hier_found }
                    exists = scope:ddm_hier_recipient
                }
                scope:ddm_actor = {
                    clear_saved_scope = ddm_hier_change
                    create_title_and_vassal_change = {
                        type = granted
                        save_scope_as = ddm_hier_change
                        add_claim_on_loss = yes
                    }
                }
                change_title_holder_include_vassals = {
                    holder = scope:ddm_hier_recipient
                    change = scope:ddm_hier_change
                    government_base = scope:ddm_actor
                }
                scope:ddm_actor = {
                    resolve_title_and_vassal_change = scope:ddm_hier_change
                    change_variable = { name = ddm_last_duchies_granted add = 1 }
                }
                scope:ddm_hier_title = { remove_variable = ddm_reserved_recipient }
                scope:ddm_hier_recipient = { save_scope_as = ddm_recipient }
                scope:ddm_hier_title = { save_scope_as = ddm_title }
                scope:ddm_actor = {
                    ddm_apply_grant_social_effect = yes
                    ddm_make_dynastic_alliance_effect = yes
                }
            }
            clear_saved_scope = ddm_hier_recipient
        }
    }

    # ---- Kingdoms ----
    if = { limit = { highest_held_title_tier >= tier_empire } ddm_prepare_top_rank_retention_effect = yes }

    # "those who rank maybe second or third can get a title above that." The majority test is over de
    # jure duchy titles now held by the candidate or by a vassal of the candidate, so a king is built on
    # top of his own dukes.
    if = {
        limit = { highest_held_title_tier >= tier_empire }
        every_held_title = {
            limit = {
                tier = tier_kingdom
                this != scope:ddm_actor.primary_title
                ddm_title_not_faith_protected_trigger = yes
                NOT = { has_variable = ddm_top_rank_retained }
            }
            add_to_temporary_list = ddm_hier_kingdom_list
        }

        every_in_list = {
            list = ddm_hier_kingdom_list
            limit = { holder ?= scope:ddm_actor }
            save_scope_as = ddm_hier_title
            save_scope_as = ddm_title
            ddm_hier_reset_counts_effect = yes

            every_de_jure_county = {
                scope:ddm_actor = { change_variable = { name = ddm_hier_total add = 1 } }
                if = {
                    limit = {
                        exists = holder
                        holder = {
                            is_alive = yes
                            has_character_flag = ddm_rightful_pool
                        }
                    }
                    holder = { change_variable = { name = ddm_hier_held add = 1 } }
                }
                # A county under one of the candidate's own vassals counts toward that candidate, which
                # is what makes the pyramid work.
                if = {
                    limit = {
                        exists = holder
                        exists = holder.liege
                        holder.liege = {
                            is_alive = yes
                            has_character_flag = ddm_rightful_pool
                            this != scope:ddm_actor
                        }
                    }
                    holder.liege = { change_variable = { name = ddm_hier_held add = 1 } }
                }
            }
            scope:ddm_actor = {
                set_variable = { name = ddm_hier_half value = var:ddm_hier_total }
                change_variable = { name = ddm_hier_half multiply = 0.5 }
            }

            if = {
                limit = { exists = var:ddm_reserved_recipient }
                if = {
                    limit = {
                        var:ddm_reserved_recipient = {
                            ddm_is_eligible_manual_reservation_recipient_trigger = yes
                            is_landed = yes
                            ddm_is_in_actor_realm_trigger = yes
                            highest_held_title_tier >= tier_duchy
                        }
                    }
                    var:ddm_reserved_recipient = { save_scope_as = ddm_hier_recipient }
                    scope:ddm_actor = { set_variable = { name = ddm_hier_found value = 1 } }
                }
                else_if = {
                    # A living legal candidate who has not yet reached ducal rank keeps this kingdom
                    # reserved for a future hierarchy pass.
                    limit = { var:ddm_reserved_recipient = { ddm_is_eligible_manual_reservation_recipient_trigger = yes } }
                }
                else = {
                    remove_variable = ddm_reserved_recipient
                ordered_in_list = {
                    list = ddm_v18_recipient_pool
                    limit = {
                        ddm_is_ranked_title_candidate_trigger = yes
                        has_variable = ddm_hier_held
                        var:ddm_hier_held > 0
                        highest_held_title_tier >= tier_duchy
                    }
                    order_by = ddm_hier_kingdom_rightful_value
                    position = 0
                    check_range_bounds = no
                    save_scope_as = ddm_hier_recipient
                    scope:ddm_actor = { set_variable = { name = ddm_hier_found value = 1 } }
                }
                }
            }
            else = {
                ordered_in_list = {
                    list = ddm_v18_recipient_pool
                    limit = {
                        ddm_is_ranked_title_candidate_trigger = yes
                        has_variable = ddm_hier_held
                        var:ddm_hier_held > 0
                        highest_held_title_tier >= tier_duchy
                    }
                    order_by = ddm_hier_kingdom_rightful_value
                    position = 0
                    check_range_bounds = no
                    save_scope_as = ddm_hier_recipient
                    scope:ddm_actor = { set_variable = { name = ddm_hier_found value = 1 } }
                }
            }

            if = {
                limit = {
                    scope:ddm_actor = { has_variable = ddm_hier_found }
                    exists = scope:ddm_hier_recipient
                }
                scope:ddm_actor = {
                    clear_saved_scope = ddm_hier_change
                    create_title_and_vassal_change = {
                        type = granted
                        save_scope_as = ddm_hier_change
                        add_claim_on_loss = yes
                    }
                }
                change_title_holder_include_vassals = {
                    holder = scope:ddm_hier_recipient
                    change = scope:ddm_hier_change
                    government_base = scope:ddm_actor
                }
                scope:ddm_actor = {
                    resolve_title_and_vassal_change = scope:ddm_hier_change
                    change_variable = { name = ddm_last_kingdoms_granted add = 1 }
                }
                scope:ddm_hier_title = { remove_variable = ddm_reserved_recipient }
                scope:ddm_hier_recipient = { save_scope_as = ddm_recipient }
                scope:ddm_hier_title = { save_scope_as = ddm_title }
                scope:ddm_actor = {
                    ddm_apply_grant_social_effect = yes
                    ddm_make_dynastic_alliance_effect = yes
                }
            }
            clear_saved_scope = ddm_hier_recipient
        }
    }

    # ---- Empires (Hegemony tier only) ----
    # Hegemons organize one additional layer: kingdoms form the territorial base and eligible kings
    # receive non-retained empire titles. This mirrors the duchy/kingdom pyramid instead of treating a
    # Hegemon as an ordinary Emperor.
    if = {
        limit = { highest_held_title_tier = tier_hegemony }
        every_held_title = {
            limit = {
                tier = tier_empire
                this != scope:ddm_actor.primary_title
                ddm_title_not_faith_protected_trigger = yes
                NOT = { has_variable = ddm_top_rank_retained }
            }
            add_to_temporary_list = ddm_hier_empire_list
        }

        every_in_list = {
            list = ddm_hier_empire_list
            limit = { holder ?= scope:ddm_actor }
            save_scope_as = ddm_hier_title
            save_scope_as = ddm_title
            ddm_hier_reset_counts_effect = yes

            every_de_jure_county = {
                scope:ddm_actor = { change_variable = { name = ddm_hier_total add = 1 } }
                if = {
                    limit = { exists = holder holder = { is_alive = yes has_character_flag = ddm_rightful_pool } }
                    holder = { change_variable = { name = ddm_hier_held add = 1 } }
                }
                if = {
                    limit = {
                        exists = holder.liege
                        holder.liege = { is_alive = yes has_character_flag = ddm_rightful_pool this != scope:ddm_actor }
                    }
                    holder.liege = { change_variable = { name = ddm_hier_held add = 1 } }
                }
                if = {
                    limit = {
                        exists = holder.liege.liege
                        holder.liege.liege = { is_alive = yes has_character_flag = ddm_rightful_pool this != scope:ddm_actor }
                    }
                    holder.liege.liege = { change_variable = { name = ddm_hier_held add = 1 } }
                }
            }
            scope:ddm_actor = {
                set_variable = { name = ddm_hier_half value = var:ddm_hier_total }
                change_variable = { name = ddm_hier_half multiply = 0.5 }
            }

            if = {
                limit = { exists = var:ddm_reserved_recipient }
                if = {
                    limit = {
                        var:ddm_reserved_recipient = {
                            ddm_is_eligible_manual_reservation_recipient_trigger = yes
                            is_landed = yes
                            ddm_is_in_actor_realm_trigger = yes
                            highest_held_title_tier >= tier_kingdom
                        }
                    }
                    var:ddm_reserved_recipient = { save_scope_as = ddm_hier_recipient }
                    scope:ddm_actor = { set_variable = { name = ddm_hier_found value = 1 } }
                }
                else_if = {
                    limit = { var:ddm_reserved_recipient = { ddm_is_eligible_manual_reservation_recipient_trigger = yes } }
                }
                else = {
                    remove_variable = ddm_reserved_recipient
                    ordered_in_list = {
                        list = ddm_v18_recipient_pool
                        limit = {
                            ddm_is_ranked_title_candidate_trigger = yes
                            has_variable = ddm_hier_held
                            var:ddm_hier_held > 0
                            highest_held_title_tier >= tier_kingdom
                        }
                        order_by = ddm_hier_empire_rightful_value
                        position = 0
                        check_range_bounds = no
                        save_scope_as = ddm_hier_recipient
                        scope:ddm_actor = { set_variable = { name = ddm_hier_found value = 1 } }
                    }
                }
            }
            else = {
                ordered_in_list = {
                    list = ddm_v18_recipient_pool
                    limit = {
                        ddm_is_ranked_title_candidate_trigger = yes
                        has_variable = ddm_hier_held
                        var:ddm_hier_held > 0
                        highest_held_title_tier >= tier_kingdom
                    }
                    order_by = ddm_hier_empire_rightful_value
                    position = 0
                    check_range_bounds = no
                    save_scope_as = ddm_hier_recipient
                    scope:ddm_actor = { set_variable = { name = ddm_hier_found value = 1 } }
                }
            }

            if = {
                limit = { scope:ddm_actor = { has_variable = ddm_hier_found } exists = scope:ddm_hier_recipient }
                scope:ddm_actor = {
                    clear_saved_scope = ddm_hier_change
                    create_title_and_vassal_change = { type = granted save_scope_as = ddm_hier_change add_claim_on_loss = yes }
                }
                change_title_holder_include_vassals = {
                    holder = scope:ddm_hier_recipient
                    change = scope:ddm_hier_change
                    government_base = scope:ddm_actor
                }
                scope:ddm_actor = {
                    resolve_title_and_vassal_change = scope:ddm_hier_change
                    change_variable = { name = ddm_last_empires_granted add = 1 }
                }
                scope:ddm_hier_title = { remove_variable = ddm_reserved_recipient }
                scope:ddm_hier_recipient = { save_scope_as = ddm_recipient }
                scope:ddm_hier_title = { save_scope_as = ddm_title }
                scope:ddm_actor = { ddm_apply_grant_social_effect = yes ddm_make_dynastic_alliance_effect = yes }
            }
            clear_saved_scope = ddm_hier_recipient
        }
    }

    every_in_list = { list = ddm_v18_recipient_pool remove_variable = ddm_hier_held }
    every_held_title = { remove_variable = ddm_top_rank_retained }
    remove_variable = ddm_top_rank_total
    remove_variable = ddm_top_rank_keep_target
    remove_variable = ddm_top_rank_retained_count
    remove_variable = ddm_hier_total
    remove_variable = ddm_hier_half
    remove_variable = ddm_hier_found
    clear_saved_scope = ddm_hier_title
    clear_saved_scope = ddm_title
    clear_saved_scope = ddm_hier_recipient
    clear_saved_scope = ddm_hier_change
    ddm_clear_dynasty_ranking_effect = yes
    dynasty = {
        every_dynasty_member = {
            remove_character_flag = ddm_partition_settlement_pool
            remove_variable = ddm_batch_land_grants
        }
    }
    every_courtier = { remove_variable = ddm_batch_land_grants remove_variable = ddm_hier_held }
    every_vassal_or_below = { remove_variable = ddm_batch_land_grants remove_variable = ddm_hier_held }
    ddm_schedule_post_settlement_alliance_event_effect = yes
}

# Pre-flight warnings. Nothing is blocked; the player is told.
ddm_hier_scan_warnings_effect = {
    save_scope_as = ddm_actor
    set_variable = { name = ddm_warn_top_tier_titles value = 0 }
    set_variable = { name = ddm_warn_faith_protected value = 0 }

    if = {
        limit = {
            exists = faith
            exists = faith.religious_head_title
            faith.religious_head_title ?= { holder ?= scope:ddm_actor }
        }
        set_variable = { name = ddm_warn_faith_protected value = 1 }
    }

    # Titles one tier directly below the player. Granting these is what risks independence or a
    # disproportionate share of levies.
    every_held_title = {
        limit = {
            this != scope:ddm_actor.primary_title
            tier = scope:ddm_actor.highest_held_title_tier
        }
        scope:ddm_actor = { change_variable = { name = ddm_warn_top_tier_titles add = 1 } }
    }
}

ddm_organize_higher_titles_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    ddm_prepare_land_distribution_batch_effect = yes
    set_variable = { name = ddm_last_duchies_granted value = 0 }
    set_variable = { name = ddm_last_kingdoms_granted value = 0 }
    set_variable = { name = ddm_last_empires_granted value = 0 }

    if = {
        limit = { highest_held_title_tier >= tier_kingdom }
        every_held_title = {
            limit = {
                tier = tier_duchy
                this != scope:ddm_actor.primary_title
                trigger_if = {
                    limit = { exists = scope:ddm_actor.capital_county.de_jure_liege }
                    this != scope:ddm_actor.capital_county.de_jure_liege
                }
            }
            save_scope_as = ddm_title
            scope:ddm_actor = { remove_variable = ddm_found_recipient }
            scope:ddm_actor.dynasty = {
                ordered_dynasty_member = {
                    limit = { ddm_safe_for_duchy_trigger = yes }
                    order_by = ddm_duchy_recipient_score
                    position = 0
                    check_range_bounds = no
                    save_scope_as = ddm_recipient
                    scope:ddm_actor = { set_variable = { name = ddm_found_recipient value = 1 } }
                }
            }
            if = {
                limit = { scope:ddm_actor = { has_variable = ddm_found_recipient } exists = scope:ddm_recipient }
                create_title_and_vassal_change = { type = granted save_scope_as = ddm_title_change add_claim_on_loss = yes }
                change_title_holder_include_vassals = { holder = scope:ddm_recipient change = scope:ddm_title_change government_base = scope:ddm_actor }
                resolve_title_and_vassal_change = scope:ddm_title_change
                scope:ddm_actor = {
                    change_variable = { name = ddm_last_duchies_granted add = 1 }
                    ddm_apply_grant_social_effect = yes
                    ddm_make_dynastic_alliance_effect = yes
                }
            }
        }
    }

    if = {
        limit = { highest_held_title_tier >= tier_empire }
        every_held_title = {
            limit = { tier = tier_kingdom this != scope:ddm_actor.primary_title }
            save_scope_as = ddm_title
            scope:ddm_actor = { remove_variable = ddm_found_recipient }
            scope:ddm_actor.dynasty = {
                ordered_dynasty_member = {
                    limit = { ddm_safe_for_kingdom_trigger = yes }
                    order_by = ddm_kingdom_recipient_score
                    position = 0
                    check_range_bounds = no
                    save_scope_as = ddm_recipient
                    scope:ddm_actor = { set_variable = { name = ddm_found_recipient value = 1 } }
                }
            }
            if = {
                limit = { scope:ddm_actor = { has_variable = ddm_found_recipient } exists = scope:ddm_recipient }
                create_title_and_vassal_change = { type = granted save_scope_as = ddm_title_change add_claim_on_loss = yes }
                change_title_holder_include_vassals = { holder = scope:ddm_recipient change = scope:ddm_title_change government_base = scope:ddm_actor }
                resolve_title_and_vassal_change = scope:ddm_title_change
                scope:ddm_actor = {
                    change_variable = { name = ddm_last_kingdoms_granted add = 1 }
                    ddm_apply_grant_social_effect = yes
                    ddm_make_dynastic_alliance_effect = yes
                }
            }
        }
    }
    if = {
        limit = { highest_held_title_tier = tier_hegemony }
        every_held_title = {
            limit = { tier = tier_empire this != scope:ddm_actor.primary_title }
            save_scope_as = ddm_title
            scope:ddm_actor = { remove_variable = ddm_found_recipient }
            scope:ddm_actor.dynasty = {
                ordered_dynasty_member = {
                    limit = { ddm_safe_for_empire_trigger = yes }
                    order_by = ddm_empire_recipient_score
                    position = 0
                    check_range_bounds = no
                    save_scope_as = ddm_recipient
                    scope:ddm_actor = { set_variable = { name = ddm_found_recipient value = 1 } }
                }
            }
            if = {
                limit = { scope:ddm_actor = { has_variable = ddm_found_recipient } exists = scope:ddm_recipient }
                create_title_and_vassal_change = { type = granted save_scope_as = ddm_title_change add_claim_on_loss = yes }
                change_title_holder_include_vassals = { holder = scope:ddm_recipient change = scope:ddm_title_change government_base = scope:ddm_actor }
                resolve_title_and_vassal_change = scope:ddm_title_change
                scope:ddm_actor = {
                    change_variable = { name = ddm_last_empires_granted add = 1 }
                    ddm_apply_grant_social_effect = yes
                    ddm_make_dynastic_alliance_effect = yes
                }
            }
        }
    }

    remove_variable = ddm_found_recipient
    ddm_clear_land_distribution_batch_effect = yes
}


ddm_prepare_hierarchy_sort_metadata_effect = {
    save_scope_as = ddm_actor

    every_in_list = {
        variable = ddm_sort_source_titles
        title_province.county = {
            set_variable = ddm_sort_candidate_county
            remove_variable = ddm_sort_alpha_score
        }
    }
    ddm_assign_county_alphabet_scores_effect = yes

    every_in_list = {
        variable = ddm_sort_source_titles
        title_province.county = {
            save_scope_as = ddm_sort_county
            # Unknown/custom map titles sort after indexed vanilla counties but still remain grouped by
            # their live de-jure parents.
            if = { limit = { NOT = { has_variable = ddm_sort_alpha_score } } set_variable = { name = ddm_sort_alpha_score value = 1 } }

            if = {
                limit = { exists = de_jure_liege }
                de_jure_liege = {
                    if = {
                        limit = { OR = { NOT = { has_variable = ddm_sort_group_alpha_score } var:ddm_sort_group_alpha_score < scope:ddm_sort_county.var:ddm_sort_alpha_score } }
                        set_variable = { name = ddm_sort_group_alpha_score value = scope:ddm_sort_county.var:ddm_sort_alpha_score }
                    }
                    if = {
                        limit = { exists = de_jure_liege }
                        de_jure_liege = {
                            if = {
                                limit = { OR = { NOT = { has_variable = ddm_sort_group_alpha_score } var:ddm_sort_group_alpha_score < scope:ddm_sort_county.var:ddm_sort_alpha_score } }
                                set_variable = { name = ddm_sort_group_alpha_score value = scope:ddm_sort_county.var:ddm_sort_alpha_score }
                            }
                            if = {
                                limit = { exists = de_jure_liege }
                                de_jure_liege = {
                                    if = {
                                        limit = { OR = { NOT = { has_variable = ddm_sort_group_alpha_score } var:ddm_sort_group_alpha_score < scope:ddm_sort_county.var:ddm_sort_alpha_score } }
                                        set_variable = { name = ddm_sort_group_alpha_score value = scope:ddm_sort_county.var:ddm_sort_alpha_score }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

ddm_cleanup_hierarchy_sort_metadata_effect = {
    every_in_list = {
        variable = ddm_sort_source_titles
        title_province.county = {
            remove_variable = ddm_sort_candidate_county
            remove_variable = ddm_sort_alpha_score
            if = {
                limit = { exists = de_jure_liege }
                de_jure_liege = {
                    remove_variable = ddm_sort_group_alpha_score
                    if = {
                        limit = { exists = de_jure_liege }
                        de_jure_liege = {
                            remove_variable = ddm_sort_group_alpha_score
                            if = { limit = { exists = de_jure_liege } de_jure_liege = { remove_variable = ddm_sort_group_alpha_score } }
                        }
                    }
                }
            }
        }
    }
    clear_variable_list = ddm_sort_source_titles
}

ddm_rebuild_domain_planner_sort_effect = {
    save_scope_as = ddm_actor
    clear_variable_list = ddm_domain_planner_titles

    if = {
        limit = { var:ddm_title_sort_mode = 0 }
        clear_variable_list = ddm_sort_source_titles
        every_in_list = { variable = ddm_domain_planner_titles_raw save_temporary_scope_as = ddm_sort_title scope:ddm_actor = { add_to_variable_list = { name = ddm_sort_source_titles target = scope:ddm_sort_title } } }
        ddm_prepare_hierarchy_sort_metadata_effect = yes
        if = {
            limit = { var:ddm_title_sort_direction < 0 }
            ordered_in_list = { variable = ddm_domain_planner_titles_raw order_by = { value = ddm_title_sort_hierarchy_value multiply = -1 } max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_domain_planner_titles target = scope:ddm_sorted_title } } }
        }
        else = { ordered_in_list = { variable = ddm_domain_planner_titles_raw order_by = ddm_title_sort_hierarchy_value max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_domain_planner_titles target = scope:ddm_sorted_title } } } }
        ddm_cleanup_hierarchy_sort_metadata_effect = yes
    }
    else_if = {
        limit = { var:ddm_title_sort_mode = 2 }
        if = { limit = { var:ddm_title_sort_direction < 0 } ordered_in_list = { variable = ddm_domain_planner_titles_raw order_by = { value = ddm_title_sort_faith_value multiply = -1 } max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_domain_planner_titles target = scope:ddm_sorted_title } } } }
        else = { ordered_in_list = { variable = ddm_domain_planner_titles_raw order_by = ddm_title_sort_faith_value max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_domain_planner_titles target = scope:ddm_sorted_title } } } }
    }
    else_if = {
        limit = { var:ddm_title_sort_mode = 3 }
        if = { limit = { var:ddm_title_sort_direction < 0 } ordered_in_list = { variable = ddm_domain_planner_titles_raw order_by = { value = ddm_title_sort_culture_value multiply = -1 } max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_domain_planner_titles target = scope:ddm_sorted_title } } } }
        else = { ordered_in_list = { variable = ddm_domain_planner_titles_raw order_by = ddm_title_sort_culture_value max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_domain_planner_titles target = scope:ddm_sorted_title } } } }
    }
    else = {
        if = { limit = { var:ddm_title_sort_direction < 0 } ordered_in_list = { variable = ddm_domain_planner_titles_raw order_by = { value = ddm_title_sort_development_value multiply = -1 } max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_domain_planner_titles target = scope:ddm_sorted_title } } } }
        else = { ordered_in_list = { variable = ddm_domain_planner_titles_raw order_by = ddm_title_sort_development_value max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_domain_planner_titles target = scope:ddm_sorted_title } } } }
    }
}

ddm_rebuild_outsider_holdings_sort_effect = {
    save_scope_as = ddm_actor
    clear_variable_list = ddm_outsider_counties

    if = {
        limit = { var:ddm_title_sort_mode = 0 }
        clear_variable_list = ddm_sort_source_titles
        every_in_list = { variable = ddm_outsider_counties_raw save_temporary_scope_as = ddm_sort_title scope:ddm_actor = { add_to_variable_list = { name = ddm_sort_source_titles target = scope:ddm_sort_title } } }
        ddm_prepare_hierarchy_sort_metadata_effect = yes
        if = { limit = { var:ddm_title_sort_direction < 0 } ordered_in_list = { variable = ddm_outsider_counties_raw order_by = { value = ddm_title_sort_hierarchy_value multiply = -1 } max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_outsider_counties target = scope:ddm_sorted_title } } } }
        else = { ordered_in_list = { variable = ddm_outsider_counties_raw order_by = ddm_title_sort_hierarchy_value max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_outsider_counties target = scope:ddm_sorted_title } } } }
        ddm_cleanup_hierarchy_sort_metadata_effect = yes
    }
    else_if = {
        limit = { var:ddm_title_sort_mode = 2 }
        if = { limit = { var:ddm_title_sort_direction < 0 } ordered_in_list = { variable = ddm_outsider_counties_raw order_by = { value = ddm_title_sort_faith_value multiply = -1 } max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_outsider_counties target = scope:ddm_sorted_title } } } }
        else = { ordered_in_list = { variable = ddm_outsider_counties_raw order_by = ddm_title_sort_faith_value max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_outsider_counties target = scope:ddm_sorted_title } } } }
    }
    else_if = {
        limit = { var:ddm_title_sort_mode = 3 }
        if = { limit = { var:ddm_title_sort_direction < 0 } ordered_in_list = { variable = ddm_outsider_counties_raw order_by = { value = ddm_title_sort_culture_value multiply = -1 } max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_outsider_counties target = scope:ddm_sorted_title } } } }
        else = { ordered_in_list = { variable = ddm_outsider_counties_raw order_by = ddm_title_sort_culture_value max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_outsider_counties target = scope:ddm_sorted_title } } } }
    }
    else = {
        if = { limit = { var:ddm_title_sort_direction < 0 } ordered_in_list = { variable = ddm_outsider_counties_raw order_by = { value = ddm_title_sort_development_value multiply = -1 } max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_outsider_counties target = scope:ddm_sorted_title } } } }
        else = { ordered_in_list = { variable = ddm_outsider_counties_raw order_by = ddm_title_sort_development_value max = 5000 check_range_bounds = no save_temporary_scope_as = ddm_sorted_title scope:ddm_actor = { add_to_variable_list = { name = ddm_outsider_counties target = scope:ddm_sorted_title } } } }
    }
    ddm_build_outsider_page_effect = yes
}

ddm_prepare_outsider_recipients_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    clear_variable_list = ddm_outsider_recipient_candidates
    set_variable = { name = ddm_outsider_recipient_total value = 0 }
    set_variable = { name = ddm_outsider_recipient_favored value = 0 }

    every_courtier = { remove_character_flag = ddm_recipient_listed_this_pass }
    every_vassal_or_below = { remove_character_flag = ddm_recipient_listed_this_pass }

    every_courtier = {
        limit = { ddm_is_eligible_outsider_recipient_trigger = yes NOT = { has_character_flag = ddm_recipient_listed_this_pass } }
        add_character_flag = ddm_recipient_listed_this_pass
        save_temporary_scope_as = ddm_outsider_candidate
        scope:ddm_actor = {
            add_to_variable_list = { name = ddm_outsider_recipient_candidates target = scope:ddm_outsider_candidate }
            change_variable = { name = ddm_outsider_recipient_total add = 1 }
        }
        if = { limit = { has_variable = ddm_outsider_favored_for_land } scope:ddm_actor = { change_variable = { name = ddm_outsider_recipient_favored add = 1 } } }
    }
    every_vassal_or_below = {
        limit = { ddm_is_eligible_outsider_recipient_trigger = yes NOT = { has_character_flag = ddm_recipient_listed_this_pass } }
        add_character_flag = ddm_recipient_listed_this_pass
        save_temporary_scope_as = ddm_outsider_candidate
        scope:ddm_actor = {
            add_to_variable_list = { name = ddm_outsider_recipient_candidates target = scope:ddm_outsider_candidate }
            change_variable = { name = ddm_outsider_recipient_total add = 1 }
        }
        if = { limit = { has_variable = ddm_outsider_favored_for_land } scope:ddm_actor = { change_variable = { name = ddm_outsider_recipient_favored add = 1 } } }
    }

    every_courtier = { remove_character_flag = ddm_recipient_listed_this_pass }
    every_vassal_or_below = { remove_character_flag = ddm_recipient_listed_this_pass }

    # Keep the full candidate registry, but hand only one 20-person page to the GUI.
    ddm_build_recipient_page_effect = yes
}

# rebuild the selectable outsider-county register. Protection lives on the county title itself, so it
# survives succession to a new outsider holder.
ddm_prepare_outsider_holdings_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    clear_variable_list = ddm_outsider_counties
    clear_variable_list = ddm_outsider_counties_raw
    set_variable = { name = ddm_outsider_county_total value = 0 }
    set_variable = { name = ddm_outsider_county_protected value = 0 }
    set_variable = { name = ddm_outsider_county_reclaimable value = 0 }

    # Clear transient GUI markers from titles presently in the subrealm.
    every_vassal_or_below = {
        every_held_title = { remove_variable = ddm_outsider_listed }
    }

    every_vassal_or_below = {
        limit = {
            is_landed = yes
            OR = { NOT = { exists = dynasty } dynasty != scope:ddm_actor.dynasty }
        }
        every_held_title = {
            limit = { tier = tier_county NOT = { is_head_of_faith = yes } }
            set_variable = ddm_outsider_listed
            root = {
                add_to_variable_list = { name = ddm_outsider_counties_raw target = prev }
                change_variable = { name = ddm_outsider_county_total add = 1 }
            }
            if = {
                limit = { has_variable = ddm_outsider_protected }
                root = { change_variable = { name = ddm_outsider_county_protected add = 1 } }
            }
            else = {
                root = { change_variable = { name = ddm_outsider_county_reclaimable add = 1 } }
            }
        }
    }
    ddm_rebuild_outsider_holdings_sort_effect = yes
}

ddm_protect_all_outsider_counties_effect = {
    every_in_list = { variable = ddm_outsider_counties set_variable = ddm_outsider_protected }
    ddm_prepare_outsider_holdings_effect = yes
}

ddm_clear_all_outsider_protections_effect = {
    every_in_list = { variable = ddm_outsider_counties remove_variable = ddm_outsider_protected }
    ddm_prepare_outsider_holdings_effect = yes
}

ddm_reclaim_unprotected_outsider_titles_only_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    set_variable = { name = ddm_last_titles_reclaimed value = 0 }

    create_title_and_vassal_change = { type = returned save_scope_as = ddm_reclaim_change add_claim_on_loss = yes }
    every_vassal_or_below = {
        limit = {
            is_landed = yes
            OR = { NOT = { exists = dynasty } dynasty != scope:ddm_actor.dynasty }
        }

        # If this outsider has no specifically protected county, their non-county rank titles below the
        # player's rank may return with the rest of the estate.
        if = {
            limit = {
                NOT = { any_held_title = { tier = tier_county has_variable = ddm_outsider_protected } }
            }
            every_held_title = {
                limit = {
                    tier > tier_county
                    tier < scope:ddm_actor.highest_held_title_tier
                    NOT = { is_landless_type_title = yes }
                }
                change_title_holder = { holder = scope:ddm_actor change = scope:ddm_reclaim_change government_base = scope:ddm_actor }
                scope:ddm_actor = { change_variable = { name = ddm_last_titles_reclaimed add = 1 } }
            }
        }

        every_held_title = {
            limit = {
                tier = tier_county
                NOT = { has_variable = ddm_outsider_protected }
                NOT = { is_head_of_faith = yes }
            }
            change_title_holder = { holder = scope:ddm_actor change = scope:ddm_reclaim_change government_base = scope:ddm_actor }
            scope:ddm_actor = { change_variable = { name = ddm_last_titles_reclaimed add = 1 } }
        }
    }
    resolve_title_and_vassal_change = scope:ddm_reclaim_change

    every_vassal_or_below = {
        limit = {
            is_landed = yes
            OR = { NOT = { exists = dynasty } dynasty != scope:ddm_actor.dynasty }
            NOT = { any_held_title = { tier = tier_county has_variable = ddm_outsider_protected } }
        }
        every_held_title = {
            limit = {
                tier >= tier_duchy
                tier < scope:ddm_actor.highest_held_title_tier
                is_head_of_faith = yes
                NOT = { is_landless_type_title = yes }
            }
            add_to_temporary_list = ddm_stuck_religious_titles
        }
    }
    every_in_list = {
        list = ddm_stuck_religious_titles
        save_temporary_scope_as = ddm_stuck_religious_title
        destroy_title = scope:ddm_stuck_religious_title
    }

    create_title_and_vassal_change = { type = returned save_scope_as = ddm_reclaim_change_freed add_claim_on_loss = yes }
    every_vassal_or_below = {
        limit = {
            is_landed = yes
            OR = { NOT = { exists = dynasty } dynasty != scope:ddm_actor.dynasty }
        }
        if = {
            limit = {
                NOT = { any_held_title = { tier = tier_county has_variable = ddm_outsider_protected } }
            }
            every_held_title = {
                limit = {
                    tier > tier_county
                    tier < scope:ddm_actor.highest_held_title_tier
                    NOT = { is_landless_type_title = yes }
                }
                change_title_holder = { holder = scope:ddm_actor change = scope:ddm_reclaim_change_freed government_base = scope:ddm_actor }
            }
        }
        every_held_title = {
            limit = {
                tier = tier_county
                NOT = { has_variable = ddm_outsider_protected }
                NOT = { is_head_of_faith = yes }
            }
            change_title_holder = { holder = scope:ddm_actor change = scope:ddm_reclaim_change_freed government_base = scope:ddm_actor }
        }
    }
    resolve_title_and_vassal_change = scope:ddm_reclaim_change_freed
}

ddm_reclaim_non_dynastic_titles_effect = {
    # Explicit reclamation is ownership-only. Returned estates remain in the Crown's hands until the
    # player separately orders Settle the Realm.
    ddm_reclaim_unprotected_outsider_titles_only_effect = yes
    ddm_prepare_outsider_holdings_effect = yes
    ddm_prepare_dashboard_effect = yes
}

ddm_strip_subject_titles_in_realm_effect = {
    # Run from purge subject. Only titles in actor's subrealm and below actor rank are reclaimed.
    save_scope_as = ddm_purge_subject
    if = {
        limit = { is_landed = yes is_vassal_or_below_of = scope:ddm_actor }
        create_title_and_vassal_change = { type = returned save_scope_as = ddm_strip_change add_claim_on_loss = yes }
        every_held_title = {
            limit = { tier >= tier_county tier < scope:ddm_actor.highest_held_title_tier }
            change_title_holder = { holder = scope:ddm_actor change = scope:ddm_strip_change government_base = scope:ddm_actor }
        }
        resolve_title_and_vassal_change = scope:ddm_strip_change
    }
}

ddm_apply_purge_to_subject_effect = {
    # Run from purge subject. Every living age can be targeted; age is already handled in scoring. Count
    # the order before a lethal effect invalidates the subject scope.
    scope:ddm_actor = { change_variable = { name = ddm_last_purged add = 1 } }
    if = {
        limit = { scope:ddm_actor.var:ddm_purge_method = 1 }
        if = { limit = { NOT = { has_trait = disinherited } } add_trait = disinherited }
    }
    else_if = {
        limit = { scope:ddm_actor.var:ddm_purge_method = 2 }
        ddm_strip_subject_titles_in_realm_effect = yes
        if = { limit = { NOT = { has_trait = disinherited } } add_trait = disinherited }
    }
    else = {
        ddm_strip_subject_titles_in_realm_effect = yes
        death = { death_reason = death_execution killer = scope:ddm_actor }
    }
}

ddm_build_purge_register_effect = {
    # Build one exact, stable list. The preview and the execution use the same character flags, so
    # family-regard recalculation cannot make the displayed count silently vanish when the player
    # confirms the order.
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor

    # Family regard is intentionally refreshed here, once, before the register is built. The execution
    # does not recalculate it again mid-purge.
    ddm_refresh_all_dynasty_regard_effect = yes

    set_variable = { name = ddm_purge_living_total value = 0 }
    set_variable = { name = ddm_purge_candidate_count value = 0 }
    set_variable = { name = ddm_purge_standard_survivor_count value = 0 }
    set_variable = { name = ddm_purge_protected_count value = 0 }
    set_variable = { name = ddm_purge_already_satisfied_count value = 0 }

    dynasty = {
        every_dynasty_member = {
            limit = { is_alive = yes }
            remove_character_flag = ddm_selected_for_review
            remove_character_flag = ddm_processed_this_review
            scope:ddm_actor = { change_variable = { name = ddm_purge_living_total add = 1 } }

            # The standard is a score band, not a named-trait gate. Count everyone who clears it so the
            # audit can be reconciled with the candidate list.
            if = {
                limit = { NOT = { ddm_fails_current_dynastic_standard_trigger = yes } }
                scope:ddm_actor = { change_variable = { name = ddm_purge_standard_survivor_count add = 1 } }
            }

            # Track exclusions separately from people who actually meet the standard, so the UI can
            # explain a surprising total.
            if = {
                limit = {
                    OR = {
                        this = scope:ddm_actor
                        has_character_flag = ddm_protected_from_automation
                        AND = {
                            scope:ddm_actor.var:ddm_protect_player_heir = 1
                            exists = scope:ddm_actor.player_heir
                            this = scope:ddm_actor.player_heir
                        }
                    }
                }
                scope:ddm_actor = { change_variable = { name = ddm_purge_protected_count add = 1 } }
            }
            else_if = {
                limit = {
                    ddm_fails_current_dynastic_standard_trigger = yes
                    NOT = { ddm_purge_needs_action_trigger = yes }
                }
                scope:ddm_actor = { change_variable = { name = ddm_purge_already_satisfied_count add = 1 } }
            }

            if = {
                limit = { ddm_purge_needs_action_trigger = yes }
                add_character_flag = ddm_selected_for_review
                scope:ddm_actor = { change_variable = { name = ddm_purge_candidate_count add = 1 } }
            }
        }
    }
    set_variable = { name = ddm_purge_register_ready value = 1 }
}

ddm_count_purge_targets_effect = {
    # Compatibility wrapper used by older event calls.
    ddm_build_purge_register_effect = yes
}

ddm_execute_dynasty_purge_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    set_variable = { name = ddm_last_purged value = 0 }
    set_variable = { name = ddm_purge_stalled value = 0 }

    dynasty = {
        every_dynasty_member = {
            limit = {
                is_alive = yes
                has_character_flag = ddm_selected_for_review
                NOT = { has_character_flag = ddm_processed_this_review }
            }
            if = {
                limit = { scope:ddm_actor = { ddm_dynasty_above_floor_trigger = yes } }
                add_character_flag = ddm_processed_this_review
                ddm_apply_purge_to_subject_effect = yes
                # Nonlethal subjects survive, so remove their register flag after their consequence has
                # actually been applied.
                if = { limit = { is_alive = yes } remove_character_flag = ddm_selected_for_review }
            }
        }
    }

    # Anything still selected can only be a floor-stopped target or an engine failure. Distinguish those
    # cases without a fragile nested-scope counter.
    if = {
        limit = {
            dynasty = {
                any_dynasty_member = {
                    is_alive = yes
                    has_character_flag = ddm_selected_for_review
                    NOT = { has_character_flag = ddm_processed_this_review }
                }
            }
            ddm_dynasty_above_floor_trigger = yes
        }
        set_variable = { name = ddm_purge_stalled value = 1 }
    }

    ddm_distribute_surplus_counties_effect = yes
}

ddm_run_full_settlement_effect = {
    # outsider reclamation remains opt-in. Policy 0 preserves the legacy invariant completely; policy 1
    # first returns only unprotected outsider estates, after which the normal dynastic allocator settles
    # the surplus.
    ddm_initialize_settings_effect = yes
    if = {
        limit = { var:ddm_outsider_policy = 1 }
        ddm_reclaim_unprotected_outsider_titles_only_effect = yes
    }
    ddm_distribute_surplus_counties_effect = yes
}


# ---------- audits, succession, military advice, and construction ----------

ddm_prepare_domain_preview_effect = {
    ddm_prepare_dashboard_effect = yes
    save_scope_as = ddm_actor
    clear_saved_scope = ddm_title
    clear_saved_scope = ddm_recipient
    clear_saved_scope = ddm_preview_best_heir
    clear_saved_scope = ddm_preview_second_heir
    clear_saved_scope = ddm_preview_next_barony
    clear_saved_scope = ddm_preview_next_county

    set_variable = { name = ddm_preview_surplus value = domain_size }
    change_variable = { name = ddm_preview_surplus subtract = var:ddm_protected_domain_target }
    if = {
        limit = { var:ddm_preview_surplus < 0 }
        set_variable = { name = ddm_preview_surplus value = 0 }
    }
    set_variable = { name = ddm_preview_hard_blocked_holdings value = 0 }
    set_variable = { name = ddm_preview_foreign_heir_risk value = 0 }
    set_variable = { name = ddm_preview_partition_heirs value = 0 }

    # Preview uses the same concrete recipient-list builder as execution so both paths evaluate the same
    # target universe and scoring assumptions.
    dynasty = {
        every_dynasty_member = {
            remove_variable = ddm_batch_land_grants
            remove_character_flag = ddm_partition_settlement_pool
        }
    }
    ddm_v18_build_recipient_lists_effect = yes
    set_variable = { name = ddm_preview_partition_heirs value = var:ddm_last_partition_heirs_available }
    set_variable = { name = ddm_dash_safe_county_recipients value = var:ddm_last_general_recipients_available }

    if = {
        limit = { var:ddm_preview_partition_heirs > 0 }
        ordered_in_list = {
            list = ddm_v18_partition_pool
            limit = { ddm_is_eligible_land_recipient_trigger = yes }
            order_by = ddm_v18_land_recipient_score
            position = 0
            check_range_bounds = no
            save_scope_as = ddm_preview_best_heir
        }
        ordered_in_list = {
            list = ddm_v18_partition_pool
            limit = { ddm_is_eligible_land_recipient_trigger = yes }
            order_by = ddm_v18_land_recipient_score
            position = 1
            check_range_bounds = no
            save_scope_as = ddm_preview_second_heir
        }
    }

    every_held_title = {
        if = {
            limit = {
                OR = {
                    tier = tier_county
                    AND = { tier = tier_barony is_capital_barony = no }
                }
                ddm_title_is_hard_protected_core_trigger = yes
            }
            scope:ddm_actor = { change_variable = { name = ddm_preview_hard_blocked_holdings add = 1 } }
        }
    }

    dynasty = {
        every_dynasty_member = {
            limit = {
                is_alive = yes
                is_landed = yes
                ddm_is_in_actor_realm_trigger = yes
                exists = primary_heir
                primary_heir = {
                    is_landed = yes
                    NOT = { ddm_is_in_actor_realm_trigger = yes }
                }
            }
            scope:ddm_actor = { change_variable = { name = ddm_preview_foreign_heir_risk add = 1 } }
        }
    }

    # Title preview remains an advisory ordering only. The manual KEEP/GIVE/ DELEGATE classifications
    # determine whether a title is in this pool at all.
    ordered_held_title = {
        limit = { ddm_barony_can_be_distributed_trigger = yes }
        order_by = ddm_v18_title_shed_priority
        position = 0
        check_range_bounds = no
        save_scope_as = ddm_preview_next_barony
    }
    ordered_held_title = {
        limit = { ddm_county_can_be_distributed_trigger = yes }
        order_by = ddm_v18_title_shed_priority
        position = 0
        check_range_bounds = no
        save_scope_as = ddm_preview_next_county
    }

            dynasty = {
        every_dynasty_member = {
            remove_character_flag = ddm_partition_settlement_pool
            remove_variable = ddm_batch_land_grants
        }
    }
}

ddm_prepare_succession_briefing_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    clear_saved_scope = ddm_succession_heir_1
    clear_saved_scope = ddm_succession_heir_2
    clear_saved_scope = ddm_succession_heir_3
    set_variable = { name = ddm_succession_heir_count value = 0 }
    set_variable = { name = ddm_partition_secondary_heirs value = 0 }
    set_variable = { name = ddm_primary_heir_expected_titles value = 0 }
    set_variable = { name = ddm_second_heir_expected_titles value = 0 }
    set_variable = { name = ddm_third_heir_expected_titles value = 0 }

    every_heir = {
        scope:ddm_actor = { change_variable = { name = ddm_succession_heir_count add = 1 } }
        if = { limit = { NOT = { is_primary_heir_of = scope:ddm_actor } } scope:ddm_actor = { change_variable = { name = ddm_partition_secondary_heirs add = 1 } } }
    }

    if = { limit = { var:ddm_succession_heir_count >= 1 } ordered_heir = { position = 0 check_range_bounds = yes save_scope_as = ddm_succession_heir_1 } }
    if = { limit = { var:ddm_succession_heir_count >= 2 } ordered_heir = { position = 1 check_range_bounds = yes save_scope_as = ddm_succession_heir_2 } }
    if = { limit = { var:ddm_succession_heir_count >= 3 } ordered_heir = { position = 2 check_range_bounds = yes save_scope_as = ddm_succession_heir_3 } }

    every_held_title = {
        limit = { tier >= tier_county exists = current_heir }
        if = { limit = { exists = scope:ddm_succession_heir_1 current_heir = scope:ddm_succession_heir_1 } scope:ddm_actor = { change_variable = { name = ddm_primary_heir_expected_titles add = 1 } } }
        if = { limit = { exists = scope:ddm_succession_heir_2 current_heir = scope:ddm_succession_heir_2 } scope:ddm_actor = { change_variable = { name = ddm_second_heir_expected_titles add = 1 } } }
        if = { limit = { exists = scope:ddm_succession_heir_3 current_heir = scope:ddm_succession_heir_3 } scope:ddm_actor = { change_variable = { name = ddm_third_heir_expected_titles add = 1 } } }
    }
}

ddm_post_succession_cleanup_effect = {
    ddm_initialize_settings_effect = yes
    ddm_run_full_settlement_effect = yes
    ddm_prepare_succession_briefing_effect = yes
}


ddm_refresh_domain_planner_counts_effect = {
    save_scope_as = ddm_actor
    set_variable = { name = ddm_planner_selected_count value = 0 }
    set_variable = { name = ddm_planner_total_count value = 0 }
    set_variable = { name = ddm_planner_target_count value = domain_limit }
    if = { limit = { domain_size < var:ddm_planner_target_count } set_variable = { name = ddm_planner_target_count value = domain_size } }
    every_held_title = {
        limit = {
            OR = {
                tier = tier_county
                AND = { tier = tier_barony is_capital_barony = no }
            }
        }
        scope:ddm_actor = { change_variable = { name = ddm_planner_total_count add = 1 } }
        if = { limit = { has_variable = ddm_manual_core } scope:ddm_actor = { change_variable = { name = ddm_planner_selected_count add = 1 } } }
    }
}

ddm_cleanup_domain_planner_metadata_effect = {
    clear_variable_list = ddm_domain_planner_titles
    clear_variable_list = ddm_domain_planner_titles_raw
    every_held_title = {
        remove_variable = ddm_planner_original_core
        remove_variable = ddm_planner_recommended
        remove_variable = ddm_planner_maa
        remove_variable = ddm_planner_special
        remove_variable = ddm_planner_capital_duchy
    }
}

# Reconcile the live Crown Estate without changing the player's saved Keep/Give/Delegate orders.
# Domain-limit changes alone never invalidate a saved estate. If a protected title was lost, the target
# shrinks to the protected titles that still exist; newly acquired unclassified holdings are handled by
# the planner separately.
ddm_reconcile_saved_crown_estate_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    ddm_mark_capital_as_explicit_core_effect = yes
    set_variable = { name = ddm_live_manual_core_count value = 0 }
    every_held_title = {
        limit = {
            has_variable = ddm_manual_core
            OR = {
                tier = tier_county
                AND = { tier = tier_barony is_capital_barony = no }
            }
        }
        scope:ddm_actor = { change_variable = { name = ddm_live_manual_core_count add = 1 } }
    }
    if = {
        limit = { var:ddm_live_manual_core_count < 1 exists = capital_county }
        capital_county = { set_variable = ddm_manual_core }
        set_variable = { name = ddm_live_manual_core_count value = 1 }
    }
    set_variable = { name = ddm_protected_domain_target value = var:ddm_live_manual_core_count }
    if = { limit = { var:ddm_protected_domain_target < 1 } set_variable = { name = ddm_protected_domain_target value = 1 } }
    # Keep this as a snapshot for diagnostics only; it no longer forces a saved estate to be discarded.
    set_variable = { name = ddm_domain_plan_limit value = domain_limit }
    remove_variable = ddm_live_manual_core_count
}

ddm_prepare_domain_planner_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    ddm_refresh_adaptive_domain_core_effect = yes
    clear_variable_list = ddm_domain_planner_titles
    clear_variable_list = ddm_domain_planner_titles_raw

    every_held_title = {
        limit = {
            OR = {
                tier = tier_county
                AND = { tier = tier_barony is_capital_barony = no }
            }
        }
        remove_variable = ddm_planner_original_core
        remove_variable = ddm_planner_recommended
        remove_variable = ddm_planner_maa
        remove_variable = ddm_planner_special
        remove_variable = ddm_planner_capital_duchy
        if = { limit = { has_variable = ddm_manual_core } set_variable = ddm_planner_original_core }
        if = { limit = { has_variable = ddm_auto_core } set_variable = ddm_planner_recommended }
        if = { limit = { title_province = { has_stationed_regiment = yes } } set_variable = ddm_planner_maa }
        if = { limit = { title_province = { has_special_building = yes } } set_variable = ddm_planner_special }
        if = {
            limit = {
                tier = tier_county
                exists = scope:ddm_actor.capital_county.de_jure_liege
                de_jure_liege = scope:ddm_actor.capital_county.de_jure_liege
            }
            set_variable = ddm_planner_capital_duchy
        }
    }

    every_held_title = {
        limit = {
            OR = {
                tier = tier_county
                AND = { tier = tier_barony is_capital_barony = no }
            }
        }
        root = {
            add_to_variable_list = {
                name = ddm_domain_planner_titles_raw
                target = prev
            }
        }
    }

    ddm_rebuild_domain_planner_sort_effect = yes
    ddm_mark_capital_as_explicit_core_effect = yes
    ddm_refresh_domain_planner_counts_effect = yes
    set_variable = { name = ddm_show_domain_planner value = 1 }
    set_variable = { name = ddm_ui_page value = flag:estate }
}

ddm_cancel_domain_planner_effect = {
    save_scope_as = ddm_actor
    every_held_title = {
        limit = {
            OR = {
                tier = tier_county
                AND = { tier = tier_barony is_capital_barony = no }
            }
        }
        remove_variable = ddm_manual_core
        if = { limit = { has_variable = ddm_planner_original_core } set_variable = ddm_manual_core }
    }
    ddm_mark_capital_as_explicit_core_effect = yes
    remove_variable = ddm_show_domain_planner
    remove_variable = ddm_pending_domain_action
    ddm_cleanup_domain_planner_metadata_effect = yes
    ddm_prepare_dashboard_effect = yes
}

ddm_apply_office_core_recommendation_v19_effect = {
    save_scope_as = ddm_actor
    ddm_refresh_adaptive_domain_core_effect = yes
    every_held_title = {
        limit = {
            OR = {
                tier = tier_county
                AND = { tier = tier_barony is_capital_barony = no }
            }
        }
        remove_variable = ddm_manual_core
        if = { limit = { has_variable = ddm_auto_core } set_variable = ddm_manual_core }
    }
    ddm_mark_capital_as_explicit_core_effect = yes
    ddm_refresh_domain_planner_counts_effect = yes
}

ddm_apply_maa_core_preset_v19_effect = {
    every_held_title = {
        limit = {
            OR = {
                AND = { tier = tier_county title_province = { has_stationed_regiment = yes } }
                AND = { tier = tier_barony is_capital_barony = no title_province = { has_stationed_regiment = yes } }
            }
        }
        set_variable = ddm_manual_core
    }
    ddm_mark_capital_as_explicit_core_effect = yes
    ddm_refresh_domain_planner_counts_effect = yes
}

ddm_apply_capital_duchy_core_preset_v19_effect = {
    save_scope_as = ddm_actor
    if = {
        limit = { exists = capital_county.de_jure_liege }
        every_held_title = {
            limit = { tier = tier_county de_jure_liege = scope:ddm_actor.capital_county.de_jure_liege }
            set_variable = ddm_manual_core
        }
    }
    ddm_mark_capital_as_explicit_core_effect = yes
    ddm_refresh_domain_planner_counts_effect = yes
}

ddm_clear_core_selection_v19_effect = {
    every_held_title = {
        limit = {
            OR = {
                tier = tier_county
                AND = { tier = tier_barony is_capital_barony = no }
            }
        }
        remove_variable = ddm_manual_core
    }
    ddm_mark_capital_as_explicit_core_effect = yes
    ddm_refresh_domain_planner_counts_effect = yes
}

ddm_confirm_domain_planner_effect = {
    save_scope_as = ddm_actor
    every_held_title = {
        limit = {
            OR = {
                tier = tier_county
                AND = { tier = tier_barony is_capital_barony = no }
            }
        }
        remove_variable = ddm_manual_neutral
        if = { limit = { has_variable = ddm_manual_core } remove_variable = ddm_manual_shed }
        else = { set_variable = ddm_manual_shed }
    }
    ddm_mark_capital_as_explicit_core_effect = yes
    set_variable = { name = ddm_domain_plan_limit value = domain_limit }
    set_variable = { name = ddm_protected_domain_target value = var:ddm_planner_selected_count }
    if = { limit = { var:ddm_protected_domain_target < 1 } set_variable = { name = ddm_protected_domain_target value = 1 } }
    remove_variable = ddm_show_domain_planner
    ddm_cleanup_domain_planner_metadata_effect = yes

    if = {
        limit = { has_variable = ddm_pending_domain_action var:ddm_pending_domain_action > 0 }
        remove_variable = ddm_pending_domain_action
        if = { limit = { var:ddm_outsider_policy = 1 } ddm_reclaim_unprotected_outsider_titles_only_effect = yes }
        ddm_distribute_surplus_counties_effect = yes
        set_variable = { name = ddm_ui_records_mode value = 2 }
        set_variable = { name = ddm_ui_page value = flag:records }
    }
    else = {
        remove_variable = ddm_pending_domain_action
        set_variable = { name = ddm_ui_page value = flag:overview }
    }
    ddm_prepare_dashboard_effect = yes
}


# Allocation preview uses the exact live candidate and title lists, then simulates only the fairness
# counters. No title actually changes holder.
ddm_prepare_allocation_preview_effect = {
    ddm_hier_scan_warnings_effect = yes

    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    clear_saved_scope = ddm_title
    clear_saved_scope = ddm_recipient
    clear_saved_scope = ddm_preview_recipient_1
    clear_saved_scope = ddm_preview_recipient_2
    clear_saved_scope = ddm_preview_recipient_3
    clear_variable_list = ddm_preview_grant_titles
    every_held_title = { remove_variable = ddm_preview_recipient }

    dynasty = {
        every_dynasty_member = {
            remove_variable = ddm_batch_land_grants
            remove_variable = ddm_preview_projected_grants
            remove_variable = ddm_preview_quality
            remove_variable = ddm_preview_merit
            remove_variable = ddm_preview_loyalty
            remove_variable = ddm_preview_family
            remove_character_flag = ddm_partition_settlement_pool
        }
    }
    every_vassal_or_below = {
        remove_variable = ddm_batch_land_grants
        remove_variable = ddm_preview_projected_grants
        remove_variable = ddm_preview_quality
        remove_variable = ddm_preview_merit
        remove_variable = ddm_preview_loyalty
        remove_variable = ddm_preview_family
    }

    set_variable = { name = ddm_preview_surplus value = domain_size }
    change_variable = { name = ddm_preview_surplus subtract = var:ddm_protected_domain_target }
    if = { limit = { var:ddm_preview_surplus < 0 } set_variable = { name = ddm_preview_surplus value = 0 } }
    set_variable = { name = ddm_preview_allocated value = 0 }

    ddm_v18_build_recipient_lists_effect = yes
    ddm_v18_build_surplus_title_list_effect = yes

    # Mirror execution: rank the whole eligible dynasty and use the same title-specific rightfulness
    # chooser. No quota or batch concentration cap.
    ddm_rank_dynasty_effect = yes

    while = {
        limit = {
            var:ddm_preview_allocated < var:ddm_preview_surplus
            any_in_list = { list = ddm_v18_surplus_titles count >= 1 }
        }
        clear_saved_scope = ddm_title
        clear_saved_scope = ddm_recipient
        remove_variable = ddm_found_title
        remove_variable = ddm_found_recipient

        ordered_in_list = {
            list = ddm_v18_surplus_titles
            limit = { holder = scope:ddm_actor }
            order_by = ddm_v18_title_shed_priority
            position = 0
            check_range_bounds = no
            save_scope_as = ddm_title
            scope:ddm_actor = { set_variable = { name = ddm_found_title value = 1 } }
        }
        if = { limit = { has_variable = ddm_found_title } ddm_v18_choose_recipient_effect = yes }
        if = {
            limit = { has_variable = ddm_found_recipient exists = scope:ddm_recipient exists = scope:ddm_title }
            scope:ddm_recipient = {
                if = { limit = { NOT = { has_variable = ddm_batch_land_grants } } set_variable = { name = ddm_batch_land_grants value = 0 } }
                change_variable = { name = ddm_batch_land_grants add = 1 }
                if = { limit = { NOT = { has_variable = ddm_preview_projected_grants } } set_variable = { name = ddm_preview_projected_grants value = 0 } }
                change_variable = { name = ddm_preview_projected_grants add = 1 }
            }
            change_variable = { name = ddm_preview_allocated add = 1 }
            scope:ddm_title = {
                set_variable = { name = ddm_preview_recipient value = scope:ddm_recipient }
                remove_from_list = ddm_v18_surplus_titles
            }
            add_to_variable_list = { name = ddm_preview_grant_titles target = scope:ddm_title }
        }
    }

    # Cache transparent score components across the actual active recipient pool.
    every_in_list = {
        list = ddm_v18_recipient_pool
        limit = { has_character_flag = ddm_rightful_pool }
        set_variable = { name = ddm_preview_quality value = ddm_quality_trait_value }
        set_variable = { name = ddm_preview_merit value = ddm_governance_merit_value }
        set_variable = { name = ddm_preview_loyalty value = ddm_loyalty_value }
        if = { limit = { has_variable = ddm_family_regard } set_variable = { name = ddm_preview_family value = var:ddm_family_regard } }
        else = { set_variable = { name = ddm_preview_family value = 0 } }
    }

    ordered_in_list = { list = ddm_v18_recipient_pool limit = { has_character_flag = ddm_rightful_pool } order_by = ddm_preview_projected_grant_rank position = 0 check_range_bounds = no save_scope_as = ddm_preview_recipient_1 }
    ordered_in_list = { list = ddm_v18_recipient_pool limit = { has_character_flag = ddm_rightful_pool } order_by = ddm_preview_projected_grant_rank position = 1 check_range_bounds = yes save_scope_as = ddm_preview_recipient_2 }
    ordered_in_list = { list = ddm_v18_recipient_pool limit = { has_character_flag = ddm_rightful_pool } order_by = ddm_preview_projected_grant_rank position = 2 check_range_bounds = yes save_scope_as = ddm_preview_recipient_3 }

    # Mirror top-three numeric components onto the ruler for stable event loc.
    set_variable = { name = ddm_preview_r1_grants value = 0 }
    set_variable = { name = ddm_preview_r1_quality value = 0 }
    set_variable = { name = ddm_preview_r1_merit value = 0 }
    set_variable = { name = ddm_preview_r1_loyalty value = 0 }
    set_variable = { name = ddm_preview_r1_family value = 0 }
    set_variable = { name = ddm_preview_r2_grants value = 0 }
    set_variable = { name = ddm_preview_r2_quality value = 0 }
    set_variable = { name = ddm_preview_r2_merit value = 0 }
    set_variable = { name = ddm_preview_r2_loyalty value = 0 }
    set_variable = { name = ddm_preview_r2_family value = 0 }
    set_variable = { name = ddm_preview_r3_grants value = 0 }
    set_variable = { name = ddm_preview_r3_quality value = 0 }
    set_variable = { name = ddm_preview_r3_merit value = 0 }
    set_variable = { name = ddm_preview_r3_loyalty value = 0 }
    set_variable = { name = ddm_preview_r3_family value = 0 }

    if = {
        limit = { exists = scope:ddm_preview_recipient_1 }
        if = { limit = { scope:ddm_preview_recipient_1 = { has_variable = ddm_preview_projected_grants } } set_variable = { name = ddm_preview_r1_grants value = scope:ddm_preview_recipient_1.var:ddm_preview_projected_grants } }
        set_variable = { name = ddm_preview_r1_quality value = scope:ddm_preview_recipient_1.var:ddm_preview_quality }
        set_variable = { name = ddm_preview_r1_merit value = scope:ddm_preview_recipient_1.var:ddm_preview_merit }
        set_variable = { name = ddm_preview_r1_loyalty value = scope:ddm_preview_recipient_1.var:ddm_preview_loyalty }
        set_variable = { name = ddm_preview_r1_family value = scope:ddm_preview_recipient_1.var:ddm_preview_family }
    }
    if = {
        limit = { exists = scope:ddm_preview_recipient_2 }
        if = { limit = { scope:ddm_preview_recipient_2 = { has_variable = ddm_preview_projected_grants } } set_variable = { name = ddm_preview_r2_grants value = scope:ddm_preview_recipient_2.var:ddm_preview_projected_grants } }
        set_variable = { name = ddm_preview_r2_quality value = scope:ddm_preview_recipient_2.var:ddm_preview_quality }
        set_variable = { name = ddm_preview_r2_merit value = scope:ddm_preview_recipient_2.var:ddm_preview_merit }
        set_variable = { name = ddm_preview_r2_loyalty value = scope:ddm_preview_recipient_2.var:ddm_preview_loyalty }
        set_variable = { name = ddm_preview_r2_family value = scope:ddm_preview_recipient_2.var:ddm_preview_family }
    }
    if = {
        limit = { exists = scope:ddm_preview_recipient_3 }
        if = { limit = { scope:ddm_preview_recipient_3 = { has_variable = ddm_preview_projected_grants } } set_variable = { name = ddm_preview_r3_grants value = scope:ddm_preview_recipient_3.var:ddm_preview_projected_grants } }
        set_variable = { name = ddm_preview_r3_quality value = scope:ddm_preview_recipient_3.var:ddm_preview_quality }
        set_variable = { name = ddm_preview_r3_merit value = scope:ddm_preview_recipient_3.var:ddm_preview_merit }
        set_variable = { name = ddm_preview_r3_loyalty value = scope:ddm_preview_recipient_3.var:ddm_preview_loyalty }
        set_variable = { name = ddm_preview_r3_family value = scope:ddm_preview_recipient_3.var:ddm_preview_family }
    }

    dynasty = {
        every_dynasty_member = {
            remove_variable = ddm_batch_land_grants
            remove_character_flag = ddm_partition_settlement_pool
        }
    }
    every_vassal_or_below = { remove_variable = ddm_batch_land_grants }
    remove_variable = ddm_batch_grant_cap
    ddm_clear_dynasty_ranking_effect = yes
}

ddm_prepare_military_advice_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor

    # Small live diagnostic used by the Grand Capitulation requirement display.
    set_variable = { name = ddm_cap_ui_kingdom_count value = 0 }
    every_held_title = {
        limit = { tier = tier_kingdom }
        scope:ddm_actor = { change_variable = { name = ddm_cap_ui_kingdom_count add = 1 } }
    }

    set_variable = { name = ddm_maa_personal_regiment_count value = 0 }
    every_maa_regiment = {
        limit = { is_personal_maa_regiment = yes }
        scope:ddm_actor = { change_variable = { name = ddm_maa_personal_regiment_count add = 1 } }
    }

    # Presence flags. These deliberately use base types rather than literal MaA keys so the same code
    # works when the player changes culture.
    set_variable = { name = ddm_has_skirmishers value = 0 }
    set_variable = { name = ddm_has_archers value = 0 }
    set_variable = { name = ddm_has_pikemen value = 0 }
    set_variable = { name = ddm_has_heavy_infantry value = 0 }
    set_variable = { name = ddm_has_light_cavalry value = 0 }
    set_variable = { name = ddm_has_heavy_cavalry value = 0 }
    set_variable = { name = ddm_has_archer_cavalry value = 0 }
    set_variable = { name = ddm_has_camel_cavalry value = 0 }
    set_variable = { name = ddm_has_elephant_cavalry value = 0 }
    set_variable = { name = ddm_has_gunpowder value = 0 }
    set_variable = { name = ddm_has_siege value = 0 }

    if = { limit = { number_maa_regiments_of_base_type = { type = skirmishers value >= 1 } } set_variable = { name = ddm_has_skirmishers value = 1 } }
    if = { limit = { number_maa_regiments_of_base_type = { type = archers value >= 1 } } set_variable = { name = ddm_has_archers value = 1 } }
    if = { limit = { number_maa_regiments_of_base_type = { type = pikemen value >= 1 } } set_variable = { name = ddm_has_pikemen value = 1 } }
    if = { limit = { number_maa_regiments_of_base_type = { type = heavy_infantry value >= 1 } } set_variable = { name = ddm_has_heavy_infantry value = 1 } }
    if = { limit = { number_maa_regiments_of_base_type = { type = light_cavalry value >= 1 } } set_variable = { name = ddm_has_light_cavalry value = 1 } }
    if = { limit = { number_maa_regiments_of_base_type = { type = heavy_cavalry value >= 1 } } set_variable = { name = ddm_has_heavy_cavalry value = 1 } }
    if = { limit = { number_maa_regiments_of_base_type = { type = archer_cavalry value >= 1 } } set_variable = { name = ddm_has_archer_cavalry value = 1 } }
    if = { limit = { number_maa_regiments_of_base_type = { type = camel_cavalry value >= 1 } } set_variable = { name = ddm_has_camel_cavalry value = 1 } }
    if = { limit = { number_maa_regiments_of_base_type = { type = elephant_cavalry value >= 1 } } set_variable = { name = ddm_has_elephant_cavalry value = 1 } }
    if = { limit = { number_maa_regiments_of_base_type = { type = gunpowder value >= 1 } } set_variable = { name = ddm_has_gunpowder value = 1 } }
    if = { limit = { number_maa_regiments_of_base_type = { type = siege_weapon value >= 1 } } set_variable = { name = ddm_has_siege value = 1 } }

    set_variable = { name = ddm_synergy_archers value = counter_synergy_ai_weight_archers }
    set_variable = { name = ddm_synergy_pikemen value = counter_synergy_ai_weight_pikemen }
    set_variable = { name = ddm_synergy_heavy_infantry value = counter_synergy_ai_weight_heavy_infantry }
    set_variable = { name = ddm_synergy_light_cavalry value = counter_synergy_ai_weight_light_cavalry }
    set_variable = { name = ddm_synergy_crossbowmen value = counter_synergy_ai_weight_crossbowmen }
    set_variable = { name = ddm_synergy_gunpowder value = counter_synergy_ai_weight_gunpowder }

    # 11 = add Pike cover to Archer core
    # 12 = Archer core already covered; reinforce best Archer/cultural replacement
    # 20 = add Heavy Infantry cover to cavalry core
    # 30 = add Light Cavalry cover to skirmisher core
    # 40 = add Archer-family cover to Heavy Infantry core
    # 50 = late-game Gunpowder opportunity
    set_variable = { name = ddm_maa_roster_plan value = 99 }
    set_variable = { name = ddm_maa_recommendation value = 0 }

    if = {
        limit = {
            number_maa_regiments_of_base_type = { type = archers value >= 2 }
            number_maa_regiments_of_base_type = { type = pikemen value = 0 }
        }
        set_variable = { name = ddm_maa_roster_plan value = 11 }
        set_variable = { name = ddm_maa_recommendation value = 2 }
    }
    else_if = {
        limit = {
            var:ddm_synergy_pikemen > 0
            number_maa_regiments_of_base_type = { type = pikemen value = 0 }
        }
        set_variable = { name = ddm_maa_roster_plan value = 11 }
        set_variable = { name = ddm_maa_recommendation value = 2 }
    }
    else_if = {
        limit = {
            number_maa_regiments_of_base_type = { type = archers value >= 2 }
            number_maa_regiments_of_base_type = { type = pikemen value >= 1 }
        }
        set_variable = { name = ddm_maa_roster_plan value = 12 }
        set_variable = { name = ddm_maa_recommendation value = 1 }
    }
    else_if = {
        limit = {
            var:ddm_synergy_heavy_infantry > 0
            number_maa_regiments_of_base_type = { type = heavy_infantry value = 0 }
        }
        set_variable = { name = ddm_maa_roster_plan value = 20 }
        set_variable = { name = ddm_maa_recommendation value = 2 }
    }
    else_if = {
        limit = {
            OR = {
                AND = {
                    number_maa_regiments_of_base_type = { type = light_cavalry value >= 2 }
                    number_maa_regiments_of_base_type = { type = heavy_infantry value = 0 }
                }
                AND = {
                    number_maa_regiments_of_base_type = { type = heavy_cavalry value >= 2 }
                    number_maa_regiments_of_base_type = { type = heavy_infantry value = 0 }
                }
                AND = {
                    number_maa_regiments_of_base_type = { type = camel_cavalry value >= 2 }
                    number_maa_regiments_of_base_type = { type = heavy_infantry value = 0 }
                }
                AND = {
                    number_maa_regiments_of_base_type = { type = elephant_cavalry value >= 2 }
                    number_maa_regiments_of_base_type = { type = heavy_infantry value = 0 }
                }
            }
        }
        set_variable = { name = ddm_maa_roster_plan value = 20 }
        set_variable = { name = ddm_maa_recommendation value = 2 }
    }
    else_if = {
        limit = {
            var:ddm_synergy_light_cavalry > 0
            number_maa_regiments_of_base_type = { type = light_cavalry value = 0 }
        }
        set_variable = { name = ddm_maa_roster_plan value = 30 }
        set_variable = { name = ddm_maa_recommendation value = 3 }
    }
    else_if = {
        limit = {
            number_maa_regiments_of_base_type = { type = skirmishers value >= 2 }
            number_maa_regiments_of_base_type = { type = light_cavalry value = 0 }
        }
        set_variable = { name = ddm_maa_roster_plan value = 30 }
        set_variable = { name = ddm_maa_recommendation value = 3 }
    }
    else_if = {
        limit = {
            var:ddm_synergy_archers > 0
            number_maa_regiments_of_base_type = { type = archers value = 0 }
        }
        set_variable = { name = ddm_maa_roster_plan value = 40 }
        set_variable = { name = ddm_maa_recommendation value = 1 }
    }
    else_if = {
        limit = {
            var:ddm_synergy_gunpowder >= 200
        }
        set_variable = { name = ddm_maa_roster_plan value = 50 }
        set_variable = { name = ddm_maa_recommendation value = 0 }
    }
    else_if = {
        limit = {
            var:ddm_maa_personal_regiment_count >= 4
            var:ddm_has_siege = 0
        }
        set_variable = { name = ddm_maa_roster_plan value = 90 }
        set_variable = { name = ddm_maa_recommendation value = 0 }
    }
    else = {
        # Construction fallback follows what the ruler ACTUALLY fields rather than a fabricated doctrine
        # score.
        if = { limit = { var:ddm_has_archers = 1 } set_variable = { name = ddm_maa_recommendation value = 1 } }
        else_if = { limit = { OR = { var:ddm_has_heavy_infantry = 1 var:ddm_has_pikemen = 1 } } set_variable = { name = ddm_maa_recommendation value = 2 } }
        else_if = { limit = { OR = { var:ddm_has_light_cavalry = 1 var:ddm_has_heavy_cavalry = 1 var:ddm_has_archer_cavalry = 1 var:ddm_has_camel_cavalry = 1 var:ddm_has_elephant_cavalry = 1 } } set_variable = { name = ddm_maa_recommendation value = 3 } }
    }
}

ddm_reset_construction_report_effect = {
    set_variable = { name = ddm_last_buildings_constructed value = 0 }
    set_variable = { name = ddm_last_gold_spent value = 0 }
    set_variable = { name = ddm_last_build_skipped_no_slots value = 0 }
    set_variable = { name = ddm_last_build_skipped_budget value = 0 }
}

ddm_bulk_build_military_camps_effect = {
    ddm_initialize_settings_effect = yes
    ddm_reset_construction_report_effect = yes
    save_scope_as = ddm_actor
    every_directly_owned_province = {
        if = {
            limit = {
                free_building_slots > 0
                NOT = { has_building_or_higher = military_camps_01 }
                building_military_camps_requirement_terrain = yes
                building_requirement_castle_city_church = { LEVEL = 01 }
                building_requirement_tribal = no
            }
            if = {
                limit = { scope:ddm_actor = { ddm_available_construction_gold >= 100 } }
                add_building = military_camps_01
                scope:ddm_actor = { add_gold = { value = 100 multiply = -1 } change_variable = { name = ddm_last_gold_spent add = 100 } change_variable = { name = ddm_last_buildings_constructed add = 1 } }
            }
            else = { scope:ddm_actor = { change_variable = { name = ddm_last_build_skipped_budget add = 1 } } }
        }
        else_if = { limit = { free_building_slots <= 0 } scope:ddm_actor = { change_variable = { name = ddm_last_build_skipped_no_slots add = 1 } } }
    }
}

ddm_bulk_build_barracks_effect = {
    ddm_initialize_settings_effect = yes
    ddm_reset_construction_report_effect = yes
    save_scope_as = ddm_actor
    every_directly_owned_province = {
        if = {
            limit = {
                free_building_slots > 0
                NOT = { has_building_or_higher = barracks_01 }
                building_barracks_requirement_terrain = yes
                building_requirement_castle_city_church = { LEVEL = 01 }
                building_requirement_tribal = no
            }
            if = {
                limit = { scope:ddm_actor = { ddm_available_construction_gold >= 150 } }
                add_building = barracks_01
                scope:ddm_actor = { add_gold = { value = 150 multiply = -1 } change_variable = { name = ddm_last_gold_spent add = 150 } change_variable = { name = ddm_last_buildings_constructed add = 1 } }
            }
            else = { scope:ddm_actor = { change_variable = { name = ddm_last_build_skipped_budget add = 1 } } }
        }
        else_if = { limit = { free_building_slots <= 0 } scope:ddm_actor = { change_variable = { name = ddm_last_build_skipped_no_slots add = 1 } } }
    }
}

ddm_bulk_build_stables_effect = {
    ddm_initialize_settings_effect = yes
    ddm_reset_construction_report_effect = yes
    save_scope_as = ddm_actor
    every_directly_owned_province = {
        if = {
            limit = {
                free_building_slots > 0
                NOT = { has_building_or_higher = stables_01 }
                building_stables_requirement_terrain = yes
                building_requirement_castle_city_church = { LEVEL = 01 }
                building_requirement_tribal = no
            }
            if = {
                limit = { scope:ddm_actor = { ddm_available_construction_gold >= 150 } }
                add_building = stables_01
                scope:ddm_actor = { add_gold = { value = 150 multiply = -1 } change_variable = { name = ddm_last_gold_spent add = 150 } change_variable = { name = ddm_last_buildings_constructed add = 1 } }
            }
            else = { scope:ddm_actor = { change_variable = { name = ddm_last_build_skipped_budget add = 1 } } }
        }
        else_if = { limit = { free_building_slots <= 0 } scope:ddm_actor = { change_variable = { name = ddm_last_build_skipped_no_slots add = 1 } } }
    }
}

ddm_bulk_build_regimental_grounds_effect = {
    ddm_initialize_settings_effect = yes
    ddm_reset_construction_report_effect = yes
    save_scope_as = ddm_actor
    every_directly_owned_province = {
        if = {
            limit = {
                free_building_slots > 0
                NOT = { has_building_or_higher = regimental_grounds_01 }
                building_regimental_grounds_requirement_terrain = yes
                building_requirement_castle_city_church = { LEVEL = 01 }
                building_requirement_tribal = no
            }
            if = {
                limit = { scope:ddm_actor = { ddm_available_construction_gold >= 200 } }
                add_building = regimental_grounds_01
                scope:ddm_actor = { add_gold = { value = 200 multiply = -1 } change_variable = { name = ddm_last_gold_spent add = 200 } change_variable = { name = ddm_last_buildings_constructed add = 1 } }
            }
            else = { scope:ddm_actor = { change_variable = { name = ddm_last_build_skipped_budget add = 1 } } }
        }
        else_if = { limit = { free_building_slots <= 0 } scope:ddm_actor = { change_variable = { name = ddm_last_build_skipped_no_slots add = 1 } } }
    }
}

ddm_smart_maa_construction_effect = {
    ddm_initialize_settings_effect = yes
    ddm_prepare_military_advice_effect = yes
    ddm_reset_construction_report_effect = yes
    save_scope_as = ddm_actor

    every_directly_owned_province = {
        scope:ddm_actor = { remove_variable = ddm_smart_built_here }
        if = {
            limit = {
                free_building_slots > 0
                OR = { has_stationed_regiment_of_base_type = archers has_stationed_regiment_of_base_type = skirmishers }
                NOT = { has_building_or_higher = military_camps_01 }
                building_military_camps_requirement_terrain = yes
                building_requirement_castle_city_church = { LEVEL = 01 }
                building_requirement_tribal = no
                scope:ddm_actor = { ddm_available_construction_gold >= 100 }
            }
            add_building = military_camps_01
            scope:ddm_actor = { add_gold = { value = 100 multiply = -1 } change_variable = { name = ddm_last_gold_spent add = 100 } change_variable = { name = ddm_last_buildings_constructed add = 1 } set_variable = { name = ddm_smart_built_here value = 1 } }
        }
        if = {
            limit = {
                scope:ddm_actor = { NOT = { has_variable = ddm_smart_built_here } }
                free_building_slots > 0
                OR = { has_stationed_regiment_of_base_type = heavy_infantry has_stationed_regiment_of_base_type = pikemen }
                NOT = { has_building_or_higher = barracks_01 }
                building_barracks_requirement_terrain = yes
                building_requirement_castle_city_church = { LEVEL = 01 }
                building_requirement_tribal = no
                scope:ddm_actor = { ddm_available_construction_gold >= 150 }
            }
            add_building = barracks_01
            scope:ddm_actor = { add_gold = { value = 150 multiply = -1 } change_variable = { name = ddm_last_gold_spent add = 150 } change_variable = { name = ddm_last_buildings_constructed add = 1 } set_variable = { name = ddm_smart_built_here value = 1 } }
        }
        if = {
            limit = {
                scope:ddm_actor = { NOT = { has_variable = ddm_smart_built_here } }
                free_building_slots > 0
                OR = { has_stationed_regiment_of_base_type = light_cavalry has_stationed_regiment_of_base_type = heavy_cavalry has_stationed_regiment_of_base_type = archer_cavalry }
                NOT = { has_building_or_higher = stables_01 }
                building_stables_requirement_terrain = yes
                building_requirement_castle_city_church = { LEVEL = 01 }
                building_requirement_tribal = no
                scope:ddm_actor = { ddm_available_construction_gold >= 150 }
            }
            add_building = stables_01
            scope:ddm_actor = { add_gold = { value = 150 multiply = -1 } change_variable = { name = ddm_last_gold_spent add = 150 } change_variable = { name = ddm_last_buildings_constructed add = 1 } set_variable = { name = ddm_smart_built_here value = 1 } }
        }

        if = {
            limit = {
                scope:ddm_actor = { NOT = { has_variable = ddm_smart_built_here } var:ddm_maa_recommendation = 1 }
                free_building_slots > 0
                NOT = { has_building_or_higher = military_camps_01 }
                building_military_camps_requirement_terrain = yes
                building_requirement_castle_city_church = { LEVEL = 01 }
                building_requirement_tribal = no
                scope:ddm_actor = { ddm_available_construction_gold >= 100 }
            }
            add_building = military_camps_01
            scope:ddm_actor = { add_gold = { value = 100 multiply = -1 } change_variable = { name = ddm_last_gold_spent add = 100 } change_variable = { name = ddm_last_buildings_constructed add = 1 } set_variable = { name = ddm_smart_built_here value = 1 } }
        }
        if = {
            limit = {
                scope:ddm_actor = { NOT = { has_variable = ddm_smart_built_here } var:ddm_maa_recommendation = 2 }
                free_building_slots > 0
                NOT = { has_building_or_higher = barracks_01 }
                building_barracks_requirement_terrain = yes
                building_requirement_castle_city_church = { LEVEL = 01 }
                building_requirement_tribal = no
                scope:ddm_actor = { ddm_available_construction_gold >= 150 }
            }
            add_building = barracks_01
            scope:ddm_actor = { add_gold = { value = 150 multiply = -1 } change_variable = { name = ddm_last_gold_spent add = 150 } change_variable = { name = ddm_last_buildings_constructed add = 1 } set_variable = { name = ddm_smart_built_here value = 1 } }
        }
        if = {
            limit = {
                scope:ddm_actor = { NOT = { has_variable = ddm_smart_built_here } var:ddm_maa_recommendation = 3 }
                free_building_slots > 0
                NOT = { has_building_or_higher = stables_01 }
                building_stables_requirement_terrain = yes
                building_requirement_castle_city_church = { LEVEL = 01 }
                building_requirement_tribal = no
                scope:ddm_actor = { ddm_available_construction_gold >= 150 }
            }
            add_building = stables_01
            scope:ddm_actor = { add_gold = { value = 150 multiply = -1 } change_variable = { name = ddm_last_gold_spent add = 150 } change_variable = { name = ddm_last_buildings_constructed add = 1 } set_variable = { name = ddm_smart_built_here value = 1 } }
        }
        if = {
            limit = {
                scope:ddm_actor = { NOT = { has_variable = ddm_smart_built_here } var:ddm_maa_recommendation = 4 }
                free_building_slots > 0
                NOT = { has_building_or_higher = regimental_grounds_01 }
                building_regimental_grounds_requirement_terrain = yes
                building_requirement_castle_city_church = { LEVEL = 01 }
                building_requirement_tribal = no
                scope:ddm_actor = { ddm_available_construction_gold >= 200 }
            }
            add_building = regimental_grounds_01
            scope:ddm_actor = { add_gold = { value = 200 multiply = -1 } change_variable = { name = ddm_last_gold_spent add = 200 } change_variable = { name = ddm_last_buildings_constructed add = 1 } set_variable = { name = ddm_smart_built_here value = 1 } }
        }

        if = { limit = { free_building_slots <= 0 } scope:ddm_actor = { change_variable = { name = ddm_last_build_skipped_no_slots add = 1 } } }
        else_if = {
            limit = { scope:ddm_actor = { NOT = { has_variable = ddm_smart_built_here } } scope:ddm_actor = { ddm_available_construction_gold < 150 } }
            scope:ddm_actor = { change_variable = { name = ddm_last_build_skipped_budget add = 1 } }
        }
        scope:ddm_actor = { remove_variable = ddm_smart_built_here }
    }
}


ddm_build_outsider_page_effect = {
    if = { limit = { NOT = { has_variable = ddm_outsider_page } } set_variable = { name = ddm_outsider_page value = 0 } }
    clear_variable_list = ddm_outsider_page_list

    set_variable = { name = ddm_outsider_page_size value = 20 }
    set_variable = { name = ddm_outsider_page_total value = 0 }
    set_variable = { name = ddm_outsider_last_page value = 0 }
    set_variable = { name = ddm_outsider_page_fill value = 0 }

    if = {
        limit = { has_variable_list = ddm_outsider_counties }
        every_in_list = {
            variable = ddm_outsider_counties
            prev = {
                if = {
                    limit = { var:ddm_outsider_page_fill >= var:ddm_outsider_page_size }
                    change_variable = { name = ddm_outsider_last_page add = 1 }
                    set_variable = { name = ddm_outsider_page_fill value = 0 }
                }
                change_variable = { name = ddm_outsider_page_fill add = 1 }
                change_variable = { name = ddm_outsider_page_total add = 1 }
            }
        }
    }

    if = { limit = { var:ddm_outsider_page < 0 } set_variable = { name = ddm_outsider_page value = 0 } }
    if = { limit = { var:ddm_outsider_page > var:ddm_outsider_last_page } set_variable = { name = ddm_outsider_page value = var:ddm_outsider_last_page } }

    set_variable = { name = ddm_outsider_first value = var:ddm_outsider_page }
    change_variable = { name = ddm_outsider_first multiply = var:ddm_outsider_page_size }
    set_variable = { name = ddm_outsider_stop value = var:ddm_outsider_first }
    change_variable = { name = ddm_outsider_stop add = var:ddm_outsider_page_size }
    set_variable = { name = ddm_outsider_index value = 0 }

    if = {
        limit = { has_variable_list = ddm_outsider_counties }
        every_in_list = {
            variable = ddm_outsider_counties
            save_temporary_scope_as = ddm_outsider_page_row
            prev = {
                if = {
                    limit = { var:ddm_outsider_index >= var:ddm_outsider_first var:ddm_outsider_index < var:ddm_outsider_stop }
                    add_to_variable_list = { name = ddm_outsider_page_list target = scope:ddm_outsider_page_row }
                }
                change_variable = { name = ddm_outsider_index add = 1 }
            }
        }
    }

    set_variable = { name = ddm_outsider_shown_from value = var:ddm_outsider_first }
    change_variable = { name = ddm_outsider_shown_from add = 1 }
    set_variable = { name = ddm_outsider_shown_to value = var:ddm_outsider_stop }
    if = { limit = { var:ddm_outsider_shown_to > var:ddm_outsider_page_total } set_variable = { name = ddm_outsider_shown_to value = var:ddm_outsider_page_total } }
    if = { limit = { var:ddm_outsider_page_total = 0 } set_variable = { name = ddm_outsider_shown_from value = 0 } }
    set_variable = { name = ddm_outsider_page_display value = var:ddm_outsider_page }
    change_variable = { name = ddm_outsider_page_display add = 1 }
    set_variable = { name = ddm_outsider_pages_display value = var:ddm_outsider_last_page }
    change_variable = { name = ddm_outsider_pages_display add = 1 }
}

ddm_outsider_page_next_effect = { change_variable = { name = ddm_outsider_page add = 1 } ddm_build_outsider_page_effect = yes }
ddm_outsider_page_prev_effect = { change_variable = { name = ddm_outsider_page subtract = 1 } if = { limit = { var:ddm_outsider_page < 0 } set_variable = { name = ddm_outsider_page value = 0 } } ddm_build_outsider_page_effect = yes }
ddm_outsider_page_first_effect = { set_variable = { name = ddm_outsider_page value = 0 } ddm_build_outsider_page_effect = yes }


ddm_build_recipient_page_effect = {
    if = { limit = { NOT = { has_variable = ddm_recipient_page } } set_variable = { name = ddm_recipient_page value = 0 } }
    clear_variable_list = ddm_recipient_page_list

    set_variable = { name = ddm_recipient_page_size value = 20 }
    set_variable = { name = ddm_recipient_page_total value = 0 }
    set_variable = { name = ddm_recipient_last_page value = 0 }
    set_variable = { name = ddm_recipient_page_fill value = 0 }

    if = {
        limit = { has_variable_list = ddm_outsider_recipient_candidates }
        every_in_list = {
            variable = ddm_outsider_recipient_candidates
            prev = {
                if = {
                    limit = { var:ddm_recipient_page_fill >= var:ddm_recipient_page_size }
                    change_variable = { name = ddm_recipient_last_page add = 1 }
                    set_variable = { name = ddm_recipient_page_fill value = 0 }
                }
                change_variable = { name = ddm_recipient_page_fill add = 1 }
                change_variable = { name = ddm_recipient_page_total add = 1 }
            }
        }
    }

    if = { limit = { var:ddm_recipient_page < 0 } set_variable = { name = ddm_recipient_page value = 0 } }
    if = { limit = { var:ddm_recipient_page > var:ddm_recipient_last_page } set_variable = { name = ddm_recipient_page value = var:ddm_recipient_last_page } }

    set_variable = { name = ddm_recipient_first value = var:ddm_recipient_page }
    change_variable = { name = ddm_recipient_first multiply = var:ddm_recipient_page_size }
    set_variable = { name = ddm_recipient_stop value = var:ddm_recipient_first }
    change_variable = { name = ddm_recipient_stop add = var:ddm_recipient_page_size }
    set_variable = { name = ddm_recipient_index value = 0 }

    if = {
        limit = { has_variable_list = ddm_outsider_recipient_candidates }
        every_in_list = {
            variable = ddm_outsider_recipient_candidates
            save_temporary_scope_as = ddm_recipient_page_row
            prev = {
                if = {
                    limit = {
                        var:ddm_recipient_index >= var:ddm_recipient_first
                        var:ddm_recipient_index < var:ddm_recipient_stop
                    }
                    add_to_variable_list = { name = ddm_recipient_page_list target = scope:ddm_recipient_page_row }
                }
                change_variable = { name = ddm_recipient_index add = 1 }
            }
        }
    }

    set_variable = { name = ddm_recipient_shown_from value = var:ddm_recipient_first }
    change_variable = { name = ddm_recipient_shown_from add = 1 }
    set_variable = { name = ddm_recipient_shown_to value = var:ddm_recipient_stop }
    if = { limit = { var:ddm_recipient_shown_to > var:ddm_recipient_page_total } set_variable = { name = ddm_recipient_shown_to value = var:ddm_recipient_page_total } }
    if = { limit = { var:ddm_recipient_page_total = 0 } set_variable = { name = ddm_recipient_shown_from value = 0 } }
    set_variable = { name = ddm_recipient_page_display value = var:ddm_recipient_page }
    change_variable = { name = ddm_recipient_page_display add = 1 }
    set_variable = { name = ddm_recipient_pages_display value = var:ddm_recipient_last_page }
    change_variable = { name = ddm_recipient_pages_display add = 1 }
}

ddm_recipient_page_next_effect = { change_variable = { name = ddm_recipient_page add = 1 } ddm_build_recipient_page_effect = yes }
ddm_recipient_page_prev_effect = { change_variable = { name = ddm_recipient_page subtract = 1 } if = { limit = { var:ddm_recipient_page < 0 } set_variable = { name = ddm_recipient_page value = 0 } } ddm_build_recipient_page_effect = yes }
ddm_recipient_page_first_effect = { set_variable = { name = ddm_recipient_page value = 0 } ddm_build_recipient_page_effect = yes }


ddm_cache_one_dynasty_review_row_effect = {
    # scope:ddm_actor is the player. Run on the dynasty member.
    set_variable = { name = ddm_review_dynastic value = ddm_dynastic_value }
    set_variable = { name = ddm_review_quality value = ddm_quality_trait_value }
    set_variable = { name = ddm_review_merit value = ddm_governance_merit_value }
    set_variable = { name = ddm_review_safety value = ddm_loyalty_value }
    set_variable = { name = ddm_review_family value = 0 }
    if = { limit = { has_variable = ddm_family_regard } set_variable = { name = ddm_review_family value = var:ddm_family_regard } }
    set_variable = { name = ddm_review_land value = domain_size }
    set_variable = { name = ddm_review_age value = age }
}

ddm_build_dynasty_review_page_effect = {
    if = { limit = { NOT = { has_variable = ddm_review_page } } set_variable = { name = ddm_review_page value = 0 } }
    clear_variable_list = ddm_dynasty_review_page_list

    set_variable = { name = ddm_review_page_size value = 20 }
    set_variable = { name = ddm_review_total value = 0 }
    set_variable = { name = ddm_review_last_page value = 0 }
    set_variable = { name = ddm_review_page_fill value = 0 }

    if = {
        limit = { has_variable_list = ddm_dynasty_review_sorted }
        every_in_list = {
            variable = ddm_dynasty_review_sorted
            prev = {
                if = {
                    limit = { var:ddm_review_page_fill >= var:ddm_review_page_size }
                    change_variable = { name = ddm_review_last_page add = 1 }
                    set_variable = { name = ddm_review_page_fill value = 0 }
                }
                change_variable = { name = ddm_review_page_fill add = 1 }
                change_variable = { name = ddm_review_total add = 1 }
            }
        }
    }

    if = { limit = { var:ddm_review_page < 0 } set_variable = { name = ddm_review_page value = 0 } }
    if = { limit = { var:ddm_review_page > var:ddm_review_last_page } set_variable = { name = ddm_review_page value = var:ddm_review_last_page } }

    set_variable = { name = ddm_review_first value = var:ddm_review_page }
    change_variable = { name = ddm_review_first multiply = var:ddm_review_page_size }
    set_variable = { name = ddm_review_stop value = var:ddm_review_first }
    change_variable = { name = ddm_review_stop add = var:ddm_review_page_size }
    set_variable = { name = ddm_review_index value = 0 }

    if = {
        limit = { has_variable_list = ddm_dynasty_review_sorted }
        every_in_list = {
            variable = ddm_dynasty_review_sorted
            save_temporary_scope_as = ddm_review_page_row
            prev = {
                if = {
                    limit = { var:ddm_review_index >= var:ddm_review_first var:ddm_review_index < var:ddm_review_stop }
                    add_to_variable_list = { name = ddm_dynasty_review_page_list target = scope:ddm_review_page_row }
                }
                change_variable = { name = ddm_review_index add = 1 }
            }
        }
    }

    set_variable = { name = ddm_review_shown_from value = var:ddm_review_first }
    change_variable = { name = ddm_review_shown_from add = 1 }
    set_variable = { name = ddm_review_shown_to value = var:ddm_review_stop }
    if = { limit = { var:ddm_review_shown_to > var:ddm_review_total } set_variable = { name = ddm_review_shown_to value = var:ddm_review_total } }
    if = { limit = { var:ddm_review_total = 0 } set_variable = { name = ddm_review_shown_from value = 0 } }
    set_variable = { name = ddm_review_page_display value = var:ddm_review_page }
    change_variable = { name = ddm_review_page_display add = 1 }
    set_variable = { name = ddm_review_pages_display value = var:ddm_review_last_page }
    change_variable = { name = ddm_review_pages_display add = 1 }
}

ddm_prepare_dynasty_review_ui_effect = {
    ddm_initialize_settings_effect = yes
    save_scope_as = ddm_actor
    remove_variable = ddm_review_execute_armed

    ddm_build_purge_register_effect = yes
    clear_variable_list = ddm_dynasty_review_raw
    clear_variable_list = ddm_dynasty_review_sorted

    if = {
        limit = { exists = dynasty }
        dynasty = {
            every_dynasty_member = {
                limit = { is_alive = yes }
                ddm_cache_one_dynasty_review_row_effect = yes
                save_temporary_scope_as = ddm_review_member
                scope:ddm_actor = { add_to_variable_list = { name = ddm_dynasty_review_raw target = scope:ddm_review_member } }
            }
        }
    }

    if = {
        limit = { has_variable_list = ddm_dynasty_review_raw }
        ordered_in_list = {
            variable = ddm_dynasty_review_raw
            order_by = ddm_dynasty_review_sort_value
            max = 5000
            check_range_bounds = no
            save_temporary_scope_as = ddm_review_sorted_member
            scope:ddm_actor = { add_to_variable_list = { name = ddm_dynasty_review_sorted target = scope:ddm_review_sorted_member } }
        }
    }
    ddm_build_dynasty_review_page_effect = yes
}

ddm_dynasty_review_page_next_effect = { change_variable = { name = ddm_review_page add = 1 } ddm_build_dynasty_review_page_effect = yes }
ddm_dynasty_review_page_prev_effect = { change_variable = { name = ddm_review_page subtract = 1 } if = { limit = { var:ddm_review_page < 0 } set_variable = { name = ddm_review_page value = 0 } } ddm_build_dynasty_review_page_effect = yes }
ddm_dynasty_review_page_first_effect = { set_variable = { name = ddm_review_page value = 0 } ddm_build_dynasty_review_page_effect = yes }
