パラメータとダメージ計算式のはなし

今回はお気持ち表明でもライフハックでもなく、ゲームデザインというか設計みたいなお話です。

ぼくはゲームをやるのが好きで、昔の話ですがRPGをたくさんやっていた時期がありました。RPGの戦闘というのは基本的に敵味方のパラメータの数値や取った行動から与えるダメージが決まり、相手のHPを0にして倒すというものがほとんどです。

ゲームによってパラメータの種類は様々ですが、だいたいのゲームには「攻撃力」「防御力」「HP」という概念があります。

言うまでもないことですが各々の役割は以下のような感じです

攻撃力:攻撃行動で相手に与えるダメージの大きさに影響する。当然、大きいと与えるダメージが増える。
防御力:攻撃を受けた時に受けるダメージの大きさに影響する。大きいと受けるダメージが減る。
HP:ダメージを受けるとその分だけ減る。0になると行動不能になり、パーティ全員のHPが0になるなどで敗北。敵全員のHPを0にすると勝利。

また、RPGにはふつう成長の概念があって、戦闘を重ねることでこれらのパラメータが上昇していくのが一般的です。

今回はこれらのパラメータの成長やダメージを計算する式についての考察というか思うことを書いていきます。

パラメータの成長について

多くのRPGでは、戦闘に勝利することで得られる経験値が一定に達するごとにレベルアップしステータスパラメータが上昇するという仕組みが採用されています。ほかには、戦闘内容によってパラメータが個別に少しずつ上昇していく作品などもあります。

どちらにせよ、この成長において、もっともシンプルでわかりやすいのは、線型的な成長です。これは、多少のランダム性こそあれど、1レベルアップごとのパラメータの増分は常に一定です。

実はぼくはこれ、「しょっぺえな」と思ってしまうんですね。レベルが上がるにつれて、1レベルの重みが薄くなるからです。

以下のようなケースを考えてみましょう.

Lv1 : HP10 Lv2 : HP15
Lv20 : HP105 Lv21 : HP110

これはレベルごとにHPが5ずつ増えると仮定したときのものです。
Lv1→2ではHPが1.5倍になっていますが、Lv20→21ではHPの増加は5%未満です。打たれ強さに関しての成長率が明らかに違います。
基本的に適正レベルで進める限りは、レベルアップに必要な戦闘回数は同程度になるように調節されるにも関わらず、高レベルになればなるほどレベルアップのうまみが少なくなるのです。

その穴埋めを武器で行うものがあり、序盤だと素の攻撃力50+武器攻撃力30みたいなバランスなのに、終盤だと素の攻撃力200+武器攻撃力1200みたいな感じになっていたゲームもあります。レベルを上げる旨みが最大HP増加と技習得ぐらいしか無かったなあ、アレ。

ではレベルアップのうまみが常に一定になるような状況はどういうものでしょうか?
それはステータスの成長がべき乗になる場合です。

Lv1のHP:10 Lv2のHP:12
Lv20のHP:383 Lv21のHP:460

これでHPの成長率はレベルにかかわらず一定の1.2倍になりました。1レベル上げたときの恩恵が一定になったわけです。

しかしこれで本当に全部解決なのでしょうか?この方法では次のような事態が起こってしまいます:

Lv50のHP:91004 Lv80のHP:21602285

凄まじいインフレですね。べき乗なのでこうなるのは当然と言えます。

というわけで、べき乗で成長していくゲームは見たことがありません。

実際はどうなっているかというと、線形か、緩やかに上昇率が上がっていくものが多いのではないでしょうかね。おおよそパラメータはレベルの1.2乗~1.5乗に比例する程度。
それでも、1レベルの重みは薄く感じてしまうわけですが……

この「高レベルになればなるほど1レベルの重みが薄くなる」問題は、別の要素で解決されている場合が多いですね。

これより先の議論では、「ダメージ計算式」も深くかかわってくるので、先にそちらの話をしておきます。

ダメージ計算式について

ダメージ計算式とは、その名の通り、戦闘におけるダメージを各種パラメータから計算する式のことです。さまざまな流派がありますが、代表的なものを紹介していきます。

①減算式

減算式は最もシンプルで、

ダメージ=攻撃力-防御力

で計算されます。攻撃力や防御力、最終ダメージに一定の倍率がかかったりすることはありますが、それらは本質的には同じです。アルテリオス式といわれることもありますが、有名どころだとドラクエはこの減算式です。

減算式はシンプルながら実は調整が難しいことでも有名です。

その理由ですが、これは「想定されている適正レベルから離れた時のダメージの変動が激しすぎる」という特性によるものです。

この方式は、攻撃力から防御力を減算するという計算上、防御力が攻撃力を上回っている場合に一切ダメージが通らなくなります。これはつまり,適正レベルに満たない場合に途端に勝ち目がなくなるということです。

極端な場合、適正レベルより少し低いだけでもまったく敵に攻撃が通らず勝てないが,1~2レベル上げるだけでいきなり互角の戦いになる、ということが起こります。

