Search results for query: *

  1. xenoargh

    Can These Things Be Fixed? <Long>

    I really like what you're doing here. Just wanted to wish you the best of luck and hope to give you some encouragement to continue. You recording your process here in the thread is a treat to read.

    While I've fallen off the series after the state Bannerlord released in, I do miss this community sometimes. Discord feels too ephemeral for me.
    I'm glad you've enjoyed reading this stuff, lol.

    Meanwhile, I'm like, IDK... halfway through troop updates, or so. Been very busy IRL this last couple of weeks, so progress has been slower than I like. I want to get Narf's other plate armor rigged for males this week if I can, too.
  2. xenoargh

    Any way to mod how AI chooses melee weapons?

    The source for all that ships with Blood and Steel, and that's all Open Source, so far as I'm concerned. The key function is in module_scripts, called via a Mission trigger, but there are bits of ancillary code dealing with situations. Here's the core script, though:

    Python:
    #TROOP EQUIPMENT SYSTEM
    #input:  agent id
    ("cf_troop_equipment_system",[
        (this_or_next|multiplayer_is_server),
        (neg|game_in_multiplayer_mode), 
        #(display_message, "@Running equipment script"),#DEBUG
        (store_trigger_param_1, ":agent_no"),
        
        (assign, ":stop", 0),   
        (agent_is_human, ":agent_no"),
        (agent_is_active, ":agent_no"),
        (agent_is_alive, ":agent_no"),
        (neq, ":agent_no", 0),
        (agent_get_troop_id, ":id", ":agent_no"),
            
        #MERCHANT FIXES   
        (try_begin),
            (this_or_next|is_between, ":id", armor_merchants_begin, armor_merchants_end),
            (this_or_next|is_between, ":id", weapon_merchants_begin, weapon_merchants_end),
            (this_or_next|is_between, ":id", goods_merchants_begin, goods_merchants_end),
            (this_or_next|eq, ":id", "trp_tavern_bookseller_1"),
            (this_or_next|eq, ":id", "trp_tavern_bookseller_2"),
            (is_between, ":id", horse_merchants_begin, horse_merchants_end),
            #(display_message, "@Merchant found, equipping him/her"),
            
            #Remove the gloves
            (agent_get_item_slot, ":gloves", ":agent_no", 7),#Get the gloves
            (try_begin),
                (gt, ":gloves", 0),
                (agent_unequip_item, ":agent_no", ":gloves"),
            (try_end),   
            #Remove the hats
            (agent_get_item_slot, ":hat", ":agent_no", 4),#Get the hats
            (try_begin),
                (gt, ":hat", 0),
                (agent_unequip_item, ":agent_no", ":hat"),
            (try_end),           
            
            (try_begin),
                (troop_get_type, ":cur_troop_gender", ":id"),
                (eq, ":cur_troop_gender", 0),
                (store_random_in_range, ":clothes", "itm_tunic_with_green_cape","itm_female_civ_clothes_start"),
                (store_random_in_range, ":shoes", "itm_ankle_boots", "itm_narf_bear_paw_shoes"),
                (agent_equip_item, ":agent_no", ":shoes"),
                (agent_equip_item, ":agent_no", ":clothes"),
            (else_try),
                (store_random_in_range, ":clothes", "itm_red_dress", "itm_female_civ_clothes_end"),
                (store_random_in_range, ":shoes", "itm_ankle_boots", "itm_narf_bear_paw_shoes"),
                (agent_equip_item, ":agent_no", ":shoes"),               
                (agent_equip_item, ":agent_no", ":clothes"),
            (try_end),
        (try_end),
        
        #CARAVAN MASTER
        (try_begin),
            (eq, ":id", "trp_caravan_master"),
            (agent_equip_item, ":agent_no", "itm_coat_of_plates_red"),
            (agent_equip_item, ":agent_no", "itm_steel_shield"),
            (agent_equip_item, ":agent_no", "itm_scale_gauntlets"),
            (agent_equip_item, ":agent_no", "itm_iron_greaves"),
            (agent_equip_item, ":agent_no", "itm_segmented_helmet"),
            (agent_equip_item, ":agent_no", "itm_winged_mace"),
        (try_end),   
        
        #Adjust the speeds of all Agents.
        (troop_get_slot, ":speed_mult", ":id", slot_troop_speed_mult),
        #(assign, reg0, ":speed_mult"),
        #(display_message, "@Speed Mult: {reg0}"),
        (agent_set_speed_modifier, ":agent_no", ":speed_mult"),
        (agent_set_speed_limit, ":agent_no", 35),
        
        #Speed up the player.
        (try_begin),
            (eq, ":id", "trp_player"),
            #Special speed boost for Barbarians.
            (troop_get_slot, ":char_class", "trp_player", slot_troop_character_class),
            (try_begin),
                (eq, ":id", "trp_player"),#It's the player
                (eq, ":char_class", 3),#Player is a Barbarian
                (agent_set_speed_modifier, ":agent_no", 200),#Really fast!
            (else_try),   
                (agent_set_speed_modifier, ":agent_no", 150),
            (try_end),
        (try_end),   
        
        #Gets rid of duplicate / extra weapons
        (try_begin),
            (neg|troop_is_hero, ":id"),
            (agent_get_wielded_item, ":wielded_item", ":agent_no", 0),
            (assign, ":got_weapon", 0),
            (assign, ":weapon_slot", 0),
            (is_between, ":wielded_item", "itm_weapons_start", "itm_missile_weapons_start"),#Agent is wielding a hand weapon at this time
            (try_for_range, ":i", 0, 4),#Search the item slots 0-3
                (agent_get_item_slot, ":item_id", ":agent_no", ":i"),
                (is_between, ":item_id", "itm_weapons_start", "itm_missile_weapons_start"),#hand weapon
                (assign, ":got_weapon", 1),
                (assign, ":weapon_slot", ":i"),
            (try_end),
    
            (try_for_range, ":i", 0, 4),#Search the item slots 0-3
                (eq, ":got_weapon", 1),
                (agent_get_item_slot, ":item_id", ":agent_no", ":i"),
                (is_between, ":item_id", "itm_weapons_start", "itm_missile_weapons_start"),#hand weapon
                (neq, ":weapon_slot", ":i"),
                (agent_unequip_item, ":agent_no", ":item_id", ":i"),#ditch it
            (try_end),       
        (try_end),
        
        #Gets rid of double shields.
        (try_begin),
            (neg|troop_is_hero, ":id"),
            (agent_get_wielded_item, ":wielded_item", ":agent_no", 1),#Shields
            (is_between, ":wielded_item", "itm_shields_start", "itm_shields_end"),#shield
            (assign, ":got_shield", 0),
            (assign, ":shield_slot", 0),
            (try_for_range, ":i", 0, 4),#Search the item slots 0-3
                (agent_get_item_slot, ":item_id", ":agent_no", ":i"),
                (is_between, ":item_id", "itm_shields_start", "itm_shields_end"),#shield
                (assign, ":got_shield",1),
                (assign, ":shield_slot",":i"),
            (try_end),
            (try_for_range, ":i", 0, 4),#Search the item slots 0-3
                (eq, ":got_shield",1),
                (agent_get_item_slot, ":item_id", ":agent_no", ":i"),
                (is_between, ":item_id", "itm_shields_start", "itm_shields_end"),#shield
                (neq, ":shield_slot", ":i"),
                (agent_unequip_item, ":agent_no", ":item_id", ":i"),#ditch it
            (try_end),       
        (try_end),       
    
        #Alephs can't crouch and are really slow
        (try_begin),
            (this_or_next|eq, ":id", "trp_aleph"),
            (eq, ":id", "trp_aleph_non_player"),
            (agent_ai_set_can_crouch, ":agent_no", 0),
        (try_end),
        
        #Remnants can't crouch and are really fast
        (try_begin),
            (eq, ":id", "trp_death_knight_remnant"),
            (agent_ai_set_can_crouch, ":agent_no", 0),
        (try_end),   
        
        #Convert Marnid into the Aleph if player is not driving it and we're not indoors
        (try_begin),
            (eq, "$g_player_drives_aleph", 0),
            (eq, "$g_player_owns_aleph", 1),
            (eq, "$g_can_drive_aleph_here", 1),
            (try_begin),
                (eq, ":id", "trp_npc2"),#Is Marnid
                (agent_get_team, ":team", ":agent_no"),
                (agent_get_position, pos1, ":agent_no"),
                (agent_fade_out, ":agent_no"),
                (set_spawn_position, pos1),
                (spawn_agent, "trp_aleph_non_player"),
                (agent_ai_set_can_crouch, reg0, 0),#disable crouching
                (agent_set_speed_modifier, reg0, 50),#Really slooow!
                (agent_set_team, reg0, ":team"),
            (try_end),
        (try_end),
        
        #EQUIP ALL SPECIAL-CASE TROOPS
        #FEMALE IRREGULARS
        #NOW WIELD BOWS FIRST
        (try_begin),
            (this_or_next|eq, ":id", "trp_mercenary_infantry_woman"),
            (this_or_next|eq, ":id", "trp_mercenary_infantry_woman_sergeant"),
            (this_or_next|eq, ":id", "trp_mercenary_infantry_woman_elite"),
            (eq, ":id", "trp_mercenary_infantry_woman_expert"),       
            (agent_equip_item, ":agent_no", "itm_javelin"),
            (agent_equip_item, ":agent_no", "itm_rogue_bow"),
            (agent_equip_item, ":agent_no", "itm_arrows"),
            (assign, ":tempIII", "itm_lui_inquisitorsword"),
            (val_add, ":tempIII", 1),       
            (store_random_in_range, ":sword", "itm_lui_inquisitiongreatsword", ":tempIII"),
            (agent_equip_item, ":agent_no", ":sword"),
            (assign, ":endme", 0),
            (try_for_range, ":i", 0, 4),#(slots < 10)?
                (eq, ":endme", 0),
                (troop_get_inventory_slot,":item",":id",":i"),
                (eq, ":item", "itm_rogue_bow"),
                (agent_set_wielded_item, ":agent_no", ":item"),
                (assign, ":endme", 1),
            (try_end),
        (try_end),
        
        #BATTLE SISTERS
        #GUARANTEED BWANGAS
        (try_begin),
            (this_or_next|eq, ":id", "trp_mercenary_polearm_woman_recruit"),
            (this_or_next|eq, ":id", "trp_mercenary_polearm_woman_regular"),
            (eq, ":id", "trp_mercenary_polearm_woman_elite"),       
            (agent_equip_item, ":agent_no", "itm_xenoargh_bwanga"),
        (try_end),
        
        #SISTERS OF MERCY
        #GUARANTEED GRENADES
        (try_begin),
            (eq, ":id", "trp_sister_of_mercy"),   
            (agent_equip_item, ":agent_no", "itm_xenoargh_troop_grenade"),
        (try_end),       
        
        #VAEGIR LEGIONNAIRES AND CRUSHERS
        (try_begin),
            (assign, ":tempI", "trp_vaegir_legionnaire_elite"),
            (val_add, ":tempI", 1),   
            (assign, ":tempII", "trp_vaegir_crusher_elite"),
            (val_add, ":tempII", 1),   
            (this_or_next|is_between, ":id", "trp_vaegir_legionnaire_recruit", ":tempI"),
            (this_or_next|is_between, ":id", "trp_vaegir_crusher_recruit", ":tempII"),
            (eq, ":id", "trp_vaegir_praetorian"),
            
            #Give 'em their throwing spears
            (agent_equip_item, ":agent_no", "itm_throwing_spears"),
            (agent_equip_item, ":agent_no", "itm_jarid"),
            
            #Give Legionnaires short-swords and Crushers two-handers
            (try_begin),
                (is_between, ":id", "trp_vaegir_legionnaire_recruit", ":tempI"),
                (assign, ":tempIII", "itm_lui_mercenaryshort"),
                (val_add, ":tempIII", 1),       
                (store_random_in_range, ":sword", "itm_sword_medieval_b_small", ":tempIII"),
                (agent_equip_item, ":agent_no", ":sword"),
                (assign, ":tempIII", "itm_spak_hermitage_shield_3"),
                (val_add, ":tempIII", 1),               
                (store_random_in_range, ":shield", "itm_spak_hermitage_shield_1", ":tempIII"),
                (agent_equip_item, ":agent_no", ":shield"),           
            (else_try),
                (assign, ":tempIII", "itm_lui_roughdaksword"),
                (val_add, ":tempIII", 1),       
                (store_random_in_range, ":sword", "itm_lui_midnight", ":tempIII"),
                (agent_equip_item, ":agent_no", ":sword"),       
            (try_end),
            (assign, ":endme", 0),
            (try_for_range, ":i", 0, 4),#(slots < 10)?
                (eq, ":endme", 0),
                (troop_get_inventory_slot,":item",":id",":i"),
                (eq, ":item", "itm_throwing_spears"),
                (agent_set_wielded_item, ":agent_no", ":item"),
                (assign, ":endme", 1),
            (try_end),
        (try_end),   
        
        #MERC GRENADIERS
        #BIG CHANGES, NO LONGER GET SHIELDS, ALWAYS GET GRENADES IN SECOND SLOT
        #ALWAYS SET TO WIELD ARQUEBUS
        (try_begin),
            (eq, ":id", "trp_mercenary_grenadier"),
            (agent_equip_item, ":agent_no", "itm_arquebus"),
            (agent_equip_item, ":agent_no", "itm_xenoargh_troop_grenade"),
            (agent_equip_item, ":agent_no", "itm_bolts"),
            (agent_equip_item, ":agent_no", "itm_boar_spear"),
            (assign, ":endme", 0),
        (try_end),
        
        #MERC DRAGOON
        #ALWAYS GET GRENADES IN SECOND SLOT AND DRAGONS
        (try_begin),
            (eq, ":id", "trp_mercenary_dragoon"),
            (agent_equip_item, ":agent_no", "itm_dragon"),
            (agent_equip_item, ":agent_no", "itm_xenoargh_troop_grenade"),
            (agent_equip_item, ":agent_no", "itm_bolts"),
            (assign, ":endme", 0),
        (try_end),   
        
        #ROYAL HUNTSMEN
        (try_begin),
            (eq, ":id", "trp_swadian_royal_huntsman"),
            (agent_equip_item, ":agent_no", "itm_long_bow"),
            (agent_equip_item, ":agent_no", "itm_arrows"),
            (agent_equip_item, ":agent_no", "itm_xenoargh_troop_grenade"),
            (assign, ":endme", 0),
            (try_for_range, ":i", 0, 4),#(slots < 10)?
                (eq, ":endme", 0),
                (troop_get_inventory_slot,":item",":id",":i"),
                (eq, ":item", "itm_long_bow"),
                (agent_set_wielded_item, ":agent_no", ":item"),
                (assign, ":endme", 1),
            (try_end),
        (try_end),   
    
        #HERO BATTLE EQUIPMENT
        (try_begin),
            (troop_is_hero,":id"),
            #Swadians
            (try_begin),
                (this_or_next|is_between, ":id", "trp_knight_1_1", "trp_knight_2_1"),
                (eq, ":id", "trp_kingdom_of_swadians_lord"),
                (neq, "$talk_context", tc_court_talk),
                (agent_equip_item, ":agent_no", "itm_narf_gothic_plate"),
                (agent_equip_item, ":agent_no", "itm_spak_warhorse_imperial"),
                (agent_equip_item, ":agent_no", "itm_narf_shynbaulds"),
                (agent_equip_item, ":agent_no", "itm_dejawolf_greathelm1"),
                (agent_equip_item, ":agent_no", "itm_narf_plate_mittens"),
            (try_end),
            #Vaegir
            (try_begin),
                (this_or_next|is_between, ":id", "trp_knight_2_1", "trp_knight_3_1"),
                (eq, ":id", "trp_kingdom_of_vaegirs_lord"),
                (neq, "$talk_context", tc_court_talk),
                (agent_equip_item, ":agent_no", "itm_amade_bronze_plate"),
                (agent_equip_item, ":agent_no", "itm_warhorse_sarranid"),
                (agent_equip_item, ":agent_no", "itm_amade_bronze_greaves"),
                (agent_equip_item, ":agent_no", "itm_amade_bronze_gauntlets"),
                (agent_equip_item, ":agent_no", "itm_amade_bronze_winged_helm"),
            (try_end),
            #Khergits
            (try_begin),
                (this_or_next|is_between, ":id", "trp_knight_3_1", "trp_knight_4_1"),
                (eq, ":id", "trp_kingdom_of_khergits_lord"),
                (neq, "$talk_context", tc_court_talk),
                (agent_equip_item, ":agent_no", "itm_ssh_yoroi"),
                (agent_equip_item, ":agent_no", "itm_warhorse_steppe"),
                (agent_equip_item, ":agent_no", "itm_ssh_suneate"),
                (agent_equip_item, ":agent_no", "itm_ssh_kote"),
                (agent_equip_item, ":agent_no", "itm_ssh_kabuto"),               
            (try_end),
            #Nords
            (try_begin),
                (this_or_next|is_between, ":id", "trp_knight_4_1", "trp_knight_5_1"),
                (eq, ":id", "trp_kingdom_of_nords_lord"),
                (neq, "$talk_context", tc_court_talk),
                (agent_equip_item, ":agent_no", "itm_dejawolf_vikingbyrnie"),
                (agent_equip_item, ":agent_no", "itm_warhorse_chain_barding01"),
                (agent_equip_item, ":agent_no", "itm_splinted_greaves"),
                (agent_equip_item, ":agent_no", "itm_mail_mittens"),
                (agent_equip_item, ":agent_no", "itm_xenoargh_viking_steel_winged_helm02"),               
            (try_end),
            #Rhodoks
            (try_begin),
                (this_or_next|is_between, ":id", "trp_knight_5_1", "trp_knight_6_1"),
                (eq, ":id", "trp_kingdom_of_rhodoks_lord"),
                (neq, "$talk_context", tc_court_talk),
                (agent_equip_item, ":agent_no", "itm_narf_milanese_plate"),
                (agent_equip_item, ":agent_no", "itm_charger_plate"),
                (agent_equip_item, ":agent_no", "itm_narf_steel_greaves"),
                (agent_equip_item, ":agent_no", "itm_gauntlets"),
                (agent_equip_item, ":agent_no", "itm_narf_visored_sallet_coif"),
            (try_end),
            #Sarranids
            (try_begin),
                (this_or_next|is_between, ":id", "trp_knight_6_1", "trp_kingdom_of_swadians_pretender"),
                (eq, ":id", "trp_kingdom_of_sarranids_lord"),
                (neq, "$talk_context", tc_court_talk),
                (agent_equip_item, ":agent_no", "itm_wei_xiadi_sarranid_mamluk_armor"),
                (agent_equip_item, ":agent_no", "itm_warhorse_sarranid"),
                (agent_equip_item, ":agent_no", "itm_sarranid_boots_c"),
                (agent_equip_item, ":agent_no", "itm_narf_wisby_gauntlets_black"),
                (agent_equip_item, ":agent_no", "itm_sarranid_veiled_helmet"),
            (try_end),
            #Death Knights
            (try_begin),
                #(this_or_next|is_between, ":id", "trp_knight_6_1", "trp_kingdom_of_swadians_pretender"),
                (eq, ":id", "trp_death_knights_lord"),
                (neq, "$talk_context", tc_court_talk),
                (agent_equip_item, ":agent_no", "itm_narf_milanese_plate_dark"),
                (agent_equip_item, ":agent_no", "itm_spak_horny_charger_plate"),
                (agent_equip_item, ":agent_no", "itm_narf_steel_greaves_dark"),
                (agent_equip_item, ":agent_no", "itm_narf_wisby_gauntlets_black"),
                (agent_equip_item, ":agent_no", "itm_spak_demon_hood"),
            (try_end),
            #Holy Army
            (try_begin),
                #(this_or_next|is_between, ":id", "trp_knight_6_1", "trp_kingdom_of_swadians_pretender"),
                (eq, ":id", "trp_templars_lord"),
                (neq, "$talk_context", tc_court_talk),
                (agent_equip_item, ":agent_no", "itm_narf_early_transitional_templar"),
                (agent_equip_item, ":agent_no", "itm_warhorse_chain_barding_templar"),
                (agent_equip_item, ":agent_no", "itm_narf_steel_greaves_dark"),
                (agent_equip_item, ":agent_no", "itm_narf_wisby_gauntlets_black"),
                (agent_equip_item, ":agent_no", "itm_narf_sugarloaf_coif_templar"),
            (try_end),       
        (try_end),   
        
        #SPECIAL AMMO SYSTEM
        (try_begin),
            (agent_has_item_equipped, ":agent_no", "itm_xenoargh_rocket_projector"),
            (neg|agent_has_item_equipped, ":agent_no", "itm_universal_cannon_ammo"),
            (agent_unequip_item, ":agent_no", "itm_xenoargh_rocket_projector"),
        (try_end),
    
        (try_begin),
            (agent_has_item_equipped, ":agent_no", "itm_xenoargh_byzantine_flamethrower"),
            (neg|agent_has_item_equipped, ":agent_no", "itm_universal_cannon_ammo"),
            (agent_unequip_item, ":agent_no", "itm_xenoargh_byzantine_flamethrower"),
        (try_end),   
        
        (try_begin),
            (agent_has_item_equipped, ":agent_no", "itm_handgonne"),
            (neg|agent_has_item_equipped, ":agent_no", "itm_universal_cannon_ammo"),
            (agent_unequip_item, ":agent_no", "itm_handgonne"),
        (try_end),       
    
        (try_begin),
            (agent_has_item_equipped, ":agent_no", "itm_aleph_cannon"),
            (neg|agent_has_item_equipped, ":agent_no", "itm_universal_cannon_ammo"),
            (agent_unequip_item, ":agent_no", "itm_aleph_cannon"),
        (try_end),       
    
        (try_begin),#Strip universal cannon ammunition
            (neg|agent_has_item_equipped, ":agent_no", "itm_aleph_cannon"),
            (agent_has_item_equipped, ":agent_no", "itm_universal_cannon_ammo"),
            (agent_unequip_item, ":agent_no", "itm_universal_cannon_ammo"),
            
            #Strip attempts to get around ammo limits.
            (try_begin),
                    (agent_has_item_equipped, ":agent_no", "itm_universal_cannon_ammo"),
                    (agent_unequip_item, ":agent_no", "itm_universal_cannon_ammo"),
            (try_end),
            
            (try_begin),
                    (agent_has_item_equipped, ":agent_no", "itm_universal_cannon_ammo"),
                    (agent_unequip_item, ":agent_no", "itm_universal_cannon_ammo"),
            (try_end),       
            
            (try_begin),
                (eq, ":stop", 0),
                (agent_has_item_equipped, ":agent_no", "itm_handgonne"),
                (agent_equip_item, ":agent_no", "itm_mortar_grenade"),
                (try_begin),
                    (agent_has_item_equipped, ":agent_no", "itm_xenoargh_rocket_projector"),
                    (agent_unequip_item, ":agent_no", "itm_xenoargh_rocket_projector"),
                (try_end),   
                (try_begin),
                    (agent_has_item_equipped, ":agent_no", "itm_xenoargh_byzantine_flamethrower"),
                    (agent_unequip_item, ":agent_no", "itm_xenoargh_byzantine_flamethrower"),
                (try_end),               
                (agent_refill_ammo, ":agent_no"),               
                (assign, ":stop", 1),
            (try_end),   
    
            (try_begin),
                (eq, ":stop", 0),
                (agent_has_item_equipped, ":agent_no", "itm_aleph_cannon"),           
                (assign, ":stop", 1),
            (try_end),           
    
            (try_begin),
                (eq, ":stop", 0),
                (agent_has_item_equipped, ":agent_no", "itm_xenoargh_rocket_projector"),
                (agent_equip_item, ":agent_no", "itm_explosive_rocket_arrows"),       
                (try_begin),
                    (agent_has_item_equipped, ":agent_no", "itm_handgonne"),
                    (agent_unequip_item, ":agent_no", "itm_handgonne"),
                (try_end),       
                (try_begin),
                    (agent_has_item_equipped, ":agent_no", "itm_xenoargh_byzantine_flamethrower"),
                    (agent_unequip_item, ":agent_no", "itm_xenoargh_byzantine_flamethrower"),
                (try_end),           
                (agent_refill_ammo, ":agent_no"),           
                (assign, ":stop", 1),
            (try_end),
    
            (try_begin),
                (eq, ":stop", 0),
                (agent_has_item_equipped, ":agent_no", "itm_xenoargh_byzantine_flamethrower"),
                (agent_equip_item, ":agent_no", "itm_xenoargh_byzantine_flamethrower_fuel"),       
                (try_begin),
                    (agent_has_item_equipped, ":agent_no", "itm_handgonne"),
                    (agent_unequip_item, ":agent_no", "itm_handgonne"),
                (try_end),       
                (try_begin),
                    (agent_has_item_equipped, ":agent_no", "itm_xenoargh_rocket_projector"),
                    (agent_unequip_item, ":agent_no", "itm_xenoargh_rocket_projector"),
                (try_end),           
                (agent_refill_ammo, ":agent_no"),           
                (assign, ":stop", 1),
            (try_end),           
        (try_end),
    ]),
  3. xenoargh

    Suggestion General Various Fixes, Thoughts

    As an example of what I was talking about for armors (being able to exclude wearing of <category>), this suit cannot be implemented properly in the current Bannerlord system at all:

    bl_narf_04.jpg


    1. It uses gloves that aren't Giant Elbow-Length Gloves. They're... just gloves. Or, in this case, gauntlets. They need the "no_slim" tag I mentioned earlier, otherwise they'd trigger the _slim meshes, which were clearly designed for Bannerlord's gloves, but don't work for anything that merely covers the hands.

    2. The armor's not designed for _slim, and will look pretty bad with a _slim mesh and other gloves.

    3. The armor, while it can technically operate with Bannerlord's boots, is really designed for these particular shynbaulds.

    4. The helmet, which is one of the best we ever had from Warband, was designed for "hides_head". I've made it "work" here, as you can see, but I've had to make some artistic compromises I don't like: the neck area had to be made almost absurdly large to avoid clipping with the new body / head meshes and I've had to rig the bottom part of the mesh to the neck bone, which looks less than ideal, but it at least prevents the head mesh from clipping through the geometry.

    5. Obviously, this kind of full suit of body armor, which is designed with explicit, unique pauldrons, cannot possibly be made to work with Bannerlord's pauldron / cape armors properly.

    So, if I had the features I've requested, I'd probably declare the armor as "all_but_head"; the shynbaulds and gloves would be integrated into the suit; the suit would have the "hides_hands" flag enabled (I'm just going to guess here, but I'll bet your code doesn't even check that flag if it's body armor) and the head would use "hides_head" so that it didn't have to make so many compromises to its aesthetics (this might result in it "floating" above Bannerlord-standard armors at the neck join, but that's easier to fix than having to do a rig that makes it flex in inappropriate ways).

    In short, this is, in one suit of armor, why I want much more control over how armors are presented, and I think this would be good for everybody, including you folks, should you choose to develop more content for the game. Armors should be able to hide all body parts, hand armors should be able to both hide hands and not trigger _slim, armors need to be able to exclude other types of body armor being worn. I think that most of these features should be (fairly) trivial, since pretty much all of the code exists (or can be easily re-purposed):

    1. There's already code to exclude Item A if Item B isn't installed (horses and saddles); extending that to not allow certain equipment and uninstall it if an armor with <type exclusion> is installed by the user via the Inventory UI should be straightforward.

    Essentially:

    C#:
      switch(ItemFlag.armor_compatibility){
        "all":
            remove all other armor items by iteration on the Troop's ItemRoster; removes the items that aren't <this armor type> and places them back into the player's inventory
            alert user by marking the other item boxes in red
            break;
        "all_but_helmet"
            remove all non-helmet armor items
            alert user by marking the other item boxes in red
            break;
        
        etc.
            
        default:
    
            do nothing;
    
            break;
    
      }


    2. "hides_head" is just another boolean Item Flag; hiding other parts is already done, so this is just one more binary check (I presume this check's done once, and only once, when the Agent spawns w/ their equipment, rather than every frame during a Mission- even in that case, it's trivial and non-expensive vs. how it works now, where the entire head, eyes, etc. are all being drawn or are depth-tested for culling, etc.). hides_head should, of course, default to false, to preserve current behaviors.

    3. "no_slim" should be pretty straightforward:

    If(ItemFlag.no_slim) --> use mesh mesh_name for males / mesh_name_converted for females. no_slim should default to false, of course, to preserve existing behaviors.
  4. xenoargh

    Can These Things Be Fixed? <Long>

    Banged this out. This is way, way better than I thought it'd be, lol. Yes, the specular on the pants is a bit too high; I'll tune that down later.

    I guess I have to try the Milanese armor now. I don't think I can fully rescue the Transitional Armor; the maille neck will be a real issue. But there is enough stuff in Bannerlord that more-or-less covers that category.

    Full-face helms are another problem; we have wonderful ones that I'm sure I can make look good as individuals, but Bannerlord doesn't have a "hides_head" tag for helmets, so I'm a little stuck there, and any of them that require a super-specific connection to the neckline will present problems.

    The proper gauntlets for this armor are a problem, too; I can probably kludge them in and make it all work, but only the sense that the complete set will look good, visually. They won't get along with any other armors, though.

    bl_narf_03.jpg
  5. xenoargh

    Suggestion General Various Fixes, Thoughts

    For the Model Viewer, I have several feature requests:

    1. Under File or a new menu, "reset camera". Does what it says; the camera's origin, position and orientation are reset to the defaults. Reason: right now, if you ever move the camera around with the middle-mouse button and get the origin moved somewhere odd, you can end up in situations where you literally cannot see what you're working on and can't fix the camera without restarting the entire application (because Model Viewer's state is saved even when you close that window).

    2. The camera in Model Viewer really needs a smoother zoom function. Middle-mouse scrolling is incredibly jumpy and it often makes it difficult to do screen-captures, etc.

    Suggestion: keep middle-mouse wheel behavior as present, for rough adjustments, and right-click + LSHIFT for a very smooth, slow movement of the camera forwards and backwards. It'd be helpful if there was a similar function for panning, but it's less of an issue than zoom. This probably seems like a minor thing, but I'm sure your own staff has sometimes had trouble setting up a screenshot of a new asset, and had to resort to moving it around with Translate / Rotate, rather than use the camera controls.
  6. xenoargh

    Can These Things Be Fixed? <Long>

    Well, I'll be darned, it actually worked.

    When I posted the above, I thought I had it done and could just move on to the shynbaulds. Nope. Got them in, looked at stuff, and I'm like, "er, what on earth is going on w/ the knees", lol.

    The knees... they're going to haunt my dreams. Narf expected that the verts would be just so in relation to the knee joint position, and guess what, it's not where it used to be, lol. Working around that was fun, and it still clips slightly, but it's probably invisible to Average Joe Gamer during normal gameplay. The pauldrons were also fun, but in a totally expected way.

    Also! I finally figured out what that extra arm bone (between the elbow and shoulder) is for. It's been a mystery and I've largely ignored it. It's for elbow armors, so that they (largely) go where they should. The results here still clip a bit, but it's not bad, considering Narf wasn't rigging for that at all.

    bl_narf_02.jpg
  7. xenoargh

    Can These Things Be Fixed? <Long>

    Ima just leaving this here. For you know, reasons.
    bl_narf_01.jpg
  8. xenoargh

    Can These Things Be Fixed? <Long>

    "I'm from the Empire. We're here to 'help'."

    Anyhow, that's a wrap on Amade's stuff; now I just need to integrate them with the game, etc. I think the main takeaway from this is that I'll want to pick my battles about what to try porting next; not everything will work out this nicely.
    bl_amade_armor03.jpg
  9. xenoargh

    Suggestion General Various Fixes, Thoughts

    Can you check whether the vsync is enabled in the config?
    VSync is now enabled and I've verified that it works in the Modding Toolkit.

    That really helps keep things cool and stable, in general, but in the Modding Toolkit, it's exceptionally important, because the CPU / GPU load is often so low that the GPU may be rendering hundreds of frames a second otherwise, which isn't good for it, lol. Honestly, in Modding Toolkit we simply shouldn't need FPS higher than 60, imo.

    We will bring this up internally.

    Thanks. These are all just minor things that would help modders shape the way gear equips work. In general, to have a system that's flexible and transparent for players, it's easier to exclude gear that's not desired by the artist.

    But! Perhaps, instead of the idea of "no_pauldron", there should be an ItemFlag:

    armor_incompatibilty = <string type enum>

    Values would be "all", "all_but_helmet", "pauldron", "boots", "gloves".


    This would cover 99% of use cases. In the vast majority of cases, "all_but_helmet" would give artists pretty complete freedom w/ body armors. For really extreme armors (say, somebody wants to put Batman's armor into the game) "all" would allow that.

    But they could also, for example, have armor with built-in gloves, but have armor_incompatibility="gloves" and hides_hands="true".

    So, the concept of "armor that can exclude other armor types from being worn" would be very useful for artists. As things stand, I'll just have to tell players that if they wear certain armors, that they'll look absolutely terrible w/ pauldrons and gloves, or are meant to be paired with <helmet>, but it can't be helped.

    I still want an ItemFlag for "hides head" like we had in Warband, too. A full-face helmet that completely encloses the head and neck shouldn't need to be designed around the head / neck mesh being present and possibly clipping.
  10. xenoargh

    Can These Things Be Fixed? <Long>

    Man, these old armors are so old and stuff. They'll never look good in Banner-

    bl_amade_armor01.jpg


    On a more serious note... of course I had to start with the hardest male armor I've got. Seriously, I don't think Narf's stuff will be worse. I feel kind of dumb, honestly; I should've started with one of mine. At least this was easier than Dthehun's stuff...

    Amade's armors were pretty delicate in Warband; the rigging's not typical, etc. But now I've crossed the Rubicon... largely by leveraging all the hard lessons from the female ones. I"ve already built a maille "bodysuit" that I can use wherever I want to avoid seam issues (you can't see it here, but there's a little bit of it in this armor at the knees; Warband armor legs end considerably higher up than Bannerlord's do, so I've built that to make sure there's no seam with the existing boots).

    The biggest issue w/ these is that the neck / shoulder area is massively different from Warband. Every armor's going to need its neckline area raised considerably to avoid issues with the necks. I got lucky with this one on a few places; armors with maille in that area are probably a no-go without a repaint.

    bl_amade_armor02.jpg

    Seriously, if you're trying to model armors for BL, you need to build one of these things (a quick, rough version of the base mesh w/ some nice dark texture at the border areas, preferably w/ some neutral armor-ish material elsewhere) first; it saves sooooo much time. I could've probably cut Amade's armor into a few bits and replaced the maille / leather with this, using booleans... and it would've cut my rigging time in half).
  11. xenoargh

    Crash when using SetScriptedPositionAndDirection with non-human agents

    Hmm. So at least they can arrive at <position>?

    Can you give them a facing order (what happens when player uses F7 in the Order UI) when they reach there, maybe?

    So far as I know, the Support Forum's it. Maybe there's a bug-report system somewhere, but IDK.
  12. xenoargh

    Can These Things Be Fixed? <Long>

    Overall, it's a bit frustrating when these limits are turned off. Lord armies are, just like Warband, completely divorced from the "real economy" of the game. Ever notice that Lords only have about 5K in cash, every time you meet them? Yeah... they don't actually have any relationship with the in-game economy like the player does. They still magic up armies.

    But apparently just giving them more headroom isn't enough; I think they're forced to at least pretend to be like players and sit on Villages until they hit their current size goals; when "killed" the goal can reset. I think I'll change my tune when enough of them have gotten "killed" and come back from the dead, though; I'm starting to see 250+ sized Empire armies.

    The only thing that's obviously and immediately affected is, strangely, Caravans. It was kind of amusing seeing 1000+ Caravans running around w/ total immunity to 500+ Bandit parties, lol. I'll have to look at that; something very random's happening there.
  13. xenoargh

    Suggestion General Various Fixes, Thoughts

    Using reflection via Harmony on DefaultPartyWageModel.GetCharacterWage(CharacterObject character) can cause an engine crash, due to an object not being properly locked before access in multithreading code. The code that crashes appears to be used by the Lords to determine what Troops in their Party may be upgraded; it does something really odd where it hits a div-by-zero, presumably because something's very briefly not returning the correct state while Harmony is accessing the variable.

    C#:
        internal class fixWagesOfTroops
        {
            [HarmonyPatch(typeof(DefaultPartyWageModel))]
            [HarmonyPatch("GetCharacterWage")]
            private class newGetCharacterWage
            {
                private static void Postfix(ref CharacterObject character, ref int __result)
                {
    
                    if (character != null)
                    {
    
                        if (character.IsHero && !character.IsPlayerCharacter)
                        {
                            __result = character.Level;
                        } else
                        {
                            //CAN CRASH
                            switch(character.Level){
    
                            }
                            //THIS CODE CAN RUN WITHOUT CRASHES (THUS FAR)
                            if (character.IsRanged)
                            {
                                __result = Math.Max(3,(__result * 3) / 2);
                            } else
                            {
                                __result = Math.Max(3, character.Level / 2);
                            }
                            
                            //Allows "elite pricing" for high-level Troops.
                            if (character.Tier > 6)
                            {
                                __result *= 2;
                            }
                            //Bumps/nerfs for whether the troop is mounted or is a Bandit scrub.
                            if (character.IsMounted) { __result *= 2; }
                            if (character.Occupation.Equals(Occupation.Bandit)) { __result /= 2; }
                        }
                    }
                }
            }
        }
  14. xenoargh

    Crash when using SetScriptedPositionAndDirection with non-human agents

    Hmm. Sounds like when the Agent reaches the required location, it's doing a conventional state-check (as if it's human) and a Horse probably fails bc something is returning null. That should be reported as an engine bug affecting modding; code like that should always be safe to use on an Agent, imo.

    Meanwhile, there's perhaps a way to get around it; maybe when the Agent's near <destination> it should have its state and flags explicitly set, or perhaps they can be set in advance. Well, providing that af_can_wield_weapon returns false if Agent != human...

    Maybe try when the Agent's < 3 meters from <destination> setting the order state to null? The problem w/ this workaround is that you'd need to space out doing the vector calcs across Agents (or explicitly multithread this) to keep performance tidy. Horses move quickly enough that the distance to check would have to be kept quite high to be 100% safe, too.
  15. xenoargh

    Can These Things Be Fixed? <Long>

    Did some testing last night, to see what happens when you join an existing empire as a vassal. The sophistication of the simulation battles is pretty lousy.

    More importantly, here's code for doing basic manipulation of the army sizes (to allow large forces ala Blood and Steel), effectively getting rid of Prisoner Limit (because that's a boring mechanic) and... altering troop wages.


    C#:
    internal class fixPartyLimit
        {
            [HarmonyPatch(typeof(DefaultPartySizeLimitModel))]
            [HarmonyPatch("GetPartyMemberSizeLimit")]
            private class newGetPartyMemberSizeLimit
            {
                private static void Postfix(ref ExplainedNumber __result)
                {
                    __result.Add(999);
                }
            }
        }
    
    
        internal class fixPrisonerLimit
        {
            [HarmonyPatch(typeof(DefaultPartySizeLimitModel))]
            [HarmonyPatch("GetPartyPrisonerSizeLimit")]
            private class newGetPartyPrisonerSizeLimit
            {
                private static void Postfix(ref ExplainedNumber __result)
                {
                    __result.Add(999);
                }
            }
        }

    This one requires a special note. It appears that while this function is being called, Taleworlds is also calling other stuff that's multithreaded, needs access to the Character object, and doesn't lock it!!!

    I've gotten it working here, on this hardware; it can now differentiate between Cavalry, Archers, Archer-Cav and Bandits. Just be careful and test things a lot before trying a variation on this. The code I wrote that crashed before used a switch.

    C#:
        internal class fixWagesOfTroops
        {
            [HarmonyPatch(typeof(DefaultPartyWageModel))]
            [HarmonyPatch("GetCharacterWage")]
            private class newGetCharacterWage
            {
                private static void Postfix(ref CharacterObject character, ref int __result)
                {
    
                    if (character != null)
                    {
    
                        if (character.IsHero && !character.IsPlayerCharacter)
                        {
                            __result = character.Level;
                        } else
                        {
                            if (character.IsRanged)
                            {
                                __result = Math.Max(3,(__result * 3) / 2);
                            } else
                            {
                                __result = Math.Max(3, character.Level / 2);
                            }
                            
                            //Allows "elite pricing" for high-level Troops.
                            if (character.Tier > 6)
                            {
                                __result *= 2;
                            }
                            //Bumps/nerfs for whether the troop is mounted or is a Bandit scrub.
                            if (character.IsMounted) { __result *= 2; }
                            if (character.Occupation.Equals(Occupation.Bandit)) { __result /= 2; }
                        }
                    }
                }
            }
        }
  16. xenoargh

    Can These Things Be Fixed? <Long>

    OK. Empire is sorted out. In the end, I did a lot of testing this week and I think I'm happy with them. I think my biggest complaint with Empire turns out to be the lack of variety of helmet designs. Despite looking like they have a lot of variety on paper, when you start reviewing the meshes, it turns out that more than half of them are basically just reskins of a base, with very minor variations. Once I've ported more helmets in, I can fix this.

    Basic troops:

    Recruits: starts with spear, shield. The shield gives them 100% better survival rates; I no longer feel like throwing them into combat with Looters is an act of necessary stupidity. Spears give them a teeny chance against early light-cav foes, but they'll still get destroyed by anything scarier than Mountain Bandits.

    1. Legionnaires: heavy infantry, equipped with swords, shields, throwing spears. They're very heavy on the high end, but their damage vs. heavy armor is meh.
    2. Archers: relative lightweights; they're equipped with a spear as their secondary, which makes them interesting despite their relatively-bad stats, armors, and mediocre bows.
    3. Crossbowmen: also relatively light troops; they're equipped with battle-axes and are also mediocre infantry.
    4. Pikemen: Pikes, dussacks and throwing weapons. Fairly decent armor, but no shields.
    5. Halberdiers: very much like the Pikemen; they're equipped almost identically, except for having halberds, which allow for longish-range sweeping cuts. They should be pretty good in siege fights and OK in open-field, since they can stop horses.
    6. Bucellarii: mediocre horse-archers with light bows and arrows. Decent, but not spectacular armor, but they have no horse armor, so they're strictly for harassment or mopping-up.

    Noble Troops:

    Viglas are equipped better out of the box; they're not great, but they're much better than recruits. It made no sense that sons of the nobility show up with civilian-level arms and armor.

    1. Equite tree: more-or-less like it is now, arriving at Cataphracts, who remain very effective tank cav. They don't start quite as light (see: Viglas).
    2. Centurion tree: very heavy infantry on the Legionnaire model, but better stats and hand weapons.
    3. Colossi: powerful high-end infantry with two-handed swords and weak bows. Very good armor, no shields. They're death on legs vs. anything with lighter armors.

    For the Centurions and Colossi, I need to convert some Warband armors; nothing in the game quite fits. For now, they're using what's available.

    Overall... Empire's got a really solid infantry force and a very effective tank-cav. Bucellarii are fine for harrying enemies who've halted but will not generally survive if used in assault roles. Empire's biggest weak spots are that they really don't have much that takes on high-armor foes well and their missile troops aren't super. That said, they feel pretty good and they're still Vaguely Roman with dashes of the Byzantines, so I'm calling it a wrap and moving on to Sturgia.
  17. xenoargh

    Can These Things Be Fixed? <Long>

    OK, I've gotten Pikemen sorted. It appears that:

    A. The Agent AI can't figure out "pike, hand-weapon, shield, thrown", but it can figure out "pike, hand-weapon, thrown".
    B. Having Pikes doing a little more damage made them quite viable in testing.

    Bucelerrii are set up with four ranks. First and third cost a horse. Fourth is not a knight, but is a moderately-durable cav-archer gimped with a fairly weak bow and cutting arrows, but they have cool swords. I think that Empire's bowmen should continue to have the same problem (giving Battania and possibly Sturgia the only bowmen with bodkin arrows at the high end), but I haven't gotten to them.

    Crossbowmen are now in a smoother progression where they start fairly bad and end up second-best vs. Vlandia's, but are going to be slightly-better foot troops.

    All I've got left in the normal-troop tree is whether or not to add halberdiers and any other troop branches. I'm spoilt for choice, with as many weapons as are in the game now. Ironically, I think the biggest problem may be dressing them; there are only so many armors in each tier, and it's so uneven for each faction.

    It's probably time to start figuring out what to do w/ the Vigla tree, to make them more interesting than just another cavalry set. In my head, Empire has a lot of direct competition with Vlandia here; perhaps they get some sort of tank troop with battle-axes as a counter to Vlandian maces; not quite as armored, but better raw DPS, so they're better against a mixed bunch.
  18. xenoargh

    Can These Things Be Fixed? <Long>

    Tried out Imperial pikes for the first time, after setting up the new troop trees, in masses enough to matter. They... well... let's just say I wasn't impressed. I think that pikes have two main problems:

    1. In my case, I gave them thrown weapons. I think this lets them get into trouble with nearby infantry.
    2. Guys with spears and shields are just plain better against most things. They get the pointy-stick bonus and they get a shield. Either I have to make pikes have an extra type of pointy-stick bonus- say, a charging bonus or a guarantee to slaughter horses or something- or they're just having real problems. IRL, pikes did have all these issues and pike formations were elaborate and full of troops with special functions, like "kill those guys crawling under our pikes", etc. But that's a giant stretch for the Bannerlord AI. I just wish they were smart enough to stab at faces and back up from infantry, lol.

    The other long polearms thus far appear to work pretty well in their roles. Glaives, fauchards, polehammers and halberds are all, "swing and stab" polearms, and they're fine.

    IDK whether there's something wrong with my pike data, or that the AI just cannot handle pikes correctly; the guys with them seem OK, but the combat results suggest they're just not connecting properly. I'll try making them two-handed spears instead and see if they work better.

    The new Legionnaires are really feeling great, though. They definitely have that, invincible wall of doom feel you'd expect them to have. Watching them advance and throw their spears is cool, and it dearly makes me wish for the good ol' days, when we could assign troops to 2 or more rank depth. The new automatic system is probably better for newbies, but I want ranks of these guys throwing spears before joining a charge, lol.

    Meanwhile... you know (well, if you've been bored enough to read this thread) that I've already found and restored some "lost content". Guess what? There are a bunch of Roman things that are in the game files; in particular, there are nice models of pilums and spiculum, and a bunch of axes and a bow- that one even has LODs; it was clearly considered to be finished content (heck, it might even have bow morphs). Their specular maps aren't great and the axes aren't textured terribly well (they look like they'd just been roughed out when the artist was told to move on), but otherwise, they look fairly serviceable.

    There's also a rather amazing crab:
    bl_amazing_crab.jpg

    Seriously, hats off to whoever worked this from photo refs. That's an impressive diffuse.

    Who knows what else I'll find, lol.
  19. xenoargh

    Can These Things Be Fixed? <Long>

    OK, now that armors and helmets feel like they're about where they should be, and I've fixed up vendor gold (see code below) I've done some testing. Armor feels good now. It actually feels like... wait for it... armor. A lot flows from that:

    1. Bowmen with bodkin / piercing arrows have a distinct point (pun intended). Cut-type archers plateau but are absolutely devastating against low / no-armor troops.
    2. Troops with Pierce attacks but lower raw DPS work like they should; they're effective against armor.
    3. Spears come into their own, when they're doing enough damage to armored targets that they remain relevant into late-game play.
    4. Cutting polearms can be properly devastating to low-armor horses and troops without feeling OP vs. heavily-armored troops (there is a reason why the halberd, with its piercing spear attack, was a popular weapon in the late Middle Ages, whereas glaives were rarer).
    5. Maces feel like they have a distinctive place; weaker than swords and doing less Pierce than most spears, but faster up close.
    6. Axes and swords have distinct feels. A sword does what one would expect- swing to deal best raw damage, thrust against armor. Axes combine some Cut and Pierce in their strikes, and that feels about right; they're a little slower than swords and they don't get as much Pierce, but they're pretty ubiquitously good up until you're fighting against enemies in plate and maille.
    7. Charging light horse with no armor into heavy infantry = dead cav. Charging knights with heavy horse and couched lances can go either way, but the knights have a real shot at breaking through.
    8. Sea Raiders no longer feel like vendor trash and the best free loot in the game (did anybody here know that they can drop a helmet that's worth $87K, in Native? Well, it happened to me, so it can happen to you, lol). When I get around to putting in the "advanced" version of those guys, showing up in hordes... the player's going to have a good way to learn about how a Lord army might feel.

    it's time to talk seriously about troop trees, and how they relate to the desired game design.

    In Warband, troops could have between zero and two choices for upgrade paths; presumably there were mods that added more via UI mods, but I generally kept to this convention and used branches. The old UI made this pretty simple for players to understand, and it wasn't visually clunky.

    Bannerlord doesn't have this problem; the UI is actually better, in the sense that seeing what troops become what is easy now. So far as I've been able to determine, there isn't a real upper limit on how many branches one can make; the problem is more of how cumbersome it becomes for end-users to navigate. The limit there is about 3, I've found; while the main UI showing upgrades is fine, the UI where we actually pick the upgrades requires scrolling at 3, and the scroll-bar isn't visually obvious. Maybe I can fix that?

    The existing troop trees make no sense at all, except from some sort of power-gating perspective. They're hard to read, visually, and aren't kept simple for players; it's hard to even know if a given troop is an upgrade, side-grade or (in some clear cases) a downgrade (for example, despite stats and slightly better equipment, an Imperial Infantryman is clearly less bang-for-buck than an Imperial Recruit in Native; they're both so weak it's ludicrous, but one of them costs a lot more).

    I'm going to fix that. Each major culture's troops will have a straightforward tree. Power levels will be controlled through the simple expedient of gear and stats. Each branch should be viable; there should be a case made for "army of XYZ" or "army of ABC" working just fine, balance-wise; it shouldn't be full of newbie-traps.

    I think one of the themes I see in the existing system is that TaleWorlds wanted to keep cavalry out of reach, at least for a few factions. This is sensible... if cavalry are inherently OP vs. everything else. They shouldn't be. Cavalry, while potent, have some inherent problems, starting with their cost to acquire and upgrade. In combat, they're no longer a panacea; the new damage system more-or-less keeps them reasonable in their interactions with infantry.

    Infantry are harder to get right; they need to have enough protection that they're worth fielding, don't take excessive losses, and due to how the experience system appears to work now, they need to be used often to level up into something that's really dangerous. I'd like to address that issue with how they level up (I don't know why army-wide XP has largely disappeared, but it has, and that's not a good thing, imo, because it hurts infantry above all else) but I have yet to determine how that system works.

    So, let's start with the Empire. They look complicated in the original UI, but really, they just have 5 troop types at present:
    BL_new_troop_trees_approach01.jpg


    There are obvious changes that need to be made, to meet the new goals:

    1. Having four ranks is reasonable. All of them need to have four ranks. The first past Recruit should be OK; the fourth should be worth the effort and costs.

    2. What spots are empty? Is the army missing a major capability? Is that good, for flavor, or is it bad, because they can't compete? Five branches fit in the standard UI; six or more mean the player has to scroll, but there's a scroll-bar system now. What is a good limit? 6 or 7? Or should I just kind of go nuts and offer huge numbers of choices?

    3. Looking at the re-arranged tree, are there some that are obviously weaker than others? How should that get fixed? Archers, for example, should not always be weak in terms of armor, but should be weak in terms of HTH skill and armament, unless they're really, really expensive. Otherwise, why bother having line infantry? This is the general problem with line infantry in the game; like Warband, the case for having them in large numbers doesn't make much sense, except as speed-bumps. There should be factions where infantry really works.

    4. Keeping on-theme for a given culture, what should the player who's trying to optimax generally lean towards, if they've chosen that culture?

    5. Early infantry troops shouldn't be practically naked. This just wasn't done IRL; you only have so many farm-boys to waste, and shields are cheap. A recruit with a spear should beat a Looter, on average. Now, this could be done by merely nerfing Looters even further than they're already nerfed, but I'd rather solve the problem at the root and make them feel reasonably protected.

    6. Something needs to be done about the "suicide infantry multiple times to promote the few survivors" mechanic. It profoundly disturbs me that this is how it's done in Bannerlord at present; I feel like the player's deliberately encouraged to run their armies by walking over a carpet of their own dead. I'll have to look into how XP is distributed and make everybody get 1 XP per kill or something. The current system massively favors the groups that do the most damage, rather than treating participation as a group effort; your infantry can obey their orders, patiently stand in lines in a shield wall, taking arrows for hours, doing their job... and they get zero experience until you run them in and they get kills. It's a silly mechanic.

    Then there's faction themes. I'm mainly writing this for me, but this is da plan.

    1. Aserai:

    Base: medium-tier armors, flexible troops with missile weapons throughout. Decent archers and crossbowmen. Camel-cav durable horse-archers. Probably some specialized infantry types with two-handed Godenak swords and mace-men who are really dangerous to armored troops.

    Nobles: very heavy infantry with shields and thrown weapons. High-speed flexible archer-cav that use throwing weapons and bows. Heavy cavalry with couching lances that are slower but pack a wallop in a charge.

    2. Battania:

    Base: medium-tier armors ranging to heavy. Very strong archers; at the top end, they should be able to do something like Crecy, heh. Mediocre crossbowmen. Strong two-handed weapons (glaives, spears and axes). They should have at least one branch that gives infantry shields.

    Nobles: heavy infantry with bows and two-handed weapons, medium cavalry with bows, spears and swords, moderately-heavy cav, roughly 1066-era Norman knights with throwing spears, fighting spears and swords.

    Battania's one of the trickier existing factions to remodel. Fians are cool, but honestly, the rest of the whole lineup is meh. I think that they should probably be more British than pseudo-Celt, personally, but I like the idea of claymore-armed, kilt-clad idio- er, "glorious volunteers" shouting "freeeeeeedom" as they charge Imperial lines.

    3. Empire:

    Base: heavier-tier armors. Armored and flexible signature Legionnaires, backed up by pikes, halberdiers and spearmen. Mediocre-but-cheap archers; acceptable crossbowmen. Bucelarrii archer-cav as a weak-but-cheap annoyance troop. Empire should have a lot of choices, and a lot of them should be OK; everybody should want to build Legionnaires if playing a themed army, though, imo.

    Nobles: Really Heavy Infantry (Centurions, etc.). Noble heavy cavalry that has best-in class horse armor, but second-or-third-best otherwise, armed with couching lances, shields and hand weapons.

    4. Khuzait:

    Base: Low-tier armors. Cheap, plentiful archer-cav, obviously. But they should plateau and not be great. I want the rest of the base army to be Chinese / Japanese. Swordsmen with shields, lots of polearms, decent bowmen, crossbows (Zhuge Nu needs to show up, for sure). A Khuzait force shouldn't be mono-themed; how to get the tactical AI to employ them without always getting defeated in detail is going to be a bit of a challenge.

    Nobles: elite archer-cav, again obviously- but I'm hoping to rescue SacredStoneHead's Japanese stuff for them. Mongol-style lancers. Some sort of cool / ridiculous infantry unit that does something different; maybe grenadiers make their first trial appearance? Until I figure out how to do custom projectiles, I'm a bit limited in terms of where I can go.

    5. Sturgia:

    Base: Medium-tier armors, but they get them early and almost ubiquitously. No crossbows. Axe, spear and sword- infantry always get thrown weapons; they're mirrors of Aeserai, but with better armor. Reconsider role for stuff like Line-Breakers; axes are more viable now that they do "cleave" type damage, but they have issues w/ AI if given a shield but no one-handed weapon and no-shield troops tend to get slaughtered when up against anybody with bows; maybe they'll just get pretty ridiculous stats for durability or speed, like the Berserkers in Blood and Steel? Should get some sort of horse troop; light shield-and-spear troop. Sturgian armies should feel hard to take down with missiles and resistant to cavalry.

    Nobles: split between one or more pretty-ridiculous damage-dealers / tough infantry types and a medium-heavy cav option with the ringmail barding, which is distinctly "mid". Might bring back the Valkyries.

    6. Vlandia:

    Base: Best armors. Composition should be pretty Generic Medieval: polearms and shields, crossbow, bowmen, perhaps pikes. Vlandian infantry should start weaker than average, then become really, really hard to kill. Their bowmen should be "ok I guess", but their crossbowmen should be really decent. The should have high variety of polearms but their best troops are almost missile-immune tanks with shields, swords and battle axes.

    Nobles: hard-hitting knights with best personal armor, second-best horse armor, lances, shields and hand weapons. Super-ridiculous dismounted knights with swords, battle axes and maces; if I have to import Narf's armors in to justify them, fine, but they should cause dread in anything but maybe the Sturgians (who might be able to out-damage them). Maybe something really special, like a "duelist" class equipped with piercing sword and a crossbow.


    7. Other Thoughts:

    I have no idea what to do with Wheene's stuff. It's all very High Fantasy flavored. I'm inclined to give these things to the Minor Clans; maybe they're the remnants of ancient cultures who still used magic before the Empire banned its practice, or this is a post-apocalyptic setting and they have the remains of Super Tech. Or maybe they just have glowy stuff that's cool-looking as a neat surprise.

    I have no idea whether a return of the Dark Armies is a good idea or not. Thus far it's been sooooo much harder to get going on certain aspects of code, and to do them properly (i.e., have a faction that starts owning nothing, but conquers the map if not confronted) is going to be a lot harder. Making giant armies of Undead show up for players to fight, however, should be fine, and making some huge force that the player can take on as a challenge is also fine.

    I miss the Rhulg Destroyers; they were one of the few things in the "bandit" armies that actually inspired any level of dread. Re-making the Merry Men was relatively easy; if anything, they're more dangerous and truly feel like a mid-tier threat. My "bandit population" system is working really well at keeping the world feeling lively and interesting.

    I have stand-ins for the new bandits that can spawn. They need to get fleshed out.

    Vendor gold is now regulated by this per-frame code (there's something bizarre going on here with TW's code; until I find it and kill it, it has to run very frequently, if shop inventories are going to stay large; thankfully, this is a very cheap thing to run):

    C#:
    foreach (Settlement set in Settlement.All)
    {
        if (set != null && set.IsTown)
        {
            SettlementComponent settlementComponent = set.SettlementComponent;
            if (settlementComponent.Gold < 100000)
            {
                //InformationManager.DisplayMessage(new InformationMessage("Settlement Gold: " + set.Name.ToString() + " " + settlementComponent.Gold, new Color(1f, 0f, 0f)));
                settlementComponent.ChangeGold(100000);
                //InformationManager.DisplayMessage(new InformationMessage("Settlement Gold After: " + settlementComponent.Gold, new Color(1f, 0f, 0f)));
            }
        }
    }
  20. xenoargh

    Can These Things Be Fixed? <Long>

    1. I have no idea about firearms yet. I'll get in touch with the Old Realms folks and see if they're willing to lend me any source code or animation how-to. As things stand, I'm not actually sure how to get a wholly-new animation into the game for characters, how to make sounds / particle FX happen, etc. I'm really kind of dealing with one issue at a time here for now; as it is, I've gotten side-tracked a few times, lol.

    You're probably not aware, but firearms weren't in Blood and Steel originally; I started pretty much like this, with "make Warband feel Fun", and then went from there. I'm not sure just doing an exact clone is really the best idea, either; I'm starting with finding some actual fun, then moving on from there. When the combat starts feeling entertaining and a little over-the-top and I'm done with all of the Majorly Boring Stuff that's actually required to do something largish like this, I'll push out the first release and we'll see.

    2. I realize that this may be a pretty difficult situation in terms of getting serious developer support, but I'll make feature requests and hope they're worked on, someday. A lot of things I asked for for Warband were implemented after I quit, so it's not entirely self-serving. On the rest of what you've said re: staff, etc., IDK and it's hard to say from outside their bubble what the problems are. It may be that, like many games, their contract gave / withheld bonuses based on ratings, etc. or other issues. It's pretty obvious that people are still buying the game, though, so maybe it's not really dead, it's just gradually emerging?

    As for the Beta branch... yeah, it's a little odd that it's stuck in perpetual non-release mode. IDK whether that means a Really Major Feature is involved, and it's not stable, or what. I have avoided having anything to do with it, largely because when I was first starting to mess with things, it was really unstable and crashed on me constantly. When it's finally stable-enough to be released, I'll reevaluate it.

    On the business side, "i.e., can TW make this a success financially" we just can't know.

    I do know that TW's leaving a lot of money on the table. They should have put out some small DLCs by now- a dozen new armors for $5, that kind of thing. Yes, some people will whine... but the hardcore fans will buy it "to support TW"; if 100K buyers show up, fine, TW can now afford 5 new coders in their Turkish offices to straighten out the game's internals and bug-hunt. Given that the engine, unlike Warband, now allows data-injection to add things dynamically without destroying saves... why not?

    Their PR focus, at least on Steam, is almost entirely on MP, rather than SP. That's probably a mistake, and I doubt it's backed up by solid research. SP players have to be massively more common than MP for this game. You'd think they'd get that and push the best SP mods, mod-lists, etc. They had this obsession with Warband, too, and it was always really puzzling to me, when it was obvious that sheer download numbers suggested that SP mods outstripped everything MP by a very large margin.

    3. I can safely tell you that I have zero plans to update Blood and Steel. I'd gotten just about everything that a one-man show could get done, I'd hit the limits of the 32-bit Warband engine, DirectX 9c, etc. and to be really honest, it always had a scope that was well out of reach for one person (there was an Actual Backstory and a Plot, but none of it was ever implemented into gameplay other than vague hints, as I simply did not have the resources to do it any justice).

    Unlike mods building on existing IP, my chances of getting much in the way of an art team were pretty minimal (although I did end up working with a surprising number of artists in the end; a lot of people back then liked that the mod was so open-ended that they could submit pretty much anything halfway-decent and I'd find a home for it, lol).

    The source for everything but the fancy shaders was included with the mod, everything in the mod is explicitly OSP or credit-required-only licensed; I've made that super-clear to people over and over again. Basically, if somebody ambitious wants to extend, fix or revamp it... they're welcome to it and I didn't leave any major show-stoppers, other than Slightly Advanced Stuff in terms of how the code compiled in the very last version (any Python nerd would sneer at that, though; it's not sophisticated). My code's pretty well documented, with copious comments; even a relative newbie could try to extend its features or try to make it finally have a proper ending, etc.
Back
Top Bottom