本帖最后由 mod学徒 于 2022-2-24 19:34 编辑
最近玩骑砍时发现了战团里一个挺恶心的机制。
- #Now loot the defeated party
- (store_mul, ":loot_probability", player_loot_share, 3),#30
- (val_mul, ":loot_probability", "$g_strength_contribution_of_player"),#x玩家贡献值
- (party_get_skill_level, ":player_party_looting", "p_main_party", "skl_looting"),#获取队伍掠夺等级
- (val_add, ":player_party_looting", 10),#掠夺等级+10
- (val_mul, ":loot_probability", ":player_party_looting"),#掠夺概率x掠夺等级
- (val_div, ":loot_probability", 10),#除以10
- (val_div, ":loot_probability", ":num_player_party_shares"),#除以队伍股份数
- (party_get_num_companion_stacks, ":num_stacks",":enemy_party"),#获取敌人堆数
- (try_for_range, ":i_stack", 0, ":num_stacks"),#循环
- (party_stack_get_troop_id, ":stack_troop",":enemy_party",":i_stack"),#获取trpid
- (neg|troop_is_hero, ":stack_troop"),#不是英雄
- (party_stack_get_size, ":stack_size",":enemy_party",":i_stack"),#获取规模
- (try_for_range, ":unused", 0, ":stack_size"),#遍历每一个人
- (troop_loot_troop, "trp_temp_troop", ":stack_troop", ":loot_probability"),#疯狂掠夺
- (try_end),
- (try_end),
复制代码 众所周知,战利品结算计算掠夺率的时候,要除以队伍的股份数,战团里定义的玩家占十份,英雄占有三份,小兵占有一份。但是战利品结算是在俘虏结算之后的,因此解救的俘虏也会算入这个股份中,比如玩家三十人很艰难的击败了二百人带二百俘虏的一支队伍,但是因为玩家解救了这二百名俘虏,玩家队伍的股份数量上升了二百,导致战利品只有寥寥几件。非常不合理(都没出力,还想分一杯羹?脸都不要了)
因此我开始了探索:
探索1:把战利品结算界面提前到解救俘虏之前。
但是我在prsns里似乎没有找到相应的东西(本人对prsn了解不深,如果有误,希望各位指正),所以这个方案放弃了
探索2:对脚本script_party_calculate_loot:#战利品计算
script_calculate_main_party_shares:#计算股份进行探索
计算股份脚本是在战利品计算中调用的,而算出的股份是存在reg0这个寄存器中,由于reg0是全局性的,我就想到把股份计算提前,只能放到战斗胜利结算菜单处
在game_menus的"battle_debrief"菜单里,找到最后的"continue"按钮,在(jump_to_menu, "$g_next_menu"),后加入如下代码
- (call_script, "script_calculate_main_party_shares"),(display_message,"@{reg0}"),
复制代码 暂时不删除script_party_calculate_loot:#战利品计算中的股份计算脚本,先在其中加入如下语段
- #script_party_calculate_loot:#战利品计算
- # INPUT:
- # param1: Party-id
- # Returns num looted items in reg0
- ("party_calculate_loot",
- [
- (store_script_param_1, ":enemy_party"), #Enemy Party_id #敌人的party_id
-
- (call_script, "script_calculate_main_party_shares"),#计算股份
- (assign, ":num_player_party_shares", reg0),(display_message,"@{reg0}"),
复制代码 进入游戏测试后,发现如果在战后解救了俘虏,输出的数字果然不同,验证了我最开始的猜想。然后我删除了script_party_calculate_loot:#战利品计算中的股份计算,只保留(assign, ":num_player_party_shares", reg0),赋值语句。再次进游戏测试,发现了一个问题,两次输出的文字依然不同,第一次输出的数字和原玩家部队股份相同,第二次输出的数字却很奇怪,和股份已经毫无关系,我想到可能是在战斗胜利菜单到俘虏结算这个过程中,reg0被其他东西占用,于是我做出了如下改动。
- #script_calculate_main_party_shares:#计算股份
- # INPUT:
- # Returns number of player party shares in reg65 #计算股份
- ("calculate_main_party_shares",
- [
- (assign, ":num_player_party_shares", player_loot_share),
- # Add shares for player's party
- (party_get_num_companion_stacks, ":num_stacks", "p_main_party"),#获取玩家部队堆数量
- (try_for_range, ":i_stack", 1, ":num_stacks"),#循环除了玩家的其他堆
- (party_stack_get_troop_id, ":stack_troop", "p_main_party", ":i_stack"),#获取trpid
- (try_begin),
- (neg|troop_is_hero, ":stack_troop"),#如果不是英雄
- (party_stack_get_size, ":stack_size","p_main_party",":i_stack"),#获取数量
- (val_add, ":num_player_party_shares", ":stack_size"),#加上1个股份,
- (else_try),
- (val_add, ":num_player_party_shares", hero_loot_share),#是英雄就加上英雄股份
- (try_end),
- (try_end),
- (assign, reg65, ":num_player_party_shares"),
复制代码- ("continue",[],"Continue...",[(jump_to_menu, "$g_next_menu"), (call_script, "script_calculate_main_party_shares"),#计算股份
- (display_message,"@{reg65}"),]),
- ]
- ),
复制代码- #script_party_calculate_loot:#战利品计算
- # INPUT:
- # param1: Party-id
- # Returns num looted items in reg0
- ("party_calculate_loot",
- [
- (store_script_param_1, ":enemy_party"), #Enemy Party_id #敌人的party_id
- # (call_script, "script_calculate_main_party_shares"),#计算股份
- (assign, ":num_player_party_shares", reg65),
- (display_message,"@{reg65}"),
复制代码 将这个寄存器替换为了reg65这个不常用的寄存器,再进行测试,发现无论是否解救俘虏,两次输出的数字都是原玩家部队股份的值了,战利品也不会变少了。
头一次发这类帖子,主要想和各位大佬讨论一下这个机制,如果我以上研究有误,也希望各位大佬指正!
|