OSP Kit Campaign Trade with caravans

Users who are viewing this thread

I've done some trading with caravans.
On native 1.171/1.174
Initially it was in mod that I do for myself.
Post factum I recognized, that there is caravan trade in Floris Modpack, but works different than mine.
It's not tested in the long run, but seems to be ok.
I've done some scripting tricks, also many things can be done other way.
Changed code is marked orange.
Credit goes to: Lav and other people who made Tweaked MS 1.166 - especially for great operations documentation,
kalarhan - I used tips that he posted to someone in QA Thread
and other community members who done documentation, tutorials, forum answers etc.
Feel free to use it and modify

1. module_troops.py
Rich (BB code):
(...)
knight_skills_3 = knows_riding_5|knows_ironflesh_4|knows_power_strike_5|knows_athletics_3|knows_tactics_4|knows_prisoner_management_2|knows_leadership_6
knight_skills_4 = knows_riding_6|knows_ironflesh_5|knows_power_strike_6|knows_athletics_4|knows_tactics_5|knows_prisoner_management_3|knows_leadership_7
knight_skills_5 = knows_riding_7|knows_ironflesh_6|knows_power_strike_7|knows_athletics_5|knows_tactics_6|knows_prisoner_management_3|knows_leadership_9

#generic caravan merchant things
gen_caravan_master_1 = tf_mounted|tf_guarantee_boots|tf_guarantee_armor|tf_guarantee_horse|tf_hero|tf_inactive|tf_is_merchant
gen_caravan_master_skills = knows_riding_1|knows_trade_2|knows_prisoner_management_1|knows_leadership_1|knows_riding_4|knows_ironflesh_3|knows_inventory_management_10

#These face codes are generated by the in-game face generator.
#Enable edit mode and press ctrl+E in face generator screen to obtain face codes.


reserved = 0

no_scene = 0
(...)
There must be enough custom caravan masters for every active caravan. Can be calculated from script create_kingdom_party_if_below_limit, but i prefer to add some more.
Rich (BB code):
(...)
   ["coop_companion_equipment_ui_1_f","{!}multiplayer_end","{!}multiplayer_end", tf_female, 0, 0, fac_kingdom_5, [], 0, 0, 0, 0, 0],
   ["coop_companion_equipment_sets_end","{!}multiplayer_end","{!}multiplayer_end", 0, 0, 0, fac_kingdom_5, [], 0, 0, 0, 0, 0],

#caravan masters begin
  ["caravan_master_01","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_02","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_03","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_04","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_05","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_06","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_07","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_08","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_09","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_10","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_11","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_12","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_13","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_14","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_15","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_16","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_17","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_18","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_19","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_20","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_31","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_32","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_33","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_34","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_35","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_36","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_37","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_38","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_39","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_40","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_41","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_42","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_43","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_44","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_45","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_46","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_47","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_48","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_49","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],
  ["caravan_master_50","Caravan Master","Caravan Masters",gen_caravan_master_1,0,0, fac_commoners,[itm_sword_medieval_c,itm_fur_coat,itm_hide_boots,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse,itm_saddle_horse, itm_leather_jacket, itm_leather_cap], def_attrib|level(9), wp(100), gen_caravan_master_skills, mercenary_face_1, mercenary_face_2],

  ["caravan_masters_end","caravan_masters_end","caravan_masters_end",tf_hero, 0,0, fac_commoners,[],def_attrib|level(2),wp(20),knows_inventory_management_10,0],

 
]


#Troop upgrade declarations

upgrade(troops,"farmer", "watchman")
upgrade(troops,"townsman","watchman")
upgrade2(troops,"watchman","caravan_guard","mercenary_crossbowman")
(...)
2. module_constants.py
Rich (BB code):
(...)
enctype_catched_during_village_raid   = 2


### Troop occupations slot_troop_occupation
##use of unused constant
slto_merchant           = 1
slto_inactive           = 0 #for companions at the beginning of the game

