﻿# 2.6.21 — Dominion Reputation framework.
# Reputation observes behavior rather than replacing CK3 personality.
# domcom_reputation_strength = 0..100 (how far the story travels).
# Archetype scores = what the character is known for. Only the dominant archetype is public.
# Public identity uses an 8-point hysteresis margin to prevent monthly label flicker.

# Character scope.
domcom_reputation_initialize_effect = {
    if = { limit = { NOT = { has_variable = domcom_reputation_strength } } set_variable = { name = domcom_reputation_strength value = 0 } }

    # 2.6.20 migration: keep existing attraction reputation but move away from CK3's own Seducer name.
    if = {
        limit = { NOT = { has_variable = domcom_rep_paramour } }
        if = { limit = { has_variable = domcom_rep_seducer } set_variable = { name = domcom_rep_paramour value = var:domcom_rep_seducer } }
        else = { set_variable = { name = domcom_rep_paramour value = 0 } }
    }
    if = { limit = { NOT = { has_variable = domcom_rep_patron } } set_variable = { name = domcom_rep_patron value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_rep_guardian } } set_variable = { name = domcom_rep_guardian value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_rep_liberator } } set_variable = { name = domcom_rep_liberator value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_rep_restorer } } set_variable = { name = domcom_rep_restorer value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_rep_champion } } set_variable = { name = domcom_rep_champion value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_rep_dynast } } set_variable = { name = domcom_rep_dynast value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_rep_breaker } } set_variable = { name = domcom_rep_breaker value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_rep_predator } } set_variable = { name = domcom_rep_predator value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_rep_overlord } } set_variable = { name = domcom_rep_overlord value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_rep_warhound } } set_variable = { name = domcom_rep_warhound value = 0 } }
}

# Character scope.
domcom_reputation_clamp_effect = {
    if = { limit = { var:domcom_reputation_strength < 0 } set_variable = { name = domcom_reputation_strength value = 0 } }
    if = { limit = { var:domcom_reputation_strength > 100 } set_variable = { name = domcom_reputation_strength value = 100 } }
    if = { limit = { var:domcom_rep_paramour < 0 } set_variable = { name = domcom_rep_paramour value = 0 } }
    if = { limit = { var:domcom_rep_paramour > 100 } set_variable = { name = domcom_rep_paramour value = 100 } }
    if = { limit = { var:domcom_rep_patron < 0 } set_variable = { name = domcom_rep_patron value = 0 } }
    if = { limit = { var:domcom_rep_patron > 100 } set_variable = { name = domcom_rep_patron value = 100 } }
    if = { limit = { var:domcom_rep_guardian < 0 } set_variable = { name = domcom_rep_guardian value = 0 } }
    if = { limit = { var:domcom_rep_guardian > 100 } set_variable = { name = domcom_rep_guardian value = 100 } }
    if = { limit = { var:domcom_rep_liberator < 0 } set_variable = { name = domcom_rep_liberator value = 0 } }
    if = { limit = { var:domcom_rep_liberator > 100 } set_variable = { name = domcom_rep_liberator value = 100 } }
    if = { limit = { var:domcom_rep_restorer < 0 } set_variable = { name = domcom_rep_restorer value = 0 } }
    if = { limit = { var:domcom_rep_restorer > 100 } set_variable = { name = domcom_rep_restorer value = 100 } }
    if = { limit = { var:domcom_rep_champion < 0 } set_variable = { name = domcom_rep_champion value = 0 } }
    if = { limit = { var:domcom_rep_champion > 100 } set_variable = { name = domcom_rep_champion value = 100 } }
    if = { limit = { var:domcom_rep_dynast < 0 } set_variable = { name = domcom_rep_dynast value = 0 } }
    if = { limit = { var:domcom_rep_dynast > 100 } set_variable = { name = domcom_rep_dynast value = 100 } }
    if = { limit = { var:domcom_rep_breaker < 0 } set_variable = { name = domcom_rep_breaker value = 0 } }
    if = { limit = { var:domcom_rep_breaker > 100 } set_variable = { name = domcom_rep_breaker value = 100 } }
    if = { limit = { var:domcom_rep_predator < 0 } set_variable = { name = domcom_rep_predator value = 0 } }
    if = { limit = { var:domcom_rep_predator > 100 } set_variable = { name = domcom_rep_predator value = 100 } }
    if = { limit = { var:domcom_rep_overlord < 0 } set_variable = { name = domcom_rep_overlord value = 0 } }
    if = { limit = { var:domcom_rep_overlord > 100 } set_variable = { name = domcom_rep_overlord value = 100 } }
    if = { limit = { var:domcom_rep_warhound < 0 } set_variable = { name = domcom_rep_warhound value = 0 } }
    if = { limit = { var:domcom_rep_warhound > 100 } set_variable = { name = domcom_rep_warhound value = 100 } }
}

