﻿# 2.6.21 — visible Living Market service economy.
# CSE still owns the underlying workforce jobs. This layer makes those jobs economically active,
# gives the player explicit listing/manual-offer controls, and turns Military Slaves into wartime contracts.

# Initialize report variables so the Workforce/Service Desk never shows unset values.
domcom_csr_initialize_service_report_effect = {
    if = { limit = { NOT = { has_variable = domcom_csr_service_court_gold } } set_variable = { name = domcom_csr_service_court_gold value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_csr_service_external_gold } } set_variable = { name = domcom_csr_service_external_gold value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_csr_service_military_gold } } set_variable = { name = domcom_csr_service_military_gold value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_csr_service_prestige } } set_variable = { name = domcom_csr_service_prestige value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_csr_service_piety } } set_variable = { name = domcom_csr_service_piety value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_csr_service_contracts } } set_variable = { name = domcom_csr_service_contracts value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_csr_service_military_completed } } set_variable = { name = domcom_csr_service_military_completed value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_csr_service_listed_count } } set_variable = { name = domcom_csr_service_listed_count value = 0 } }
    if = { limit = { NOT = { has_variable = domcom_csr_service_active_military_count } } set_variable = { name = domcom_csr_service_active_military_count value = 0 } }
}

# Court work is automatic once a CSE job is assigned. External listing is a separate owner control.
domcom_csr_apply_internal_court_service_effect = {
    save_scope_as = domcom_csr_service_slave
    if = {
        limit = { cse_is_assigned_as_labour_slave_trigger = yes }
        scope:domcom_csr_service_owner = {
            add_gold = 1
            change_variable = { name = domcom_csr_service_court_gold add = 1 }
        }
    }
    else_if = {
        limit = { cse_is_assigned_as_slave_prostitute_trigger = yes age >= 18 }
        scope:domcom_csr_service_owner = {
            add_gold = 1
            change_variable = { name = domcom_csr_service_court_gold add = 1 }
            random_courtier = {
                limit = {
                    is_alive = yes
                    age >= 18
                    is_imprisoned = no
                    this != scope:domcom_csr_service_slave
                }
                save_scope_as = domcom_csr_service_internal_client
            }
        }
        if = {
            limit = { exists = scope:domcom_csr_service_internal_client }
            had_sex_with_effect = { CHARACTER = scope:domcom_csr_service_internal_client PREGNANCY_CHANCE = 0 }
        }
    }
    else_if = {
        limit = { cse_is_assigned_as_sex_slave_trigger = yes age >= 18 }
        scope:domcom_csr_service_owner = {
            add_prestige = 1
            change_variable = { name = domcom_csr_service_prestige add = 1 }
            random_courtier = {
                limit = {
                    is_alive = yes
                    age >= 18
                    is_imprisoned = no
                    this != scope:domcom_csr_service_slave
                }
                save_scope_as = domcom_csr_service_internal_client
            }
        }
        if = {
            limit = { exists = scope:domcom_csr_service_internal_client }
            had_sex_with_effect = { CHARACTER = scope:domcom_csr_service_internal_client PREGNANCY_CHANCE = pregnancy_chance }
        }
    }
    else_if = {
        limit = { cse_is_assigned_as_military_slave_trigger = yes scope:domcom_csr_service_owner = { is_at_war = yes } }
        scope:domcom_csr_service_owner = {
            add_prestige = 1
            change_variable = { name = domcom_csr_service_prestige add = 1 }
        }
    }
}

