Chapter 2 游戏机理与机制理解
这个东西正在实时更新,并且并没有写完,更重要的是我们写的不一定对。
2.1 战斗机制
首先,各个号在战斗中的真实属性并非其显现得那样。攻、防、敏、魔、抗、智应当减去 36(减完后在 0-63 之间),速 +124。
然后需要理解,战斗中还有其他的临时属性,MP 和 SP。前者决定你能不能成功发动技能(也经常称为蓝),后者决定你什么时候能行动(和速有关)。
在每次实战当中,会根据参加的所有号以及 seed 生成一个排列,决定了每个号的预行动顺序,每个号按顺序轮流进行预行动。
在预行动中,每个号会回复期望值和速正相关的、带有随机性的 SP,以及期望值和智正相关的、带有随机性的 MP。(准确来说 SP 是 0/1/2 中的一个随机数乘上实际速,MP 不是很清楚)
当一个号的 SP 达到 2048 时,他会进行行动,比如发动攻击或者发动技能之类的。技能通常需要 MP 达到一定的量(尚不明确)才有可能发动。
2.2 伤害计算
各种具有伤害的技能都是有伤害的(我在说什么废话),而它们的伤害计算方式通常为一个随机生成出来的基础伤害数值乘上一个技能倍率,然后再根据对方的防/抗除以一个值。
2.2.1 基础伤害计算
这一段将讲解基础伤害计算方法(对应 md5.js 中的 getAt 部分)。
首先会根据技能或攻击是物理攻击还是魔法攻击选择采用攻还是魔进行计算。将这个值设为 o
。
随后生成三个 0-127 的随机数,和 o
以及 o+64
总共五个数,求中位数,得到 x
(变量名不完全一样)。
随后生成两个 0-63 的随机数,和 o
总共三个数,求中位数,再加 64,得到 y
(变量名不完全一样)。
最后返回 x*y*[聚气倍率]
。
聚气倍率指的是,通常情况下为 1,聚气后为 1.7,实际上还有更复杂的机制,详情见 2.3 节。
如果你想要知道对应 o
以及 x*y
的期望值对应,可以查看该表:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
4554.588 | 4587.575 | 4621.732 | 4657.051 | 4693.525 | 4731.142 | 4769.890 | 4809.753 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
4850.714 | 4892.756 | 4935.856 | 4979.994 | 5025.146 | 5071.286 | 5118.389 | 5166.425 |
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
5215.367 | 5265.183 | 5315.843 | 5367.313 | 5419.561 | 5472.550 | 5526.246 | 5580.611 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
5635.610 | 5691.202 | 5747.349 | 5804.011 | 5861.147 | 5918.716 | 5976.674 | 6034.980 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
6093.590 | 6152.458 | 6211.540 | 6270.789 | 6330.160 | 6389.603 | 6449.072 | 6508.517 |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
6567.888 | 6627.134 | 6686.205 | 6745.046 | 6803.606 | 6861.830 | 6919.662 | 6977.046 |
48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
7033.925 | 7090.239 | 7145.930 | 7200.935 | 7255.192 | 7308.637 | 7361.205 | 7412.828 |
56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
7463.439 | 7512.967 | 7561.339 | 7608.481 | 7654.318 | 7698.772 | 7741.762 | 7783.205 |
差分后的结果:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
0.000 | 32.987 | 34.157 | 35.320 | 36.474 | 37.617 | 38.748 | 39.863 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
40.962 | 42.041 | 43.101 | 44.138 | 45.152 | 46.140 | 47.102 | 48.037 |
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
48.942 | 49.816 | 50.660 | 51.470 | 52.247 | 52.989 | 53.696 | 54.366 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
54.998 | 55.592 | 56.147 | 56.662 | 57.136 | 57.569 | 57.959 | 58.306 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
58.609 | 58.868 | 59.082 | 59.249 | 59.370 | 59.444 | 59.469 | 59.445 |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
59.371 | 59.246 | 59.070 | 58.842 | 58.560 | 58.224 | 57.832 | 57.384 |
48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
56.879 | 56.314 | 55.690 | 55.005 | 54.257 | 53.445 | 52.568 | 51.624 |
56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
50.611 | 49.528 | 48.372 | 47.143 | 45.837 | 44.454 | 42.990 | 41.443 |
2.2.2 实际伤害计算
在基础伤害计算中,生成的值只和攻击方的数值有关,不和被攻击方的防/抗等有关。
如果要计算实际伤害,只需要除以 (64 + 目标防/目标抗)。防还是抗取决于你的攻击是物理攻击还是魔法攻击。
技能倍率具体见 2.3 节。
2.3 各种技能机制
感谢玩家【夜冴/梓】(已淡坑)对这方面的贡献,他以一己之力进行了扒源码和翻译并进行科普。请注意有些地方可能不一定扒得准确,我们也不确定!
需要注意有时他会以
0 < a,b,c < 1
n = max(a,b,c)*400
的形式进行表述期望伤害。
实际上这个的意思是,a b c 每一个都是一次根据 2.2 所说的基础伤害计算方式生成的随机数。而正常普通攻击下则是进行这样的计算一次。
2.4 命中算法和实际伤害计算
在 2.3 中有提到,对技能命中概率的一般拟合,普通攻击为 (自身法力/攻击 + 自身敏捷) / (目标法抗/防御 + 目标敏捷)。
实际上这样的表述有误导性。这样看上去像是一个简单的除法,但是,怎么可能呢?
这一节来简要讲一下这个命中算法。
我们规定,普通攻击中,自己的命中参数为 (自身法力/攻击 + 自身敏捷),目标的回避参数为 (目标法抗/防御 + 目标敏捷)。对于特殊技能,命中参数和回避参数按照 2.3 说明的来算。
设命中参数为 a
,回避参数为 b
,计算出 s=max(7,24+b-a)
,如果 s
大于 64,那么让 s=s/4+48
,向下取整。意思是超出 64 的部分每 4 点才能让最终值 + 1。
最后有 s/256
的概率成功回避。
代码如下:
bW(a, b, c) {
var s = 24 + b - a,
r = 7
if (s < r) s = r
if (s > 64) s = C.JsInt.P(s, 4) + 48
return c.n() <= s
}
其中 a 是自己的命中参数,b 是目标的回避参数。