﻿# DDM 1.8 — Dynastic Command School
# One click replaces dozens or hundreds of repeated Teach Commander Trait interactions. It deliberately
# transfers only knowledge the player already has; it never creates a commander specialty from nowhere.

# Player scope. Cache the number of standard transferable commander specialties the teacher knows.
ddm_prepare_commander_school_teacher_effect = {
    save_scope_as = ddm_commander_teacher
    set_variable = { name = ddm_commander_school_traits_known value = 0 }
    if = { limit = { has_trait = logistician } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = military_engineer } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = aggressive_attacker } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = unyielding_defender } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = forder } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = flexible_leader } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = desert_warrior } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = jungle_stalker } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = reaver } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = reckless } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = holy_warrior } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = open_terrain_expert } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = rough_terrain_expert } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = forest_fighter } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = cautious_leader } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = organizer } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
    if = { limit = { has_trait = winter_soldier } change_variable = { name = ddm_commander_school_traits_known add = 1 } }
 }

# Student scope, teacher saved. Dedupe across the overlapping family/court/vassal/dynasty passes.
ddm_try_add_commander_school_student_effect = {
    if = {
        limit = {
            ddm_commander_school_student_trigger = yes
            NOT = { has_character_flag = ddm_commander_school_listed_this_pass }
        }
        add_character_flag = ddm_commander_school_listed_this_pass
        save_temporary_scope_as = ddm_commander_school_student
        scope:ddm_commander_teacher = {
            add_to_variable_list = { name = ddm_commander_school_students target = scope:ddm_commander_school_student }
            change_variable = { name = ddm_commander_school_eligible_total add = 1 }
        }
    }
}

# Player scope. Adults are deliberately admitted ONLY through every_child (the player's direct children).
# Everybody else is an minor the player can plausibly train through family/court/realm authority.
ddm_build_commander_school_students_effect = {
    save_scope_as = ddm_commander_teacher

    if = {
        limit = { has_variable_list = ddm_commander_school_students }
        every_in_list = { variable = ddm_commander_school_students remove_character_flag = ddm_commander_school_listed_this_pass }
    }
    clear_variable_list = ddm_commander_school_students
    set_variable = { name = ddm_commander_school_eligible_total value = 0 }

    # Every direct son/daughter remains eligible after adulthood. This is the explicit dynasty-scale
    # convenience requested by the player and is intentionally broader than vanilla ward status.
    every_child = { ddm_try_add_commander_school_student_effect = yes }

    # Current wards and minor children physically at the player's court.
    every_relation = {
        type = ward
        limit = { is_adult = no }
        ddm_try_add_commander_school_student_effect = yes
    }
    every_courtier_or_guest = {
        limit = { is_adult = no }
        ddm_try_add_commander_school_student_effect = yes
    }

    # Children of vassals at every level of the player's realm, not merely the capital court.
    every_vassal_or_below = {
        every_child = {
            limit = { is_adult = no }
            ddm_try_add_commander_school_student_effect = yes
        }
    }

    # Minor dynasty members in diplomatic range catch cadet branches and relatives living in unusual
    # courts without turning adult cousins into automatic students.
    dynasty ?= {
        every_dynasty_member = {
            limit = {
                is_adult = no
                in_diplomatic_range = scope:ddm_commander_teacher
            }
            ddm_try_add_commander_school_student_effect = yes
        }
    }

    if = {
        limit = { has_variable_list = ddm_commander_school_students }
        every_in_list = { variable = ddm_commander_school_students remove_character_flag = ddm_commander_school_listed_this_pass }
    }
}

