Someone was asking about sending multiple caravans in WFaS and I decided to tackle this as my first foray into modding. I've tested this as working with up to 4 caravans so far, but you need to add all the extra stuff for each additional caravan that you want to be able to send.
Hope someone finds this useful.
Line numbers are there as a reference and aren't exact, especially if you've got other stuff in there already.
Add quest to module_quests.py
("oim_deliver_caravan", "Deliver Caravan", 0, "{!}Do not translate"),
# Allow multiple caravans
("oim_deliver_caravan_2", "Deliver Caravan", 0, "{!}Do not translate"),
Add quest active check at 20623 in module_dialogs.py
(this_or_next|quest_slot_eq, "qst_oim_deliver_caravan", slot_quest_target_center, -1),
# Multiple Caravans
(this_or_next|neg|check_quest_active, "qst_oim_deliver_caravan"),
(neg|check_quest_active, "qst_oim_deliver_caravan_2"),
Add quest dialog at 21030 in module_dialogs.py
Note - The initial quest is modified as such: (assign, "$oim_count_to_deliver_1", "$oim_count_to_deliver")
# First Caravan Start
(try_begin),
(neg|check_quest_active, "qst_oim_deliver_caravan"),
#spawning caravan
(set_spawn_radius,1),
(spawn_around_party,"p_main_party", "pt_oim_merchant_caravan2"),
(assign, ":oim_caravan", reg0),
(assign, "$oim_count_to_deliver_1", "$oim_count_to_deliver"),
(party_set_slot, ":oim_caravan", slot_party_type, spt_kingdom_caravan),
(party_set_slot, ":oim_caravan", slot_party_ai_state, spai_undefined),
(party_set_ai_behavior, ":oim_caravan", ai_bhvr_travel_to_party),
(party_set_ai_object, ":oim_caravan", "$town_suggested_to_go_to"),
(party_set_flags, ":oim_caravan", pf_default_behavior, 0),
(party_add_leader, ":oim_caravan", "trp_caravan_master"),
(party_add_members, ":oim_caravan", "trp_caravan_guard", "$g_number_of_escorts"), #was fix 10 for every kind of caravan
(try_begin),
(gt, "$players_kingdom", 0),
(party_set_faction, ":oim_caravan", "$players_kingdom"),
(else_try),
(party_set_faction, ":oim_caravan", "fac_player_faction"),
(try_end),
(troop_clear_inventory, "trp_oim_caravan_master"),
(troop_add_items, "trp_oim_caravan_master", "$town_suggested_goods", "$oim_count_to_deliver"),
(quest_set_slot, "qst_oim_deliver_caravan", slot_quest_current_state, 0),
(quest_set_slot, "qst_oim_deliver_caravan", slot_quest_giver_troop, "trp_player"),
(quest_set_slot, "qst_oim_deliver_caravan", slot_quest_target_center, "$town_suggested_to_go_to"),
(quest_set_slot, "qst_oim_deliver_caravan", slot_quest_target_item, "$town_suggested_goods"),
(quest_set_slot, "qst_oim_deliver_caravan", slot_quest_target_amount, "$oim_count_to_deliver"),
(quest_set_slot, "qst_oim_deliver_caravan", slot_quest_target_party, ":oim_caravan"),
(setup_quest_text, "qst_oim_deliver_caravan"),
(str_store_party_name_link, s1, "$g_encountered_party"),
(str_store_party_name_link, s5, "$town_suggested_to_go_to"),
(str_store_item_name, s3, "$town_suggested_goods"),
(assign, reg0, "$oim_count_to_deliver"),
(str_store_string, s2, "str_caravan_develireg_descr"),
(call_script, "script_start_quest", "qst_oim_deliver_caravan", "trp_player"),
#First Caravan End
#Second Caravan Start
(else_try),
(neg|check_quest_active, "qst_oim_deliver_caravan_2"),
#spawning caravan
(set_spawn_radius,1),
(spawn_around_party,"p_main_party", "pt_oim_merchant_caravan2"),
(assign, ":oim_caravan_2", reg0),
(assign, "$oim_count_to_deliver_2", "$oim_count_to_deliver"),
(party_set_slot, ":oim_caravan_2", slot_party_type, spt_kingdom_caravan),
(party_set_slot, ":oim_caravan_2", slot_party_ai_state, spai_undefined),
(party_set_ai_behavior, ":oim_caravan_2", ai_bhvr_travel_to_party),
(party_set_ai_object, ":oim_caravan_2", "$town_suggested_to_go_to"),
(party_set_flags, ":oim_caravan_2", pf_default_behavior, 0),
(party_add_leader, ":oim_caravan_2", "trp_caravan_master"),
(party_add_members, ":oim_caravan_2", "trp_caravan_guard", "$g_number_of_escorts"), #was fix 10 for every kind of caravan
(try_begin),
(gt, "$players_kingdom", 0),
(party_set_faction, ":oim_caravan_2", "$players_kingdom"),
(else_try),
(party_set_faction, ":oim_caravan_2", "fac_player_faction"),
(try_end),
(troop_clear_inventory, "trp_oim_caravan_master"),
(troop_add_items, "trp_oim_caravan_master", "$town_suggested_goods", "$oim_count_to_deliver"),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_current_state, 0),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_giver_troop, "trp_player"),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_center, "$town_suggested_to_go_to"),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_item, "$town_suggested_goods"),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_amount, "$oim_count_to_deliver"),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_party, ":oim_caravan_2"),
(setup_quest_text, "qst_oim_deliver_caravan_2"),
(str_store_party_name_link, s1, "$g_encountered_party"),
(str_store_party_name_link, s5, "$town_suggested_to_go_to"),
(str_store_item_name, s3, "$town_suggested_goods"),
(assign, reg0, "$oim_count_to_deliver"),
(str_store_string, s2, "str_caravan_develireg_descr"),
(call_script, "script_start_quest", "qst_oim_deliver_caravan_2", "trp_player"),
#Second Caravan End
Add encounter dialog near 10003 in module_dialogs.py
#First Caravan
(try_begin),
(quest_get_slot, ":party_no", "qst_oim_deliver_caravan", slot_quest_target_party),
(eq, ":party_no", "$g_encountered_party"),
# End First Caravan
# Second Caravan
(else_try),
(quest_get_slot, ":party_no", "qst_oim_deliver_caravan_2", slot_quest_target_party),
(eq, ":party_no", "$g_encountered_party"),
(try_end),
Add encounter dialog near 10035 in module_dialogs.py
#First Caravan
(try_begin),
(quest_get_slot, ":party_no", "qst_oim_deliver_caravan", slot_quest_target_party),
(eq, ":party_no", "$g_encountered_party"),
(quest_get_slot, ":goods", "qst_oim_deliver_caravan", slot_quest_target_item),
(str_store_item_name, s1, ":goods"),
(quest_get_slot, ":count", "qst_oim_deliver_caravan", slot_quest_target_amount),
(assign, reg1, ":count"),
(quest_get_slot, ":target_center", "qst_oim_deliver_caravan", slot_quest_target_center),
(str_store_party_name, s2, ":target_center"),
# End First Caravan
# Second Caravan
(else_try),
(quest_get_slot, ":party_no", "qst_oim_deliver_caravan_2", slot_quest_target_party),
(eq, ":party_no", "$g_encountered_party"),
(quest_get_slot, ":goods", "qst_oim_deliver_caravan_2", slot_quest_target_item),
(str_store_item_name, s1, ":goods"),
(quest_get_slot, ":count", "qst_oim_deliver_caravan_2", slot_quest_target_amount),
(assign, reg1, ":count"),
(quest_get_slot, ":target_center", "qst_oim_deliver_caravan_2", slot_quest_target_center),
(str_store_party_name, s2, ":target_center"),
(try_end),
Add completion info at 15144 in module_game_menus.py
Note - oim_count_to_deliver_1 will again need to be set for the original quest.
# Second Caravan
(
"oim_caravan_delivered_2",0,"All the caravan goods have been sold. After calculating all your expenses, you count a profit of {reg1} thaler.",
"none",
[
#code
(quest_get_slot, ":goods", "qst_oim_deliver_caravan_2", slot_quest_target_item),
(str_store_item_name, s2, ":goods"),
(quest_get_slot, ":count", "qst_oim_deliver_caravan_2", slot_quest_target_amount),
(quest_get_slot, ":party", "qst_oim_deliver_caravan_2", slot_quest_target_center),
(call_script, "script_oim_get_item_base_price", ":goods"),
(assign, ":price", reg0),
(assign, ":base_price", reg0),
(try_begin),
(ge, ":base_price", 150),
(neg|check_quest_active, "qst_oim_trade_pantent"),
(neg|quest_slot_eq, "qst_oim_trade_pantent", slot_quest_current_state, 2),
(quest_set_slot, "qst_oim_trade_pantent", slot_quest_current_state, 1),
(quest_set_slot, "qst_oim_trade_pantent", slot_quest_giver_troop, "trp_player"),
(setup_quest_text, "qst_oim_trade_pantent"),
(str_store_string, s2, "str_trade_patent_text"),
(call_script, "script_start_quest", "qst_oim_trade_pantent", "trp_player"),
(assign, "$g_notification_menu_var1", "str_oim_trade_troubles_descr"),
(assign, "$g_notification_menu_var2", "mnu_oim_caravan_delivered"),
(jump_to_menu, "mnu_notification_simple_str"),
(else_try),
(call_script, "script_oim_game_get_item_buy_price_factor", ":goods", ":party"),
(assign, ":price_factor", reg0),
(val_mul, ":price", ":price_factor"),
(val_div, ":price", 100),
(val_mul, ":price", ":count"), #count
(store_sub, ":profit", ":price", "$g_total_caravan_cost_pure"),
(try_begin),
(get_achievement_stat, ":total_profit_till_now", ACHIEVEMENT_TRADER, 0),
(val_add, ":total_profit_till_now", ":profit"),
(set_achievement_stat, ACHIEVEMENT_TRADER, 0, ":total_profit_till_now"),
(try_begin),
(ge, ":total_profit_till_now", 100000),
(unlock_achievement, ACHIEVEMENT_TRADER),
(try_end),
(try_begin),
(ge, ":total_profit_till_now", 1000000),
(unlock_achievement, ACHIEVEMENT_GREAT_TRADER),
(try_end),
(try_begin),
(ge, ":profit", 3000),
(unlock_achievement, ACHIEVEMENT_WHEELER_DEALER),
(try_end),
(try_end),
(try_begin),
(ge, ":base_price", 300), #if base price is more than 300 and trade patent is not yet taken, 10% of payment is taken as tax.
(this_or_next|quest_slot_eq, "qst_oim_trade_pantent", slot_quest_current_state, 0),
(quest_slot_eq, "qst_oim_trade_pantent", slot_quest_current_state, 1),
(assign, ":initial_price", ":price"),
(val_mul, ":price", 90),
(val_div, ":price", 100),
(store_sub, reg2, ":initial_price", ":price"),
(str_store_string, s3, "str_percent_10_tax_is_paid"),
(display_message, s3),
(else_try),
(ge, ":base_price", 150), #if base price is more than 200 and trade patent is not yet taken, 5% of payment is taken as tax.
(this_or_next|quest_slot_eq, "qst_oim_trade_pantent", slot_quest_current_state, 0),
(quest_slot_eq, "qst_oim_trade_pantent", slot_quest_current_state, 1),
(assign, ":initial_price", ":price"),
(val_mul, ":price", 95),
(val_div, ":price", 100),
(store_sub, reg2, ":initial_price", ":price"),
(str_store_string, s3, "str_percent_5_tax_is_paid"),
(display_message, s3),
(end_try),
(call_script, "script_troop_add_gold", "trp_player", ":price"),
(assign, reg1, ":price"),
(call_script, "script_oim_change_price_factors", ":party", ":goods", "$oim_count_to_deliver_2", 1),
(assign, "$oim_count_to_deliver_2", 0),
(try_end),
],
[
("continue",[],"Continue...",[
(call_script, "script_end_quest", "qst_oim_deliver_caravan_2"),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_center, -1),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_item, -1),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_amount, -1),
(quest_get_slot, ":party_no", "qst_oim_deliver_caravan_2", slot_quest_target_party),
(try_begin),
(party_is_active, ":party_no"),
(remove_party, ":party_no"),
(try_end),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_party, -1),
(change_screen_return),
#(jump_to_menu, "mnu_castle_outside"),
]),
],
),
#End Second Caravan
&& 15362 in module_game_menus.py
#First Caravan
(try_begin),
(eq, "$g_notification_menu_var2", "mnu_oim_caravan_delivered"),
(assign, "$g_notification_menu_var2", -1),
(jump_to_menu, "mnu_oim_caravan_delivered"),
## End First Caravan
# Second Caravan
(else_try),
(eq, "$g_notification_menu_var2", "mnu_oim_caravan_delivered_2"),
(assign, "$g_notification_menu_var2", -1),
(jump_to_menu, "mnu_oim_caravan_delivered_2"),
# End Second Caravan
Add trigger at 128 in module_simple_triggers.py
Note - oim_count_to_deliver_1 will again need to be setup for original quest
# Second Caravan
( 0,
[
(try_begin),
(check_quest_active,"qst_oim_deliver_caravan_2"),
(quest_get_slot, ":party_no", "qst_oim_deliver_caravan_2", slot_quest_target_party),
(gt, ":party_no", 0),
(assign, ":party_is_died", 0),
(try_begin),
(neg|party_is_active, ":party_no"),
(assign, ":party_is_died", 1),
(call_script, "script_cancel_quest", "qst_oim_deliver_caravan_2"),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_center, -1),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_item, -1),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_amount, -1),
(quest_set_slot, "qst_oim_deliver_caravan_2", slot_quest_target_party, -1),
(call_script, "script_add_notification_menu", "mnu_notification_simple_str", "str_oim_caravan_looted", -1),
(try_end),
(eq, ":party_is_died", 0),
(quest_get_slot, ":target_center_no", "qst_oim_deliver_caravan_2", slot_quest_target_center),
(store_distance_to_party_from_party, ":caravan_distance_to_destination", ":target_center_no", ":party_no"),
(assign, reg0, ":caravan_distance_to_destination"),
(le, ":caravan_distance_to_destination", 1),
(gt, "$oim_count_to_deliver_2", 0),
(jump_to_menu, "mnu_oim_caravan_delivered_2"),165
(end_try),
]),
# End Second Caravan