ダメージ計算

以下に十分な精度を持つと思われる計算式を述べる。

ダメージ=Round(攻撃基本値*防御倍率*乱数倍率)

ここでRound()は小数第一位を四捨五入して整数にする関数。

攻撃基本値

攻撃側のステータスによって計算される値。

操作キャラクターの場合、

攻撃基本値(操作キャラクター)=レベル倍率*((武器の強さ+ちから)/2+8)*0.0625

(武器の強さ+ちから)/2 は小数点以下切り捨て。

レベル倍率は操作キャラクターのレベルに応じて以下のテーブルで決定される。
十の位\一の位 0 1 2 3 4 5 6 7 8 9
0 5 8 11 14 17 20 23 26 29
1 31 34 36 38 40 42 44 46 48 50
2 52 54 56 58 60 62 64 66 68 70
3 72 74 76 78 60 82 84 86 88 89
4 90 91 92 93 94 95 96 97 98 99
5 100 101 102 103 104 105 106 107 108 109
6 110 111 112 113 114 115 116 117 118 119
7 120 121 122 123 124 125 126 127 128 129
8 130 131 132 133 134 135 136 137 138 139
9 140 141 142 143 144 145 146 147 148 150


モンスターの場合、攻撃力に1.3程度の係数をかける。

攻撃基本値(モンスター)=(5452595/4194304)*攻撃力


防御倍率

防御側のステータスによって計算される値。

操作キャラクターの場合は盾の強さ、モンスターの場合は防御力に応じた指数関数で決定される。

防御倍率=(8155591/8388608)^(盾の強さor防御力)


乱数倍率

乱数によって決定される値。

乱数倍率:区間(0.875,1.125)の一様乱数


攻撃力の変動

操作キャラクターもモンスターも初期値256の攻撃補正カウンタ(整数)を持っている。
このカウンタ値により操作キャラクターはちからに、モンスターは攻撃力に補正を受ける。

ちから(補正後)=(ちから*カウンタ値)/256

攻撃力(補正後)=(攻撃力*カウンタ値)/256

256での除算は小数点以下切り上げ

カウンタの変動は以下の通り。
  • モンスターに対するバイキルト効果→カウンタを2倍
  • モンスターに対する毒効果→カウンタを1/2倍(小数点以下切り捨て)
  • 操作キャラクターまたはモンスターに対する不思議な踊りの攻撃力減少効果→カウンタを205/256倍(小数点以下切り捨て)


防御力の変動

フロアでスカラ効果(+1)、ルカナン効果(-1)を受けた累積回数に対応する倍率を防御力(盾の強さ)に乗算して補正される。

防御力(補正後)=防御力*倍率

乗算は小数点以下切り捨て。
倍率が負の場合は、防御力を0にして攻撃基本値に倍率の絶対値をかける。
累積回数 倍率(近似値) 倍率(厳密値)
+9 9.9 10380902/2^20
+8 7 7
+7 6 6
+6 5 5
+5 4 4
+4 3 3
+3 2 2
+2 1.6 13421772/2^23
+1 1.3 10905190/2^23
0 1 1
-1 0.8 13421772/2^24
-2 0.7 11744051/2^24
-3 0.5 0.5
-4 0.4 13421772/2^25
-5 0.2 13421772/2^26
-6 0.001 8589934/2^33
-7 0 -1
-8 0(攻撃基本値を2倍) -2
-9 0(攻撃基本値を3倍) -3
-10 0(攻撃基本値を4倍) -4

厳密値と近似値が異なるところはすべて厳密値が近似値を下回っているので、
防御力と近似値をかけて整数になった場合、実際の値はそれより1小さくなることになることに注意。

丸めと攻撃力40モンスターの最大ダメージ


以上の計算式は、トルネコ3をプレイ中にPS2で行われている演算をひとまとめにしたものである。
実際の計算は細かいステップに分けられていて、その中でも浮動小数点数を用いる演算では丸め誤差がステップごとに生じる。
例えばモンスターがポポロ(防御力0)に攻撃するとき、実際の演算は以下のようになっている。

  • Step1. 範囲0x3F800001~0x3FFFFFFF(2^23-1通り)の乱数を取得。これはfloat表現で区間(1,2)に分布する。
  • Step2. ここから1.0(0x3F800000)を減算。さらに0.25(0x3E800000)を乗算した後、0.875(0x3F600000)を加算。ここまでで乱数は区間(0.875,1.125)に分布するように整形される。
  • Step3. 乱数とモンスターの攻撃力(素のステータス攻撃力)を乗算。
  • Step4. さらに1.3(0x3FA66666)を乗算。
  • Step5. 得られた値を四捨五入してダメージ決定。

例えば攻撃力40のモンスターからポポロが受ける最大のダメージは、40×1.3×1.125=58.5、小数点以下を切り上げて59…と思われた方もいるかもしれない。

さて、PS2のFPUの丸めモードが切り捨て(Round-Toward-Zero)であると信じれば、最大乱数0x3FFFFFFFを引いたときに攻撃力40のモンスターから受けるダメージをこの手順で計算すると58になる。
乱数の区間が開区間であることと、ダメージ係数の1.3が実際には5452595/4194304(これは1.3よりわずかに小さい)になっていることが効いているのだ。

なお、PS2のFPUの丸めモードは切り捨て(Round-Toward-Zero)であると言われているが、実際にはズレが生じる事があり詳しいことは分かっていないらしい。
フライダやひとくいばこなどの攻撃力40モンスターから59ダメージを受けたらぜひご一報ください。

ちなみに防御倍率の計算には繰り返し2乗法が使われており、防御力が大きくなると丸め誤差の影響を最も顕著に受けるが、ダメージ自体が小さくなり、結局小数第一位で四捨五入されてしまうため結果にほぼ影響はない。


イネスがモンスターに与えるダメージ


攻撃基本値の計算以外は操作キャラクターと同じ。

イネスの攻撃基本値は攻撃力(初期値15、レベルで変化せず、ちからのたねで5上がる)とレベル倍率によって決まる。

攻撃基本値(イネス)=レベル倍率*(攻撃力/2+8)*0.0625

攻撃力/2 は小数点以下切り捨て。

レベル倍率はイネスのレベルに応じて以下のテーブルで決定される。
十の位\一の位 0 1 2 3 4 5 6 7 8 9
0 5 7 10 12 14 16 18 20 22
1 24 26 27 28 29 30 31 32 33 34
2 35 36 37 38 39 40 41 42 43 44
3 45 46 47 48 49 50 51 52 53 54
4 55 56 57 58 59 60 61 62 63 64
5 65 66 67 68 69 70 70 70 70 70
6 70 70 70 70 70 70 70 70 70 70
7 70 70 70 70 70 70 70 70 70 70
8 70 70 70 70 70 70 70 70 70 70
9 70 70 70 70 70 70 70 70 70

モンスターがイネスに与えるダメージ


モンスター→操作キャラクターとは攻撃基本値と防御倍率の計算に用いる定数が違う。

攻撃基本値(モンスター→イネス)=(2306867/2097152)*(モンスターの攻撃力)

防御倍率(イネス)=(8188879/8388608)^(イネスの防御力)

イネスの防御力は次の表のようにレベルで決まる(Lv20以降は未確認)。
Lv 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
防御力 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 25 25 25 25

タグ:

+ タグ編集
  • タグ:
最終更新:2024年06月30日 21:50