﻿# Dominion of Communion — Breast Profile subsystem (2.5.8)
# Canonical measurements are stored in tenths of an inch, exactly like Endowment. UI conversion is display-only.

# ----------------------------
# Physical profile seeding
# ----------------------------
domcom_clear_breast_traits_effect = {
    if = { limit = { has_trait = domcom_breast_flat } remove_trait = domcom_breast_flat }
    if = { limit = { has_trait = domcom_breast_small } remove_trait = domcom_breast_small }
    if = { limit = { has_trait = domcom_breast_average } remove_trait = domcom_breast_average }
    if = { limit = { has_trait = domcom_breast_full } remove_trait = domcom_breast_full }
    if = { limit = { has_trait = domcom_breast_large } remove_trait = domcom_breast_large }
    if = { limit = { has_trait = domcom_breast_very_large } remove_trait = domcom_breast_very_large }
}

domcom_seed_breast_underbust_effect = {
    random_list = {
        2  = { set_variable = { name = domcom_underbust_tenths value = 260 } }
        6  = { set_variable = { name = domcom_underbust_tenths value = 280 } }
        15 = { set_variable = { name = domcom_underbust_tenths value = 300 } }
        28 = { set_variable = { name = domcom_underbust_tenths value = 320 } }
        28 = { set_variable = { name = domcom_underbust_tenths value = 340 } }
        15 = { set_variable = { name = domcom_underbust_tenths value = 360 } }
        5  = { set_variable = { name = domcom_underbust_tenths value = 380 } }
        1  = { set_variable = { name = domcom_underbust_tenths value = 400 } }
    }
}

domcom_seed_breast_flat_effect = {
    random_list = {
        20 = { set_variable = { name = domcom_breast_fullness_tenths value = 5 } }
        40 = { set_variable = { name = domcom_breast_fullness_tenths value = 10 } }
        40 = { set_variable = { name = domcom_breast_fullness_tenths value = 15 } }
    }
}
domcom_seed_breast_small_effect = {
    random_list = {
        25 = { set_variable = { name = domcom_breast_fullness_tenths value = 18 } }
        35 = { set_variable = { name = domcom_breast_fullness_tenths value = 20 } }
        25 = { set_variable = { name = domcom_breast_fullness_tenths value = 23 } }
        15 = { set_variable = { name = domcom_breast_fullness_tenths value = 25 } }
    }
}
domcom_seed_breast_average_effect = {
    random_list = {
        10 = { set_variable = { name = domcom_breast_fullness_tenths value = 28 } }
        20 = { set_variable = { name = domcom_breast_fullness_tenths value = 30 } }
        30 = { set_variable = { name = domcom_breast_fullness_tenths value = 34 } }
        25 = { set_variable = { name = domcom_breast_fullness_tenths value = 37 } }
        15 = { set_variable = { name = domcom_breast_fullness_tenths value = 40 } }
    }
}
domcom_seed_breast_full_effect = {
    random_list = {
        20 = { set_variable = { name = domcom_breast_fullness_tenths value = 42 } }
        35 = { set_variable = { name = domcom_breast_fullness_tenths value = 45 } }
        30 = { set_variable = { name = domcom_breast_fullness_tenths value = 48 } }
        15 = { set_variable = { name = domcom_breast_fullness_tenths value = 50 } }
    }
}
domcom_seed_breast_large_effect = {
    random_list = {
        20 = { set_variable = { name = domcom_breast_fullness_tenths value = 53 } }
        30 = { set_variable = { name = domcom_breast_fullness_tenths value = 56 } }
        30 = { set_variable = { name = domcom_breast_fullness_tenths value = 60 } }
        20 = { set_variable = { name = domcom_breast_fullness_tenths value = 65 } }
    }
}
domcom_seed_breast_very_large_effect = {
    random_list = {
        35 = { set_variable = { name = domcom_breast_fullness_tenths value = 68 } }
        30 = { set_variable = { name = domcom_breast_fullness_tenths value = 72 } }
        20 = { set_variable = { name = domcom_breast_fullness_tenths value = 78 } }
        10 = { set_variable = { name = domcom_breast_fullness_tenths value = 82 } }
        5  = { set_variable = { name = domcom_breast_fullness_tenths value = 85 } }
    }
}

