﻿# 2.6.20 player market: all existing slaves whose owners are within diplomatic range are visible.
# Seller willingness and CSR's narrower dynamic trading-range rule no longer hide rows. The local
# slave merchant is also kept stocked so buying two people cannot empty the entire Exchange.

domcom_csr_clear_exchange_buy_cache_effect = {
    if = {
        limit = { has_variable_list = domcom_csr_ui_buy_sorted }
        every_in_list = {
            variable = domcom_csr_ui_buy_sorted
            remove_variable = domcom_csr_ui_ask_price
            remove_variable = domcom_csr_ui_seller
            remove_variable = domcom_csr_ui_market_player
        }
    }
    if = {
        limit = { has_variable_list = domcom_csr_ui_buy_candidates }
        every_in_list = {
            variable = domcom_csr_ui_buy_candidates
            remove_variable = domcom_csr_ui_ask_price
            remove_variable = domcom_csr_ui_seller
            remove_variable = domcom_csr_ui_market_player
        }
    }
    clear_variable_list = domcom_csr_ui_buy_candidates
    clear_variable_list = domcom_csr_ui_buy_sorted
    clear_variable_list = domcom_csr_ui_buy_list
}

domcom_csr_clear_exchange_sell_cache_effect = {
    if = { limit = { has_variable_list = domcom_csr_ui_sell_buyers } every_in_list = { variable = domcom_csr_ui_sell_buyers remove_variable = domcom_csr_ui_bid_price remove_variable = domcom_csr_ui_market_player remove_variable = domcom_csr_ui_market_slave remove_variable = domcom_csr_ui_market_seller } }
    clear_variable_list = domcom_csr_ui_sell_candidates
    clear_variable_list = domcom_csr_ui_sell_buyers
    clear_variable_list = domcom_csr_ui_sell_page_list
}

# Keep a persistent CSR slave trader at the player's capital with twelve living slaves.
# This uses CSR's own merchant, character-generation and enslavement effects; no custom slave
# relation format is introduced. Bought stock is replenished the next time the Buy list rebuilds.
domcom_csr_restock_player_market_effect = {
    save_scope_as = domcom_csr_market_buyer
    if = {
        limit = {
            is_alive = yes
            exists = capital_province
            NOT = { has_game_rule = carn_slavery_content_disabled }
            carnx_can_be_slave_owner_trigger = yes
            any_ruler = {
                is_landed_or_landless_administrative = yes
                carnx_is_valid_template_character_trigger = { CHARACTER = root }
            }
        }

        carnx_get_merchant_effect = {
            TYPE = slave_trader
            LOCATION = root.capital_province
            CHARACTER = root
            BLACKLIST = none
            MERCHANT = domcom_csr_exchange_merchant
        }

        if = {
            limit = { exists = scope:domcom_csr_exchange_merchant }
            carnx_get_template_character_effect = {
                CHARACTER = root
                CHARACTER2 = scope:domcom_csr_exchange_merchant
                TEMPLATE_CHARACTER = domcom_csr_exchange_template
            }
        }

        if = {
            limit = {
                exists = scope:domcom_csr_exchange_merchant
                exists = scope:domcom_csr_exchange_template
            }
            scope:domcom_csr_exchange_merchant = {
                every_relation = {
                    type = slave
                    carnx_return_slave_to_owner_effect = yes
                }
                # Bound retries independently of the external callback's success.
                set_variable = { name = domcom_csr_restock_attempts value = 0 }
                while = {
                    limit = {
                        var:domcom_csr_restock_attempts < 12
                        NOT = { any_relation = { type = slave count >= 12 } }
                    }
                    change_variable = { name = domcom_csr_restock_attempts add = 1 }
                    carnx_create_slave_effect = {
                        LOCATION = root.capital_province
                        CHARACTER = root
                        TEMPLATE_CHARACTER = scope:domcom_csr_exchange_template
                    }
                }
                remove_variable = domcom_csr_restock_attempts
            }
        }
    }
}

# Build only the requested page from the already sorted authoritative Buy roster.
domcom_csr_build_exchange_buy_page_effect = {
    save_scope_as = domcom_csr_ui_player
    if = { limit = { NOT = { has_variable = domcom_csr_ui_buy_page } } set_variable = { name = domcom_csr_ui_buy_page value = 0 } }
    set_variable = { name = domcom_csr_ui_buy_page_size value = 12 }
    set_variable = { name = domcom_csr_ui_buy_last_page value = 0 }
    set_variable = { name = domcom_csr_ui_buy_page_fill value = 0 }

    if = {
        limit = { has_variable_list = domcom_csr_ui_buy_sorted }
        every_in_list = {
            variable = domcom_csr_ui_buy_sorted
            scope:domcom_csr_ui_player = {
                if = {
                    limit = { var:domcom_csr_ui_buy_page_fill >= var:domcom_csr_ui_buy_page_size }
                    change_variable = { name = domcom_csr_ui_buy_last_page add = 1 }
                    set_variable = { name = domcom_csr_ui_buy_page_fill value = 0 }
                }
                change_variable = { name = domcom_csr_ui_buy_page_fill add = 1 }
            }
        }
    }

    if = { limit = { var:domcom_csr_ui_buy_page < 0 } set_variable = { name = domcom_csr_ui_buy_page value = 0 } }
    if = { limit = { var:domcom_csr_ui_buy_page > var:domcom_csr_ui_buy_last_page } set_variable = { name = domcom_csr_ui_buy_page value = var:domcom_csr_ui_buy_last_page } }

    set_variable = { name = domcom_csr_ui_buy_first value = var:domcom_csr_ui_buy_page }
    change_variable = { name = domcom_csr_ui_buy_first multiply = var:domcom_csr_ui_buy_page_size }
    set_variable = { name = domcom_csr_ui_buy_stop value = var:domcom_csr_ui_buy_first }
    change_variable = { name = domcom_csr_ui_buy_stop add = var:domcom_csr_ui_buy_page_size }
    set_variable = { name = domcom_csr_ui_buy_index value = 0 }
    clear_variable_list = domcom_csr_ui_buy_list

    if = {
        limit = { has_variable_list = domcom_csr_ui_buy_sorted }
        every_in_list = {
            variable = domcom_csr_ui_buy_sorted
            save_temporary_scope_as = domcom_csr_ui_buy_page_row
            scope:domcom_csr_ui_player = {
                if = {
                    limit = {
                        var:domcom_csr_ui_buy_index >= var:domcom_csr_ui_buy_first
                        var:domcom_csr_ui_buy_index < var:domcom_csr_ui_buy_stop
                    }
                    add_to_variable_list = { name = domcom_csr_ui_buy_list target = scope:domcom_csr_ui_buy_page_row }
                }
                change_variable = { name = domcom_csr_ui_buy_index add = 1 }
            }
        }
    }

    set_variable = { name = domcom_csr_ui_buy_page_display value = var:domcom_csr_ui_buy_page }
    change_variable = { name = domcom_csr_ui_buy_page_display add = 1 }
    set_variable = { name = domcom_csr_ui_buy_pages_display value = var:domcom_csr_ui_buy_last_page }
    change_variable = { name = domcom_csr_ui_buy_pages_display add = 1 }
}