slto_kingdom_hero       = 2
(...)
Rich (BB code):
#custom caravan masters constants
custom_caravan_masters_begin = "trp_caravan_master_01"
custom_caravan_masters_end = "trp_caravan_masters_end"
3. module_party_templates.py
Rich (BB code):
(...)
  ("raider_party","Raiders",icon_gray_knight|carries_goods(16)|pf_quest_party,0,fac_commoners,bandit_personality,[]),
  ("raider_captives","Raider Captives",0,0,fac_commoners,0,[(trp_peasant_woman,6,30,pmf_is_prisoner)]),
  #edited to allow custom merchants
  ("kingdom_caravan_party","Caravan",icon_mule|carries_goods(25)|pf_show_faction,0,fac_commoners,merchant_personality,[(trp_caravan_guard,12,40)]),
  ("prisoner_train_party","Prisoner Train",icon_gray_knight|carries_goods(5)|pf_show_faction,0,fac_commoners,merchant_personality,[]),
  ("default_prisoners","Default Prisoners",0,0,fac_commoners,0,[(trp_bandit,5,10,pmf_is_prisoner)]),
  (...)
4. module_scripts.py
Rich (BB code):
(...)
                (faction_slot_eq, ":cur_troop_faction", slot_faction_marshall, ":cur_troop_id"),
                (is_between, ":cur_troop_faction", kingdoms_begin, kingdoms_end),
                (assign, "$marshall_defeated_in_battle", ":cur_troop_id"),
                #Marshall is defeated, refresh ai.
                (assign, "$g_recalculate_ais", 1),
              (try_end),
            (try_end),
            
                #merchants automatically silently escape
                (try_begin),
                    (ge, ":collective_casualties", 0),
                    (party_get_num_companion_stacks, ":num_stacks", ":collective_casualties"),
                (else_try),
                    (assign, ":num_stacks", 0),
                (try_end),
                (try_for_range, ":troop_iterator", 0, ":num_stacks"),
                    (party_stack_get_troop_id, ":cur_troop_id", ":collective_casualties", ":troop_iterator"),
                    (is_between, ":cur_troop_id", custom_caravan_masters_begin, custom_caravan_masters_end),
                    (call_script, "script_remove_troop_from_prison", ":cur_troop_id"),
                    (troop_set_slot, ":cur_troop_id", slot_troop_occupation, slto_inactive),
                (try_end),
            
             (try_begin),
               (ge, ":collective_casualties", 0),
               (party_get_num_prisoner_stacks, ":num_stacks", ":collective_casualties"),
             (else_try),
               (assign, ":num_stacks", 0),
             (try_end),
(...)
Rich (BB code):
(...)
          (gt, ":rand", 82),
          (call_script, "script_change_center_prosperity", ":center_no", 1),
          (val_add, "$newglob_total_prosperity_from_caravan_trade", 1),
        (try_end),
      (try_end),
     
    #caravan master trade inventory refresh
    (try_for_range, ":cur_merch", custom_caravan_masters_begin, custom_caravan_masters_end),
        (troop_get_slot, ":is_active", ":cur_merch", slot_troop_occupation),
        (eq, ":is_active", slto_merchant),
        (party_count_members_of_type, ":merch_in_party", ":party_no", ":cur_merch"),
        (eq, ":merch_in_party", 1),
        (call_script, "script_cf_refresh_caravan_merchant_inventory", ":cur_merch"),
    (try_end),
     
  ]),
(...)
Rich (BB code):
(...)
        (party_set_slot, ":result", slot_party_ai_state, spai_undefined),
        (try_begin),
          (neq, ":party_name_str", "str_no_string"),
          (party_set_name, ":result", ":party_name_str"),
        (try_end),
       
#add custom caravan master
        (try_begin),
            (assign, ":check", 0),
            (try_for_range, ":merch", custom_caravan_masters_begin, custom_caravan_masters_end),
                (eq, ":check", 0),
                (troop_get_slot, ":is_active", ":merch", slot_troop_occupation),
                (eq, ":is_active", 0),
                (party_add_leader, ":result", ":merch", 1),
                (troop_set_slot, ":merch", slot_troop_occupation, slto_merchant),#not sure
                
                (call_script, "script_cf_refresh_caravan_merchant_inventory", ":merch"),
                (assign, ":check", 1),
            (try_end),
            #at least can be caravan without master
        (try_end),
       
        (try_begin),
##          (eq, ":party_type", spt_forager),
##          (party_add_template, ":result", ":reinforcements_a"),
##        (else_try),
(...)
Rich (BB code):
(...)
    (position_rotate_z, pos8, 30),
    (position_rotate_x, pos8, -50),
    (cur_tableau_add_sun_light, pos8, 175,150,125),
    ]),
   #INVASION MODE END
    
