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 各种技能机制

感谢玩家【夜冴/梓】(已淡坑)对这方面的贡献,他以一己之力进行了扒源码和翻译并进行科普。请注意有些地方可能不一定扒得准确,我们也不确定!

b站上可以看

需要注意有时他会以

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 是目标的回避参数。