# 2.6.23 performance: sort the cached candidate roster without rescanning every living character.
# Opening/Refresh/transactions still rebuild the authoritative candidate cache; changing a sort does not.
domcom_csr_resort_exchange_buy_effect = {
    save_scope_as = domcom_csr_ui_player
    clear_variable_list = domcom_csr_ui_buy_sorted
    clear_variable_list = domcom_csr_ui_buy_list
    set_variable = { name = domcom_csr_ui_buy_count value = 0 }

    if = {
        limit = { has_variable_list = domcom_csr_ui_buy_candidates }
        ordered_in_list = {
            variable = domcom_csr_ui_buy_candidates
            order_by = domcom_csr_ui_buy_order_value
            check_range_bounds = no
            max = 2000
            save_temporary_scope_as = domcom_csr_ui_row
            scope:domcom_csr_ui_player = {
                add_to_variable_list = { name = domcom_csr_ui_buy_sorted target = scope:domcom_csr_ui_row }
                change_variable = { name = domcom_csr_ui_buy_count add = 1 }
            }
        }
    }

    domcom_csr_build_exchange_buy_page_effect = yes
}

domcom_csr_prepare_exchange_buy_effect = {
    save_scope_as = domcom_csr_ui_player
    domcom_csr_clear_exchange_buy_cache_effect = yes
    domcom_csr_restock_player_market_effect = yes
    set_variable = { name = domcom_csr_ui_buy_count value = 0 }

    # Deliberately scan the slave population directly instead of asking CSR for its narrower
    # willingness/trading-range seller list. This is UI-time work only, never a simulation pulse.
    every_living_character = {
        limit = {
            carnx_is_slave_trigger = yes
            any_relation = {
                type = slave_owner
                is_alive = yes
                this != scope:domcom_csr_ui_player
                in_diplomatic_range = scope:domcom_csr_ui_player
            }
        }
        save_temporary_scope_as = domcom_csr_ui_slave
        random_relation = {
            type = slave_owner
            limit = {
                is_alive = yes
                this != scope:domcom_csr_ui_player
                in_diplomatic_range = scope:domcom_csr_ui_player
            }
            save_temporary_scope_as = seller
        }
        if = {
            limit = { exists = scope:seller }
            scope:domcom_csr_ui_player = { save_scope_as = buyer save_scope_as = actor }
            set_variable = { name = domcom_csr_ui_seller value = scope:seller }
            set_variable = { name = domcom_csr_ui_market_player value = scope:domcom_csr_ui_player }
            set_variable = { name = domcom_csr_ui_ask_price value = carnx_slave_ask_price_value }
            scope:domcom_csr_ui_player = {
                add_to_variable_list = { name = domcom_csr_ui_buy_candidates target = scope:domcom_csr_ui_slave }
            }
        }
    }

    domcom_csr_resort_exchange_buy_effect = yes
}

domcom_csr_prepare_owned_slaves_effect = {
    clear_variable_list = domcom_csr_ui_owned_slaves
    clear_variable_list = domcom_csr_ui_owned_candidates
    save_scope_as = domcom_csr_ui_player
    if = { limit = { NOT = { has_variable = domcom_csr_ui_owned_sort } } set_variable = { name = domcom_csr_ui_owned_sort value = 1 } }
    every_relation = {
        type = slave
        limit = { carnx_slave_can_be_sold_trigger = yes carnx_slave_has_pending_transaction = no }
        set_variable = { name = domcom_csr_ui_market_player value = scope:domcom_csr_ui_player }
        scope:domcom_csr_ui_player = { add_to_variable_list = { name = domcom_csr_ui_owned_candidates target = prev } }
    }
    if = {
        limit = { has_variable_list = domcom_csr_ui_owned_candidates }
        ordered_in_list = {
            variable = domcom_csr_ui_owned_candidates
            order_by = domcom_csr_ui_owned_order_value
            check_range_bounds = no
            max = 500
            save_temporary_scope_as = domcom_csr_ui_owned_row
            scope:domcom_csr_ui_player = { add_to_variable_list = { name = domcom_csr_ui_owned_slaves target = scope:domcom_csr_ui_owned_row } }
        }
    }
    clear_variable_list = domcom_csr_ui_owned_candidates
    domcom_csr_build_owned_page_effect = yes
}

domcom_csr_prepare_exchange_sell_buyers_effect = {
    save_scope_as = domcom_csr_ui_player
    domcom_csr_clear_exchange_sell_cache_effect = yes
    if = {
        limit = { has_variable = domcom_csr_ui_selected_slave var:domcom_csr_ui_selected_slave = { is_alive = yes carnx_slave_can_be_sold_trigger = yes } }
        var:domcom_csr_ui_selected_slave = { save_scope_as = slave }
        save_scope_as = seller
        carnx_get_valid_buyers_or_sellers_effect = { LIST = domcom_csr_ui_valid_buyers }
        every_in_list = {
            list = domcom_csr_ui_valid_buyers
            limit = {
                is_ai = yes
                is_alive = yes
                this != scope:domcom_csr_ui_player
                save_temporary_scope_as = buyer
                scope:domcom_csr_ui_player = {
                    is_character_interaction_potentially_accepted = {
                        interaction = carn_sell_slave_interaction
                        recipient = scope:buyer
                        secondary_recipient = scope:slave
                    }
                }
            }
            save_temporary_scope_as = buyer
            set_variable = { name = domcom_csr_ui_market_player value = scope:domcom_csr_ui_player }
            set_variable = { name = domcom_csr_ui_market_slave value = scope:slave }
            set_variable = { name = domcom_csr_ui_market_seller value = scope:domcom_csr_ui_player }
            scope:slave = { set_variable = { name = domcom_csr_ui_temp_bid value = domcom_csr_ui_effective_bid_value } }
            set_variable = { name = domcom_csr_ui_bid_price value = scope:slave.var:domcom_csr_ui_temp_bid }
            scope:slave = { remove_variable = domcom_csr_ui_temp_bid }
            # A row is a willing buyer only if there is an executable positive bid right now.
            # This prevents the board and bulk sale from treating zero-gold / zero-bid candidates as buyers.
            if = {
                limit = {
                    var:domcom_csr_ui_bid_price > 0
                    short_term_gold >= var:domcom_csr_ui_bid_price
                    has_variable = domcom_csr_ui_market_slave
                    var:domcom_csr_ui_market_slave = { carnx_slave_can_be_sold_trigger = yes carnx_slave_has_pending_transaction = no }
                }
                scope:domcom_csr_ui_player = { add_to_variable_list = { name = domcom_csr_ui_sell_candidates target = scope:buyer } }
            }
        }
        ordered_in_list = {
            variable = domcom_csr_ui_sell_candidates
            order_by = domcom_csr_ui_sell_order_value
            check_range_bounds = no
            max = 100
            save_temporary_scope_as = domcom_csr_ui_row
            scope:domcom_csr_ui_player = { add_to_variable_list = { name = domcom_csr_ui_sell_buyers target = scope:domcom_csr_ui_row } }
        }
        }
    domcom_csr_build_sell_page_effect = yes
}


