﻿
##################################################
# Effects related to the Single Combat Engine
##################################################

##################################################
# SETUP & CLEANUP EFFECTS

configure_start_single_combat_effect = {
	# DOCUMENTATION
	## scope:sc_initiator
		### Who started the combat? This is who the output/invalidation events will fire for.
	## scope:sc_attacker
		### The attacking party.
	## scope:sc_defender
		### The defending party.
	## scope:fatality = flag:default/possible/no/always
		### default: always if tribal, no otherwise.
		### possible: losing can be fatal, but isn't necessarily.
		### no: losing is never fatal.
		### always: losing always fatal.
		### practice: no death, no wounds.
	## scope:fixed = flag:no/flag:sc_attacker/scope:sc_defender
		### No: the match uses normal rules.
		### scope:sc_attacker: the attacker will always win.
		### scope:challenged: the defender will always win.
	## 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/single_combat.0001, single_combat.0031, single_combat.0041), as we can't add a scripted list.
		### terrain_scope
		### battlefield
		### alley_night
		### alley_day
		### temple
		### corridor_night
		### corridor_day
		### courtyard
		### dungeon
		### docks
		### feast
		### market
		### tavern
		### throne_room
		### army_camp
	## output event ID
		### Which event fires after the combat's completion?

	# Sort parties.
	$SC_INITIATOR$ = { save_scope_as = sc_initiator }
	$SC_ATTACKER$ = { save_scope_as = sc_attacker }
	$SC_DEFENDER$ = { save_scope_as = sc_defender }
	# Arrange aftermath.
	## We're doing this early so we can invalidate well in a sec.
	if = {
		limit = { exists = scope:sc_finished }
		clear_saved_scope = sc_finished
	}
	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$
	}
	# Invalidation check: have we managed to set scope:sc_attacker and scope:sc_defender to the same person?
	## If so, invalidate the duel, because this will cause crashes on Mac due to the duel's logic then looping in on itself later.
	### Shocking to hear Mac has problems, I know.
	if = {
		limit = {
			scope:sc_attacker != scope:sc_defender
		}
		# Make sure they're clean for setup.
		hidden_effect = { remove_single_combat_info_effect = yes }
		# Set them both to busy for the single combat.
		scope:sc_attacker = {
			set_variable = {
				name = engaged_in_single_combat
				value = yes
			}
		}
		scope:sc_defender = {
			set_variable = {
				name = engaged_in_single_combat
				value = yes
			}
		}
		## Then try to take shirts off.
		single_combat_apply_default_shirtlessness_effect = {
			ATTACKER = scope:sc_attacker
			DEFENDER = scope:sc_defender
		}
		# Set rules.
		save_scope_value_as = {
			name = fatality
			value = flag:$FATALITY$
		}
		save_scope_value_as = {
			name = fixed
			value = flag:$FIXED$
		}
		save_scope_value_as = {
			name = locale
			value = flag:$LOCALE$
		}
		## Note where the fight is taking place, if we're using a specific location.
		if = {
			limit = { scope:locale = flag:terrain_scope }
			scope:sc_defender.location = { save_scope_as = background_terrain_scope }
		}
		# Configure starting bonus/threshold variables.
		scope:sc_attacker = {
			set_variable = {
				name = sc_attacker_injury_bonus
				value = starting_injury_bonus
			}
		}
		scope:sc_defender = {
			set_variable = {
				name = sc_defender_injury_bonus
				value = starting_injury_bonus
			}
			set_variable = {
				name = success_threshold
				value = starting_success_threshold
			}
		}
		# Configure starting round variables.
		scope:sc_attacker = {
			set_variable = {
				name = sc_attacker_injury_risk_score
				value = 0
			}
			set_variable = {
				name = sc_attacker_duel_success_score
				value = 0
			}
			# Including local variables for combat buffs & debuffs.
			set_local_variable = {
				name = current_duel_edge_buff
				value = 0
			}
			set_local_variable = {
				name = current_duel_edge_debuff
				value = 0
			}
			# If the character lacks a preferred weapon, pick one.
			set_signature_weapon_effect = yes
		}
		scope:sc_defender = {
			set_variable = {
				name = sc_defender_injury_risk_score
				value = 0
			}
			set_variable = {
				name = sc_defender_duel_success_score
				value = 0
			}
			# Including local variables for combat buffs & debuffs.
			set_local_variable = {
				name = current_duel_edge_buff
				value = 0
			}
			set_local_variable = {
				name = current_duel_edge_debuff
				value = 0
			}
			# Set up the combat rounds.
			set_variable = {
				name = current_round
				value = 1
			}
			# If the character lacks a preferred weapon, pick one.
			set_signature_weapon_effect = yes
		}
		# Finally, send the first event.
		scope:sc_defender = { trigger_event = single_combat.0001 }
	}
	# Otherwise, invalidate the duel immediately.
	else = {
		scope:sc_initiator = {
			trigger_event = { saved_event_id = scope:invalidation_event }
		}
		# And fire an error to the debug log for us.
		error_log = debug_log.single_combat_setup.attacker_and_defender_same_person
		debug_log = debug_log.single_combat_setup.attacker_and_defender_same_person.notice
		debug_log_scopes = yes
	}
}

