単精度浮動小数点
ソサ(マジックユーザ)の謎の加算値
昨日の日記に書いたことについてもう一度整理してみる。
- Lv 4 ~ Lv 17までは、謎の加算値は、 0.4*(Lv+30) という式で表せると、かなり高い確信を持って言える。
- クニペックスさんのデータを分析すると40ソサでは28、76ソサでは42.4と推測できるけれど、これもやはり0.4*(Lv+30)という式とマッチしている。
- ところが Lv 18では、0.4*(18+30)=19.2 とならずに、これよりわずかに大きい値であるという結論になってしまった。
今日はこの理由について考えてみる。
結論
すごく話が長く、込み入ってしまったので、結論を先に。
- これは、多分バグ(の一種)
- ロードスで扱われる数値は、有効数字は7桁程度しかないと思った方が良い。
昨日の測定
昨日の日記で、Lv 18 での謎の加算値が19.2より大きいという結論に至ったのは、こんな測定からだった。
知力: 11
基礎倍率: 0.7*(1+0.06*11)=1.162
基礎攻撃力: 31
武器習熟: +2
武器攻撃力: 66
攻撃力増: 15% + 19.8%
スキル攻撃力上昇: 3
という状態で、イグニッション(Lv6) (スキル倍率 4.25) の攻撃力を測定する。
もし謎の加算値が 19.2 ならば、イグニッションの攻撃力を表す式は
4.25*1.162*((31+2+66+19.2)*(1+0.15+0.198)+2*3) = 816.4999836
となり、これを四捨五入して 816 となるはず。ところが、実際に調べてみると 817 だった。
それなので、昨日は「謎の加算値は19.2より大きくなければならない」と結論付けた。
考え方を変える
けれど、今日は「本来は816のはずが、バグで817になってしまった」と考えてみる。
そうすると、いろいろなことがつじつまが合ってくる。
単精度浮動小数点
コンピュータで小数を表す方法はいくつかあり、その中の一つに「単精度浮動小数点」と呼ばれるものがある。これはieee 754で規格が定められており、この方法で816.4999836
という値を表そうとすると、実は丸められて816.5になってしまう。
そのカラクリはこんな感じ: wikipediaの
単精度浮動小数点数 - Wikipedia
ここの説明通り2進展開を考えてみると
816.4999836 = 1.1001100000111111111111110.... * 2^9
となる。ここで後ろに1が14個続くのがポイント。ieeeの規格によって、この2進展開の青い部分までしか保持できず、はみ出た部分を「0捨1入」する。すると
= 1.1001100001 * 2^9
という値になる。これが実は、816.5という値
そして、ロードスのスキル攻撃力のルールにより、この値を四捨五入したもの、すなわち817が最終的な攻撃力になる。
つまり、計算の途中でieee 754による丸め処理があったと仮定すると、イグニッションの攻撃力が817となった理由が説明できたことになる。
丸め処理を2回行う
結局これは、丸め処理を2回行ったことで生じた弊害と言える。丸め処理を2回行うとおかしなことになるのは例えば
12.45
という値があったとして、小数点以下第二位で四捨五入して
12.5
としてから、さらにこれを四捨五入すると
13
となってしまうという例でも分かる。本来12.45を正しく四捨五入すると12になるはずが値が1ずれてしまう。
まとめ
まとめるとこんな感じ
「謎の加算値が19.2なら、イグニッションの攻撃力は816となるはずなのに、実際には817になっていた」
という前提があり
- 昨日は「謎の加算値は19.2より大きくなければいけない」という結論に至った
- 今日は「ロードスの開発者が単精度浮動小数点を使って、丸め処理を2回行うというミスを犯したと仮定すると、謎の加算値が19.2であったとしてもつじつまが合う」という結論に至った
バグかバグではないのか
「丸め処理を2回行う」というのは、厳密な結果が求められるプログラムでは決してやってはいけないこと。けれど、ロードスはゲームなので、その辺はさほど気にせずにプログラムされたのかもしれない。
なので「初めに設計された通りに動いていない」という意味ではバグの一種だけれど
「厳密に初めの設計通りでなくてもゲーム性を損なわなければOK」という考え方をすればバグではないとも言える。
また、仮にバグと呼ぶにしても、他に数多ある致命的なバグに比べれば、大部分の人にとってどうでもいい類とも言える。
しかし、ごく一部、このゲームの内部を知ろうとする調査兵団にとっては、このバグは意識せざるを得ない存在であり、今回の事は重要な教訓となった。それは、どんな教訓で、その教訓から何が分かるのか、という話はまた後日。
マジックユーザー
謎の加算値を調べる為にマジックユーザを育てることにした。
レベルを上げながら謎の加算値を調べた結果がこちら
測定結果
Lv 4. 13.599978 < c < 13.600020
Lv 5. 14.0 <=c < 14.000023
Lv 6. 14.399993 < c < 14.400026
Lv 7. 14.799953 < c < 14.800012
Lv 8. 15.2 <=c < 15.200038
Lv 9. 15.599992 < c < 15.600010
Lv10. 15.999995 < c < 16.000023
Lv11. 16.399960 < c < 16.400015
Lv12. 16.799953 < c < 16.800012
Lv13. 17.2 <=c < 17.200038
Lv14. 17.599992 < c < 17.600010
Lv15. 17.999975 < c < 18.000024
Lv16.
Lv17. 18.799953 < c < 18.800012
Lv18. 19.200002 < c < 19.200038
感想
ID1回でレベルが15から17まで上がってしまったので、Lv16での謎の加算値は測定できなかった。
けれどこれを見る限り、0.4*(Lv+30)という式で表せそうに思える。
ところが、もしそうなら、Lv18では19.2にならないといけないはずが、Lv18では
19.200002 < c < 19.200038と、僅かながら19.2より大きい値になっている。
何故なのかは分からない。
クニペックスさんのデータ
比較
ソサのスキルの攻撃力についてクニペックスさんが詳細なデータをあげてくれている。
そこで、今までこの日記に書いた計算法で算出したスキル攻撃力の加算値と、クニペックスさんの7/11分のデータを比較してみる。76ソサの謎の加算値は分からないけれど、42.4だと仮定してみる。
条件
(主なものだけ抜粋、詳細はクニペックスさんのシートを参照)
76ソサ
知力: 19
基礎攻撃力: 5+26+5+50
スキル攻撃力上昇: 15+50+48
攻撃力上昇: 15%
武器習熟: 29
実測値
こちらはクニペックスさんのデータ
理論値
そして、こちらはこの日記で書いてきた方法で計算したもの
FB(Lv1) | IA(Lv11) | CL(Lv6) | Ig(Lv7) | |
---|---|---|---|---|
裸 | 834 | 998 | 1071 | 2190 |
杖 | 1090-1096 | 1299-1306 | 1402-1410 | 2868-2883 |
猛 | 1123-1128 | 1337-1344 | 1444-1451 | 2953-2968 |
雄 | 1163-1170 | 1385-1393 | 1496-1505 | 3061-3078 |
巧 | 1158-1163 | 1378-1385 | 1489-1497 | 3046-3061 |
巧% | 1195-1201 | 1422-1429 | 1538-1545 | 3145-3160 |
巧+猛 | 1190-1196 | 1416-1423 | 1531-1538 | 3131-3146 |
巧%+巧 | 1275-1280 | 1516-1523 | 1640-1648 | 3355-3371 |
Fz(Lv8) | EJ(Lv5) | E(Lv1) | I(Lv10) | 魔功 | |
---|---|---|---|---|---|
裸 | 1606 | 1905 | 468 | 1265 | |
杖 | 2103-2114 | 2808-2829 | 611-614 | 1657-1666 | 298-302 |
猛 | 2166-2177 | 2922-2942 | 629-632 | 1706-1715 | 317-321 |
雄 | 2244-2257 | 3065-3089 | 651-655 | 1768-1779 | 341-345 |
巧 | 2233-2245 | 2927-2947 | 648-652 | 1760-1769 | 298-302 |
巧% | 2306-2318 | 2993-3013 | 669-672 | 1817-1826 | 298-302 |
巧+猛 | 2296-2307 | 3040-3061 | 666-670 | 1809-1818 | 317-321 |
巧%+巧 | 2461-2472 | 3133-3154 | 714-717 | 1939-1948 | 298-302 |
考察
黒字の部分は、クニペックスさんのデータと合っている。赤字は合っていないもの。EJの杖はクニペックスさんの入力ミスだと思う。そして、巧%はEJ以外すべて合っていない。なので
- 巧%が絡まない部分については、この日記で過去に書いた計算法でほぼ間違いない
- 巧%が絡む部分は見直しが必要
と言えそう。実は、これと同じことは、前の日記でも書いていた。
クニペックスさんの調査 - お茶の国 プリ日記 ロードス島 調査兵団
このときは、クニペックスさんの「旧1」というデータを使った。そしてやはり、EJ以外の巧%がらみは数値が合わず、それ以外は数値が合うという結果になった。
では、巧%が絡む部分についてはどう計算したらいいか、その辺の話はまた後日。
防御力下方修正
今日のメンテで、いくつかのマップで敵のステがいろいろと下方修正されたみたい。
見捨てられた国境
なので、見捨てられた国境の傭兵と山賊の物理防御力を調べてみる。
40キャラにはダメ値バグは無いはずなので、40レンを使って物理防御力を調べてみる。
結果は、山賊も傭兵も共に物理防御力770。
以前測定した時は, ともに814だったはずなので、(このときのメモが間違ってなければ)5.4%減ったことになる。
ついでに70モンクで、これらを叩いてみると、レベル63相当で計算されていることが確かめられた。
ダメ値バグはまだ残っているみたい。
ダメ値バグ その後
モンクが70になった。明日はメンテなので、改めて湖畔B3でダメ値バグを確認してみる。
理論値
Lv=63, 65, 70の場合にアッパーのクリダメの理論値を計算しておく。こんな感じ。
Lv=63 理論値
[2343, 2345, 2347, 2349, 2350, 2352, 2354, 2356, 2358, 2360, 2362, 2364, 2366, 2367]
Lv=65 理論値
[2405, 2406, 2408, 2410, 2412, 2414, 2416, 2418, 2420, 2422, 2424, 2426, 2428, 2430]
Lv=70 理論値
[2548, 2550, 2552, 2554, 2556, 2559, 2561, 2563, 2565, 2567, 2569, 2571, 2573, 2575]
実測値
そして、実際に叩いてみると…
実測値(10回分)
2410, 2430, 2412, 2406, 2414, 2405, 2426, 2410, 2422, 2430
こんな感じ。Lv=65の時の理論値と一致している。やっぱりレベル65相当で計算されているみたい。
対人戦
ダメ値バグは、対人戦の時どうなるかも実験してみた。
結論は「対人戦ではダメ値バグはなさそう」というもの。
こちらは、モンクが69のときに実験した。
実験
叩く人: 69モンク
アッパー攻撃力: 1092
クリダメ増:180%
ダメ増(人間): 15%
実験結果1
叩かれる人: 73パラ
防御力: 857
ダメ減(人間):15%
ダメ減(物理):21.4%
バグがない場合の理論値は204。計算はこんな式。
df=857/(700.0+30*69)
0.5*( (1-df)/(1+df/5)*1092*(1-0.214)*(1.5+1.8) )**0.8=204.75
実測値は204
実験結果2
叩かれる人: 61モンク
防御力: 764
ダメ減(人間):9%
ダメ減(物理):13.8%
バグがない場合の理論値は242。計算はこんな式。
df=764/(700.0+30*69)
0.5*( (1-df)/(1+df/5)*1092*(1+0.15-0.09-0.138)*(1.5+1.8) )**0.8=242.86
実測値は242
結論
対人戦では、ダメ値バグは無いと言ってよさそう
アイスアローとエングロスメント
ソサのアイスアローとエングロスメントのスキル倍率とスキル加算値を調べてみた。
過去の日記と合わせると、ソサのスキル倍率は全て求まったことになる。
ソサの調査 - お茶の国 プリ日記 ロードス島 調査兵団
ファイアボール - お茶の国 プリ日記 ロードス島 調査兵団
アイスアロー
Lv1 | Lv2 | Lv3 | Lv4 | Lv5 | Lv6 | Lv7 | Lv8 | Lv9 | Lv10 | |
---|---|---|---|---|---|---|---|---|---|---|
Sa | 1.4 | 1.45 | 1.5 | 1.65 | 1.7 | 1.75 | 1.8 | 1.85 | 1.9 | 1.95 |
Sb0 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
Lv11 | Lv12 | Lv13 | Lv14 | Lv15 | Lv16 | |||||
Sa | 2.0 | 2.05 | 2.1 | 2.15 | 2.2 | 2.25 | ||||
Sb0 | 14 | 15 | 16 | 17 | 18 | 19 |
エングロスメント
Lv1 | Lv2 | Lv3 | Lv4 | Lv5 | Lv6 | Lv7 | Lv8 | Lv9 | Lv10 | |
---|---|---|---|---|---|---|---|---|---|---|
Sa | 0.95 | 1.05 | 1.15 | 1.3 | 1.45 | 1.6 | 1.75 | 1.9 | 2.05 | 2.2 |
Sb0 | 3 | 5 | 7 | 11 | 15 | 19 | 23 | 27 | 31 | 35 |
Lv11 | Lv12 | Lv13 | ||||||||
Sa | 2.35 | 2.5 | 2.65 | |||||||
Sb0 | 39 | 43 | 47 |
Saはスキル倍率、Sb0は知力が0のときのスキル加算値で、知力がkのときは (1+0.04*k)*Sb0となる。
ファイアボール
ソサのファイアボールのスキル倍率とスキル加算値を調べた
Lv1 | Lv2 | Lv3 | Lv4 | Lv5 | Lv6 | Lv7 | Lv8 | Lv9 | Lv10 | |
---|---|---|---|---|---|---|---|---|---|---|
Sa | 1.7 | 1.75 | 1.8 | 1.85 | 2.0 | 2.05 | 2.1 | 2.15 | 2.3 | 2.35 |
Sb0 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
Lv11 | Lv12 | Lv13 | Lv14 | Lv15 | Lv16 | Lv17 | Lv18 | Lv19 | Lv20 | |
Sa | 2.4 | 2.45 | 2.5 | 2.55 | 2.6 | 2.65 | 2.7 | 2.75 | 2.8 | 2.85 |
Sb0 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
Lv21 | Lv22 | Lv23 | Lv24 | Lv25 | Lv26 | Lv27 | Lv28 | Lv29 | Lv30 | |
Sa | 2.9 | 2.95 | 3.0 | 3.05 | 3.1 | 3.15 | 3.2 | 3.25 | 3.3 | 3.35 |
Sb0 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
Lv31 | Lv32 | Lv33 | Lv34 | Lv35 | ||||||
Sa | 3.4 | 3.45 | 3.5 | 3.55 | 3.6 | |||||
Sb0 | 34 | 35 | 36 | 37 | 38 |
Saはスキル倍率、Sb0は知力が0のときのスキル加算値で、知力がkのときは (1+0.04*k)*Sb0となる。