# 2.6.2 — Slave household marriage board. CSR deliberately marks slave-concubines can_not_marry,
# so this board bypasses that blanket status while still using CSR's gender/consanguinity marriage
# compatibility trigger. Marriage does not free either spouse or change either slave relationship.
domcom_csr_clear_marriage_partner_cache_effect = {
    if = {
        limit = { has_variable_list = domcom_csr_ui_marriage_partners }
        every_in_list = { variable = domcom_csr_ui_marriage_partners remove_variable = domcom_csr_ui_market_player }
    }
    if = {
        limit = { has_variable_list = domcom_csr_ui_marriage_candidates }
        every_in_list = { variable = domcom_csr_ui_marriage_candidates remove_variable = domcom_csr_ui_market_player }
    }
    clear_variable_list = domcom_csr_ui_marriage_partners
    clear_variable_list = domcom_csr_ui_marriage_partner_page_list
    clear_variable_list = domcom_csr_ui_marriage_candidates
}

domcom_csr_prepare_marriage_slaves_effect = {
    clear_variable_list = domcom_csr_ui_marriage_slaves
    clear_variable_list = domcom_csr_ui_marriage_slave_candidates
    save_scope_as = domcom_csr_marriage_owner
    if = {
        limit = { NOT = { has_variable = domcom_csr_ui_marriage_slave_sort } }
        set_variable = { name = domcom_csr_ui_marriage_slave_sort value = 1 }
    }
    every_relation = {
        type = slave
        limit = { is_alive = yes age >= 18 is_married = no is_betrothed = no }
        set_variable = { name = domcom_csr_ui_market_player value = scope:domcom_csr_marriage_owner }
        scope:domcom_csr_marriage_owner = {
            add_to_variable_list = { name = domcom_csr_ui_marriage_slave_candidates target = prev }
        }
    }
    if = {
        limit = { has_variable_list = domcom_csr_ui_marriage_slave_candidates }
        ordered_in_list = {
            variable = domcom_csr_ui_marriage_slave_candidates
            order_by = domcom_csr_ui_marriage_slave_order_value
            check_range_bounds = no
            max = 500
            save_temporary_scope_as = domcom_csr_marriage_slave_sorted
            scope:domcom_csr_marriage_owner = {
                add_to_variable_list = { name = domcom_csr_ui_marriage_slaves target = scope:domcom_csr_marriage_slave_sorted }
            }
        }
    }
    clear_variable_list = domcom_csr_ui_marriage_slave_candidates
    domcom_csr_build_marriage_slave_page_effect = yes
}

domcom_csr_prepare_marriage_partners_effect = {
    save_scope_as = domcom_csr_marriage_owner
    domcom_csr_clear_marriage_partner_cache_effect = yes
    if = { limit = { NOT = { has_variable = domcom_csr_ui_marriage_sort } } set_variable = { name = domcom_csr_ui_marriage_sort value = 1 } }
    if = {
        limit = { has_variable = domcom_csr_ui_marriage_slave var:domcom_csr_ui_marriage_slave = { is_alive = yes age >= 18 is_married = no is_betrothed = no } }
        var:domcom_csr_ui_marriage_slave = { save_scope_as = domcom_csr_marriage_slave save_scope_as = ddm_match_subject }
        save_scope_as = ddm_match_actor

        # Ordinary people in the owner's court/guest pool.
        every_courtier_or_guest = {
            limit = {
                is_alive = yes age >= 18 is_married = no is_betrothed = no
                NOT = { this = scope:domcom_csr_marriage_slave }
                NOT = { has_relation_slave_owner = scope:domcom_csr_marriage_owner }
            }
            save_temporary_scope_as = domcom_csr_marriage_partner_candidate
            if = {
                limit = { scope:domcom_csr_marriage_slave = { carnx_allowed_to_marry_trigger = { CHARACTER = scope:domcom_csr_marriage_partner_candidate } } }
                set_variable = { name = domcom_csr_ui_market_player value = scope:domcom_csr_marriage_owner }
                scope:domcom_csr_marriage_owner = { add_to_variable_list = { name = domcom_csr_ui_marriage_candidates target = scope:domcom_csr_marriage_partner_candidate } }
            }
        }

        # Direct vassals.
        every_vassal = {
            limit = {
                is_alive = yes age >= 18 is_married = no is_betrothed = no
                NOT = { this = scope:domcom_csr_marriage_slave }
            }
            save_temporary_scope_as = domcom_csr_marriage_partner_candidate
            if = {
                limit = { scope:domcom_csr_marriage_slave = { carnx_allowed_to_marry_trigger = { CHARACTER = scope:domcom_csr_marriage_partner_candidate } } }
                set_variable = { name = domcom_csr_ui_market_player value = scope:domcom_csr_marriage_owner }
                scope:domcom_csr_marriage_owner = {
                    if = {
                        limit = { NOT = { any_in_list = { variable = domcom_csr_ui_marriage_candidates this = scope:domcom_csr_marriage_partner_candidate } } }
                        add_to_variable_list = { name = domcom_csr_ui_marriage_candidates target = scope:domcom_csr_marriage_partner_candidate }
                    }
                }
            }
        }

        # Other slaves owned by the player, including slave-concubines whom vanilla marriage UI hides.
        scope:domcom_csr_marriage_owner = {
            every_relation = {
                type = slave
                limit = {
                    is_alive = yes age >= 18 is_married = no is_betrothed = no
                    NOT = { this = scope:domcom_csr_marriage_slave }
                }
                save_temporary_scope_as = domcom_csr_marriage_partner_candidate
                if = {
                    limit = { scope:domcom_csr_marriage_slave = { carnx_allowed_to_marry_trigger = { CHARACTER = scope:domcom_csr_marriage_partner_candidate } } }
                    set_variable = { name = domcom_csr_ui_market_player value = scope:domcom_csr_marriage_owner }
                    scope:domcom_csr_marriage_owner = {
                        if = {
                            limit = { NOT = { any_in_list = { variable = domcom_csr_ui_marriage_candidates this = scope:domcom_csr_marriage_partner_candidate } } }
                            add_to_variable_list = { name = domcom_csr_ui_marriage_candidates target = scope:domcom_csr_marriage_partner_candidate }
                        }
                    }
                }
            }
        }

        # Rank the complete compatible pool after discovery. Best Children uses DDM's exact child-quality
        # score; Apex strongly favors Dominion's strategic-genetics standard, with normal stat sorts beside it.
        if = {
            limit = { has_variable_list = domcom_csr_ui_marriage_candidates }
            ordered_in_list = {
                variable = domcom_csr_ui_marriage_candidates
                order_by = domcom_csr_ui_marriage_order_value
                check_range_bounds = no
                max = 500
                save_temporary_scope_as = domcom_csr_marriage_partner_sorted
                scope:domcom_csr_marriage_owner = { add_to_variable_list = { name = domcom_csr_ui_marriage_partners target = scope:domcom_csr_marriage_partner_sorted } }
            }
        }
    }
    domcom_csr_build_marriage_partner_page_effect = yes
}