# Character scope. Determine the actual strongest archetype and store its score/flag.
domcom_reputation_find_candidate_effect = {
    set_variable = { name = domcom_rep_candidate_score value = 0 }
    set_variable = { name = domcom_rep_candidate value = flag:none }

    if = { limit = { var:domcom_rep_guardian >= var:domcom_rep_candidate_score } set_variable = { name = domcom_rep_candidate_score value = var:domcom_rep_guardian } set_variable = { name = domcom_rep_candidate value = flag:guardian } }
    if = { limit = { var:domcom_rep_liberator > var:domcom_rep_candidate_score } set_variable = { name = domcom_rep_candidate_score value = var:domcom_rep_liberator } set_variable = { name = domcom_rep_candidate value = flag:liberator } }
    if = { limit = { var:domcom_rep_restorer > var:domcom_rep_candidate_score } set_variable = { name = domcom_rep_candidate_score value = var:domcom_rep_restorer } set_variable = { name = domcom_rep_candidate value = flag:restorer } }
    if = { limit = { var:domcom_rep_champion > var:domcom_rep_candidate_score } set_variable = { name = domcom_rep_candidate_score value = var:domcom_rep_champion } set_variable = { name = domcom_rep_candidate value = flag:champion } }
    if = { limit = { var:domcom_rep_patron > var:domcom_rep_candidate_score } set_variable = { name = domcom_rep_candidate_score value = var:domcom_rep_patron } set_variable = { name = domcom_rep_candidate value = flag:patron } }
    if = { limit = { var:domcom_rep_dynast > var:domcom_rep_candidate_score } set_variable = { name = domcom_rep_candidate_score value = var:domcom_rep_dynast } set_variable = { name = domcom_rep_candidate value = flag:dynast } }
    if = { limit = { var:domcom_rep_paramour > var:domcom_rep_candidate_score } set_variable = { name = domcom_rep_candidate_score value = var:domcom_rep_paramour } set_variable = { name = domcom_rep_candidate value = flag:paramour } }
    if = { limit = { var:domcom_rep_breaker > var:domcom_rep_candidate_score } set_variable = { name = domcom_rep_candidate_score value = var:domcom_rep_breaker } set_variable = { name = domcom_rep_candidate value = flag:breaker } }
    if = { limit = { var:domcom_rep_predator > var:domcom_rep_candidate_score } set_variable = { name = domcom_rep_candidate_score value = var:domcom_rep_predator } set_variable = { name = domcom_rep_candidate value = flag:predator } }
    if = { limit = { var:domcom_rep_overlord > var:domcom_rep_candidate_score } set_variable = { name = domcom_rep_candidate_score value = var:domcom_rep_overlord } set_variable = { name = domcom_rep_candidate value = flag:overlord } }
    if = { limit = { var:domcom_rep_warhound > var:domcom_rep_candidate_score } set_variable = { name = domcom_rep_candidate_score value = var:domcom_rep_warhound } set_variable = { name = domcom_rep_candidate value = flag:warhound } }
}

