0 初めに

これはファイナルファンタジー2(以下FF2)のWSC版の乱数解析の結果をまとめたものです。

解析に際してはFF2よ永遠なれをかなり参考にさせていただきました。
膨大なデータを公開しているスルメさんに深く敬意を表します。

0.1 表記

0.1.1 計算式について

A+B:見た通りの足し算。
A-B:引き算。但しBがAよりも大きい時(計算結果が負)になるときは0とする。
A*B:掛け算。+-より優先して計算。
A/B:割り算。+-より優先して計算。小数点以下は切り捨て。
A%B:AをBで割った余り(例:10%3=1)。優先順位は*/と同等。
(*):括弧内は優先的に計算。


1 乱数について

1.1 乱数の使用対象

(大抵のゲームと同様に)FF2においては様々な場面で乱数が使われているはずである。

乱数が使われている、又は使われていると思われる場面を以下に挙げてみる。

移動中:
ケアル、回復アイテムの回復量
人のランダム移動
敵出現判定
クリスタルで能力アップするキャラ決定
フィールドの飛空船

戦闘中:
敵グループ決定
乱数テーブル決定
敵数決定
先制攻撃判定
行動順決定
敵行動決定
ターゲット決定
命中、回避判定
ダメージ量決定
クリティカル判定
アイテム消滅判定
一時変化解消判定
戦利品判定
ステータスアップ判定


1.2 乱数の系列と流れ方

乱数には少なくとも以下の3系列あると思われる。

・敵出現判定用
・戦闘用(敵逃走、復活HP、アルテマダメージは除く)
・その他

敵出現判定用テーブルは1種類でテーブル上の現在位置はセーブされる。
戦闘用テーブルは512種類で戦闘開始時に決定される。
その他は詳細不明で、1系列とも限らない。フレームで流れる系列が少なくとも1つ。


2 戦闘時の乱数

ここでは戦闘時の乱数を見ていく。
あらかじめ、敵味方の判定順を確認しておく。

 敵:左から順、縦位置が同じ場合上から順
 味方:上から順

ターゲットの番号に対応するのも基本的にこの順である。

2.1 戦闘開始時

以下の順番で判定すると思われる。

 敵のグループ決定(推定)→乱数テーブル決定(推定)→敵の数決定→先制判定

戦闘時に乱数との対応が分かるのはテーブル決定後の敵の数決定からである。


2.1.1 乱数テーブル決定(ややこしいので読み飛ばして結構)

先頭時の乱数テーブルの決定法は以下のように説明できる。
(実際の処理と合っているとは限らない)

まず以下のTypeA,Bの2つの基本テーブルから一つを選ぶ

Type A
       0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
   -----------------------------------------------------------------
  0| 144 124  67 142  58 199  37 147 211 232  80  34 194 209 234   7
 16| 183 156  10 229  48 141  55 133   0 197 162 223 226 244 118  32
 32| 177 112  19  39  64  88 172  25  98  51  21  82  59 195 174 238
 48|  22 254 175  28 202  36   4  11 212 248 169  56 182 134 157  54
 64|  50 231 150  72  84 247  57 136 131 187  42 251 148  93 119  81
 80| 236 135  83 139 178 180 196 108   2  29 122 167 214 235 218  46
 96| 237  96 185 243  14 105 207 217  91 159   3 164  77  12 241  41
112|  78  24  27 109 242 145 210 140 176 161 255 245  79 221 191  52
128|  95 116 138 227  62  49 106  15 215  70  99 160 230 121 158 153
144| 125 188  97 222 115 224 163  47 165 129 181 154 208  63 101 228
160|  18  40 240  45 233  68 102 107 225 110 198  43 128 190  66 250
176|  85 168 155   5  44 216 152 117  33  30 126  86 143  92 249 204
192|  74 123  87 149 151 173   8   6 203  20  13 205  38 239 186 170
208|  35  26  71 104  23 246 103  53 252 114 130  75   1 222 189 253
224| 111  90 220  16  61 137 206  76 127  94 200 193 166 179 146 120
240|  17  73  60 213 192  89 201 113  65 100  69  31 171   9 132 184