# 2.6.22 — Execute an Exchange sale directly through CSR's low-level transfer/consequence path.
# The previous GUI path called carn_buy_slave_effect, whose interface-message wrapper is reliable
# from interactions/events but can no-op when invoked from a scripted GUI/bulk loop. This helper
# explicitly creates the scope values that CSR expects, then calls carnx_buy_slave_effect itself.
# Required saved scopes: scope:seller, scope:buyer, scope:slave. The buyer row must carry
# domcom_csr_ui_bid_price.
domcom_csr_execute_exchange_sale_effect = {
    scope:slave = {
        save_scope_value_as = {
            name = slave_price
            value = scope:buyer.var:domcom_csr_ui_bid_price
        }
        save_scope_value_as = {
            name = buyer_short_term_gold
            value = scope:buyer.short_term_gold
        }
    }
    carnx_buy_slave_effect = yes
}

# 2.6.8 — Bulk market disposition. Selection is stored on each slave with the selecting owner,
# so a stale UI refresh cannot accidentally sell someone selected by another player/context.
domcom_csr_bulk_sell_selected_effect = {
    save_scope_as = domcom_csr_bulk_seller
    set_variable = { name = domcom_csr_bulk_sold_count value = 0 }
    set_variable = { name = domcom_csr_bulk_skipped_count value = 0 }
    clear_variable_list = domcom_csr_bulk_sell_snapshot

    every_relation = {
        type = slave
        limit = {
            has_variable = domcom_csr_bulk_sell_owner
            var:domcom_csr_bulk_sell_owner = scope:domcom_csr_bulk_seller
            carnx_slave_can_be_sold_trigger = yes
            carnx_slave_has_pending_transaction = no
            NOT = { has_character_flag = domcom_csr_military_contract_active }
        }
        save_temporary_scope_as = domcom_csr_bulk_slave
        scope:domcom_csr_bulk_seller = { add_to_variable_list = { name = domcom_csr_bulk_sell_snapshot target = scope:domcom_csr_bulk_slave } }
    }

    if = {
        limit = { has_variable_list = domcom_csr_bulk_sell_snapshot }
        every_in_list = {
            variable = domcom_csr_bulk_sell_snapshot
            save_temporary_scope_as = domcom_csr_bulk_slave
            remove_variable = domcom_csr_bulk_sell_owner
            scope:domcom_csr_bulk_seller = {
                save_scope_as = seller
                save_scope_as = actor
                set_variable = { name = domcom_csr_ui_selected_slave value = scope:domcom_csr_bulk_slave }
                set_variable = { name = domcom_csr_ui_sell_sort value = 1 }
                domcom_csr_prepare_exchange_sell_buyers_effect = yes
                if = {
                    limit = { has_variable_list = domcom_csr_ui_sell_buyers }
                    ordered_in_list = {
                        variable = domcom_csr_ui_sell_buyers
                        order_by = domcom_csr_bulk_bid_order_value
                        check_range_bounds = no
                        max = 1
                        limit = {
                            has_variable = domcom_csr_ui_bid_price
                            var:domcom_csr_ui_bid_price > 0
                            short_term_gold >= var:domcom_csr_ui_bid_price
                            has_variable = domcom_csr_ui_market_slave
                            var:domcom_csr_ui_market_slave = { carnx_slave_can_be_sold_trigger = yes }
                        }
                        save_temporary_scope_as = domcom_csr_bulk_buyer
                        save_scope_as = buyer
                        var:domcom_csr_ui_market_slave = { save_scope_as = slave }
                        domcom_csr_execute_exchange_sale_effect = yes
                        scope:domcom_csr_bulk_seller = { change_variable = { name = domcom_csr_bulk_sold_count add = 1 } }
                    }
                }
                if = {
                    limit = { scope:domcom_csr_bulk_slave = { has_relation_slave_owner = scope:domcom_csr_bulk_seller } }
                    change_variable = { name = domcom_csr_bulk_skipped_count add = 1 }
                }
                domcom_csr_clear_exchange_sell_cache_effect = yes
            }
        }
    }

    clear_variable_list = domcom_csr_bulk_sell_snapshot
    remove_variable = domcom_csr_ui_selected_slave
    domcom_csr_prepare_owned_slaves_effect = yes
    send_interface_toast = { type = event_toast_effect_good title = DOMCOM_CSR_BULK_SELL_TOAST left_icon = root }
}

# 2.6.12 — Slave Workforce delegates to Carnalitas Slavery Expansion's real job system.
# The Living Market is only a front end: CSE owns assignment state, trait tracks, yearly
# earnings/expenses, health penalties, XP and job events.
domcom_csr_prepare_workforce_slaves_effect = {
    clear_variable_list = domcom_csr_ui_workforce_slaves
    save_scope_as = domcom_csr_workforce_owner
    domcom_csr_initialize_service_report_effect = yes
    set_variable = { name = domcom_csr_service_listed_count value = 0 }
    set_variable = { name = domcom_csr_service_active_military_count value = 0 }
    if = {
        limit = { NOT = { has_variable = domcom_csr_ui_workforce_filter } }
        set_variable = { name = domcom_csr_ui_workforce_filter value = flag:all }
    }
    every_relation = {
        type = slave
        limit = { is_alive = yes }

        # Clean only the obsolete Dominion marker jobs from 2.6.9-2.6.11.
        remove_character_modifier = domcom_csr_job_court_slave_modifier
        remove_character_modifier = domcom_csr_job_military_slave_modifier
        remove_character_modifier = domcom_csr_job_slave_concubine_modifier
        remove_character_modifier = domcom_csr_job_administrator_modifier
        remove_character_modifier = domcom_csr_job_scholar_modifier

        set_variable = { name = domcom_csr_ui_market_player value = scope:domcom_csr_workforce_owner }

        # Existing assigned jobs become visibly listed by default until the owner explicitly pauses them.
        if = {
            limit = {
                domcom_csr_has_service_job_trigger = yes
                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_variable = domcom_csr_service_listed domcom_csr_has_service_job_trigger = yes NOT = { has_character_flag = domcom_csr_military_contract_active } }
            scope:domcom_csr_workforce_owner = { change_variable = { name = domcom_csr_service_listed_count add = 1 } }
        }
        if = {
            limit = { has_character_flag = domcom_csr_military_contract_active }
            scope:domcom_csr_workforce_owner = { change_variable = { name = domcom_csr_service_active_military_count add = 1 } }
        }

        # Job/category filter. CSE only has named sub-ranks for Military Slave.
        if = {
            limit = {
                scope:domcom_csr_workforce_owner = {
                    OR = {
                        NOT = { has_variable = domcom_csr_ui_workforce_filter }
                        var:domcom_csr_ui_workforce_filter = flag:all
                    }
                }
            }
            scope:domcom_csr_workforce_owner = { add_to_variable_list = { name = domcom_csr_ui_workforce_slaves target = prev } }
        }
        else_if = {
            limit = {
                scope:domcom_csr_workforce_owner = { var:domcom_csr_ui_workforce_filter = flag:unassigned }
                cse_is_assigned_as_slave_prostitute_trigger = no
                cse_is_assigned_as_labour_slave_trigger = no
                cse_is_assigned_as_military_slave_trigger = no
                cse_is_assigned_as_sex_slave_trigger = no
            }
            scope:domcom_csr_workforce_owner = { add_to_variable_list = { name = domcom_csr_ui_workforce_slaves target = prev } }
        }
        else_if = {
            limit = {
                scope:domcom_csr_workforce_owner = { var:domcom_csr_ui_workforce_filter = flag:prostitute }
                cse_is_assigned_as_slave_prostitute_trigger = yes
            }
            scope:domcom_csr_workforce_owner = { add_to_variable_list = { name = domcom_csr_ui_workforce_slaves target = prev } }
        }
        else_if = {
            limit = {
                scope:domcom_csr_workforce_owner = { var:domcom_csr_ui_workforce_filter = flag:labour }
                cse_is_assigned_as_labour_slave_trigger = yes
            }
            scope:domcom_csr_workforce_owner = { add_to_variable_list = { name = domcom_csr_ui_workforce_slaves target = prev } }
        }
        else_if = {
            limit = {
                scope:domcom_csr_workforce_owner = { var:domcom_csr_ui_workforce_filter = flag:military }
                cse_is_assigned_as_military_slave_trigger = yes
            }
            scope:domcom_csr_workforce_owner = { add_to_variable_list = { name = domcom_csr_ui_workforce_slaves target = prev } }
        }
        else_if = {
            limit = {
                scope:domcom_csr_workforce_owner = { var:domcom_csr_ui_workforce_filter = flag:recruit }
                cse_is_slave_recruit_trigger = yes
            }
            scope:domcom_csr_workforce_owner = { add_to_variable_list = { name = domcom_csr_ui_workforce_slaves target = prev } }
        }
        else_if = {
            limit = {
                scope:domcom_csr_workforce_owner = { var:domcom_csr_ui_workforce_filter = flag:soldier }
                cse_is_slave_soldier_trigger = yes
            }
            scope:domcom_csr_workforce_owner = { add_to_variable_list = { name = domcom_csr_ui_workforce_slaves target = prev } }
        }
        else_if = {
            limit = {
                scope:domcom_csr_workforce_owner = { var:domcom_csr_ui_workforce_filter = flag:commander }
                cse_is_slave_commander_trigger = yes
            }
            scope:domcom_csr_workforce_owner = { add_to_variable_list = { name = domcom_csr_ui_workforce_slaves target = prev } }
        }
        else_if = {
            limit = {
                scope:domcom_csr_workforce_owner = { var:domcom_csr_ui_workforce_filter = flag:sex }
                cse_is_assigned_as_sex_slave_trigger = yes
            }
            scope:domcom_csr_workforce_owner = { add_to_variable_list = { name = domcom_csr_ui_workforce_slaves target = prev } }
        }
    }
    domcom_csr_build_workforce_page_effect = yes
}

