(
    "village",mnf_enable_hot_keys,
    "{s10} {s12}^{s11}^{s6}{s7}",
    "none",
    [
        (assign, "&current_town", "&g_encountered_party"),
        (call_script, "script_update_center_recon_notes", "&current_town"),

        (assign, "&g_defending_against_siege", 0), #required for bandit check
        (assign, "&g_battle_result", 0),
        (assign, "&qst_collect_taxes_currently_collecting", 0),
        (assign, "&qst_train_peasants_against_bandits_currently_training", 0),

        (try_begin),
          (gt, "&auto_enter_menu_in_center", 0),
          (jump_to_menu, "&auto_enter_menu_in_center"),
          (assign, "&auto_enter_menu_in_center", 0),
        (try_end),

        (try_begin),
          (neq, "&g_player_raiding_village",  "&current_town"),
          (assign, "&g_player_raiding_village", 0),
        (else_try),
          (jump_to_menu, "mnu_village_loot_continue"),
        (try_end),

        (try_begin),#Fix for collecting taxes
          (eq, "&g_town_visit_after_rest", 1),
          (assign, "&g_town_visit_after_rest", 0),
        (try_end),

        (str_store_party_name,s2, "&current_town"),
        (party_get_slot, ":center_lord", "&current_town", slot_town_lord),
        (store_faction_of_party, ":center_faction", "&current_town"),
        (str_store_faction_name,s9,":center_faction"),
        (try_begin),
          (ge, ":center_lord", 0),
          (str_store_troop_name,s8,":center_lord"),
          (str_store_string,s7,"@{s8} of {s9}"),
        (try_end),

        (str_clear, s10),
        (str_clear, s12),

        (try_begin),
          (neg|party_slot_eq, "&current_town", slot_village_state, svs_looted),
          (str_store_string, s60, s2),

          (party_get_slot, ":prosperity", "&current_town", slot_town_prosperity),
		  (try_begin),
			(eq, "&cheat_mode", 1),
			(assign, reg4, ":prosperity",),
			(display_message, "@{!}Prosperity: {reg4}"),
		  (try_end),

		  #(val_add, ":prosperity", 5),
          (store_div, ":str_id", ":prosperity", 10),
		  (val_min, ":str_id", 9),
		  (val_add, ":str_id", "str_village_prosperity_0"),
          (str_store_string, s10, ":str_id"),


          (store_div, ":str_id", ":prosperity", 20),
		  (val_min, ":str_id", 4),
		  (try_begin),
			(is_between, "&current_town", "p_village_91", villages_end),
			(val_add, ":str_id", "str_oasis_village_alt_prosperity_0"),
		  (else_try),
			(val_add, ":str_id", "str_village_alt_prosperity_0"),
		  (try_end),

          (str_store_string, s12, ":str_id"),
        (try_end),

        (str_clear, s11),
        ##diplomacy start+
		(assign, ":save_reg0", reg0),#save variables
		(assign, ":save_reg4", reg4),
		(assign, reg0, 0),
		(assign, reg4, 0),
		(try_begin),#If there's a relation of some kind, write it to s11 (which we'll overwrite below)
			(lt, ":center_lord", 1),
		(else_try),
			#your relative
			(call_script, "script_troop_get_family_relation_to_troop", ":center_lord", "trp_player"),#outputs to s11, reg0, and reg4
			(ge, reg0, 1),#Fall through if this not a relative
		(else_try),
			#your current liege
			(eq, ":center_faction", "&players_kingdom"),
			(is_between, ":center_faction", kingdoms_begin, kingdoms_end),#include fac_player_supporters_faction for claimant quest
			(faction_slot_eq, ":center_faction", slot_faction_leader, ":center_lord"),
			(str_store_string, s11, "@liege"),
			(assign, reg0, 1),
		(else_try),
			#your former liege if you renounced a kingdom
			(eq, ":center_faction", "&players_oath_renounced_against_kingdom"),
			(is_between, ":center_faction", npc_kingdoms_begin, npc_kingdoms_end),
			(faction_slot_eq, ":center_faction", slot_faction_leader, ":center_lord"),
			(str_store_string, s11, "@former liege"),
			(assign, reg0, 1),
		(else_try),
			#stop here for lords you haven't met, or non-hero troops
			(this_or_next|neg|troop_is_hero, ":center_lord"),
			(troop_slot_eq, ":center_lord", slot_troop_met, 0),
		(else_try),
			#check for affiliates
			(call_script, "script_dplmc_is_affiliated_family_member", ":center_lord"),
			(ge, reg0, 1),
			(try_begin),
				(ge, "&g_encountered_party_relation", 0),#don't say "ally" when you might fight them, as that's confusing
				(str_store_string, s11, "str_dplmc_ally"),
			(else_try),
				(str_store_string, s11, "@affiliate"),
			(try_end),
		(else_try),
			#check for former companions
			(call_script, "script_troop_get_player_relation", ":center_lord"),
			(is_between, ":center_lord", companions_begin, companions_end),
			(neg|troop_slot_eq, ":center_lord", slot_troop_playerparty_history, dplmc_pp_history_nonplayer_entry),
			(try_begin),
			   (ge, "&g_encountered_party_relation", 0),#don't say "ally" when you might fight them, as that's confusing
			   (ge, reg0, 50),
			   (str_store_string, s11, "str_dplmc_ally"),
			(else_try),
				(ge, "&g_encountered_party_relation", 0),
				(ge, reg0, 20),
				(str_store_string, s11, "str_dplmc_friend"),
			(else_try),
				(str_store_string, s11, "@former companion"),
			(try_end),
			(assign, reg0, 1),
		(else_try),
			#don't print "friend" if you might fight them
			(lt, "&g_encountered_party_relation", 0),
			(assign, reg0, 0),
		(else_try), #SB : local instead of reg
			#check for friends
            (call_script, "script_troop_get_player_relation", ":center_lord"),
			(store_div, ":relation", reg0, 50),#right now reg0 holds the relation with the player
			(gt, ":relation", 1),
			(str_store_string, s11, "str_dplmc_friend"),
            (assign, reg0, 1),
		(else_try),
			#check for marshall
			(eq, ":center_faction", "&players_kingdom"),
			(faction_slot_eq, ":center_faction", slot_faction_marshall, ":center_lord"),
			(str_store_string, s11, "@marshall"),
		(else_try),
			#check for vassal of player if nothing else to say
			(call_script, "script_dplmc_get_troop_standing_in_faction", "trp_player", ":center_faction"),
			(val_add, reg0, 1),
			(val_sub, reg0, DPLMC_FACTION_STANDING_LEADER_SPOUSE),
			(ge, reg0, 1),
			(str_store_string, s11, "@vassal"),
		(else_try),
			(assign, reg0, 0),
		(try_end),
		##diplomacy end+
        (try_begin),
          # (party_slot_eq, "&current_town", slot_village_state, svs_looted),
          # #SB : cancel string clear
          # (str_clear, s11),
        # (else_try),
          (eq, ":center_lord", "trp_player"),
          (str_store_string,s11,"@ This village and the surrounding lands belong to you."),
		##diplomacy start+ If reg0 > 0, a relation string has been written into s11
		(else_try),
		  (ge, reg0, 1),
		  (str_store_string,s11,"@ You remember that this village and the surrounding lands belong to your {s11} {s7}."),
		##diplomacy end+
        (else_try),
          (ge, ":center_lord", 0),
          (str_store_string,s11,"@ You remember that this village and the surrounding lands belong to {s7}."),
        (else_try),
          (str_store_string,s11,"@ These lands belong to no one."),
        (try_end),
		##diplomacy start+
		(assign, reg0, ":save_reg0"),#revert registers
		(assign, reg4, ":save_reg4"),
		##diplomacy end+

        (str_clear, s7),
        (try_begin),
          (neg|party_slot_eq, "&current_town", slot_village_state, svs_looted),
          (party_get_slot, ":center_relation", "&current_town", slot_center_player_relation),
          (call_script, "script_describe_center_relation_to_s3", ":center_relation"),
          (assign, reg9, ":center_relation"),
          (str_store_string, s7, "@{!} {s3} ({reg9})."),
        (try_end),
        (str_clear, s6),
        (try_begin),
          (party_slot_ge, "&current_town", slot_village_infested_by_bandits, 1),
          (party_get_slot, ":bandit_troop", "&current_town", slot_village_infested_by_bandits),
          (store_character_level, ":player_level", "trp_player"),
          (val_min, ":player_level", 63),
          ## SB : adjust bandit levels to manageable levels, reinforcements based on party size
          (store_add, "&qst_eliminate_bandits_infesting_village_num_bandits", ":player_level", 10),
          (val_div, "&qst_eliminate_bandits_infesting_village_num_bandits", 2),
          (faction_get_slot, ":limit", ":center_faction", dplmc_slot_faction_serfdom),
          (options_get_campaign_ai, ":reduced"),
          (val_mul, ":reduced", 3), #poor ai = more base bandits
          (val_sub, ":reduced", ":limit"),
          (val_add, "&qst_eliminate_bandits_infesting_village_num_bandits", ":reduced"),
          (val_mul, "&qst_eliminate_bandits_infesting_village_num_bandits", 120),
          (val_div, "&qst_eliminate_bandits_infesting_village_num_bandits", 100),
          (val_max, "&qst_eliminate_bandits_infesting_village_num_bandits", 1),
          
          # (party_get_num_companions, ":party_size", "&current_town"), #ideal size is 50
          (call_script, "script_party_count_fit_regulars", "&current_town"),
          (assign, ":party_size", reg0),
          (store_div, ":lower_size", ":party_size", 3), #about 2/3rd stay back
          (store_div, ":limit", ":center_relation", 5),
          (val_add, ":limit", 60),
          (store_random_in_range, "&qst_eliminate_bandits_infesting_village_num_villagers", ":lower_size", ":limit"),
          (val_min, "&qst_eliminate_bandits_infesting_village_num_villagers", ":party_size"),
          (assign, reg8, "&qst_eliminate_bandits_infesting_village_num_bandits"),
          (str_store_troop_name_by_count, s35, ":bandit_troop", "&qst_eliminate_bandits_infesting_village_num_bandits"),
          (str_store_string, s6, "@ The village is infested by {reg8} {s35}."),

          (assign, "&g_enemy_party", -1), #new, no known enemy party while saving village from bandits
          (assign, "&g_ally_party", -1), #new, no known enemy party while saving village from bandits

          ## SB : adjust meshes as well
          (try_begin),
            (eq, ":bandit_troop", "trp_forest_bandit"),
            (set_background_mesh, "mesh_pic_forest_bandits"),
          (else_try),
            (this_or_next|eq, ":bandit_troop", "trp_steppe_bandit"),
            (eq, ":bandit_troop", "trp_desert_bandit"),
            (set_background_mesh, "mesh_pic_steppe_bandits"),
          (else_try),
            (this_or_next|eq, ":bandit_troop", "trp_steppe_bandit"),
            (eq, ":bandit_troop", "trp_taiga_bandit"),
            (set_background_mesh, "mesh_pic_mountain_bandits"),
          (else_try),
            (eq, ":bandit_troop", "trp_sea_raider"),
            (set_background_mesh, "mesh_pic_sea_raiders"),
          (else_try),
            (store_faction_of_troop, ":faction_no", ":bandit_troop"),
            (this_or_next|is_between, ":faction_no", kingdoms_begin, kingdoms_end),
            (eq, ":faction_no", "fac_deserters"),
            (set_background_mesh, "mesh_pic_deserters"),
          (else_try),
           ##diplmacy begin
            (eq, ":bandit_troop", "trp_peasant_woman"),
            #SB : preview actual amount of mercs
            (party_get_num_companions, reg8, "&current_town"),
            (party_count_members_of_type, ":amount", "&current_town", "trp_farmer"),
            (val_sub, reg8, ":amount"),
            (party_count_members_of_type, ":amount", "&current_town", "trp_peasant_woman"),
            (val_sub, reg8, ":amount"),
            (str_store_string, s6, "@ The peasants {reg8?hired {reg8} mercenaries and :}are rebelling against you."),
            (set_background_mesh, "mesh_pic_villageriot"),
          (else_try),
           ##diplomacy end
            (set_background_mesh, "mesh_pic_bandits"),
          (try_end),
        (else_try),
          (this_or_next|party_slot_eq, "&current_town", slot_village_state, svs_looted),
          (party_slot_eq, "&current_town", slot_village_state, svs_deserted),
          (str_store_string, s6, "@ The village has been looted. A handful of souls scatter as you pass through the burnt out houses."),
          (try_begin),
            (neq, "&g_player_raid_complete", 1),
            (play_track, "track_empty_village", 1),
          (try_end),
          (set_background_mesh, "mesh_pic_looted_village"),
        (else_try),
          (party_slot_eq, "&current_town", slot_village_state, svs_being_raided),
          (str_store_string, s6, "@ The village is being raided."),
        (else_try), #SB : script call
          (call_script, "script_set_town_picture"),
        (try_end),

        (try_begin),
          (eq, "&g_player_raid_complete", 1),
          (try_begin), #SB : branching menu
            (party_slot_eq, "&current_town", slot_village_state, svs_looted),
            (jump_to_menu, "mnu_village_loot_complete"),
          (else_try), #stay on this menu
            (party_slot_eq, "&current_town", slot_village_state, svs_deserted),
            (jump_to_menu, "mnu_village_enslave_complete"),
          (try_end),
          #SB : reinforce quest state, also move completion reset after
          (try_begin),
            (check_quest_active, "qst_hunt_down_fugitive"),
            (quest_slot_eq, "qst_hunt_down_fugitive", slot_quest_target_center, "&current_town"),
            (quest_set_slot, "qst_hunt_down_fugitive", slot_quest_current_state, 3),
          (try_end),
        (else_try),
          (party_get_slot, ":raider_party", "&current_town", slot_village_raided_by),
          (gt, ":raider_party", 0),
        # Process here...
        (try_end),

        (try_begin),
          (eq,"&g_leave_town",1),
          (assign,"&g_leave_town",0),
          (change_screen_return),
        (try_end),

        (try_begin),
          (store_time_of_day, ":cur_hour"),
          (ge, ":cur_hour", 5),
          (lt, ":cur_hour", 21),
          (assign, "&town_nighttime", 0),
        (else_try),
          (assign, "&town_nighttime", 1),
        (try_end),
    ],
    [
      ("village_manage",
      [
        (call_script, "script_cf_village_normal_cond", "&current_town"), #SB : script condition
        (party_slot_eq, "&current_town", slot_town_lord, "trp_player")
        ]
       ,"Manage this village.",
       [
           (assign, "&g_next_menu", "mnu_village"),
           (jump_to_menu, "mnu_center_manage"),
        ]),
      ("recruit_volunteers",
      [
        (call_script, "script_cf_village_recruit_volunteers_cond"),
       ]
       ,"Recruit Volunteers.",
       [
         (try_begin),
           (call_script, "script_cf_enter_center_location_bandit_check"),
         (else_try),
           (jump_to_menu, "mnu_recruit_volunteers"),
         (try_end),
        ]),
      ("village_center",[(call_script, "script_cf_village_normal_cond", "&current_town"), #SB : script condition
       ]
       ,"Go to the village center.",
       [
          (try_begin),
            (call_script, "script_cf_enter_center_location_bandit_check"),
          (else_try),
            (party_get_slot, ":village_scene", "&current_town", slot_castle_exterior),
            (modify_visitors_at_site,":village_scene"),
            (reset_visitors),
            (party_get_slot, ":village_elder_troop", "&current_town",slot_town_elder),
            (set_visitor, 11, ":village_elder_troop"),
            ##diplomacy begin
            (try_begin),
              (gt, "&g_player_chamberlain", 0),
              (call_script, "script_dplmc_appoint_chamberlain"),  #fix for wrong troops after update
              (party_get_slot, ":town_lord", "&current_town", slot_town_lord),
              (eq, ":town_lord", "trp_player"),
              (set_visitor, 9, "&g_player_chamberlain"),
            (try_end),
            ##diplomacy end


           (call_script, "script_init_town_walkers"),

           (try_begin),
             (check_quest_active, "qst_hunt_down_fugitive"),
             (neg|is_currently_night),
             (quest_slot_eq, "qst_hunt_down_fugitive", slot_quest_target_center, "&current_town"),
             (neg|check_quest_concluded, "qst_hunt_down_fugitive"), #SB : other condition
             (neg|check_quest_succeeded, "qst_hunt_down_fugitive"),
             (neg|check_quest_failed, "qst_hunt_down_fugitive"),
             (set_visitor, 45, "trp_fugitive"),
           (try_end),

           (set_jump_mission,"mt_village_center"),
           (jump_to_scene,":village_scene"),
           (change_screen_mission),
         (try_end),
        ],"Door to the village center."),
       ##diplomacy begin
      ("dplmc_village_elder_meeting",[
         (call_script, "script_cf_village_normal_cond", "&current_town"), #SB : conditional check
	   ##diplomacy start+
		#rubik had a good idea: only enable this after having met the village elder
		(party_get_slot, ":village_elder_troop", "&current_town",slot_town_elder),
		(gt, ":village_elder_troop", 0),
		(this_or_next|eq, "&cheat_mode", 1),#Always can jump to village elder in cheat mode
		(this_or_next|eq, "&players_kingdom", "&g_encountered_party_faction"), #allow when member
        (troop_slot_ge,":village_elder_troop", slot_troop_met, 1),
		##diplomacy end+
       ]
       ,"Meet the Village Elder.",
       [
         (try_begin),
           (call_script, "script_cf_enter_center_location_bandit_check"),
         (else_try),
           (party_get_slot, ":village_scene", "&current_town", slot_castle_exterior),
           (modify_visitors_at_site,":village_scene"),
           (reset_visitors),
           (party_get_slot, ":village_elder_troop", "&current_town",slot_town_elder),
           (set_visitor, 11, ":village_elder_troop"),
           (try_begin), #SB : supporting village_elder_found_chamberlain dialog option
              (party_slot_eq, "&current_town", slot_town_lord, "trp_player"),
              (eq, "&g_player_chamberlain", "trp_dplmc_chamberlain"),
              (set_visitor, 9, "&g_player_chamberlain"),
           (try_end),

           (set_jump_mission,"mt_village_center"),
           (jump_to_scene,":village_scene"),
           (change_screen_map_conversation, ":village_elder_troop"),
         (try_end),
        ]),
      ##diplomacy end
	##diplomacy start+
	#If you can't jump to the village elder, explain why
    ("dplmc_village_elder_meeting_denied",
	[
		#Only show this when the player would get the rest of the village menus
        (call_script, "script_cf_village_normal_cond", "&current_town"), #SB : script condition
	    #There is a valid village elder, and you haven't met him,
		#and there isn't another condition that enables the jump.
		(party_get_slot, ":village_elder_troop", "&current_town",slot_town_elder),
		(gt, ":village_elder_troop", 0),
		(eq, "&cheat_mode", 0),
		(troop_slot_eq, ":village_elder_troop", slot_troop_met, 0),
		(disable_menu_option),
		],
       "You have not met the village elder yet.",
       [
     ]),
	 ##diplomacy end+
      ("village_buy_food",[(party_slot_eq, "&current_town", slot_village_state, svs_normal),
                           (neg|party_slot_ge, "&current_town", slot_village_infested_by_bandits, 1),
                           ],"Buy supplies from the peasants.",
       [
         (try_begin),
           (call_script, "script_cf_enter_center_location_bandit_check"),
         (else_try),
           (party_get_slot, ":merchant_troop", "&current_town", slot_town_elder),

      #(try_for_range, ":cur_goods", trade_goods_begin, trade_goods_end),
        #(store_sub, ":cur_good_price_slot", ":cur_goods", trade_goods_begin),
        #(val_add, ":cur_good_price_slot", slot_town_trade_good_prices_begin),
		#(party_get_slot, ":cur_price", "&current_town", ":cur_good_price_slot"),
	    #(call_script, "script_center_get_production", "&current_town", ":cur_goods"),
        #(assign, reg13, reg0),
	    #(call_script, "script_center_get_consumption", "&current_town", ":cur_goods"),
        #(str_store_party_name, s1, "&current_town"),
        #(str_store_item_name, s2, ":cur_goods"),
		#(assign, reg16, ":cur_price"),
        #(display_log_message, "@DEBUG:{s1}-{s2}, prd: {reg13}, con: {reg0}, raw: {reg1}, cns: {reg2}, fee: {reg16}"),
	  #(try_end),

           (change_screen_trade, ":merchant_troop"),
         (try_end),
         ]),
##diplomacy start+
#Import rubik's Auto-Sell options from Custom Commander
      ("dplmc_village_auto_sell",
        [
        (party_slot_eq, "&current_town", slot_village_state, svs_normal),
        (neg|party_slot_ge, "&current_town", slot_village_infested_by_bandits, 1),
        (party_get_slot, ":village_elder_troop", "&current_town", slot_town_elder),
        (ge, ":village_elder_troop", 0),
        ],
       "Sell items automatically.",
       [
          (assign, "&g_next_menu", "mnu_village"),
          (jump_to_menu,"mnu_dplmc_trade_auto_sell_begin"),
        ]),

      ("dplmc_village_auto_buy_food",
        [
        (party_slot_eq, "&current_town", slot_village_state, svs_normal),
        (neg|party_slot_ge, "&current_town", slot_village_infested_by_bandits, 1),
        (party_get_slot, ":village_elder_troop", "&current_town", slot_town_elder),
        (ge, ":village_elder_troop", 0),
        ],
       "Buy food automatically.",
       [
          (assign, "&g_next_menu", "mnu_village"),
          (jump_to_menu,"mnu_dplmc_trade_auto_buy_food_begin"),
        ]),
##diplomacy end+
      ("village_attack_bandits",[
        (party_slot_ge, "&current_town", slot_village_infested_by_bandits, 1),
        ##diplomacy begin
        (neg|party_slot_eq, "&current_town", slot_village_infested_by_bandits, "trp_peasant_woman"),
        ##diplmacy end
        ],
       "Attack the bandits.",
       [(party_get_slot, ":bandit_troop", "&current_town", slot_village_infested_by_bandits),
        (party_get_slot, ":scene_to_use", "&current_town", slot_castle_exterior),
        (modify_visitors_at_site,":scene_to_use"),
        (reset_visitors),
        (set_visitors, 0, ":bandit_troop", "&qst_eliminate_bandits_infesting_village_num_bandits"),
        (set_visitors, 2, "trp_farmer", "&qst_eliminate_bandits_infesting_village_num_villagers"),
        (set_party_battle_mode),
        (set_battle_advantage, 0),
        (assign, "&g_battle_result", 0),
        (set_jump_mission,"mt_village_attack_bandits"),
        (jump_to_scene, ":scene_to_use"),
        (assign, "&g_next_menu", "mnu_village_infest_bandits_result"),
        (jump_to_menu, "mnu_battle_debrief"),
        (assign, "&g_mt_mode", vba_normal),
        (change_screen_mission),
        ]),

      ("village_wait",
       [(party_slot_eq, "&current_town", slot_center_has_manor, 1),
        (party_slot_eq, "&current_town", slot_town_lord, "trp_player"),
        ],
         "Wait here for some time.",
         [
           (assign,"&auto_enter_town","&current_town"),
           (assign, "&g_last_rest_center", "&current_town"),

           (try_begin),
             (party_is_active, "p_main_party"),
             (party_get_current_terrain, ":cur_terrain", "p_main_party"),
             (try_begin),
               (eq, ":cur_terrain", rt_desert),
               (unlock_achievement, ACHIEVEMENT_SARRANIDIAN_NIGHTS),
             (try_end),
           (try_end),

           (rest_for_hours_interactive, 24 * 7, 5, 1), #rest while attackable

           (change_screen_return),
          ]),

       ##diplomacy begin
      ("dplmc_village_counter_insurgency",[
        (party_slot_eq, "&current_town", slot_village_infested_by_bandits, "trp_peasant_woman"),
        ],
       "Counter the insurgency.",
       [
          (store_random_in_range, ":enmity", -10, -5),
          (call_script, "script_change_player_relation_with_center", "&current_town", ":enmity"),
          (call_script, "script_calculate_battle_advantage"),
          (set_battle_advantage, reg0),
          (set_party_battle_mode),
          (assign, "&g_battle_result", 0),
          (assign, "&g_village_raid_evil", 1), #check
          (set_jump_mission,"mt_village_raid"),
          (party_get_slot, ":scene_to_use", "&current_town", slot_castle_exterior),
          (jump_to_scene, ":scene_to_use"),
          (assign, "&g_next_menu", "mnu_dplmc_village_riot_result"),

          # (call_script, "script_objectionable_action", tmt_humanitarian, "str_loot_village"),
          #SB : more appropriate message for tax rebels
          (call_script, "script_objectionable_action", tmt_humanitarian, "str_repress_farmers"),
          (jump_to_menu, "mnu_battle_debrief"),
          (change_screen_mission),
        ]),

      ("dplmc_village_negotiate",[
        (party_slot_eq, "&current_town", slot_village_infested_by_bandits, "trp_peasant_woman"),
        ],
       "Begin negotiations.",
       [
          (jump_to_menu, "mnu_dplmc_riot_negotiate"),
        ]),
        ##diplomacy end

      ("collect_taxes_qst",[(party_slot_eq, "&current_town", slot_village_state, svs_normal),
                            (neg|party_slot_ge, "&current_town", slot_village_infested_by_bandits, 1),
                            (check_quest_active, "qst_collect_taxes"),
                            (quest_get_slot, ":quest_giver_troop", "qst_collect_taxes", slot_quest_giver_troop),
                            (quest_slot_eq, "qst_collect_taxes", slot_quest_target_center, "&current_town"),
                            #SB : add ownership/faction check here
                            (party_slot_eq, "&current_town", slot_town_lord, ":quest_giver_troop"),
                            (neg|quest_slot_eq, "qst_collect_taxes", slot_quest_current_state, 4),
                            (str_store_troop_name, s1, ":quest_giver_troop"),
                            (quest_get_slot, reg5, "qst_collect_taxes", slot_quest_current_state),
                            ], "{reg5?Continue collecting taxes:Collect taxes} due to {s1}.",
       [(jump_to_menu, "mnu_collect_taxes"),]),

      ("train_peasants_against_bandits_qst",
       [
         (party_slot_eq, "&current_town", slot_village_state, svs_normal),
         (check_quest_active, "qst_train_peasants_against_bandits"),
         (neg|check_quest_concluded, "qst_train_peasants_against_bandits"),
         (quest_slot_eq, "qst_train_peasants_against_bandits", slot_quest_target_center, "&current_town"),
         ], "Train the peasants.",
       [(jump_to_menu, "mnu_train_peasants_against_bandits"),]),

      ("village_hostile_action",[(party_slot_eq, "&current_town", slot_village_state, svs_normal),
                                 (neg|party_slot_ge, "&current_town", slot_village_infested_by_bandits, 1),
                                 (party_slot_ge, "&current_town", slot_center_player_relation, -1), #relationship check, non-negative
                                 (check_quest_active, "qst_hunt_down_fugitive"),
                                 (quest_slot_eq, "qst_hunt_down_fugitive", slot_quest_target_center, "&current_town"),
                                 (neg|check_quest_concluded, "qst_hunt_down_fugitive"), #SB : other condition
                                 (neg|check_quest_succeeded, "qst_hunt_down_fugitive"),
                                 (neg|check_quest_failed, "qst_hunt_down_fugitive"),
                                 (quest_get_slot, ":quest_target_dna", "qst_hunt_down_fugitive", slot_quest_target_dna),
                                 (call_script, "script_get_name_from_dna_to_s50", ":quest_target_dna"),
								 ], "Demand to meet the family of {s50}.",
       [
       (call_script, "script_get_max_skill_of_player_party", "skl_persuasion"),
       (store_random_in_range, ":random_no", reg0, 100),
       #persuasion instead of straight out murdering everyone
       (call_script, "script_party_count_members_with_full_health","p_main_party"),
       (assign, ":player_party_size", reg0),
       (call_script, "script_party_count_members_with_full_health","&current_town"),
       (store_mul, ":villagers_party_size", reg0, 2), #twice the effective size
       (try_begin),
         (this_or_next|gt, ":random_no", 40),
         (gt, ":player_party_size", ":villagers_party_size"),
         (jump_to_menu, "mnu_village_hunt_down_fugitive_persuaded"),
       (else_try),
         (jump_to_menu,"mnu_village_start_attack"),
       (try_end),
           ]),

      ("village_hostile_action",[(party_slot_eq, "&current_town", slot_village_state, svs_normal),
                                 (neg|party_slot_ge, "&current_town", slot_village_infested_by_bandits, 1),
								 (neq, "&players_kingdom", "&g_encountered_party_faction"),
								 ], "Take a hostile action.",
       [(jump_to_menu,"mnu_village_hostile_action"),
           ]),

      # ("village_reports",[(eq, "&cheat_mode", 1),], "{!}CHEAT! Show reports.",
       # [(jump_to_menu,"mnu_center_reports"),
           # ]),
      ("village_leave",[],"Leave...",[(change_screen_return,0),
	  ##diplomacy start+
	  ##Importing auto-purchase of food from rubik's Custom Commander
	  (try_begin),
		 (party_slot_eq, "&current_town", slot_village_state, svs_normal),
		 (neg|party_slot_ge, "&current_town", slot_village_infested_by_bandits, 1),
		 (party_get_slot, ":merchant_troop", "&current_town",slot_town_elder),
		 (gt, ":merchant_troop", 0),
		 (call_script, "script_dplmc_initialize_autoloot", 0),#argument "0" means this does nothing if deemed unnecessary
		 (try_begin),
			(eq, "&g_dplmc_buy_food_when_leaving", 1),
			(call_script, "script_dplmc_auto_buy_food", "trp_player", ":merchant_troop"),
		 (try_end),
		 (try_begin),
			(eq, "&g_dplmc_sell_items_when_leaving", 1),
			(call_script, "script_dplmc_auto_sell", "trp_player", ":merchant_troop", "&g_dplmc_auto_sell_price_limit", all_items_begin, all_items_end, 2),
		 (try_end),
	  (try_end),
	  ##diplomacy end+
	  ]),
      #SB : consolidated cheats
      ("village_cheat", [(ge, "&cheat_mode", 1),],
      "Use cheats.",
      [(jump_to_menu, "mnu_town_cheats"),
      ]),
    ],
  ),


