xreaad

ファイナルファンタジー V 戦闘システムの解析

目次

はじめに

この文書は、「ファイナルファンタジー V (以下、FF5)」の「やりこみ」に関連する、戦闘システムの基礎知識や各種アルゴリズムなどについて書かれたものです。この文書は FF5 のゲームプログラムの解析を行って、正確な記述をすることを目標に書かれています。また、FF5 を何度かプレイしたような経験のあるプレイヤーを対象にしていますから、FF5 をあまりプレイしたことのない方や、「やりこみ」未経験者にはわかりにくい表現などが書かれているかもしれません。ご注意ください。

現在、この文書は未完成であり、正しくない情報などが書かれている可能性があります。現状では説明がかなり不足していますので、何とかしたいところです。

凡例

演算
式は符号なし整数として算出します。すなわち、負の数と端数を切り捨てます。負の数と端数が発生する可能性のある式は "(" と ")" の括弧で囲まれています。
乱数
{AB} の表記は、A から B の範囲の乱数を取得することを示します。また、{A, B} の表記は、乱数を取得して "," (comma) で区切られたいずれかの値を取ることを示します。

ATB システム

FF5 の戦闘システムにおける ATB システムについての基礎知識です。

用語

はじめに、ATB のシステムに関する用語を定義します。

フレーム
フレームは戦闘プログラムが処理している時間の最小の単位を示します。
ATB 時間
ATB 時間はタイマーに設定される時間の初期値を示します。
タイマー
タイマーは ATB で処理される効果の種類を示します。タイマーには ATB 時間が設定され、この値がタイマー周期ごとに 1 ずつ減少していき、0 になったときに、行動可能になる・毒のダメージ・リジェネの回復・各種パラメータの加減算・状態変化の設定/解除などの処理が行われます。
タイマー周期
タイマー周期はタイマーが進む周期を示します。タイマー周期が N のとき、(N + 1) フレームごとにタイマーが進みます。
タイマー発動までのフレーム数
タイマーが発動するまでのフレーム数は、タイマー発動までのフレーム数 = ATB 時間×(タイマー周期 + 1) の式で求めることができます。これは単に「フレーム」と表記されることがあります。

ATB 時間はフレーム数を表すのではないことに注意してください。そして、フレームは秒数を表すのではないことに注意してください。この文書におけるフレームの定義は 1/60 秒や 1/30 秒のような秒数ではありません。戦闘プログラムが 1 秒間に処理できるフレームの数は、実装や処理状況によって異なります。

タイマーについて

各種タイマーについての説明は以下のとおりです。

タイマーについての説明
タイマー タイマーの説明
行動待ち時間 キャラクタが行動可能になるまでの待ち時間です。キャラクタの行動後にタイマーは初期値に戻ります。後述しますが、「実行までの待ち時間」も内部的にはこのタイマーに設定されます。
ストップ ストップが解除されるまでの時間です。
毒のダメージを受けるまでの時間です。毒のダメージ後にタイマーは初期値に戻ります。
リフレク リフレクが解除されるまでの時間です。
死の宣告 死の宣告が発動するまでの時間です。
沈黙 沈黙が解除されるまでの時間です。
スリップ スリップが解除されるまでの時間です。
老化 老化で各種パラメータが下がるまでの時間です。老化の効果後にタイマーは初期値に戻ります。
リジェネ リジェネで回復するまでの時間です。リジェネの回復後にタイマーは初期値に戻ります。
歌で各種パラメータが上昇するまでの時間です。歌の効果後にタイマーは初期値に戻ります。
麻痺 麻痺が解除されるまでの時間です。

タイマー周期の対応表

タイマー周期は各種パラメータには影響されず、常に固定値です。以下は各種タイマーとタイマー周期との対応を示した表です。

タイマーとタイマー周期の対応表
タイマー タイマー周期
ストップ0
2
リフレク4
死の宣告14
沈黙1
スリップ0
老化0
リジェネ1
0
麻痺0
行動待ち時間0

タイマー設定の対応表

以下は各種タイマーとキャラクタが行動可能になるまでの待ち時間/状態の回復・発動時間との対応を示した表です。

状態異常のためのタイマー設定には 2 種類の設定があります。基本的には「通常」のタイマー設定が用いられますが、戦闘開始時から発動する状態異常には「戦闘開始時」のタイマー設定が用いられます。また、例外として「魔法剣」「とくいわざ」「グランドクロス」による攻撃も「戦闘開始時」のタイマー設定を用います。

ATB 時間を決定したあとは、最後に以下の修正を行ってから、タイマーの時間を設定します。

  1. 対象がヘイスト状態の場合は、ATB 時間が 1/2 になります。下限は 1 です。
  2. 対象がスロウ状態の場合は、ATB 時間が 2 倍になります。上限は 255 です。
  3. 最後に、ATB 時間が 0 であれば、ATB 時間を 1 に設定しなおします。
キャラクタが行動可能になるまでの待ち時間
タイマー ATB 時間
行動待ち時間 120 + (装備の重さ÷8) - 素早さ (下限: 1)
タイマーと ATB 時間の対応表
タイマー 通常の ATB 時間 戦闘開始時の ATB 時間
ストップ 持続時間 120
体力 + 20 (上限: 255) 体力 + 20 (上限: 255)
リフレク 持続時間 120
死の宣告 持続時間 49
沈黙 持続時間 180 - (魔力÷2) (下限: 1)
スリップ 持続時間 180
老化 10 10
リジェネ 110 - 魔力 (下限: 30) 110 - 魔力 (下限: 30)
30 30
麻痺 持続時間 - (魔力÷2) (下限: 1) 120 - (魔力÷2) (下限: 1)

持続時間については、次の「持続時間の対応表」を参照してください。

持続時間の対応表

持続時間は、タイマーに設定される ATB 時間の決定に用いる可変パラメータです。この値は攻撃の種類によって異なります。以下は攻撃の種類と持続時間との対応を示した表です。

ストップタイマーの持続時間の対応表
種類 持続時間
ストップ, でんじば 180 + (使用者のレベル÷4) - (対象のレベル÷4) / 対象がボス: 30
あいのうた 240 + (使用者のレベル÷4) - (対象のレベル÷4) / 対象がボス: 30
なだめる 60 + (使用者のレベル÷4) - (対象のレベル÷4) / 対象がボス: 30
リフレクタイマーの持続時間の対応表
種類 持続時間
ドラゴンアーマー 90
リフレク, ルビーのひかり 52 + (使用者のレベル÷4)
死の宣告タイマーの持続時間の対応表
種類 持続時間
しのせんこく 30
沈黙タイマーの持続時間の対応表
種類 持続時間
サイレス 180 + (使用者のレベル÷4) - (対象のレベル÷4) / 対象がボス: 30
ニードル 240 + (使用者のレベル÷4) - (対象のレベル÷4) / 対象がボス: 30
にじいろのかぜ 254 + (使用者のレベル÷4) - (対象のレベル÷4) / 対象がボス: 30
スリップタイマーの持続時間の対応表
種類 持続時間
しょうかえき, マスタードボム, アルマゲスト, ブレイズ 120
バイオ, りゅうさ (魔法), シャドーフレア 255
はどうほう 255
ねんえき 255
あんこくのといき, にじいろのかぜ 255
マインドブラスト 255
レクイエム 255
しっぱいさく (No.031) 240 + (使用者のレベル÷4) - (対象のレベル÷4) / 対象がボス: 30
麻痺タイマーの持続時間の対応表
種類 持続時間
まとわりつき, まきつき, モモンガ 240 + (使用者のレベル÷4) - (対象のレベル÷4) / 対象がボス: 30
ブラスター 240 + (使用者のレベル÷4) - (対象のレベル÷4) / 対象がボス: 30
デスクロー 240 + (使用者のレベル÷4) - (対象のレベル÷4) / 対象がボス: 30
マインドブラスト 90 + (使用者のレベル÷4) - (対象のレベル÷4) / 対象がボス: 30

ATB タイマーの計算式

以上の ATB に関する資料をまとめた、各種タイマーが発動するまでのフレーム数の計算式を以下の表に示します。戦闘開始時から発生する状態異常や、「魔法剣」「とくいわざ」「グランドクロス」による攻撃が「戦闘開始時」として扱われます。いずれのタイマーも「最終的な ATB 時間の修正」を受けます。

通常の各種タイマーが発動するまでのフレーム数の計算式
タイマー ATB 時間 周期
行動待ち時間 120 + (装備の重さ÷8) - 素早さ (下限: 1)
ストップ 持続時間
体力 + 20 (上限: 255) × 3
リフレク 持続時間 × 5
死の宣告 持続時間 × 15
沈黙 持続時間 × 2
スリップ 持続時間
老化 10
リジェネ 110 - 魔力 (下限: 30) × 2
30
麻痺 持続時間 - (魔力÷2) (下限: 1)
戦闘開始時の各種タイマーが発動するまでのフレーム数の計算式
タイマー ATB 時間 周期
ストップ 120
体力 + 20 (上限: 255) × 3
リフレク 120 × 5
死の宣告 49 × 15
沈黙 180 - (魔力÷2) (下限: 1) × 2
スリップ 180
老化 10
リジェネ 110 - 魔力 (下限: 30) × 2
30
麻痺 120 - (魔力÷2) (下限: 1)

コマンド入力後の待ち時間

キャラクタがコマンドを入力してから、実際の行動が行われるまでにはわずかながら待ち時間があります。これを「実行までの待ち時間」と呼称します。以下は、各種コマンドと「実行までの待ち時間」との対応を示した表です。

「実行までの待ち時間」の処理は、「行動待ち時間」タイマーの処理として扱いますので、いずれのコマンドも「最終的な ATB 時間の修正」を受けます。なお、連続して一度に複数の行動を行う場合は、実行するすべての行動の「実行までの待ち時間」の合計を算出してから、「最終的な ATB 時間の修正」を行います。したがって、ATB 時間の 0 と 1 は同じではないことに注意してください。