# Clear the active CSE assignment, if any.
domcom_csr_clear_cse_slave_job_effect = {
    cse_clear_all_slave_modifiers_effect = yes
    remove_variable = domcom_csr_service_listed
    remove_variable = domcom_csr_service_opt_out
}

domcom_csr_set_job_slave_prostitute_effect = {
    cse_start_working_as_slave_prostitute_effect = yes
    set_variable = { name = domcom_csr_service_listed value = 1 }
    remove_variable = domcom_csr_service_opt_out
}

domcom_csr_set_job_labour_slave_effect = {
    cse_start_working_as_labour_slave_effect = yes
    set_variable = { name = domcom_csr_service_listed value = 1 }
    remove_variable = domcom_csr_service_opt_out
}

domcom_csr_set_job_military_slave_effect = {
    cse_start_working_as_military_slave_effect = yes
    set_variable = { name = domcom_csr_service_listed value = 1 }
    remove_variable = domcom_csr_service_opt_out
}

domcom_csr_set_job_sex_slave_effect = {
    cse_start_working_as_sex_slave_effect = yes
    set_variable = { name = domcom_csr_service_listed value = 1 }
    remove_variable = domcom_csr_service_opt_out
}

domcom_csr_assign_best_slave_roles_core_effect = {
    # CSE-native automatic workforce assignment used by both the player button and AI owners.
    # Existing valid assignments are preserved. Sexual/prostitution work remains adult-only in
    # Living Market; CSE-native child Labour/Military assignments are allowed from their own ages.
    save_scope_as = domcom_csr_workforce_owner
    every_relation = {
        type = slave
        limit = {
            is_alive = yes
            cse_can_work_ignoring_age_trigger = yes
        }

        if = {
            limit = {
                cse_is_assigned_as_slave_prostitute_trigger = no
                cse_is_assigned_as_labour_slave_trigger = no
                cse_is_assigned_as_military_slave_trigger = no
                cse_is_assigned_as_sex_slave_trigger = no
            }

            # Nonsexual jobs use CSE's native job-start validity only; Living Market no longer adds
            # an adult/minor split of its own. Combat talent is evaluated first for every eligible worker.
            if = {
                limit = {
                    effective_age >= cse_military_slave_age_start_value
                    OR = { prowess >= 10 martial >= 10 }
                    scope:domcom_csr_workforce_owner = {
                        any_relation = {
                            type = slave
                            cse_is_assigned_as_military_slave_trigger = yes
                            count < cse_military_slave_ownership_limit_value
                        }
                    }
                }
                domcom_csr_set_job_military_slave_effect = yes
            }

            # Sexual/prostitution jobs remain adult-only. They sit between the universal Military path
            # and the universal Labour fallback.
            else_if = {
                limit = {
                    is_adult = yes
                    OR = { intrigue >= 14 diplomacy >= 14 }
                    cse_can_be_slave_prostitute_trigger = yes
                    scope:domcom_csr_workforce_owner = {
                        NOT = { faith = { has_doctrine_parameter = carn_prostitution_illegal } }
                        any_relation = {
                            type = slave
                            cse_is_assigned_as_slave_prostitute_trigger = yes
                            count < cse_slave_prostitute_ownership_limit_value
                        }
                    }
                }
                domcom_csr_set_job_slave_prostitute_effect = yes
            }
            else_if = {
                limit = {
                    is_adult = yes
                    OR = {
                        diplomacy >= 14
                        has_trait = beauty_good_1
                        has_trait = beauty_good_2
                        has_trait = beauty_good_3
                    }
                    scope:domcom_csr_workforce_owner = {
                        any_relation = {
                            type = slave
                            cse_is_assigned_as_sex_slave_trigger = yes
                            count < cse_sex_slave_ownership_limit_value
                        }
                    }
                }
                domcom_csr_set_job_sex_slave_effect = yes
            }
            else_if = {
                limit = {
                    effective_age >= cse_labour_slave_age_start_value
                    scope:domcom_csr_workforce_owner = {
                        any_relation = {
                            type = slave
                            cse_is_assigned_as_labour_slave_trigger = yes
                            count < cse_labour_slave_ownership_limit_value
                        }
                    }
                }
                domcom_csr_set_job_labour_slave_effect = yes
            }
        }
    }
}

domcom_csr_assign_best_slave_roles_effect = {
    # Player-facing button: perform the same core assignment, then rebuild the visible Workforce list.
    domcom_csr_assign_best_slave_roles_core_effect = yes
    domcom_csr_prepare_workforce_slaves_effect = yes
}

