【ダメージ計算式】

Last-modified: 2025-11-21 (金) 19:16:16

概要

相手に与えるダメージを決める計算式。RPGに必要不可欠な、そして難易度やバランスといったゲームシステムの根幹部分を決定する超重要事項。
通常攻撃、スキルによる攻撃、どちらとも基本的には自身の持つ『攻撃力?』と相手の持つ『守備力?』を計算式の天秤にかけ算出された値を『ダメージ』として相手のHPから減算する。
基本的に通常攻撃は敵一体に対し効果を持つが、ざくろのみ敵全体に効果がある。

解説

[(a.atk*4-b.def*2),rand(2)].max

これがMO4で使われている通常攻撃のダメージ計算式である。
ここでは計算式を2分割して解説する。

  • (a.atk*4-b.def*2)

ざっくり言うと『攻撃力の4倍-防御力の2倍』である。
よくMO4はドラゴンクエストと戦闘システムが似ていると言われる事があるが、敵に与えるダメージ数値は序盤から全く違う。これはドラゴンクエストのダメージ計算式が『攻撃力の1/2倍-防御力の1/4倍』であるため。どちらも計算式が『攻撃力-防御力』で決まるアルテリオス計算式に補正をかけたものであるという点では同じである。

計算式中の『atk』は攻撃力を指し、直前に『a.』がついている事で使用者の能力値、すなわち『a.atk』=『使用者の攻撃力』を指す。同様に、『b.』は対象の能力値を指し、『b.def』=『対象の防御力』を指す。
つまり、正確に言うならば『使用者の攻撃力の4倍-対象の防御力の2倍』である。
おおよそ使用者の攻撃力が1/4上がるごとにダメージは1上昇(攻撃力が1上がるごとにダメージは4上昇)し、対象の防御力が1/2上がるごとにダメージは1低下(防御力が1上がるごとにダメージは2低下)する。逆もまた然り。

  • ,rand(2)].max

rand():ランダム数値算出関数
0~()内の数値から1を引いた値、つまりここでは0~1の値をランダムで算出する関数。

[].max:最高値算出関数
元々は数値比較関数。これを用いると.maxの前に置いた[]内の数値で一番大きい数値を算出する。
例えば、[a,b].maxという式を作り、a=1,b=100という数値を代入されると、[a,b].maxからは1と100の内大きい方の数値を算出するので、当然100が算出される。

つまり、厳密に言うならば

[(a.atk*4-b.def*2),rand(2)].max
使用者の攻撃力の4倍-対象の防御力の2倍(最低値0~1)

になる。
普通なら[]内の左側にある『a.atk*4-b.def*2』、つまり『使用者の攻撃力の4倍-対象の防御力の2倍』の方が右側の『rand(2)』、つまり『0~1』よりも大きくなるのでそのまま 『使用者の攻撃力の4倍-対象の防御力の2倍』がダメージとして反映されるが、こちらの攻撃力が極端に小さい、又は相手の防御力が極端に大きい場合は『a.atk*4-b.def*2』が0を下回る負の数を算出し、[(a.atk*4-b.def*2)=-n,rand(2)],max(n>0)となるのでこの場合は右側の0~1が算出されるようになる。
つまり、どれだけ自身の攻撃力が低くても、また相手の防御力が高くても1ダメージは与えられる可能性があるという事になる。

通常攻撃の計算式は多くの沼で上記の通りなのだが、唯一ざくろは通常攻撃が敵全体となっており、一番左の敵に与えるダメージの計算式は上記と同じだが、敵にダメージを与えるごとに威力が7%ずつ減衰していくようになっている。

実際のダメージ量には後述する乱数と、『属性有効度?』や『状態異常?』によるダメージ補正、『メタルボディ?』、『物理/魔法耐性?』といった要素が関係している。

乱数

実際与えるダメージには若干の数値のブレが生じる。これには乱数が関係しており、MO4にはダメージ計算式とは別に『分散度』という数値が設定されている。この数値は効果値のばらつきを設定する値であり、例えば分散度が10なら算出されたダメージの10%分最終的なダメージが上下するといった具合に設定した数値のパーセント分、最終的な効果量に幅が生まれる。
しかし、MO4では実際に与えるダメージに分散度のマイナス乱数が発生せず上振れのみが起こり、0か1ダメージにならない限り常に『使用者の攻撃力の4倍-対象の防御力の2倍』が与えるダメージの最低値となっている。
これは、分散度を決定するスクリプトが

amp = [damage.abs * variance / 100, damage.abs].max.to_i

となっていると考えられているため。
これに関しても部分部分解説する。

  • amp:最終的な与えるダメージ

厳密に言えばこの後ガード状態によるダメージ補正がかかるが、最終的なダメージはここで決まると考えていいだろう。

  • [damage.abs * variance / 100, damage.abs].max

damage.abs:ダメージの絶対値
何故絶対値にしているのかと言うと回復技はダメージに負の数をかけているためである。
しかし、MO4の回復技は軒並み固定値回復の為、damage.absには『a.atk*4-b.def*2』、つまり『使用者の攻撃力の4倍-対象の防御力の2倍』の数値が代入されると思って良いだろう。

variance / 100:分散度
スキルごとに設定されている分散度。『variance』の部分に0~100の数値を代入する事で分散度を『0%~100%』にすることができる。

[].max:最高値算出関数
前述した通り[]内にある数値から一番高い数値を算出する関数。

.to_i:整数化
算出後の数値を整数にするスクリプト。これによりダメージは少数ではなく整数になる。

よって、このスクリプトが示す意味は

[amp = damage.abs * variance / 100, damage.abs].max.to_i
最終的なダメージ=『使用者の攻撃力の4倍-対象の防御力の2倍』に分散度を掛けた数(乱数によるダメージの下振れ無し)

となる。

つまり、『[damage.abs * variance / 100, damage.abs].max.to_i』は『使用者の攻撃力の4倍-対象の防御力の2倍』に分散度を掛けた後の数値が掛ける前の数値より高ければそのまま掛けた後の数値をダメージにし、低くなった場合は掛ける前の数値をダメージにして整数化するスクリプトとなる。

スキルによっては分散度が低めに設定されていたり、0になっている場合もある。運要素を極限まで排除したモード『トライアル』ではそもそも乱数によるダメージの上下が一切起こらないようになっている。

スキル倍率

上記のダメージ計算式を1とし、各スキルにはそれぞれ威力倍率が設定されている。
例えば威力倍率が2倍なら単純火力は通常攻撃の2倍になる。
スキルの威力倍率に関してはスキルごとの個別記事を参照。