また、敵モンスターの行動や、武器での攻撃・魔法・アイテムの使用などにも同様の待ち時間があり、これらの「実行までの待ち時間」はすべて 0 に設定されています。ただし、SFC 版 FF5 および PS 版 FF5 には、消費アイテムを使用する際の処理にバグがあります。これについては「バグ: 消費アイテムを使用する際の待ち時間」をご覧ください。

実行までの待ち時間の対応表
No. コマンドの名前 実行までの待ち時間
2アイテム0
3チェンジ1
4ぼうぎょ1
5たたかう0
6まもり1
7けり1
8ためる[1]1
9チャクラ1
10とんずら1
11ぬすむ1
12ぶんどる1
13ジャンプ[2]10
14りゅうけん1
15けむりだま1
16ぶんしん1
17なげる1
18みねうち1
19ぜになげ1
20いあいぬき60
21どうぶつ1
22ねらう5
23みだれうち1
24よびだす1
25しらべる5
26みやぶる5
27なだめる1
28あやつる1
29とらえる1
30はなつ1
31ちょうごう1
32のむ1
33ちゆ5
34そせい5
35ちけい1
37かくれる1
38あらわれる1
40うたう1
41いろめ1
42おどる1
43ものまね5
44まほうけん L10
45まほうけん L20
46まほうけん L30
47まほうけん L40
48まほうけん L50
49まほうけん L60
50しろまほう L10
51しろまほう L20
52しろまほう L30
53しろまほう L40
54しろまほう L50
55しろまほう L60
56くろまほう L10
57くろまほう L20
58くろまほう L30
59くろまほう L40
60くろまほう L50
61くろまほう L60
62じくう L10
63じくう L20
64じくう L30
65じくう L40
66じくう L50
67じくう L60
68しょうかん L10
69しょうかん L20
70しょうかん L30
71しょうかん L40
72しょうかん L50
73しろくろま L10
74しろくろま L20
75しろくろま L30
76れんぞくま0
77あおまほう0
78ためるによる攻撃[3]60
79ジャンプによる攻撃[4]80
80パトリオ[5]1
81ドキドキ[6]1
82ひしょう[7]1
83コマンド83[8]1
84コマンド84[9]1
85コマンド85[10]1
86コマンド86[11]1
87あんこく L10
88あんこく L20
89あんこく L30
90あんこく L40
91あんこく L50
92めいやく0
93せんこく0
94よげん0
95ほうげき1
96ごうせい1
97ぜんぎり1
98ひっさつ1
  1. キャラクタが「ためるによる攻撃」をあらたに実行するまでの待ち時間です。
  2. キャラクタがジャンプするまでの待ち時間です。その後、「ジャンプによる攻撃」をあらたに実行します。
  3. 「ためる」を行ったキャラクタが攻撃します。
  4. 「ジャンプ」したキャラクタが降下して攻撃します。
  5. 「ジャンプ」しているキャラクタが降下します。
  6. 「いろめ」を受けたキャラクタはこの「何もしない」行動を行います。
  7. 「ジャンプ」とおなじです。
  8. 特殊攻撃「かまいたち」が発動します。
  9. エンディングの戦闘シーンでの攻撃に用いられます。
  10. 「ツインランサー」での 2 回攻撃を行います。
  11. 特殊攻撃「じしん」が発動します。

バトルモード: アクティブとウェイト

バトルモードが「ウェイト」に設定されている場合は、何らかのメニューを実行している間は、戦闘プログラムそのものが一時停止します。「アクティブ」の場合は特別な処理を行いません。

バトルスピードと入力待ち時間

バトルスピード」は、味方の行動がまわってきた直後の「ATB の全タイマーを処理しない」時間のフレーム数を決定します。この ATB の全タイマーを処理しない時間を入力待ち時間と呼称します。「バトルスピード」と入力待ち時間の対応は以下のようになります。

バトルスピードと入力待ち時間の対応
バトルスピード 入力待ち時間
10
215
330
460
5120
6240

プログラムの仕様上、入力待ち時間が 1 以上残っている状態でコマンドを入力した直後の 1 フレームは全タイマーを処理しません。

スリップダメージの周期

対象がスリップ状態になっている場合は、4 フレームごとに 1 ダメージを受けます。ただし、対象がジャンプしている場合はダメージを受けません。また、対象が隠れている場合は HP は 0 になりません。

予言タイマーの待ち時間

「よげん」で選択された魔法が発動するまでの待ち時間は以下のとおりです。予言のタイマーを進めたあと、発動までの残りフレーム数が 25, 50, 75, 100, 125 のときに残りカウントが表示されます。

予言が発動するまでの時間の対応表
名前 消費 MP 発動までのフレーム数 表示されるカウント
よげん L111555
よげん L231254
よげん L37953
よげん L49501

「よげん L1」の最初に表示されるカウントは本来は 6 なのですが、メッセージが用意されていないので実際には表示されません。また、「よげん L4」は実際には入手できない没データです。

タイマーの優先度設定

タイマーの優先度とは、あるキャラクタが同時に行動する場合の順序を決定するために用いられます。これを決定する方法は、乱数を使って 0〜11 の番号を並び替えます。そして、その先頭の番号のキャラクタから優先してタイマーの処理を行います。キャラクタが同時に行動する場合は、タイマーの優先度の高いキャラクタだけが行動し、優先度の低いキャラクタは次のフレームで行動を実行します。

これを設定するプログラムは以下のとおりです。これは戦闘開始時に一度だけ実行されます。

uint8_t rand(const uint8_t range_low, const uint8_t range_high);
uint8_t timer_priority[12];             /* タイマーを処理するキャラクタの順番 */

void
set_timer_priority(void)
{
    uint8_t i, rand;
    uint8_t index = 0;

    /* タイマーの優先度を初期化する */
    for (i = 0; i != 12; i++)
        timer_priority[i] = 0xff;

retry: while (index != 12) {
        /* 0〜11 の乱数を取得してキャラクタの番号とする */
        rand = rand(0, 11);

        /* そのキャラクタがすでに設定されていればやり直す */
        for (i = 0; i != 12; i++)
            if (rand == timer_priority[i])
                goto retry;

        timer_priority[index] = rand;
        index++;
    }
}

乱数生成に用いる rand() については、「乱数生成」を参照してください。

能力値について

まだ未完成です。

レベル
さまざまな処理に影響します。
物理攻撃の「倍率」に影響します。
素早さ
行動待ち時間に影響します。
体力
最大 HP の算出と、毒・リジェネの効果に影響します。
魔力
最大 MP の算出と、魔法攻撃の「倍率」に影響します。
装備の重さ
行動待ち時間に影響します。この値が 8 増えるごとに、行動待ち時間の ATB 時間が 1 増えます。
攻撃力
物理攻撃の攻撃力です。
防御力
物理攻撃に対する防御力です。
回避率
物理攻撃に対する回避率です。
魔法防御力
魔法攻撃に対する防御力です。
魔法回避率
魔法攻撃に対する回避率です。
倍率
物理攻撃のダメージの算出に影響します。
魔法倍率
魔法攻撃のダメージの算出に影響します。
属性
「炎属性」「氷属性」「雷属性」「毒属性」「風属性」「聖属性」「地属性」「水属性」があります。
カテゴリ
「てきのわざ」「白魔法」「黒魔法」「時空魔法」「召喚魔法」「音波攻撃」「遠隔攻撃」「近接攻撃」があります。敵の「弱点カテゴリ」に設定されているカテゴリを持つ攻撃を行うと、「命中判定」にかならず成功します。

味方キャラクタ

まだ未完成です。

各キャラクタの能力値
キャラクタの名前 素早さ 体力 魔力
バッツ +4 +1 +3 +1
レナ +1 +2 +1 +4
ガラフ +3 0 +4 0
ファリス +3 +3 +2 +2
クルル +1 +4 0 +3

敵モンスター

まだ未完成です。

敵モンスターの能力値などの各種設定については、以下のファイルをご覧ください。

また、敵モンスターの能力値については、以下のような特別な処理が行われます。

状態変化

状態変化の効果について

まだ未完成です。

状態変化の効果
名称 状態変化の効果
暗闇 物理攻撃の命中率を 1/4 にします。
一定時間ごとに最大 HP の 1/16 のダメージを受けます。
レビテト 特定の魔法攻撃を無効化します。
こびと 攻撃力を 3, 防御力を 0 にします。回避率を 2 倍にします。
カエル 攻撃力を 3, 防御力/魔法防御力を 0 にします。また、回避ができなくなり、「トード」をのぞくすべての魔法が使えなくなります。
石化 石になった状態です。戦闘不能と見なします。[1]
戦闘不能 HP が 0 になった状態です。
分身1 物理攻撃を防ぎます。攻撃を受けるとこの状態は解除されます。
分身2 物理攻撃を防ぎます。攻撃を受けるとこの状態は解除され、分身1に変化します。
沈黙 一定時間、魔法が唱えられなくなります。
バーサク 自動的に物理攻撃だけを行います。物理攻撃の攻撃力を 1.5 倍にします。
混乱 自動的に味方を攻撃します。[2]
麻痺 一定時間、すべての行動と回避ができなくなります。回復後、行動待ち時間は初期値に戻ります。
睡眠 睡眠して、すべての行動と回避ができなくなります。回復後、行動待ち時間は初期値に戻ります。[2]
老化 10 フレームごとに 力、素早さ、体力、魔力の値が 1 ずつ減少します。敵の場合はこれに加えて、レベル、攻撃力の数値が同様に減少します。レベル、力、素早さ、体力、魔力の値は 1 まで低下し、攻撃力の値は 0 まで低下します。[3]
リジェネ 一定時間ごとに (レベル×体力÷16) の HP が回復します。
スロウ ATB 時間を 2 倍にします。
ヘイスト ATB 時間を半減します。
ストップ 一定時間、すべての行動と回避ができなくなります。麻痺と違い、行動待ち時間は変化しません。
シェル 魔法系攻撃の倍率命中率を半減します。
プロテス 物理系攻撃の倍率を半減します。
リフレク 反射できる魔法攻撃を跳ね返します。
隠れている 攻撃対象になりません。
歌う 30 フレームごとに、歌による能力値が 1 ずつ上昇します。[2]
スリップ 4 フレームごとに 1 ダメージを受けます。
死の宣告 一定時間経過すると、戦闘不能になります。
いろめ 次のターンのコマンドを「ドキドキ」に変更します。
ジャンプ 攻撃対象になりません。スリップダメージを受けません。
防御 物理系攻撃の倍率を半減します。
守り 物理系攻撃の攻撃力を 0 にします。
  1. 敵モンスターが石化する場合は、戦闘不能に変更されます。
  2. 混乱・睡眠・歌っているの状態は、「たたかう」「とくいわざ」「ぶんどる」「ねらう」「みだれうち」「ためる」「ジャンプ」「ツインランサー」による攻撃を受けると、解除されます。
  3. 老化の効果は FF5A よりも前のバージョンでは間違っています。「バグ: 老化で敵の攻撃力が減少しない」と「バグ: 老化で能力値がオーバーフロー」を参照。