domcom_csr_eunuchize_all_eligible_slaves_effect = {
    save_scope_as = domcom_csr_workforce_owner
    every_relation = {
        type = slave
        limit = {
            is_alive = yes
            is_male = yes
            is_imprisoned = no
            NOT = { has_trait = eunuch }
        }
        save_scope_as = recipient
        scope:domcom_csr_workforce_owner = { save_scope_as = actor castrate_recipient_effect = yes }
    }
    domcom_csr_prepare_workforce_slaves_effect = yes
}

# 2.6.4 — Human Amongst AI Power Trip integration. Called only when this bridge is active.
# root = superhuman actor; scope:domcom_power_trip_target = original target realm.
domcom_csr_power_trip_enslave_realm_effect = {
    save_scope_as = domcom_csr_power_trip_owner
    set_variable = { name = domcom_power_trip_enslaved value = 0 }
    set_variable = { name = domcom_power_trip_eligible value = 0 }
    clear_variable_list = domcom_csr_power_trip_slave_pool

    # Snapshot first. Enslaving the target ruler can immediately change titles/top-liege relationships;
    # scanning and enslaving in one iterator would therefore cause later inhabitants to fall out of scope.
    every_living_character = {
        limit = {
            is_alive = yes
            top_liege = scope:domcom_power_trip_target
            this != scope:domcom_csr_power_trip_owner
            carnx_can_be_enslaved_trigger = yes
            NOT = { has_relation_slave_owner = scope:domcom_csr_power_trip_owner }
        }
        save_temporary_scope_as = domcom_csr_power_trip_slave_candidate
        scope:domcom_csr_power_trip_owner = {
            add_to_variable_list = { name = domcom_csr_power_trip_slave_pool target = scope:domcom_csr_power_trip_slave_candidate }
            change_variable = { name = domcom_power_trip_eligible add = 1 }
        }
    }

    if = {
        limit = { has_variable_list = domcom_csr_power_trip_slave_pool }
        every_in_list = {
            variable = domcom_csr_power_trip_slave_pool
            limit = { is_alive = yes carnx_can_be_enslaved_trigger = yes NOT = { has_relation_slave_owner = scope:domcom_csr_power_trip_owner } }
            save_scope_as = slave
            scope:domcom_csr_power_trip_owner = { save_scope_as = new_owner }
            # Use CSR's lower-level effect for mass campaigns. carn_enslave_effect always sends one
            # interface message per person even with DRAMA=no. carnx_enslave_effect keeps the real CSR
            # slave relationship/court move while suppressing hundreds of per-character messages.
            scope:domcom_csr_power_trip_owner = {
                carnx_enslave_effect = { DRAMA = no }
                scope:slave = { add_character_flag = domcom_csr_power_trip_captive }
                change_variable = { name = domcom_power_trip_enslaved add = 1 }
            }
        }
    }
    clear_variable_list = domcom_csr_power_trip_slave_pool
}

# Failure counterpart: enslave only a percentage of the snapshotted eligible original-realm population.
# Uses root's domcom_power_trip_failure_kill_percent as the campaign completion percentage.
domcom_csr_power_trip_partial_enslave_effect = {
    save_scope_as = domcom_csr_power_trip_owner
    set_variable = { name = domcom_power_trip_enslaved value = 0 }
    set_variable = { name = domcom_power_trip_eligible value = 0 }
    clear_variable_list = domcom_csr_power_trip_slave_pool

    every_living_character = {
        limit = {
            is_alive = yes
            top_liege = scope:domcom_power_trip_target
            this != scope:domcom_csr_power_trip_owner
            carnx_can_be_enslaved_trigger = yes
            NOT = { has_relation_slave_owner = scope:domcom_csr_power_trip_owner }
        }
        save_temporary_scope_as = domcom_csr_power_trip_slave_candidate
        scope:domcom_csr_power_trip_owner = {
            add_to_variable_list = { name = domcom_csr_power_trip_slave_pool target = scope:domcom_csr_power_trip_slave_candidate }
            change_variable = { name = domcom_power_trip_eligible add = 1 }
        }
    }

    if = {
        limit = { has_variable_list = domcom_csr_power_trip_slave_pool }
        every_in_list = {
            variable = domcom_csr_power_trip_slave_pool
            limit = { is_alive = yes carnx_can_be_enslaved_trigger = yes NOT = { has_relation_slave_owner = scope:domcom_csr_power_trip_owner } }
            save_scope_as = slave
            scope:domcom_csr_power_trip_owner = {
                random = {
                    chance = var:domcom_power_trip_failure_kill_percent
                    save_scope_as = new_owner
                    carnx_enslave_effect = { DRAMA = no }
                    scope:slave = { add_character_flag = domcom_csr_power_trip_captive }
                    change_variable = { name = domcom_power_trip_enslaved add = 1 }
                }
            }
        }
    }
    clear_variable_list = domcom_csr_power_trip_slave_pool
}


# 2.6.28 — Unified pagination for every high-volume Living Market roster.
# These effects only slice cached/full lists, so Next/Previous never rescan the world.
domcom_csr_build_owned_page_effect = {
    save_scope_as = domcom_csr_page_owner
    if = { limit = { NOT = { has_variable = domcom_csr_ui_owned_page } } set_variable = { name = domcom_csr_ui_owned_page value = 0 } }
    set_variable = { name = domcom_csr_ui_owned_page_size value = 8 }
    set_variable = { name = domcom_csr_ui_owned_last_page value = 0 }
    set_variable = { name = domcom_csr_ui_owned_page_fill value = 0 }
    set_variable = { name = domcom_csr_ui_owned_count value = 0 }
    if = { limit = { has_variable_list = domcom_csr_ui_owned_slaves } every_in_list = { variable = domcom_csr_ui_owned_slaves scope:domcom_csr_page_owner = { if = { limit = { var:domcom_csr_ui_owned_page_fill >= var:domcom_csr_ui_owned_page_size } change_variable = { name = domcom_csr_ui_owned_last_page add = 1 } set_variable = { name = domcom_csr_ui_owned_page_fill value = 0 } } change_variable = { name = domcom_csr_ui_owned_page_fill add = 1 } change_variable = { name = domcom_csr_ui_owned_count add = 1 } } } }
    if = { limit = { var:domcom_csr_ui_owned_page < 0 } set_variable = { name = domcom_csr_ui_owned_page value = 0 } }
    if = { limit = { var:domcom_csr_ui_owned_page > var:domcom_csr_ui_owned_last_page } set_variable = { name = domcom_csr_ui_owned_page value = var:domcom_csr_ui_owned_last_page } }
    set_variable = { name = domcom_csr_ui_owned_first value = var:domcom_csr_ui_owned_page }
    change_variable = { name = domcom_csr_ui_owned_first multiply = var:domcom_csr_ui_owned_page_size }
    set_variable = { name = domcom_csr_ui_owned_stop value = var:domcom_csr_ui_owned_first }
    change_variable = { name = domcom_csr_ui_owned_stop add = var:domcom_csr_ui_owned_page_size }
    set_variable = { name = domcom_csr_ui_owned_index value = 0 }
    clear_variable_list = domcom_csr_ui_owned_page_list
    if = { limit = { has_variable_list = domcom_csr_ui_owned_slaves } every_in_list = { variable = domcom_csr_ui_owned_slaves save_temporary_scope_as = domcom_csr_page_row scope:domcom_csr_page_owner = { if = { limit = { var:domcom_csr_ui_owned_index >= var:domcom_csr_ui_owned_first var:domcom_csr_ui_owned_index < var:domcom_csr_ui_owned_stop } add_to_variable_list = { name = domcom_csr_ui_owned_page_list target = scope:domcom_csr_page_row } } change_variable = { name = domcom_csr_ui_owned_index add = 1 } } } }
    set_variable = { name = domcom_csr_ui_owned_page_display value = var:domcom_csr_ui_owned_page }
    change_variable = { name = domcom_csr_ui_owned_page_display add = 1 }
    set_variable = { name = domcom_csr_ui_owned_pages_display value = var:domcom_csr_ui_owned_last_page }
    change_variable = { name = domcom_csr_ui_owned_pages_display add = 1 }
}