Type B
       0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
   -----------------------------------------------------------------
  0|  31 166 222 186 204  18 125 116  27 243 180 136 248  82 244   7
 16| 144 171 179 189 170  85  40 188 138 109  14 196 131 169  59 118
 32|  32 124   9 146 253  74 168 240  97 227 242 105 108 187  56 195
 48| 174 183  67 132 120  35 123 155  45 222  62 145 207   2  42 182
 64| 134 238 156 142 184 111  26  87   5 233 115  49 210 217  29 251
 80| 148 157 177  10  58  17  90  71 149  44  68 224 106 140  91 122
 96| 167  93  54 112 229 199  73 220 104 151 216 102 163  15 176 159
112|   3 214 119  22  19  48  37  60  16  23 173 152 107  47 215 161
128| 255 164 235  81 254  39 141 147 213  61 246   8 117 225 165  70
144|  99 245  77 218  50 175  64  55 211 192 137 103   6  33 110 129
160| 181 160  79  12  46 231  28  88 133 232  89 206  53 203  30 198
176|  43 154 230 221 241 236 150 202 172   0  80 201  76 252  20 126
192|  86 128 208 121 191  41 135  72  36  25 197  34 113 127 114  13
208| 205 143 190  63 158  52 237  83  84   4  98 162 194  65  94 130
224|  75  38  92  66 101 153  78  96 139 247  11  51 223 209 100 200
240| 193   1 239 249 250 228  95  24 185 178  57 212  21 226 234  69

上のテーブルを基本にしなければならない必然性はないが
TypeBの基本テーブルは敵遭遇用のテーブルと一致するのでこれを採用した。


左上を0としてID番号を振っておく。
上、左の数を足すとID番号になる。
一応示すとこんな感じ

       0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
   -----------------------------------------------------------------
  0|   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
 16|  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31
 32|  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47
 48|  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63
 64|  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79
 80|  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95
 96|  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111
112| 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
128| 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
144| 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
160| 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
176| 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
192| 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
208| 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
224| 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
240| 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255

次にテーブルの頭を決める。
0から255の数のうち1つを選びテーブルIDとする。
そのテーブルIDと同じID番号の位置が頭になる。
頭を決めたら頭の位置が先頭に来るようにテーブル全体をシフト(上下左右はループ)。
さらにテーブルIDが偶数の時はテーブルの縦横を入れ替える。
出来たテーブルが戦闘用の乱数テーブルとなる。
また、最後(右下)に来る値は特殊な扱いを受ける(通称「へそ」)。

テーブルが決まったら開始点を決める。
開始点は {テーブルID*5+11}で決まる。
表に示すと以下のようになる。
       0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
   -----------------------------------------------------------------
  0|  11  16  21  26  31  36  41  46  51  56  61  66  71  76  81  86
 16|  91  96 101 106 111 116 121 126 131 136 141 146 151 156 161 166
 32| 171 176 181 186 191 196 201 206 211 216 221 226 231 236 241 246
 48| 251   0   5  10  15  20  25  30  35  40  45  50  55  60  65  70
 64|  75  80  85  90  95 100 105 110 115 120 125 130 135 140 145 150
 80| 155 160 165 170 175 180 185 190 195 200 205 210 215 220 225 230
 96| 235 240 245 250 255   4   9  14  19  24  29  34  39  44  49  54
112|  59  64  69  74  79  84  89  94  99 104 109 114 119 124 129 134
128| 139 144 149 154 159 164 169 174 179 184 189 194 199 204 209 214
144| 219 224 229 234 239 244 249 254   3   8  13  18  23  28  33  38
160|  43  48  53  58  63  68  73  78  83  88  93  98 103 108 113 118
176| 123 128 133 138 143 148 153 158 163 168 173 178 183 188 193 198
192| 203 208 213 218 223 228 233 238 243 248 253   2   7  12  17  22
208|  27  32  37  42  47  52  57  62  67  72  77  82  87  92  97 102
224| 107 112 117 122 127 132 137 142 147 152 157 162 167 172 177 182
240| 187 192 197 202 207 212 217 222 227 232 237 242 247 252   1   6


