﻿# Event-only retaliation war.  It exists solely so a ruler whose family/court was raided can
# demand the return of DDM kidnap victims instead of receiving only an opinion penalty.
ddm_kidnap_retrieval_cb = {
    icon = raid_for_captives_cb
    group = conquest
    target_titles = none
    ai = no
    should_check_for_interface_availability = no
    white_peace_possible = yes
    ticking_war_score_targets_entire_realm = yes
    attacker_ticking_warscore_delay = { months = 6 }
    defender_ticking_warscore_delay = { months = 6 }
    attacker_ticking_warscore = 0.2
    defender_ticking_warscore = 0.2
    attacker_score_from_battles_scale = 150
    defender_score_from_battles_scale = 150
    defender_capital_gives_war_score = yes
    truce_days = 1825

    allowed_for_character = { is_landed = yes }
    allowed_against_character = { scope:defender = { is_landed = yes } }
    # The same event-only CB handles two authored disputes:
    #   1) a DDM kidnapping victim still held in the defender's realm; or
    #   2) a Writ Hostage who was released only after DDM-imposed political coercion.
    # Keeping both paths here prevents the Writ system from repeatedly trying to start a war that
    # immediately invalidates because the hostage is no longer physically imprisoned.
    valid_to_start = {
        scope:attacker = {
            is_alive = yes
            is_at_war = no
            has_variable = ddm_kidnap_retrieval_target
            var:ddm_kidnap_retrieval_target = {
                is_alive = yes
                OR = {
                    AND = {
                        is_imprisoned = yes
                        OR = {
                            is_imprisoned_by = scope:defender
                            imprisoner ?= { top_liege = scope:defender }
                        }
                    }
                    AND = {
                        has_variable = ddm_writ_coercion_type
                        has_variable = ddm_writ_coerced_by
                        var:ddm_writ_coerced_by = { top_liege = scope:defender }
                    }
                }
                has_variable = ddm_kidnap_origin_top_liege
                var:ddm_kidnap_origin_top_liege = scope:attacker
                has_variable = ddm_kidnap_abductor_top_liege
                var:ddm_kidnap_abductor_top_liege = scope:defender
            }
        }
        scope:defender = { is_alive = yes is_at_war = no }
    }
    should_invalidate = {
        OR = {
            scope:attacker = { is_alive = no }
            scope:defender = { is_alive = no }
            scope:attacker = { NOT = { has_variable = ddm_kidnap_retrieval_target } }
            scope:attacker = {
                has_variable = ddm_kidnap_retrieval_target
                var:ddm_kidnap_retrieval_target = {
                    OR = {
                        is_alive = no
                        NOT = { has_variable = ddm_kidnap_origin_top_liege }
                        NOT = { var:ddm_kidnap_origin_top_liege = scope:attacker }
                        NOT = { has_variable = ddm_kidnap_abductor_top_liege }
                        NOT = { var:ddm_kidnap_abductor_top_liege = scope:defender }
                        NOR = {
                            AND = {
                                is_imprisoned = yes
                                OR = {
                                    is_imprisoned_by = scope:defender
                                    imprisoner ?= { top_liege = scope:defender }
                                }
                            }
                            AND = {
                                has_variable = ddm_writ_coercion_type
                                has_variable = ddm_writ_coerced_by
                                var:ddm_writ_coerced_by = { top_liege = scope:defender }
                            }
                        }
                    }
                }
            }
        }
    }

    on_victory_desc = { desc = DDM_KIDNAP_RETRIEVAL_VICTORY_DESC }
    on_white_peace_desc = { desc = DDM_KIDNAP_RETRIEVAL_WHITE_PEACE_DESC }
    on_defeat_desc = { desc = DDM_KIDNAP_RETRIEVAL_DEFEAT_DESC }
    on_invalidated_desc = { desc = DDM_KIDNAP_RETRIEVAL_INVALIDATED_DESC }

    on_victory = {
        # The kidnapper may be a vassal. Recover tagged captives from the defender or any of the
        # defender's subordinate prisons, then return them to the offended realm.
        scope:defender = {
            every_prisoner = {
                limit = {
                    has_variable = ddm_kidnap_origin_top_liege
                    var:ddm_kidnap_origin_top_liege = scope:attacker
                }
                save_temporary_scope_as = ddm_retrieved_prisoner
                release_from_prison = yes
                scope:ddm_retrieved_prisoner = {
                    set_employer = scope:attacker
                    if = {
                        limit = { has_variable = ddm_writ_origin_top_liege var:ddm_writ_origin_top_liege = scope:attacker }
                        ddm_clear_writ_origin_effect = yes
                    }
                    else = { remove_variable = ddm_kidnap_origin_top_liege }
                    remove_variable = ddm_kidnap_abductor_top_liege
                }
            }
            every_vassal_or_below = {
                every_prisoner = {
                    limit = {
                        has_variable = ddm_kidnap_origin_top_liege
                        var:ddm_kidnap_origin_top_liege = scope:attacker
                    }
                    save_temporary_scope_as = ddm_retrieved_prisoner
                    release_from_prison = yes
                    scope:ddm_retrieved_prisoner = {
                        set_employer = scope:attacker
                        if = {
                            limit = { has_variable = ddm_writ_origin_top_liege var:ddm_writ_origin_top_liege = scope:attacker }
                            ddm_clear_writ_origin_effect = yes
                        }
                        else = { remove_variable = ddm_kidnap_origin_top_liege }
                    remove_variable = ddm_kidnap_abductor_top_liege
                    }
                }
            }
        }
        # Restore DDM-imposed political coercion (forced courtier/vassal/tributary/abdication)
        # for people whose recorded origin is the victorious attacker.
        scope:attacker = { save_scope_as = ddm_retrieval_restorer }
        scope:defender = {
            every_courtier_or_guest = {
                limit = { has_variable = ddm_writ_origin_top_liege var:ddm_writ_origin_top_liege = scope:ddm_retrieval_restorer has_variable = ddm_writ_coercion_type }
                ddm_restore_writ_coercion_effect = yes
            }
            every_vassal_or_below = {
                limit = { has_variable = ddm_writ_origin_top_liege var:ddm_writ_origin_top_liege = scope:ddm_retrieval_restorer has_variable = ddm_writ_coercion_type }
                ddm_restore_writ_coercion_effect = yes
                every_courtier_or_guest = {
                    limit = { has_variable = ddm_writ_origin_top_liege var:ddm_writ_origin_top_liege = scope:ddm_retrieval_restorer has_variable = ddm_writ_coercion_type }
                    ddm_restore_writ_coercion_effect = yes
                }
            }
            every_tributary = {
                limit = { has_variable = ddm_writ_origin_top_liege var:ddm_writ_origin_top_liege = scope:ddm_retrieval_restorer has_variable = ddm_writ_coercion_type }
                ddm_restore_writ_coercion_effect = yes
            }
        }
        scope:attacker = {
            remove_variable = ddm_kidnap_retrieval_target
            add_prestige = 150
            if = {
                limit = { has_global_variable = domcom_profile_runtime_ready }
                # Cross-pack bridge without calling a Dominion scripted effect, so DDM remains standalone.
                if = { limit = { NOT = { has_variable = domcom_rep_guardian } } set_variable = { name = domcom_rep_guardian value = 0 } }
                if = { limit = { NOT = { has_variable = domcom_reputation_strength } } set_variable = { name = domcom_reputation_strength value = 0 } }
                change_variable = { name = domcom_rep_guardian add = 8 }
                change_variable = { name = domcom_reputation_strength add = 5 }
                if = { limit = { var:domcom_rep_guardian > 100 } set_variable = { name = domcom_rep_guardian value = 100 } }
                if = { limit = { var:domcom_reputation_strength > 100 } set_variable = { name = domcom_reputation_strength value = 100 } }
                set_variable = { name = domcom_reputation_dirty value = 1 }
            }
        }
        scope:defender = { add_prestige = -150 }
    }
    on_white_peace = {
        scope:attacker = { remove_variable = ddm_kidnap_retrieval_target add_prestige = 25 }
    }
    on_defeat = {
        scope:attacker = { remove_variable = ddm_kidnap_retrieval_target add_prestige = -100 }
        scope:defender = { add_prestige = 100 }
    }
    on_invalidated = {
        scope:attacker = { remove_variable = ddm_kidnap_retrieval_target }
    }

    war_name = DDM_KIDNAP_RETRIEVAL_WAR_NAME
}