# Character scope. Cache incumbent score so challengers need a real lead before the public identity changes.
domcom_reputation_cache_incumbent_effect = {
    set_variable = { name = domcom_rep_incumbent_score value = 0 }
    if = { limit = { has_variable = domcom_reputation_archetype var:domcom_reputation_archetype = flag:paramour } set_variable = { name = domcom_rep_incumbent_score value = var:domcom_rep_paramour } }
    else_if = { limit = { has_variable = domcom_reputation_archetype var:domcom_reputation_archetype = flag:patron } set_variable = { name = domcom_rep_incumbent_score value = var:domcom_rep_patron } }
    else_if = { limit = { has_variable = domcom_reputation_archetype var:domcom_reputation_archetype = flag:guardian } set_variable = { name = domcom_rep_incumbent_score value = var:domcom_rep_guardian } }
    else_if = { limit = { has_variable = domcom_reputation_archetype var:domcom_reputation_archetype = flag:liberator } set_variable = { name = domcom_rep_incumbent_score value = var:domcom_rep_liberator } }
    else_if = { limit = { has_variable = domcom_reputation_archetype var:domcom_reputation_archetype = flag:restorer } set_variable = { name = domcom_rep_incumbent_score value = var:domcom_rep_restorer } }
    else_if = { limit = { has_variable = domcom_reputation_archetype var:domcom_reputation_archetype = flag:champion } set_variable = { name = domcom_rep_incumbent_score value = var:domcom_rep_champion } }
    else_if = { limit = { has_variable = domcom_reputation_archetype var:domcom_reputation_archetype = flag:dynast } set_variable = { name = domcom_rep_incumbent_score value = var:domcom_rep_dynast } }
    else_if = { limit = { has_variable = domcom_reputation_archetype var:domcom_reputation_archetype = flag:breaker } set_variable = { name = domcom_rep_incumbent_score value = var:domcom_rep_breaker } }
    else_if = { limit = { has_variable = domcom_reputation_archetype var:domcom_reputation_archetype = flag:predator } set_variable = { name = domcom_rep_incumbent_score value = var:domcom_rep_predator } }
    else_if = { limit = { has_variable = domcom_reputation_archetype var:domcom_reputation_archetype = flag:overlord } set_variable = { name = domcom_rep_incumbent_score value = var:domcom_rep_overlord } }
    else_if = { limit = { has_variable = domcom_reputation_archetype var:domcom_reputation_archetype = flag:warhound } set_variable = { name = domcom_rep_incumbent_score value = var:domcom_rep_warhound } }
}

# Character scope. Rebuild the public marker and apply 8-point hysteresis.
domcom_refresh_reputation_effect = {
    domcom_reputation_initialize_effect = yes
    domcom_reputation_clamp_effect = yes
    domcom_reputation_find_candidate_effect = yes
    domcom_reputation_cache_incumbent_effect = yes

    if = {
        limit = { var:domcom_reputation_strength < 10 }
        set_variable = { name = domcom_reputation_archetype value = flag:none }
    }
    else_if = {
        limit = { OR = { NOT = { has_variable = domcom_reputation_archetype } var:domcom_reputation_archetype = flag:none } }
        set_variable = { name = domcom_reputation_archetype value = var:domcom_rep_candidate }
    }
    else = {
        set_variable = { name = domcom_rep_switch_threshold value = var:domcom_rep_incumbent_score }
        change_variable = { name = domcom_rep_switch_threshold add = 8 }
        if = { limit = { var:domcom_rep_candidate_score >= var:domcom_rep_switch_threshold } set_variable = { name = domcom_reputation_archetype value = var:domcom_rep_candidate } }
    }

    remove_character_modifier = domcom_reputation_emerging
    remove_character_modifier = domcom_reputation_established
    remove_character_modifier = domcom_reputation_renowned
    remove_character_modifier = domcom_reputation_legendary
    remove_character_modifier = domcom_reputation_mythic
    remove_character_modifier = domcom_archetype_paramour
    remove_character_modifier = domcom_archetype_patron
    remove_character_modifier = domcom_archetype_guardian
    remove_character_modifier = domcom_archetype_liberator
    remove_character_modifier = domcom_archetype_restorer
    remove_character_modifier = domcom_archetype_champion
    remove_character_modifier = domcom_archetype_dynast
    remove_character_modifier = domcom_archetype_breaker
    remove_character_modifier = domcom_archetype_predator
    remove_character_modifier = domcom_archetype_overlord
    remove_character_modifier = domcom_archetype_warhound

    if = { limit = { var:domcom_reputation_strength >= 100 } add_character_modifier = domcom_reputation_mythic }
    else_if = { limit = { var:domcom_reputation_strength >= 75 } add_character_modifier = domcom_reputation_legendary }
    else_if = { limit = { var:domcom_reputation_strength >= 50 } add_character_modifier = domcom_reputation_renowned }
    else_if = { limit = { var:domcom_reputation_strength >= 25 } add_character_modifier = domcom_reputation_established }
    else_if = { limit = { var:domcom_reputation_strength >= 10 } add_character_modifier = domcom_reputation_emerging }

    if = {
        limit = { var:domcom_reputation_strength >= 10 }
        if = { limit = { var:domcom_reputation_archetype = flag:paramour } add_character_modifier = domcom_archetype_paramour }
        else_if = { limit = { var:domcom_reputation_archetype = flag:patron } add_character_modifier = domcom_archetype_patron }
        else_if = { limit = { var:domcom_reputation_archetype = flag:guardian } add_character_modifier = domcom_archetype_guardian }
        else_if = { limit = { var:domcom_reputation_archetype = flag:liberator } add_character_modifier = domcom_archetype_liberator }
        else_if = { limit = { var:domcom_reputation_archetype = flag:restorer } add_character_modifier = domcom_archetype_restorer }
        else_if = { limit = { var:domcom_reputation_archetype = flag:champion } add_character_modifier = domcom_archetype_champion }
        else_if = { limit = { var:domcom_reputation_archetype = flag:dynast } add_character_modifier = domcom_archetype_dynast }
        else_if = { limit = { var:domcom_reputation_archetype = flag:breaker } add_character_modifier = domcom_archetype_breaker }
        else_if = { limit = { var:domcom_reputation_archetype = flag:predator } add_character_modifier = domcom_archetype_predator }
        else_if = { limit = { var:domcom_reputation_archetype = flag:overlord } add_character_modifier = domcom_archetype_overlord }
        else_if = { limit = { var:domcom_reputation_archetype = flag:warhound } add_character_modifier = domcom_archetype_warhound }
    }

    remove_variable = domcom_rep_candidate_score
    remove_variable = domcom_rep_candidate
    remove_variable = domcom_rep_incumbent_score
    remove_variable = domcom_rep_switch_threshold
}

