﻿riseandfall_diadochi_cb = {
    icon = invasion_cb
    group = conquest

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

    allowed_for_character = {
        # Allow independent rulers to open this CB. Defender gating is handled
        # by `allowed_against_character` / `riseandfall_is_diadochi_target_trigger`.
        is_independent_ruler = yes
        NOR = {
            government_has_flag = government_is_landless_adventurer
        }
    }

    allowed_against_character = {
        NOT = { this = scope:attacker }
        is_independent_ruler = yes
        riseandfall_is_diadochi_target_trigger = yes
    }

    target_titles = all
    target_title_tier = kingdom
    target_de_jure_regions_above = yes
    ignore_effect = change_title_holder

    valid_to_start = {
        # Smaller or equal successor states fight a border skirmish for one
        # neighboring kingdom. Larger states use the separate absorption CB.
        scope:attacker.realm_size <= scope:defender.realm_size
        scope:target = {
            is_landless_type_title = no
            any_in_de_jure_hierarchy = {
                tier = tier_county
                neighboring_county_or_viking_conquest_trigger = { CHARACTER = root }
                holder ?= {
                    OR = {
                        this = scope:defender
                        is_vassal_or_below_of = scope:defender
                    }
                }
            }
        }
    }

    # Do not auto-invalidate: this CB is often started via scripted `start_war`
    # during pulses, and any transient scope/target evaluation can immediately
    # end the war. Declaration legality is already ensured by
    # allowed_for_character / allowed_against_character and by `can_declare_war`
    # checks in the forcing scripted effect.
    should_invalidate = { always = no }

    on_invalidated_desc = msg_invalidate_war_title
    on_invalidated = {
        scope:attacker = {
            remove_variable = rf_diadochi_prewar_realm_size
            remove_variable = rf_diadochi_pre_settlement_realm_size
        }
        scope:defender = {
            remove_variable = rf_diadochi_prewar_realm_size
            remove_variable = rf_diadochi_pre_settlement_realm_size
        }
    }

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

    on_declaration = {
        on_declared_war = yes
        scope:attacker = {
            set_variable = {
                name = rf_diadochi_prewar_realm_size
                value = realm_size
            }
            set_variable = {
                name = rf_diadochi_pre_settlement_realm_size
                value = realm_size
            }
        }
        scope:defender = {
            set_variable = {
                name = rf_diadochi_prewar_realm_size
                value = realm_size
            }
            set_variable = {
                name = rf_diadochi_pre_settlement_realm_size
                value = realm_size
            }
        }
    }

    on_victory_desc = { desc = RISEANDFALL_DIADOCHI_ON_VICTORY_DESC }
    on_white_peace_desc = { desc = RISEANDFALL_DIADOCHI_ON_WHITE_PEACE_DESC }
    on_defeat_desc = { desc = RISEANDFALL_DIADOCHI_ON_DEFEAT_DESC }

    on_victory = {
        clear_saved_scope = rf_defender_split_title
        clear_saved_scope = rf_attacker_old_split_title

        scope:attacker = { show_pow_release_message_effect = yes }

        add_legitimacy_attacker_victory_effect = yes
        scope:attacker = { accolade_attacker_war_end_glory_gain_low_effect = yes }

        # Keep both successor title scopes stable while the kingdom transfer
        # changes the defender's primary title and vassal structure.
        scope:defender = {
            if = {
                limit = {
                    exists = primary_title
                    primary_title = {
                        has_variable = rf_is_successor_split_title
                    }
                }
                primary_title = { save_scope_as = rf_defender_split_title }
            }
        }
        scope:attacker = {
            if = {
                limit = {
                    exists = primary_title
                    primary_title = {
                        OR = {
                            has_variable = rf_is_successor_split_title
                            is_titular = yes
                        }
                    }
                }
                primary_title = { save_scope_as = rf_attacker_old_split_title }
            }
        }
        # Transfer only the selected neighboring kingdom. The shared effect
        # uses vanilla complete-subrealm eligibility, not occupation progress.
        riseandfall_apply_de_jure_war_goal_victory_se = yes
        riseandfall_handoff_defender_random_county_se = yes

        # Inspect the winner's live titles after transfer instead of relying on
        # `titles_taken`, which can omit the proper crown after invasion-style
        # title-and-vassal resolution. A same-rank proper title must replace a
        # titular successor primary before the obsolete crown can be destroyed.
        scope:attacker = {
            ordered_held_title = {
                limit = {
                    is_titular = no
                    tier >= scope:attacker.primary_title.tier
                }
                order_by = tier
                max = 1
                check_range_bounds = no
                save_temporary_scope_as = rf_diadochi_highest_taken_title
            }
        }
        if = {
            limit = { exists = scope:rf_diadochi_highest_taken_title }
            scope:attacker = {
                set_primary_title_to = scope:rf_diadochi_highest_taken_title
            }
        }

        # If the defender's successor crown was transferred with the target,
        # prefer it as the surviving primary title when it outranks the old shell.
        if = {
            limit = {
                exists = scope:rf_defender_split_title
                scope:rf_defender_split_title = {
                    holder = scope:attacker
                    is_titular = no
                    OR = {
                        this = scope:attacker.primary_title
                        tier >= scope:attacker.primary_title.tier
                    }
                }
            }
            scope:attacker = {
                set_primary_title_to = scope:rf_defender_split_title
            }
        }

        if = {
            limit = {
                exists = scope:rf_defender_split_title
                scope:rf_defender_split_title = {
                    holder = scope:attacker
                    is_titular = no
                }
                NOT = { scope:rf_defender_split_title = scope:attacker.primary_title }
            }
            scope:rf_defender_split_title = {
                remove_variable = rf_is_successor_split_title
                remove_variable = rf_successor_origin_title
                remove_variable = rf_successor_root_origin_title
                remove_variable = rf_is_permanent_successor_split
                remove_variable = rf_successor_permanent_realm_size
            }
        }

        # If the attacker replaced its temporary successor shell with a real
        # higher title, migrate the lineage markers before retiring that shell.
        if = {
            limit = {
                exists = scope:rf_attacker_old_split_title
                scope:attacker = { exists = primary_title }
                NOT = { scope:rf_attacker_old_split_title = scope:attacker.primary_title }
                scope:attacker.primary_title = { is_titular = no }
            }
            scope:attacker.primary_title = {
                if = {
                    limit = { scope:rf_attacker_old_split_title = { has_variable = rf_successor_origin_title } }
                    set_variable = {
                        name = rf_successor_origin_title
                        value = scope:rf_attacker_old_split_title.var:rf_successor_origin_title
                        years = 50
                    }
                }
                if = {
                    limit = { scope:rf_attacker_old_split_title = { has_variable = rf_successor_root_origin_title } }
                    set_variable = {
                        name = rf_successor_root_origin_title
                        value = scope:rf_attacker_old_split_title.var:rf_successor_root_origin_title
                        years = 30
                    }
                }
                set_variable = { name = rf_is_successor_split_title value = 1 years = 50 }
                set_variable = { name = rf_is_permanent_successor_split value = 1 }
                if = {
                    limit = { scope:rf_attacker_old_split_title = { has_variable = rf_successor_permanent_realm_size } }
                    set_variable = {
                        name = rf_successor_permanent_realm_size
                        value = scope:rf_attacker_old_split_title.var:rf_successor_permanent_realm_size
                    }
                }
                else = {
                    set_variable = {
                        name = rf_successor_permanent_realm_size
                        value = scope:attacker.realm_size
                    }
                }
            }
            scope:rf_attacker_old_split_title = {
                remove_variable = rf_is_successor_split_title
                remove_variable = rf_successor_origin_title
                remove_variable = rf_successor_root_origin_title
                remove_variable = rf_is_permanent_successor_split
                remove_variable = rf_successor_permanent_realm_size
            }
        }

        # Once a same-rank or higher proper crown becomes primary, retire every
        # obsolete successor crown after the transfer. Saved attacker and
        # defender crowns are included even after their markers were cleared.
        riseandfall_retire_obsolete_successor_titles_after_victory_se = yes

        scope:defender = { ep3_war_loss_adventurer_tt_effect = yes }

        if = {
            limit = {
                scope:attacker = { exists = primary_title }
                scope:defender = { exists = primary_title }
                scope:attacker.primary_title.tier > scope:defender.primary_title.tier
            }
            scope:attacker = {
                add_prestige_experience = {
                    value = medium_prestige_value
                }
            }
        }
        else = {
            every_in_list = {
                list = target_titles
                scope:attacker = {
                    add_prestige_experience = minor_prestige_value
                }
            }
        }

        modify_allies_of_participants_fame_values = {
            WINNER = scope:attacker
            FAME_BASE = minor_prestige_value
            IS_RELIGIOUS_WAR = no
            WINNER_ALLY_FAME_SCALE = 1
            LOSER_ALLY_FAME_SCALE = 1
        }

        add_truce_attacker_victory_effect = yes

        # Smaller victors receive only a one-year reprieve before the next
        # neighboring kingdom campaign. Override the vanilla five-year truce.
        if = {
            limit = {
                scope:attacker = { has_variable = rf_diadochi_prewar_realm_size }
                scope:defender = { has_variable = rf_diadochi_prewar_realm_size }
                scope:attacker.var:rf_diadochi_prewar_realm_size < scope:defender.var:rf_diadochi_prewar_realm_size
            }
            scope:attacker = {
                hidden_effect = {
                    add_truce_one_way = {
                        character = scope:defender
                        days = 365
                        override = yes
                        war = root.war
                        result = victory
                    }
                }
            }
        }

        scope:attacker = { fp1_remember_recent_conquest_victory_effect = yes }
        laamp_as_mercenary_payout_tooltip_effect = yes

        scope:attacker = {
            remove_variable = rf_diadochi_prewar_realm_size
            remove_variable = rf_diadochi_pre_settlement_realm_size
        }
        scope:defender = {
            remove_variable = rf_diadochi_prewar_realm_size
            remove_variable = rf_diadochi_pre_settlement_realm_size
        }
        clear_saved_scope = rf_defender_split_title
        clear_saved_scope = rf_attacker_old_split_title
    }

    on_white_peace = {
        scope:attacker = { show_pow_release_message_effect = yes }
        scope:defender = { accolade_defender_war_end_glory_gain_low_effect = yes }

        scope:attacker = {
            add_prestige = {
                value = minor_prestige_value
                multiply = -1.0
            }
        }

        modify_allies_of_participants_fame_values = {
            WINNER = scope:attacker
            FAME_BASE = medium_prestige_value
            IS_RELIGIOUS_WAR = no
            WINNER_ALLY_FAME_SCALE = 1
            LOSER_ALLY_FAME_SCALE = 1
        }

        add_truce_white_peace_effect = yes
        laamp_as_mercenary_payout_tooltip_effect = yes

        scope:attacker = {
            remove_variable = rf_diadochi_prewar_realm_size
            remove_variable = rf_diadochi_pre_settlement_realm_size
        }
        scope:defender = {
            remove_variable = rf_diadochi_prewar_realm_size
            remove_variable = rf_diadochi_pre_settlement_realm_size
        }
    }

    on_defeat = {
        scope:attacker = { show_pow_release_message_effect = yes }

        add_legitimacy_attacker_defeat_effect = yes
        scope:defender = { accolade_defender_war_end_glory_gain_low_effect = yes }

        scope:attacker = {
            pay_short_term_gold_reparations_effect = {
                GOLD_VALUE = 2
            }
            add_prestige = {
                value = medium_prestige_value
                multiply = -1.0
            }
        }

        scope:defender = {
            add_prestige_war_defender_effect = {
                PRESTIGE_VALUE = medium_prestige_value
            }
        }

        modify_allies_of_participants_fame_values = {
            WINNER = scope:defender
            FAME_BASE = minor_prestige_value
            IS_RELIGIOUS_WAR = no
            WINNER_ALLY_FAME_SCALE = 1
            LOSER_ALLY_FAME_SCALE = 1
        }

        add_truce_attacker_defeat_effect = yes

        scope:attacker = {
            save_temporary_scope_as = loser
        }
        on_lost_aggression_war_discontent_loss = yes

        laamp_as_mercenary_payout_tooltip_effect = yes

        scope:attacker = {
            remove_variable = rf_diadochi_prewar_realm_size
            remove_variable = rf_diadochi_pre_settlement_realm_size
        }
        scope:defender = {
            remove_variable = rf_diadochi_prewar_realm_size
            remove_variable = rf_diadochi_pre_settlement_realm_size
        }
    }

    transfer_behavior = transfer

    on_primary_attacker_death = inherit
    on_primary_defender_death = inherit

    attacker_allies_inherit = yes
    defender_allies_inherit = yes

    war_name = "RISEANDFALL_DIADOCHI_WAR_NAME"
    war_name_base = "RISEANDFALL_DIADOCHI_WAR_NAME_BASE"
    cb_name = "RISEANDFALL_DIADOCHI_CB_NAME"

    interface_priority = 80

    use_de_jure_wargoal_only = yes
    ticking_war_score_targets_entire_realm = no
    # A small beachhead should be enough to contest passive defender ticking,
    # while defenders still need near-total control to win by denial alone.
    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_occupation_scale = 50
    defender_score_from_occupation_scale = 50
    attacker_score_from_battles_scale = 100
    defender_score_from_battles_scale = 100

    max_attacker_score_from_battles = 90
    max_defender_score_from_battles = 90
    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

    max_ai_diplo_distance_to_title = 50

    ai_score_mult = {
        value = 1
        add = house_relation_ai_score_value

        # Encourage aggression against successor/split realms.
        add = {
            if = {
                limit = {
                    scope:defender = { riseandfall_has_successor_primary_title_trigger = yes }
                }
                add = 80
            }
        }

        # Strong preference for wars between successor states of the same origin.
        add = {
            if = {
                limit = {
                    scope:attacker = { riseandfall_has_successor_primary_title_trigger = yes }
                    scope:defender = { riseandfall_has_successor_primary_title_trigger = yes }
                    scope:attacker.primary_title.var:rf_successor_root_origin_title = scope:defender.primary_title.var:rf_successor_root_origin_title
                }
                add = 220
            }
        }
    }
}