# One immediate Labour/Prostitute/Sex service. Required scopes:
# scope:domcom_csr_service_slave, scope:domcom_csr_service_owner, scope:domcom_csr_service_client.
domcom_csr_execute_immediate_service_effect = {
    if = {
        limit = { scope:domcom_csr_service_slave = { cse_is_assigned_as_labour_slave_trigger = yes } }
        # Use CK3's transfer effect rather than remove_short_term_gold + add_gold. The former expands
        # to a negative add_gold call in this context and was producing script errors.
        scope:domcom_csr_service_client = {
            pay_short_term_gold = { target = scope:domcom_csr_service_owner gold = 40 }
            add_character_modifier = { modifier = domcom_csr_hired_labour_service_modifier days = 90 }
        }
        scope:domcom_csr_service_owner = {
            change_variable = { name = domcom_csr_service_external_gold add = 40 }
            change_variable = { name = domcom_csr_service_contracts add = 1 }
        }
    }
    else_if = {
        limit = { scope:domcom_csr_service_slave = { cse_is_assigned_as_slave_prostitute_trigger = yes age >= 18 } }
        scope:domcom_csr_service_client = {
            pay_short_term_gold = { target = scope:domcom_csr_service_owner gold = 60 }
            add_stress = -20
        }
        scope:domcom_csr_service_owner = {
            change_variable = { name = domcom_csr_service_external_gold add = 60 }
            change_variable = { name = domcom_csr_service_contracts add = 1 }
        }
        scope:domcom_csr_service_slave = { had_sex_with_effect = { CHARACTER = scope:domcom_csr_service_client PREGNANCY_CHANCE = 0 } }
    }
    else_if = {
        limit = { scope:domcom_csr_service_slave = { cse_is_assigned_as_sex_slave_trigger = yes age >= 18 } }
        scope:domcom_csr_service_client = {
            pay_short_term_gold = { target = scope:domcom_csr_service_owner gold = 80 }
            add_stress = -30
        }
        scope:domcom_csr_service_owner = {
            change_variable = { name = domcom_csr_service_external_gold add = 80 }
            change_variable = { name = domcom_csr_service_contracts add = 1 }
        }
        scope:domcom_csr_service_slave = { had_sex_with_effect = { CHARACTER = scope:domcom_csr_service_client PREGNANCY_CHANCE = pregnancy_chance } }
    }

    scope:domcom_csr_service_slave = { add_character_flag = { flag = domcom_csr_external_service_cooldown days = 90 } }
    if = {
        limit = { scope:domcom_csr_service_owner = { is_ai = no } }
        scope:domcom_csr_service_owner = {
            send_interface_toast = {
                type = event_toast_effect_good
                title = DOMCOM_CSR_SERVICE_COMPLETED_TOAST
                left_icon = scope:domcom_csr_service_slave
                right_icon = scope:domcom_csr_service_client
            }
        }
    }
    if = {
        limit = { scope:domcom_csr_service_client = { is_ai = no } }
        scope:domcom_csr_service_client = {
            send_interface_toast = {
                type = event_toast_effect_good
                title = DOMCOM_CSR_SERVICE_HIRED_TOAST
                left_icon = scope:domcom_csr_service_slave
                right_icon = scope:domcom_csr_service_owner
            }
        }
    }
}

# Apply/refresh the military contribution modifier according to the slave's live CSE rank.
domcom_csr_apply_military_service_modifier_effect = {
    if = {
        limit = { cse_is_slave_commander_trigger = yes }
        scope:domcom_csr_service_client = { add_character_modifier = { modifier = domcom_csr_hired_military_commander_modifier days = 45 } }
    }
    else_if = {
        limit = { cse_is_slave_soldier_trigger = yes }
        scope:domcom_csr_service_client = { add_character_modifier = { modifier = domcom_csr_hired_military_soldier_modifier days = 45 } }
    }
    else = {
        scope:domcom_csr_service_client = { add_character_modifier = { modifier = domcom_csr_hired_military_recruit_modifier days = 45 } }
    }
}

# Start a real wartime service contract. Gold is escrowed immediately from the hiring ruler.
# Rank × 400: Recruit/unranked 400, Soldier 800, Commander 1200.
domcom_csr_start_military_service_contract_effect = {
    save_scope_as = domcom_csr_service_slave
    set_variable = { name = domcom_csr_military_contract_value value = domcom_csr_military_contract_price_value }
    set_variable = { name = domcom_csr_military_service_employer value = scope:domcom_csr_service_client }
    set_variable = { name = domcom_csr_military_service_months value = 0 }
    add_character_flag = domcom_csr_military_contract_active
    add_character_modifier = { modifier = domcom_csr_military_deployed_modifier }

    scope:domcom_csr_service_client = {
        set_variable = { name = domcom_csr_service_temp_cost value = scope:domcom_csr_service_slave.var:domcom_csr_military_contract_value }
        remove_short_term_gold = var:domcom_csr_service_temp_cost
        remove_variable = domcom_csr_service_temp_cost
    }
    domcom_csr_apply_military_service_modifier_effect = yes

    if = {
        limit = { scope:domcom_csr_service_owner = { is_ai = no } }
        scope:domcom_csr_service_owner = {
            send_interface_toast = {
                type = event_toast_effect_good
                title = DOMCOM_CSR_MILITARY_CONTRACT_STARTED_TOAST
                left_icon = scope:domcom_csr_service_slave
                right_icon = scope:domcom_csr_service_client
            }
        }
    }
    if = {
        limit = { scope:domcom_csr_service_client = { is_ai = no } }
        scope:domcom_csr_service_client = {
            send_interface_toast = {
                type = event_toast_effect_good
                title = DOMCOM_CSR_MILITARY_HIRED_TOAST
                left_icon = scope:domcom_csr_service_slave
                right_icon = scope:domcom_csr_service_owner
            }
        }
    }
}

