OSP Kit Campaign Trade with caravans

正在查看此主题的用户

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
丰富的(BB 代码):
(...)
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.
丰富的(BB 代码):
(...)
   ["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
丰富的(BB 代码):
(...)
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
(...)
丰富的(BB 代码):
#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
丰富的(BB 代码):
(...)
  ("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
丰富的(BB 代码):
(...)
                (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),
(...)
丰富的(BB 代码):
(...)
          (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),
     
  ]),
(...)
丰富的(BB 代码):
(...)
        (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),
(...)
丰富的(BB 代码):
(...)
    (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
丰富的(BB 代码):
(...)
          # 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
丰富的(BB 代码):
(...)
  [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.
 
由板主最后编辑:
Wow, that's a very neat idea! Especially for those of us who think Native has a lot to give still. :grin:
 
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)
 
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)
Oh I see, thank you friend <3
 
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],
 
后退
顶部 底部