domcom_csr_build_sell_page_effect = {
    save_scope_as = domcom_csr_page_owner
    if = { limit = { NOT = { has_variable = domcom_csr_ui_sell_page } } set_variable = { name = domcom_csr_ui_sell_page value = 0 } }
    set_variable = { name = domcom_csr_ui_sell_page_size value = 8 }
    set_variable = { name = domcom_csr_ui_sell_last_page value = 0 }
    set_variable = { name = domcom_csr_ui_sell_page_fill value = 0 }
    set_variable = { name = domcom_csr_ui_sell_count value = 0 }
    if = { limit = { has_variable_list = domcom_csr_ui_sell_buyers } every_in_list = { variable = domcom_csr_ui_sell_buyers scope:domcom_csr_page_owner = { if = { limit = { var:domcom_csr_ui_sell_page_fill >= var:domcom_csr_ui_sell_page_size } change_variable = { name = domcom_csr_ui_sell_last_page add = 1 } set_variable = { name = domcom_csr_ui_sell_page_fill value = 0 } } change_variable = { name = domcom_csr_ui_sell_page_fill add = 1 } change_variable = { name = domcom_csr_ui_sell_count add = 1 } } } }
    if = { limit = { var:domcom_csr_ui_sell_page < 0 } set_variable = { name = domcom_csr_ui_sell_page value = 0 } }
    if = { limit = { var:domcom_csr_ui_sell_page > var:domcom_csr_ui_sell_last_page } set_variable = { name = domcom_csr_ui_sell_page value = var:domcom_csr_ui_sell_last_page } }
    set_variable = { name = domcom_csr_ui_sell_first value = var:domcom_csr_ui_sell_page } change_variable = { name = domcom_csr_ui_sell_first multiply = var:domcom_csr_ui_sell_page_size }
    set_variable = { name = domcom_csr_ui_sell_stop value = var:domcom_csr_ui_sell_first } change_variable = { name = domcom_csr_ui_sell_stop add = var:domcom_csr_ui_sell_page_size }
    set_variable = { name = domcom_csr_ui_sell_index value = 0 } clear_variable_list = domcom_csr_ui_sell_page_list
    if = { limit = { has_variable_list = domcom_csr_ui_sell_buyers } every_in_list = { variable = domcom_csr_ui_sell_buyers save_temporary_scope_as = domcom_csr_page_row scope:domcom_csr_page_owner = { if = { limit = { var:domcom_csr_ui_sell_index >= var:domcom_csr_ui_sell_first var:domcom_csr_ui_sell_index < var:domcom_csr_ui_sell_stop } add_to_variable_list = { name = domcom_csr_ui_sell_page_list target = scope:domcom_csr_page_row } } change_variable = { name = domcom_csr_ui_sell_index add = 1 } } } }
    set_variable = { name = domcom_csr_ui_sell_page_display value = var:domcom_csr_ui_sell_page } change_variable = { name = domcom_csr_ui_sell_page_display add = 1 }
    set_variable = { name = domcom_csr_ui_sell_pages_display value = var:domcom_csr_ui_sell_last_page } change_variable = { name = domcom_csr_ui_sell_pages_display add = 1 }
}

domcom_csr_build_marriage_slave_page_effect = {
    save_scope_as = domcom_csr_page_owner
    if = { limit = { NOT = { has_variable = domcom_csr_ui_marriage_slave_page } } set_variable = { name = domcom_csr_ui_marriage_slave_page value = 0 } }
    set_variable = { name = domcom_csr_ui_marriage_slave_page_size value = 8 } set_variable = { name = domcom_csr_ui_marriage_slave_last_page value = 0 } set_variable = { name = domcom_csr_ui_marriage_slave_page_fill value = 0 } set_variable = { name = domcom_csr_ui_marriage_slave_count value = 0 }
    if = { limit = { has_variable_list = domcom_csr_ui_marriage_slaves } every_in_list = { variable = domcom_csr_ui_marriage_slaves scope:domcom_csr_page_owner = { if = { limit = { var:domcom_csr_ui_marriage_slave_page_fill >= var:domcom_csr_ui_marriage_slave_page_size } change_variable = { name = domcom_csr_ui_marriage_slave_last_page add = 1 } set_variable = { name = domcom_csr_ui_marriage_slave_page_fill value = 0 } } change_variable = { name = domcom_csr_ui_marriage_slave_page_fill add = 1 } change_variable = { name = domcom_csr_ui_marriage_slave_count add = 1 } } } }
    if = { limit = { var:domcom_csr_ui_marriage_slave_page < 0 } set_variable = { name = domcom_csr_ui_marriage_slave_page value = 0 } } if = { limit = { var:domcom_csr_ui_marriage_slave_page > var:domcom_csr_ui_marriage_slave_last_page } set_variable = { name = domcom_csr_ui_marriage_slave_page value = var:domcom_csr_ui_marriage_slave_last_page } }
    set_variable = { name = domcom_csr_ui_marriage_slave_first value = var:domcom_csr_ui_marriage_slave_page } change_variable = { name = domcom_csr_ui_marriage_slave_first multiply = var:domcom_csr_ui_marriage_slave_page_size } set_variable = { name = domcom_csr_ui_marriage_slave_stop value = var:domcom_csr_ui_marriage_slave_first } change_variable = { name = domcom_csr_ui_marriage_slave_stop add = var:domcom_csr_ui_marriage_slave_page_size }
    set_variable = { name = domcom_csr_ui_marriage_slave_index value = 0 } clear_variable_list = domcom_csr_ui_marriage_slave_page_list
    if = { limit = { has_variable_list = domcom_csr_ui_marriage_slaves } every_in_list = { variable = domcom_csr_ui_marriage_slaves save_temporary_scope_as = domcom_csr_page_row scope:domcom_csr_page_owner = { if = { limit = { var:domcom_csr_ui_marriage_slave_index >= var:domcom_csr_ui_marriage_slave_first var:domcom_csr_ui_marriage_slave_index < var:domcom_csr_ui_marriage_slave_stop } add_to_variable_list = { name = domcom_csr_ui_marriage_slave_page_list target = scope:domcom_csr_page_row } } change_variable = { name = domcom_csr_ui_marriage_slave_index add = 1 } } } }
    set_variable = { name = domcom_csr_ui_marriage_slave_page_display value = var:domcom_csr_ui_marriage_slave_page } change_variable = { name = domcom_csr_ui_marriage_slave_page_display add = 1 } set_variable = { name = domcom_csr_ui_marriage_slave_pages_display value = var:domcom_csr_ui_marriage_slave_last_page } change_variable = { name = domcom_csr_ui_marriage_slave_pages_display add = 1 }
}