#refresh caravan merchant inventory
#param 1 = current merchant
#can be done any other configuration, but order of adding is important
    (
        "cf_refresh_caravan_merchant_inventory",
        [
            (store_script_param_1, ":cur_merch"),
            (set_merchandise_modifier_quality,150),
            (reset_item_probabilities,100),
            (troop_get_slot, ":is_active", ":cur_merch", slot_troop_occupation),
            (eq, ":is_active", slto_merchant),
            (store_random_in_range, ":goods_number", 2, 4),
            (troop_clear_inventory, ":cur_merch"),
            
            #dont know why it must be done here (city mecrchants dont need it)
            (troop_set_inventory_slot, ":cur_merch", 0, "itm_sword_medieval_c"),
            (troop_set_inventory_slot, ":cur_merch", 4, "itm_leather_cap"),
            (troop_set_inventory_slot, ":cur_merch", 5, "itm_fur_coat"),
            (troop_set_inventory_slot, ":cur_merch", 6, "itm_hide_boots"),
            (troop_set_inventory_slot, ":cur_merch", 8, "itm_saddle_horse"),
            
            (troop_add_merchandise, ":cur_merch", itp_type_goods, ":goods_number"),
            (troop_sort_inventory, ":cur_merch"),
            (store_troop_gold, ":cur_gold",":cur_merch"),
            (lt,":cur_gold",200),
            (store_random_in_range,":new_gold",100,200),
            (call_script, "script_troop_add_gold", ":cur_merch", ":new_gold"),
        ]
    ),
    
]
5. module_game_menus.py
Rich (BB code):
(...)
          # Talk to enemy leaders                                       
          (assign, ":break", 0),
         
          (party_get_num_companion_stacks, ":num_stacks", "p_total_enemy_casualties"), #p_encountered changed to total_enemy_casualties                   
          (try_for_range, ":stack_no", "$last_defeated_hero", ":num_stacks"), #May 31 bug note -- this now returns some heroes in victorious party as well as in the other party
            (eq, ":break", 0),
            (party_stack_get_troop_id, ":stack_troop", "p_total_enemy_casualties", ":stack_no"),
            (party_stack_get_troop_dna, ":stack_troop_dna", "p_total_enemy_casualties", ":stack_no"),
           
#merchant always escape mechanism
            (try_begin),
           
            (troop_is_hero, ":stack_troop"),
                                   
            (store_troop_faction, ":defeated_faction", ":stack_troop"),
            #steve post 0912 changes begin - removed, this is duplicated elsewhere in game menus
            #(call_script, "script_add_log_entry", logent_lord_defeated_by_player, "trp_player",  -1, ":stack_troop", ":defeated_faction"),
            (try_begin),
                 (store_relation, ":relation", ":defeated_faction", "fac_player_faction"),
              (ge, ":relation", 0),
              (str_store_troop_name, s4, ":stack_troop"),

              (try_begin),
                (eq, "$cheat_mode", 1),
                (display_message, "@{!}{s4} skipped in p_total_enemy_casualties capture queue because is friendly"),
              (try_end),           
            (else_try),
              (try_begin),
                (party_stack_get_troop_id, ":party_leader", "$g_encountered_party", 0),
                (is_between, ":party_leader", active_npcs_begin, active_npcs_end),               
                (troop_slot_eq, ":party_leader", slot_troop_occupation, slto_kingdom_hero),
                (store_sub, ":kingdom_hero_id", ":party_leader", active_npcs_begin),
                (get_achievement_stat, ":was_he_defeated_player_before", ACHIEVEMENT_BARON_GOT_BACK, ":kingdom_hero_id"),               
                (eq, ":was_he_defeated_player_before", 1),
               
                (unlock_achievement, ACHIEVEMENT_BARON_GOT_BACK),
              (try_end),

              (store_add, "$last_defeated_hero", ":stack_no", 1),                   
              (call_script, "script_remove_troop_from_prison", ":stack_troop"),
              (troop_set_slot, ":stack_troop", slot_troop_leaded_party, -1),

              (call_script, "script_cf_check_hero_can_escape_from_player", ":stack_troop"),
                           
              (str_store_troop_name, s1, ":stack_troop"),
              (str_store_faction_name, s3, ":defeated_faction"),
              (str_store_string, s17, "@{s1} of {s3} managed to escape."),
              (display_log_message, "@{!}{s17}"),
              (jump_to_menu, "mnu_enemy_slipped_away"),
              (assign, ":break", 1),             
            (else_try),
              (store_add, "$last_defeated_hero", ":stack_no", 1),                   
              (call_script, "script_remove_troop_from_prison", ":stack_troop"),
              (troop_set_slot, ":stack_troop", slot_troop_leaded_party, -1),

              (assign, "$talk_context", tc_hero_defeated),                           
             
              (call_script, "script_setup_troop_meeting", ":stack_troop", ":stack_troop_dna"),
              (assign, ":break", 1),
            (try_end),
           
