- 好友
- 3
- 在线时间
- 27 小时
- 最后登录
- 2025-12-17
贵族[MOD作者]
  
- UID
- 3048044
- 第纳尔
- 2229
- 精华
- 0
- 互助
- 21
- 荣誉
- 3
- 贡献
- 20
- 魅力
- 516
- 注册时间
- 2018-12-15
 鲜花( 46)  鸡蛋( 0)
|
大家好啊,我是宇宙人,今天来点大家想看的东西
众所周知tab补箭、卡距离、提纯是个被用烂的机制,而且无数作者对这个脚本通过无数种手段进行了n+1种爆改来限制,本文会在下面对这个脚本的基础效果给出解析和修改建议/方向。
这个"结算时造成伤亡"的逻辑实际上是在判断的瞬间对全场的双方单位造成一定伤害,然后在打死的瞬间弹出那个损失窗口,具体流程下面会给出详细解析。
# script_simulate_retreat
# Input: arg1 = players_side_damage, arg2 = enemy_side_damage, arg3 = continue_battle s5 = title_string ##调用时的三个参数分别对应了"玩家方会对敌方造成的伤害命中率"、“敌方会对玩家方的伤害命中率”和"撤退后会不会解除接触"
# Output: none
("simulate_retreat",
[
(call_script, "script_music_set_situation_with_culture", mtf_sit_killed),
(set_show_messages, 0),
(store_script_param, ":players_side_damage", 1),
(store_script_param, ":enemy_side_damage", 2),
(store_script_param, ":continue_battle", 3),
(assign, ":players_side_strength", 0),##重置双方的战斗力
(assign, ":enemy_side_strength", 0),
(assign, ":do_calculate", 1),
(try_begin),
(try_for_agents, ":cur_agent"),##遍历全场兵种一次
(agent_is_human, ":cur_agent"),
(agent_is_alive, ":cur_agent"),
(agent_set_slot, ":cur_agent", slot_agent_is_alive_before_retreat, 1),#needed for simulation
(agent_get_troop_id, ":cur_troop", ":cur_agent"),
(store_character_level, ":cur_level", ":cur_troop"),
(val_add, ":cur_level", 5),##获取兵种的等级+5
(try_begin),
(troop_is_hero, ":cur_troop"),
(val_add, ":cur_level", 5),##如果是NPC,再+5
(try_end),
(try_begin),
(agent_is_ally, ":cur_agent"),##是友军加到友方的战斗力里
(val_add, ":players_side_strength", ":cur_level"),
(else_try),##否则加到敌方的战斗力里(这里算是有修改空间的,因为按理说应该是需要忽略一下中立team的)
(val_add, ":enemy_side_strength", ":cur_level"),
(try_end),
(try_end),
(eq, "$pin_player_fallen", 0),##如果玩家倒地了
(lt, ":enemy_side_strength", ":players_side_strength"),##而且友军战斗力比敌方高
(eq, ":continue_battle", 1),##而且战斗没有结束(没赢)
(assign, ":do_calculate", 0),##则不会进行伤害结算(模拟玩家被抱走)
(try_end),
(try_begin),
(eq, ":do_calculate", 1),##如果要进行伤害结算
(assign, "$g_last_mission_player_damage", 0),##重置"玩家受到的伤害"
(party_clear, "p_temp_party"),##重置结算部队(就是战后统计两边似了躺了多少人的部分)
(party_clear, "p_temp_party_2"),
(call_script, "script_simulate_battle_with_agents_aux", 0, ":players_side_damage"),##先计算友军攻击敌军造成的伤害(见第二个折叠部分)
(call_script, "script_simulate_battle_with_agents_aux", 1, ":enemy_side_damage"),##然后计算敌军攻击友军造成的伤害
(assign, ":display_casualties", 0),##默认不显示撤退伤亡
(try_begin),
(gt, "$g_last_mission_player_damage", 0),##如果玩家挨打了会提醒一下被打了多少伤害
(assign, ":display_casualties", 1),
(assign, reg1, "$g_last_mission_player_damage"),
(str_store_string, s12, "str_casualty_display_hp"),
(else_try),
(str_clear, s12),##否则这个文本寄存器清空当无事发生
(try_end),
(call_script, "script_print_casualties_to_s0", "p_temp_party", 1),##写记录伤亡人数文本的脚本,这里不列出
(try_begin),
(party_get_num_companion_stacks, ":num_stacks", "p_temp_party"),##如果玩家方死人或被击晕会显示这个伤亡计算
(gt, ":num_stacks", 0),
(assign, ":display_casualties", 1),
(try_end),
(str_store_string_reg, s10, s0),
(call_script, "script_print_casualties_to_s0", "p_temp_party_2", 1),
(try_begin),
(party_get_num_companion_stacks, ":num_stacks", "p_temp_party_2"),##如果敌方死人或被击晕会显示这个伤亡计算
(gt, ":num_stacks", 0),
(assign, ":display_casualties", 1),
(try_end),
(str_store_string_reg, s11, s0),
(try_begin),
(eq, ":display_casualties", 1),
(dialog_box,"str_casualty_display", s5),
(try_end),
(try_end),
(set_show_messages, 1),
#Calculating morale penalty (can be between 0-30) ##计算撤退导致的士气变化
(assign, ":ally_casualties", 0),##重置友方伤亡
(assign, ":enemy_casualties", 0),##重置敌方伤亡
(assign, ":total_allies", 0),##重置"友军总人数"
(try_for_agents, ":cur_agent"),##遍历全场兵种
(agent_is_human, ":cur_agent"),
(try_begin),
(agent_is_ally, ":cur_agent"),
(val_add, ":total_allies", 1),##是友军就+1
(try_begin),
(neg|agent_is_alive, ":cur_agent"),
(val_add, ":ally_casualties", 1),##如果是友军,似了记录进友方伤亡
(try_end),
(else_try),
(neg|agent_is_alive, ":cur_agent"),
(val_add, ":enemy_casualties", 1),##如果是敌军似了记录进敌方伤亡
(try_end),
(try_end),
(store_add, ":total_casualties", ":ally_casualties", ":enemy_casualties"),##计算伤亡之合,如果友军死得多是正数,敌人死得多是负数
(try_begin),
(gt, ":total_casualties", 0),##如果友军死得比较多
(store_mul, ":morale_adder", ":ally_casualties", 100),##记录友军伤亡数x100
(val_div, ":morale_adder", ":total_casualties"),##除以总伤亡数
(val_mul, ":morale_adder", ":ally_casualties"),##乘以友军伤亡数
(val_div, ":morale_adder", ":total_allies"),##除以友军总数
(val_mul, ":morale_adder", -30),##乘以-30
(val_div, ":morale_adder", 100),##除100
(call_script, "script_change_player_party_morale", ":morale_adder"),##设定士气变化
#####整合一下的话,公式是(友军伤亡/总伤亡数)*(友军伤亡/友军总数)*-30,人话:敌军死得多没奖励,友军死得多有惩罚
(try_end),
]),
|
("simulate_battle_with_agents_aux",
[
(store_script_param_1, ":attacker_side"),##哪一方造成伤害
(store_script_param_2, ":damage"),##会造成多少伤害
(get_player_agent_no, ":player_agent"),##获取玩家的单位id
(try_for_agents, ":cur_agent"),##遍历打人的兵种
(neq, ":player_agent", ":cur_agent"),##这个"撤退时造成伤害"不带玩家玩
(agent_is_human, ":cur_agent"),##是人类不是马
#do not check agent_is_alive, check slot_agent_is_alive_before_retreat instead, so that dead agents can still hit enemies
#↑亡语这一块,这里不检查兵种是否活着,因为是玩家友军先造成伤害,所以这里防止玩家友军直接把敌军打死了导致计算敌军造成伤害时造成的伤害变低
(agent_slot_eq, ":cur_agent", slot_agent_is_alive_before_retreat, 1),##用这个替代兵种是否活着进行检测
(try_begin),##区分双方阵营
(agent_is_ally, ":cur_agent"),
(assign, ":cur_agents_side", 0),
(else_try),
(assign, ":cur_agents_side", 1),
(try_end),
(eq, ":cur_agents_side", ":attacker_side"),##如果单位的阵营是攻击方继续计算
(agent_get_position, pos2, ":cur_agent"),
(assign, ":closest_agent", -1),
(assign, ":min_distance", 100000),##设置一个最大攻击捕捉范围(100米)
(try_for_agents, ":cur_agent_2"),##遍历要打的目标
(agent_is_human, ":cur_agent_2"),
(agent_is_alive, ":cur_agent_2"),##要打的目标是人,而且是活着的
(try_begin),
(agent_is_ally, ":cur_agent_2"),##确定要打的人的分类,友军是1否则是0,没有中立
(assign, ":cur_agents_side_2", 0),
(else_try),
(assign, ":cur_agents_side_2", 1),
(try_end),
(this_or_next|neq, ":cur_agent_2", ":player_agent"),##只有在这个要打的人不是玩家的情况下或者玩家没死的情况下继续计算(检测玩家)
(eq, "$pin_player_fallen", 0),
(neq, ":attacker_side", ":cur_agents_side_2"),##不是自己人
(agent_get_position, pos3, ":cur_agent_2"),##获取位置
(get_distance_between_positions, ":cur_distance", pos2, pos3),
(lt, ":cur_distance", ":min_distance"),
(assign, ":min_distance", ":cur_distance"),
(assign, ":closest_agent", ":cur_agent_2"),##如果这个距离自己最近,就打他
(try_end),##结束循环,这个时候正常情况下已经抓到要打的人了
(ge, ":closest_agent", 0),##如果有要打的人
#Fight
(agent_get_class, ":agent_class", ":cur_agent"),
(assign, ":agents_speed", 1),##默认速度为1
(assign, ":agents_additional_hit", 0),##重置额外伤害
(try_begin),
(eq, ":agent_class", grc_archers),##是射手分组会多打2次
(assign, ":agents_additional_hit", 2),
(else_try),
(eq, ":agent_class", grc_cavalry),##是骑兵分组的话计算速度时攻击方速度+2
(assign, ":agents_speed", 2),
(try_end),
(agent_get_class, ":agent_class", ":closest_agent"),
(assign, ":agents_speed_2", 1),
(try_begin),
(eq, ":agent_class", grc_cavalry),
(assign, ":agents_speed_2", 2),##挨打的如果是骑兵,防御方速度+2
(try_end),
(assign, ":agents_hit", 18000),##设定最大攻击次数的距离为180米
(val_add, ":min_distance", 3000),##把攻击者和受击者的距离+30米(模拟正在拉开距离)
(val_div, ":agents_hit", ":min_distance"),##最大攻击距离/双方距离
(val_mul, ":agents_hit", 2),# max 10, min 2 hits within 150 meters 然后把这个攻击距离x2,算出攻击倍率
###举个例子,假设双方距离20米,根据这个计算就是18000/5000=3.6,再x2,能打出7.2次的伤害,不过众所周知傻福骑砍是没有小数的,所以是6倍,根据这个计算极限情况下能打出12次伤害
(val_mul, ":agents_hit", ":agents_speed"),
(val_div, ":agents_hit", ":agents_speed_2"),
###然后开始计算双方的相对速度,只有骑兵参与计算,所以情况就是骑兵打非骑兵伤害次数x2,非骑兵打骑兵伤害次数/2,骑兵打骑兵伤害不变
(val_add, ":agents_hit", ":agents_additional_hit"),##然后计算额外加伤,就是弓箭手的那个固定+2次伤害
(assign, ":cur_damage", ":damage"),##这个命中率是之前预留好的,比如说主动撤退的话就是友军对敌人5命中率,敌人对友军20命中率
(agent_get_troop_id, ":closest_troop", ":closest_agent"),
(agent_get_troop_id, ":cur_troop", ":cur_agent"),
(store_character_level, ":closest_level", ":closest_troop"),
(store_character_level, ":cur_level", ":cur_troop"),
(store_sub, ":level_dif", ":cur_level", ":closest_level"),##获取双方的等级差距(攻击者等级高多造成伤害,等级低反之)
(val_div, ":level_dif", 5),##将等级差除以五倍
(val_add, ":cur_damage", ":level_dif"),##加到命中率中,高级兵更容易命中
(try_begin),
(eq, ":closest_agent", ":player_agent"),##如果打的是玩家,命中率减半
(val_div, ":cur_damage", 2),
(store_agent_hit_points, ":init_player_hit_points", ":player_agent", 1),
(try_end),
(try_for_range, ":unused", 0, ":agents_hit"),##可以打几次就循环几次
(store_random_in_range, ":random_damage", 0, 100),
(lt, ":random_damage", ":cur_damage"),##如果命中率>随机数,造成一次伤害(用对应兵种装备的武器)
(agent_deliver_damage_to_agent, ":cur_agent", ":closest_agent"),
(try_end),
(try_begin),
(eq, ":closest_agent", ":player_agent"),
(store_agent_hit_points, ":final_player_hit_points", ":player_agent", 1),
(store_sub, ":hit_points_difference", ":init_player_hit_points", ":final_player_hit_points"),##如果打的是玩家调整玩家撤退时的血量
(val_add, "$g_last_mission_player_damage", ":hit_points_difference"),
(try_end),
(neg|agent_is_alive, ":closest_agent"),##如果打死了,根据阵营安排存储部队收尸
(try_begin),
(eq, ":attacker_side", 1),
(party_add_members, "p_temp_party", ":closest_troop", 1),
(try_begin),
(agent_is_wounded, ":closest_agent"),
(party_wound_members, "p_temp_party", ":closest_troop", 1),
(try_end),
(else_try),
(party_add_members, "p_temp_party_2", ":closest_troop", 1),
(try_begin),
(agent_is_wounded, ":closest_agent"),
(party_wound_members, "p_temp_party_2", ":closest_troop", 1),
(try_end),
(try_end),
(try_end),
]),
|
|
鲜花鸡蛋阿泰尔.奥迪托雷 在 昨天 21:24 送朵鲜花 并说:我非常同意你的观点,送朵鲜花鼓励一下
|