﻿# Dominion of Communion — Breast Mastery (2.5.9)
# Physical Breast Profile is immutable. Mastery is a separate learned 0..64 progression.
# Childbirth is the largest reliable source (+15 per child). Qualifying sexual experience contributes
# smaller gains/losses. Native CK3 track XP is normalized to 0..100 for proper milestone rendering.

domcom_apply_native_breast_mastery_xp_effect = {
    if = { limit = { has_trait = domcom_breast_flat } add_trait_xp = { trait = domcom_breast_flat track = breast_mastery value = { add = var:domcom_breast_mastery_native_delta multiply = 100 divide = 64 } } }
    else_if = { limit = { has_trait = domcom_breast_small } add_trait_xp = { trait = domcom_breast_small track = breast_mastery value = { add = var:domcom_breast_mastery_native_delta multiply = 100 divide = 64 } } }
    else_if = { limit = { has_trait = domcom_breast_average } add_trait_xp = { trait = domcom_breast_average track = breast_mastery value = { add = var:domcom_breast_mastery_native_delta multiply = 100 divide = 64 } } }
    else_if = { limit = { has_trait = domcom_breast_full } add_trait_xp = { trait = domcom_breast_full track = breast_mastery value = { add = var:domcom_breast_mastery_native_delta multiply = 100 divide = 64 } } }
    else_if = { limit = { has_trait = domcom_breast_large } add_trait_xp = { trait = domcom_breast_large track = breast_mastery value = { add = var:domcom_breast_mastery_native_delta multiply = 100 divide = 64 } } }
    else_if = { limit = { has_trait = domcom_breast_very_large } add_trait_xp = { trait = domcom_breast_very_large track = breast_mastery value = { add = var:domcom_breast_mastery_native_delta multiply = 100 divide = 64 } } }
}

# v2.5.1 — proportional Breast Mastery migration from the old 0..255 scale to 0..64.
# Existing progress is retained by percentage; the native CK3 track is already normalized to 0..100.
domcom_migrate_breast_mastery_v251_effect = {
    if = {
        limit = {
            is_female = yes age >= 18
            has_variable = domcom_breast_mastery_xp
            NOT = { has_character_flag = domcom_breast_mastery_scale_migrated_v251 }
        }
        set_variable = { name = domcom_breast_mastery_migration_old_xp value = var:domcom_breast_mastery_xp }
        set_variable = { name = domcom_breast_mastery_xp value = { value = var:domcom_breast_mastery_migration_old_xp multiply = 64 divide = 255 round = yes } }
        if = { limit = { var:domcom_breast_mastery_xp < 0 } set_variable = { name = domcom_breast_mastery_xp value = 0 } }
        if = { limit = { var:domcom_breast_mastery_xp > 64 } set_variable = { name = domcom_breast_mastery_xp value = 64 } }
        remove_variable = domcom_breast_mastery_migration_old_xp
        add_character_flag = domcom_breast_mastery_scale_migrated_v251
    }
}

domcom_initialize_breast_mastery_effect = {
    if = {
        limit = { is_female = yes age >= 18 has_variable = domcom_locked_bust_tenths has_variable = domcom_locked_underbust_tenths }
        if = { limit = { NOT = { has_variable = domcom_breast_mastery_xp } } set_variable = { name = domcom_breast_mastery_xp value = 0 } }
        domcom_migrate_breast_mastery_v251_effect = yes
        if = { limit = { var:domcom_breast_mastery_xp < 0 } set_variable = { name = domcom_breast_mastery_xp value = 0 } }
        if = { limit = { var:domcom_breast_mastery_xp > 64 } set_variable = { name = domcom_breast_mastery_xp value = 64 } }
        if = { limit = { NOT = { has_variable = domcom_breast_mastery_highest_rank } } set_variable = { name = domcom_breast_mastery_highest_rank value = 0 } }
        if = {
            limit = { NOT = { has_character_flag = domcom_native_breast_mastery_seeded } }
            set_variable = { name = domcom_breast_mastery_native_delta value = var:domcom_breast_mastery_xp }
            domcom_apply_native_breast_mastery_xp_effect = yes
            remove_variable = domcom_breast_mastery_native_delta
            add_character_flag = domcom_native_breast_mastery_seeded
        }
    }
}

