Summary. ダメージ計算スクリプトの実装のうち、ダメージ計算の部分についてです。
やること
今回は、
ダメージ計算の中枢ともいえる「1ヒット毎にダメージを計算する」処理を行います。ステータスに関係する広域変数をいくつか使っているので、詳しくは「パラメータ」の項をご参照ください。
| Function summary |
| init_status() |
計算結果に関係する広域変数をすべて初期化する。 init_defence()、init_state() という下請け関数を使う |
| calc_guts() |
HP から根性値を求める(0~3) |
| calc_hit_cir() |
HC と Guts からヒット数補正を求める |
| proceed(dmg, cor, type) |
攻撃力=dmg、補正の種類=type、補正値=cor の攻撃を実行する |
この中で最重要なのは、実際に計算処理を行う proceed() 関数です。上の表では省略しましたが、実用上の観点からいくつか proceed 関数のラッパーが用意されています。
パラメータ
ダメージ計算に関係する広域変数は以下の通りです:
| Variables |
| HP |
現在の残りHP |
| Guts |
現在の根性値 (0~3) |
| Defence |
現在選択されているキャラの防御係数リスト |
| HC |
現在のヒット数 (Hit Count) |
| Correction |
現在の技補正 (海外ではProrationで通ってるらしい) |
| State |
現在のやられ役の状態 |
| HK |
AAのみ。ヒスコハフラグがチェックされていると1.035、そうでなければ1.0 |
State は "STAND", "CROUCH", "FLOAT", "DOWN" のいずれかの文字列です。
ヒスコハのダメージ補正が正確にわかっているのはAAのみです。そのため、他のバージョンに対しては今まで通りの方法(単体キャラと別にヒスコハ版のキャラを用意)で対処します。
proceed関数(AA以外)
見てもらえばすぐわかりますが、基本的に
基本計算で説明した方法をそのままコードにするだけです:
proceed = function(dmg, cor, cor_type){
Guts = calc_guts();
dmg = Math.floor((dmg * Defence[Guts]) / 100);
dmg = Math.floor((dmg * calc_hit_cor()) / 100);
dmg = Math.floor((dmg * Correction) / 100);
dmg = Math.floor((dmg * STATE_COR[State]) / 100);
HP -= dmg;
HC++;
cor_type(cor);
}
ここに登場する Math.floor() は小数点以下を切り捨てるための関数です。
強いて言えば最後の1行がややわかりづらいでしょうか。技補正の種類を表現する TYPE.NORMAL や TYPE.MULT は、それ自身が技補正の計算をする関数だったことに注意してください。
proceed関数(AA)
半ば間違い探しに近いですが、よく見ると少しだけAA固有の処理があります:
proceed = function(dmg, cor, cor_type){
Guts = calc_guts();
dmg = Math.floor((dmg * ft(Defence[Guts])) / 100);
dmg = Math.floor((dmg * calc_hit_cor()) / 100);
dmg = Math.floor((dmg * Correction) / 100);
dmg = Math.floor((dmg * ft(STATE_COR[State])) / 100);
dmg = Math.floor(dmg * HK);
HP -= dmg;
HC++;
cor_type(cor);
}
応急処置(擬似単精度)
データの羅列のページで解説した通り、PS2版AAでは単精度浮動小数が用いられているようです。すべての小数を単精度に変えることはできませんが、取る値の限定される防御係数&状態補正は ft() を使って強引に単精度化します。
ヒスコハ補正
ムックによれば、ダメージ計算の最後のほうでヒスコハ補正が施されるらしいです。したがって、このスクリプトでもそれに倣って最後に補正を掛けます。
ラッパー
さて、理論上は proceed() さえあればどんな技でも実装可能です。しかし、必要最低限の関数しか用意されていないのでは使いやすさに難があります。いくつか補助役の関数を準備しておくのがよいです。
| Function summary |
| proceed_FA(dmg, cor, type) |
浮かせ技の処理を行う。proceed() のあと、State を適切に変化させる |
| normal(dmg, cor) |
上書き補正の場合 |
| normal_f(dmg, cor) |
normal() の浮かせ技版 |
| mult(dmg, cor) |
乗算補正の場合 |
| mult_f(dmg, cor) |
mult() の浮かせ技版 |
| sub(dmg, cor) |
減算補正の場合 |
| sub_f(dmg, cor) |
sub() の浮かせ技版 |
ここで、f は Float の頭文字をとっています。
proceed_FA関数
浮かせ技を実装するときに使います。普通に proceed() を呼んだ後、
やられ役の状態が DOWN 以外ならば、State を FLOAT に変更する
という処理を行います。あちこちから直接 State を読み書きするよりずっといいです。
その他の関数
ただのラッパーです。TYPE.NORMAL などをいちいち使うのが面倒なので用意しました。
最後に _f が付いているものは、proceed() の代わりに上の proceed_FA() を使います。
最終更新:2012年12月10日 09:24