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