# Contract payout at peace. Current owner receives 99%; the serving slave keeps 1%.
domcom_csr_complete_military_service_contract_effect = {
    save_scope_as = domcom_csr_service_slave
    random_relation = { type = slave_owner save_scope_as = domcom_csr_service_owner }

    set_variable = { name = domcom_csr_military_owner_share value = var:domcom_csr_military_contract_value }
    change_variable = { name = domcom_csr_military_owner_share multiply = 0.99 }
    set_variable = { name = domcom_csr_military_slave_share value = var:domcom_csr_military_contract_value }
    change_variable = { name = domcom_csr_military_slave_share multiply = 0.01 }

    if = {
        limit = { exists = scope:domcom_csr_service_owner }
        scope:domcom_csr_service_owner = {
            add_gold = scope:domcom_csr_service_slave.var:domcom_csr_military_owner_share
            add_prestige = scope:domcom_csr_service_slave.var:domcom_csr_military_owner_share
            add_piety = scope:domcom_csr_service_slave.var:domcom_csr_military_owner_share
            change_variable = { name = domcom_csr_service_military_gold add = scope:domcom_csr_service_slave.var:domcom_csr_military_owner_share }
            change_variable = { name = domcom_csr_service_prestige add = scope:domcom_csr_service_slave.var:domcom_csr_military_owner_share }
            change_variable = { name = domcom_csr_service_piety add = scope:domcom_csr_service_slave.var:domcom_csr_military_owner_share }
            change_variable = { name = domcom_csr_service_contracts add = 1 }
            change_variable = { name = domcom_csr_service_military_completed add = 1 }
        }
        add_gold = var:domcom_csr_military_slave_share
        add_prestige = var:domcom_csr_military_slave_share
        add_piety = var:domcom_csr_military_slave_share
    }
    else = {
        add_gold = var:domcom_csr_military_contract_value
        add_prestige = var:domcom_csr_military_contract_value
        add_piety = var:domcom_csr_military_contract_value
    }

    if = {
        limit = { exists = scope:domcom_csr_service_owner scope:domcom_csr_service_owner = { is_ai = no } }
        scope:domcom_csr_service_owner = {
            send_interface_toast = {
                type = event_toast_effect_good
                title = DOMCOM_CSR_MILITARY_CONTRACT_PAID_TOAST
                left_icon = scope:domcom_csr_service_slave
            }
        }
    }

    remove_character_flag = domcom_csr_military_contract_active
    remove_character_modifier = domcom_csr_military_deployed_modifier
    add_character_flag = { flag = domcom_csr_external_service_cooldown days = 90 }
    remove_variable = domcom_csr_military_service_employer
    remove_variable = domcom_csr_military_service_months
    remove_variable = domcom_csr_military_contract_value
    remove_variable = domcom_csr_military_owner_share
    remove_variable = domcom_csr_military_slave_share
}

# While the hiring ruler remains at war the slave is exposed to battle risk and the employer's
# temporary military modifier is refreshed. The first pass uses wounds rather than scripted deaths
# so a contract cannot orphan state mid-effect.
domcom_csr_tick_military_service_contract_effect = {
    save_scope_as = domcom_csr_service_slave
    if = {
        limit = {
            has_variable = domcom_csr_military_service_employer
            var:domcom_csr_military_service_employer = { is_alive = yes is_at_war = yes }
        }
        var:domcom_csr_military_service_employer = { save_scope_as = domcom_csr_service_client }
        change_variable = { name = domcom_csr_military_service_months add = 1 }
        domcom_csr_apply_military_service_modifier_effect = yes
        random_list = {
            93 = { }
            6 = {
                if = { limit = { has_trait = wounded_2 } remove_trait = wounded_2 add_trait = wounded_3 }
                else_if = { limit = { has_trait = wounded_1 } remove_trait = wounded_1 add_trait = wounded_2 }
                else_if = { limit = { NOT = { has_trait = wounded_3 } } add_trait = wounded_1 }
            }
            1 = {
                if = { limit = { has_trait = wounded_1 } remove_trait = wounded_1 add_trait = wounded_3 }
                else_if = { limit = { NOT = { has_trait = wounded_2 } NOT = { has_trait = wounded_3 } } add_trait = wounded_2 }
            }
        }
    }
    else = { domcom_csr_complete_military_service_contract_effect = yes }
}