例えばTable AでテーブルIDが20の時のテーブルは以下のようになる。
へその位置は()の位置に当り、開始点は{(5*20+11)%256=111}([]の位置)となる。

       0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
   -----------------------------------------------------------------
  0|  48  64 202  84 178  14 242  62 115 233  44 151  23  61 192  58
 16| 141  88  36 247 180 105 145  49 224  68 216 173 246 137  89 199
 32|  55 172   4  57 196 207 210 106 163 102 152   8 103 206 201  37
 48| 133  25  11 136 108 217 140  15  47 107 117   6  53  76 113 147
 64|   0  98 212 131   2  91 176 215 165 225  33 203 252 127  65 211
 80| 197  51 248 187  29 159 161  70 129 110  30  20 114  94 100 232
 96| 162  21 169  42 122   3 255  99 181 198 126  13 130 200  69 [80]
112| 223  82  56 251 167 164 245 160 154  43  86 205  75 193  31  34
128| 226  59 182 148 214  77  79 230 208 128 143  38   1 166 171 194
144| 244 195 134  93 235  12 221 121  63 190  92 239 222 179   9 209
160| 118 174 157 119 218 241 191 158 101  66 249 186 189 146 132 234
176|  32 238  54  81  46  41  52 153 228 250 204 170 253 120 184   7
192| 183 177  22  50 236 237  78  95 125  18  85  74  35 111  17 144
208| 156 112 254 231 135  96  24 116 188  40 168 123  26  90  73 124
224|  10  19 175 150  83 185  27 138  97 240 155  87  71 220  60  67
240| 229  39  28  72 139 243 109 227 222  45   5 149 104  16 213(142)

*テーブルのパターンとしてはへそを無視すれば48通りしかないので、
実際に解析に運用する時は48パターンのテーブルの方を先に定義して、
テーブルIDに応じて頭(へそ)の位置と開始点を与えることにしている。

へその位置の乱数は基本的には0として扱う(例外あり)。

以下、乱数という場合は決まったテーブルの開始点から順に取得されるものとする。

テーブルの特徴をまとめておく。
・256周期
・0から255までの値
・219が無く222が2つ
・どれか一つの値が基本的に0として扱われる(へそ)


2.1.2 敵の数決定

敵の数は各種ごとにウィンドウ上で上に表示されるものから順に

 基本数+乱数%(最大数-基本数+1)

で決まる。基本数=最大数の場合でも判定する。
ただし、画面一杯の時はこの数通りにならないことがある。


2.1.3 先制攻撃判定

先制攻撃判定には順番に以下の二つの判定をする。

敵の先制判定

 乱数%100<先頭(左上)の敵の素早さ

味方の先制判定

 乱数%100<一人目(フリオニール)の素早さ

両方とも先制に成功、又は両方とも失敗した時は、通常の戦闘になる。
片方のみ成功の場合は成功したほうの先制攻撃になる。


2.2 ターン開始時

ターン開始時は以下のような順で処理をする。

味方行動決定→行動順決定→敵行動決定

2.2.1 味方行動決定

一般には乱数は使わない。
ただし、魔導士の杖使用時には

{乱数%2}でターゲットの敵味方を決める。
0なら味方、1なら敵である。
次に{乱数%ターゲット数}でターゲットを決める。
健在な(死亡、石化、消滅していない)キャラのみをターゲットに含む。
これは敵の単体特殊攻撃ターゲット決定と同様である。

魔導士の杖を使用した後にキャンセルしても、消費した乱数はそのままである。
キャンセルして選びなおすことで乱数を2つずつ進めることができる。

味方に混乱キャラがいる場合は未調査。


2.2.2 行動順決定

まず、各キャラについて以下で決まる順番値を求める。

 順番値=回避率+乱数%40

行動順はこの順番値が大きい順になる。
判定順は味方→敵の順。
同じ値の場合は後に判定したほうが先に行動する。
味方に4人目がいないときや、行動不能キャラがいる場合でも判定する。
敵は画面上にいる数だけ判定する。

敵に確実に先手を取るには回避率が40大きい必要がある。


2.2.3 敵行動決定

各敵に対して以下の判定を行う。

まず、逃走判定を行う。
逃げられない敵グループの場合は行わない。
判定には他のテーブルを用いていると思われるので詳細は不明。
逃走判定に成功すると、行動は逃げるになり、以下の判定は行わない


魔法、特殊攻撃が使用可能な敵は特殊攻撃使用の判定を行う。

{乱数%100}の値によって使う行動が決まる。
値と行動の関係は以下のようになっている

