﻿# Rise and Fall - Coalition War

riseandfall_coalition_cb = {
    icon = invasion_cb
    group = event

    combine_into_one = yes
    should_show_war_goal_subview = yes
    mutually_exclusive_titles = { always = yes }

    # This CB is started only by the Coalition assembly effect. Match vanilla
    # event-war CBs so ordinary declaration rules cannot reject start_war.
    allowed_for_character = {}
    allowed_for_character_display_regardless = {}
    allowed_against_character = {}

    target_titles = all
    target_title_tier = all
    ignore_effect = change_title_holder

    # A hard-won compromise disperses the league without dismantling the realm.
    white_peace_possible = yes

    valid_to_start = { always = no }

    # Runtime validity is controlled by the war itself after scripted creation.
    should_invalidate = { always = no }

    on_invalidated_desc = { desc = RISEANDFALL_COALITION_ON_INVALIDATED_DESC }
    on_invalidated = {
        scope:defender = {
            riseandfall_coalition_consume_threat_se = { YEARS = 5 }
            remove_character_flag = rf_coalition_under_attack
            remove_variable = rf_coalition_core_title
        }
        scope:war = {
            every_war_attacker = {
                remove_character_flag = rf_coalition_independence_promised
            }
        }
    }

    cost = {
        piety = { value = 0 }
        prestige = { value = 0 }
    }

    on_declaration = {
        on_declared_war = yes
        scope:defender = {
            remove_character_flag = rf_coalition_formation_active
            add_character_flag = rf_coalition_under_attack
        }
    }

    on_victory_desc = { desc = RISEANDFALL_COALITION_ON_VICTORY_DESC }
    on_white_peace_desc = { desc = RISEANDFALL_COALITION_ON_WHITE_PEACE_DESC }
    on_defeat_desc = { desc = RISEANDFALL_COALITION_ON_DEFEAT_DESC }

    on_victory = {
        scope:attacker = { show_pow_release_message_effect = yes }
        add_legitimacy_attacker_victory_effect = yes
        scope:attacker = { accolade_attacker_war_end_glory_gain_med_effect = yes }

        # The ballot processes every current attacker before selecting Light,
        # Medium, or Heavy. Internal rebels receive independence only in the
        # territorial Medium/Heavy outcomes.
        scope:defender = {
            riseandfall_coalition_reset_threat_se = yes
            riseandfall_coalition_start_victory_vote_se = {
                COALITION_LEADER = scope:attacker
                COALITION_WAR = scope:war
                COALITION_TARGET = scope:defender
            }
        }

        add_truce_attacker_victory_effect = yes
        laamp_as_mercenary_payout_tooltip_effect = yes
    }

    on_white_peace = {
        scope:attacker = { show_pow_release_message_effect = yes }
        scope:defender = {
            riseandfall_coalition_consume_threat_se = { YEARS = 5 }
            remove_character_flag = rf_coalition_under_attack
            remove_variable = rf_coalition_core_title
            accolade_defender_war_end_glory_gain_low_effect = yes
        }
        scope:war = {
            every_war_attacker = {
                remove_character_flag = rf_coalition_independence_promised
            }
        }
        add_truce_white_peace_effect = yes
        laamp_as_mercenary_payout_tooltip_effect = yes
    }

    on_defeat = {
        scope:attacker = { show_pow_release_message_effect = yes }
        add_legitimacy_attacker_defeat_effect = yes
        scope:defender = {
            riseandfall_coalition_consume_threat_se = { YEARS = 10 }
            remove_character_flag = rf_coalition_under_attack
            accolade_defender_war_end_glory_gain_high_effect = yes
        }

        # Only the target's own direct vassals carry this promise flag. Mirror
        # normal failed-revolt handling: prison plus one valid revoke reason.
        scope:war = {
            every_war_attacker = {
                if = {
                    limit = {
                        has_character_flag = rf_coalition_independence_promised
                        is_alive = yes
                        is_landed = yes
                        exists = liege
                        liege = scope:defender
                    }
                    if = {
                        limit = { is_imprisoned = no }
                        hard_imprison_character_effect = {
                            TARGET = this
                            IMPRISONER = scope:defender
                        }
                    }
                    scope:defender = {
                        add_opinion = {
                            target = prev
                            modifier = vassal_lost_faction_revolt_war
                        }
                    }
                    add_faction_cooldown_effect = { YEARS = faction_war_defeat_cooldown }
                }
                remove_character_flag = rf_coalition_independence_promised
            }
        }
        scope:defender = { remove_variable = rf_coalition_core_title }
        add_truce_attacker_defeat_effect = yes
        laamp_as_mercenary_payout_tooltip_effect = yes
    }

    transfer_behavior = transfer
    on_primary_attacker_death = inherit
    on_primary_defender_death = inherit
    attacker_allies_inherit = yes
    defender_allies_inherit = yes

    war_name = "RISEANDFALL_COALITION_WAR_NAME"
    war_name_base = "RISEANDFALL_COALITION_WAR_NAME_BASE"
    cb_name = "RISEANDFALL_COALITION_CB_NAME"

    interface_priority = 80
    ticking_war_score_targets_entire_realm = yes
    attacker_wargoal_percentage = 0.01
    defender_wargoal_percentage = 0.95
    attacker_ticking_warscore_delay = { months = 36 }
    defender_ticking_warscore_delay = { months = 36 }
    attacker_ticking_warscore = 0.03
    defender_ticking_warscore = 0.03
    attacker_score_from_battles_scale = 100
    defender_score_from_battles_scale = 100
    max_attacker_score_from_battles = 100
    max_defender_score_from_battles = 100
    max_attacker_score_from_occupation = 100
    max_defender_score_from_occupation = 100
    full_occupation_by_defender_gives_victory = yes
    full_occupation_by_attacker_gives_victory = yes
    landless_attacker_needs_armies = no
    allow_hostages = yes

    ai_score_mult = { value = 0 }
}
