﻿# DDM 2.0 — Prime Education.
# This page is intentionally explicit: opening it is cheap; Generate Teachers performs the diplomatic-range
# search, stores only five winners, then discards the large transient candidate pool.

ddm_prime_clear_scan_effect = {
    remove_variable = ddm_prime_teacher_dip
    remove_variable = ddm_prime_teacher_mar
    remove_variable = ddm_prime_teacher_ste
    remove_variable = ddm_prime_teacher_int
    remove_variable = ddm_prime_teacher_lea
    remove_variable = ddm_prime_score_dip
    remove_variable = ddm_prime_score_mar
    remove_variable = ddm_prime_score_ste
    remove_variable = ddm_prime_score_int
    remove_variable = ddm_prime_score_lea
    remove_variable = ddm_prime_relevant_dip
    remove_variable = ddm_prime_relevant_mar
    remove_variable = ddm_prime_relevant_ste
    remove_variable = ddm_prime_relevant_int
    remove_variable = ddm_prime_relevant_lea
    remove_variable = ddm_prime_learning_dip
    remove_variable = ddm_prime_learning_mar
    remove_variable = ddm_prime_learning_ste
    remove_variable = ddm_prime_learning_int
    remove_variable = ddm_prime_learning_lea
    remove_variable = ddm_prime_intellect_dip
    remove_variable = ddm_prime_intellect_mar
    remove_variable = ddm_prime_intellect_ste
    remove_variable = ddm_prime_intellect_int
    remove_variable = ddm_prime_intellect_lea
    remove_variable = ddm_prime_total_dip
    remove_variable = ddm_prime_total_mar
    remove_variable = ddm_prime_total_ste
    remove_variable = ddm_prime_total_int
    remove_variable = ddm_prime_total_lea
    remove_variable = ddm_prime_recommended_focus
    remove_variable = ddm_prime_recommended_teacher
    remove_variable = ddm_prime_best_total
    set_variable = { name = ddm_prime_candidate_total value = 0 }
    set_variable = { name = ddm_prime_has_scan value = 0 }
}

# Choose the current child ruler first. Adult rulers instead plan for their current player heir if that heir
# is still a child. The Baby Mode resolved flag is deliberately irrelevant: old saves that already pressed
# "I'm Just a Baby" simply gain this planning layer without generating another court.
ddm_prepare_prime_education_page_effect = {
    ddm_initialize_settings_effect = yes
    if = { limit = { NOT = { has_variable = ddm_prime_temperament_mode } } set_variable = { name = ddm_prime_temperament_mode value = 2 } }

    remove_variable = ddm_prime_subject
    if = {
        limit = { is_alive = yes is_adult = no }
        set_variable = { name = ddm_prime_subject value = root }
    }
    else_if = {
        limit = { exists = player_heir player_heir = { is_alive = yes is_adult = no } }
        set_variable = { name = ddm_prime_subject value = player_heir }
    }

    # If the subject changed since the previous visit, stale winners must never be reused.
    if = {
        limit = {
            OR = {
                NOT = { has_variable = ddm_prime_scanned_subject }
                AND = { has_variable = ddm_prime_subject var:ddm_prime_scanned_subject != var:ddm_prime_subject }
                AND = { NOT = { has_variable = ddm_prime_subject } has_variable = ddm_prime_scanned_subject }
            }
        }
        ddm_prime_clear_scan_effect = yes
        remove_variable = ddm_prime_scanned_subject
    }
}

ddm_prime_try_add_candidate_effect = {
    if = {
        limit = {
            ddm_can_be_guardian_trigger = yes
            NOT = { has_character_flag = ddm_prime_candidate_this_pass }
        }
        add_character_flag = ddm_prime_candidate_this_pass
        save_temporary_scope_as = ddm_prime_candidate
        scope:ddm_prime_actor = {
            add_to_variable_list = { name = ddm_prime_candidates target = scope:ddm_prime_candidate }
            change_variable = { name = ddm_prime_candidate_total add = 1 }
        }
    }
}

