Here is the finnished(ish) "Top-Tier-Troop-to-Hero Script" thanks to Dunde:
First, define 10 new heroes on module_troops.py , put between "merchant20" and #Seneschals :
I only copy "trp_npc1" form native. Please feel free to modify the stats and rename them, and it will be better if hero1 and hero6 are given swadian face,
hero2 and hero7 are vaegir faces, etc.
Define new constants on module_constants.py :
module_scripts.py's change :
Add these lines on "game_start" script :
Main Script, I make it slimmer, taking away all checking removing the cf(can fail), assumed that this script only called from our menu.
Put before last ]
The Menu, called by trigger
on module_game_menus.py, before last ] :
Here you are your dialogs. Put it under dialog = [ on module_dialogs.py. I'm not sure about the initial state. Is it "start" or "event_triggered", I'll test it when I have module_system.
Ok,I follow your way, I make it called by timed trigger, but I make the interval is not fixed 14 days, but random 14-21 days.
Then, optional from me, I think it will be more balanced if we put more limitation, only player reached 15 level can recruit new hero
on module_simple_triggers.py :
Admin note:
Following thread builds up on this OSP code and might be interesting for some:
First, define 10 new heroes on module_troops.py , put between "merchant20" and #Seneschals :
Code:
## ["merchant_20","merchant_20_F","merchant_20_F",tf_hero|tf_female, 0,0, fac_merchants,[itm_courser, itm_arming_sword, itm_padded_leather, itm_leather_boots, ], def_attrib|level(15),wp(100),knows_inventory_management_10, 0x000000000010500401f6837d27688212],
###########################################################################
["hero1","Swadian Warrior","Swadian Warriors",tf_hero|tf_unmoveable_in_party_window, 0, reserved, fac_commoners,[itm_khergit_armor,itm_nomad_boots,itm_knife],
str_8|agi_7|int_12|cha_7|level(3),wp(60),knows_tracker_npc|
knows_ironflesh_1|knows_power_strike_1|knows_pathfinding_3|knows_athletics_2|knows_tracking_1|knows_riding_2, #skills 2/3 player at that level
0x00000004bf086143259d061a9046e23500000000001db52c0000000000000000],
["hero2","Vaegir Warrior","Vaegir Warriors",tf_hero|tf_unmoveable_in_party_window, 0, reserved, fac_commoners,[itm_khergit_armor,itm_nomad_boots,itm_knife],
str_8|agi_7|int_12|cha_7|level(3),wp(60),knows_tracker_npc|
knows_ironflesh_1|knows_power_strike_1|knows_pathfinding_3|knows_athletics_2|knows_tracking_1|knows_riding_2, #skills 2/3 player at that level
0x00000004bf086143259d061a9046e23500000000001db52c0000000000000000],
["hero3","Kerghit Warrior","Kerghit Warriors",tf_hero|tf_unmoveable_in_party_window, 0, reserved, fac_commoners,[itm_khergit_armor,itm_nomad_boots,itm_knife],
str_8|agi_7|int_12|cha_7|level(3),wp(60),knows_tracker_npc|
knows_ironflesh_1|knows_power_strike_1|knows_pathfinding_3|knows_athletics_2|knows_tracking_1|knows_riding_2, #skills 2/3 player at that level
0x00000004bf086143259d061a9046e23500000000001db52c0000000000000000],
["hero4","Nord Warrior","Nord Warriors",tf_hero|tf_unmoveable_in_party_window, 0, reserved, fac_commoners,[itm_khergit_armor,itm_nomad_boots,itm_knife],
str_8|agi_7|int_12|cha_7|level(3),wp(60),knows_tracker_npc|
knows_ironflesh_1|knows_power_strike_1|knows_pathfinding_3|knows_athletics_2|knows_tracking_1|knows_riding_2, #skills 2/3 player at that level
0x00000004bf086143259d061a9046e23500000000001db52c0000000000000000],
["hero5","Rodhok Warrior","Rodhok Warriors",tf_hero|tf_unmoveable_in_party_window, 0, reserved, fac_commoners,[itm_khergit_armor,itm_nomad_boots,itm_knife],
str_8|agi_7|int_12|cha_7|level(3),wp(60),knows_tracker_npc|
knows_ironflesh_1|knows_power_strike_1|knows_pathfinding_3|knows_athletics_2|knows_tracking_1|knows_riding_2, #skills 2/3 player at that level
0x00000004bf086143259d061a9046e23500000000001db52c0000000000000000],
["hero6","Swadian Patriot","Swadian Warriors",tf_hero|tf_unmoveable_in_party_window, 0, reserved, fac_commoners,[itm_khergit_armor,itm_nomad_boots,itm_knife],
str_8|agi_7|int_12|cha_7|level(3),wp(60),knows_tracker_npc|
knows_ironflesh_1|knows_power_strike_1|knows_pathfinding_3|knows_athletics_2|knows_tracking_1|knows_riding_2, #skills 2/3 player at that level
0x00000004bf086143259d061a9046e23500000000001db52c0000000000000000],
["hero7","Vaegir Patriot","Vaegir Warriors",tf_hero|tf_unmoveable_in_party_window, 0, reserved, fac_commoners,[itm_khergit_armor,itm_nomad_boots,itm_knife],
str_8|agi_7|int_12|cha_7|level(3),wp(60),knows_tracker_npc|
knows_ironflesh_1|knows_power_strike_1|knows_pathfinding_3|knows_athletics_2|knows_tracking_1|knows_riding_2, #skills 2/3 player at that level
0x00000004bf086143259d061a9046e23500000000001db52c0000000000000000],
["hero8","Kerghit Patriot","Kerghit Warriors",tf_hero|tf_unmoveable_in_party_window, 0, reserved, fac_commoners,[itm_khergit_armor,itm_nomad_boots,itm_knife],
str_8|agi_7|int_12|cha_7|level(3),wp(60),knows_tracker_npc|
knows_ironflesh_1|knows_power_strike_1|knows_pathfinding_3|knows_athletics_2|knows_tracking_1|knows_riding_2, #skills 2/3 player at that level
0x00000004bf086143259d061a9046e23500000000001db52c0000000000000000],
["hero9","Nord Patriot","Nord Warriors",tf_hero|tf_unmoveable_in_party_window, 0, reserved, fac_commoners,[itm_khergit_armor,itm_nomad_boots,itm_knife],
str_8|agi_7|int_12|cha_7|level(3),wp(60),knows_tracker_npc|
knows_ironflesh_1|knows_power_strike_1|knows_pathfinding_3|knows_athletics_2|knows_tracking_1|knows_riding_2, #skills 2/3 player at that level
0x00000004bf086143259d061a9046e23500000000001db52c0000000000000000],
["hero10","Rodhok Patriot","Rodhok Warriors",tf_hero|tf_unmoveable_in_party_window, 0, reserved, fac_commoners,[itm_khergit_armor,itm_nomad_boots,itm_knife],
str_8|agi_7|int_12|cha_7|level(3),wp(60),knows_tracker_npc|
knows_ironflesh_1|knows_power_strike_1|knows_pathfinding_3|knows_athletics_2|knows_tracking_1|knows_riding_2, #skills 2/3 player at that level
0x00000004bf086143259d061a9046e23500000000001db52c0000000000000000],
###########################################################################
#Seneschals
hero2 and hero7 are vaegir faces, etc.
Define new constants on module_constants.py :
Code:
additional_heroes_begin = "trp_hero1"
additional_heroes_end = "trp_town_1_seneschal"
module_scripts.py's change :
Add these lines on "game_start" script :
Code:
("game_start",
[
##################################################################
(troop_set_slot,"trp_hero1", slot_troop_occupation, "trp_swadian_knight"), # Hero1's occupation before upgraded is Swadian Knight
(troop_set_slot,"trp_hero2", slot_troop_occupation, "trp_vaegir_knight"),
(troop_set_slot,"trp_hero3", slot_troop_occupation, "trp_khergit_lancer"),
(troop_set_slot,"trp_hero4", slot_troop_occupation, "trp_nord_champion"),
(troop_set_slot,"trp_hero5", slot_troop_occupation, "trp_rhodok_sergeant"),
(troop_set_slot,"trp_hero6", slot_troop_occupation, "trp_swadian_knight"),
(troop_set_slot,"trp_hero7", slot_troop_occupation, "trp_vaegir_knight"),
(troop_set_slot,"trp_hero8", slot_troop_occupation, "trp_khergit_lancer"),
(troop_set_slot,"trp_hero9", slot_troop_occupation, "trp_nord_champion"),
(troop_set_slot,"trp_hero10", slot_troop_occupation, "trp_rhodok_sergeant"),
(assign, "$g_upgrade_time", 336), # 2 weeks for 1st upgrade call
##################################################################
## TEST ONLY : COMMENT for farther use
(assign, "$g_upgrade_time", 10), # 24 hours for 1st call
(party_add_members,"p_main_party","trp_swadian_knight",2),
(party_add_members,"p_main_party","trp_vaegir_knight",2),
(party_add_members,"p_main_party","trp_khergit_lancer",2),
(party_add_members,"p_main_party","trp_nord_champion",2),
(party_add_members,"p_main_party","trp_rhodok_sergeant",2),
(add_xp_to_troop, 100000, "trp_player"),
##################################################################
Main Script, I make it slimmer, taking away all checking removing the cf(can fail), assumed that this script only called from our menu.
Put before last ]
Code:
# ##script_upgrade_troop_to_hero
# ##usage : (call_script,"script_upgrade_troop_to_hero",<troop_ID>,<hero_ID>),
# ##Input 1 : <troop_ID> should be one of troop_id of top tier troop
# ##Input 2 : <hero_ID> should be one of troop_id of inactive hero on module_troops.py
# ##This must be passed. The code block calling this script should have already checked if there is that troop.
# ##Output: None, will adjust p_main_party
# ##May call a dialog to communicate this happening
("upgrade_troop_to_hero",
[(store_script_param,":troop_id",1),
(store_script_param,":hero_id",2),
(try_begin),
(main_party_has_troop, ":troop_id"),
(troop_slot_eq, ":hero_id", slot_troop_occupation, ":troop_id"),
(troop_set_slot,":hero_id", slot_troop_occupation, slto_player_companion),
(party_remove_members,"p_main_party",":troop_id",1), # ##remove the regular troop
(party_add_members,"p_main_party",":hero_id",1), # ##Add the hero found
(try_end),
]),
The Menu, called by trigger
on module_game_menus.py, before last ] :
Code:
###########################################################################
("upgrade_to_hero",0,
"You notice that one or more of your warriors exceeds your expectations in battle. ^You walk towards the lines of your troops, and ...",
"none",
[
(assign, reg11, 0), # sub menu 1
(assign, reg12, 0), # sub menu 2
(assign, reg13, 0), # sub menu 3
(assign, reg14, 0), # sub menu 4
(assign, "$g_upgrade_talk", 0),
],
[
("hero_1",
[
(assign, ":limit", reg10),
(assign, ":found", 0),
(try_for_range, ":hero_id", ":limit", additional_heroes_end),
(eq, ":found", 0),
(troop_get_slot, ":hero_ocu", ":hero_id", slot_troop_occupation),
(gt, ":hero_ocu", 0),
(neq, ":hero_ocu",slto_kingdom_hero),
(neq, ":hero_ocu",slto_player_companion),
(main_party_has_troop, ":hero_ocu"),
(assign, ":found", 1),
(assign, reg11, ":hero_id"),
(try_end),
(eq, ":found", 1),
(str_store_troop_name,s1,reg11),
],"stop to talk to {s1}",
[
(assign, ":hero_id", reg11),
(troop_get_slot, ":troop_id", ":hero_id", slot_troop_occupation),
(assign, reg20, ":troop_id"),
(assign, reg21, ":hero_id"),
(assign, "$g_upgrade_talk", 1),
(start_map_conversation, ":troop_id"),
(change_screen_return),
]
),
("hero_2",
[
(ge, reg11, reg10),
(store_add, ":limit", reg11, 1),
(assign, ":found", 0),
(try_for_range, ":hero_id", ":limit", additional_heroes_end),
(eq, ":found", 0),
(troop_get_slot, ":hero_ocu", ":hero_id", slot_troop_occupation),
(gt, ":hero_ocu", 0),
(neq, ":hero_ocu",slto_kingdom_hero),
(neq, ":hero_ocu",slto_player_companion),
(main_party_has_troop, ":hero_ocu"),
(assign, ":found", 1),
(assign, reg12, ":hero_id"),
(try_end),
(eq, ":found", 1),
(str_store_troop_name,s1,reg12),
],"stop to talk to {s1}",
[
(assign, ":hero_id", reg12),
(troop_get_slot, ":troop_id", ":hero_id", slot_troop_occupation),
(assign, reg20, ":troop_id"),
(assign, reg21, ":hero_id"),
(assign, "$g_upgrade_talk", 1),
(start_map_conversation, ":troop_id"),
(change_screen_return),
]
),
("hero_3",
[
(gt, reg12, reg11),
(store_add, ":limit", reg12, 1),
(assign, ":found", 0),
(try_for_range, ":hero_id", ":limit", additional_heroes_end),
(eq, ":found", 0),
(troop_get_slot, ":hero_ocu", ":hero_id", slot_troop_occupation),
(gt, ":hero_ocu", 0),
(neq, ":hero_ocu",slto_kingdom_hero),
(neq, ":hero_ocu",slto_player_companion),
(main_party_has_troop, ":hero_ocu"),
(assign, ":found", 1),
(assign, reg13, ":hero_id"),
(try_end),
(eq, ":found", 1),
(str_store_troop_name,s1,reg13),
],"stop to talk to {s1}",
[
(assign, ":hero_id", reg13),
(troop_get_slot, ":troop_id", ":hero_id", slot_troop_occupation),
(assign, reg20, ":troop_id"),
(assign, reg21, ":hero_id"),
(assign, "$g_upgrade_talk", 1),
(start_map_conversation, ":troop_id"),
(change_screen_return),
]
),
("hero_4",
[
(gt, reg13, reg12),
(store_add, ":limit", reg13, 1),
(assign, ":found", 0),
(try_for_range, ":hero_id", ":limit", additional_heroes_end),
(eq, ":found", 0),
(troop_get_slot, ":hero_ocu", ":hero_id", slot_troop_occupation),
(gt, ":hero_ocu", 0),
(neq, ":hero_ocu",slto_kingdom_hero),
(neq, ":hero_ocu",slto_player_companion),
(main_party_has_troop, ":hero_ocu"),
(assign, ":found", 1),
(assign, reg14, ":hero_id"),
(try_end),
(eq, ":found", 1),
(str_store_troop_name,s1,reg14),
],"stop to talk to {s1}",
[
(assign, ":hero_id", reg14),
(troop_get_slot, ":troop_id", ":hero_id", slot_troop_occupation),
(assign, reg20, ":troop_id"),
(assign, reg21, ":hero_id"),
(assign, "$g_upgrade_talk", 1),
(start_map_conversation, ":troop_id"),
(change_screen_return),
]
),
("prev",
[
(gt, reg10, additional_heroes_begin),
(assign, ":limit", reg10),
(assign, ":found", 0),
(try_for_range_backwards, ":hero_id", ":limit", additional_heroes_begin),
(lt, ":found", 4),
(troop_get_slot, ":hero_ocu", ":hero_id", slot_troop_occupation),
(gt, ":hero_ocu", 0),
(neq, ":hero_ocu",slto_kingdom_hero),
(neq, ":hero_ocu",slto_player_companion),
(main_party_has_troop, ":hero_ocu"),
(assign, reg15, ":hero_id"),
(val_add, ":found", 1),
(try_end),
(gt, ":found", 0),
],"go to the previous lines",
[
(assign, reg10, reg15),
(jump_to_menu, "mnu_upgrade_to_hero"),
]
),
("next",
[
(gt, reg14, reg13),
(store_add, ":limit", reg14, 1),
(assign, ":found", 0),
(try_for_range, ":hero_id", ":limit", additional_heroes_end),
(eq, ":found", 0),
(troop_get_slot, ":hero_ocu", ":hero_id", slot_troop_occupation),
(gt, ":hero_ocu", 0),
(neq, ":hero_ocu",slto_kingdom_hero),
(neq, ":hero_ocu",slto_player_companion),
(main_party_has_troop, ":hero_ocu"),
(assign, ":found", 1),
(try_end),
(eq, ":found", 1),
],"go to the next lines",
[
(store_add, reg10, reg14, 1),
(jump_to_menu, "mnu_upgrade_to_hero"),
]
),
("close",
[
],"close",
[
(assign, "$g_upgrade_talk", 1),
(change_screen_map),
]
),
]
),
###########################################################################
Here you are your dialogs. Put it under dialog = [ on module_dialogs.py. I'm not sure about the initial state. Is it "start" or "event_triggered", I'll test it when I have module_system.
Code:
dialogs = [
###########################################################################
[anyone,
"event_triggered",
[
(store_conversation_troop,"$g_talk_troop"),
#(is_between,"$g_talk_troop", additional_heroes_begin, additional_heroes_end),
(eq, "$g_talk_troop", reg20),
(eq, "$g_upgrade_talk", 1),
(troop_get_type, reg65, "trp_player"),
(str_store_string,s65,"@{reg65?my Lady:my Lord}"),
(str_store_troop_name,s21,reg21),
],
"Yes, {s65}?",
"upgrade_talk",
[]
],
[anyone|plyr,
"upgrade_talk",
[],
"I have seen you fight well in battles, soldier.",
"upgrade_talk_1",
[]
],
[anyone,
"upgrade_talk_1",
[
],
"I only do my duty to {s65}, sire.",
"upgrade_talk_2",
[]
],
[anyone|plyr,
"upgrade_talk_2",
[],
"And well, too. The only time I've heard someone with such skills in battle, it has been in sagas. You are a hero!",
"upgrade_talk_3a",
[]
],
[anyone|plyr,
"upgrade_talk_2",
[],
"I just wanted you to know that I take notice in such skills in battle. Now fall back in line!",
"upgrade_talk_3b",
[]
],
[anyone,
"upgrade_talk_3a",
[
],
"You honour me with your words. I will do my utter best to honour them.",
"upgrade_talk_4a",
[]
],
[anyone|plyr,
"upgrade_talk_4a",
[],
"From now on you shall be remembered as a {s21}",
"upgrade_talk_5",
[]
],
[anyone,
"upgrade_talk_5",
[
(call_script,"script_upgrade_troop_to_hero", reg20, reg21),
],
"I will defend my new title to my death, and I will not let you down. I promise you this; The blood on my steel will never dry!",
"close_window",
[]
],
[anyone,
"upgrade_talk_3b",
[
],
"Yes, {s65}",
"close_window",
[]
],
###########################################################################
Ok,I follow your way, I make it called by timed trigger, but I make the interval is not fixed 14 days, but random 14-21 days.
Then, optional from me, I think it will be more balanced if we put more limitation, only player reached 15 level can recruit new hero
on module_simple_triggers.py :
Code:
(24,
[
#################################################################
## LEVEL CHECK BEGIN
## Comment to disable LEVEL CHECK
(store_character_level, ":level", "trp_player"),
(ge, ":level", 15),
## LEVEL CHECK END
#################################################################
(store_current_hours,":now"),
(ge, ":now", "$g_upgrade_time"),
(store_random_in_range, ":rand", 14, 22), ## Next Call 14 - 21 days ahead
(val_mul, ":rand", 24),
(val_add, ":rand", ":now"),
(assign, "$g_upgrade_time"),
(assign, reg10, additional_heroes_begin),
(jump_to_menu, "mnu_upgrade_to_hero"),
]),
Admin note:
Following thread builds up on this OSP code and might be interesting for some:
Last edited by a moderator: