- 好友
 - 3
  
- 在线时间
 - 27 小时
  
- 最后登录
 - 2025-11-3
  
 
 
 
 
贵族[MOD作者] 
    
- UID
 - 3048044
  
- 第纳尔
 - 2234 
  
- 精华
 - 0
  
- 互助
 - 21 
  
- 荣誉
 - 3 
  
- 贡献
 - 20 
  
- 魅力
 - 516 
  
- 注册时间
 - 2018-12-15
  
 
  鲜花( 45)   鸡蛋( 0)  
 | 
 
 本帖最后由 黑暗路西法 于 2025-6-16 09:04 编辑  
 
众所周知,使用(party_upgrade_with_xp, <party_id>, <xp_amount>, <upgrade_path>),这个脚本给npc的部队升级不但会浪费很多经验,而且由于参数只能填一个带来的乱升级也是个问题,因此本人在做部队模板系统的时候做了一个pro版本的升级系统修复了这些问题,下面放出泛用版本的代码 
使用这套代码可以在不往模板塞一大堆对应升级方向兵种的情况下来做到特殊阵营的升级倾向,例如斯瓦迪亚更倾向出骑兵、维基亚更倾向出射手、罗多克更倾向出长矛兵等(因为脚本内置了参数所以也可以做更详细的判断) 
 
 
因为我mod里是6个分组,但是骑砍原版通过源码最多能筛出4个,因此这里放出四个faction slot 
(因为我的mod存储了troop的初始分组,因此可以跳过条件筛选部分) 
 
 
slot_faction_upgrade_priority_1      = 171 #步兵优先级 
slot_faction_upgrade_priority_2      = 172 #射手优先级 
slot_faction_upgrade_priority_3      = 173 #骑兵优先级 
slot_faction_upgrade_priority_4      = 174 #骑射手优先级 
 
 | 
  
 
 
 
 
   ("party_upgrade_with_xp_new",   #新版的升级兵种代码 
    [ 
      (store_script_param, ":party_no", 1),#部队id 
      (store_script_param, ":xp_amount", 2),#升级经验值 
      (store_script_param, ":troop_type_priority_1", 3),#步兵优先度(脚本参数版本) 
      (store_script_param, ":troop_type_priority_2", 4),#射手优先度(脚本参数版本) 
      (store_script_param, ":troop_type_priority_3", 5),#骑兵优先度(脚本参数版本) 
      (store_script_param, ":troop_type_priority_4", 6),#骑射手优先度(脚本参数版本) 
      (store_script_param, ":troop_upgrade_order", 7),#升级顺序,1为高级优先,2为低级优先3为随机优先,不设置则按照原本的部队排序来 
      (party_get_num_companion_stacks,":num_stacks",":party_no"),#获取stack数量 
      (assign,":check_party",":party_no"),#不设置升级顺序的情况下默认直接检查对应部队 
 
      (store_faction_of_party,":party_faction",":party_no"),#获取对应阵营的升级优先级 
      (faction_get_slot,":faction_upgrade_proiorty",":party_faction",slot_faction_upgrade_priority_1), 
      (val_add,":troop_type_priority_1",":faction_upgrade_proiorty"), 
      (faction_get_slot,":faction_upgrade_proiorty",":party_faction",slot_faction_upgrade_priority_2),    
      (val_add,":troop_type_priority_2",":faction_upgrade_proiorty"), 
      (faction_get_slot,":faction_upgrade_proiorty",":party_faction",slot_faction_upgrade_priority_3), 
      (val_add,":troop_type_priority_3",":faction_upgrade_proiorty"), 
      (faction_get_slot,":faction_upgrade_proiorty",":party_faction",slot_faction_upgrade_priority_4), 
      (val_add,":troop_type_priority_4",":faction_upgrade_proiorty"), 
 
 
 
      (try_begin), 
        (neq,":troop_upgrade_order",0), 
        (party_clear,"p_temp_party"), 
        (assign,":check_party","p_temp_party"), 
        (try_for_range,":stack_no",0,":num_stacks"), 
          (party_stack_get_troop_id, ":stack_troop", ":party_no", ":stack_no"), 
          (party_stack_get_size, ":stack_size", ":party_no", ":stack_no"), 
          (party_add_members,"p_temp_party",":stack_troop",":stack_size"), 
        (try_end), 
 
        (try_begin), 
          (eq,":troop_upgrade_order",1),#高等级优先 
          (assign, ":last_stack", ":num_stacks"), 
          (try_for_range, ":unused", 0, ":num_stacks"),#rubik的部队排序代码 
             (assign, ":best_stack", -1), 
             (assign, ":best_level", -999999), 
             (try_for_range, ":cur_stack", 0, ":last_stack"), 
               (party_stack_get_troop_id, ":cur_troop", "p_temp_party", ":cur_stack"), 
               (store_character_level, ":troop_level", ":cur_troop"), 
               (gt, ":troop_level", ":best_level"), 
               (assign, ":best_level", ":troop_level"), 
               (assign, ":best_stack", ":cur_stack"), 
             (try_end), 
             (try_begin), 
               (gt, ":best_stack", -1), 
               (party_stack_get_troop_id, ":stack_troop", "p_temp_party", ":best_stack"), 
               (party_stack_get_size, ":stack_size", "p_temp_party", ":best_stack"), 
               (party_stack_get_num_wounded, ":num_wounded", "p_temp_party", ":best_stack"), 
               (party_remove_members, "p_temp_party", ":stack_troop", ":stack_size"), 
               (party_add_members, "p_temp_party", ":stack_troop", ":stack_size"), 
               (party_wound_members, "p_temp_party", ":stack_troop", ":num_wounded"), 
               (val_sub, ":last_stack", 1), 
             (try_end), 
          (try_end), 
         (else_try), 
          (eq,":troop_upgrade_order",2),#低等级优先 
          (assign, ":last_stack", ":num_stacks"), 
          (try_for_range, ":unused", 0, ":num_stacks"), 
            # find highest-level troop 
            (assign, ":best_stack", -1), 
            (assign, ":best_level", 99), 
            (try_for_range, ":cur_stack", 0, ":last_stack"), 
              (party_stack_get_troop_id, ":cur_troop", "p_temp_party", ":cur_stack"), 
              (store_character_level, ":troop_level", ":cur_troop"), 
              (lt, ":troop_level", ":best_level"), 
              (assign, ":best_level", ":troop_level"), 
              (assign, ":best_stack", ":cur_stack"), 
            (try_end), 
            (try_begin), 
              (gt, ":best_stack", -1), 
              (party_stack_get_troop_id, ":stack_troop", "p_temp_party", ":best_stack"), 
              (party_stack_get_size, ":stack_size", "p_temp_party", ":best_stack"), 
              (party_stack_get_num_wounded, ":num_wounded", "p_temp_party", ":best_stack"), 
              (party_remove_members, "p_temp_party", ":stack_troop", ":stack_size"), 
              (party_add_members, "p_temp_party", ":stack_troop", ":stack_size"), 
              (party_wound_members, "p_temp_party", ":stack_troop", ":num_wounded"), 
              (val_sub, ":last_stack", 1), 
            (try_end), 
          (try_end), 
         (else_try), 
          (eq,":troop_upgrade_order",3),#随机优先 
          (assign, ":last_stack", ":num_stacks"), 
          (try_for_range, ":unused", 0, ":num_stacks"),#rubik的部队排序代码 
            (assign, ":best_stack", -1), 
            (store_random_in_range,":best_level",0,20), 
            (try_for_range, ":cur_stack", 0, ":last_stack"), 
              (party_stack_get_troop_id, ":cur_troop", "p_temp_party", ":cur_stack"), 
              (store_random_in_range,":troop_level",0,20), 
              (ge, ":troop_level", ":best_level"), 
              (assign, ":best_level", ":troop_level"), 
              (assign, ":best_stack", ":cur_stack"), 
            (try_end), 
            (try_begin), 
              (gt, ":best_stack", -1), 
              (party_stack_get_troop_id, ":stack_troop", "p_temp_party", ":best_stack"), 
              (party_stack_get_size, ":stack_size", "p_temp_party", ":best_stack"), 
              (party_stack_get_num_wounded, ":num_wounded", "p_temp_party", ":best_stack"), 
              (party_remove_members, "p_temp_party", ":stack_troop", ":stack_size"), 
              (party_add_members, "p_temp_party", ":stack_troop", ":stack_size"), 
              (party_wound_members, "p_temp_party", ":stack_troop", ":num_wounded"), 
              (val_sub, ":last_stack", 1), 
            (try_end), 
          (try_end),  
        (try_end),  
      (try_end), 
 
      (assign,":try_rank",1), 
      (try_for_range,":unused",0,":try_rank"), 
        (try_for_range,":stack_no",0,":num_stacks"), 
          (party_stack_get_troop_id, ":stack_troop", ":check_party", ":stack_no"), 
          (party_stack_get_size, ":stack_troop_size", ":check_party", ":stack_no"), 
          (troop_get_upgrade_troop, ":upgrade_troop_1", ":stack_troop", 0), 
          (troop_get_upgrade_troop, ":upgrade_troop_2", ":stack_troop", 1), 
          (this_or_next|ge,":upgrade_troop_1",1), 
          (ge,":upgrade_troop_2",1),#至少有一个可升级的路线 
          (assign,":target_troop",":upgrade_troop_1"), 
          (try_begin), 
            (ge,":upgrade_troop_2",1),#有路线选择的情况下,参考优先级进行优先级管理 
            (try_begin), 
              (troop_is_guarantee_horse, ":upgrade_troop_1"), 
              (troop_is_guarantee_ranged, ":upgrade_troop_1"), 
              (assign,":upgd_priority_1",":troop_type_priority_4"),#骑射手优先级 
             (else_try), 
              (eq,":start_class",1), 
              (troop_is_guarantee_horse, ":upgrade_troop_1"), 
              (assign,":upgd_priority_1",":troop_type_priority_3"),#骑兵优先级 
             (else_try), 
              (eq,":start_class",2), 
              (troop_is_guarantee_ranged, ":upgrade_troop_1"), 
              (assign,":upgd_priority_1",":troop_type_priority_2"),#射手优先级 
             (else_try), 
              (eq,":start_class",3), 
              (assign,":upgd_priority_1",":troop_type_priority_1"),#步兵(和其他)优先级 
            (try_end), 
            (troop_get_slot,":start_class",":upgrade_troop_2",slot_troop_old_class), 
 
            (try_begin), 
              (troop_is_guarantee_horse, ":upgrade_troop_2"), 
              (troop_is_guarantee_ranged, ":upgrade_troop_2"), 
              (assign,":upgd_priority_2",":troop_type_priority_4"),#骑射手优先级 
             (else_try), 
              (eq,":start_class",1), 
              (troop_is_guarantee_horse, ":upgrade_troop_2"), 
              (assign,":upgd_priority_2",":troop_type_priority_3"),#骑兵优先级 
             (else_try), 
              (eq,":start_class",2), 
              (troop_is_guarantee_ranged, ":upgrade_troop_2"), 
              (assign,":upgd_priority_2",":troop_type_priority_2"),#射手优先级 
             (else_try), 
              (eq,":start_class",3), 
              (assign,":upgd_priority_2",":troop_type_priority_1"),#步兵(和其他)优先级 
            (try_end), 
 
            (store_random_in_range,":rand",0,100),#默认每1优先级影响1%的概率 
            (val_sub,":rand",":upgd_priority_1"), 
            (val_add,":rand",":upgd_priority_2"), 
            (ge,":rand",50), 
            (assign,":target_troop",":upgrade_troop_2"), 
          (try_end), 
          (call_script,"script_game_get_upgrade_xp",":stack_troop"),#这里是原版的升级经验需求脚本 
          (assign,":exp_cause",reg0), 
          (store_div,":upgrad_num_all",":xp_amount",":exp_cause"),#算出最多能升级的兵种数量 
          (val_min,":upgrad_num_all",":stack_troop_size"),##升级的兵种数量不会超过可升级数量 
          (store_random_in_range,":rand",40,140),#设置随机数,增加兵种多样性 
          (val_min,":rand",100), 
          (val_mul,":upgrad_num_all",":rand"), 
          (val_div,":upgrad_num_all",100), 
          (store_mul,":total_exp_cause",":upgrad_num_all",":exp_cause"),   #计算出总经验需求 
          (party_remove_members_wounded_first,":party_no",":stack_troop",":upgrad_num_all"), #替换兵种(把优先去掉昏迷兵种去掉也可以)      
          (party_add_members,":party_no",":target_troop",":upgrad_num_all"),       
          (val_sub,":xp_amount",":total_exp_cause"), 
          (party_get_num_companion_stacks, ":num_stacks", ":check_party"),#刷新检查部队数量,防止参数为0的情况下升级的部队底部同一兵种被反复升级 
        (try_end), 
        (gt,":xp_amount",1000), 
        (lt,":try_rank",5),#有经验溢出的情况下最多升级5轮 
        (val_add,":try_rank",1), 
      (try_end), 
      ]),     
 
 
 | 
  
 
使用例↓ 
(call_script,"script_party_upgrade_with_xp_new",目标party,升级经验,步兵额外优先百分比,射手额外优先百分比,骑兵额外优先百分比,骑射手额外优先百分比,升级顺序,0为原本部队顺序,1为高级优先,2为低级优先3为随机优先), 
(call_script,"script_party_upgrade_with_xp_new",":temp_party_id",30000,10,0,0,0,2),   
 
 |   
 
 
 
 |