逆の場合も然りで、攻撃側の攻撃力が高すぎる場合,防御力の多寡がほぼ無意味になります。攻撃力1000の攻撃に対しては、防御力0でも100でもダメージは1割しか変わらないことになります。

これが「適正レベルでのレベルの重みがとても強く、逆に適正レベル以外でのレベルの重みがほとんどなくなる」理由です。
適正レベル(というか、適正ステータス)の範囲が狭いということは、パーティ内でのキャラ格差が出やすいということでもあります。攻撃力100と120のキャラでは、数値上の差は1.2倍なのに、実ダメージだと倍近い差が出ることが普通に有り得ます。


この問題のため、多くは全体的に防御力が攻撃力に対して低めになるように調整して、攻撃力や防御力の微妙な変化で極端にダメージが変わらないようにし、打たれ強さはHPで調整することが多いと思いますが、それはそれで結局「1レベルの重みが少なくなる」という問題が発生します。とくに防御力は少し上げた程度ではあまり恩恵が得られなくなります。

実際、減算式で優れたゲームバランスのゲームは、レベルアップではあまりステータス自体は上がらないとか、そもそも多くの敵の防御力が0で、HPで硬さの管理をしているとかのパターンが多い気がします。

(意外なところだとゼルダBotWなんかもこれですね あのゲームは「適正レベル」から外れたプレイがいくらでもできるくせに減算式のおかげでまじで即死しやすくなっている リトライ前提のアクションゲームだからこそ許される調整だと思う あと普通に変な縛りプレイでもしてない限りこっちが強くなるタイミングと敵が強くなるタイミングをある程度あわせてくれるのもある
リンクには防御力があるがHPが低い、敵には防御力がないがHPが高いという調整から、敵の武器使いまわしを前提にしているのにどのような段階でも「攻撃食らっても痛くない雑魚」と「一撃もらうだけで即死レベル」の共存を武器攻撃力をインフレさせることなく実現しているし、一方で敵には防御力がないので食らうと即死レベルの武器でもこっちが使うとそこまでぶっ壊れにならないというバランスに仕上げている すごい 低攻撃力の武器がすぐゴミと化すという弊害こそあるが、中盤以降では武器は供給過剰なのであまり気にならない)

ただ意外なメリットもあって、それは前述の「線形的な成長で生じる後半の1レベルの重み」をある程度打ち消せる点です。というのも、ダメージが減算式である以上、たとえ攻撃力100→101というたった1%の成長でも、相手の防御力が99ならダメージは2倍にもなるからですね。ゲーム後半でもレベルを上げる意味が失われにくいですね。

まとめますが、総じて特に「防御力」の扱いが難しいのが減算式です。


②除算式

減算式のそういう弱点を解消したと思われるのが除算式です。

ダメージ=攻撃力/防御力

で計算されます。攻撃力や防御力に定数を加えたりしているパターンもありますが、これも本質は同じです。
除算式の良いところは、攻撃力や防御力の具体的な数値からダメージを想像しやすいことでしょうか。攻撃力が2倍になればダメージは2倍になり、防御力が2倍になればダメージは半分になるのです。また、防御力が高すぎても多少はダメージを受けますし、攻撃力が高すぎても防御力が全く無駄になるということはありません。

しかしこの除算式にも弱点はあります。
(ゼロ割が発生しうるという点は、例外処理や式の工夫で排除できるので今回は考えません)
まず、主に線形パラメータアップにおける「後半ほど1レベルの重みが減る」問題を無視できなくなることです。
実は、減算式では、適正レベルでのレベルの重みが極端に大きい仕様でしたが、これが後半のレベルの重み問題を打ち消せるのも事実でした。除算式ではこれはできません。攻撃力も防御力も、少し上げた程度では実ダメージに殆ど影響が無いということが起こります。

RPGではないですがモンハンはこの方式で、実際にゲーム後半では最低限の防御力を確保すればそれ以上の防御力にあまり意味がない、という感じになり、防御力よりもスキルの方が重要度が高まる調整になってます。低防御だけどスキルが優秀という装備を殺さない設定とも言えますね。

また、この計算式では、HPと防御力の差別化が難しいという難点もあります。HPを倍にしても防御力を倍にしても打たれ強さは同じになります。逆説的ですが、減算型のデメリットを逆利用した「防御は硬いがなんとかして装甲を上回れば簡単に倒せる敵」「攻撃は通らないが最低保証ダメージを積み重ねることで倒せる敵」みたいなのは作れません。
防御力を複数種類作る(物理と属性で分ける)とかでお茶は濁せますが。

ところで、減算式と除算式には共通のデメリットというか特性があるのには気づいたでしょうか。

それは、「攻撃力と防御力が同じスケールで成長すると、ダメージが一切変化しない」ということです。
何を当たり前なことを?と思うかもしれませんが、実はそれだと困ることのが多いです。
だって、最大HPも成長しますからね。実ダメージが同じだと、後半では蚊ほどのダメージにしかならなくなってしまいます。(最大HPを成長させないという調整のゲームもありますが、例外でしょう)。

