from header_common import *
from header_operations import *
from header_parties import *
from header_items import *
from header_skills import *
from header_triggers import *
from header_troops import *
from header_music import *
from module_constants import *
####################################################################################################################
# Simple triggers are the alternative to old style triggers. They do not preserve state, and thus simpler to maintain.
#
# Each simple trigger contains the following fields:
# 1) Check interval: How frequently this trigger will be checked
# 2) Operation block: This must be a valid operation block. See header_operations.py for reference.
####################################################################################################################
simple_triggers = [
# This trigger is deprecated. Use "script_game_event_party_encounter" in module_scripts.py instead
(ti_on_party_encounter,
[
]),
# This trigger is deprecated. Use "script_game_event_simulate_battle" in module_scripts.py instead
(ti_simulate_battle,
[
]),
(1,
[
(try_begin),
(eq, "$training_ground_position_changed", 0),
(assign, "$training_ground_position_changed", 1),
(set_fixed_point_multiplier, 100),
(position_set_x, pos0, 7050),
(position_set_y, pos0, 7200),
(party_set_position, "p_training_ground_3", pos0),
(try_end),
(gt,"$auto_besiege_town",0),
(gt,"$g_player_besiege_town", 0),
(ge, "$g_siege_method", 1),
(store_current_hours, ":cur_hours"),
(eq, "$g_siege_force_wait", 0),
(ge, ":cur_hours", "$g_siege_method_finish_hours"),
(neg|is_currently_night),
(rest_for_hours, 0, 0, 0), #stop resting
]),
(0,
[
(try_begin),
(eq, "$bug_fix_version", 0),
#fix for hiding test_scene in older savegames
(disable_party, "p_test_scene"),
#fix for correcting town_1 siege type
(party_set_slot, "p_town_1", slot_center_siege_with_belfry, 0),
#fix for hiding player_faction notes
(faction_set_note_available, "fac_player_faction", 0),
#fix for hiding faction 0 notes
(faction_set_note_available, "fac_no_faction", 0),
#fix for removing kidnapped girl from party
(try_begin),
(neg|check_quest_active, "qst_kidnapped_girl"),
(party_remove_members, "p_main_party", "trp_kidnapped_girl", 1),
(try_end),
#fix for not occupied but belong to a faction lords
(try_for_range, ":cur_troop", lords_begin, lords_end),
(try_begin),
(troop_slot_eq, ":cur_troop", slot_troop_occupation, slto_inactive),
(store_troop_faction, ":cur_troop_faction", ":cur_troop"),
(is_between, ":cur_troop_faction", "fac_kingdom_1", kingdoms_end),
(troop_set_slot, ":cur_troop", slot_troop_occupation, slto_kingdom_hero),
(try_end),
(try_end),
#fix for an error in 1.105, also fills new slot values
(call_script, "script_initialize_item_info"),
(assign, "$bug_fix_version", 1),
(try_end),
(eq,"$g_player_is_captive",1),
(gt, "$capturer_party", 0),
(party_is_active, "$capturer_party"),
(party_relocate_near_party, "p_main_party", "$capturer_party", 0),
]),
#Auto-menu
(0,
[
(try_begin),
(gt, "$g_last_rest_center", 0),
(party_get_battle_opponent, ":besieger_party", "$g_last_rest_center"),
(gt, ":besieger_party", 0),
(store_faction_of_party, ":encountered_faction", "$g_last_rest_center"),
(store_relation, ":faction_relation", ":encountered_faction", "fac_player_supporters_faction"),
(store_faction_of_party, ":besieger_party_faction", ":besieger_party"),
(store_relation, ":besieger_party_relation", ":besieger_party_faction", "fac_player_supporters_faction"),
(ge, ":faction_relation", 0),
(lt, ":besieger_party_relation", 0),
(start_encounter, "$g_last_rest_center"),
(rest_for_hours, 0, 0, 0), #stop resting
(else_try),
(store_current_hours, ":cur_hours"),
(assign, ":check", 0),
(try_begin),
(neq, "$g_check_autos_at_hour", 0),
(ge, ":cur_hours", "$g_check_autos_at_hour"),
(assign, ":check", 1),
(assign, "$g_check_autos_at_hour", 0),
(try_end),
(this_or_next|eq, ":check", 1),
(map_free),
(try_begin),
(ge,"$auto_menu",1),
(jump_to_menu,"$auto_menu"),
(assign,"$auto_menu",-1),
(else_try),
(ge,"$auto_enter_town",1),
(start_encounter, "$auto_enter_town"),
(else_try),
(ge,"$auto_besiege_town",1),
(start_encounter, "$auto_besiege_town"),
(else_try),
(ge,"$g_camp_mode", 1),
(assign, "$g_camp_mode", 0),
(assign, "$g_infinite_camping", 0),
(assign, "$g_player_icon_state", pis_normal),
(rest_for_hours, 0, 0, 0), #stop camping
(display_message, "@Breaking camp..."),
(try_end),
(try_end),
]),
#Notification menus
(0,
[
(troop_slot_ge, "trp_notification_menu_types", 0, 1),
(troop_get_slot, ":menu_type", "trp_notification_menu_types", 0),
(troop_get_slot, "$g_notification_menu_var1", "trp_notification_menu_var1", 0),
(troop_get_slot, "$g_notification_menu_var2", "trp_notification_menu_var2", 0),
(jump_to_menu, ":menu_type"),
(assign, ":end_cond", 2),
(try_for_range, ":cur_slot", 1, ":end_cond"),
(try_begin),
(troop_slot_ge, "trp_notification_menu_types", ":cur_slot", 1),
(val_add, ":end_cond", 1),
(try_end),
(store_sub, ":cur_slot_minus_one", ":cur_slot", 1),
(troop_get_slot, ":local_temp", "trp_notification_menu_types", ":cur_slot"),
(troop_set_slot, "trp_notification_menu_types", ":cur_slot_minus_one", ":local_temp"),
(troop_get_slot, ":local_temp", "trp_notification_menu_var1", ":cur_slot"),
(troop_set_slot, "trp_notification_menu_var1", ":cur_slot_minus_one", ":local_temp"),
(troop_get_slot, ":local_temp", "trp_notification_menu_var2", ":cur_slot"),
(troop_set_slot, "trp_notification_menu_var2", ":cur_slot_minus_one", ":local_temp"),
(try_end),
]),
#Music,
(1,
[
(map_free),
(call_script, "script_music_set_situation_with_culture", mtf_sit_travel),
]),
(0,
[
#escort caravan quest auto dialog trigger
(try_begin),
(eq, "$caravan_escort_state", 1),
(party_is_active, "$caravan_escort_party_id"),
(store_distance_to_party_from_party, ":caravan_distance_to_destination","$caravan_escort_destination_town","$caravan_escort_party_id"),
(lt, ":caravan_distance_to_destination", 2),
(store_distance_to_party_from_party, ":caravan_distance_to_player","p_main_party","$caravan_escort_party_id"),
(lt, ":caravan_distance_to_player", 5),
(assign, "$talk_context", tc_party_encounter),
(assign, "$g_encountered_party", "$caravan_escort_party_id"),
(party_stack_get_troop_id, ":caravan_leader", "$caravan_escort_party_id", 0),
(party_stack_get_troop_dna, ":caravan_leader_dna", "$caravan_escort_party_id", 0),
(start_map_conversation, ":caravan_leader", ":caravan_leader_dna"),
(try_end),
(try_begin),
(gt, "$g_reset_mission_participation", 1),
(try_for_range, ":troop", active_npcs_begin, kingdom_ladies_end),
(troop_set_slot, ":troop", slot_troop_mission_participation, 0),
(try_end),
(try_end),
]),
(24,
[
(try_for_range, ":kingdom_no", npc_kingdoms_begin, npc_kingdoms_end),
(faction_get_slot, ":faction_morale", ":kingdom_no", slot_faction_morale_of_player_troops),
(store_sub, ":divisor", 140, "$player_right_to_rule"),
(val_div, ":divisor", 14),
(val_max, ":divisor", 1),
(store_div, ":faction_morale_div_10", ":faction_morale", ":divisor"), #10 is the base, down to 2 for 100 rtr
(val_sub, ":faction_morale", ":faction_morale_div_10"),
(faction_set_slot, ":kingdom_no", slot_faction_morale_of_player_troops, ":faction_morale"),
(try_end),
]),
(4, #Locate kingdom ladies
[
#change location for all ladies
(try_for_range, ":troop_id", kingdom_ladies_begin, kingdom_ladies_end),
(neg|troop_slot_ge, ":troop_id", slot_troop_prisoner_of_party, 0),
(call_script, "script_get_kingdom_lady_social_determinants", ":troop_id"),
(assign, ":location", reg1),
(troop_set_slot, ":troop_id", slot_troop_cur_center, ":location"),
(try_end),
]),
(2, #Error check for multiple parties on the map
[
(eq, "$cheat_mode", 1),
(assign, ":debug_menu_noted", 0),
(try_for_parties, ":party_no"),
(gt, ":party_no", "p_spawn_points_end"),
(party_stack_get_troop_id, ":commander", ":party_no", 0),
(is_between, ":commander", active_npcs_begin, active_npcs_end),
(troop_get_slot, ":commander_party", ":commander", slot_troop_leaded_party),
(neq, ":party_no", ":commander_party"),
(assign, reg4, ":party_no"),
(assign, reg5, ":commander_party"),
(str_store_troop_name, s3, ":commander"),
(display_message, "@{!}{s3} commander of party #{reg4} which is not his troop_leaded party {reg5}"),
(str_store_string, s65, "str_party_with_commander_mismatch__check_log_for_details_"),
(try_begin),
(eq, ":debug_menu_noted", 0),
(call_script, "script_add_notification_menu", "mnu_debug_alert_from_s65", 0, 0),
(assign, ":debug_menu_noted", 1),
(try_end),
(try_end),
]),
(24, #Kingdom ladies send messages
[
(try_begin),
(neg|check_quest_active, "qst_visit_lady"),
(neg|troop_slot_ge, "trp_player", slot_troop_prisoner_of_party, 1),
(neg|troop_slot_ge, "trp_player", slot_troop_spouse, active_npcs_begin),
(assign, ":lady_not_visited_longest_time", -1),
(assign, ":longest_time_without_visit", 120), #five days
(try_for_range, ":troop_id", kingdom_ladies_begin, kingdom_ladies_end),
#set up message for ladies the player is courting
(troop_slot_ge, ":troop_id", slot_troop_met, 2),
(neg|troop_slot_eq, ":troop_id", slot_troop_met, 4),
(troop_slot_eq, ":troop_id", slot_lady_no_messages, 0),
(troop_slot_eq, ":troop_id", slot_troop_spouse, -1),
(troop_get_slot, ":location", ":troop_id", slot_troop_cur_center),
(is_between, ":location", walled_centers_begin, walled_centers_end),
(call_script, "script_troop_get_relation_with_troop", "trp_player", ":troop_id"),
(gt, reg0, 1),
(store_current_hours, ":hours_since_last_visit"),
(troop_get_slot, ":last_visit_hour", ":troop_id", slot_troop_last_talk_time),
(val_sub, ":hours_since_last_visit", ":last_visit_hour"),
(gt, ":hours_since_last_visit", ":longest_time_without_visit"),
(assign, ":longest_time_without_visit", ":hours_since_last_visit"),
(assign, ":lady_not_visited_longest_time", ":troop_id"),
(assign, ":visit_lady_location", ":location"),
(try_end),
(try_begin),
(gt, ":lady_not_visited_longest_time", 0),
(call_script, "script_add_notification_menu", "mnu_notification_lady_requests_visit", ":lady_not_visited_longest_time", ":visit_lady_location"),
(try_end),
(try_end),
]),
#Player raiding a village
# This trigger will check if player's raid has been completed and will lead control to village menu.
(1,
[
(ge,"$g_player_raiding_village",1),
(try_begin),
(neq, "$g_player_is_captive", 0),
#(rest_for_hours, 0, 0, 0), #stop resting - abort
(assign,"$g_player_raiding_village",0),
(else_try),
(map_free), #we have been attacked during raid
(assign,"$g_player_raiding_village",0),
(else_try),
(this_or_next|party_slot_eq, "$g_player_raiding_village", slot_village_state, svs_looted),
(party_slot_eq, "$g_player_raiding_village", slot_village_state, svs_deserted),
(start_encounter, "$g_player_raiding_village"),
(rest_for_hours, 0),
(assign,"$g_player_raiding_village",0),
(assign,"$g_player_raid_complete",1),
(else_try),
(party_slot_eq, "$g_player_raiding_village", slot_village_state, svs_being_raided),
(rest_for_hours, 3, 5, 1), #rest while attackable
(else_try),
(rest_for_hours, 0, 0, 0), #stop resting - abort
(assign,"$g_player_raiding_village",0),
(assign,"$g_player_raid_complete",0),
(try_end),
]),
#Pay day.
(24 * 7,
[
(assign, "$g_presentation_lines_to_display_begin", 0),
(assign, "$g_presentation_lines_to_display_end", 15),
(assign, "$g_apply_budget_report_to_gold", 1),
(try_begin),
(eq, "$g_infinite_camping", 0),
(start_presentation, "prsnt_budget_report"),
(try_end),
]),
# Oath fulfilled -- ie, mercenary contract expired?
(24,
[
(le, "$auto_menu", 0),
(gt, "$players_kingdom", 0),
(neq, "$players_kingdom", "fac_player_supporters_faction"),
(eq, "$player_has_homage", 0),
(troop_get_slot, ":player_spouse", "trp_player", slot_troop_spouse),
#A player bound to a kingdom by marriage will not have the contract expire. This should no longer be the case, as I've counted wives as having homage, but is in here as a fallback
(assign, ":player_has_marriage_in_faction", 0),
(try_begin),
(is_between, ":player_spouse", active_npcs_begin, active_npcs_end),
(store_faction_of_troop, ":spouse_faction", ":player_spouse"),
(eq, ":spouse_faction", "$players_kingdom"),
(assign, ":player_has_marriage_in_faction", 1),
(try_end),
(eq, ":player_has_marriage_in_faction", 0),
(store_current_day, ":cur_day"),
(gt, ":cur_day", "$mercenary_service_next_renew_day"),
(jump_to_menu, "mnu_oath_fulfilled"),
]),
# Reducing luck by 1 in every 180 hours
(180,
[
(val_sub, "$g_player_luck", 1),
(val_max, "$g_player_luck", 0),
]),