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