Summary. ダメージ計算スクリプトの実装に現れる定数などについてです。

防御係数

各キャラの防御係数は DEF という連想配列に格納されています。たとえば、レンの防御係数は
DEF["レン"] = new Array(110, 100, 95, 90);
と定義されます。防御係数は残りHPに応じて4段階に変化するので、上のように配列で表現します。

なお、JavaScriptではすべてのオブジェクトが同時に連想配列でもあるので[1]、DEF の実体はオブジェクトでさえあればなんでもいいです。実際のコードで new Array() を使っているのは、ごく気分的な理由でそうなっているだけです(他の連想配列も同じ)。

定数

calc_damage.jsでは以下の定数を使います:

Constants and Functional Objects
HP_SETTING 前から順に、最大HPの 100%,75%,50%,25% を格納した配列
STATE_COR 状態補正の値を格納した連想配列
TYPE.NORMAL(cor) 上書き補正の計算を行う関数です。Correctionの値を変更します
TYPE.MULT(cor) 乗算補正の計算を行う関数です
TYPE.SUB(cor) 減算補正の計算を行う関数です

HP_SETTING は根性値の計算で必要になります。STATE_COR は "STAND", "CROUCH", "FLOAT", "DOWN" の4つの文字列に対して適切な数字を対応させます。

TYPE.* 系の関数は、定数に近いノリで使っています。技の種類を表す定数と思ってもらえばよいかと。

FLOAT_TABLE

AAのみに存在する応急処置です。

MBAAのダメージ計算は単精度の浮動小数で行われているようで、JavaScriptで単純に計算式を模倣すると微妙な誤差が発生します(JavaScriptは倍精度なので)。

この問題に対処するため、FLOAT_TABLE という連想配列に一部の数値の 単精度における近似値 を格納しておきます。この値を参照するには ft() という関数を使います。これにより誤差の発生を軽減できます。

なお、用意する値は「防御係数/状態補正に登場する数値」のみです。

テーブルの作り方

一番簡単なのは、C言語で次のようなプログラムを書くことです:
#include <stdio.h>
 
char *format = "FLOAT_TABLE[%d] = %f / 16384 * 100;\n";
 
float shift(float f){
  return f * 16384;
}
 
int main(){
  printf(format, 160, shift(1.6f));
  printf(format, 140, shift(1.4f));
  printf(format, 120, shift(1.2f));
  printf(format, 115, shift(1.15f));
  printf(format, 110, shift(1.1f));
  printf(format, 105, shift(1.05f));
  printf(format, 100, shift(1.0f));
  printf(format, 98, shift(0.98f));
  printf(format, 95, shift(0.95f));
  printf(format, 90, shift(0.9f));
  printf(format, 85, shift(0.85f));
  printf(format, 80, shift(0.8f));
  printf(format, 70, shift(0.7f));
  printf(format, 65, shift(0.65f));
  printf(format, 60, shift(0.60f));
 
  printf(format, 108, shift(1.08f));
  printf(format, 102, shift(1.02f));
  printf(format, 96, shift(0.96f));
  printf(format, 92, shift(0.92f));
  printf(format, 88, shift(0.88f));
  printf(format, 87, shift(0.87f));
  printf(format, 82, shift(0.82f));
  printf(format, 42, shift(0.42f));
  printf(format, 40, shift(0.40f));
 
  return 0;
} 
ここで、16384 = 214です。ビットパターンを保ちながら数字を大きくしています。これをJavaScript側でもう一度小さくすることで目的の値が得られます。





[1]
たとえば、TYPE.NORMAL と書くのと TYPE["NORMAL"] と書くのは同じ意味。
最終更新:2012年12月10日 09:24