domcom_seed_fresh_breast_profile_effect = {
    domcom_seed_breast_underbust_effect = yes
    # Broad centered distribution. Tier is based on bust-minus-underbust fullness rather than cup letters,
    # because cup labels are not standardized across countries or brands.
    random_list = {
        5  = { domcom_seed_breast_flat_effect = yes }
        20 = { domcom_seed_breast_small_effect = yes }
        45 = { domcom_seed_breast_average_effect = yes }
        20 = { domcom_seed_breast_full_effect = yes }
        8  = { domcom_seed_breast_large_effect = yes }
        2  = { domcom_seed_breast_very_large_effect = yes }
    }
}

domcom_seed_breast_from_designer_trait_effect = {
    domcom_seed_breast_underbust_effect = yes
    if = { limit = { has_trait = domcom_breast_very_large } domcom_seed_breast_very_large_effect = yes }
    else_if = { limit = { has_trait = domcom_breast_large } domcom_seed_breast_large_effect = yes }
    else_if = { limit = { has_trait = domcom_breast_full } domcom_seed_breast_full_effect = yes }
    else_if = { limit = { has_trait = domcom_breast_average } domcom_seed_breast_average_effect = yes }
    else_if = { limit = { has_trait = domcom_breast_small } domcom_seed_breast_small_effect = yes }
    else = { domcom_seed_breast_flat_effect = yes }
}

domcom_sync_breast_trait_effect = {
    if = {
        limit = { is_female = yes age >= 18 has_variable = domcom_breast_fullness_tenths }
        if = {
            limit = { var:domcom_breast_fullness_tenths <= 15 }
            set_variable = { name = domcom_breast_category value = flag:flat }
            if = { limit = { NOT = { has_trait = domcom_breast_flat } } domcom_clear_breast_traits_effect = yes add_trait = domcom_breast_flat }
        }
        else_if = {
            limit = { var:domcom_breast_fullness_tenths <= 25 }
            set_variable = { name = domcom_breast_category value = flag:small }
            if = { limit = { NOT = { has_trait = domcom_breast_small } } domcom_clear_breast_traits_effect = yes add_trait = domcom_breast_small }
        }
        else_if = {
            limit = { var:domcom_breast_fullness_tenths <= 40 }
            set_variable = { name = domcom_breast_category value = flag:average }
            if = { limit = { NOT = { has_trait = domcom_breast_average } } domcom_clear_breast_traits_effect = yes add_trait = domcom_breast_average }
        }
        else_if = {
            limit = { var:domcom_breast_fullness_tenths <= 50 }
            set_variable = { name = domcom_breast_category value = flag:full }
            if = { limit = { NOT = { has_trait = domcom_breast_full } } domcom_clear_breast_traits_effect = yes add_trait = domcom_breast_full }
        }
        else_if = {
            limit = { var:domcom_breast_fullness_tenths <= 65 }
            set_variable = { name = domcom_breast_category value = flag:large }
            if = { limit = { NOT = { has_trait = domcom_breast_large } } domcom_clear_breast_traits_effect = yes add_trait = domcom_breast_large }
        }
        else = {
            set_variable = { name = domcom_breast_category value = flag:very_large }
            if = { limit = { NOT = { has_trait = domcom_breast_very_large } } domcom_clear_breast_traits_effect = yes add_trait = domcom_breast_very_large }
        }
    }
    else = { domcom_clear_breast_traits_effect = yes }
}