# Run while actor, subject and candidate list exist. FOCUS is supplied by wrappers through the subject's
# temporary ddm_education_focus_mode variable.
ddm_prime_pick_current_focus_teacher_effect = {
    if = {
        limit = { has_variable_list = ddm_prime_candidates }
        ordered_in_list = {
            variable = ddm_prime_candidates
            limit = { ddm_can_be_guardian_trigger = yes }
            order_by = ddm_prime_teacher_score_value
            max = 1
            check_range_bounds = no
            save_temporary_scope_as = ddm_prime_focus_winner
        }
    }
}

ddm_prime_generate_teachers_effect = {
    ddm_prepare_prime_education_page_effect = yes
    ddm_prime_clear_scan_effect = yes

    if = {
        limit = { has_variable = ddm_prime_subject var:ddm_prime_subject = { is_alive = yes is_adult = no } }
        save_scope_as = ddm_prime_actor
        var:ddm_prime_subject = { save_scope_as = ddm_prime_subject save_scope_as = ddm_edu_child }

        clear_variable_list = ddm_prime_candidates
        set_variable = { name = ddm_prime_candidate_total value = 0 }

        # 2.6.30 performance: the player-facing Prime Education search still searches full diplomatic
        # range when explicitly requested. AI child rulers do not need a full-world iterator just to
        # choose a guardian once in their childhood; use their court, realm, liege court and dynasty.
        if = {
            limit = { is_ai = yes }
            every_courtier_or_guest = { ddm_prime_try_add_candidate_effect = yes }
            every_vassal_or_below = {
                ddm_prime_try_add_candidate_effect = yes
                every_courtier_or_guest = { ddm_prime_try_add_candidate_effect = yes }
            }
            if = {
                limit = { exists = liege }
                liege = {
                    ddm_prime_try_add_candidate_effect = yes
                    every_courtier_or_guest = { ddm_prime_try_add_candidate_effect = yes }
                }
            }
            if = {
                limit = { exists = dynasty }
                dynasty = { every_dynasty_member = { ddm_prime_try_add_candidate_effect = yes } }
            }
        }
        else = {
            every_living_character = {
                limit = { in_diplomatic_range = scope:ddm_prime_actor }
                ddm_prime_try_add_candidate_effect = yes
            }
        }

        # Diplomacy
        scope:ddm_prime_subject = { set_variable = { name = ddm_education_focus_mode value = 1 } }
        ddm_prime_pick_current_focus_teacher_effect = yes
        if = { limit = { exists = scope:ddm_prime_focus_winner } set_variable = { name = ddm_prime_teacher_dip value = scope:ddm_prime_focus_winner } set_variable = { name = ddm_prime_score_dip value = scope:ddm_prime_focus_winner.ddm_prime_teacher_score_value } set_variable = { name = ddm_prime_relevant_dip value = scope:ddm_prime_focus_winner.ddm_educator_relevant_skill_value } set_variable = { name = ddm_prime_learning_dip value = scope:ddm_prime_focus_winner.learning } set_variable = { name = ddm_prime_intellect_dip value = scope:ddm_prime_focus_winner.ddm_educator_intellect_bonus_value } }

        # Martial
        scope:ddm_prime_subject = { set_variable = { name = ddm_education_focus_mode value = 2 } }
        ddm_prime_pick_current_focus_teacher_effect = yes
        if = { limit = { exists = scope:ddm_prime_focus_winner } set_variable = { name = ddm_prime_teacher_mar value = scope:ddm_prime_focus_winner } set_variable = { name = ddm_prime_score_mar value = scope:ddm_prime_focus_winner.ddm_prime_teacher_score_value } set_variable = { name = ddm_prime_relevant_mar value = scope:ddm_prime_focus_winner.ddm_educator_relevant_skill_value } set_variable = { name = ddm_prime_learning_mar value = scope:ddm_prime_focus_winner.learning } set_variable = { name = ddm_prime_intellect_mar value = scope:ddm_prime_focus_winner.ddm_educator_intellect_bonus_value } }

        # Stewardship
        scope:ddm_prime_subject = { set_variable = { name = ddm_education_focus_mode value = 3 } }
        ddm_prime_pick_current_focus_teacher_effect = yes
        if = { limit = { exists = scope:ddm_prime_focus_winner } set_variable = { name = ddm_prime_teacher_ste value = scope:ddm_prime_focus_winner } set_variable = { name = ddm_prime_score_ste value = scope:ddm_prime_focus_winner.ddm_prime_teacher_score_value } set_variable = { name = ddm_prime_relevant_ste value = scope:ddm_prime_focus_winner.ddm_educator_relevant_skill_value } set_variable = { name = ddm_prime_learning_ste value = scope:ddm_prime_focus_winner.learning } set_variable = { name = ddm_prime_intellect_ste value = scope:ddm_prime_focus_winner.ddm_educator_intellect_bonus_value } }

        # Intrigue
        scope:ddm_prime_subject = { set_variable = { name = ddm_education_focus_mode value = 4 } }
        ddm_prime_pick_current_focus_teacher_effect = yes
        if = { limit = { exists = scope:ddm_prime_focus_winner } set_variable = { name = ddm_prime_teacher_int value = scope:ddm_prime_focus_winner } set_variable = { name = ddm_prime_score_int value = scope:ddm_prime_focus_winner.ddm_prime_teacher_score_value } set_variable = { name = ddm_prime_relevant_int value = scope:ddm_prime_focus_winner.ddm_educator_relevant_skill_value } set_variable = { name = ddm_prime_learning_int value = scope:ddm_prime_focus_winner.learning } set_variable = { name = ddm_prime_intellect_int value = scope:ddm_prime_focus_winner.ddm_educator_intellect_bonus_value } }

        # Learning
        scope:ddm_prime_subject = { set_variable = { name = ddm_education_focus_mode value = 5 } }
        ddm_prime_pick_current_focus_teacher_effect = yes
        if = { limit = { exists = scope:ddm_prime_focus_winner } set_variable = { name = ddm_prime_teacher_lea value = scope:ddm_prime_focus_winner } set_variable = { name = ddm_prime_score_lea value = scope:ddm_prime_focus_winner.ddm_prime_teacher_score_value } set_variable = { name = ddm_prime_relevant_lea value = scope:ddm_prime_focus_winner.ddm_educator_relevant_skill_value } set_variable = { name = ddm_prime_learning_lea value = scope:ddm_prime_focus_winner.learning } set_variable = { name = ddm_prime_intellect_lea value = scope:ddm_prime_focus_winner.ddm_educator_intellect_bonus_value } }

        # Restore the subject's actual/default focus cache used by the ordinary Education Office.
        scope:ddm_prime_subject = { ddm_prepare_child_education_focus_effect = yes }

        # Focus recommendation = best available teacher score + the child's own aptitude/childhood affinity.
        if = { limit = { has_variable = ddm_prime_score_dip } set_variable = { name = ddm_prime_total_dip value = var:ddm_prime_score_dip } change_variable = { name = ddm_prime_total_dip add = scope:ddm_prime_subject.ddm_prime_child_dip_aptitude_value } }
        if = { limit = { has_variable = ddm_prime_score_mar } set_variable = { name = ddm_prime_total_mar value = var:ddm_prime_score_mar } change_variable = { name = ddm_prime_total_mar add = scope:ddm_prime_subject.ddm_prime_child_mar_aptitude_value } }
        if = { limit = { has_variable = ddm_prime_score_ste } set_variable = { name = ddm_prime_total_ste value = var:ddm_prime_score_ste } change_variable = { name = ddm_prime_total_ste add = scope:ddm_prime_subject.ddm_prime_child_ste_aptitude_value } }
        if = { limit = { has_variable = ddm_prime_score_int } set_variable = { name = ddm_prime_total_int value = var:ddm_prime_score_int } change_variable = { name = ddm_prime_total_int add = scope:ddm_prime_subject.ddm_prime_child_int_aptitude_value } }
        if = { limit = { has_variable = ddm_prime_score_lea } set_variable = { name = ddm_prime_total_lea value = var:ddm_prime_score_lea } change_variable = { name = ddm_prime_total_lea add = scope:ddm_prime_subject.ddm_prime_child_lea_aptitude_value } }

        # Start with the first available track, then replace whenever a higher total appears.
        if = { limit = { has_variable = ddm_prime_total_dip } set_variable = { name = ddm_prime_recommended_focus value = 1 } set_variable = { name = ddm_prime_best_total value = var:ddm_prime_total_dip } set_variable = { name = ddm_prime_recommended_teacher value = var:ddm_prime_teacher_dip } }
        else_if = { limit = { has_variable = ddm_prime_total_mar } set_variable = { name = ddm_prime_recommended_focus value = 2 } set_variable = { name = ddm_prime_best_total value = var:ddm_prime_total_mar } set_variable = { name = ddm_prime_recommended_teacher value = var:ddm_prime_teacher_mar } }
        else_if = { limit = { has_variable = ddm_prime_total_ste } set_variable = { name = ddm_prime_recommended_focus value = 3 } set_variable = { name = ddm_prime_best_total value = var:ddm_prime_total_ste } set_variable = { name = ddm_prime_recommended_teacher value = var:ddm_prime_teacher_ste } }
        else_if = { limit = { has_variable = ddm_prime_total_int } set_variable = { name = ddm_prime_recommended_focus value = 4 } set_variable = { name = ddm_prime_best_total value = var:ddm_prime_total_int } set_variable = { name = ddm_prime_recommended_teacher value = var:ddm_prime_teacher_int } }
        else_if = { limit = { has_variable = ddm_prime_total_lea } set_variable = { name = ddm_prime_recommended_focus value = 5 } set_variable = { name = ddm_prime_best_total value = var:ddm_prime_total_lea } set_variable = { name = ddm_prime_recommended_teacher value = var:ddm_prime_teacher_lea } }

        if = { limit = { has_variable = ddm_prime_total_mar has_variable = ddm_prime_best_total var:ddm_prime_total_mar > var:ddm_prime_best_total } set_variable = { name = ddm_prime_recommended_focus value = 2 } set_variable = { name = ddm_prime_best_total value = var:ddm_prime_total_mar } set_variable = { name = ddm_prime_recommended_teacher value = var:ddm_prime_teacher_mar } }
        if = { limit = { has_variable = ddm_prime_total_ste has_variable = ddm_prime_best_total var:ddm_prime_total_ste > var:ddm_prime_best_total } set_variable = { name = ddm_prime_recommended_focus value = 3 } set_variable = { name = ddm_prime_best_total value = var:ddm_prime_total_ste } set_variable = { name = ddm_prime_recommended_teacher value = var:ddm_prime_teacher_ste } }
        if = { limit = { has_variable = ddm_prime_total_int has_variable = ddm_prime_best_total var:ddm_prime_total_int > var:ddm_prime_best_total } set_variable = { name = ddm_prime_recommended_focus value = 4 } set_variable = { name = ddm_prime_best_total value = var:ddm_prime_total_int } set_variable = { name = ddm_prime_recommended_teacher value = var:ddm_prime_teacher_int } }
        if = { limit = { has_variable = ddm_prime_total_lea has_variable = ddm_prime_best_total var:ddm_prime_total_lea > var:ddm_prime_best_total } set_variable = { name = ddm_prime_recommended_focus value = 5 } set_variable = { name = ddm_prime_best_total value = var:ddm_prime_total_lea } set_variable = { name = ddm_prime_recommended_teacher value = var:ddm_prime_teacher_lea } }

        set_variable = { name = ddm_prime_has_scan value = 1 }
        set_variable = { name = ddm_prime_scanned_subject value = var:ddm_prime_subject }

        # Remove transient list marks and the large list itself. Only five character refs survive.
        every_in_list = { variable = ddm_prime_candidates remove_character_flag = ddm_prime_candidate_this_pass }
        clear_variable_list = ddm_prime_candidates
    }
}