乱数%100   確率(へそは無視)
 0- 4 行動1 15/256
 5- 9 行動2 15/256
10-19 行動3 29/256
20-29 行動4 31/256
30-39 行動5 30/256
40-59 行動6 56/256
60-79 行動7 40/256
80-99 行動8 40/256

行動1-8には魔法、特殊攻撃や通常攻撃が割り当てられている。
特殊攻撃のターゲットが味方単体の場合、乱数を消費してターゲットを決める。
ターゲットは魔導士の杖が味方に向けられた場合と同様に[乱数%ターゲット数]で決まる。

特殊攻撃を持たない敵、MPが0の時はこの判定は行わず、通常攻撃を行う。
沈黙、忘却等の時も同様と思われる。

通常攻撃を行う場合で、攻撃が可能な(前二列に配置されている)場合
ターゲット決定を行う。ターゲットは{乱数%4}で

乱数%4
  0 1人目(フリオニール)
  1 2人目(マリア)
  2 3人目(ガイ)
  3 4人目

が対応する。
このとき、対応するキャラが攻撃不可(不在、死亡、石化、後列配置)の時は
次のキャラ(1人目なら2人目、4人目なら1人目)になる。
次のキャラもダメ時はその次のキャラ…というように順次ずれる。
全員ダメな時はターゲットなしになり、行動を行わない。

眠りやマヒで行動不能なキャラは行動判定を行わない。
混乱時はなにやら判定はしている(1や2の乱数消費がある)ようだが、
実際の行動には影響しない。詳しくは未調査。


2.3 ターン中

戦闘のメイン。乱数消費もすこぶる多い。

2.3.1 命中、回避、クリティカル判定

物理攻撃、魔法、特殊攻撃の命中判定は

  乱数%101<命中率

ならば成功。
物理、魔法、特殊攻撃回避判定は同様に

  乱数%101<回避率

で成功になる。
回避が99でも4/256(=1/64)の割合で回避に失敗する。

クリティカル判定は

  乱数%101<5

で成功。
クリティカル発生率は15/256から16/256になる(へその元値、扱いによる)。


2.3.2 ダメージ、回復量判定

物理攻撃、ダメージ&回復魔法、特殊攻撃などは

  1回あたりのダメージ(回復)量=威力+乱数%(威力+1)[-相手の防御]

威力は攻撃力、魔法威力のこと。
防御は物理攻撃と自爆にのみに関わる。


2.3.3 エフェクト判定

エフェクト判定は行動時の画面効果を決めると思われる。
行動の判定の後に行われる。
物理攻撃では杖、素手などで敵を殴ったときや弓で射た時に発生する。
ナイフ、剣など切る動作の武器では発生しない模様。
フェクトによって消費する乱数が一定でない魔法、特殊攻撃もある。

調査済みのエフェクト消費乱数についてはこちらにまとめてある。


2.3.4 通常攻撃

  命中判定x命中Lv→回避判定x回避Lv→(ダメージ判定→クリティカル判定)x命中回数

という順で判定。(AxBはAの判定をB回行うの意)
最終的なダメージは各ダメージの合計+クリティカル回数*攻撃力となる。

ステータス異常の追加効果のある攻撃の場合には上記判定の後、魔法回避と同様に判定。
但し、盾装備時で、ダメージが0の時は追加効果回避判定をしない。

武器は利き腕から判定される。
盾の攻撃判定も行う(両手に盾装備時、癒しの杖、ブラッドソード装備時は除く)。
盾の攻撃のみが命中しても、見た目やエフェクト消費は武器で攻撃した場合と同じ。
盾のみがクリティカルしても画面効果はなし。

癒しの杖は上記判定後に回復量の判定を命中回数だけ行う。

 1hit当りの回復量=攻撃力+30+乱数%31

全hit分の合計が総回復量になる。ダメージ判定の結果は影響しない。


2.3.5 魔法、特殊攻撃

各ターゲットについて以下の順で判定をする。

 命中判定x魔法Lv→魔法回避判定x魔法防御Lv[→(ダメージ→クリティカル)x(魔法Lv+命中回数)]

