N3OW/N3OW/common/scripted_effects/00_board_game_effects.txt
2025-10-30 12:41:45 +00:00

583 lines
14 KiB
Text

##################################################
# Effects related to Board Games
##################################################
##################################################
# SETUP & CLEANUP EFFECTS
configure_start_board_game_effect = {
# DOCUMENTATION
## scope:bg_initiator
### Who started the board game? This is who the output/invalidation events will fire for.
## scope:bg_attacker
### The hostile party - in the event of a tie, the match is decided against them.
## scope:bg_defender
### The defending party - in the event of a tie, the match is decided in their favour.
## scope:bg_system = flag:XYZ
### These control both the relevant skills, counters, & some flavour adjacent to the game.
### chess
### pachisi
### hnefatafl
### tabula
### go
### fidchell
## scope:locale = flag:XYZ
### These just trigger the event background of the same name. New ones can be added as needed, but should be added across all three events (round, victory, loss/board_games.0001, board_games.0031, board_games.0041), as we can't add a scripted list.
### terrain_scope
### wilderness_scope
### battlefield
### temple
### council_chamber
### courtyard
### dungeon
### docks
### feast
### gallows
### garden
### market
### sitting_room
### bedchamber
### study
### physicians_study
### tavern
### throne_room
### army_camp
### random_nice_day
#### Selects either garden or sitting_room, depending on season.
## output event ID
### Which event fires after the game's completion?
# Sort parties.
$BG_INITIATOR$ = { save_scope_as = bg_initiator }
$BG_DEFENDER$ = { save_scope_as = bg_defender }
$BG_ATTACKER$ = { save_scope_as = bg_attacker }
# Make sure they're clean for setup.
hidden_effect = { remove_board_game_variables_effect = yes}
# Set them both to busy for the single combat.
scope:bg_defender = {
set_variable = {
name = engaged_in_board_game
value = yes
}
}
scope:bg_attacker = {
set_variable = {
name = engaged_in_board_game
value = yes
}
}
## Sadly, we have no good justification for ripping your shirt off whilst playing board games.
# Set rules & system.
save_scope_value_as = {
name = bg_system
value = flag:$SYSTEM$
}
## Chess
### In chess, our counter order is Martial -> Learning -> Intrigue.
if = {
limit = { scope:bg_system = flag:chess }
save_scope_value_as = {
name = bg_skill_a
value = flag:martial
}
save_scope_value_as = {
name = bg_skill_b
value = flag:learning
}
save_scope_value_as = {
name = bg_skill_c
value = flag:intrigue
}
}
## Pachisi
### For pachisi, our counter order is Diplomacy -> Intrigue -> Stewardship.
else_if = {
limit = { scope:bg_system = flag:pachisi }
save_scope_value_as = {
name = bg_skill_a
value = flag:diplomacy
}
save_scope_value_as = {
name = bg_skill_b
value = flag:intrigue
}
save_scope_value_as = {
name = bg_skill_c
value = flag:stewardship
}
}
## Hnefatafl
### For hnefatafl, our counter order is Intrigue -> Martial -> Prowess.
else_if = {
limit = { scope:bg_system = flag:hnefatafl }
save_scope_value_as = {
name = bg_skill_a
value = flag:intrigue
}
save_scope_value_as = {
name = bg_skill_b
value = flag:martial
}
save_scope_value_as = {
name = bg_skill_c
value = flag:prowess
}
}
## Tabula
### For tabula, our counter order is Intrigue -> Learning -> Stewardship.
else_if = {
limit = { scope:bg_system = flag:tabula }
save_scope_value_as = {
name = bg_skill_a
value = flag:intrigue
}
save_scope_value_as = {
name = bg_skill_b
value = flag:learning
}
save_scope_value_as = {
name = bg_skill_c
value = flag:stewardship
}
}
## Go
### For go, our counter order is Learning -> Martial -> Intrigue.
### Additional game design credit: Alexander Windahl.
else_if = {
limit = { scope:bg_system = flag:go }
save_scope_value_as = {
name = bg_skill_a
value = flag:learning
}
save_scope_value_as = {
name = bg_skill_b
value = flag:martial
}
save_scope_value_as = {
name = bg_skill_c
value = flag:intrigue
}
}
## Fidchell
### For fidchell, our counter order is Learning -> Prowess -> Diplomacy.
else_if = {
limit = { scope:bg_system = flag:fidchell }
save_scope_value_as = {
name = bg_skill_a
value = flag:learning
}
save_scope_value_as = {
name = bg_skill_b
value = flag:prowess
}
save_scope_value_as = {
name = bg_skill_c
value = flag:diplomacy
}
}
# Note where the fight is taking place, if we're using a specific location.
save_scope_value_as = {
name = bg_locale
value = flag:$LOCALE$
}
## Grab _scope backgrounds appropriately..
if = {
limit = { scope:bg_locale = flag:terrain_scope }
scope:bg_defender.location = { save_scope_as = background_terrain_scope }
}
else_if = {
limit = { scope:bg_locale = flag:wilderness_scope }
scope:bg_defender.location = { save_scope_as = background_wilderness_scope }
}
## Sort any random_ backgrounds if necessary.
else_if = {
limit = { scope:bg_locale = flag:random_nice_day }
random_list = {
# Indoors.
50 = {
trigger = {
exists = scope:bg_defender.location
is_nice_season_to_be_inside_trigger = { LOCATION = scope:bg_defender.location }
}
save_scope_value_as = {
name = bg_locale
value = flag:sitting_room
}
}
# Outdoors.
50 = {
trigger = {
exists = scope:bg_defender.location
is_nice_season_to_be_outside_trigger = { LOCATION = scope:bg_defender.location }
}
save_scope_value_as = {
name = bg_locale
value = flag:garden
}
}
# Fallback: occasionally characters fall into a bloody void between space and time, I guess, and when they do we need to stop trying to calculate the weather for non-Euclidian space.
50 = {
trigger = {
NOT = { exists = scope:bg_defender.location }
}
save_scope_value_as = {
name = bg_locale
# Because black holes are from space and space lives inside books.
value = flag:study
}
}
}
}
# Arrange aftermath.
save_scope_value_as = {
name = follow_up_event
value = event_id:$OUTPUT_EVENT$
}
save_scope_value_as = {
name = invalidation_event
value = event_id:$INVALIDATION_EVENT$
}
# Configure starting scopes'n'variables.
scope:bg_defender = {
# Set our current round.
set_variable = {
name = bg_current_round
value = 1
}
# Set up our initial scores.
set_variable = {
name = bg_current_score
value = 0
}
}
scope:bg_attacker = {
# Set up our initial scores.
set_variable = {
name = bg_current_score
value = 0
}
}
# Finally, send the first event.
scope:bg_defender = { trigger_event = board_games.0001 }
}
# Clean up all variables resulting from playing a board game.
remove_board_game_variables_effect = {
# Player-side variables.
remove_variable = bg_current_round
remove_variable = bg_current_score
remove_variable = bg_move_result
# If there are any wagering counties, clear the blockers on their being wagered.
if = {
limit = { exists = scope:bg_stake_land_recipient }
scope:bg_stake_land_recipient = { remove_variable = wagered_county }
}
if = {
limit = { exists = scope:bg_stake_land_actor }
scope:bg_stake_land_actor = { remove_variable = wagered_county }
}
# Remove any debug variables.
remove_variable = bg_gib_only_losing_locs
remove_variable = bg_gib_only_winning_locs
# Note, we don't remove var:engaged_in_board_game here, as we run this effect at the start of games for clean-up also.
}
remove_engaged_in_board_game_variables_effect = {
scope:bg_attacker = {
if = {
# Restrict to live characters to prevent errors.
limit = { is_alive = yes }
remove_variable = engaged_in_board_game
}
}
scope:bg_defender = {
if = {
# Restrict to live characters to prevent errors.
limit = { is_alive = yes }
remove_variable = engaged_in_board_game
}
}
}
# Clean all consequences of a single combat.
remove_board_game_info_effect = {
scope:bg_defender = {
# Only remove variables if they're alive, as otherwise we get errors.
if = {
limit = { is_alive = yes }
remove_board_game_variables_effect = yes
}
}
scope:bg_attacker = {
# Only remove variables if they're alive, as otherwise we get errors.
if = {
limit = { is_alive = yes }
remove_board_game_variables_effect = yes
}
}
remove_engaged_in_board_game_variables_effect = yes
}
bg_fire_clean_up_and_invalidate_effect = {
remove_engaged_in_board_game_variables_effect = yes
# We try to wing this at scope:bg_defender...
if = {
limit = {
scope:bg_defender = { is_alive = yes }
}
scope:bg_defender = {
trigger_event = { saved_event_id = scope:invalidation_event }
}
}
# ... then scope:bg_attacker...
else_if = {
limit = {
scope:bg_attacker = { is_alive = yes }
}
scope:bg_attacker = {
trigger_event = { saved_event_id = scope:invalidation_event }
}
}
# ... then scope:bg_initiator...
else_if = {
limit = {
scope:bg_initiator = { is_alive = yes }
}
scope:bg_initiator = {
trigger_event = { saved_event_id = scope:invalidation_event }
}
}
# ... then we give up, as somehow *everyone* involved in the board game has died simultaneously.
}
##################################################
# INTERACTION-SPECIFIC EFFECTS
challenge_to_2p_chess_interaction_lock_in_actor_stake_land_effect = {
scope:actor = {
save_temporary_scope_as = ordering_char_temp
ordered_held_title = {
limit = {
bg_stake_land_valid_neighbouring_county_to_trade_trigger = { NEIGHBOUR = scope:recipient }
}
order_by = bg_stake_land_evaluate_appropriate_county_ordering_value
save_scope_as = bg_stake_land_actor
set_variable = wagered_county
}
}
}
challenge_to_2p_chess_interaction_lock_in_game_type_effect = {
$GAME_TYPE_SETTER$ = {
# Landless characters use their location.
if = {
limit = { is_playable_character = no }
location = {
# Pachisi - favoured in the eastern parts of the map.
if = {
limit = { bg_game_type_region_pachisi_trigger = yes }
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:pachisi
}
}
# Hnefatafl - favoured in the northern parts of the map.
else_if = {
limit = { bg_game_type_region_hnefatafl_trigger = yes }
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:hnefatafl
}
}
# Tabula - favoured around the Med.
else_if = {
limit = { bg_game_type_region_tabula_trigger = yes }
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:tabula
}
}
# Go - favoured around Tibet.
else_if = {
limit = { bg_game_type_region_go_trigger = yes }
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:go
}
}
# Fidchell - favoured around the Celtic rim.
else_if = {
limit = { bg_game_type_region_fidchell_trigger = yes }
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:fidchell
}
}
# Chess - fallback.
else = {
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:chess
}
}
}
}
# Landed characters use their capital.
else = {
capital_province = {
# Pachisi - favoured in the eastern parts of the map.
if = {
limit = { bg_game_type_region_pachisi_trigger = yes }
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:pachisi
}
}
# Hnefatafl - favoured in the northern parts of the map.
else_if = {
limit = { bg_game_type_region_hnefatafl_trigger = yes }
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:hnefatafl
}
}
# Tabula - favoured around the Med.
else_if = {
limit = { bg_game_type_region_tabula_trigger = yes }
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:tabula
}
}
# Go - favoured around Tibet.
else_if = {
limit = { bg_game_type_region_go_trigger = yes }
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:go
}
}
# Fidchell - favoured around the Celtic rim.
else_if = {
limit = { bg_game_type_region_fidchell_trigger = yes }
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:fidchell
}
}
# Chess - fallback.
else = {
save_scope_value_as = {
name = bg_interaction_game_type
value = flag:chess
}
}
}
}
}
}
fp2_bg_stake_friendly_effect = {
$VICTOR$ = {
if = {
# Obscure opinion adds from players.
limit = { is_ai = yes }
add_opinion = {
target = $LOSER$
modifier = pleased_opinion
opinion = 25
}
}
add_stress = minor_stress_loss
}
$LOSER$ = {
if = {
# Obscure opinion adds from players.
limit = { is_ai = yes }
add_opinion = {
target = $VICTOR$
modifier = pleased_opinion
opinion = 10
}
}
add_stress = minor_stress_gain
}
}
fp2_bg_stake_fame_effect = {
$VICTOR$ = { add_prestige = medium_prestige_gain }
$LOSER$ = { add_prestige = minor_prestige_loss }
}
fp2_bg_stake_fortune_effect = {
# A nice, simple, transfer of funds.
$LOSER$ = {
pay_short_term_gold = {
target = $VICTOR$
gold = scope:bg_stake_gold
}
}
}
fp2_bg_stake_titles_effect = {
create_title_and_vassal_change = {
type = granted
save_scope_as = change
}
if = {
limit = { $VICTOR$ = scope:actor }
scope:bg_stake_land_recipient = {
change_title_holder = {
holder = scope:actor
change = scope:change
}
}
}
else_if = {
limit = { $VICTOR$ = scope:recipient }
scope:bg_stake_land_actor = {
change_title_holder = {
holder = scope:recipient
change = scope:change
}
}
}
resolve_title_and_vassal_change = scope:change
}
##################################################
# RESULT EFFECTS
perk_interaction_0122_apply_effects_effect = {
# Stakes.
## Friendlies bet opinion & stress.
if = {
limit = { always = scope:chess_friendly }
fp2_bg_stake_friendly_effect = {
VICTOR = scope:bg_victor
LOSER = scope:bg_loser
}
}
## Fame bets prestige.
if = {
limit = { always = scope:chess_prestige }
fp2_bg_stake_fame_effect = {
VICTOR = scope:bg_victor
LOSER = scope:bg_loser
}
}
## Fortune bets gold.
if = {
limit = { always = scope:chess_gold }
fp2_bg_stake_fortune_effect = {
VICTOR = scope:bg_victor
LOSER = scope:bg_loser
}
}
## Land bets... land.
if = {
limit = { always = scope:chess_land }
fp2_bg_stake_titles_effect = { VICTOR = scope:bg_victor }
}
}