domcom_breast_mastery_refresh_rank_effect = {
    domcom_initialize_breast_mastery_effect = yes
    if = {
        limit = { is_female = yes age >= 18 has_variable = domcom_breast_mastery_xp }
        set_variable = { name = domcom_breast_mastery_current_rank value = 0 }
        if = { limit = { var:domcom_breast_mastery_xp >= 64 } set_variable = { name = domcom_breast_mastery_current_rank value = 6 } }
        else_if = { limit = { var:domcom_breast_mastery_xp >= 53 } set_variable = { name = domcom_breast_mastery_current_rank value = 5 } }
        else_if = { limit = { var:domcom_breast_mastery_xp >= 39 } set_variable = { name = domcom_breast_mastery_current_rank value = 4 } }
        else_if = { limit = { var:domcom_breast_mastery_xp >= 26 } set_variable = { name = domcom_breast_mastery_current_rank value = 3 } }
        else_if = { limit = { var:domcom_breast_mastery_xp >= 15 } set_variable = { name = domcom_breast_mastery_current_rank value = 2 } }
        else_if = { limit = { var:domcom_breast_mastery_xp >= 6 } set_variable = { name = domcom_breast_mastery_current_rank value = 1 } }
        if = {
            limit = { var:domcom_breast_mastery_current_rank > var:domcom_breast_mastery_highest_rank }
            set_variable = { name = domcom_breast_mastery_highest_rank value = var:domcom_breast_mastery_current_rank }
            if = { limit = { is_ai = no NOT = { has_character_flag = domcom_breast_mastery_silent_backfill } } send_interface_toast = { type = event_toast_effect_good title = domcom_breast_mastery_rank_up_toast left_icon = root } }
        }
        remove_variable = domcom_breast_mastery_current_rank
    }
}

domcom_breast_mastery_apply_pending_delta_effect = {
    domcom_initialize_breast_mastery_effect = yes
    if = {
        limit = { is_female = yes age >= 18 has_variable = domcom_breast_mastery_xp has_variable = domcom_breast_mastery_pending_delta }
        set_variable = { name = domcom_breast_mastery_old_xp value = var:domcom_breast_mastery_xp }
        change_variable = { name = domcom_breast_mastery_xp add = var:domcom_breast_mastery_pending_delta }
        if = { limit = { var:domcom_breast_mastery_xp < 0 } set_variable = { name = domcom_breast_mastery_xp value = 0 } }
        if = { limit = { var:domcom_breast_mastery_xp > 64 } set_variable = { name = domcom_breast_mastery_xp value = 64 } }
        set_variable = { name = domcom_breast_mastery_native_delta value = var:domcom_breast_mastery_xp }
        change_variable = { name = domcom_breast_mastery_native_delta subtract = var:domcom_breast_mastery_old_xp }
        domcom_apply_native_breast_mastery_xp_effect = yes
        remove_variable = domcom_breast_mastery_old_xp
        remove_variable = domcom_breast_mastery_native_delta
        domcom_breast_mastery_refresh_rank_effect = yes
    }
    remove_variable = domcom_breast_mastery_pending_delta
}

domcom_breast_mastery_childbirth_effect = {
    set_variable = { name = domcom_breast_mastery_pending_delta value = 15 }
    domcom_breast_mastery_apply_pending_delta_effect = yes
}

domcom_breast_mastery_direct_positive_sex_effect = {
    set_variable = { name = domcom_breast_mastery_pending_delta value = 3 }
    domcom_breast_mastery_apply_pending_delta_effect = yes
}

domcom_breast_mastery_strong_positive_sex_effect = {
    set_variable = { name = domcom_breast_mastery_pending_delta value = 5 }
    domcom_breast_mastery_apply_pending_delta_effect = yes
}
domcom_breast_mastery_warm_sex_effect = {
    set_variable = { name = domcom_breast_mastery_pending_delta value = 4 }
    domcom_breast_mastery_apply_pending_delta_effect = yes
}
domcom_breast_mastery_positive_sex_effect = {
    set_variable = { name = domcom_breast_mastery_pending_delta value = 3 }
    domcom_breast_mastery_apply_pending_delta_effect = yes
}
domcom_breast_mastery_neutral_sex_effect = {
    set_variable = { name = domcom_breast_mastery_pending_delta value = 1 }
    domcom_breast_mastery_apply_pending_delta_effect = yes
}
domcom_breast_mastery_negative_sex_effect = {
    set_variable = { name = domcom_breast_mastery_pending_delta value = -2 }
    domcom_breast_mastery_apply_pending_delta_effect = yes
}
domcom_breast_mastery_severe_negative_sex_effect = {
    set_variable = { name = domcom_breast_mastery_pending_delta value = -5 }
    domcom_breast_mastery_apply_pending_delta_effect = yes
}

