赛马娘技能代码详解
阅读
2024-06-16更新
最新编辑:Neku_m
阅读:
更新日期:2024-06-16
最新编辑:Neku_m
按右上角“WIKI功能→编辑”即可修改页面内容。
技能释放机制
一个技能在满足所有的技能发动条件之后就会发动。因此,技能的发动条件不仅限制了技能在满足什么条件时才能发动,也限制了技能会在什么位置发动。
形如 Preconditions 的代码是技能的前置发动条件。有前置条件的技能,需要同时满足前置条件和发动条件才能发动。
这种情况下,一般前置条件用来描述技能的发动限制,而发动条件用来描述技能的发动位置。
藉由分离前置条件与发动条件,技能的发动位置变得更自由了。这是一周年更新时加入的新特性。
术语
道宽与马宽
赛道道宽如下:
赛道 | |
礼幌 | 1.35(草地) 1.1(沙地) |
函馆 | 1.47(草地) 1.1(沙地) |
新潟 | 1.35(草地) 1.1(沙地) |
福岛 | 1.3(草地) 1.15(沙地) |
中山 | 1.2(草地)1.2(沙地) |
东京 | 1.5(草地) 1.25(沙地) |
中京 | 1.44(草地) 1.3(沙地) |
京都 | 1.41(草地) 1.3(沙地) |
阪神 | 1.25(草地) 1.2(沙地) |
小仓 | 1.45(草地) 1.2(沙地) |
大井 | 1.2(沙地) |
川崎 | 1.35(沙地) |
船桥 | 1.35(沙地) |
盛岡 | 1.35(沙地) |
隆尚 | 1.2(草地) |
马身
Phase(阶段)
比赛赛道被按距离均分为24段并被进行编号,且一场比赛被划分为4个不同阶段。
在不同阶段,马娘的目标速度和行为都有所不同,有些技能只能在特定阶段发动。在游戏逻辑中,比赛阶段被编号为0 到 3。(对应phase=0,1,2,3)
- 序盘 (0): 对应1 – 4段。
- 中盘 (1): 对应5 – 16段。
- 终盘 (2): 对应17 – 20段。
- 最终冲刺段(3): 对应21 – 24段。 这一阶段等同于终盘的后半,不要与“最终冲刺”的概念混淆。
在一场比赛中,屏幕顶部1的进度条在序盘至中盘之间会显示一个标记,而中盘到终盘则有另一个标记。在最终冲刺段时,UI会隐去。
笔者注:由于phase3只在极少数的情况下,例如全身全灵等技能中被使用,大部分机制的条件均是终盘及最终冲刺段。在上文中,终盘一般就是指的phase2+phase3。单独称呼phase2(P2)时一般称呼为终盘前段。
弯道编号
游戏中的每个弯道都分配有 1 到 4 之间的数字。这种机制对于仅在特定角落触发的技能(例如天衣无缝和十全十美)非常重要。
然而,弯道的编号与大多数人的预期不同。 具体来说:
- 赛道的最后一个弯道将始终指定为 4。
- 之后,当在赛道上原路返回时,弯道编号将会减少(即,倒数第二个弯道的编号为 3,等等)。
- 如果弯道超过四个,计数器将在第四个弯道后循环回到 4。
让我们以札幌的1000m赛道为例
赛道的最后一个弯道为 4 号。
当马娘返回路线时,只会遇到另外一个弯道(靠近777m处),那个弯道就是3号弯道。
所以说,这个赛道没有1号和2号弯道。
如果以赛道超过4个弯道的赛道举例,那么我们以札幌2600m草地为例
最后一个弯道位于第二圈,位于图片的最右侧。 那将是4号弯道。
同一圈的另一个弯道将编号为3。
之后,我们进入第一圈。我们要进行与赛道方向相反的方向编号,所以虽然路线是顺时针的,但我们会逆时针数弯道。从红旗开始,最左边的弯道为2号。底部的那个将是1号。对于最右边的弯道,我们将循环回到数字4。最后,第一个弯道将被编号为3。
对于具有corner_random条件的技能,例如前面提到的天衣无缝和十全十美,该技能将始终在该特定弯道的最后一个可能的挑选上选择一个点。 例如,在刚才提到的札幌2600米的赛道上,有两个编号为3的弯道;但该技能只能在第二圈时发动。
存速
在速度类技能持续时间内进入终盘(phase=2+phase=3),收益额外算上该技能数值加上终盘加速时间。
视野
如果满足以下条件,则另一只马娘在你的视野内。
视野距离默认为20m,且只会受到技能(诀窍以及带有视野词条类型)的影响。
视野锥形(或者说三角形)的宽度最大值是恒定的,不受视野距离改变的影响。
代码
X_random类
带有随机修饰的技能在比赛开始后随机从其要求范围内选取一段10m的段落。
当马娘位于这个段落内且满足其他技能发动条件时就可以发动技能。
straight_random
直线随机类技能先从所有的直线中随机选取一条作为发动技能的直线,再从这条直线上随机选取一段10m的段落作为发动区域。选取哪条直线和直线的长度是无关的。
corner_random
如果比赛会经过同一个弯道多次,此类技能在最后一圈(最后一次经过)时才会发动。
PS:由于corner_random的填写方式,它总是会在最后一圈的第一个弯道立即发动。
在一周年更新之后,大部分使用corner_random条件的技能改为使用新增的all_corner_random。仅有回复类技能仍然使用corner_random。(如图)
all_corner_random
在赛场中设置至多4个发动区域,在这些发动区域内即视为满足条件。触发段按照以下方式分配:
- 将比赛中所有的弯道设为候选弯道。
- 从所有候选弯道中随机选择一个。概率与弯道长度无关。
- 在选择的弯道上随机选取一段10m的段落作为发动区域。(基本等同于随机分布,但最后一个可以触发的位置需要位于弯道末尾 - 10m的位置)
- 如果从这个发动区域的末端到弯道末尾还有至少10m的距离,这个候选弯道的距离会变成剩余这段的距离,否则将其从弯道候选中排除。
- 将选定弯道之前的所有弯道从候选中排除。
- 回到步骤2,直到4个发动区域全部被设置,或是已经没有候选弯道。
Slope_random
先从赛道中所有符合坡道的条件中选一段坡道,再从所选坡道中选取10m作为技能发动区间。
is_finalcornor_random==1
选取最终弯道某10m作为发动区间。
is_finalcornor==1
最终弯道以及往后的位置(包含最终直线)。
is_lastspurt
检查您当前是否处于最后一次冲刺状态。
注意:这不是指比赛的最后一次冲刺阶段(phase=3),而是角色的最后一次冲刺模式。进入终盘后,当角色有足够的剩余体力以最大速度完成剩余的比赛时,她将进入“最后的冲刺”模式。这就是这种情况所指的。
示例:is_lastspurt==1
意思是:你处于最后的冲刺模式。
最终冲刺状态,在进入终盘时,若马娘的剩余体力足够以最终冲刺速度的最大值跑完剩余全程,她会立即以最大冲刺速度开始最终冲刺。
当剩余体力不足时,游戏会计算出一系列最终冲刺速度与最终冲刺距离的候选方案,计算的方式是每次降低最终冲刺速度0.1m/s,直到最终冲刺速度低至终盘的基础目标速度。
之后,这些候选会以估计用时的顺序进行排序(估时由各自的距离除以速度得出,忽略加速过程)。
从估计用时最短至最长,每个候选方案有15+0.05*智力属性【%】的方案被选中。如若没有方案被选中,游戏会直接采取最慢的方案。
游戏在计算最终冲刺的消耗时,是按照在终点线前60m处恰好用光所有体力的方式来计算的,并且不会考虑加速至目标速度的过程。
如果在进入在终盘后,马娘发动了一个回复体力的技能,游戏会重新计算最终冲刺距离和速度。
但是,妨害性(闸)的技能即便影响了体力也不会触发重新计算。
lastspurt
检查您是否可以进行最后一次冲刺。
注意:这不是指比赛的最后一次冲刺阶段(phase=3),而是角色的最后一次冲刺模式。进入phase2后,当角色有足够的剩余体力以最大速度完成剩余的比赛时,她将进入“最后的冲刺”模式。
可能的值:0(没有足够的体力以基本速度完成)、1(足够的体力以高于基本速度完成,但不足以以最大速度完成)、2(足够的体力以最大速度完成)
示例:lastspurt==2
含义:你有足够的体力(HP)来全力以赴地进行最后一次冲刺。
order_rate, order_rate_inXX_continue
比赛名次百分比条件会四舍五入地取整,转换成名次条件。
例如, 在9人比赛中,某技能的发动条件为order_rate>50。
因为9*50%=4.5≈5所以该条件被转换为order>5,所以只能在6名及更低名次开启。
order_rate_inXX_continue类的条件要求马娘的顺位持续保持在XX百分比及之内,直至技能发动。 比赛的前5秒不计数。
near_count
附近有马的判定条件为:
is_surrounded
如果同时在以下3个方向上均有其他马娘,马娘被视作包围状态。包围她的一只马娘可以同时在多个方向上满足条件。
外侧:[math]\displaystyle{ |前后距离| \lt 1.5m;0\lt 横向距离\lt 3马宽 }[/math]
前方:[math]\displaystyle{ 0\lt |前后距离| \lt 3.0m;横向距离\lt 1.5马宽 }[/math]
后方:[math]\displaystyle{ -3.0m\lt 前后距离 \lt 0m;横向距离\lt 1.5马宽 }[/math]
behind_near_lane_time, infront_near_lane_time
若马娘处于另一只马娘的以下范围内,就会被视为紧跟着她:
仅检查每个马娘名次前后1名的马来看是否满足这个条件。
这类技能通常使用一个计时器,要紧跟一段时间作为触发条件。
一旦马娘自己的名次发生变更,计时器就会立即重置(前后马娘的名次变化不会导致重置)。
is_overtake
检查是否有任何超车目标。
示例:is_overtake==1
含义:至少有一个超车目标。
想要进入超车模式就必须要有可超越的目标(可以有多个目标)。位于前方1-20米,且在自己视野内,且满足以下条件的其他马娘会成为超车目标:
- 该马娘的目标速度比你的目标速度更低,或者其位于被阻挡状态而当前速度比你的目标速度更低
- 你比该马娘的当前速度更高
- 你和该马娘之间的前后距离除以你和该马娘之间的当前速度差要小于15(以当前速度来计算,15秒内你可以追上该目标)
此外,如果你的前方被阻挡,距离你最近且正在阻挡你的马会自动成为可超车目标。
Slope
检查你目前是在上坡还是下坡。
可能的值:0(平地),1(向上),2(向下)
例如:Slope==1
含义:你正在上坡跑步。
is_badstart
检查您是否在当前比赛中起步较晚。
注:延时启动是指启动门反应时间超过0.08秒。
例如:is_badstart==0
Lane_type
- 内 <= 0.2(Lane_type == 0)
- 0.2 < 中 <= 0.4(Lane_type == 1)
- 0.4 < 外 <= 0.6(Lane_type == 1)
- 0.6 < 大外(Lane_type == 1)
以上单位均为道宽
is_move_lane
检查马娘是刚刚向内侧移动还是向外侧移动。
可能的值:1(向内道靠近)、2(向外道靠近)
示例:is_move_lane==1
意思:马娘刚刚向内道靠近。
技能数值变化
发动特定类型技能的数目
技能效果随着当局比赛发动的绿技能(技能tag 601-615)的数量而变化。
- 0-2 个发动, 0.0x
- 3-4 个发动, 1.0x
- 5 个发动, 2.0x
- 6+ 个发动, 3.0x
距头名额外效果
在距离头名马足够远时产生额外效果。
- 距离小于20m, 无效果
- 距离大于20m,效果数额+0.1
学习技能的数目
马娘固有等级改变
每个马娘的固有技能的效果大小根据其等级的不同而变化,具体来说,是乘以以下系数:
- 恢复技能/加速技能:Lv1→100%,每Lv+1效果量+2%(Lv6→110%)
- 速度技能:Lv1→100%,Lv2→101%,之后每Lv+1效果量+3%(Lv6→113%)
技能持续时间动态变化
按照距离头名的距离改变
按照剩余体力改变
持续时间会随着技能发动那一刻的剩余体力改变。
- 体力 < 2000, 1.0x
- 2000 <= 体力 < 2400, 1.5x
- 2400 <= 体力 < 2600, 2.0x
- 2600 <= 体力 < 2800, 2.2x
- 2800 <= 体力 < 3000, 2.5x
- 3000 <= 体力 < 3200, 3.0x
- 3200 <= 体力 < 3500, 3.5x
- 3500 <= 体力, 4.0x
名次提升时额外持续时间
在技能持续时间内,如果马娘的名次提升(超越了其他马娘)时,技能的持续时间会增加1秒,至多触发3次。
这一增加的持续时间会受到其他改变技能持续时间的效果影响,并且也会和技能的基础持续时间一样,受到赛道距离的影响。
技能额外消耗体力
可疑的策略和博打消耗体力:
- 60% 时为 0.00
- 30% 时为 0.02
- 10% 时为 0.04
走位技能
横向(变道)速度
关于马娘的横向速度(即变道速度),有三个不同的定义,分别是目标横向速度/当前横向速度/实际横向速度
<目标横向速度>
[起步补正]
生效比赛区间为序盘~中盘 生效赛道区间为起点至最终弯道前,具体公式如下:
[名次补正]
生效比赛区间为终盘~最终冲刺,具体公式如下:
<当前横向速度>
马娘会一直以目标横向速度为准进行加速/减速,其中加速度/减速度均为定值。
到这一步为止计算的速度都是绝对值,与方向无关。
<实际横向速度>
(clamp的意思就是当前横向速度加上技能补正之后最大是0.6 最小是0)
[内侧移动补正]
该补正只有在马娘往内侧移动时才会触发,具体计算如下:
如果计算出来的结果是负数,那么马娘就会往内侧移动。
由于前两个横向速度的计算结果都是绝对值,所以即使变方向也不会影响当前横向速度。
<变道结束后>
变道结束后,系统会根据横向速度及变道时间来计算出移动距离,并与变道前的宽度相加得出新的跑道位置。
需要注意的是,如果移动的方向被阻挡了的话,马娘就不会进行变道。
马娘一旦成功变道到目标跑道上,当前横向速度会被马上重置成0。
纵向速度(一周年新增)
提高走位技能的效果期间更容易超车。
在收到增加横向移动速度的技能效果时,跑道移动后的下一帧目标速度会增加。
此收益只在变道的时候有效且在技能持续时间内,变道结束后不再拥有此速度收益。
技能目标
具有目标的技能在选择目标时并不区分友方或敌方。
这意味着队友可以触发或成为技能的目标,并且如果技能有目标上限,队友也会计入这个上限内。
但是,在妨害类技能产生效果时,队友会被除外。
技能 | 技能目标 |
该跑法全部马娘 | |
后方所有敌方马娘 | |
后方五个最近马娘(算上队友,但是效果不计入队友) | |
前方所有马娘 | |
对应跑法焦躁的马娘 | |
前方五个最近马娘(算上队友,但是效果不计入队友) | |
视野内所有敌方马娘 | |
后方最近的一个马娘 |
取位调整(位置取り調整 )
取位调整会发生在比赛的11-15赛段。
每2秒钟一次,游戏会检查马娘是否满足“距离头名过远”或是“附近有另一位马娘”的条件。
若检查成功,马娘会开始进行取位调整。
检查的具体条件尚不清楚。它使用了下面的数值表格中的距离系数和一些其他数据。
PS:因距离头名过远进行检查时,智力越高越容易成功。因附近有马娘进行检查时,马娘的根性越高,附近的马娘越多,附近同跑法的马娘越多越容易成功。
跑法 | 距离系数 |
大逃 | 0.0 |
逃 | 0.0 |
先 | 2.5 |
差 | 5.0 |
追 | 10.0 |
成功进行取位调整后,马娘会消耗体力值并在2秒内提升目标速度,之后进入1秒钟的冷却时间。提升的目标速度计算公式如下:
跑法系数为:
跑法 | 跑法系数 |
大逃 | 0.2 |
逃 | 0.8 |
先 | 1.0 |
差 | 1.0 |
追 | 1.0 |
1200力量1200根性前提下,触发收益与一个0.15/4s的技能收益相差无几,由于根性相关幂系数低,因此力量成主导因素。
触发一次消耗约60耐左右。(计算公式在下方)
体力消耗的跑法系数:
跑法 | 跑法系数(体力消耗) |
大逃 | 1.5 |
逃 | 1.2 |
先 | 1.0 |
差 | 1.0 |
追 | 1.0 |
体力消耗的距离系数:
- 比赛距离<1401米: 0.3x
- 比赛距离<1801米: 0.3x
- 比赛距离<2101米: 0.5x
- 比赛距离<2201米: 0.8x
- 比赛距离<2401米: 1.0x
- 比赛距离<2601米: 1.1x
- 比赛距离>=2601米: 1.2x
如果不是因为距离头马过远而发动取位调整,那么体力消耗中会额外增加一个0.5的近距离系数。
另外,如果逃马或者大逃马10m内没有相同跑法的马,其速度上升的跑法系数会额外乘以下表的数值。(此系数有一个尚无法解释的20%阈值)
跑法 | 跑法倍率额外值 |
大逃 | 2.0 |
逃 | 1.1 |
距离损失
本文原文出自:NGA帖子
首先先说这个“距离损失”是什么意思。
马娘的速度不会原样加在行走距离上。而是会按照实际位置折算后才转变成行走距离。
因此在位于弯道外侧等情景时,行走的距离会变得少于实际速度。
那么这个折算是怎么计算的呢?游戏内部具有承载了赛道3d位置的信息的文件。
依据马娘已经行走的距离,与马娘距离赛道最内侧的马位差这两个参数,可以将马娘的位置对应到这个赛道上的一个真实坐标。
那么,根据两个点的坐标,就可以算出这两个点的实际距离差。用实际距离差除以距离,就能得出一个距离比例。这个比例比1大时就会按照比例减损马娘实际移动的距离。
下面我们以中山2200m(外侧)为例(因为我暂时没有1200m的文件 凑合一下),游戏内数据俯视出来大概就图上这个样子(标记的两个点一个是1200m起点一个是终点位置)。
可以看到这基本就是按着赛马场的实际数据来的。其他赛道的数据也都是这种形式的。
那么我们以外道过弯这个场景来实际计算一下。假设我们距离内道有3马宽的距离,然后在第三弯这个位置,打算从1600m移动到1603m。根据解包哥,1马宽=1/18的标准单位。
因此我们等于是求位置(1600,0.1667)和位置(1603,0.1667)的实际距离,再用这个距离除以要移动的距离(3m),再除以这个赛道的基准比例(基准比例是用位置(0,0)和(1,0)计算出来的结果),就能得出一个换算比例。
这里红线是对应点向外侧垂直方向的向量,长度是用马宽算出来的,等于11.25 *当前跑道位置 / 道宽;所以相当于是在算这个蓝线的实际长度。
算出来这个比例差不多是1.00287,因此速度转换成实际距离时的折损比例=1/1.00287,会有大概0.3%的折损。
以中山外圈这个3弯为基准的过弯时速度损失情况和距离内道马宽比例的表格
距离最内侧马宽差距 | 平均过弯速度损失比例 |
1 | 小于0.5% |
2 | 小于0.5% |
3 | 0.5%-1.0% |
4 | 0.5%-1.0% |
5 | 1.0%-1.5% |
6 | 1.5%-2.0% |
7 | 2.0%-3.0% |
10 | 3.0%-3.5% |
18 | 约5.0% |
实际上看着没有折损多少,但其实基本上每0.5%的距离损失都等同于损失了0.1的速度。换句话说,如果过弯时一直处于3马宽左右的外侧,大致上会一直比别人少一个白速度技能。注意这个转换是最终计算,因此任何速度技能带来的速度提升也会进一步受影响,所以内道的优势还是很关键的。
其他赛道的话,首先每个弯道的形状不同都会产生差异(因为这个数据来源可以说非常细致),弯道越急,外侧的损失就越大。
再有一个比较关键的影响就是道宽。可以看到计算外侧方向向量长度时的参数里是有道宽这么一个参数的,而每个场地的道宽有所不同。道宽越大的场地,位于外道的损失就会越小。
其实结论就是跑外道的路程大所以速度投影会小,这个解包只是解释了一下这点在工程上怎么实现。在外道可以粗暴地理解为速度减少了。