ぼやきごと/2009-10-18/【S-RPG製作】4. 編成画面:ユニットパラメータ のバックアップソース(No.1)

#blog2navi()
*【S-RPG製作】4. 編成画面:ユニットパラメータ [#m1de79cb]
LEFT:Prev: [[[【S-RPG製作】3. 編成画面:ユニット情報>ぼやきごと/2009-10-17/【S-RPG製作】3. 編成画面:ユニット情報]]]

一週間連続でぼやきごとを更新するなんて何年振りだろうか…。~
いや、もしかしたら初めてかもしれない。

さて、今回は編成画面で見ることのできるユニットのパラメータについて説明します。~
まずパラメータの一覧を再掲します。

-現HP/最大HP
-現SP/最大SP
-現MP/最大MP
-現WT/最大WT
-攻撃力(ATK)
-防御力(DEF)
-属性耐性(-100%〜100%)
--火
--氷
--風
--雷
--土
-回避(正面回避率)
-ガード
--物理(P-GRD)
--魔法(M-GRD)
-移動力
-跳躍力
--縦(縦跳躍力)
--横(横跳躍力)

これらのうち、HP、SP、MP、WT、防御力、回避、ガード、移動力、跳躍力については以前書いた記事以上に書くことは特にありません。~
以前書いた記事([[2009-10-09/ゲーム制作は妄想段階が一番楽しい>/ぼやきごと/2009-10-09/ゲーム制作は妄想段階が一番楽しい]])を参照してください。~
今回主に書くのは次の二点になります。

-攻撃属性および属性耐性について。
-物理攻撃、魔法攻撃の計算式について(以前書いたものから変更)。

さて、RPGの一つでもやったことのある人ならば、『属性』と聞けば大体どういう要素なのか想像が付くと思います。~
このゲームにおける攻撃属性および属性耐性もそういった一般的な『属性』から大きく外れるような要素ではありません。~
ただし、一つの攻撃手段に基本属性と追加属性という二つの属性を併せ持つ点がやや独特かもしれません。

まず属性名、区分、およびその属性を持つ攻撃例の一覧を次の表に示します。

|~属性名|~区分|~攻撃例|h
|LEFT:|LEFT:|LEFT:|c
|~斬撃|基本|剣、槍での攻撃|
|~打撃|基本|鎚、ハンマーでの攻撃|
|~射撃|基本|弓矢での攻撃|
|~法撃|基本|魔法での攻撃|
|~火|追加|火属性魔法での攻撃|
|~氷|追加|氷属性魔法での攻撃|
|~風|追加|風属性魔法での攻撃|
|~雷|追加|雷属性魔法での攻撃|
|~土|追加|土属性魔法での攻撃|
|~魔|追加|魔属性魔法での攻撃|

このゲームにおけるあらゆる攻撃手段は1個の基本属性と0個以上の追加属性を持ちます(一部武器には例外あり)。~
そして相手のその属性に対する属性耐性によって与えるダメージが変動します。~
属性耐性の値は、0%が基本値で、プラスになるほどダメージ軽減、マイナスになるほどダメージ増加となります。~
即ち、実際に受けるダメージの割合は(100−属性耐性)%ということになります。

物理攻撃および魔法攻撃の与ダメージに影響するパラメータは次の通りです。

:物理攻撃|
--自分側
---現在のSP
---攻撃力(ATK)
---武器の基本属性(1個)
---武器の追加属性(0個または1個)
---攻撃手段の追加属性(0個以上)
---攻撃手段による加算補正値
---攻撃手段による乗算補正値
--相手側
---現在のSP
---防御力(DEF)
---属性耐性
:魔法攻撃|
--自分側
---現在のMP
---魔法の基本威力値
---魔法の基本属性(1個)
---魔法の追加属性(0個以上)
--相手側
---現在のMP
---属性耐性

以上を踏まえて以前の記事に書いた計算式を修正すると次のようになります。~
なお、式 @code{[x]}; は、この説明においては'' @code{x}; の小数点以下を削除する処理''となります(ガウス記号ではない)。~
即ち、 @code{[3.14] = 3}; 、 @code{[-3.14] = -3}; ということです。

:属性乗算値 @code{De}; (物理、魔法共通)|攻撃手段の基本属性を @code{E0}; 、追加属性をその個数分だけ @code{E1, E2, …}; とする。~
また、ある属性を @code{E}; としたとき、その属性に対する相手の属性耐性を @code{D.E}; と表す。
--追加属性が無い場合
 De = (100−D.E0)÷100
--追加属性が1個の場合
 De = (100−(D.E0+D.E1))÷100
--追加属性がn個の場合
 De = (100−(D.E0+D.E1+…+D.En))÷100
:物理与ダメージ|攻撃手段(通常攻撃や技等)による加算補正値を @code{Ba}; 、乗算補正値を @code{Br}; とする。
 As = [自分のSP÷10]
 Ds = [相手のSP÷10]
 Dd = 1−(相手のDEF÷1000)
 基本威力値 = 攻撃力+(As−Ds)
 与ダメージ = [[[(基本威力値+Ba)×Br]×Dd]×De]
:魔法与ダメージ|
 Am = 自分のMP÷1000
 Dm = 相手のMP÷1000
 与ダメージ = [[魔法の基本威力値×(1+(Am−Dm))]×De]

計算式だけだとわかりにくいと思うので、具体例を挙げようと思います。~
まず、次の三つの攻撃手段を例として定義します。

-攻撃力300(斬撃のみ)の剣による通常物理攻撃
-攻撃力250(打撃、火)の鎚による通常物理攻撃
-魔法威力250(法撃、雷)の魔法による魔法攻撃

これらの攻撃手段で、次のような属性耐性を持つモンスターを攻撃するとします。

|~属性名|~耐性値|h
|LEFT:|RIGHT:|c
|~斬撃|20%|
|~打撃|25%|
|~法撃|-40%|
|~火|-25%|
|~雷|50%|

自分のSPとMPは共に400、相手のSPとMPは共に200、相手のDEFは100とします。~
また、通常物理攻撃の加算補正値は0、乗算補正値は1.0とします。~
この時、それぞれの攻撃手段で与えられるダメージを上述の計算式によって求めると次のようになります。

:攻撃力300(斬撃のみ)の剣による通常物理攻撃|
--属性乗算値 @code{De};
 De = (100−20)÷100 = 0.8
--与ダメージ
 As = [400÷10]             = 40
 Ds = [200÷10]             = 20
 Dd = 1−(100÷1000)        = 0.9
 基本威力値 = 300+(40−20) = 320
 与ダメージ = [[[(320+0)×1.0]×0.9]×0.8] = 230
:攻撃力250(打撃、火)の鎚による通常物理攻撃|
--属性乗算値 @code{De};
 De = (100−(25−25))÷100 = 1.0
--与ダメージ
 As = [400÷10]             = 40
 Ds = [200÷10]             = 20
 Dd = 1−(100÷1000)        = 0.9
 基本威力値 = 250+(40−20) = 270
 与ダメージ = [[[(270+0)×1.0]×0.9]×1.0] = 243
:魔法威力250(法撃、雷)の魔法による魔法攻撃|
--属性乗算値 @code{De};
 De = (100−(−40+50))÷100 = 0.9
--与ダメージ
 Am = 400÷1000 = 0.4
 Dm = 200÷1000 = 0.2
 与ダメージ = [[250×(1+(0.4−0.2))]×0.9] = 270

計算式やこの計算結果等から言えることは次の通りです。

-たとえ攻撃力で勝っていようが負けていようが属性次第で与ダメージはいくらでも変動する。
-技の属性で相手の弱点を突いても、武器自体の属性が相手に効きの悪いものだと最終的な与ダメージは下がってしまう。
-魔法攻撃の威力にはMPの現在値が乗算値として大きく関わる。
-物理攻撃と魔法攻撃は計算式からしてまったくの別モノであると考えた方がよい。

また、その他の属性に関する事項は次の通りです。

:武器について|
--基本属性に法撃は存在しない。
--武器自体が持つ追加属性数は0個または1個である。
:魔法について|
--基本属性は法撃が普通である。
--基本的には1個の追加属性を持ち、複数の追加属性を持つ魔法は少ない。
:人間ユニットの属性耐性について|
--人間ユニットのすべての基本属性および魔属性に対する属性耐性は0%固定となる。
---表示されないだけで内部的には耐性値を持っており、魔法効果等によっては変動する場合もある。
---魔属性は主にモンスター側の理不尽な魔法攻撃に適用されることになるでしょう…。

パラメータに関してはこんな所でしょうか。~
属性計算をなるべく単純化すべく複数の属性耐性は加算する方式にしたのですが、もしかしたら仕様を変更するかもしれません。

次回はアイテムについてです。~
アイテムの種類と、アイテム情報シーン内の遷移について説明することになると思います。

RIGHT:Category: [[[創作>ぼやきごと/カテゴリ/創作]]][[[ゲーム>ぼやきごと/カテゴリ/ゲーム]]] - 2009-10-18 01:52:54
----
RIGHT:&blog2trackback();
#comment(above)
#blog2navi()