組長式のダメージ計算式が曖昧な箇所が多く、武器束ねの腕輪検証に差し支えるため事前調査としてダメージ計算式の推定を行うことにした。
ダメージ計算式
シレン→モンスターに対するダメージ計算式を抜粋すると以下の通り。
ダメージ = [攻撃×乱数÷100-守備]×種族倍率
攻撃 = Lv攻撃+力攻撃+装備攻撃
レベル攻撃力 = LOG(レベル×0.4+1)×24-3
ちから攻撃力 = LOG([ちから÷2]-1.25)×LOG([ちから÷2]-1.25)×25 (ちから8以上)
装備攻撃力 = 強さ×0.585
守備 = 守備力÷2
乱数 = 87~112 のうち一つ
種族倍率 = 一致した場合武器レベルに応じた倍率(今回検証しないため1とする)
ここで言う曖昧な箇所とは、各計算に於ける切り捨て・切り上げ処理のこと。
この手のゲームは微妙なダメージの違いで敗北につながるため、細かな誤差がプレイングに影響することが多い。(言うほど多いか?)
何はともあれ、これが分からないことにはダメ計なんてやってられないので曖昧な部分は潰しておくに限る。
検証方法
- 防御力1の敵に対するダメージを記録(運命の小道1~2F)
- 途中でレベルが上がらないようにギタンマムル×2でレベルアップ(Lv.23)
- 武器:大隕鉄聖剣+1(つよさ:26)
- ちから:8
- 火力上昇に係る印なし
以上の条件で風が吹くギリギリまでモンスターを倒し続け、延べ115体のモンスターを倒すことができた。
検証結果
ダメージのばらつきは以下の通り。最大値は46、最小値は35、平均値は40.61となった。
ダメージ | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
出現数 | 5 | 5 | 14 | 7 | 10 | 18 | 8 | 14 | 9 | 10 | 11 | 4 |
さて、この結果をもとに計算式を推定していこう。
とは言っても、むやみに総当りしていては埒があかないので、ある程度の見当を付けて計算しよう。
私が値の切り捨て処理が挟まる可能性が高いと考えたタイミングは以下の通り。
- 各種攻撃力(レベル・ちから・装備)の計算時
- 攻撃(レベル・ちから・装備攻撃力の合計)および守備の計算時
これらのタイミングでそれぞれ、
- 切り捨ても四捨五入も行わないそのままの値で処理(以下そのまま)
- 小数点以下四捨五入(以下四捨五入)
- 小数点以下切り捨て(以下切り捨て)
を計算し、各場合のダメージを求めていく。最大・最小ダメージを求め、実測値と合致するものを探す。
まずは各種攻撃力の計算から。上の計算式にレベル23、ちから8、武器つよさ26を当てはめ、それぞれそのまま、四捨五入、切り捨てを計算すると下の表のような結果が得られる。
処理方法 | レベル攻撃力 | ちから攻撃力 | 武器攻撃力 |
---|---|---|---|
そのまま | 21.20640412 | 4.825330397 | 15.21 |
四捨五入 | 21 | 5 | 15 |
切り捨て | 21 | 4 | 15 |
これをもとに攻撃の値を求め、敵の守備力1から守備を求めた結果とともに各処理を実行する。結果は次の表にまとめた。処理方法の見方は【攻撃力の処理方法/攻撃・防御の処理方法】とする。
処理方法 | 攻撃 | 守備 |
---|---|---|
そのまま/そのまま | 41.24173452 | 0.5 |
そのまま/四捨五入 | 41 | 1 |
そのまま/切り捨て | 41 | 0 |
四捨五入/そのまま | 41 | 0.5 |
四捨五入/四捨五入 | 41 | 1 |
四捨五入/切り捨て | 41 | 0 |
切り捨て/そのまま | 40 | 0.5 |
切り捨て/四捨五入 | 40 | 1 |
切り捨て/四捨五入 | 40 | 0 |
この表から最小・最大乱数でのダメージ(=最小・最大ダメージ)を求めると次のような結果が得られる。
処理方法 | 最小ダメ | 最大ダメ |
---|---|---|
そのまま/そのまま | 35 | 46 |
そのまま/四捨五入 | 35 | 45 |
そのまま/切り捨て | 36 | 46 |
四捨五入/そのまま | 35 | 45 |
四捨五入/四捨五入 | 35 | 45 |
四捨五入/切り捨て | 36 | 46 |
切り捨て/そのまま | 34 | 44 |
切り捨て/四捨五入 | 34 | 44 |
切り捨て/四捨五入 | 35 | 45 |
実測値の最小ダメ以下及び最大ダメ以上のダメージには色付けをしてわかりやすくしてみた。実測の最小・最大ダメが出現する可能性があるのは、上の表の中ではそのまま/そのままのみという結果になった。
正直拍子抜けという印象。各処理方法でダメージの出現頻度を見比べて唸る必要があると思っていたので、最小・最大の出現可否だけで処理方法を推定できたのは良かったと言えば良かった。楽ができるからね。
ちなみに、完全に蛇足だが、実測値と【そのまま/そのまま】の予測値で出現頻度を比べたヒストグラムを作るとこんな感じになる。なお、武器束ねの腕輪検証の際、武器束ねを装備した状態で同種装備0個(攻撃力アップ効果なしと判明)で100回ダメージを計測したものを追加しており、総計測数は215回となった。なお、予測値はスケールを合わせるため出現数を補正している。
うーん。大体一致してるんじゃないですかね。36・38ダメが気になるけど、もっと試行回数を重ねればそれっぽくなるんじゃないですかね。知らんけど。
結論
というわけで結論ですが、
ダメージ計算式は計算の途中で切り捨て処理を行っていない
ことが判明しました。
スプレッドシートで計算を行っているので、doubleの有効桁数を考慮していなかったり、粗は叩けば叩くほど出てくるとは思いますが私の中での結論ということにしておきます。
なんか致命的なミス等あれば教えてください。