ダメージ、クリティカル判定はダメージ系の魔法、特殊攻撃のみ。
の順で判定。耐性や弱点がある場合は命中回数が特殊になる。
基本的に味方に掛ける補助魔法、回復行動では回避判定は行わない(ヘイストを除く)。
総ダメージは各ダメージの合計+クリティカル回数*威力となる。
耐性がある場合は{総ダメージ/2}、弱点の場合は{総ダメージ*2}が最終ダメージになる。

アルテマは特殊で常に命中1回として扱い、
ダメージ判定は他の乱数テーブルを使っていると思われる。
クリティカル判定のみ戦闘用の乱数系統を使用して行う。

レイズを味方に掛ける場合は乱数を消費しない。
復活後のHPには他の乱数系統を使っていると思われる。


2.3.6 アイテム

効果の判定は魔法、特殊攻撃に準じる
ただし、判定を必要としないもの(エリクシャーなど)もある。
効果の判定後に消滅判定を行う。

  乱数%100<消滅率

を満たすとアイテムは消滅する。

今のところ分かっている消滅率は以下の4通り(推定含む)
  0:ホーリーランス以外の武器(推定)、飛竜(推定)
 10:エルメスの靴、大地のドラム、ウィンドフルート、ユニコーンの角、死神の像
 50:砂時計
100:アイテム一般(推定)、魔法の本(推定)、ホーリーランス(推定)


2.3.7 その他

オートターゲットがONでターン開始時に選んだターゲットが既にやられている時は
ターゲットの乱数を1つ使用してターゲットを再選する。
ターゲット決定に準じる操作を行っていると思われるが詳細は未調査。

また、混乱している場合も行動直前にターゲット乱数を1つ使用して決める。

逃げられる戦いで逃げる行動をした場合。

  乱数%101<回避率

なら逃走に成功する。


2.4 ターン終了時

ターン終了時には

 一時ステータス異常の回復判定→毒ダメージ判定

の順番に判定を行う。


2.4.1 一時ステータス異常回復判定

  乱数%100<回復率

で回復する。
回復率は

 毒  70
 眠り 60
 マヒ 30
 小人 30
 混乱 20

沈黙は未調査。
毒はPS版調査より。
複数の異常がある場合の判定順は未調査。


2.4.2 毒ダメージ判定

毒や猛毒の時はそのダメージは乱数を使って以下のように決まる。

 毒ダメージ=2+乱数%3

*今のところ、猛毒のみ調査。毒の時は未調査だが恐らく同じ。


2.5 戦闘終了時

戦闘終了時には

戦利品判定→ステータスアップ判定

の順で行う。


2.5.1 戦利品判定

倒した各敵に対して{乱数%100}で判定を行う。

乱数%100  確率(へそは無視)
 0- 4 宝1 15/256
 5- 9 宝2 15/256
10-19 宝3 29/256
20-29 宝4 31/256
30-39 宝5 30/256
40-59 宝6 56/256
60-79 宝7 40/256
80-99 宝8 40/256

一般には宝1が一番価値が高く、宝8が低い。
行動判定と同様な判定である。


2.5.2 成長判定

戦闘終了時に死亡、石化になっていないキャラについて先頭キャラから順に成長の判定をする。
判定順は以下の通り。

HP→MP→力→知性減→知性→体力減→精神→力減→素早さ→体力→魔力

判定を行う条件
HP、体力…戦闘開始時に比べHPが減少している時
MP、魔力…戦闘開始時に比べMPが減少している時
力…………武器攻撃を1回以上選んだ時
知性減……力の上昇判定に成功した時
知性………黒魔法を選択した回数が1回以上の時
体力減……知性の上昇判定に成功した時
精神………白魔法を選択した回数が1回以上の時
力減………精神の上昇判定に成功した時
素早さ……回避率が4以上の時?(PS版より)

上昇/減少条件
HP………最大HP<(乱数%9)*HP減少量
MP………最大MP<(乱数%9)*MP減少量
力………乱数%46<武器攻撃選択回数
知性……乱数%26<黒魔法選択回数
精神……乱数%16<白魔法選択回数
素早さ…乱数<回避率/4
体力……最大HP<(乱数%10)*HP減少量
魔力……最大MP<(乱数%10)*MP減少量
各種減…乱数%6==0

実際の能力の変化は判定が全て終わった後に行う。
すでに最大の時に上昇判定に成功しても能力は上がらない。