#merchant always escape mechanism
            (try_end),
            (try_begin),
                (is_between, ":stack_troop", custom_caravan_masters_begin, custom_caravan_masters_end),
                (call_script, "script_remove_troop_from_prison", ":stack_troop"),
                (troop_set_slot, ":stack_troop", slot_troop_occupation, slto_inactive),
            (try_end),
           
          (try_end),         
                 
          (eq, ":break", 1),         
        (else_try),
          # Talk to freed heroes
          (assign, ":break", 0),
(...)
6. module_dialogs.py
Rich (BB code):
(...)
  [anyone,"talk_caravan_enemy_2", [],
   "Never. It is our duty to protect these goods. You shall have to fight us, brigand!", "close_window",
   [
    (store_relation,":rel","$g_encountered_party_faction","fac_player_supporters_faction"),
    (val_min,":rel",0),
    (val_sub,":rel",4),
    (call_script, "script_set_player_relation_with_faction", "$g_encountered_party_faction", ":rel"),
    (call_script, "script_diplomacy_party_attacks_neutral", "p_main_party", "$g_encountered_party"),
    ]],
   
#trade with caravan master
    [
        anyone|plyr,
        "merchant_talk",
        [
            (store_relation, ":rel", "$g_encountered_party_faction", "fac_player_supporters_faction"),
            (ge, ":rel", 0),
            (store_conversation_troop, ":car_master"),
            (is_between, ":car_master", custom_caravan_masters_begin, custom_caravan_masters_end),
        ],
        "Wanna trade?",
        "merchant_pretalk",
        [
            (change_screen_trade),
        ]
    ],

  [anyone|plyr,"merchant_talk", [], "[Leave]", "close_window",[(assign, "$g_leave_encounter",1)]],
(...)
Basically what it does is using custom kind of NPCs as leaders of Caravans. They are taken from pool and returned when defeated in battle. Refreshing inventories takes place when the caravan is spawned, or visit city. This trade system doesnt have any connection with loot from caravan or economy system.
 
Last edited by a moderator:
Wow, that's a very neat idea! Especially for those of us who think Native has a lot to give still. :grin:
Hello Friend. I know my comment has nothing to do with the topic but I really wanted to ask you a question.
Some OSP codes have smiles, when copied to .py files they are in codes, example ": cool:". And python doesn't recognize it. How to fix this?
If you can help me I would be very happy.
I'm sorry to the topic owner for putting my question here.
I don't know if this is against any rules, I'm new here, but if it is, let me know and I delete my comment.
 
Hello, I hope neutroceparus doesn't mind but I will answer you. The smiles are because of the forum. Generally, it's this that has a problem
Python:
8)
that makes it problematic.
So, when you see ": cool ", it is actually
Python:
8)
 
I installed the code and it works fine but I have some doubts:
1.- For example, in my mod I have 28 cities and many trade routes .... What does the number of caravan master in troop influence? Should I add more or less according to the number of routes?
2- even though the face code is for mercenaries (which I also use in the mod's mercenaries), the faces of the caravan bosses appear very different.(very deformed xd)
3- How could I add more products for sale? So far I have only seen no more than 7.
4- why are so many horse items in the troop?
Thank you
 
Hello,

What does this line do?

["caravan_masters_end","caravan_masters_end","caravan_masters_end",tf_hero, 0,0, fac_commoners,[],def_attrib|level(2),wp(20),knows_inventory_management_10,0],
 
Back
Top Bottom