# Shared assignment helper. scope:ddm_prime_selected_teacher and scope:ddm_prime_subject must exist;
# the caller has already set the desired education focus. Existing guardians are explicitly detached.
ddm_prime_assign_selected_teacher_effect = {
    if = {
        limit = {
            exists = scope:ddm_prime_subject
            exists = scope:ddm_prime_selected_teacher
            scope:ddm_prime_subject = { is_alive = yes is_adult = no }
        }
        scope:ddm_prime_subject = { save_scope_as = ddm_edu_child }
        if = {
            limit = { scope:ddm_prime_selected_teacher = { ddm_can_be_guardian_trigger = yes } }
            scope:ddm_prime_subject = {
                if = {
                    limit = { num_of_relation_guardian > 0 }
                    random_relation = { type = guardian save_scope_as = ddm_prime_old_guardian }
                }
            }
            if = {
                limit = { exists = scope:ddm_prime_old_guardian }
                scope:ddm_prime_subject = { remove_relation_guardian = scope:ddm_prime_old_guardian }
            }
            scope:ddm_prime_subject = {
                add_character_flag = { flag = ddm_guardian_recently_assigned days = 14 }
                set_relation_guardian = scope:ddm_prime_selected_teacher
            }
            send_interface_toast = { type = event_toast_effect_good title = DDM_PRIME_ASSIGNED_TOAST left_icon = scope:ddm_prime_subject right_icon = scope:ddm_prime_selected_teacher }
        }
        else = {
            send_interface_toast = { type = event_toast_effect_neutral title = DDM_PRIME_TEACHER_STALE_TOAST left_icon = scope:ddm_prime_subject }
            ddm_prime_generate_teachers_effect = yes
        }
    }
}