ほんとうは、最大HPの成長に合わせて平均ダメージも伸びてほしいところです。
それを考慮にいれた計算式が、次のものです。

③二乗除算式

ダメージ=攻撃力^2/防御力

攻撃力を二乗して計算に使います。これで、攻撃力と防御力が同じスケールで増加した場合、実ダメージは攻撃力の成長に比例することになります。その他の特性は、概ね普通の除算式と同じです。
これはこれで、攻撃力の増加量に対してダメージが増える割合が大きくなりすぎやすいというデメリットが生じますが。攻撃力2倍だとダメージが4倍ですからね。防御力は2倍にしてもダメージ半分の半分のままなのに。

これを修正した計算式もあって、

③-2 レベル型二乗除算式

ダメージ=レベル×攻撃力/防御力

ですね。これはレベルが同じなら、攻撃力の比率がそのままダメージ比率になるので、前述の問題は解決できます。レベルアップによるダメージのインフレをそのまま(攻撃威力が二次関数で増加)にしつつ、同レベル間でのキャラ間格差や一時的なバフデバフは二次式にならないという、いいとこ取りですね。

……ですが、これはこれで、「レベル」という、間接的にしか攻撃力に関与しなかったはずのパラメータが直接ダメージに影響しているのがもにゃるのはぼくだけですかね?
Lv10の攻撃力100とLv15の攻撃力100が、攻撃力の数値は同じなのにダメージに違いが出るの、すごくもやっとするんですが……

ちなみに、ポケモンはこのレベル型二乗除算式が採用されてます。ポケモンは(レベルフラットの対人戦を除けば)あんまりダメージを緻密に計算して……というゲームではないですしそもそも技威力やタイプ相性の方がずっと重要なので、あんまり旅でパラメータの実数値に気を配ることは少ないですが。素早さ以外は。

初期の頃のFFは減算式ですが、一応レベル型の要素もあって、直接レベルは参照しませんがレベルや力ステータスなどから算出される「攻撃回数」や「攻撃倍率」をかけていたと思います。根本は減算式で、攻撃力-防御力なのですが、攻撃力が武器攻撃力とイコールだったり、多くの敵の防御力が0だったりしてますね。強い武器が無いと、いくらレベルを上げても攻撃が通らない敵がいる、というのはどうなんだ、とも思いますが。

④割合軽減式

ダメージ=攻撃力×(定数-防御力)

ちょっと異彩を放っている感もありますが、割合軽減式のゲームも存在します。クロノトリガーとかFF7とかはこれじゃなかったかな。

ダメージを、防御力の割合だけカットする形ですね。防御力ゼロだと軽減率0%、防御力が定数と同じになると軽減率100%(つまりダメージ0)というパターンです。
これは、基本的にどうやっても防御力が定数に届くほどは成長しないという前提で設計するものではあります。
あとこれは防御力が低いうちは殆ど防御力が意味を成さない設計でもあります。
軽減率1%が2%になるのと、98%から99%になるのでは全く重みが違いますね。前者は殆どダメージは変わりませんが、後者だとダメージは半分になっています。
前述の「どうやっても防御力が定数に届くほどは成長しない設計」にすることから、あんまり防御力が意味を成さないことが多いです。最強育成してもせいぜい軽減率50%とかだったりするので。
防御力はオマケで、実際はHPと耐性でバランス取ってることが多い気がします。

⑤べき乗式

少数派ではありますが、

ダメージ=攻撃力×(1未満の正の定数^防御力)

という式が採用されているゲームもあります。
防御力の重み、「1上がることで軽減できる割合」が常に一定です。が、当然べき乗なので指数爆発というか、0に収束していく現象が起こります。せいぜい防御力が一桁スケールで、HPもあまり成長しないという調整になるでしょう。

結局?

結局どの計算式にもメリットとデメリットがありますね。ぼくの思う理想の計算式と成長率は、

・攻撃力と防御力という数値だけでダメージが決まる。こっそりレベルを参照したりしない。
・どのレベル帯でも、成長の重みが同じ。これは、「表記攻撃力」と「実ダメージ」の両方において。
・防御力を死にステータスにせず、HPとは差別化する。
・適正レベルが極端に狭くなりすぎない。
・キャラ間格差を助長しすぎない。しかし、キャラごとのステータス上の差別化はちゃんとする。
・ちゃんとゲームが進むにつれダメージはインフレしていく。

なんですが、これを満たせる成長曲線とダメージ計算式はあるのでしょうかね?
ちゃんと考えたわけではないのでよくわからん。

ということで(?)

皆も、「ぼくの考えた最強の成長曲線&ダメージ計算式」をつくってみようね!!!

もし「これ最強だろ」とおもうようなものが出来たらおしえてね。

この記事が気に入ったらサポートをしてみませんか?