- 好友
- 3
- 在线时间
- 27 小时
- 最后登录
- 2025-9-3
贵族[MOD作者]
  
- UID
- 3048044
- 第纳尔
- 2224
- 精华
- 0
- 互助
- 19
- 荣誉
- 3
- 贡献
- 20
- 魅力
- 495
- 注册时间
- 2018-12-15
 鲜花( 43)  鸡蛋( 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),
|
|