domcom_assign_breast_profile_effect = {
    # Never expose breast body traits before 18, even when another mod changes CK3's adulthood age.
    if = {
        limit = { OR = { is_female = no age < 18 } }
        domcom_clear_breast_traits_effect = yes
    }
    else = {
        # Stored Ruler Designer choice takes priority, including a tier preselected for a child ruler.
        if = {
            limit = {
                is_female = yes age >= 18
                has_variable = domcom_designer_breast_choice
                NOT = { has_variable = domcom_locked_underbust_tenths }
                NOT = { has_variable = domcom_locked_bust_tenths }
                NOT = { has_variable = domcom_underbust_tenths }
                NOT = { has_variable = domcom_breast_fullness_tenths }
            }
            domcom_seed_breast_from_designer_choice_effect = yes
        }

        # Ruler Designer selection takes priority over inheritance/fresh seeding.
        if = {
            limit = {
                is_female = yes age >= 18
                NOT = { has_variable = domcom_locked_underbust_tenths }
                NOT = { has_variable = domcom_locked_bust_tenths }
                OR = {
                    has_trait = domcom_breast_flat has_trait = domcom_breast_small has_trait = domcom_breast_average
                    has_trait = domcom_breast_full has_trait = domcom_breast_large has_trait = domcom_breast_very_large
                }
            }
            domcom_seed_breast_from_designer_trait_effect = yes
        }

        # If no designer body was chosen, daughters have a 50% chance to draw from a maternal regression
        # profile. The result is never a direct copy: it regresses toward the population mean and varies.
        if = {
            limit = {
                is_female = yes age >= 18
                NOT = { has_variable = domcom_underbust_tenths }
                NOT = { has_variable = domcom_breast_fullness_tenths }
                exists = mother
                mother = { has_variable = domcom_locked_underbust_tenths has_variable = domcom_locked_breast_fullness_tenths }
            }
            random = { chance = 50 add_character_flag = domcom_use_maternal_breast_roll }
        }
        if = {
            limit = { has_character_flag = domcom_use_maternal_breast_roll exists = mother }
            mother = { save_scope_as = domcom_breast_mother }
            set_variable = { name = domcom_underbust_tenths value = scope:domcom_breast_mother.var:domcom_locked_underbust_tenths }
            change_variable = { name = domcom_underbust_tenths multiply = 0.65 }
            change_variable = { name = domcom_underbust_tenths add = 115.5 }
            random_list = {
                5 = { change_variable = { name = domcom_underbust_tenths add = -15 } }
                10 = { change_variable = { name = domcom_underbust_tenths add = -10 } }
                20 = { change_variable = { name = domcom_underbust_tenths add = -5 } }
                30 = { change_variable = { name = domcom_underbust_tenths add = 0 } }
                20 = { change_variable = { name = domcom_underbust_tenths add = 5 } }
                10 = { change_variable = { name = domcom_underbust_tenths add = 10 } }
                5 = { change_variable = { name = domcom_underbust_tenths add = 15 } }
            }
            set_variable = { name = domcom_breast_fullness_tenths value = scope:domcom_breast_mother.var:domcom_locked_breast_fullness_tenths }
            change_variable = { name = domcom_breast_fullness_tenths multiply = 0.65 }
            change_variable = { name = domcom_breast_fullness_tenths add = 12.25 }
            random_list = {
                5 = { change_variable = { name = domcom_breast_fullness_tenths add = -10 } }
                10 = { change_variable = { name = domcom_breast_fullness_tenths add = -7 } }
                20 = { change_variable = { name = domcom_breast_fullness_tenths add = -4 } }
                30 = { change_variable = { name = domcom_breast_fullness_tenths add = 0 } }
                20 = { change_variable = { name = domcom_breast_fullness_tenths add = 4 } }
                10 = { change_variable = { name = domcom_breast_fullness_tenths add = 7 } }
                5 = { change_variable = { name = domcom_breast_fullness_tenths add = 10 } }
            }
            if = { limit = { var:domcom_underbust_tenths < 260 } set_variable = { name = domcom_underbust_tenths value = 260 } }
            if = { limit = { var:domcom_underbust_tenths > 420 } set_variable = { name = domcom_underbust_tenths value = 420 } }
            if = { limit = { var:domcom_breast_fullness_tenths < 5 } set_variable = { name = domcom_breast_fullness_tenths value = 5 } }
            if = { limit = { var:domcom_breast_fullness_tenths > 85 } set_variable = { name = domcom_breast_fullness_tenths value = 85 } }
        }

        if = {
            limit = {
                is_female = yes age >= 18
                NOT = { has_variable = domcom_underbust_tenths }
                NOT = { has_variable = domcom_breast_fullness_tenths }
            }
            domcom_seed_fresh_breast_profile_effect = yes
        }
        remove_character_flag = domcom_use_maternal_breast_roll

        # Bust circumference is derived from frame + fullness. The first completed profile is locked.
        if = {
            limit = { is_female = yes age >= 18 has_variable = domcom_underbust_tenths has_variable = domcom_breast_fullness_tenths NOT = { has_variable = domcom_bust_tenths } }
            set_variable = { name = domcom_bust_tenths value = var:domcom_underbust_tenths }
            change_variable = { name = domcom_bust_tenths add = var:domcom_breast_fullness_tenths }
        }
        if = {
            limit = { is_female = yes age >= 18 has_variable = domcom_underbust_tenths has_variable = domcom_bust_tenths has_variable = domcom_breast_fullness_tenths }
            if = { limit = { NOT = { has_variable = domcom_locked_underbust_tenths } } set_variable = { name = domcom_locked_underbust_tenths value = var:domcom_underbust_tenths } }
            if = { limit = { NOT = { has_variable = domcom_locked_bust_tenths } } set_variable = { name = domcom_locked_bust_tenths value = var:domcom_bust_tenths } }
            if = { limit = { NOT = { has_variable = domcom_locked_breast_fullness_tenths } } set_variable = { name = domcom_locked_breast_fullness_tenths value = var:domcom_breast_fullness_tenths } }

            # Canonical locked body always wins over accidental later edits.
            set_variable = { name = domcom_underbust_tenths value = var:domcom_locked_underbust_tenths }
            set_variable = { name = domcom_bust_tenths value = var:domcom_locked_bust_tenths }
            set_variable = { name = domcom_breast_fullness_tenths value = var:domcom_locked_breast_fullness_tenths }
            domcom_sync_breast_trait_effect = yes
            if = { limit = { has_variable = domcom_designer_breast_choice } remove_variable = domcom_designer_breast_choice }
            domcom_initialize_breast_mastery_effect = yes
            if = { limit = { NOT = { is_target_in_global_variable_list = { name = domcom_all_breast_profiles target = this } } } add_to_global_variable_list = { name = domcom_all_breast_profiles target = this } }
        }
    }
}