# Student scope. Equal weighting means the school teaches one of the player's specialties that this pupil
# does not already know. Reckless/Cautious are protected from their vanilla opposite-trait conflict.
ddm_grant_one_teacher_commander_trait_effect = {
    random_list = {
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = logistician } NOT = { has_trait = logistician } }
            add_trait = logistician
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = military_engineer } NOT = { has_trait = military_engineer } }
            add_trait = military_engineer
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = aggressive_attacker } NOT = { has_trait = aggressive_attacker } }
            add_trait = aggressive_attacker
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = unyielding_defender } NOT = { has_trait = unyielding_defender } }
            add_trait = unyielding_defender
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = forder } NOT = { has_trait = forder } }
            add_trait = forder
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = flexible_leader } NOT = { has_trait = flexible_leader } }
            add_trait = flexible_leader
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = desert_warrior } NOT = { has_trait = desert_warrior } }
            add_trait = desert_warrior
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = jungle_stalker } NOT = { has_trait = jungle_stalker } }
            add_trait = jungle_stalker
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = reaver } NOT = { has_trait = reaver } }
            add_trait = reaver
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = reckless } NOT = { has_trait = reckless } NOT = { has_trait = cautious_leader } }
            add_trait = reckless
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = holy_warrior } NOT = { has_trait = holy_warrior } }
            add_trait = holy_warrior
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = open_terrain_expert } NOT = { has_trait = open_terrain_expert } }
            add_trait = open_terrain_expert
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = rough_terrain_expert } NOT = { has_trait = rough_terrain_expert } }
            add_trait = rough_terrain_expert
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = forest_fighter } NOT = { has_trait = forest_fighter } }
            add_trait = forest_fighter
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = cautious_leader } NOT = { has_trait = cautious_leader } NOT = { has_trait = reckless } }
            add_trait = cautious_leader
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = organizer } NOT = { has_trait = organizer } }
            add_trait = organizer
        }
        100 = {
            trigger = { scope:ddm_commander_teacher = { has_trait = winter_soldier } NOT = { has_trait = winter_soldier } }
            add_trait = winter_soldier
        }
    }
}

# Student scope. Each session gives one individual learning roll. A pass grants one specialty and a fail
# does not. Either outcome starts a one-year personal retry cooldown, so the free mode cannot be spammed
# until RNG succeeds. DDM permits at most two successful lessons per student, matching vanilla's scale.
ddm_attempt_commander_school_lesson_effect = {
    remove_character_flag = ddm_commander_school_passed_this_attempt
    random = {
        chance = ddm_commander_school_success_value
        ddm_grant_one_teacher_commander_trait_effect = yes
        add_character_flag = { flag = ddm_commander_school_passed_this_attempt days = 2 }
        if = {
            limit = { has_variable = ddm_commander_school_lessons_received }
            change_variable = { name = ddm_commander_school_lessons_received add = 1 }
        }
        else = { set_variable = { name = ddm_commander_school_lessons_received value = 1 } }
    }
    add_character_flag = { flag = ddm_commander_school_recent_attempt days = 365 }
}

# Player scope. The same actual school is used by both buttons; only the post-session stress accounting
# differs. This keeps the 'Education Should Be Free' option from quietly having better success odds.
ddm_run_commander_school_effect = {
    save_scope_as = ddm_commander_teacher
    set_variable = { name = ddm_commander_school_trained value = 0 }
    set_variable = { name = ddm_commander_school_failed value = 0 }
    set_variable = { name = ddm_commander_school_attempted value = 0 }
    set_variable = { name = ddm_commander_school_last_stress value = 0 }

    ddm_prepare_commander_school_teacher_effect = yes
    ddm_build_commander_school_students_effect = yes

    if = {
        limit = { has_variable_list = ddm_commander_school_students }
        every_in_list = {
            variable = ddm_commander_school_students
            limit = { ddm_commander_school_student_trigger = yes }
            save_temporary_scope_as = ddm_commander_school_student
            scope:ddm_commander_teacher = { change_variable = { name = ddm_commander_school_attempted add = 1 } }
            ddm_attempt_commander_school_lesson_effect = yes
            if = {
                limit = { has_character_flag = ddm_commander_school_passed_this_attempt }
                scope:ddm_commander_teacher = { change_variable = { name = ddm_commander_school_trained add = 1 } }
                remove_character_flag = ddm_commander_school_passed_this_attempt
            }
            else = { scope:ddm_commander_teacher = { change_variable = { name = ddm_commander_school_failed add = 1 } } }
        }
    }

    # Immediately rebuild so the GUI reflects students who are now on cooldown or have completed two
    # successful lessons.
    ddm_build_commander_school_students_effect = yes
}