# Score hooks. Small increments are deliberate: career reputation should be difficult to click-farm.
domcom_rep_gain_paramour_small_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_paramour add = 1 } change_variable = { name = domcom_reputation_strength add = 1 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_paramour_major_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_paramour add = 5 } change_variable = { name = domcom_reputation_strength add = 3 } domcom_refresh_reputation_effect = yes }
# Compatibility aliases for 2.6.20 hooks.
domcom_rep_gain_seducer_small_effect = { domcom_rep_gain_paramour_small_effect = yes }
domcom_rep_gain_seducer_major_effect = { domcom_rep_gain_paramour_major_effect = yes }

domcom_rep_gain_patron_major_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_patron add = 5 } change_variable = { name = domcom_reputation_strength add = 3 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_guardian_major_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_guardian add = 8 } change_variable = { name = domcom_reputation_strength add = 5 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_liberator_major_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_liberator add = 8 } change_variable = { name = domcom_reputation_strength add = 5 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_restorer_major_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_restorer add = 7 } change_variable = { name = domcom_reputation_strength add = 4 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_champion_major_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_champion add = 7 } change_variable = { name = domcom_reputation_strength add = 4 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_dynast_small_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_dynast add = 2 } change_variable = { name = domcom_reputation_strength add = 1 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_breaker_small_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_breaker add = 2 } change_variable = { name = domcom_reputation_strength add = 1 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_breaker_major_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_breaker add = 5 } change_variable = { name = domcom_reputation_strength add = 3 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_predator_major_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_predator add = 6 } change_variable = { name = domcom_reputation_strength add = 4 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_overlord_small_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_overlord add = 2 } change_variable = { name = domcom_reputation_strength add = 1 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_overlord_major_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_overlord add = 6 } change_variable = { name = domcom_reputation_strength add = 4 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_warhound_major_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_warhound add = 6 } change_variable = { name = domcom_reputation_strength add = 4 } domcom_refresh_reputation_effect = yes }

domcom_rep_gain_guardian_small_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_guardian add = 2 } change_variable = { name = domcom_reputation_strength add = 1 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_champion_small_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_champion add = 2 } change_variable = { name = domcom_reputation_strength add = 1 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_champion_medium_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_champion add = 4 } change_variable = { name = domcom_reputation_strength add = 2 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_predator_small_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_predator add = 2 } change_variable = { name = domcom_reputation_strength add = 1 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_warhound_small_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_warhound add = 2 } change_variable = { name = domcom_reputation_strength add = 1 } domcom_refresh_reputation_effect = yes }
domcom_rep_gain_warhound_medium_effect = { domcom_reputation_initialize_effect = yes change_variable = { name = domcom_rep_warhound add = 4 } change_variable = { name = domcom_reputation_strength add = 2 } domcom_refresh_reputation_effect = yes }

domcom_rep_opposition_loss_effect = {
    domcom_reputation_initialize_effect = yes
    change_variable = { name = domcom_rep_overlord subtract = 4 }
    change_variable = { name = domcom_rep_breaker subtract = 2 }
    change_variable = { name = domcom_reputation_strength subtract = 3 }
    domcom_refresh_reputation_effect = yes
}

# Failures can damage the aura without deleting the history that produced it.
domcom_rep_alpha_failure_effect = {
    domcom_reputation_initialize_effect = yes
    change_variable = { name = domcom_rep_breaker subtract = 1 }
    change_variable = { name = domcom_reputation_strength subtract = 1 }
    domcom_refresh_reputation_effect = yes
}