特定の状態によって防御できる状態変化

状態変化のなかには、特定の状態になっていると発生しないものがあります。特定の状態になると発生しない状態変化を「防御できる状態変化」とします。特定の状態と防御できる状態変化が同じものは、重ねてかけられないことを意味します。まだ未完成です。

特定の状態によって防御できる状態変化の表
名称 防御できる状態変化
ゾンビー暗闇, ゾンビー, 毒, レビテト, こびと, カエル, 石化, 戦闘不能
石化ゾンビー
バーサクバーサク, 混乱
混乱バーサク, 混乱, ストップ
麻痺麻痺
操られているバーサク, 混乱

例外として、以下の攻撃方法は「防御できる状態変化」の影響を受けません。

  1. 戦闘中に自分自身を戦闘不能にする演出のために用いられます。なお「デジョン」は味方キャラクタが使用できるものとは違います。

乱数

FF5 では、それぞれ別々の用途に用いられる複数の乱数生成プログラムが存在しますが、主に戦闘に用いられる乱数生成について述べます。

乱数生成

FF5 の戦闘における乱数生成のプログラムは以下のとおりです。これはプログラムを C 言語で書き直したものです。基本的には、ふたつある乱数位置を交互に用いて、乱数テーブルから値を取得するようになっています。「乱数テーブル」にはあらかじめ 0〜255 の乱数値が配列として格納されています。 また、特定の範囲内の乱数値を求める際には、X mod N (乱数値を N で割った余り) という方法で算出します。

static uint8_t tbl_index = 0;           /* 乱数テーブルの番号 (戦闘開始時は 0)  */
static uint8_t rng_index[2];            /* 乱数テーブルの現在位置 */
extern const uint8_t tbl_rng[256];      /* 乱数テーブル (0〜255) */

uint8_t
rand(const uint8_t range_low, const uint8_t range_high)
{
    uint8_t ret;

    /* 取得する乱数の範囲をチェックする */
    if (range_low == 255 || range_high == 0 || range_low == range_high) {
        /* この場合は乱数テーブルの番号をいれかえない */
        ret = range_high;
    } else {
        uint8_t index;

        /* 乱数テーブルの番号の 0 と 1 をいれかえる */
        tbl_index ^= 1;
        /* いれかえた乱数テーブルの番号を現在の乱数テーブルとする */
        index = rng_index[tbl_index];

        /* 乱数を取得する */
        if (range_high - range_low == 255) {
            ret = tbl_rng[index];
        } else {
            ret = tbl_rng[index] % (range_high - range_low + 1) + range_low;
        }
    }

    /* 最後に現在の乱数テーブルを 1 進める */
    rng_index[tbl_index]++;

    return ret;
}

この乱数生成の種 uint8_t rng_index[2] を初期化するプログラムは以下のとおりです。これは戦闘開始時に一度だけ実行されます。プログラムを見てもわかるように、乱数生成の種の初期化はとても単純です。特定の位置のメモリの総和をとり、その下位 8 ビットを乱数の種とします。uint8_t seed はセーブをロードしたときに seed = セーブロード画面で経過したフレーム数 + 前回セーブした時点での seed の式で生成されます。

extern static uint8_t rng_index[2];     /* 乱数テーブルの現在位置 */
extern static uint8_t seed;             /* セーブをロードしたときに生成された乱数の種 */

void
srand(void)
{
    uint8_t sum = 0;
    uint16_t i = 0;

    do {
        sum += *((uint8_t *)0x7e0000 + i);
        i++;
    } while (i != 0x03e8);      /* 0x03e8 = 1000 */

    sum += seed;
    rng_index[0] = sum;

    do {
        sum += *((uint8_t *)0x7e0000 + i);
        i++;
    } while (i != 0x07d0);      /* 0x07d0 = 2000 */

    rng_index[1] = sum;
}

乱数テーブル

FF5 で用いられる乱数テーブルは以下のとおりです。

FF5 の乱数テーブル
0 1 2 3 4 5 6 7 8 9 A B C D E F
00 07B6F01F555B37E3AE4FB25E99F677CB
10 608F433EA74C2D88C768D7D1C2F2C1DD
20 AA9316F7260436A1464E56BE6C6E80D5
30 B58EA49EE7CACE21FF0FD48CE6D39847
40 F40D15EDC4E43578BADA2761ABB9C37D
50 85FC956B30AD86008DCD7E9FE5EFDB59
60 EB0514C9242CA03C44694071643A747C
70 8413949C96ACB4BC03DE54DCC5D80CB7
80 250B011C232B333B971B622FB0E073CC
90 024AFE9BA36D193875BD66873FAFF3FB
A0 830A121A225390CF7A8B525A496A7228
B0 588ABF0E06A2FDFA4165D24DE25C1D45
C0 1E0911B35F2979392E2A51D95DA6EA31
D0 81891067F5A94282709D9257E13DF1F9
E0 EE08911820B1A5BBC648509AD67F7BE9
F0 76DF326F34A8D0B863C8C0EC4BE817F8

判定処理

戦闘関連の判定と処理

先制攻撃とバックアタック

先制攻撃とバックアタックの処理は、戦闘開始時に行われます。ただし、1 番目のモンスターの番号が 256 以上の場合は、先制攻撃とバックアタックの判定を行いません。また、「けいかい」のアビリティを持っている場合はバックアタックの判定を行いません。また、「リターン」で戦闘がやり直された場合もバックアタックの判定を行いません。

  1. はじめに、バックアタックの判定を行う状態であれば、バックアタックの判定を行います。まず、モンスターパーティが「バックアタック」設定になっているかどうかを確認して、そうである場合はバックアタックになります。そうでなければ 0〜255 の乱数を取得して、この乱数の値が 16 未満であればバックアタックになります。バックアタックのときは先制攻撃の判定を行いません。
  2. 次に、先制攻撃の判定を行います。先制攻撃の判定は 0〜255 の乱数を取得して、この乱数の値が 32 未満であれば先制攻撃になります。「せんせいこうげき」のアビリティを持っている場合は 32 ではなく 64 の値と比較します。

先制攻撃とバックアタックの処理は以下のとおりです。

逃走処理

キャラクタが戦闘から逃走する処理は、戦闘中に LR が 20 フレームの間入力されていれば逃走判定を行い、この結果が成功であれば戦闘から逃走します。また、「とんずら」などによって戦闘を制御する状態が逃げる状態になっていれば、逃走判定を無視して戦闘から逃走します。

逃走判定はまず、モンスターパーティが「逃げられない」設定になっている場合は、無条件に逃走判定に失敗します。そうでなければ 0〜99 の乱数を取得して、この乱数の値がモンスターパーティの「逃げやすさ」の数値未満であれば逃走判定に成功します。

全滅処理

現在、執筆中です。

回避判定

物理攻撃への回避判定

物理攻撃への回避判定は、対象が混乱・麻痺・睡眠・ストップのいずれかの状態ではない場合で、自分自身を攻撃しているのでなければ判定されます。この回避判定は以下のことを行います。

  1. 対象が「しらはどり」のアビリティを装備していれば 0〜99 の乱数を取得して、この乱数の値が 25 未満であれば回避判定に成功します。
  2. 対象が「マインゴーシュ」を装備していれば 0〜99 の乱数を取得して、この乱数の値が 25 未満であれば回避判定に成功します。
  3. 対象が「ディフェンダー」「さすけのかたな」を装備していればは 0〜99 の乱数を取得して、この乱数の値が 25 未満であれば回避判定に成功します。
  4. 対象が「エルフのマント」を装備していれば 0〜99 の乱数を取得して、この乱数の値が 33 未満であれば回避判定に成功します。

イージスの盾による回避判定

「イージスの盾」による回避判定は、対象が「イージスの盾」を装備していて、混乱・麻痺・睡眠・ストップのいずれかの状態ではない場合に判定されます。この回避判定は 0〜99 の乱数を取得して、33 未満であれば回避判定に成功します。

命中判定

物理攻撃の命中判定

物理攻撃の命中判定は、まず以下の判定を行います。処理の途中で命中判定に成功もしくは失敗した時点で、それ以降の処理は行いません。

  1. 対象が混乱・麻痺・睡眠のいずれかの状態であれば命中判定に成功します。
  2. 自分の攻撃方法が「かならず命中する」設定であれば、命中判定に成功します。
  3. 自分の攻撃カテゴリと対象の弱点カテゴリが一致すれば、命中判定に成功します。
  4. 対象の「物理攻撃への回避判定」を行います。これにより対象の回避判定に成功した場合は、命中判定に失敗します。

上記の判定によって命中判定に成功・失敗していなければ、対象の状態と自分の状態によって、以下のような修正を行います。なお、回避率命中率は、それぞれ「対象の回避率」と「自分の命中率」を示します。

  1. 対象が蛙状態なら、回避率を 0 にします。
  2. 対象が小人状態なら、回避率を 2 倍にします。ただし、上限は 99 です。
  3. 自分が暗闇状態なら、命中率を 1/4 にします。