# Balanced button: failure frustration aggregates AFTER the batch. Baseline is 2 stress per failed pupil,
# modified by personality. The final addition is capped at 75 and can never push the ruler above 250 total
# stress, so this utility button cannot directly drive them into stress level 3.
ddm_apply_commander_school_stress_effect = {
    set_variable = { name = ddm_commander_school_stress_to_add value = var:ddm_commander_school_failed }
    change_variable = { name = ddm_commander_school_stress_to_add multiply = 2 }

    if = {
        limit = { has_trait = diligent }
        change_variable = { name = ddm_commander_school_stress_to_add add = var:ddm_commander_school_failed }
    }
    if = {
        limit = { has_trait = compassionate }
        set_variable = { name = ddm_commander_school_stress_tmp value = var:ddm_commander_school_failed }
        change_variable = { name = ddm_commander_school_stress_tmp multiply = 0.50 }
        change_variable = { name = ddm_commander_school_stress_to_add add = var:ddm_commander_school_stress_tmp }
    }
    if = {
        limit = { has_trait = impatient }
        set_variable = { name = ddm_commander_school_stress_tmp value = var:ddm_commander_school_failed }
        change_variable = { name = ddm_commander_school_stress_tmp multiply = 0.50 }
        change_variable = { name = ddm_commander_school_stress_to_add add = var:ddm_commander_school_stress_tmp }
    }
    if = { limit = { has_trait = calm } change_variable = { name = ddm_commander_school_stress_to_add multiply = 0.75 } }
    if = { limit = { has_trait = patient } change_variable = { name = ddm_commander_school_stress_to_add multiply = 0.85 } }
    if = { limit = { has_trait = callous } change_variable = { name = ddm_commander_school_stress_to_add multiply = 0.60 } }
    if = { limit = { has_trait = sadistic } change_variable = { name = ddm_commander_school_stress_to_add multiply = 0.50 } }

    if = { limit = { var:ddm_commander_school_stress_to_add > 75 } set_variable = { name = ddm_commander_school_stress_to_add value = 75 } }
    if = { limit = { var:ddm_commander_school_stress_to_add < 0 } set_variable = { name = ddm_commander_school_stress_to_add value = 0 } }

    set_variable = { name = ddm_commander_school_stress_room value = 250 }
    set_variable = { name = ddm_commander_school_stress_tmp value = stress }
    change_variable = { name = ddm_commander_school_stress_room subtract = var:ddm_commander_school_stress_tmp }
    if = { limit = { var:ddm_commander_school_stress_room < 0 } set_variable = { name = ddm_commander_school_stress_room value = 0 } }
    if = {
        limit = { var:ddm_commander_school_stress_to_add > var:ddm_commander_school_stress_room }
        set_variable = { name = ddm_commander_school_stress_to_add value = var:ddm_commander_school_stress_room }
    }

    set_variable = { name = ddm_commander_school_last_stress value = var:ddm_commander_school_stress_to_add }
    if = { limit = { var:ddm_commander_school_stress_to_add > 0 } add_stress = var:ddm_commander_school_stress_to_add }
}

ddm_hold_commander_school_balanced_effect = {
    ddm_run_commander_school_effect = yes
    ddm_apply_commander_school_stress_effect = yes
    ddm_report_commander_school_effect = yes
}

ddm_hold_commander_school_free_effect = {
    ddm_run_commander_school_effect = yes
    set_variable = { name = ddm_commander_school_last_stress value = 0 }
    ddm_report_commander_school_effect = yes
}

ddm_report_commander_school_effect = {
    if = {
        limit = { var:ddm_commander_school_trained > 0 }
        send_interface_toast = { type = event_toast_effect_good title = DDM_COMMAND_SCHOOL_TOAST_DONE left_icon = root }
    }
    else_if = {
        limit = { var:ddm_commander_school_attempted > 0 }
        send_interface_toast = { type = event_toast_effect_neutral title = DDM_COMMAND_SCHOOL_TOAST_FAILED left_icon = root }
    }
    else = {
        send_interface_toast = { type = event_toast_effect_neutral title = DDM_COMMAND_SCHOOL_TOAST_NOBODY left_icon = root }
    }
}