domcom_csr_build_marriage_partner_page_effect = {
    save_scope_as = domcom_csr_page_owner
    if = { limit = { NOT = { has_variable = domcom_csr_ui_marriage_partner_page } } set_variable = { name = domcom_csr_ui_marriage_partner_page value = 0 } }
    set_variable = { name = domcom_csr_ui_marriage_partner_page_size value = 8 } set_variable = { name = domcom_csr_ui_marriage_partner_last_page value = 0 } set_variable = { name = domcom_csr_ui_marriage_partner_page_fill value = 0 } set_variable = { name = domcom_csr_ui_marriage_partner_count value = 0 }
    if = { limit = { has_variable_list = domcom_csr_ui_marriage_partners } every_in_list = { variable = domcom_csr_ui_marriage_partners scope:domcom_csr_page_owner = { if = { limit = { var:domcom_csr_ui_marriage_partner_page_fill >= var:domcom_csr_ui_marriage_partner_page_size } change_variable = { name = domcom_csr_ui_marriage_partner_last_page add = 1 } set_variable = { name = domcom_csr_ui_marriage_partner_page_fill value = 0 } } change_variable = { name = domcom_csr_ui_marriage_partner_page_fill add = 1 } change_variable = { name = domcom_csr_ui_marriage_partner_count add = 1 } } } }
    if = { limit = { var:domcom_csr_ui_marriage_partner_page < 0 } set_variable = { name = domcom_csr_ui_marriage_partner_page value = 0 } } if = { limit = { var:domcom_csr_ui_marriage_partner_page > var:domcom_csr_ui_marriage_partner_last_page } set_variable = { name = domcom_csr_ui_marriage_partner_page value = var:domcom_csr_ui_marriage_partner_last_page } }
    set_variable = { name = domcom_csr_ui_marriage_partner_first value = var:domcom_csr_ui_marriage_partner_page } change_variable = { name = domcom_csr_ui_marriage_partner_first multiply = var:domcom_csr_ui_marriage_partner_page_size } set_variable = { name = domcom_csr_ui_marriage_partner_stop value = var:domcom_csr_ui_marriage_partner_first } change_variable = { name = domcom_csr_ui_marriage_partner_stop add = var:domcom_csr_ui_marriage_partner_page_size }
    set_variable = { name = domcom_csr_ui_marriage_partner_index value = 0 } clear_variable_list = domcom_csr_ui_marriage_partner_page_list
    if = { limit = { has_variable_list = domcom_csr_ui_marriage_partners } every_in_list = { variable = domcom_csr_ui_marriage_partners save_temporary_scope_as = domcom_csr_page_row scope:domcom_csr_page_owner = { if = { limit = { var:domcom_csr_ui_marriage_partner_index >= var:domcom_csr_ui_marriage_partner_first var:domcom_csr_ui_marriage_partner_index < var:domcom_csr_ui_marriage_partner_stop } add_to_variable_list = { name = domcom_csr_ui_marriage_partner_page_list target = scope:domcom_csr_page_row } } change_variable = { name = domcom_csr_ui_marriage_partner_index add = 1 } } } }
    set_variable = { name = domcom_csr_ui_marriage_partner_page_display value = var:domcom_csr_ui_marriage_partner_page } change_variable = { name = domcom_csr_ui_marriage_partner_page_display add = 1 } set_variable = { name = domcom_csr_ui_marriage_partner_pages_display value = var:domcom_csr_ui_marriage_partner_last_page } change_variable = { name = domcom_csr_ui_marriage_partner_pages_display add = 1 }
}

domcom_csr_build_workforce_page_effect = {
    save_scope_as = domcom_csr_page_owner
    if = { limit = { NOT = { has_variable = domcom_csr_ui_workforce_page } } set_variable = { name = domcom_csr_ui_workforce_page value = 0 } }
    set_variable = { name = domcom_csr_ui_workforce_page_size value = 8 } set_variable = { name = domcom_csr_ui_workforce_last_page value = 0 } set_variable = { name = domcom_csr_ui_workforce_page_fill value = 0 } set_variable = { name = domcom_csr_ui_workforce_count value = 0 }
    if = { limit = { has_variable_list = domcom_csr_ui_workforce_slaves } every_in_list = { variable = domcom_csr_ui_workforce_slaves scope:domcom_csr_page_owner = { if = { limit = { var:domcom_csr_ui_workforce_page_fill >= var:domcom_csr_ui_workforce_page_size } change_variable = { name = domcom_csr_ui_workforce_last_page add = 1 } set_variable = { name = domcom_csr_ui_workforce_page_fill value = 0 } } change_variable = { name = domcom_csr_ui_workforce_page_fill add = 1 } change_variable = { name = domcom_csr_ui_workforce_count add = 1 } } } }
    if = { limit = { var:domcom_csr_ui_workforce_page < 0 } set_variable = { name = domcom_csr_ui_workforce_page value = 0 } } if = { limit = { var:domcom_csr_ui_workforce_page > var:domcom_csr_ui_workforce_last_page } set_variable = { name = domcom_csr_ui_workforce_page value = var:domcom_csr_ui_workforce_last_page } }
    set_variable = { name = domcom_csr_ui_workforce_first value = var:domcom_csr_ui_workforce_page } change_variable = { name = domcom_csr_ui_workforce_first multiply = var:domcom_csr_ui_workforce_page_size } set_variable = { name = domcom_csr_ui_workforce_stop value = var:domcom_csr_ui_workforce_first } change_variable = { name = domcom_csr_ui_workforce_stop add = var:domcom_csr_ui_workforce_page_size }
    set_variable = { name = domcom_csr_ui_workforce_index value = 0 } clear_variable_list = domcom_csr_ui_workforce_page_list
    if = { limit = { has_variable_list = domcom_csr_ui_workforce_slaves } every_in_list = { variable = domcom_csr_ui_workforce_slaves save_temporary_scope_as = domcom_csr_page_row scope:domcom_csr_page_owner = { if = { limit = { var:domcom_csr_ui_workforce_index >= var:domcom_csr_ui_workforce_first var:domcom_csr_ui_workforce_index < var:domcom_csr_ui_workforce_stop } add_to_variable_list = { name = domcom_csr_ui_workforce_page_list target = scope:domcom_csr_page_row } } change_variable = { name = domcom_csr_ui_workforce_index add = 1 } } } }
    set_variable = { name = domcom_csr_ui_workforce_page_display value = var:domcom_csr_ui_workforce_page } change_variable = { name = domcom_csr_ui_workforce_page_display add = 1 } set_variable = { name = domcom_csr_ui_workforce_pages_display value = var:domcom_csr_ui_workforce_last_page } change_variable = { name = domcom_csr_ui_workforce_pages_display add = 1 }
}