# ----------------------------
# Attraction preferences
# ----------------------------
domcom_clear_breast_preference_traits_effect = {
    if = { limit = { has_trait = domcom_prefers_breast_flat } remove_trait = domcom_prefers_breast_flat }
    if = { limit = { has_trait = domcom_prefers_breast_small } remove_trait = domcom_prefers_breast_small }
    if = { limit = { has_trait = domcom_prefers_breast_average } remove_trait = domcom_prefers_breast_average }
    if = { limit = { has_trait = domcom_prefers_breast_full } remove_trait = domcom_prefers_breast_full }
    if = { limit = { has_trait = domcom_prefers_breast_large } remove_trait = domcom_prefers_breast_large }
    if = { limit = { has_trait = domcom_prefers_breast_very_large } remove_trait = domcom_prefers_breast_very_large }
}

domcom_sync_breast_preference_trait_effect = {
    # Do not remove/re-add the same preference trait on every profile refresh. CK3 treats that as a fresh
    # trait gain and spams the player after Tantalize/Alpha/profile syncs even though the preference did
    # not actually change. Mirror the stable penis-preference sync: only replace a trait when the stored
    # category differs from the visible one.
    if = {
        limit = { age >= 18 is_attracted_to_women = yes has_variable = domcom_pref_breast_fullness_tenths }
        if = {
            limit = { var:domcom_pref_breast_fullness_tenths <= 15 }
            set_variable = { name = domcom_breast_preference_category value = flag:flat }
            if = { limit = { NOT = { has_trait = domcom_prefers_breast_flat } } domcom_clear_breast_preference_traits_effect = yes add_trait = domcom_prefers_breast_flat }
        }
        else_if = {
            limit = { var:domcom_pref_breast_fullness_tenths <= 25 }
            set_variable = { name = domcom_breast_preference_category value = flag:small }
            if = { limit = { NOT = { has_trait = domcom_prefers_breast_small } } domcom_clear_breast_preference_traits_effect = yes add_trait = domcom_prefers_breast_small }
        }
        else_if = {
            limit = { var:domcom_pref_breast_fullness_tenths <= 40 }
            set_variable = { name = domcom_breast_preference_category value = flag:average }
            if = { limit = { NOT = { has_trait = domcom_prefers_breast_average } } domcom_clear_breast_preference_traits_effect = yes add_trait = domcom_prefers_breast_average }
        }
        else_if = {
            limit = { var:domcom_pref_breast_fullness_tenths <= 50 }
            set_variable = { name = domcom_breast_preference_category value = flag:full }
            if = { limit = { NOT = { has_trait = domcom_prefers_breast_full } } domcom_clear_breast_preference_traits_effect = yes add_trait = domcom_prefers_breast_full }
        }
        else_if = {
            limit = { var:domcom_pref_breast_fullness_tenths <= 65 }
            set_variable = { name = domcom_breast_preference_category value = flag:large }
            if = { limit = { NOT = { has_trait = domcom_prefers_breast_large } } domcom_clear_breast_preference_traits_effect = yes add_trait = domcom_prefers_breast_large }
        }
        else = {
            set_variable = { name = domcom_breast_preference_category value = flag:very_large }
            if = { limit = { NOT = { has_trait = domcom_prefers_breast_very_large } } domcom_clear_breast_preference_traits_effect = yes add_trait = domcom_prefers_breast_very_large }
        }
    }
    else = { domcom_clear_breast_preference_traits_effect = yes }
}