ddm_prime_use_diplomacy_effect = { var:ddm_prime_subject = { save_scope_as = ddm_prime_subject set_focus = education_diplomacy } var:ddm_prime_teacher_dip = { save_scope_as = ddm_prime_selected_teacher } ddm_prime_assign_selected_teacher_effect = yes }
ddm_prime_use_martial_effect = { var:ddm_prime_subject = { save_scope_as = ddm_prime_subject set_focus = education_martial } var:ddm_prime_teacher_mar = { save_scope_as = ddm_prime_selected_teacher } ddm_prime_assign_selected_teacher_effect = yes }
ddm_prime_use_stewardship_effect = { var:ddm_prime_subject = { save_scope_as = ddm_prime_subject set_focus = education_stewardship } var:ddm_prime_teacher_ste = { save_scope_as = ddm_prime_selected_teacher } ddm_prime_assign_selected_teacher_effect = yes }
ddm_prime_use_intrigue_effect = { var:ddm_prime_subject = { save_scope_as = ddm_prime_subject set_focus = education_intrigue } var:ddm_prime_teacher_int = { save_scope_as = ddm_prime_selected_teacher } ddm_prime_assign_selected_teacher_effect = yes }
ddm_prime_use_learning_effect = { var:ddm_prime_subject = { save_scope_as = ddm_prime_subject set_focus = education_learning } var:ddm_prime_teacher_lea = { save_scope_as = ddm_prime_selected_teacher } ddm_prime_assign_selected_teacher_effect = yes }