# Run from an adult female participant. scope:domcom_breast_mastery_partner is the other participant.
domcom_breast_mastery_rate_partner_effect = {
    save_scope_as = domcom_breast_mastery_student
    if = {
        limit = { is_female = yes age >= 18 exists = scope:domcom_breast_mastery_partner scope:domcom_breast_mastery_partner = { is_alive = yes age >= 18 } }
        if = {
            limit = { scope:domcom_breast_mastery_partner = { OR = { is_imprisoned_by = scope:domcom_breast_mastery_student opinion = { target = scope:domcom_breast_mastery_student value <= -50 } } } }
            domcom_breast_mastery_severe_negative_sex_effect = yes
        }
        else_if = {
            limit = { OR = { has_relation_lover = scope:domcom_breast_mastery_partner has_relation_soulmate = scope:domcom_breast_mastery_partner } is_attracted_to_gender_of = scope:domcom_breast_mastery_partner scope:domcom_breast_mastery_partner = { is_attracted_to_gender_of = scope:domcom_breast_mastery_student } }
            domcom_breast_mastery_strong_positive_sex_effect = yes
        }
        else_if = {
            limit = { is_consort_of = scope:domcom_breast_mastery_partner is_attracted_to_gender_of = scope:domcom_breast_mastery_partner scope:domcom_breast_mastery_partner = { is_attracted_to_gender_of = scope:domcom_breast_mastery_student opinion = { target = scope:domcom_breast_mastery_student value >= 20 } } }
            domcom_breast_mastery_warm_sex_effect = yes
        }
        else_if = {
            limit = { is_attracted_to_gender_of = scope:domcom_breast_mastery_partner scope:domcom_breast_mastery_partner = { is_attracted_to_gender_of = scope:domcom_breast_mastery_student opinion = { target = scope:domcom_breast_mastery_student value >= 20 } } }
            domcom_breast_mastery_positive_sex_effect = yes
        }
        else_if = { limit = { scope:domcom_breast_mastery_partner = { opinion = { target = scope:domcom_breast_mastery_student value >= 0 } } } domcom_breast_mastery_neutral_sex_effect = yes }
        else = { domcom_breast_mastery_negative_sex_effect = yes }
    }
}

# Optional Carnalitas sex bridge. Direct Dominion intimacy uses domcom_mastery_direct_sex_guard to avoid
# double-awarding the same had_sex_with_effect encounter.
domcom_process_carnalitas_breast_mastery_effect = {
    if = {
        limit = { age >= 18 is_alive = yes scope:carn_sex_partner = { age >= 18 is_alive = yes } }
        save_scope_as = domcom_breast_mastery_carn_a
        scope:carn_sex_partner = { save_scope_as = domcom_breast_mastery_carn_b }
        if = {
            limit = { scope:domcom_breast_mastery_carn_a = { is_female = yes NOT = { has_character_flag = domcom_mastery_direct_sex_guard } NOT = { AND = { has_character_flag = domcom_breast_mastery_carn_guard has_variable = domcom_breast_mastery_carn_guard_partner var:domcom_breast_mastery_carn_guard_partner = scope:domcom_breast_mastery_carn_b } } } }
            scope:domcom_breast_mastery_carn_b = { save_scope_as = domcom_breast_mastery_partner }
            scope:domcom_breast_mastery_carn_a = {
                set_variable = { name = domcom_breast_mastery_carn_guard_partner value = scope:domcom_breast_mastery_carn_b }
                add_character_flag = { flag = domcom_breast_mastery_carn_guard days = 1 }
                domcom_breast_mastery_rate_partner_effect = yes
            }
        }
        if = {
            limit = { scope:domcom_breast_mastery_carn_b = { is_female = yes NOT = { has_character_flag = domcom_mastery_direct_sex_guard } NOT = { AND = { has_character_flag = domcom_breast_mastery_carn_guard has_variable = domcom_breast_mastery_carn_guard_partner var:domcom_breast_mastery_carn_guard_partner = scope:domcom_breast_mastery_carn_a } } } }
            scope:domcom_breast_mastery_carn_a = { save_scope_as = domcom_breast_mastery_partner }
            scope:domcom_breast_mastery_carn_b = {
                set_variable = { name = domcom_breast_mastery_carn_guard_partner value = scope:domcom_breast_mastery_carn_a }
                add_character_flag = { flag = domcom_breast_mastery_carn_guard days = 1 }
                domcom_breast_mastery_rate_partner_effect = yes
            }
        }
    }
}


# First-time historical child credit for a woman who reaches Breast Profile eligibility after the 2.5.9
# migration (for example, a future 18th birthday). This is separate from normal childbirth XP so the
# current birth can never be double-counted.
domcom_breast_mastery_backfill_recorded_children_once_effect = {
    if = {
        limit = { is_female = yes age >= 18 NOT = { has_character_flag = domcom_breast_mastery_births_backfilled_v259 } }
        domcom_initialize_breast_mastery_effect = yes
        add_character_flag = domcom_breast_mastery_silent_backfill
        save_scope_as = domcom_breast_mastery_backfill_mother
        every_child = {
            scope:domcom_breast_mastery_backfill_mother = {
                set_variable = { name = domcom_breast_mastery_pending_delta value = 15 }
                domcom_breast_mastery_apply_pending_delta_effect = yes
            }
        }
        remove_character_flag = domcom_breast_mastery_silent_backfill
        add_character_flag = domcom_breast_mastery_births_backfilled_v259
    }
}