その後、以下の命中判定を行います。

  1. 0〜99 の乱数を取得して、この乱数の値が命中率の数値以上であれば命中判定に失敗します。
  2. 対象が睡眠・麻痺・混乱・ストップのいずれかの状態であれば、命中判定に成功します。
  3. 0〜99 の乱数を取得して、この乱数の値が回避率の数値以上であれば命中判定に成功します。
  4. 自分自身を攻撃していれば、命中判定に成功します。

最後に命中判定に成功していなければ、命中判定を失敗とします。

物理攻撃用の判定を行う魔法攻撃の命中判定

物理攻撃用の判定を行う魔法攻撃の命中判定は、まず以下の判定を行います。処理の途中で命中判定に成功もしくは失敗した時点で、それ以降の処理は行いません。なお、この命中判定は「チョコボキック」「デブチョコボ」「グングニル」「ゴブリンパンチ」「しにがみのつるぎ」「ジャンプ」によって用いられます。

  1. 命中率の数値が 128 以上であれば、無条件に命中判定に成功します。この時点で、「しにがみのつるぎ」以外の攻撃での命中判定は成功となります。
  2. 対象の「物理攻撃への回避判定」を行います。これにより対象の回避判定に成功した場合は、命中判定に失敗します。

上記の判定によって命中判定に成功・失敗していなければ、対象の状態によって、以下のような修正を行います。

  1. 対象が蛙状態なら、回避率を 0 にします。
  2. 対象が小人状態なら、回避率を 2 倍にします。ただし、上限は 99 です。

その後、以下の命中判定を行います。

  1. 0〜99 の乱数を取得して、この乱数の値が命中率の数値以上であれば命中判定に失敗します。
  2. 対象が睡眠・麻痺・混乱・ストップのいずれかの状態であれば、命中判定に成功します。
  3. 0〜99 の乱数を取得して、この乱数の値が回避率の数値以上であれば命中判定に成功します。
  4. 自分自身を攻撃していれば、命中判定に成功します。

最後に命中判定に成功していなければ、命中判定を失敗とします。

魔法攻撃の命中判定

魔法攻撃の命中判定は、まず以下の判定を行います。処理の途中で命中判定に成功もしくは失敗した時点で、それ以降の処理は行いません。

  1. 命中率の数値が 128 以上であれば、無条件に命中判定に成功します。
  2. 特定の攻撃方法では、攻撃対象が味方・敵同士であれば、無条件に命中判定に成功します。[1]
  3. 自分の攻撃カテゴリと対象の弱点カテゴリが一致すれば、命中判定に成功します。

上記の判定によって命中判定に成功・失敗していなければ、次の処理を行います。

  1. 命中率を設定します。命中率魔法の命中率 + 自分のレベル (上限: 99) - 対象のレベル の式で求められます。ただし、上限は 99、下限は 1 です。
  2. 回避率を設定します。回避率対象の魔法回避率 に設定されます。

その後、対象の「魔法攻撃への回避判定」を行います。これにより対象の回避判定に成功した場合は、命中判定に失敗します。この判定によって命中判定に成功・失敗していなければ、対象の状態によって、以下のような修正を行います。

  1. 自分の攻撃方法の対象の既定値が単体で、対象が 2 体以上なら、命中率を 1/2 にします。ただし、下限は 1 です。
  2. 対象がシェル状態なら、命中率を 1/2 にします。ただし、下限は 1 です。
  3. 対象が蛙状態なら、回避率を 0 にします。

その後、以下の命中判定を行います。

  1. 0〜99 の乱数を取得して、この乱数の値が命中率の数値以上であれば命中判定に失敗します。
  2. 0〜99 の乱数を取得して、この乱数の値が回避率の数値未満であれば命中判定に失敗します。

このどちらの判定にも失敗しなければ、命中判定を成功とします。

  1. 以下の攻撃方法は、攻撃対象が味方・敵同士であれば、無条件に命中判定に成功します。

ダメージ計算

ダメージの算出方法

FF5 におけるダメージの算出方法は、攻撃力防御力倍率の 3 種類のパラメータから算出されます。この各種パラメータに設定される値については、「ダメージ計算式の各種パラメータの設定」を参照してください。また、攻撃者と攻撃対象の状態などによって、この各種パラメータの値は修正されます。この各種パラメータの修正については「ダメージ計算式の各種パラメータの修正」を参照してください。