domcom_assign_breast_preference_effect = {
    if = {
        limit = {
            age >= 18 is_attracted_to_women = yes
            OR = { NOT = { has_variable = domcom_pref_underbust_tenths } NOT = { has_variable = domcom_pref_breast_fullness_tenths } }
        }
        # Preferred frame is broad but centered around the same adult distribution.
        random_list = {
            5  = { set_variable = { name = domcom_pref_underbust_tenths value = 280 } }
            15 = { set_variable = { name = domcom_pref_underbust_tenths value = 300 } }
            30 = { set_variable = { name = domcom_pref_underbust_tenths value = 320 } }
            30 = { set_variable = { name = domcom_pref_underbust_tenths value = 340 } }
            15 = { set_variable = { name = domcom_pref_underbust_tenths value = 360 } }
            5  = { set_variable = { name = domcom_pref_underbust_tenths value = 380 } }
        }
        # Preferences are deliberately more varied than the population distribution.
        random_list = {
            8  = { random_list = { 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 10 } } 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 15 } } } }
            18 = { random_list = { 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 20 } } 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 25 } } } }
            34 = { random_list = { 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 30 } } 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 35 } } 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 40 } } } }
            22 = { random_list = { 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 45 } } 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 50 } } } }
            12 = { random_list = { 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 55 } } 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 60 } } 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 65 } } } }
            6  = { random_list = { 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 70 } } 1 = { set_variable = { name = domcom_pref_breast_fullness_tenths value = 80 } } } }
        }
    }
    if = {
        limit = { age >= 18 is_attracted_to_women = yes has_variable = domcom_pref_underbust_tenths has_variable = domcom_pref_breast_fullness_tenths }
        domcom_sync_breast_preference_trait_effect = yes
        if = { limit = { NOT = { is_target_in_global_variable_list = { name = domcom_all_breast_preferences target = this } } } add_to_global_variable_list = { name = domcom_all_breast_preferences target = this } }
    }
    else_if = {
        limit = { OR = { age < 18 NOT = { is_attracted_to_women = yes } } }
        domcom_clear_breast_preference_traits_effect = yes
    }
}

# One-time upgrade for saves created before the Breast Profile system. This is intentionally a one-time
# world pass; after it completes, normal profile/birthday hooks maintain new adults lazily.
domcom_migrate_breast_profiles_v258_once_effect = {
    if = {
        limit = { NOT = { has_global_variable = domcom_breast_profiles_migrated_v258 } }
        every_living_character = {
            limit = { age >= 18 is_female = yes }
            domcom_assign_breast_profile_effect = yes
        }
        every_living_character = {
            limit = { age >= 18 is_attracted_to_women = yes }
            domcom_assign_breast_preference_effect = yes
        }
        set_global_variable = domcom_breast_profiles_migrated_v258
    }
}


# 2.5.9 — one-time Breast Mastery and Maternal Legacy bridge for existing saves.
domcom_migrate_breast_mastery_legacy_v259_once_effect = {
    if = {
        limit = { NOT = { has_global_variable = domcom_breast_mastery_legacy_migrated_v259 } }
        # Existing living adult women begin with childbirth history credited. Past sexual encounters cannot
        # be reconstructed safely, so only children recorded by CK3 are backfilled.
        every_living_character = {
            limit = { is_female = yes age >= 18 }
            domcom_assign_breast_profile_effect = yes
            domcom_breast_mastery_backfill_recorded_children_once_effect = yes
        }
        # Existing living children receive a stable maternal legacy when their recorded mother has a profile.
        every_living_character = {
            limit = { exists = mother NOT = { has_character_flag = domcom_maternal_breast_legacy_assigned } }
            mother = { domcom_assign_breast_profile_effect = yes save_scope_as = domcom_breast_legacy_mother }
            domcom_apply_maternal_breast_legacy_effect = yes
        }
        set_global_variable = domcom_breast_mastery_legacy_migrated_v259
    }
}