# Clean all duel edge buff character modifiers.
remove_temporary_duel_edge_buff_modifiers_effect = {
	# General modifiers.
	remove_character_modifier = duel_edge_buff_01_modifier
	remove_character_modifier = duel_edge_buff_02_modifier
	remove_character_modifier = duel_edge_buff_03_modifier
	remove_character_modifier = duel_edge_buff_04_modifier
	remove_character_modifier = duel_edge_buff_05_modifier
	remove_character_modifier = duel_edge_buff_06_modifier
	remove_character_modifier = duel_edge_buff_07_modifier
	remove_character_modifier = duel_edge_buff_08_modifier
	remove_character_modifier = duel_edge_buff_09_modifier
	remove_character_modifier = duel_edge_buff_10_modifier
	remove_character_modifier = duel_edge_buff_11_modifier
	remove_character_modifier = duel_edge_buff_12_modifier
	remove_character_modifier = duel_edge_buff_13_modifier
	remove_character_modifier = duel_edge_buff_14_modifier
	remove_character_modifier = duel_edge_buff_15_modifier
	remove_character_modifier = duel_edge_buff_16_modifier
	remove_character_modifier = duel_edge_buff_17_modifier
	remove_character_modifier = duel_edge_buff_18_modifier
	remove_character_modifier = duel_edge_buff_19_modifier
	remove_character_modifier = duel_edge_buff_20_modifier
	remove_character_modifier = duel_edge_buff_21_modifier
	remove_character_modifier = duel_edge_buff_22_modifier
	remove_character_modifier = duel_edge_buff_23_modifier
	remove_character_modifier = duel_edge_buff_24_modifier
	remove_character_modifier = duel_edge_buff_25_modifier
	remove_character_modifier = duel_edge_buff_26_modifier
	remove_character_modifier = duel_edge_buff_27_modifier
	remove_character_modifier = duel_edge_buff_28_modifier
	remove_character_modifier = duel_edge_buff_29_modifier
	remove_character_modifier = duel_edge_buff_30_modifier
	# And the recalc flag.
	remove_character_flag = sce_needs_forced_recalc_flag
}

# Clean all duel edge debuff character modifiers.
remove_temporary_duel_edge_debuff_modifiers_effect = {
	# General modifiers.
	remove_character_modifier = duel_edge_debuff_01_modifier
	remove_character_modifier = duel_edge_debuff_02_modifier
	remove_character_modifier = duel_edge_debuff_03_modifier
	remove_character_modifier = duel_edge_debuff_04_modifier
	remove_character_modifier = duel_edge_debuff_05_modifier
	remove_character_modifier = duel_edge_debuff_06_modifier
	remove_character_modifier = duel_edge_debuff_07_modifier
	remove_character_modifier = duel_edge_debuff_08_modifier
	remove_character_modifier = duel_edge_debuff_09_modifier
	remove_character_modifier = duel_edge_debuff_10_modifier
	remove_character_modifier = duel_edge_debuff_11_modifier
	remove_character_modifier = duel_edge_debuff_12_modifier
	remove_character_modifier = duel_edge_debuff_13_modifier
	remove_character_modifier = duel_edge_debuff_14_modifier
	remove_character_modifier = duel_edge_debuff_15_modifier
	remove_character_modifier = duel_edge_debuff_16_modifier
	remove_character_modifier = duel_edge_debuff_17_modifier
	remove_character_modifier = duel_edge_debuff_18_modifier
	remove_character_modifier = duel_edge_debuff_19_modifier
	remove_character_modifier = duel_edge_debuff_20_modifier
	remove_character_modifier = duel_edge_debuff_21_modifier
	remove_character_modifier = duel_edge_debuff_22_modifier
	remove_character_modifier = duel_edge_debuff_23_modifier
	remove_character_modifier = duel_edge_debuff_24_modifier
	remove_character_modifier = duel_edge_debuff_25_modifier
	remove_character_modifier = duel_edge_debuff_26_modifier
	remove_character_modifier = duel_edge_debuff_27_modifier
	remove_character_modifier = duel_edge_debuff_28_modifier
	remove_character_modifier = duel_edge_debuff_29_modifier
	remove_character_modifier = duel_edge_debuff_30_modifier
	# And the recalc flag.
	remove_character_flag = sce_needs_forced_recalc_flag
}