ddm_prime_apply_recommended_effect = {
    if = { limit = { var:ddm_prime_recommended_focus = 1 } ddm_prime_use_diplomacy_effect = yes }
    else_if = { limit = { var:ddm_prime_recommended_focus = 2 } ddm_prime_use_martial_effect = yes }
    else_if = { limit = { var:ddm_prime_recommended_focus = 3 } ddm_prime_use_stewardship_effect = yes }
    else_if = { limit = { var:ddm_prime_recommended_focus = 4 } ddm_prime_use_intrigue_effect = yes }
    else_if = { limit = { var:ddm_prime_recommended_focus = 5 } ddm_prime_use_learning_effect = yes }
}

# AI child rulers use the same system from birth and never generate a second Baby Mode court.
# Temperament is selected once, then the recommended focus/guardian is applied.
ddm_prime_education_ai_effect = {
    if = {
        limit = { is_alive = yes is_ai = yes is_landed = yes is_adult = no NOT = { has_character_flag = ddm_prime_ai_plan_applied } }
        if = {
            limit = { NOT = { has_variable = ddm_prime_temperament_mode } }
            random_list = {
                30 = { set_variable = { name = ddm_prime_temperament_mode value = 1 } }
                40 = { set_variable = { name = ddm_prime_temperament_mode value = 2 } }
                30 = { set_variable = { name = ddm_prime_temperament_mode value = 3 } }
            }
        }
        ddm_prime_generate_teachers_effect = yes
        if = { limit = { has_variable = ddm_prime_recommended_teacher } ddm_prime_apply_recommended_effect = yes }
        add_character_flag = ddm_prime_ai_plan_applied
    }
}
