本帖最后由 黑暗路西法 于 2025-1-26 20:43 编辑
众所周知,骑砍原版的士气系统是很抽象的,而且是抽象到一种境界了,这个设定只在野战被应用
具体多抽象我可以给你们看看原版的算法:(不爱研究的可以跳过这部分直接到下面看代码)
我们先看看战团在mt里的源码
(assign, ":initial_courage_score", 5000),
(agent_get_troop_id, ":troop_id", ":agent_no"),
(store_character_level, ":troop_level", ":troop_id"),
(val_mul, ":troop_level", 35),
(val_add, ":initial_courage_score", ":troop_level"), #average : 20 * 35 = 700
(store_random_in_range, ":randomized_addition_courage", 0, 3000), #average : 1500
(val_add, ":initial_courage_score", ":randomized_addition_courage"),
(agent_get_party_id, ":agent_party", ":agent_no"),
(ge,":agent_party",0),
(party_get_morale, ":cur_morale", ":agent_party"),
(store_sub, ":morale_effect_on_courage", ":cur_morale", 70),
(val_mul, ":morale_effect_on_courage", 30), #this can effect morale with -2100..900
(val_add, ":initial_courage_score", ":morale_effect_on_courage"),
#average = 5000 + 700 + 1500 = 7200; min : 5700, max : 8700
#morale effect = min : -2100(party morale is 0), average : 0(party morale is 70), max : 900(party morale is 100)
#min starting : 3600, max starting : 9600, average starting : 7200
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":initial_courage_score"),
换句话说,我们假设是28级的斯骑,而且玩家士气正常的状态下,这个斯骑自身导致的全家桶在里面都不超过1200,也就是说实际上不管是玩家士气还是兵种属性都不重要,不如我们电脑的大手一挥随机0到3000的系数重要,更不如一人一个5000基准值重要
综上所述其实原版的士气额外的算法就是个笑话,因为士兵就算拉满到62级他也就2100多的士气,而这个数连人手一个5000的一半都不到,不如搞个提成给那个0到3000的随机数改大点。
然后我们看看死亡导致的aoe扣士气部分(节选算法部分)
(le, ":dist", 1300), # to count number of allies within 13 meters to dead agent.
(try_begin),
(eq, ":is_dead_agent_ally", ":is_agent_ally"),
(val_add, ":number_of_near_allies_to_dead_agent", 1), # (number_of_near_allies_to_dead_agent) is counted because if there are #孩子们,这部分算队友的士气甚至没去重,也就是说死人也能给人一种安心感,泪目了
(try_end), # many allies of dead agent around him, negative courage effect become less.
(try_begin), # each agent is effected by a killed agent positively if he is rival or negatively if he is ally.
(neq, ":is_dead_agent_ally", ":is_agent_ally"),
(assign, ":agent_delta_courage_score", 10), # if killed agent is agent of rival side, add points to fear score
(else_try),
(assign, ":agent_delta_courage_score", -15), # if killed agent is agent of our side, decrease points from fear score
(val_add, ":agent_delta_courage_score", ":number_of_near_allies_to_dead_agent"), # ":number_of_near_allies_to_dead_agent" is added because if there are many
(try_begin), # allies of dead agent around him, negative courage effect become less.
(gt, ":agent_delta_courage_score", -5),
(assign, ":agent_delta_courage_score", -5),
(try_end),
(agent_get_slot, ":dead_agent_was_running_away_or_not", ":dead_agent_no", slot_agent_is_running_away), #look dead agent was running away or not.
(try_begin),
(eq, ":dead_agent_was_running_away_or_not", 1),
(val_div, ":agent_delta_courage_score", 3), # if killed agent was running away his negative effect on ally courage scores become very less. This added because
(try_end), # running away agents are easily killed and courage scores become very in a running away group after a time, and
(try_end), # they do not stop running away althought they pass near a new powerfull ally party.
(agent_get_position, pos1, ":agent_no"),
(get_distance_between_positions, ":dist", pos0, pos1),
###又到了大伙最爱的穷举环节
(try_begin),
(lt, ":dist", 100), #0-1 meters
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 150),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(else_try),
(lt, ":dist", 200), #2 meters
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 120),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(else_try),
(lt, ":dist", 300), #3 meter
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 100),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(else_try),
(lt, ":dist", 400), #4 meters
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 90),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(else_try),
(lt, ":dist", 600), #5-6 meters
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 80),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(else_try),
(lt, ":dist", 800), #7-8 meters
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 70),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(else_try),
(lt, ":dist", 1000), #9-10 meters
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 60),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(else_try),
(lt, ":dist", 1500), #11-15 meter
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 50),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(else_try),
(lt, ":dist", 2500), #16-25 meters
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 40),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(else_try),
(lt, ":dist", 4000), #26-40 meters
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 30),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(else_try),
(lt, ":dist", 6500), #41-65 meters
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 20),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(else_try),
(lt, ":dist", 10000), #61-100 meters
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_mul, ":agent_delta_courage_score", 10),
(val_add, ":agent_courage_score", ":agent_delta_courage_score"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(try_end),
接下来我们看另一部分
(store_agent_hit_points, ":agent_hit_points", ":cur_agent"),
(val_mul, ":agent_hit_points", 5),
(try_begin),
(agent_is_ally, ":cur_agent"),
(val_sub, ":agent_hit_points", 100), #ally agents will be more tend to run away, to make game more funnier/harder
(try_end),
(val_mul, ":agent_hit_points", 10),
(store_sub, ":start_running_away_courage_score_limit", 5000, ":agent_hit_points"),
(lt, ":agent_courage_score", ":start_running_away_courage_score_limit"), #if (courage score < 3500 - (agent hit points * 40)) and (agent is not running away) then start running away, average hit points : 50, average running away limit = 1500
我们粗略的算一下,按照他这个牛大了的算法,把战团的28级斯瓦迪亚骑士全家桶随机数取平均值应该是5000+1200+1500=7700,也就是说理论上你需要在他3米内零散的情况下,他有四个队友,三米半径砍死4个人能扣掉他5000士气,最后再给他一个大的他才有可能逃跑
看起来骑士士气高昂很合理是不是,那如果我们换算一下发现4级老农的平均值是5000+1200+140=6340,和骑士只相差一个半死人,是不是变味了
这个士气算法就导致除非远程压制和单刷否则不太可能看到兵种溃逃,导致某种意义上来说阵亡杀伤士气设定最大的用处是吃算力,不如隔段时间根据兵种等级去循一下兵种血量百分比来的实在
然后逃兵计算部分阿凉大大也批判过了,具体看这里,突出一个意义不明
|
然后我为了解决这个士气算法既吃算力又不能让兵种真跑的问题,嗯造了一套基于兵种血量差异的、能让兵种根据战场局势跑路的士气设定
先是准备工作
troop slot部分(这个会在开局定义)
slot_troop_courage = 200#(你找个非重合的就行,constant常识就不复读了)
没了,原版的
slot_agent_is_running_away
slot_agent_courage_score
是定义好的不用改,但是因为我捉拿逃兵那里参考了凉大的代码所以你还需要根据凉大的代码在
item slot部分里加上
slot_item_temp_slot =62 #战场士气暂存器
agent slot部分里加上
slot_agent_max_health =61 #兵种最大血量,用于现算士气
slot_agent_temp_slot =62 #兵种影响暂存器
|
接下来是script部分
首先是初始化脚本,随便在start里加上或者开局trigger跑一下就行
我制作士气系统是基于兵种血量的,你可以尽情在这里通过你设置的其它参数修改
("set_troop_courage",
[
(assign,":new_courage",350),#基准35血,下面参数都根据自己的mod情况设置
(store_skill_level,":ironflesh_level",skl_ironflesh,":troop"),
(val_mul,":ironflesh_level",20),#一铁骨多少血
(val_add,":new_courage",":ironflesh_level"),
(store_attribute_level,":strength",":troop",ca_strength),
(val_mul,":strength",10),#一力量多少血
(val_add,":new_courage",":strength"),
(store_character_level,":level",":troop"),
(val_div,":level",5),#每5级增加25%
(val_add,":level",4),
(val_mul,":new_courage",":level"),
(val_div,":new_courage",4),
(try_begin),
(troop_is_hero,":troop"),
(val_mul,":new_courage",2),#npc更加稳定
(try_end),
(val_add,":new_courage",100),#所有兵种获得一个等级判定之外的100点士气加成
]),
|
然后是原版的替换部分,你可以根据自己需求修改
#这部分计算我是参考了阿凉的逃兵用item暂存,所以需要用物品注册一下
("apply_effect_of_other_people_on_courage_scores_new",
[
(store_script_param, ":rout_num", 1),
(get_player_agent_no, ":player_agent"),
#count agent_delta_courage_score first, save to slot_agent_temp_slot
(try_for_agents, ":agent_no"),
(agent_is_human, ":agent_no"),
(agent_is_alive, ":agent_no"),
(agent_set_slot,":agent_no",slot_agent_temp_slot,0),#ini 凉大部分
(agent_get_slot, ":agent_is_running_away_or_not", ":agent_no", slot_agent_is_running_away),
(agent_get_troop_id,":agent_troop", ":agent_no"),#获取兵种
(try_begin),
(eq, ":agent_no", ":player_agent"),
(assign, ":agent_delta_courage_score", 250), #玩家永远有250%的士气倍率
(else_try),
(agent_get_troop_id, ":troop_id", ":agent_no"),
(troop_is_hero, ":troop_id"),
#英雄单位永远有比较高的影响(前提是他没跑)
(try_begin),
(lt, ":agent_is_running_away_or_not", 1), #if agent is not running away
(store_agent_hit_points, ":agent_hit_points", ":agent_no"),
(try_begin),
(is_between,":agent_troop",kings_begin,kings_end),
(assign, ":agent_delta_courage_score", 5000),#国王永远5000
(else_try),
(is_between,":agent_troop",lords_begin,lords_end),
(assign, ":agent_delta_courage_score", 2500),#领主永远2500
(else_try),#普通npc士气计算
(try_begin),
(eq, ":agent_hit_points", 100),
(assign, ":agent_delta_courage_score", 200),
(else_try),
(ge, ":agent_hit_points", 75),
(assign, ":agent_delta_courage_score", 150),
(else_try),
(ge, ":agent_hit_points", 60),
(assign, ":agent_delta_courage_score", 120),
(else_try),
(ge, ":agent_hit_points", 45),
(assign, ":agent_delta_courage_score", 80),
(else_try),
(ge, ":agent_hit_points", 30),
(assign, ":agent_delta_courage_score", 60),
(else_try),
(ge, ":agent_hit_points", 15),
(assign, ":agent_delta_courage_score", 50),
(try_end),
(try_end),
(else_try),
(ge, ":agent_is_running_away_or_not", 1), #正在逃命则根据其生命值决定
(store_agent_hit_points, ":agent_hit_points", ":agent_no"),
(assign, ":agent_delta_courage_score", ":agent_hit_points"),
(try_end),
(else_try),
#普通单位对其他人的影响会根据生命值决定
(try_begin),
(lt, ":agent_is_running_away_or_not", 1), # 如果他没跑
(store_agent_hit_points, ":agent_hit_points", ":agent_no",0),#按照他的百分比决定
(assign, ":agent_delta_courage_score", ":agent_hit_points"),
(else_try),
(assign, ":agent_delta_courage_score", 100), #逃兵永远让人印象深刻
(try_end),
(try_end),
(agent_set_slot,":agent_no",slot_agent_temp_slot,":agent_delta_courage_score"),#储存到他的“士气影响slot”里
(try_end),
#try for running agents
(set_fixed_point_multiplier,1000),
(try_for_range,":agent_item_no",0,":rout_num"),#这个循环是只循环逃兵,在mt里有定义
(item_get_slot,":centered_agent_no",":agent_item_no",slot_item_temp_slot),
(agent_get_troop_id,":agent_1_troop",":centered_agent_no"),
#check again
(agent_is_human, ":centered_agent_no"),
(agent_is_alive, ":centered_agent_no"),
(neg|agent_is_routed,":centered_agent_no"),
(store_character_level,":agent_1_level",":agent_1_troop"),#获取观察者等级
(agent_get_position, pos2, ":centered_agent_no"),
(agent_get_team,":centered_agent_team",":centered_agent_no"),
(agent_get_slot, ":centered_agent_courage_score", ":centered_agent_no", slot_agent_courage_score),
(agent_get_slot,":centered_agent_delta_courage_score",":centered_agent_no",slot_agent_temp_slot),#获取逃跑者的影响参数
(try_for_agents, ":agent_no",pos2,40*1000),#检查40米之内
(agent_is_human, ":agent_no"),
(agent_is_alive, ":agent_no"),
(neq, ":centered_agent_no", ":agent_no"),
(agent_get_team,":agent_team", ":agent_no"),
(agent_get_troop_id,":agent_2_troop",":agent_no"),
(try_begin),
#如果不是敌人则根据自己人的状态判定
(neg|teams_are_enemies,":centered_agent_team",":agent_team"),
(agent_get_slot,":agent_delta_courage_score",":agent_no",slot_agent_temp_slot),#获取观察者的血量参数
(val_max,":centered_agent_delta_courage_score",1),#获取之前保存的血量参数
#distance count
(agent_get_position, pos1, ":agent_no"),
(get_distance_between_positions, ":dist", pos2, pos1),
(store_character_level,":agent_2_level",":agent_2_troop"),#获取观察者等级
(agent_get_slot, ":agent_is_running_away_or_not", ":agent_no", slot_agent_is_running_away),
(try_begin),
(lt,":agent_is_running_away_or_not",1),
(store_sub,":number",4000,":dist"), #如果这个兵种没跑,能增加士气的话效果范围最多40米,根据兵种距离递减
(val_max,":number",0),
(val_mul, ":number", ":agent_2_level"),
(val_div,":number",4000),
(else_try),
(eq,":agent_is_running_away_or_not",1), #如果这个兵正在逃跑,则反之
(store_sub,":number",3000,":dist"),
(val_max,":number",600),
(val_mul,":number",-1),
(store_div, ":lev_3", ":agent_2_level",2),
(val_max,":lev_3",10),#正在润的兵种计算等级的1/2,最低10级(这样高级兵不会受到太多普通队友逃跑的影响)
(val_mul, ":number", ":lev_3"),
(val_div,":number",3000),
(try_end),
#set agent score
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),#这个是对队友的影响
(store_sub,":num",":agent_2_level",":agent_1_level"),#获取他和队友的等级差,即这个值越大说明越不会理睬小登
(try_begin),
(gt,":num",20),
(assign,":num_change",-5),#等级相差巨大的逃兵几乎不会对队友造成影响
(else_try),
(gt,":num",10),
(assign,":num_change",-10),#等级相对较低的逃兵不会影响本国的主力部队
(else_try),
(ge,":num",0),
(assign,":num_change",-15),#等级相差不大的逃兵只会稍微影响友军
(else_try),
(ge,":num",-7),
(assign,":num_change",-25),#等级有差距的逃兵开始影响友军
(else_try),
(ge,":num",-18),
(assign,":num_change",-40),#等级有差距的逃兵会部分影响友军
(else_try),
(ge,":num",-30),
(assign,":num_change",-60),#等级相差较大的逃兵会大幅度影响稍弱的友军
(else_try),
(assign,":num_change",-75),#等级相差巨大的逃兵会超大幅度影响很弱的友军
(try_end),
(val_mul,":agent_courage_score",":centered_agent_delta_courage_score"),#逃兵理论上影响力是100%
(val_div,":agent_courage_score",100),
(val_add,":agent_courage_score",":num_change"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(val_mul,":number",":agent_delta_courage_score"),#根据该兵种的状态来改变逃兵的士气
(val_div,":number",100),#按照之前的百分比计算倍率
#set center agent score
(val_add,":centered_agent_courage_score",":number"),#逃兵改变士气
(else_try),###############################################如果是敌人
(teams_are_enemies,":centered_agent_team",":agent_team"),
(agent_get_slot, ":agent_is_running_away_or_not", ":agent_no", slot_agent_is_running_away),
(lt,":agent_is_running_away_or_not",1),#敌人会获得士气,并降低逃兵的士气
(lt, ":dist", 4000),
(assign, ":agent_courage_score_add", -25),#否则根据距离扣一些,同时给敌人加点士气
(agent_get_slot,":agent_delta_courage_score",":agent_no",slot_agent_temp_slot),#获取敌人的影响参数
(val_mul,":agent_courage_score_add",":agent_delta_courage_score"),
(val_div,":agent_courage_score_add",100),
(val_add,":centered_agent_courage_score",":agent_courage_score_add"),
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_add,":agent_courage_score",15),#敌人看到对方逃兵增加士气
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(try_end),
(try_end),
(agent_set_slot, ":centered_agent_no", slot_agent_courage_score, ":centered_agent_courage_score"),#逃兵自己的士气结算
(try_end),
]),
|
接下来是替换原版的击杀士气影响
# script_apply_death_effect_on_courage_scores 击杀导致的士气影响
# Input: dead agent id, killer agent id
# Output: none
("apply_death_effect_on_courage_scores",
[
(store_script_param, ":dead_agent_no", 1),
(store_script_param, ":killer_agent_no", 2),
(agent_get_team,":dead_agent_team",":dead_agent_no"),
(agent_get_team,":killer_agent_team",":killer_agent_no"),
(agent_get_troop_id,":dead_agent_troop",":dead_agent_no"),
(store_faction_of_troop,":dead_troop_faction",":dead_agent_troop"),
(store_character_level,":dead_level",":dead_agent_troop"),
(agent_get_troop_id,":killer_agent_troop",":killer_agent_no"),
(assign,":killer_comp_change",0),
(assign,":killer_change",0),
(assign,":dead_change",0),
(try_begin),
(agent_is_human, ":dead_agent_no"),
(agent_is_human, ":killer_agent_no"),
(agent_is_alive, ":killer_agent_no"),
(agent_get_position, pos2, ":dead_agent_no"),
(agent_get_position, pos3, ":killer_agent_no"),
(get_distance_between_positions, ":dist", pos2, pos3),
(assign,":ranged",0),
(try_begin),#如果是远程击杀的话,造成的士气改变倍率降低,不然容易意义不明的连锁白
(gt,":dist",1000),
(assign,":ranged",1),
(try_end),
(assign, ":number_of_near_allies_to_dead_agent", 0),
(troop_get_slot,":dead_agent_courage",":dead_agent_troop",slot_troop_courage),
(val_div,":dead_agent_courage",10), #被击杀兵种的原始士气的10%将被作为基础参数,也就是说己方的大爹被杀对炮灰来说天都塌了,但炮灰被杀对高级兵没影响
(try_for_agents, ":agent_no"),
(lt, ":number_of_near_allies_to_dead_agent", 25), #附近有多于25个人结束判定
(agent_is_human, ":agent_no"),
(agent_is_alive, ":agent_no"),
(agent_get_position, pos1, ":agent_no"),
(get_distance_between_positions, ":dist", pos2, pos1),
(le, ":dist", 1000), #10米之内的友军绞肉会导致士气下降降低
(agent_get_team,":agent_team",":agent_no"),
(eq, ":dead_agent_team", ":agent_team"),
(val_add, ":number_of_near_allies_to_dead_agent", 1),
(try_end),
(try_for_agents, ":agent_no"),
(agent_is_human, ":agent_no"),
(agent_is_alive, ":agent_no"),
(agent_get_team,":watcher_agent_team",":agent_no"), #获取观看者的阵营,以便随时打断循环
(agent_get_position, pos1, ":agent_no"),
(assign,":limit_dist",0),
(try_begin),
(get_distance_between_positions, ":dist", pos3, pos1),#如果是击杀者一方的,那么根据击杀者的位置决定鼓舞效果
(eq, ":killer_agent_team", ":watcher_agent_team"),#鼓舞的范围最多18米
(assign,":limit_dist",1800),
(else_try),
(get_distance_between_positions, ":dist", pos2, pos1),#如果是被杀者一方的,那么根据击杀者的位置决定恐惧效果
(eq, ":dead_agent_team", ":watcher_agent_team"),#恐惧的范围最多25米
(assign,":limit_dist",2500),
(try_end),
(lt,":dist",":limit_dist"),#判定距离
(agent_get_troop_id,":watcher_agent_troop",":agent_no"),#获取观望兵种的阵营
(store_faction_of_troop,":watcher_troop_faction",":watcher_agent_troop"),
(store_character_level,":watcher_level",":watcher_agent_troop"),#获取观看者的等级
(try_begin), # each agent is effected by a killed agent positively if he is rival or negatively if he is ally.
(eq, ":watcher_agent_team", ":killer_agent_team"),
(try_begin),
(eq,":watcher_troop_faction",":dead_troop_faction"),#如果和死者是同一阵营,则获得的士气增幅减少
(assign, ":agent_delta_courage_score", 75),
(else_try),
(assign, ":agent_delta_courage_score", 100), #否则和击杀者队获得参数百分百的士气增加
(try_end),
(try_begin),
(lt,":dist",400), #靠得太近效果变成2倍
(val_mul, ":agent_delta_courage_score", 2),
(else_try),
(gt,":dist",1200), #靠得太远效果变成0.25倍
(val_div, ":agent_delta_courage_score", 4),
(else_try),
(gt,":dist",800), #靠得有点远效果变成0.5倍
(val_div, ":agent_delta_courage_score", 2),
(try_end),
(else_try),
(eq,":watcher_agent_team",":dead_agent_team"), #如果是被杀者阵营的,则士气减少
(try_begin),
(eq,":watcher_troop_faction",":dead_troop_faction"),#如果和死者是同一阵营,则下降幅度增加
(assign, ":agent_delta_courage_score", -125),
(else_try),
(assign, ":agent_delta_courage_score", -100), #否则为正常化
(try_end),
#根据kda比分扩大化影响,根据人头差最多让被杀方单位的士气倍率扩大100%(差距很大),每个kda比分差会影响0.5%,即双方的差距会因此拉大
(store_sub,":sub","$player_killed_num","$enemy_killed_num"),
(val_clamp,":sub",-200,201),
(try_begin),
(neg|agent_is_ally,":agent_no"),
(gt,":sub",0),#如果玩家方处于优势,那么多出来的部分自然是敌方劣势
(val_add,":sub",100),#开始百分比计算
(val_mul,":agent_delta_courage_score",":sub"),
(val_div,":agent_delta_courage_score",200),
(else_try),
(agent_is_ally,":agent_no"),
(val_mul,":sub",-1),#即如果玩家方陷入劣势,则把劣势转换为正数
(gt,":sub",0),
(val_add,":sub",100),
(val_mul,":agent_delta_courage_score",":sub"),
(val_div,":agent_delta_courage_score",200),
(try_end),
#落后200个人头这个击杀扣的士气最多变成3倍,俗称连锁白
(val_add,":agent_delta_courage_score",":number_of_near_allies_to_dead_agent"),#附近的友军最多可以将不利降低25%
(try_begin),
(agent_slot_ge, ":agent_no", slot_agent_is_running_away,1), #逃跑的兵种看到友军被杀效果+25%倍
(val_sub, ":agent_delta_courage_score", 25),
(try_end),
(try_begin),
(agent_slot_ge, ":dead_agent_no", slot_agent_is_running_away,1), #逃跑的兵种被杀不会过多影响友军,只有25%影响
(val_div, ":agent_delta_courage_score", 4),
(try_end),
(try_begin),
(lt,":dist",500), #靠得太近效果变成2倍
(val_mul, ":agent_delta_courage_score", 2),
#(val_div, ":agent_delta_courage_score", 2),
(else_try),
(gt,":dist",1700), #靠得太远效果变成33%
(val_div, ":agent_delta_courage_score", 3),
(else_try),
(gt,":dist",1200), #靠得有点远效果变成0.5倍
(val_div, ":agent_delta_courage_score", 2),
(try_end),
(else_try),
(assign, ":agent_delta_courage_score", -25),#两边都不是,旁边死人扣士气,25%效果
(try_end),
(try_begin),
(eq,":ranged",1),#远程击杀在击杀者周围只造成1/3的士气变动,在我的士气框架下会导致远程单位天然士气较低
(val_div, ":agent_delta_courage_score", 3),
(try_end),
(try_begin),
(eq, ":killer_agent_no", ":agent_no"),#击杀者获得的士气奖励翻3倍
(val_mul, ":agent_delta_courage_score", 3),
(try_end),
(store_mul,":add",":dead_agent_courage",":agent_delta_courage_score"),
(val_div,":add",100),#根据之前计算的死者基础士气的10%,和上面算的百分比变化其他单位士气
(agent_get_slot, ":agent_courage_score", ":agent_no", slot_agent_courage_score),
(val_add, ":agent_courage_score", ":add"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":agent_courage_score"),
(try_end),
(try_end),
]), #otto
|
最后是逃跑部分,原版的代码里只有这三个脚本涉及到兵种士气计算
("decide_run_away_or_not",
[
(store_script_param, ":cur_agent", 1),
(store_script_param, ":mission_time", 2),
(assign, ":force_retreat", 0),
(agent_get_team, ":agent_team", ":cur_agent"),
(agent_get_division, ":agent_division", ":cur_agent"),
(try_begin),
(lt, ":agent_division", 9), #获取命令看是不是假装跑
(team_get_movement_order, ":agent_movement_order", ":agent_team", ":agent_division"),
(eq, ":agent_movement_order", mordr_retreat),
(assign, ":force_retreat", 1),
(try_end),
(agent_get_slot, ":is_cur_agent_running_away", ":cur_agent", slot_agent_is_running_away),
(try_begin),
(eq, ":is_cur_agent_running_away", 0),#如果没跑
(try_begin),
(eq, ":force_retreat", 1),
(agent_start_running_away, ":cur_agent"),
(agent_set_slot, ":cur_agent", slot_agent_is_running_away, 1),
(else_try),
(ge, ":mission_time", 10), #10秒之后才会逃跑
(agent_get_slot, ":agent_courage_score", ":cur_agent", slot_agent_courage_score),#获取最大生命值,现算一次士气
(agent_get_slot, ":agent_max_health", ":cur_agent", slot_agent_max_health),
(assign,":hp_change",":agent_max_health"),
(store_random_in_range,":rand",25,50),
(val_mul,":agent_max_health",":rand"),#随机值,获取单位的生命的25%到50%作为兵种逃跑的阈值(也就是说等级越低的兵种哪怕是血牛也容易跑)
(val_div,":agent_max_health",10), #因为士气在结算生命的时候翻了十倍,所以这里只除以10
(val_min,":agent_max_health",750),#高级单位有最低逃跑士气要求
(lt,":agent_courage_score",":agent_max_health"),#如果单位士气值低于他通过体力换算的士气值阈值,开始逃窜
(agent_get_troop_id, ":troop_id", ":cur_agent"),
(assign,":continue",1),#假设这个兵种会逃跑
(try_begin),
(eq,"trp_player", ":troop_id"),#玩家不会溃逃
(assign,":continue",0),
(else_try),
(is_between,":troop_id", kings_begin,kings_end),#国王不会溃逃
(assign,":continue",0),
(try_end),
(eq,":continue",1),
(agent_start_running_away, ":cur_agent"),#开始溃逃
(agent_set_slot, ":cur_agent", slot_agent_is_running_away, 1),
(str_store_troop_name,s21,":troop_id"),
(assign,reg21,":agent_courage_score"),
(assign,reg22,":agent_max_health"),
(troop_get_slot,reg24,":troop_id",slot_troop_courage),
(try_end),
(else_try),#如果在跑
(neq, ":force_retreat", 1),#不是强制跑
(agent_get_slot, ":agent_courage_score", ":cur_agent", slot_agent_courage_score),#获取最大生命值,现算一次士气
(agent_get_slot, ":agent_max_health", ":cur_agent", slot_agent_max_health),
(assign,":rand",30),#随机值大于30就有机会停止逃跑
(val_max,":agent_courage_score",-100),#士气值最低-100,再低就不可能重新集结了
(val_mul,":agent_max_health",":rand"),#随机值,获取单位的生命25%到50%作为兵种停止逃跑的阈值
(val_div,":agent_max_health",10), #因为士气在结算生命的时候翻了十倍,所以这里只除以10
(try_begin),
(gt,":agent_courage_score",":agent_max_health"),#如果士气值高于他理论士气值的指定值,恢复正常状态
(agent_stop_running_away, ":cur_agent"),
(agent_set_slot, ":cur_agent", slot_agent_is_running_away, 0),
(else_try),
(val_add,":agent_courage_score",10),#逃跑中的单位继续缓慢恢复士气
(agent_set_slot, ":cur_agent", slot_agent_courage_score, ":agent_courage_score"),
(try_end),
(try_end),
]), #otto
|
接下来是mission template部分
在lead_charge这个场景下面找东西
搜索(val_add, ":initial_courage_score", ":troop_level"), #average : 20 * 35 = 700 (也就是原版那个池沼代码)
括号里的所有内容改成
(store_trigger_param_1, ":agent_no"),
(call_script, "script_agent_reassign_team", ":agent_no"),
(store_agent_hit_points,":hp_abs",":agent_no",1),#获得绝对值
(agent_set_slot, ":agent_no",slot_agent_max_health, ":hp_abs"), #设置最大血量,小兵默认是满的,英雄士气会受到血量影响
(agent_get_party_id,":agent_party",":agent_no"),
(agent_get_troop_id,":troop",":agent_no"),
(troop_get_slot,":courage_score",":troop",slot_troop_courage),
(store_mul,":max_num",":courage_score",3),
(store_mul,":min_num",":courage_score",2),#最低入场士气为最大士气值的40%
(val_div,":min_num",5),
(str_store_troop_name,s7,":troop"),
(assign,reg3,":courage_score"),
(try_begin),#战场优势变化,最多影响60%
(agent_is_ally,":agent_no"),#我方直接用战场优势劣势,否则反过来
(assign,":battle_infor","$use_battle_advantage"),
(val_clamp,":battle_infor",-15,50),#优势最高可以加200%士气,弱势情况下最低扣除60%
(try_begin),
(store_skill_level,":leadership",skl_leadership,"trp_player"),#一级统御抵消一战场劣势
(val_add,":battle_infor",":leadership"),
(val_min,":battle_infor",0),
(try_end),
(val_mul,":battle_infor",4),
(store_add,":num",":battle_infor",100),
(val_mul,":courage_score",":num"),
(val_div,":courage_score",100),
(else_try),
(neg|agent_is_ally,":agent_no"),
(store_mul,":battle_infor","$use_battle_advantage",-1),
(val_clamp,":battle_infor",-15,100),#敌方优势最高可以加400%士气,弱势情况下最低扣除60%
(try_begin),
(party_get_num_companion_stacks,":leader",":agent_party"),
(store_skill_level,":leadership",skl_leadership,":leader"),#一级统御抵消一战场劣势
(val_add,":battle_infor",":leadership"),
(val_min,":battle_infor",0),
(try_end),
(val_mul,":battle_infor",4),
(store_add,":num",":battle_infor",100),
(val_mul,":courage_score",":num"),
(val_div,":courage_score",100),
(try_end),
(assign,reg4,":courage_score"),
(try_begin), #部队士气影响
(agent_get_party_id, ":agent_party", ":agent_no"),
(ge,":agent_party",0),
(party_get_morale, ":cur_morale", ":agent_party"),
(val_mul,":cur_morale",15),#一级士气影响1.5
(try_begin),
(lt,":cur_morale",1000),
(party_get_num_companion_stacks,":leader",":agent_party"),#领袖每级战术抵消10%因为部队士气低落导致的士气降低
(store_skill_level,":tactic",skl_tactics,":leader"),
(store_sub,":sub",1000,":cur_morale"),
(val_mul,":sub",":tactic"),
(val_div,":sub",10),
(val_add,":cur_morale",":sub"),
(try_end),
(val_mul,":courage_score",":cur_morale"),
(val_div,":courage_score",1000),#在0到150%之间浮动,66%以上为正收益
(try_end),
(assign,reg5,":courage_score"),
(store_add,":total_kda","$player_killed_num","$enemy_killed_num"),#kda击杀计算,开局设置为0
(try_begin),#影响参数kda,单位为十万分之x,即kda差导致的变化
(gt,":total_kda",800),
(assign,":cause",150),#kda达到800人时,kda相差100人时,会导致新出场的单位士气直接降低15%,相差300人新上来的兵种直接我军败了
(else_try),
(gt,":total_kda",600),
(assign,":cause",100),
(else_try),
(gt,":total_kda",400),
(assign,":cause",75),
(else_try),
(gt,":total_kda",200),
(assign,":cause",50),
(else_try),
(gt,":total_kda",100),
(assign,":cause",25),#kda达到100人,且kda相差100人时,会导致新出场的单位士气直接降低2.5%
(else_try),
(assign,":cause",0),
(try_end),
(try_begin),
(agent_is_ally,":agent_no"),
(store_sub,":sub","$player_killed_num","$enemy_killed_num"),
(val_mul,":cause",":sub"),
(val_clamp,":cause",-50000,50000),
(val_mul,":cause",":courage_score"),#百分比计算
(val_div,":cause",100000),#最多影响50%系数
(val_add,":courage_score",":cause"),
(else_try),
(neg|agent_is_ally,":agent_no"),
(store_sub,":sub","$enemy_killed_num","$player_killed_num"),
(val_mul,":cause",":sub"),
(val_clamp,":cause",-50000,50000),
(val_mul,":cause",":courage_score"),#百分比计算
(val_div,":cause",100000),#最多影响50%系数
(val_add,":courage_score",":cause"),
(try_end),
(assign,reg6,":courage_score"),
(val_max,":courage_score",":min_num"),
(val_min,":courage_score",":max_num"),
(agent_set_slot, ":agent_no", slot_agent_courage_score, ":courage_score"),
这个脚本会初始化进场单位的士气
这个脚本是击杀单位导致的士气变化,搜索script_apply_death_effect_on_courage_scores就能找到
(ti_on_agent_killed_or_wounded, 0, 0, [],
[
(store_trigger_param_1, ":dead_agent_no"),
(store_trigger_param_2, ":killer_agent_no"),
(store_trigger_param_3, ":is_wounded"),
(try_begin),
(ge, ":dead_agent_no", 0),
(neg|agent_is_ally, ":dead_agent_no"),
(agent_is_human, ":dead_agent_no"),
(agent_get_troop_id, ":dead_agent_troop_id", ":dead_agent_no"),
(try_begin),
(agent_is_ally,":killer_agent_no"),
(val_add,"$player_killed_num",1),#我做的全局变量kda计数
(else_try),
(neg|agent_is_ally,":killer_agent_no"),
(val_add,"$enemy_killed_num",1),
(try_end),
(party_add_members, "p_total_enemy_casualties", ":dead_agent_troop_id", 1), #addition_to_p_total_enemy_casualties
(eq, ":is_wounded", 1),
(party_wound_members, "p_total_enemy_casualties", ":dead_agent_troop_id", 1),
(try_end),
(call_script, "script_apply_death_effect_on_courage_scores", ":dead_agent_no", ":killer_agent_no"),
]),
接下来可以参考凉大帖子里的说法
搜索script_apply_effect_of_other_people_on_courage_scores,给他触发器图了
然后下面加上一个新的
#====== 108 heroes begin ======
#change
(5, 0, 0, [
(get_player_agent_no, ":player_agent"),
(assign,":rout_num",0),
(try_for_agents, ":agent"),
(agent_is_human, ":agent"),
(agent_is_alive, ":agent"),
(neg|agent_is_routed,":agent"),
(neq, ":agent", ":player_agent"),
(agent_slot_eq, ":agent", slot_agent_is_running_away,1),
(item_set_slot,":rout_num",slot_item_temp_slot,":agent"),
(val_add,":rout_num",1),
(try_end),
(gt,":rout_num",0),
(call_script, "script_apply_effect_of_other_people_on_courage_scores_new",":rout_num"),#108 heroes changed
], [
]), #calculating and applying effect of people on others courage scores
#====== 108 heroes end ======
为了效果,你可以搜索(call_script, "script_decide_run_away_or_not", ":agent_no", ":mission_time"), 然后把里面的最低时间判定调小一点,这样就能看劣势方面对巨大优势的敌人搞史坦尼斯模拟器了
接下来我们添加一个重启部分和伤害判定部分
(ti_before_mission_start, 0,0, [], [
(assign,"$player_killed_num",0),#重置双方的kda差距
(assign,"$enemy_killed_num",0),
]),
然后在下方加上一个基于本士气系统的受到伤害降低士气判定
(ti_on_agent_hit, 0.000000, 0.000000,[],
[
(store_trigger_param_1, ":inflicted_agent"),
(store_trigger_param_2, ":dealer_agent"),
(store_trigger_param_3, ":inflicted_damage"),
(gt,":dealer_agent",0),
(gt,":inflicted_agent",0),
(gt,":inflicted_damage",0),
(agent_is_human, ":dealer_agent"),
(agent_is_human, ":inflicted_agent"),
(val_mul,":inflicted_damage_clone",10),#然后伤害翻十倍匹配机制
(agent_get_slot, ":agent_courage_score", ":inflicted_agent", slot_agent_courage_score),
(val_sub, ":agent_courage_score", ":inflicted_damage_clone"),#扣除士气,基础士气是血量的10倍+250点,所以等级越低越容易崩
(agent_set_slot, ":inflicted_agent", slot_agent_courage_score, ":agent_courage_score"),
]),
|
所有的设定大概就是这些,总之可能会有遗漏的部分或者我mod的独立设定在这里面唐突出现,而且不出意外会有优化空间,不过我是不会为此道歉的
2024-10-2-23:不出意外的出错了,store skill level的参数填错了,不过我是不会为此道歉的
|