# Clean all special combat character modifiers.
remove_temporary_combat_move_special_modifiers_effect = {
	remove_character_modifier = combat_move_taunt_modifier
	remove_character_modifier = combat_move_hurt_me_better_wounded_1_modifier
	remove_character_modifier = combat_move_hurt_me_better_wounded_2_modifier
	remove_character_modifier = combat_move_hurt_me_better_wounded_3_modifier
}

# Clean up all character modifiers resulting from single combat.
remove_temporary_modifiers_combat_effect = {
	# Buffs.
	remove_temporary_duel_edge_buff_modifiers_effect = yes
	# Debuffs.
	remove_temporary_duel_edge_debuff_modifiers_effect = yes
	# Special Combat.
	remove_temporary_combat_move_special_modifiers_effect = yes
}

# Clean up all combat move variables resulting from single combat.
remove_single_combat_character_local_variables_effect = {
	# Reset the special move flag.
	remove_local_variable = combat_move_special_slot_used_flag
	# Remove previous combat move flags.
	## Tier 1 moves
	remove_local_variable = combat_move_wait_and_hope_flag
	remove_local_variable = combat_move_unsure_attack_flag
	remove_local_variable = combat_move_enthusiastic_onslaught_flag
	remove_local_variable = combat_move_hail_mary_flag
	remove_local_variable = combat_move_pocket_sand_flag
	remove_local_variable = combat_move_nut_em_flag
	## Tier 2 moves
	remove_local_variable = combat_move_guard_flag
	remove_local_variable = combat_move_probing_attack_flag
	remove_local_variable = combat_move_onslaught_flag
	remove_local_variable = combat_move_surprise_attack_flag
	remove_local_variable = combat_move_taunt_flag
	remove_local_variable = combat_move_put_the_boot_in_flag
	## Tier 3 moves
	remove_local_variable = combat_move_strict_guard_flag
	remove_local_variable = combat_move_confident_attack_flag
	remove_local_variable = combat_move_expert_onslaught_flag
	remove_local_variable = combat_move_attempt_disarm_flag
	remove_local_variable = combat_move_lightning_assault_flag
	remove_local_variable = combat_move_tire_opponent_flag
	## High Secondary Skill special moves
	remove_local_variable = combat_move_reason_you_suck_speech_flag
	remove_local_variable = combat_move_technique_from_legend_flag
	remove_local_variable = combat_move_like_a_viper_flag
	remove_local_variable = combat_move_pocket_silver_flag
	remove_local_variable = combat_move_martial_voice_flag
	remove_local_variable = combat_move_mocking_boast_flag
	## Location Specific special moves
	remove_local_variable = combat_move_is_that_a_crocodile_flag
	remove_local_variable = combat_move_desert_warrior_flag
	remove_local_variable = combat_move_jungle_stalker_flag
	remove_local_variable = combat_move_open_terrain_expert_flag
	remove_local_variable = combat_move_rough_terrain_expert_flag
	remove_local_variable = combat_move_forest_fighter_flag
	## Trait-Specific special moves
	remove_local_variable = combat_move_raaargh_flag
	remove_local_variable = combat_move_hard_grit_flag
	remove_local_variable = combat_move_feint_and_stab_flag
	remove_local_variable = combat_move_butchery_flag
	remove_local_variable = combat_move_stoic_veteran_flag
	remove_local_variable = combat_move_blade_dance_flag
	remove_local_variable = combat_move_wrath_of_highgod_flag
	remove_local_variable = combat_move_hurt_me_better_flag
	## Misc special moves
	remove_local_variable = combat_move_special_fallback_flag
	remove_local_variable = combat_move_something_to_hide_flag
}

# Clean up all variables resulting from single combat.
remove_single_combat_variables_effect = {
	remove_variable = tier_1_counter
	remove_variable = tier_2_counter
	remove_variable = tier_3_counter
	remove_variable = sc_attacker_success_check
	remove_variable = sc_defender_success_check
	remove_variable = sc_attacker_injury_risk_check
	remove_variable = sc_defender_injury_risk_check
	remove_variable = sc_attacker_injury_bonus
	remove_variable = sc_defender_injury_bonus
	remove_variable = success_threshold
	remove_variable = sc_attacker_injury_risk_score
	remove_variable = sc_attacker_duel_success_score
	remove_variable = sc_defender_injury_risk_score
	remove_variable = sc_defender_duel_success_score
	remove_variable = current_round
	# Note, we don't remove var:engaged_in_single_combat here, as we run this effect at the start of combat for clean-up also.
}