そして、上記のパラメータを x = uint(攻撃力 - 防御力倍率 の式に当てはめて、ダメージを算出します。ただし、攻撃力 >= 0, 防御力 >= 0, 倍率 >= 1, uint(攻撃力 - 防御力) >= 0, 0 <= x <= 9999 です。また、x は 符号なし 16bit 整数 (0〜65535 の範囲) です。この算術結果に桁溢れが起きた場合は、溢れたビットを切り捨てます。

Note: 各種パラメータの算出には、キャラクタの能力値を用いることがあります。自分のレベル, 自分の力, 自分の素早さ, 自分の体力, 自分の魔力の上限は 99 として計算されますが、自分ではなく対象キャラクタの能力値として参照する場合は、この上限はありません。

ダメージ計算式の各種パラメータの設定

一般的な魔法のパラメータ

以下の効果タイプに一致する攻撃方法は、一般的な魔法のパラメータによってダメージが算出されます。

設定される各種パラメータは以下のとおりです。

対象の防御力をほぼ無視する魔法のパラメータ

以下の効果タイプに一致する攻撃方法は、対象の防御力をほぼ無視する魔法のパラメータによってダメージが算出されます。

設定される各種パラメータは以下のとおりです。

固有の倍率を持つランダムな攻撃力の魔法のパラメータ

以下の効果タイプに一致する攻撃方法は、固有の倍率を持つランダムな攻撃力の魔法のパラメータによってダメージが算出されます。

設定される各種パラメータは以下のとおりです。

物理攻撃扱いの魔法のパラメータ

以下の効果タイプに一致する攻撃方法は、物理攻撃扱いの魔法のパラメータによってダメージが算出されます。

設定される各種パラメータは以下のとおりです。

レベルによって倍率が決定するランダムな攻撃力の魔法のパラメータ

以下の効果タイプに一致する攻撃方法は、レベルによって倍率が決定するランダムな攻撃力の魔法のパラメータによってダメージが算出されます。

設定される各種パラメータは以下のとおりです。

ゴブリンパンチのパラメータ

効果タイプ 50h: ゴブリンパンチによる攻撃方法は、ゴブリンパンチのパラメータによってダメージが算出されます。設定される各種パラメータは以下のとおりです。

使用者が敵モンスター
使用者が味方キャラクタ
自分の右手/左手の攻撃力を用いる攻撃方法は、このゴブリンパンチのパラメータだけです。「ちからのくすり」はこの自分の右手/左手の攻撃力をそれぞれ 20 ずつ--すなわち 40--の攻撃力を上昇します。

また、自分のレベル対象のレベルが等しい場合には、攻撃力が 8 倍になり、防御力は 0 になります。

たたかう!のパラメータ

効果タイプ 6Fh: たたかう!による攻撃方法は、たかかう!のパラメータによってダメージが算出されます。設定される各種パラメータは以下のとおりです。

モンスターの物理攻撃のパラメータ

モンスターの行動において、「たたかう」「とくいわざ」「武器攻撃 (ゆうばく)」の行動はモンスターの物理攻撃に分類されます。モンスターの物理攻撃は「ぶんしん」や「ゴーレム」で回避することができます。設定される各種パラメータは以下のとおりです。

武器のダメージ計算式の各種パラメータの設定

すでのパラメータ

効果タイプ 30h: すで・けりによる攻撃方法は、すでのパラメータによってダメージが算出されます。設定される各種パラメータは以下のとおりです。

「かくとう」を装備している
「カイザーナックル」を装備していれば、さらに攻撃力50 加算します。
「かくとう」を装備していない

剣/刀のパラメータ

以下の効果タイプに一致する攻撃方法は、剣/刀のパラメータによってダメージが算出されます。

設定される各種パラメータは以下のとおりです。

ナイフ/短刀のパラメータ

以下の効果タイプに一致する攻撃方法は、ナイフ/短刀のパラメータによってダメージが算出されます。

設定される各種パラメータは以下のとおりです。

槍のパラメータ

以下の効果タイプに一致する攻撃方法は、槍のパラメータによってダメージが算出されます。この武器による攻撃方法は「ジャンプ」していれば、倍率が 2 倍になり、前列・後列の影響を受けません。

設定される各種パラメータは以下のとおりです。

弓矢のパラメータ

以下の効果タイプに一致する攻撃方法は、弓矢のパラメータによってダメージが算出されます。この武器による攻撃方法は前列・後列の影響を受けません。

設定される各種パラメータは以下のとおりです。

鞭のパラメータ

以下の効果タイプに一致する攻撃方法は、鞭のパラメータによってダメージが算出されます。この武器による攻撃方法は前列・後列の影響を受けません。

設定される各種パラメータは以下のとおりです。

斧のパラメータ

以下の効果タイプに一致する攻撃方法は、斧のパラメータによってダメージが算出されます。効果タイプ 3Ah に一致する攻撃方法は前列・後列の影響を受けません。

設定される各種パラメータは以下のとおりです。

マジックポイントを消費してクリティカルヒットする武器のパラメータ

以下の効果タイプに一致する攻撃方法は、マジックポイントを消費してクリティカルヒットする武器のパラメータによってダメージが算出されます。

設定される各種パラメータは以下のとおりです。

また、マジックポイントを消費することで以下の修正を得られます。消費するマジックポイントはルーンブレイドが 8, ルーンアクス/ルーンのベルが 5 です。マジックポイントが足りない場合は以下の修正は行われません。

魔法系のベルのパラメータ

以下の効果タイプに一致する攻撃方法は、魔法系のベルのパラメータによってダメージが算出されます。この武器による攻撃方法は「ミュート」状態では使用することができません。

設定される各種パラメータは以下のとおりです。

魔法系のロッドのパラメータ

以下の効果タイプに一致する攻撃方法は、魔法系のロッドのパラメータによってダメージが算出されます。

設定される各種パラメータは以下のとおりです。

デモンズロッドのパラメータ

効果タイプ 8Eh: デモンズロッドによる攻撃方法は、デモンズロッドのパラメータによってダメージが算出されます。デモンズロッドによる攻撃は毒属性となります。設定される各種パラメータは以下のとおりです。

ブレイブブレイドのパラメータ

効果タイプ 6Eh: ブレイブブレイドによる攻撃方法は、ブレイブブレイドのパラメータによってダメージが算出されます。設定される各種パラメータは以下のとおりです。

チキンナイフのパラメータ

効果タイプ 64h: チキンナイフによる攻撃方法は、チキンナイフのパラメータによってダメージが算出されます。設定される各種パラメータは以下のとおりです。

コマンドのダメージ計算式の各種パラメータの設定

ためるのパラメータ

「ためる」による攻撃方法は、武器による攻撃として扱いますが、この攻撃を「倍率を 2 倍にする」設定にします。この設定は物理攻撃にのみ適用されます。

チャクラのパラメータ

「チャクラ」による攻撃方法は、以下のパラメータによって回復量が算出されます。

なげるのパラメータ

「なげる」による攻撃方法は、以下のパラメータによってダメージが算出されます。

巻物を投げた場合
武器を投げた場合

ぜになげのパラメータ

「ぜになげ」による攻撃方法は、以下のパラメータによってダメージが算出されます。また、消費するギルは 自分のレベル×対象の数×50 の式で求められます。

みだれうちのパラメータ

「みだれうち」による攻撃方法は、武器による攻撃として扱いますが、この攻撃を「倍率を 1/2 にする」「かならず命中する」「防御力を無視する」設定にします。この設定は物理攻撃にのみ適用されます。

おどるのパラメータ

ミステリーワルツ
対象の防御力をほぼ無視する魔法のパラメータ」によってダメージ/回復量が算出されます。魔法の攻撃力は 8 です。
ふたりのジルバ
一般的な魔法のパラメータ」によってダメージ/回復量が算出されます。魔法の攻撃力は 45 です。
つるぎのまい
武器による攻撃として扱いますが、この攻撃を「攻撃力を 2 倍にする」「倍率を 2 倍にする」「かならず命中する」設定にします。この設定は物理攻撃にのみ適用されます。

ごうせいのパラメータ

ニードルショット・ニードルバースト・ニードルキャノン以外の、効果タイプ 85h:「ごうせい」による攻撃方法は、以下のパラメータによってダメージが算出されます。

ニードルショット・ニードルバースト・ニードルキャノンによる攻撃方法のダメージはそれぞれ 1000, 2000, 3000 の固定値です。

ダメージ計算式の各種パラメータの修正

現在、執筆中です。

特殊なコマンド・アイテム・魔法の処理

ぬすむの処理

「ぬすむ」の処理をはじめる前に、まずそのモンスターからアイテムを盗んだかどうかを確認し、すでにアイテムを盗んでいれば「なにももっていない!」を表示して「ぬすむ」の処理を終了します。まだ盗んでいなければ、まず以下の命中判定を行います。

  1. はじめに、対象のモンスターに盗めるアイテムが何も設定されていなければ、「なにももっていない!」を表示して「ぬすむ」の処理を終了します。
  2. 命中率を設定します。命中率は「ぬすむ」コマンドに設定された固有値の 40 が使用されます。また、「とうぞくのこて」を装備していれば 命中率を 2 倍にします。
  3. 回避率を設定します。回避率は 0 に設定されます。
  4. 0〜99 の乱数を取得して、この乱数の値が命中率の数値以上であれば命中判定に失敗します。
  5. 0〜99 の乱数を取得して、この乱数の値が回避率の数値未満であれば命中判定に失敗します。

上記の命中判定に失敗していなければ、次に「ぬすむ」の処理を行います。なお、上記の命中判定もしくは「ぬすむ」の処理に失敗したら、「ぬすみそこなった」を表示して「ぬすむ」の処理を終了します。

  1. まず、対象が味方キャラクタであれば無条件に「ぬすむ」に失敗します。
  2. 次に、0〜255 の乱数を取得して、この乱数の値が 10 未満であれば、低確率で盗めるアイテムを盗むアイテムとします。そうでなければ、高確率で盗めるアイテムを盗むアイテムとします。
  3. ただし、盗むアイテムが設定されていない場合は、「ぬすむ」に失敗します。
  4. 盗むアイテムと「おなじ種類のアイテム」がないか、アイテム欄の最後から順番に調べます。
  5. 「おなじ種類のアイテム」が見つからなければ、アイテム欄に「空欄」がないか、アイテム欄の最初から順番に調べます。
  6. アイテム欄に「おなじ種類のアイテム」および「空欄」のどちらもなければ、「ぬすむ」に失敗します。
  7. 最後に、盗むアイテムをアイテム欄に格納して処理を終了します。

とらえるの処理

「とらえる」の処理は、はじめに対象のモンスターを「とらえる」ことができるかどうかの判定を行います。瀕死状態については、あらかじめ対象の HP が最大 HP の 1/8 の値以下であれば瀕死状態と見なされます。ただし、対象の HP が 0 であればこの瀕死状態にする処理は行われません。そのため、最大 HP が 8 未満のモンスターと HP が 0 のモンスターは「コルナゴのつぼ」を装備していなければ「とらえる」ことができません。

  1. 対象がとらえるへの耐性を持っていれば、「ほかくできない!」を表示して「とらえる」の処理を終了します。
  2. 対象が瀕死状態になっていれば、とらえる判定に成功します。

上記の判定に成功していなければ、自分が「コルナゴのつぼ」を装備しているかどうかを確認し、装備していれば次の判定を行います。

  1. 対象の HP が最大 HP の 1/2 の値以下なら、とらえる判定に成功します。

以上の判定によって、とらえる判定に成功していなければ、「もっとよわらせるんだ!」を表示して「とらえる」の処理を終了します。

対象モンスターをとらえる処理は、「対象モンスターの番号」を自分の「とらえているモンスター」に書き込み、「とらえる」のコマンドを「はなつ」に変更します。そして、対象モンスターを戦闘不能にします。また、そのモンスターの「モンスターが逃走したフラグ」を立てます。

なお、「とらえる」は無条件ですべてのカウンターを受けません。

カウンターの処理

「カウンター」のアビリティを装備しているキャラクタが敵モンスターの「たたかう」「とくいわざ」による攻撃を受けた場合に、カウンターの判定を行います。ただし、「とくいわざ」の場合は、その攻撃が「攻撃力が 1.5 倍になる」「防御無視・回避無視」「スリップ」のいずれかの特性でなければカウンターの判定と処理を行いません。「武器攻撃 (ゆうばく)」ではカウンターの判定を行いません。「カウンター」の処理は、対象の HP が 0 もしくは戦闘不能・石化・ストップ・混乱・麻痺・睡眠・歌っている・無敵状態・隠れているのいずれかの状態であれば、処理を行いません [1]

カウンターの判定は 0〜99 の乱数を取得して、この乱数の値が 50 未満であれば、攻撃をしてきたキャラクタを対象に「たたかう」で反撃します。

  1. 「まほうバリア」の条件と同じです。

まほうバリアの処理

「まほうバリア」のアビリティを装備しているキャラクタが敵モンスターの攻撃対象になり、そのキャラクタの HP が最大 HP の 1/16 の値以下であれば、「まほうバリア」が発動します。ただし、そのキャラクタがリフレク状態であれば処理を行いません。「まほうバリア」の処理は、対象の HP が 0 もしくは戦闘不能・石化・ストップ・混乱・麻痺・睡眠・歌っている・無敵状態・隠れているのいずれかの状態であれば、処理を行いません。また魔法攻撃 [1] を受けた場合は、上記に加えて、バーサクの状態になっていると処理を行いません [2]

なお、敵モンスターの「何もしない」という行動に対しても「まほうバリア」は発動します。この「何もしない」は、敵からランダムに 1 体の対象を選択して、何もおこらない攻撃を行うようになっているためです。(『魔法の数値系データ (ff5magparam.txt)』『魔法のフラグ系データ (ff5magflag.txt)』, 「さいせい (No.170)」参照)

  1. 魔法攻撃とは、「たたかう」「とくいわざ」「ぶんどる」「ねらう」「みだれうち」「ためる」「ジャンプ」「ツインランサー」以外が攻撃のことです。
  2. 物理攻撃と魔法攻撃で条件が変わるのは不自然です。おそらくプログラムを間違えたのでしょう。

ワンダーワンドの処理

「ワンダーワンド」を装備して「たたかう」「みねうち」「ねらう」で攻撃すると、「No.018(012): ケアル」から「No.053(035): アスピル」までの白魔法・黒魔法を順番に発動していくことができます。ただし、「No.019(013): ライブラ」は発動しません (「ケアル」が発動するときのみ、ワンダーワンドの使用回数が 2 回進みます)。「No.053(035): アスピル」の発動後は、次に発動する魔法が「No.018(012): ケアル」に戻ります。

「ワンダーワンド」を装備欄から使用すると、「リターン」が発動して戦闘をやり直すことができますが、このとき無敵状態のキャラクタを対象にしてはいけません。これについては「バグ: 「リターン」を無敵状態のキャラクタに使用する」をご覧ください。

まほうのランプの処理

以下は「まほうのランプ」を使用した場合に実行される魔法のリストです。「まほうのランプ」で召喚される召喚獣は、「しょうかん」や「よびだす」で指定される「No.083(053): オーディン」「No.084(054): バハムート」などの召喚獣の名前ではなく、直接、魔法の番号を指定しています (「チョコボ」のみ例外)。そのため、「オーディン: ざんてつけん・グングニルの判定」を行わずに「ざんてつけん」を実行することができます。

「まほうのランプ」の使用回数と召喚される召喚獣の対応表
「まほうのランプ」を使用した回数 実行される魔法の番号
0No.109(06D): メガフレア
1No.108(06C): だいかいしょう
2No.106(06A): ざんてつけん
3No.105(069): サンダーストーム
4No.104(068): ルビーのひかり
5No.103(067): あくまのひとみ
6No.102(066): アースウォール
7No.101(065): だいちのいかり
8No.100(064): じごくのかえん
9No.099(063): さばきのいかずち
10No.098(062): ダイアモンドダスト
11No.097(061): まとわりつき
12No.096(060): かぜのささやき
13〜31No.072(047): チョコボ
32 回以上No.115(073): エッグチョップ

チョコボ: チョコボキック・デブチョコボの判定

「チョコボ」を使用したとき、「チョコボキック」と「デブチョコボ」のどちらが発動するかは、0〜99 の乱数を取得して、この乱数の値が 8 未満であれば「デブチョコボ」が発動します。そうでなければ、「チョコボキック」が発動します。

オーディン: ざんてつけん・グングニルの判定

「オーディン」を使用したとき、「ざんてつけん」と「グングニル」のどちらが発動するかは、以下の判定を行って決定します。処理の途中でどちらを発動するかが決定した時点で、それ以降の処理は行いません。

  1. 1〜8 番目のモンスターを順番に調べていき、現在出現していてボス特性を持つモンスターがいれば、「グングニル」が発動します。
  2. 次に、「ざんてつけん」の発動確率を設定します。発動確率は 「ざんてつけん」の発動確率 = (使用者のレベル + 80) - 1 番目のモンスターのレベル (下限: 1, 上限: 99) の式で求められます。
  3. 最後に、0〜99 の乱数を取得して、この乱数の値が「ざんてつけん」の発動確率の数値以上であれば、「グングニル」が発動します。

上記の判定を行っても決定しなければ、「ざんてつけん」が発動します。

しのせんこくの処理

「しのせんこく」は対象を死の宣告の状態にします。「しのせんこく」はボス特性を持つキャラクタには効果はありません。なお、死の宣告の状態そのものには耐性はありません。

死の宣告の状態になると、「ATB タイマーの計算式」(もしくは以下の表をご覧ください) によって残り時間が決定され、死の宣告タイマーの発動までのフレーム数が 0 になったときに対象は戦闘不能になります。ただし、ゾンビ状態のキャラクタには効果はありません。

「しのせんこく」によって戦闘不能になった場合は、「モンスターを倒したフラグ」と「モンスターが逃走したフラグ」のどちらもセットされません。よって、「しのせんこく」で倒したモンスターからは経験値・ギル・アイテムを獲得しません。しかし、これらのフラグがリセットされるわけではありませんので、あからじめ普通に倒したモンスターを復活させてから「しのせんこく」で倒した場合は経験値などを獲得してしまいます。

死の宣告が発動するまでの時間
対象の状態 発動までのフレーム数 表示されるカウント
ヘイスト22515
スロウ90060
通常45030

とくいわざの処理

「とくいわざ」の攻撃による処理は以下のようになります。

  1. はじめに、「とくいわざ」の特性が「防御無視・回避無視」でなければ、「物理攻撃の命中判定」を行います。この命中判定に失敗したら、攻撃失敗として処理を終了します。
  2. 次に、対象が分身している状態であれば、その分身の数を減らしてから処理を終了します。

以上の命中判定に失敗していなければ、対象にダメージを与える処理を行います。

[...]

ダメージを処理したら、次に「とくいわざ」による状態変化の処理を行います。ただし、この処理を行う前に、「ゴーレム」の効果が残っているかどうかを確認して、もし残っていれば状態変化の処理を行いません。味方キャラクタではなく敵モンスターを攻撃する場合は「ゴーレム」の判定を行いません。「とくいわざ」による状態変化の処理は以下のとおりです。

  1. (発生する状態異常をリセット)
  2. 「とくいわざ」の特性が「毒」であれば、発生する状態異常に「毒」を追加します。
  3. 「とくいわざ」の特性が「暗闇」であれば、発生する状態異常に「暗闇」を追加します。
  4. 発生する状態異常を対象キャラクタにセットします。いずれかの状態変化に耐性がある場合は、失敗します。この状態変化に成功したら、以後「とくいわざ」の特性を読み込みません [1]
  5. (発生する状態異常をリセット)
  6. 「とくいわざ」の特性が「老化」であれば、発生する状態異常に「老化」を追加します。
  7. 「とくいわざ」の特性が「麻痺」であれば、発生する状態異常に「麻痺」を追加します。
  8. 「とくいわざ」の特性が「混乱」であれば、発生する状態異常に「混乱」を追加します。
  9. 発生する状態異常を対象キャラクタにセットします。いずれかの状態変化に耐性がある場合は、失敗します。この状態変化に成功したら、以後「とくいわざ」の特性を読み込みません [1]
  10. (発生する状態異常をリセット)
  11. 「とくいわざ」の特性が「スリップ」であれば、発生する状態異常に「スリップ」を追加します。
  12. 発生する状態異常を対象キャラクタにセットします。いずれかの状態変化に耐性がある場合は、失敗します。この状態変化に成功したら、以後「とくいわざ」の特性を読み込みません [1]
  1. インデックスレジスタが破壊されることで、代わりに 1 番目のキャラクタの「とくいわざ」特性が読み込まれるようになります。この結果は常にゼロです。
  2. 「とくいわざ」による状態変化は「戦闘開始時」のタイマー設定を用います [タイマー設定の対応表]。

グランドクロスの処理

「グランドクロス」は 0〜17 の乱数を取得して、この乱数の数値によって、以下の状態異常もしくは特殊な効果を与えます。ただし、対象が戦闘不能・石化・ゾンビのいずれかの状態なら、乱数の取得も含めすべての処理を行いません。

ストーカーしょりの処理

「ストーカーしょり」はサンドウォームとの戦闘かどうかによって、別々の処理を行います。

通常戦闘の場合

通常戦闘での「ストーカーしょり」の処理は以下のとおりです。

  1. はじめに、すべての敵モンスターを無敵状態にします。
  2. 次に、4〜11 (4: 1 番目, ..., 11: 8 版目) の乱数を取得して、そのモンスターの無敵状態を解除します。もし取得した乱数の値のモンスターが出現していなければ、乱数を取得しなおします。
  3. その後、1〜4 番目のモンスターのうちもっとも少ない HP を読み込みます。
  4. 最後に、1〜4 番目のモンスターの HP をこの読み込んだ数値に設定しなおします。

サンドウォームとの戦闘の場合

サンドウォームとの戦闘における「ストーカーしょり」の処理は以下のとおりです。

  1. はじめに、1〜6 番目の敵モンスターを無敵状態にします。
  2. 次に、7〜9 (7: 4 番目, ..., 9: 6 番目) の乱数を取得して、そのモンスター (「サンドウォーム」) の無敵状態を解除します。
  3. 4〜6 番目のモンスター (「サンドウォーム」) を出現していない状態にします。
  4. 1〜3 番目のモンスター (「あな」) を出現している状態にします。
  5. 4〜6 番目のモンスター (「サンドウォーム」) のうち、乱数で選ばれたモンスターを出現している状態にします。
  6. 1〜3 番目のモンスター (「あな」) のうち、「サンドウォーム」が出現する位置のモンスターを出現していない状態にします。
  7. 「モンスターを倒したフラグ」から 7 番目 (「ストーカーしょり」を行うモンスター) のモンスターをクリアして、それ以外のモンスターのフラグをセットします [1]
  8. 出現するモンスターのアニメーション処理に関連: $7E384F,X = { 7: #%01110000, 8: #%10101000, 9: #%11000100 }
  9. 「モンスターが逃走したフラグ」から 7 番目 (「ストーカーしょり」を行うモンスター) のモンスターをセットして、それ以外のモンスターのフラグをクリアします。
  1. サンドウォームとの戦闘後、7 体のモンスターを倒したことになります。

ビブロスしょりの処理

「ビブロスしょり」は、「ビブロスしょり」を実行したモンスターを消去して、モンスターパーティに設定された次の番号のモンスターを出現させます。消去するモンスターの倒したフラグをセットし、出現するモンスターの倒したフラグをクリアします。ただし、次の番号のモンスターが設定されていなければ処理を行いません。

特殊な戦闘の処理

マギサ戦

マギサとの戦闘の前に、レナが毒状態になります。

サンドウォーム戦

サンドウォームとの戦闘では、4〜6 番目のモンスター (「サンドウォーム」) への攻撃は 7 番目のモンスター (「ストーカーしょり」を行うモンスター) に命中するように変更されます。また、攻撃対象を選択したあとにその攻撃対象がいなくなってしまった場合は、「あな」に命中するように変更されます。また、離脱状態のキャラクタ/モンスターを戦闘不能とは見なしません。サンドウォームとの戦闘後は、敵がアイテムを落としません。

アトモス戦

アトモスとの戦闘では、戦闘不能になったキャラクタがアトモスの側へ引き寄せられます。

エクスデス戦

ムーアの大森林のエクスデス (No.1F7h) との戦闘では、すべてのキャラクタ/モンスターは HP が 0 になっても戦闘不能にはなりません。また、すべての味方キャラクタは永続的にスリップの状態になります。

ダミーターゲット

ダミーターゲットとは、コマンドメニューから選択することができないモンスターです。このモンスターは無敵とゾンビの状態に設定され、自動的に対象を選択する攻撃対象になり、その攻撃を無効にします。ゾンビ状態のため、倒さなくても戦闘には勝利できます。

ダミーターゲットはネオエクスデス戦、エヌオー戦、しんりゅう かい戦に存在します。GBA 版 FF5A では、ネオエクスデス戦に限り、自動的に対象を選択する攻撃でも、このダミーターゲットを選択しません。

各種バグ

ここでは、FF5 に存在する各種バグ技や仕様などについて述べます。これらのバグや仕様は、とくに明記されているもの以外は SFC 版 FF5、PS 版 FF5 および GBA 版 FF5A に存在します。

消費アイテムを使用する際の待ち時間

これは SFC 版 FF5 および PS 版 FF5 に存在します。

消費アイテムを使用する際の実行までの待ち時間が本来設定されていない値になる可能性があるバグがあります。これはプログラムがアイテムデータへのオフセットが格納されているインデックスレジスタを破壊して、代わりに使用したアイテム欄の位置を代入してしまうために起こります。このバグを防ぐためには、使用する消費アイテムをアイテム欄の以下の位置においてください (これは一例です)。

消費アイテムを配置する位置
右上からの位置 左上からの位置
1 番目1 番目
2 番目
3 番目
4 番目

アイテム消失バグ

これは SFC 版 FF5 および PS 版 FF5 に存在します。

対象となる味方キャラクタがひとりもいない場合に全体攻撃を受けると、アイテム欄の上から 74〜77 番目までのアイテムが消去されます。PS 版では、アイテム欄の上から 10〜14 番目までのアイテムが消去されます。これは対象がひとりもいない場合に受けた全体攻撃の「対象の数」を 4 としてしまうことが原因で、対象関連の処理が領域外のメモリを指してしまい、その結果アイテム欄を消去してしまいます。

ゾンビ状態のキャラクタが離脱処理を受ける

これは SFC 版 FF5 および PS 版 FF5 に存在します。

ゾンビ状態のキャラクタが「サークル」などの離脱処理を受けると、そのゾンビの行動がまわってきたときにゲームがハングアップします。これはゾンビ状態--正確には「HP 0 の判定」--の優先度が高すぎるために、離脱処理を受け付けないことで起こります。

ゾンビ状態のキャラクタが「ジャンプ」「かくれる」を行う

ゾンビ状態のキャラクタが「ジャンプ」「かくれる」を行うとゲームがハングアップします。FF5A では、「かくれる」を行った場合には自動的に「あらわれる」ように修正されました。また、ゾンビ状態になった直後に「ジャンプ」しないように修正されました。

Note: FF5A でも、既にゾンビになっている状態で「ジャンプ」を行った場合は、ハングアップしてしまうようです。

全員バーサーカーだと逃走できない

これは SFC 版 FF5 および PS 版 FF5 に存在します。

すべてのキャラクタのジョブを「バーサーカー」にすると、戦闘から逃走できなくなります。また、この状態で「チキンナイフ」による「とんずら」が発動すると、ゲームが進まなくなります。

老化で敵の攻撃力が減少しない

これは SFC 版 FF5 および PS 版 FF5 に存在します。

老化状態になると力・素早さ・体力・魔力の能力値が 1 ずつ減少して、さらに対象が敵モンスターの場合はレベル・攻撃力も同様に減少します。しかし、実際には攻撃力だけは 128 までしか減少しません。

老化で能力値がオーバーフロー

これは SFC 版 FF5 および PS 版 FF5 に存在します。

老化状態になると各種能力値が 1 ずつ減少します。これは、能力値を 1 減算したあとに 0 でなければ上書きするという処理になっているために、能力値が 1 以上あれば最低 1 で止まりますが、ちょうど 0 の場合は -1 されて 255 になります。

こびと・カエルだと、プロテスとバーサクの効果が正しく発動しない

これは SFC 版 FF5 および PS 版 FF5 に存在します。

こびともしくはカエルの状態だと、バーサクとプロテスの効果が正しく発動しません。これは実際に効果が無効になるわけではなく、プログラムの間違いによって、以下のような処理に変わってしまうためです。

能力値が上昇する「うた」を解除しても効果が続く

これは SFC 版 FF5 および PS 版 FF5 に存在します。

「うた」を歌っているキャラクタを沈黙状態にして歌っている状態を解除すると、その後、歌を歌っていない状態でも能力値が上昇し続けます。そして、1 番目のキャラクタの歌の効果が強制的に無効になります。ただし、このバグは 1 番目のキャラクタの歌を解除した場合には発生しません。これは沈黙したキャラクタの「うた」を解除する代わりに、1 番目のキャラクタの「うた」を解除してしまうバグです。

「かくれる」「あらわれる」「とらえる」「はなつ」を 4 番目のアビリティから使用する

これは SFC 版 FF5 にのみ存在します。

「かくれる」「あらわれる」「とらえる」「はなつ」を 4 番目のアビリティから使用すると異常動作を起こします。これは「かくれる」のコマンドを「あらわれる」に変更する処理 (「とらえる」なども同様) でのジャンプ命令のアドレスが間違っているために、4 番目のコマンドを変更したあとに領域外のメモリを指してしまうことで起こります。

「あらわれる」の使用後に「かくれる」の対象選択の動作が変わる

「あらわれる」を使用すると、そのキャラクタの「かくれる」を選択したあとに行われる対象選択の動作が変更されます。通常、「かくれる」は対象を選択せずに自動的に実行されますが、「あらわれる」の使用後は、このコマンドは自分自身を選択してからしか実行できなくなります。

「こうかがなかった」バグ

これは SFC 版 FF5 にのみ存在します。

「かくれる」や「ジャンプ」ですべての味方キャラクタがいない場合に「こうかがなかった」が表示されると、その後の魔法攻撃がすべて無効になります。この現象は、攻撃対象として、全体攻撃 (味方がカーソルで対象を選択する場合は、ふたり以上のキャラクタ)、出現していないキャラクタ、戦闘不能・石化・離脱もしくは隠れている・ジャンプしているキャラクタのいずれかが選択されるまで続きます。

アイテム変化バグ

これは SFC 版 FF5 にのみ存在します。

まず、アイテム変化バグを発生させるには以下の条件をすべて満たす必要があります。(以下、執筆中につきやや不正確です)

以上の条件を満たしたら、次にアイテム変化バグが発生するキャラクタが判定されます。対象になるキャラクタはクイックを使ったキャラクタから、4 番目のキャラクタまでです。ただし、クイックを使ったキャラクタを先頭のキャラクタとして扱います。同様に、次のキャラクタを 2 番目, さらに次を 3番目, ... とします。対象キャラクタが以下の条件を満たすとき、そのキャラクタの左手の盾のアイテム番号を 1 減算します。

ところで、なぜアイテム変化が成功するためには、スリップダメージを受ける周期である必要があるのでしょうか。実は、アイテム変化バグとは「スリップダメージによって HP を 1 減算する」処理が「アイテム番号を 1 減算する」処理に変わってしまうことで発生します。したがって、アイテム変化バグはスリップダメージを受ける周期ではない場合は成功しません。スリップダメージを受ける周期は 4 フレームに 1 回ですから、アイテム変化バグが成功する確率は 1/4 となります。

連続魔の対象変えバグ

これは SFC 版 FF5 にのみ存在します。

「ちょうごう」のメニューを実行したあとに「れんぞくま」を使用すると、「れんぞくま」の 1 回目に選択した対象が、2 回目に選択した対象に変更されてしまいます。このバグは「ちょうごう」のメニューを実行したあと、「アイテム」「のむ」「なげる」のメニューを実行することで回避できます。

エンディングでの薬士バグ

これは SFC 版 FF5 にのみ存在します。

エンディングの戦闘シーンで、薬士のキャラクタがいるとゲームがハングアップします。このバグの原因となっているプログラムコードの意図はよくわからないのですが、おそらく「(必要のない) 余計なプログラムをいれてしまった」という単純なミスである可能性が高そうです。

「ちからのくすり」の効果が武器攻撃に影響しない

「ちからのくすり」を飲むと、実際には「右手の攻撃力」「左手の攻撃力」がそれぞれ 20 ずつ上昇します。この「右手/左手の攻撃力」の値は「ゴブリンパンチのパラメータ」には影響するものの、通常の武器による攻撃にはまったく影響しません。

ミラージュベスト張り替えバグ

戦闘中に装備欄もしくはアイテム欄の位置を変更すると、アイテムの効果による状態異常が再適用されます。これを使えば「ミラージュベスト」の「ぶんしん」を何度でも復活させることなどができます。

「まほうバリア」がリフレク状態になっていると発動しない

「まほうバリア」は対象がリフレクの状態になっていると発動しません。また、既にシェルの状態になっていれば「まほうバリア」は必要ないのですが、そんなことはお構いなしに、何度でも発動してしまいます。プログラムを見た限りでは、開発段階では「まほうバリア」は「リフレク」の効果だったが、あとになって「シェル」の効果に変更されたのではないかと考えられます。

全体攻撃を受けても「まほうバリア」が 1 度しか発動しない

敵の 1 回目の攻撃で、味方キャラクタ全員が攻撃を受けても、最初のキャラクタ以外は「まほうバリア」を使用できません。ただし、敵の攻撃が 2 回目以降なら、「まほうバリア」は正しく発動します。

耐性残存バグ

状態異常への耐性を持つ防具を装備して戦闘を行うと、その戦闘終了時に、その防具のデータが「キャラクタ自身の状態異常への耐性」に書き込まれます。この「キャラクタ自身の状態異常の耐性」は装備していた防具を変更しても変わらないので、次の戦闘でもう一度おなじ防具の耐性を身につけることができます。

なお、「キャラクタ自身の状態異常の耐性」への書き込みは、戦闘終了時に毎回発生するため、装備していた防具の耐性を持ち越せるのは次の戦闘の 1 回限りとなります。

敵の MP を 9999 にする

通常、敵モンスターの最大 MP は 9999 に設定されています。これを利用して、「エーテル」や「エリクサー」で敵モンスターの MP を回復させると、最大値である 9999 まで減らすことができます。おそらく、初期状態では「MP が足りない」魔法を持っている敵モンスターのためにこのような設定になっているのでしょう。

「逃げられない!」技

逃げられないモンスターパーティとの戦闘で LR を入力すると、「逃げられない!」のメッセージが表示されます。これを入力し続けることで、戦闘プログラムを 1 フレームずつ進めることができます。ただし、ATB 処理の「行動決定」と「行動実行」の直前では、通常の戦闘処理とは別に逃走判定が行われます。このとき、「逃げられない!」のメッセージが通常よりも 1 回多く表示されることに注意してください。

時間の流れを遅くする

戦闘中に「ポーズ」を連打すると、その間は戦闘中の時間の流れが遅くなります。とくに、残り時間を示すカウントはこの影響を大きく受けます。残り時間を示すカウントは、ポーズを解除した直後は進まないためです。したがって、連打するほど残り時間を稼ぐことができます。

「しらべる」が敵の弱点を表示しない

「しらべる」はゲーム中の説明では敵の弱点を表示するとありますが、実際にはそうはなっていません。

「リターン」を無敵状態のキャラクタに使用する

「リターン」を無敵状態のキャラクタに対して使用するっと、画面が暗転したままになってしまうバグがあります。「リターン」の処理は次のようになっているのですが、

  1. 画面を暗転する
  2. 戦闘プログラムがリセットされるように設定する
  3. 戦闘プログラムによってリセットされる (画面も戻る)

このとき無敵状態のキャラクタを対象にした場合には、「戦闘プログラムがリセットされるように設定」する処理が行えないためにこの問題が起こります。

弱点カテゴリがダメージに影響しない

「弱点カテゴリ」に設定されている攻撃を行うと、その攻撃の「倍率」が 2 倍になりますが、プログラムが間違っているために与えるダメージには影響しません。

「リターン」を使用すると記憶したカーソルの位置が失われる

これは SFC 版 FF5 および PS 版 FF5 の仕様です。

戦闘中にカーソルの位置を動かしてから「リターン」を使用すると、以前に記憶したカーソルの位置が失われます。GBA 版 FF5A では「リターン」した直後は戦闘開始時のカーソル位置に戻るようになりました。

味方のカウンター行動とスリップダメージ

味方のカウンター行動が決定された直後に、そのキャラクタがスリップダメージで戦闘不能になると ATB のタイマーが進まなくなります。キャラクタのカウンター行の処理動は次のようになっているのですが、

  1. 自分以外の ATB タイマーを一時中断する
  2. 自分がカウンター行動を行う
  3. その後 ATB タイマーを再開する

スリップダメージによってその味方が戦闘不能になってしまうと、「自分がカウンター行動」以降の処理ができなくなってしまうことが原因ではないかと推測しています。なお、敵の場合は、カウンター行動時にはスリップダメージが発生しないため、この問題は起こりません。

左手の「だいちのハンマー」で攻撃する

二刀流にして、左手に「だいちのハンマー」「だいちのベル」「かぜきりのやいば」を装備して攻撃すると、左手の武器の特殊効果が発動したときに攻撃が失敗します。

アトモスが混乱したまま戦闘不能になったキャラクタを吸い込む

アトモスとの戦闘において、混乱したまま戦闘不能になったキャラクタが「ワームホール」で吸い込まれると、アトモスは以後「ワームホール」以外の行動を行わなくなります。

バーサク状態だと攻撃がサンドウォームに命中しない

バーサク状態や「みだれうち」「はなつ (単体攻撃)」などの「自動的に対象を選択する」攻撃は、サンドウォームにはほとんど命中しません。

通常、攻撃対象を選択したあとにその攻撃対象がいなくなってしまった場合は、その対象を自動的に選択しなおします。しかしながら、サンドウォーム戦では、このような場合は攻撃対象を「あな」に命中するように変更します。これは「サンドウォームへの攻撃を選んだあとに『あな』に潜られた場合は、攻撃は命中しない」という演出のためではないかと考えられます。

ところが、「自動的に対象を選択する」攻撃は、1〜8 番目のモンスターからランダムに選択した敵モンスターを対象とするだけなので、その攻撃対象がいない場合には「あな」に命中することになります。

サンドウォームが選ばれる確率は 1/8、「あな」が選ばれる確率は 2/8、そしてそれ以外の敵モンスターが選ばれる確率は 5/8 なのですが、それ以外の敵モンスターを攻撃した場合は「あな」に命中するわけですから、実際に「自動的に対象を選択する」攻撃がサンドウォームに命中する確率は 1/8 となります。

どくろイーター・32ページなどを「しのせんこく」で倒すと経験値を獲得する

どくろイーターや32ページなどを「しのせんこく」で倒すと、出現していないモンスターの分の経験値を獲得するようです。これは敵モンスターの種類に関係なくそうなるようにプログラムされています。

戦闘開始時に出現していない敵モンスターには「モンスターを倒したフラグ」と「モンスターが逃走したフラグ」が同時に立っています。普通に敵モンスターを倒すと「モンスターが逃走したフラグ」が適用され、出現していないモンスターは「逃走した」扱いになりますので、倒したことにはなりません。

ところが、「しのせんこく」および「サークル」だけですべての敵モンスターを倒した場合は「モンスターが逃走したフラグ」は適用されません。この場合は出現していないモンスターは「倒した」という扱いになりますので、それらのモンスターの経験値を獲得します。

老化と同時に発生した沈黙・麻痺が回復しない

老化の状態異常と同時に、沈黙・麻痺の状態異常が発生すると、沈黙・麻痺の状態は自動的には回復しません。実際にこの状態異常が同時に発生する攻撃はほとんどないのですが、例えばギルガメの「かめのこうら」やハーデスの「かま」を受けるとこのバグが発生します。

敵が魔法攻撃・物理攻撃を連続して行う

敵が魔法攻撃と物理攻撃を連続して行うと、盾やゴーレムなどで回避する演出効果が正しく行われません。

ゴーレムが物理攻撃を正しく防がない

敵が 3 回以上の行動を連続して行うと、ゴーレムが物理攻撃を正しく防がないことがあります。これは、敵の 2 回目の攻撃が物理攻撃だと、それ以降の攻撃をすべて物理攻撃と見なし、攻撃が魔法攻撃であれば、それ以降の攻撃をすべて魔法攻撃と見なすためです。

「うた」を解除すると、そのキャラクタが行動できなくなる

「うた」を歌っているキャラクタを、沈黙、ミュートによって、歌っている状態が解除されると、タイミングによってはそのキャラクタが行動できなくなります。このタイミングは、そのキャラクタが次に行動できるようになるまでの時間と同じです。「うた」を歌っていても、内部的には ATB ゲージは進んでいます。この ATB ゲージが進んで行動できるようになると、キャラクタの ATB ゲージは一時的に--別の行動をするまで--停止します。ところが、「うた」を沈黙、ミュートによって解除すると、ATB ゲージが止まったままの状態になってしまいます。

「リターン」が制限時間をもとに戻さない

これは GBA 版 FF5A にのみ存在します。未確認なのですが、欧州版の FF5A では修正されているようです。

FF5A (日本語版および USA 版) では、「リターン」を使用しても、残りの制限時間がもとに戻りません。

「よげん」「リジェネ」の HP オーバーフローバグ

これは GBA 版 FF5A にのみ存在します。

FF5A では、「よげん」もしくは「リジェネ」によって HP が回復した場合に、HP の数値が表現できる範囲 (符号なし 16bit 整数: (2^16)-1 = 65535) を超えてしまうと、その分 HP が減ってしまうバグがあります。例えば、HP 65000 の「しんりゅう かい」に「リジェネ」を使用すると 588 回復して 65000 + 588 = 65588 ですが、これは HP の数値が表現できる範囲 ((2^16)-1 = 65535) を超えているので、超えてしまった分のビットは切り捨てられ、65588 % 65536 = 52 が対象の残り HP になります。

パンテーラが分身したあとに全滅する

これは GBA 版 FF5A にのみ存在します。

FF5A で、パンテーラとの戦闘でこのモンスターが「ぶんしん!!」を行うと、その直後に敵モンスターが全滅する問題について述べます。まず、SFC/PS 版 FF5 と GBA 版 FF5A では、パンテーラのモンスターパーティの設定が異なります。この違いを以下の表に示します。

FF5 と FF5A でのパンテーラのモンスターパーティ設定の違い
No. モンスターの名前 モンスターの状態 SFC 版での HP GBA 版での HP
1パンテーラ最初から出現1800018000
2パンテーラ分身後に出現1800018000
3パンテーラ分身後に出現1800018000
4空欄出現しない655350

FF5 と FF5A では、4 番目のモンスター (「空欄」) の HP が異なっています。

次に、パンテーラは「ぶんしん!!」のメッセージを表示したあとに、「ストーカーしょりの処理: 通常戦闘の場合」の処理を行うのですが、これには次の処理が含まれています。

  1. 1〜4 番目のモンスターのうちもっとも少ない HP を読み込みます。
  2. 最後に、1〜4 番目のモンスターの HP をこの読み込んだ数値に設定しなおします。

FF5A では、4 番目のモンスター (「空欄」) の HP が 0 になっているので、「1〜4 番目のモンスターのうちもっとも少ない HP を読み込む」の結果はかならず 0 になります。そして、敵モンスターの HP をこの読み込んだ数値 (= 0) に設定しなおすので、結果として敵モンスターが全滅してしまいます。

謝辞

ff_analyzer および各種プログラムの解析資料を公開されている遠藤慎悟氏 (Index of /~s-endo/) にお礼申し上げます。ff_analyzer はとても参考になりました。各種プログラムの解析資料は、筆者がファイナルファンタジー V のプログラムを理解するための大きな手助けをしてくれました。

参考文献

[ff_analyzer]
遠藤慎悟, ff_analyzer - ファイナルファンタジーIV〜VI データ解析プログラム, 26 July 2003
<http://s-endo.skr.jp/ff_analyzer.html>
[ff_analyzer+]
Inu, ff_analyzer+ - ファイナルファンタジー IV〜VI アドバンス データ解析プログラム -- Originally based on ff_analyzer by 遠藤慎悟
<http://x11.s11.xrea.com/ff_analyzer>
Inu <inuchr {at} gmail dot com>