# AI realms automatically find one client per monthly pulse at most. This is deliberately one-slave,
# one-client work rather than a nested all-rulers/all-slaves scan.
domcom_csr_try_auto_external_service_effect = {
    save_scope_as = domcom_csr_service_slave
    random_relation = { type = slave_owner save_scope_as = domcom_csr_service_owner }
    if = {
        limit = { exists = scope:domcom_csr_service_owner }
        random_ruler = {
            limit = {
                is_alive = yes
                is_ai = yes
                this != scope:domcom_csr_service_owner
                in_diplomatic_range = scope:domcom_csr_service_owner
                trigger_if = {
                    limit = { scope:domcom_csr_service_slave = { domcom_csr_service_job_is_sexual_trigger = yes } }
                    age >= 18
                }
                OR = {
                    AND = {
                        scope:domcom_csr_service_slave = { cse_is_assigned_as_labour_slave_trigger = yes }
                        short_term_gold >= 40
                    }
                    AND = {
                        scope:domcom_csr_service_slave = { cse_is_assigned_as_slave_prostitute_trigger = yes age >= 18 }
                        short_term_gold >= 60
                    }
                    AND = {
                        scope:domcom_csr_service_slave = { cse_is_assigned_as_sex_slave_trigger = yes age >= 18 }
                        short_term_gold >= 80
                    }
                    AND = {
                        scope:domcom_csr_service_slave = { cse_is_assigned_as_military_slave_trigger = yes }
                        is_at_war = yes
                        short_term_gold >= scope:domcom_csr_service_slave.domcom_csr_military_contract_price_value
                    }
                }
            }
            save_scope_as = domcom_csr_service_client
        }
        if = {
            limit = { exists = scope:domcom_csr_service_client }
            if = {
                limit = { cse_is_assigned_as_military_slave_trigger = yes }
                domcom_csr_start_military_service_contract_effect = yes
            }
            else = { domcom_csr_execute_immediate_service_effect = yes }
        }
    }
}

# Monthly owner pulse: actual court earnings, active war contracts, plus at most one new external job.
domcom_csr_process_slave_services_effect = {
    save_scope_as = domcom_csr_service_owner
    domcom_csr_initialize_service_report_effect = yes

    every_relation = {
        type = slave
        limit = { is_alive = yes domcom_csr_has_service_job_trigger = yes }
        # Existing 2.6.20 saves gain a visible default listing unless the player explicitly opted out.
        if = {
            limit = {
                NOT = { has_variable = domcom_csr_service_listed }
                NOT = { has_variable = domcom_csr_service_opt_out }
            }
            set_variable = { name = domcom_csr_service_listed value = 1 }
        }
        if = {
            limit = { has_character_flag = domcom_csr_military_contract_active }
            domcom_csr_tick_military_service_contract_effect = yes
        }
        else = { domcom_csr_apply_internal_court_service_effect = yes }
    }

    # External client discovery uses random_ruler and can touch a wide political search space.
    # Try at most once per owner per ~quarter even when no client is found; successful services still
    # retain the per-slave 90-day cooldown. Internal court service remains monthly.
    if = {
        limit = { NOT = { has_character_flag = domcom_csr_external_search_recent } }
        random_relation = {
            type = slave
            limit = {
                is_alive = yes
                has_variable = domcom_csr_service_listed
                domcom_csr_can_offer_service_trigger = yes
                NOT = { has_character_flag = domcom_csr_external_service_cooldown }
            }
            save_temporary_scope_as = domcom_csr_external_search_slave
        }
        if = {
            limit = { exists = scope:domcom_csr_external_search_slave }
            add_character_flag = { flag = domcom_csr_external_search_recent days = 75 }
            scope:domcom_csr_external_search_slave = { domcom_csr_try_auto_external_service_effect = yes }
        }
    }
}