# Clean all consequences of a single combat.
remove_single_combat_info_effect = {
	scope:sc_attacker = {
		# Only remove variables if they're alive, as otherwise we get errors.
		if = {
			limit = { is_alive = yes }
			remove_single_combat_character_local_variables_effect = yes
			remove_single_combat_variables_effect = yes
			remove_temporary_modifiers_combat_effect = yes
		}
	}
	scope:sc_defender = {
		# Only remove variables if they're alive, as otherwise we get errors.
		if = {
			limit = { is_alive = yes }
			remove_single_combat_character_local_variables_effect = yes
			remove_single_combat_variables_effect = yes
			remove_temporary_modifiers_combat_effect = yes
		}
	}
}

# Strip the shirts from characters where appropriate.
single_combat_apply_default_shirtlessness_effect = {
	if = {
		limit = {
			$ATTACKER$ = { government_has_flag = government_is_tribal }
			$DEFENDER$ = { government_has_flag = government_is_tribal }
		}
		$ATTACKER$ = { add_character_flag = single_combat_stripped_to_waist }
		$DEFENDER$ = { add_character_flag = single_combat_stripped_to_waist }
	}
	else = {
		$ATTACKER$ = { add_character_flag = single_combat_duel_armor }
		$DEFENDER$ = { add_character_flag = single_combat_duel_armor }
	}
}

# Let everyone put their shirts back on.
single_combat_clean_shirtlessness_effect = {
	$ATTACKER$ = {
		if = {
			limit = { has_character_flag = single_combat_stripped_to_waist }
			remove_character_flag = single_combat_stripped_to_waist
		}
		else_if = {
			limit = { has_character_flag = single_combat_duel_armor }
			remove_character_flag = single_combat_duel_armor
		}
	}
	$DEFENDER$ = {
		if = {
			limit = { has_character_flag = single_combat_stripped_to_waist }
			remove_character_flag = single_combat_stripped_to_waist
		}
		else_if = {
			limit = { has_character_flag = single_combat_duel_armor }
			remove_character_flag = single_combat_duel_armor
		}
	}
}

# Let everyone put their signature weapon back on.
single_combat_clean_temp_weapon_effect = {
	$ATTACKER$ = {
		if = { #check for variables set up in set_temporary_signature_weapon
			limit = {
				is_alive = yes
				OR = {
					has_variable = og_signature_weapon
					has_variable = temporary_signature_weapon
				}
			}
			if = { #remove the signature_weapon variable if the character didn't have anything before
				limit = {
					var:og_signature_weapon = flag:no_signature_weapon_yet
				}
				remove_variable = signature_weapon
			}
			else = { #restore the original signature_weapon
				set_variable = {
					name = signature_weapon
					value = var:og_signature_weapon 
				}
			}
			#remove all variables set up in set_temporary_signature_weapon
			remove_variable = temporary_signature_weapon
			remove_variable = og_signature_weapon
		}
	}
	$DEFENDER$ = {
		if = { #check for variables set up in set_temporary_signature_weapon
			limit = {
				is_alive = yes
				OR = {
					has_variable = og_signature_weapon
					has_variable = temporary_signature_weapon
				}
			}
			if = { #remove the signature_weapon variable if the character didn't have anything before
				limit = { 
					var:og_signature_weapon = flag:no_signature_weapon_yet
				}
				remove_variable = signature_weapon
			}
			else = { #restore the original signature_weapon
				set_variable = {
					name = signature_weapon
					value = var:og_signature_weapon 
				}
			}
			#remove all variables set up in set_temporary_signature_weapon
			remove_variable = temporary_signature_weapon
			remove_variable = og_signature_weapon
		}
	}
}

##################################################
# CONSEQUENCE EFFECTS

single_combat_have_slain_kin_effect = {
	# Check $ATTACKER$.
	if = {
		limit = {
			$ATTACKER$ = {
				is_alive = no
				killer = $DEFENDER$
			}
		}
		$DEFENDER$ = {
			add_kinslayer_trait_or_nothing_effect = { VICTIM = $ATTACKER$ }
		}
	}
	# Check $DEFENDER$.
	if = {
		limit = {
			$DEFENDER$ = {
				is_alive = no
				killer = $ATTACKER$
			}
		}
		$ATTACKER$ = {
			add_kinslayer_trait_or_nothing_effect = { VICTIM = $DEFENDER$ }
		}
	}
}