Example of presentation: 
	 ##############MEETING###############
  ("coop_mp_meeting", 0, mesh_load_window, [
      (ti_on_presentation_load,
         [(presentation_set_duration, 999999),
          (set_fixed_point_multiplier, 1000),
          
         # Chat Box Background Creation
         (create_mesh_overlay, reg1, "mesh_load_window"),
         (overlay_set_color, reg1, 0x000000),  # Black background
         (position_set_x, pos1, 50),   # Setting position to 0 as specified
         (position_set_y, pos1, 150), # This Y position can be adjusted for your needs
         (overlay_set_position, reg1, pos1),
         (position_set_x, pos2, 600),  # Width
         (position_set_y, pos2, 600),  # Height adjusting for aesthetically pleasing proportions
         (overlay_set_size, reg1, pos2),

          # Embed picture lower right
          (create_mesh_overlay, reg1, "mesh_pic_charge"),
          (position_set_x, pos1, 200),
          (position_set_y, pos1, 200),
          (overlay_set_size, reg1, pos1),
          (position_set_x, pos1, 720),
          (position_set_y, pos1, 150),
          (overlay_set_position, reg1, pos1),
          
        	#  Meeting party name
          (str_store_party_name, s0, "&meeting_party"),
					(create_text_overlay, reg0, s0, tf_left_align|tf_single_line),
					(overlay_set_color, reg0, 0xFFFFFFFF),
					(position_set_x, pos1, 50),
					(position_set_y, pos1, 630),
					(overlay_set_position, reg0, pos1),
					(position_set_x, pos1, 1500),
					(position_set_y, pos1, 1500),
					(overlay_set_size, reg0, pos1),
          (overlay_set_color, reg0, 0x000000),

          # Separator for name
          (create_mesh_overlay, reg1, "mesh_white_plane"),
          (overlay_set_color, reg1, 0x000000),
          (position_set_x, pos1, 42000),
          (position_set_y, pos1, 60),
          (overlay_set_size, reg1, pos1),
          (position_set_x, pos2, 50),
          (position_set_y, pos2, 620),
          (overlay_set_position, reg1, pos2),
        
        #   # Chat Display
        #  (create_text_overlay, "&backround_chat", "@", tf_scrollable_style_2),
        #  (position_set_x, pos1, 200),  # Adjust based on chat background
        #  (position_set_y, pos1, 310),
        #  (overlay_set_position, "&backround_chat", pos1),
        # #  (overlay_set_area_size, "&backround_chat", 780, 430),  # Adjust width and height
        #  (overlay_set_color, "&backround_chat", 0xFFFFFF),  # White text

          # Input Field
          (create_simple_text_box_overlay, "&input_chat"),
          (position_set_x, pos1, 50),  # Adjust based on overall UI layout
          (position_set_y, pos1, 120),
          (overlay_set_position, "&input_chat", pos1),
          (position_set_x, pos2, 440),  # Width of the input field
          (position_set_y, pos2, 1000),   # Height of the input field
          (overlay_set_size, "&input_chat", pos2),


          ###################################
          # Send Message Button
          (create_game_button_overlay, "&g_presentation_obj_send_button", "@Enter", tf_center_justify),
          (position_set_x, pos1, 580), # 730
          (position_set_y, pos1, 110),
          (overlay_set_position, "&g_presentation_obj_send_button", pos1),

          (create_in_game_button_overlay, "&g_presentation_obj_button_1", "@ATTACK!", tf_center_justify),
          (overlay_set_color, "&g_presentation_obj_button_1", 0xFFFFFF),
          (position_set_x, pos1, 810),
          (position_set_y, pos1, 400),
          (overlay_set_position, "&g_presentation_obj_button_1", pos1),

          (create_in_game_button_overlay, "&g_presentation_obj_button_2", "@Go Back", tf_center_justify),
          (overlay_set_color, "&g_presentation_obj_button_2", 0xFFFFFF),
          (position_set_x, pos1, 810),
          (position_set_y, pos1, 300),
          (overlay_set_position, "&g_presentation_obj_button_2", pos1),

          (create_text_overlay, reg0, "@(There is no coming back)", tf_center_justify),
          (position_set_x, pos1, 810),  # Adjust based on chat background
          (position_set_y, pos1, 370),
          (overlay_set_position, reg0, pos1),

          (create_text_overlay, "&g_little_pos_helper", "@00,00"),
          (overlay_set_color, "&g_little_pos_helper", 0xFF0000),
          (position_set_x, pos1, 40),
          (position_set_y, pos1, 690),
          (overlay_set_position, "&g_little_pos_helper", pos1),

      ]),
      (ti_on_presentation_event_state_change,
      [(store_trigger_param_1, ":object"),
          (try_begin),
              (eq, ":object", "&send_button"),

              # (overlay_get_text, s1, "input_chat"),
              (neg|str_is_empty, s1),
              # Here you can include the script to display the message or send it to a server etc.
              
              # Example: Update chat display
              # This is purely illustrative and may not directly apply without additional scripts or setup:
              # (str_store_string, s2, "@Chat_text"),  # Assumed existing chat display variable
              # (str_store_string, s3, "@New_Message"),  # The new message
              # (str_store_string_concat, s2, s3),
              # (overlay_set_text, "chat_overlay_id", s2),  # Assumes an ID for the chat text overlay
              

              # Re-launch the presentation to refresh the chat display if necessary
              # (start_presentation, "mp_meeting"),
          (else_try),
            (eq, ":object", "&g_presentation_obj_button_1"),
              # (display_message, "@Attack..."),
              (presentation_set_duration, 0),

              # Send request to webserver
              (lua_push_int, 2),
              (lua_call, "@sendbattlestats", 1), 
              # #Send event to player
              (str_store_party_name, s1, "&meeting_party"),
              (call_script,"script_send_string_to_server",mpcamp_event_send_battle_stats,1,s1),
              (call_script,"script_send_data"),

              (try_begin),
              (eq, "&encounter_oncoming", 1),
                (call_script, "script_game_event_party_encounter", "&meeting_party", -1),
              (try_end),
              # (multiplayer_connect_to_server, "str_test_server", "@test"),
          (else_try),
            (eq, ":object", "&g_presentation_obj_button_2"),
            (str_store_party_name, s1, "&meeting_party"),

            (call_script,"script_send_string_to_server",mpcamp_event_encounter_go_back,1,s1),
            (call_script,"script_send_data"), 
            (presentation_set_duration, 0),
            (change_screen_return),
          (try_end),
      ]),
      (ti_on_presentation_run,
           [
        
      (set_fixed_point_multiplier, 1000),
			(mouse_get_position, pos1),
			(position_get_x, reg1, pos1),
			(position_get_y, reg2, pos1),
			(overlay_set_text, "&g_little_pos_helper", "@{reg1},{reg2}"),


		  #  (set_fixed_point_multiplier, 1000),
			# (mouse_get_position, pos1),
			# (position_get_x, reg1, pos1),
			# (position_get_y, reg2, pos1),
			# (overlay_set_text, "&g_little_pos_helper", "@{reg1},{reg2}"),
		   
		  #  (try_begin),
			# 	(map_free),
			# 	(presentation_set_duration, 0),
			# (else_try),
			# 	(this_or_next|key_clicked,key_escape),
			# 	(key_clicked,key_m),
			# 	(presentation_set_duration, 0),
			# (try_end),
      
			]),
    sync,
  ]),


The above is an implementation of a game menu (village) for the Warband module system. Game menus are static, less moddable and without triggers, unlike the presentation. 
Rewrite the village game menu as a presentation