この文書は、「ファイナルファンタジー V (以下、FF5)」の「やりこみ」に関連する、戦闘システムの基礎知識や各種アルゴリズムなどについて書かれたものです。この文書は FF5 のゲームプログラムの解析を行って、正確な記述をすることを目標に書かれています。また、FF5 を何度かプレイしたような経験のあるプレイヤーを対象にしていますから、FF5 をあまりプレイしたことのない方や、「やりこみ」未経験者にはわかりにくい表現などが書かれているかもしれません。ご注意ください。
現在、この文書は未完成であり、正しくない情報などが書かれている可能性があります。現状では説明がかなり不足していますので、何とかしたいところです。
{A〜B}
の表記は、A から B の範囲の乱数を取得することを示します。また、{A, B}
の表記は、乱数を取得して "," (comma) で区切られたいずれかの値を取ることを示します。
FF5 の戦闘システムにおける ATB システムについての基礎知識です。
はじめに、ATB のシステムに関する用語を定義します。
N + 1
) フレームごとにタイマーが進みます。 タイマー発動までのフレーム数 = ATB 時間×(タイマー周期 + 1)
の式で求めることができます。これは単に「フレーム」と表記されることがあります。ATB 時間はフレーム数を表すのではないことに注意してください。そして、フレームは秒数を表すのではないことに注意してください。この文書におけるフレームの定義は 1/60 秒や 1/30 秒のような秒数ではありません。戦闘プログラムが 1 秒間に処理できるフレームの数は、実装や処理状況によって異なります。
各種タイマーについての説明は以下のとおりです。
タイマー | タイマーの説明 |
---|---|
行動待ち時間 | キャラクタが行動可能になるまでの待ち時間です。キャラクタの行動後にタイマーは初期値に戻ります。後述しますが、「実行までの待ち時間」も内部的にはこのタイマーに設定されます。 |
ストップ | ストップが解除されるまでの時間です。 |
毒 | 毒のダメージを受けるまでの時間です。毒のダメージ後にタイマーは初期値に戻ります。 |
リフレク | リフレクが解除されるまでの時間です。 |
死の宣告 | 死の宣告が発動するまでの時間です。 |
沈黙 | 沈黙が解除されるまでの時間です。 |
スリップ | スリップが解除されるまでの時間です。 |
老化 | 老化で各種パラメータが下がるまでの時間です。老化の効果後にタイマーは初期値に戻ります。 |
リジェネ | リジェネで回復するまでの時間です。リジェネの回復後にタイマーは初期値に戻ります。 |
歌 | 歌で各種パラメータが上昇するまでの時間です。歌の効果後にタイマーは初期値に戻ります。 |
麻痺 | 麻痺が解除されるまでの時間です。 |
タイマー周期は各種パラメータには影響されず、常に固定値です。以下は各種タイマーとタイマー周期との対応を示した表です。
タイマー | タイマー周期 |
---|---|
ストップ | 0 |
毒 | 2 |
リフレク | 4 |
死の宣告 | 14 |
沈黙 | 1 |
スリップ | 0 |
老化 | 0 |
リジェネ | 1 |
歌 | 0 |
麻痺 | 0 |
行動待ち時間 | 0 |
以下は各種タイマーとキャラクタが行動可能になるまでの待ち時間/状態の回復・発動時間との対応を示した表です。
状態異常のためのタイマー設定には 2 種類の設定があります。基本的には「通常」のタイマー設定が用いられますが、戦闘開始時から発動する状態異常には「戦闘開始時」のタイマー設定が用いられます。また、例外として「魔法剣」「とくいわざ」「グランドクロス」による攻撃も「戦闘開始時」のタイマー設定を用います。
ATB 時間を決定したあとは、最後に以下の修正を行ってから、タイマーの時間を設定します。
タイマー | ATB 時間 |
---|---|
行動待ち時間 | 120 + (装備の重さ÷8) - 素早さ (下限: 1) |
タイマー | 通常の 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 時間 | 周期 | |
---|---|---|---|
行動待ち時間 | 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 | まほうけん L1 | 0 |
45 | まほうけん L2 | 0 |
46 | まほうけん L3 | 0 |
47 | まほうけん L4 | 0 |
48 | まほうけん L5 | 0 |
49 | まほうけん L6 | 0 |
50 | しろまほう L1 | 0 |
51 | しろまほう L2 | 0 |
52 | しろまほう L3 | 0 |
53 | しろまほう L4 | 0 |
54 | しろまほう L5 | 0 |
55 | しろまほう L6 | 0 |
56 | くろまほう L1 | 0 |
57 | くろまほう L2 | 0 |
58 | くろまほう L3 | 0 |
59 | くろまほう L4 | 0 |
60 | くろまほう L5 | 0 |
61 | くろまほう L6 | 0 |
62 | じくう L1 | 0 |
63 | じくう L2 | 0 |
64 | じくう L3 | 0 |
65 | じくう L4 | 0 |
66 | じくう L5 | 0 |
67 | じくう L6 | 0 |
68 | しょうかん L1 | 0 |
69 | しょうかん L2 | 0 |
70 | しょうかん L3 | 0 |
71 | しょうかん L4 | 0 |
72 | しょうかん L5 | 0 |
73 | しろくろま L1 | 0 |
74 | しろくろま L2 | 0 |
75 | しろくろま L3 | 0 |
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 | あんこく L1 | 0 |
88 | あんこく L2 | 0 |
89 | あんこく L3 | 0 |
90 | あんこく L4 | 0 |
91 | あんこく L5 | 0 |
92 | めいやく | 0 |
93 | せんこく | 0 |
94 | よげん | 0 |
95 | ほうげき | 1 |
96 | ごうせい | 1 |
97 | ぜんぎり | 1 |
98 | ひっさつ | 1 |
バトルモードが「ウェイト」に設定されている場合は、何らかのメニューを実行している間は、戦闘プログラムそのものが一時停止します。「アクティブ」の場合は特別な処理を行いません。
「バトルスピード」は、味方の行動がまわってきた直後の「ATB の全タイマーを処理しない」時間のフレーム数を決定します。この ATB の全タイマーを処理しない時間を入力待ち時間と呼称します。「バトルスピード」と入力待ち時間の対応は以下のようになります。
バトルスピード | 入力待ち時間 |
---|---|
1 | 0 |
2 | 15 |
3 | 30 |
4 | 60 |
5 | 120 |
6 | 240 |
プログラムの仕様上、入力待ち時間が 1 以上残っている状態でコマンドを入力した直後の 1 フレームは全タイマーを処理しません。
対象がスリップ状態になっている場合は、4 フレームごとに 1 ダメージを受けます。ただし、対象がジャンプしている場合はダメージを受けません。また、対象が隠れている場合は HP は 0 になりません。
「よげん」で選択された魔法が発動するまでの待ち時間は以下のとおりです。予言のタイマーを進めたあと、発動までの残りフレーム数が 25, 50, 75, 100, 125 のときに残りカウントが表示されます。
名前 | 消費 MP | 発動までのフレーム数 | 表示されるカウント |
---|---|---|---|
よげん L1 | 1 | 155 | 5 |
よげん L2 | 3 | 125 | 4 |
よげん L3 | 7 | 95 | 3 |
よげん L4 | 9 | 50 | 1 |
「よげん 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()
については、「乱数生成」を参照してください。
まだ未完成です。
まだ未完成です。
キャラクタの名前 | 力 | 素早さ | 体力 | 魔力 |
---|---|---|---|---|
バッツ | +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 にします。 |
状態変化のなかには、特定の状態になっていると発生しないものがあります。特定の状態になると発生しない状態変化を「防御できる状態変化」とします。特定の状態と防御できる状態変化が同じものは、重ねてかけられないことを意味します。まだ未完成です。
名称 | 防御できる状態変化 |
---|---|
ゾンビー | 暗闇, ゾンビー, 毒, レビテト, こびと, カエル, 石化, 戦闘不能 |
石化 | ゾンビー |
バーサク | バーサク, 混乱 |
混乱 | バーサク, 混乱, ストップ |
麻痺 | 麻痺 |
操られている | バーサク, 混乱 |
例外として、以下の攻撃方法は「防御できる状態変化」の影響を受けません。
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 で用いられる乱数テーブルは以下のとおりです。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | 07 | B6 | F0 | 1F | 55 | 5B | 37 | E3 | AE | 4F | B2 | 5E | 99 | F6 | 77 | CB |
10 | 60 | 8F | 43 | 3E | A7 | 4C | 2D | 88 | C7 | 68 | D7 | D1 | C2 | F2 | C1 | DD |
20 | AA | 93 | 16 | F7 | 26 | 04 | 36 | A1 | 46 | 4E | 56 | BE | 6C | 6E | 80 | D5 |
30 | B5 | 8E | A4 | 9E | E7 | CA | CE | 21 | FF | 0F | D4 | 8C | E6 | D3 | 98 | 47 |
40 | F4 | 0D | 15 | ED | C4 | E4 | 35 | 78 | BA | DA | 27 | 61 | AB | B9 | C3 | 7D |
50 | 85 | FC | 95 | 6B | 30 | AD | 86 | 00 | 8D | CD | 7E | 9F | E5 | EF | DB | 59 |
60 | EB | 05 | 14 | C9 | 24 | 2C | A0 | 3C | 44 | 69 | 40 | 71 | 64 | 3A | 74 | 7C |
70 | 84 | 13 | 94 | 9C | 96 | AC | B4 | BC | 03 | DE | 54 | DC | C5 | D8 | 0C | B7 |
80 | 25 | 0B | 01 | 1C | 23 | 2B | 33 | 3B | 97 | 1B | 62 | 2F | B0 | E0 | 73 | CC |
90 | 02 | 4A | FE | 9B | A3 | 6D | 19 | 38 | 75 | BD | 66 | 87 | 3F | AF | F3 | FB |
A0 | 83 | 0A | 12 | 1A | 22 | 53 | 90 | CF | 7A | 8B | 52 | 5A | 49 | 6A | 72 | 28 |
B0 | 58 | 8A | BF | 0E | 06 | A2 | FD | FA | 41 | 65 | D2 | 4D | E2 | 5C | 1D | 45 |
C0 | 1E | 09 | 11 | B3 | 5F | 29 | 79 | 39 | 2E | 2A | 51 | D9 | 5D | A6 | EA | 31 |
D0 | 81 | 89 | 10 | 67 | F5 | A9 | 42 | 82 | 70 | 9D | 92 | 57 | E1 | 3D | F1 | F9 |
E0 | EE | 08 | 91 | 18 | 20 | B1 | A5 | BB | C6 | 48 | 50 | 9A | D6 | 7F | 7B | E9 |
F0 | 76 | DF | 32 | 6F | 34 | A8 | D0 | B8 | 63 | C8 | C0 | EC | 4B | E8 | 17 | F8 |
先制攻撃とバックアタックの処理は、戦闘開始時に行われます。ただし、1 番目のモンスターの番号が 256 以上の場合は、先制攻撃とバックアタックの判定を行いません。また、「けいかい」のアビリティを持っている場合はバックアタックの判定を行いません。また、「リターン」で戦闘がやり直された場合もバックアタックの判定を行いません。
先制攻撃とバックアタックの処理は以下のとおりです。
キャラクタが戦闘から逃走する処理は、戦闘中に LR が 20 フレームの間入力されていれば逃走判定を行い、この結果が成功であれば戦闘から逃走します。また、「とんずら」などによって戦闘を制御する状態が逃げる状態になっていれば、逃走判定を無視して戦闘から逃走します。
逃走判定はまず、モンスターパーティが「逃げられない」設定になっている場合は、無条件に逃走判定に失敗します。そうでなければ 0〜99 の乱数を取得して、この乱数の値がモンスターパーティの「逃げやすさ」の数値未満であれば逃走判定に成功します。
現在、執筆中です。
物理攻撃への回避判定は、対象が混乱・麻痺・睡眠・ストップのいずれかの状態ではない場合で、自分自身を攻撃しているのでなければ判定されます。この回避判定は以下のことを行います。
「イージスの盾」による回避判定は、対象が「イージスの盾」を装備していて、混乱・麻痺・睡眠・ストップのいずれかの状態ではない場合に判定されます。この回避判定は 0〜99 の乱数を取得して、33 未満であれば回避判定に成功します。
物理攻撃の命中判定は、まず以下の判定を行います。処理の途中で命中判定に成功もしくは失敗した時点で、それ以降の処理は行いません。
上記の判定によって命中判定に成功・失敗していなければ、対象の状態と自分の状態によって、以下のような修正を行います。なお、回避率と命中率は、それぞれ「対象の回避率」と「自分の命中率」を示します。
その後、以下の命中判定を行います。
最後に、命中判定に成功していれば対象が分身しているかどうかの判定を行います。命中判定に成功していなければ、命中判定を失敗とします。
物理攻撃用の判定を行う魔法攻撃の命中判定は、まず以下の判定を行います。処理の途中で命中判定に成功もしくは失敗した時点で、それ以降の処理は行いません。なお、この命中判定は「チョコボキック」「デブチョコボ」「グングニル」「ゴブリンパンチ」「しにがみのつるぎ」「ジャンプ」によって用いられます。
上記の判定によって命中判定に成功・失敗していなければ、対象の状態によって、以下のような修正を行います。
その後、以下の命中判定を行います。
最後に命中判定に成功していなければ、命中判定を失敗とします。
魔法攻撃の命中判定は、まず以下の判定を行います。処理の途中で命中判定に成功もしくは失敗した時点で、それ以降の処理は行いません。
上記の判定によって命中判定に成功・失敗していなければ、次の処理を行います。
魔法の命中率 + 自分のレベル (上限: 99) - 対象のレベル
の式で求められます。ただし、上限は 99 です。下限は 0 ですが、結果が負数のときは 1 に設定されます。対象の魔法回避率
に設定されます。その後、対象の「魔法攻撃への回避判定」を行います。これにより対象の回避判定に成功した場合は、命中判定に失敗します。この判定によって命中判定に成功・失敗していなければ、対象の状態によって、以下のような修正を行います。
その後、以下の命中判定を行います。
このどちらの判定にも失敗しなければ、命中判定を成功とします。
FF5 におけるダメージの算出方法は、攻撃力、防御力、倍率の 3 種類のパラメータから算出されます。この各種パラメータに設定される値については、「ダメージ計算式の各種パラメータの設定」を参照してください。また、攻撃者と攻撃対象の状態などによって、この各種パラメータの値は修正されます。この各種パラメータの修正については「ダメージ計算式の各種パラメータの修正」を参照してください。
そして、上記のパラメータを x = uint(攻撃力 - 防御力)×倍率
の式に当てはめて、ダメージを算出します。ただし、攻撃力 >= 0
, 防御力 >= 0
, 倍率 >= 1
, uint(攻撃力 - 防御力) >= 0
, 0 <= x <= 9999
です。また、x は 符号なし 16bit 整数 (0〜65535
の範囲) です。この算術結果に桁溢れが起きた場合は、溢れたビットを切り捨てます。
Note: 各種パラメータの算出には、キャラクタの能力値を用いることがあります。自分のレベル, 自分の力, 自分の素早さ, 自分の体力, 自分の魔力の上限は 99 として計算されますが、自分ではなく対象キャラクタの能力値として参照する場合は、この上限はありません。
以下の効果タイプに一致する攻撃方法は、一般的な魔法のパラメータによってダメージが算出されます。
設定される各種パラメータは以下のとおりです。
攻撃力 = 魔法の攻撃力 + {0〜(魔法の攻撃力÷8)}
防御力 = 対象の魔法防御力
倍率 = (自分のレベル×自分の魔力÷256) + 4
以下の効果タイプに一致する攻撃方法は、対象の防御力をほぼ無視する魔法のパラメータによってダメージが算出されます。
設定される各種パラメータは以下のとおりです。
攻撃力 = 魔法の攻撃力 + {0〜(魔法の攻撃力÷32)}
防御力 = (対象の魔法防御力÷32)
倍率 = (自分のレベル×自分の魔力÷256) + 4
以下の効果タイプに一致する攻撃方法は、固有の倍率を持つランダムな攻撃力の魔法のパラメータによってダメージが算出されます。
設定される各種パラメータは以下のとおりです。
攻撃力 = {50〜200}
防御力 = 対象の魔法防御力
倍率 = 魔法固有の倍数
以下の効果タイプに一致する攻撃方法は、物理攻撃扱いの魔法のパラメータによってダメージが算出されます。
設定される各種パラメータは以下のとおりです。
攻撃力 = 魔法の攻撃力 + {0〜(魔法の攻撃力÷8)}
防御力 = 対象の物理防御力
倍率 = (自分のレベル×自分の魔力÷256) + 4
以下の効果タイプに一致する攻撃方法は、レベルによって倍率が決定するランダムな攻撃力の魔法のパラメータによってダメージが算出されます。
設定される各種パラメータは以下のとおりです。
攻撃力 = {10〜100}
防御力 = 対象の魔法防御力
倍率 = (自分のレベル÷8) + 2
効果タイプ 50h: ゴブリンパンチによる攻撃方法は、ゴブリンパンチのパラメータによってダメージが算出されます。設定される各種パラメータは以下のとおりです。
防御力 = 対象の物理防御力
攻撃力 = モンスターの攻撃力
倍率 = モンスター固有の倍率
攻撃力 = 自分の右手の攻撃力 + 自分の左手の攻撃力
倍率 = (自分のレベル×自分の力÷128) + 2
また、自分のレベルと対象のレベルが等しい場合には、攻撃力が 8 倍になり、防御力は 0 になります。
効果タイプ 6Fh: たたかう!による攻撃方法は、たかかう!のパラメータによってダメージが算出されます。設定される各種パラメータは以下のとおりです。
攻撃力 = (モンスターの攻撃力×8) + {0〜(モンスターの攻撃力÷8)}
防御力 = 対象の物理防御力
倍率 = モンスター固有の倍率
モンスターの行動において、「たたかう」「とくいわざ」「武器攻撃 (ゆうばく)」の行動はモンスターの物理攻撃に分類されます。モンスターの物理攻撃は「ぶんしん」や「ゴーレム」で回避することができます。設定される各種パラメータは以下のとおりです。
攻撃力 = モンスターの攻撃力 + {0〜(モンスターの攻撃力÷8)}
防御力 = 対象の物理防御力
倍率 = モンスター固有の倍率
効果タイプ 30h: すで・けりによる攻撃方法は、すでのパラメータによってダメージが算出されます。設定される各種パラメータは以下のとおりです。
防御力 = 対象の物理防御力
回避率 = 対象の物理回避率
50
加算します。
攻撃力 = {0〜(自分のレベル÷4)} + (自分のレベル×2) + 3
倍率 = (自分のレベル×自分の力÷256) + 2
攻撃力 = {0〜(自分のレベル÷4)} + 3
倍率 = 2
以下の効果タイプに一致する攻撃方法は、剣/刀のパラメータによってダメージが算出されます。
設定される各種パラメータは以下のとおりです。
攻撃力 = 武器の攻撃力 + {0〜(武器の攻撃力÷8)}
防御力 = 対象の物理防御力
回避率 = 対象の物理回避率
倍率 = (自分の力×自分のレベル÷128) + 2
以下の効果タイプに一致する攻撃方法は、ナイフ/短刀のパラメータによってダメージが算出されます。
設定される各種パラメータは以下のとおりです。
攻撃力 = 武器の攻撃力 + {0〜3}
防御力 = 対象の物理防御力
回避率 = (対象の物理回避率÷2)
倍率 = (自分の力×自分のレベル÷128) + (((自分の素早さ×自分のレベル) % 256)÷128) + 2
以下の効果タイプに一致する攻撃方法は、槍のパラメータによってダメージが算出されます。この武器による攻撃方法は「ジャンプ」していれば、倍率が 2 倍になり、前列・後列の影響を受けません。
設定される各種パラメータは以下のとおりです。
攻撃力 = 武器の攻撃力 + {0〜(武器の攻撃力÷8)}
防御力 = 対象の物理防御力
回避率 = 対象の物理回避率
倍率 = (自分の力×自分のレベル÷128) + 2
以下の効果タイプに一致する攻撃方法は、弓矢のパラメータによってダメージが算出されます。この武器による攻撃方法は前列・後列の影響を受けません。
設定される各種パラメータは以下のとおりです。
攻撃力 = 武器の攻撃力 + {0〜3}
防御力 = 対象の物理防御力
回避率 = (対象の物理回避率÷2)
倍率 = (自分の力×自分のレベル÷128) + (((自分の素早さ×自分のレベル) % 256)÷128) + 2
以下の効果タイプに一致する攻撃方法は、鞭のパラメータによってダメージが算出されます。この武器による攻撃方法は前列・後列の影響を受けません。
設定される各種パラメータは以下のとおりです。
攻撃力 = 武器の攻撃力 + {0〜3}
防御力 = 対象の物理防御力
回避率 = 対象の物理回避率
倍率 = (自分の力×自分のレベル÷128) + (((自分の素早さ×自分のレベル) % 256)÷128) + 2
以下の効果タイプに一致する攻撃方法は、斧のパラメータによってダメージが算出されます。効果タイプ 3Ah に一致する攻撃方法は前列・後列の影響を受けません。
設定される各種パラメータは以下のとおりです。
攻撃力 = (武器の攻撃力÷2) + {0〜武器の攻撃力}
防御力 = (対象の物理防御力÷4)
回避率 = 対象の物理回避率
倍率 = (自分の力×自分のレベル÷128) + 2
以下の効果タイプに一致する攻撃方法は、マジックポイントを消費してクリティカルヒットする武器のパラメータによってダメージが算出されます。
設定される各種パラメータは以下のとおりです。
攻撃力 = (武器の攻撃力÷2) + {0〜武器の攻撃力}
防御力 = (対象の物理防御力÷4)
回避率 = 対象の物理回避率
倍率 = (自分の力×自分のレベル÷128) + 2
また、マジックポイントを消費することで以下の修正を得られます。消費するマジックポイントはルーンブレイドが 8, ルーンアクス/ルーンのベルが 5 です。マジックポイントが足りない場合は以下の修正は行われません。
20
、ルーンアクス/ルーンのベルなら 10
の数値を加算する(自分のレベル×自分の魔力÷128)
を加算する以下の効果タイプに一致する攻撃方法は、魔法系のベルのパラメータによってダメージが算出されます。この武器による攻撃方法は「ミュート」状態では使用することができません。
設定される各種パラメータは以下のとおりです。
攻撃力 = (武器の攻撃力÷2) + {0〜(武器の攻撃力÷2)}
防御力 = 対象の魔法防御力
回避率 = 対象の魔法回避率
倍率 = (自分の素早さ×自分のレベル÷128) + (自分の魔力×自分のレベル÷128) + 2
以下の効果タイプに一致する攻撃方法は、魔法系のロッドのパラメータによってダメージが算出されます。
設定される各種パラメータは以下のとおりです。
攻撃力 = {0〜武器の攻撃力}×2
防御力 = 対象の魔法防御力
回避率 = 対象の魔法回避率
倍率 = (自分の魔力×自分のレベル÷256) + 2
効果タイプ 8Eh: デモンズロッドによる攻撃方法は、デモンズロッドのパラメータによってダメージが算出されます。デモンズロッドによる攻撃は毒属性となります。設定される各種パラメータは以下のとおりです。
攻撃力 = {0〜武器の攻撃力}×2
防御力 = 対象の魔法防御力
回避率 = 対象の魔法回避率
倍率 = (自分の魔力×自分のレベル÷256) + 2
効果タイプ 6Eh: ブレイブブレイドによる攻撃方法は、ブレイブブレイドのパラメータによってダメージが算出されます。設定される各種パラメータは以下のとおりです。
攻撃力 = (武器の攻撃力 - 逃走した回数 (上限: 255))
防御力 = 対象の物理防御力
回避率 = 対象の物理回避率
倍率 = (自分のレベル×自分の力÷128) + 2
効果タイプ 64h: チキンナイフによる攻撃方法は、チキンナイフのパラメータによってダメージが算出されます。設定される各種パラメータは以下のとおりです。
攻撃力 = (逃走した回数 (上限: 255)÷2)
防御力 = 対象の物理防御力
回避率 = (対象の物理回避率÷2)
倍率 = (自分のレベル×自分の力÷128) + (自分のレベル×自分の素早さ÷128) + 2
「ためる」による攻撃方法は、武器による攻撃として扱いますが、この攻撃を「倍率を 2 倍にする」設定にします。この設定は物理攻撃にのみ適用されます。
「チャクラ」による攻撃方法は、以下のパラメータによって回復量が算出されます。
攻撃力 = 40 + {0〜5}
防御力 = 対象の魔法防御力
倍率 = (自分のレベル×自分の魔力÷256) + 4
「なげる」による攻撃方法は、以下のパラメータによってダメージが算出されます。
攻撃力 = 120 + {0〜15}
防御力 = 対象の魔法防御力
倍率 = (自分のレベル×自分の魔力÷256) + 4
攻撃力 = (武器の攻撃力 + {0〜(武器の攻撃力÷8)})×2
防御力 = 対象の物理防御力
倍率 = (自分の力×自分のレベル÷128) + (自分の素早さ×自分のレベル÷128) + 2
「ぜになげ」による攻撃方法は、以下のパラメータによってダメージが算出されます。また、消費するギルは 自分のレベル×対象の数×50
の式で求められます。
攻撃力 = 自分のレベル + 10
防御力 = 対象の物理防御力
倍率 = 150
「みだれうち」による攻撃方法は、武器による攻撃として扱いますが、この攻撃を「倍率を 1/2 にする」「かならず命中する」「防御力を無視する」設定にします。この設定は物理攻撃にのみ適用されます。
ニードルショット・ニードルバースト・ニードルキャノン以外の、効果タイプ 85h:「ごうせい」による攻撃方法は、以下のパラメータによってダメージが算出されます。
攻撃力 = 魔法の攻撃力 + {0〜(魔法の攻撃力÷8)}
防御力 = 0
倍率 = (自分のレベル×自分のレベル÷256) + 4
ニードルショット・ニードルバースト・ニードルキャノンによる攻撃方法のダメージはそれぞれ 1000, 2000, 3000
の固定値です。
現在、執筆中です。
「ぬすむ」の処理をはじめる前に、まずそのモンスターからアイテムを盗んだかどうかを確認し、すでにアイテムを盗んでいれば「なにももっていない!」を表示して「ぬすむ」の処理を終了します。まだ盗んでいなければ、まず以下の命中判定を行います。
上記の命中判定に失敗していなければ、次に「ぬすむ」の処理を行います。なお、上記の命中判定もしくは「ぬすむ」の処理に失敗したら、「ぬすみそこなった」を表示して「ぬすむ」の処理を終了します。
「とらえる」の処理は、はじめに対象のモンスターを「とらえる」ことができるかどうかの判定を行います。瀕死状態については、あらかじめ対象の HP が最大 HP の 1/8 の値以下であれば瀕死状態と見なされます。ただし、対象の HP が 0 であればこの瀕死状態にする処理は行われません。そのため、最大 HP が 8 未満のモンスターと HP が 0 のモンスターは「コルナゴのつぼ」を装備していなければ「とらえる」ことができません。
上記の判定に成功していなければ、自分が「コルナゴのつぼ」を装備しているかどうかを確認し、装備していれば次の判定を行います。
以上の判定によって、とらえる判定に成功していなければ、「もっとよわらせるんだ!」を表示して「とらえる」の処理を終了します。
対象モンスターをとらえる処理は、「対象モンスターの番号」を自分の「とらえているモンスター」に書き込み、「とらえる」のコマンドを「はなつ」に変更します。そして、対象モンスターを戦闘不能にします。また、そのモンスターの「モンスターが逃走したフラグ」を立てます。
なお、「とらえる」は無条件ですべてのカウンターを受けません。
「カウンター」のアビリティを装備しているキャラクタが敵モンスターの「たたかう」「とくいわざ」による攻撃を受けた場合に、カウンターの判定を行います。ただし、「とくいわざ」の場合は、その攻撃が「攻撃力が 1.5 倍になる」「防御無視・回避無視」「スリップ」のいずれかの特性でなければカウンターの判定と処理を行いません。「武器攻撃 (ゆうばく)」ではカウンターの判定を行いません。「カウンター」の処理は、対象の HP が 0 もしくは戦闘不能・石化・ストップ・混乱・麻痺・睡眠・歌っている・無敵状態・隠れているのいずれかの状態であれば、処理を行いません [1]。GBA 版 FF5A では、バーサク状態の場合も処理を行いません。
カウンターの判定は 0〜99 の乱数を取得して、この乱数の値が 50 未満であれば、攻撃をしてきたキャラクタを対象に「たたかう」で反撃します。
「まほうバリア」のアビリティを装備しているキャラクタが敵モンスターの攻撃対象になり、そのキャラクタの HP が最大 HP の 1/16 の値以下であれば、「まほうバリア」が発動します。ただし、そのキャラクタがリフレク状態であれば処理を行いません。「まほうバリア」の処理は、対象の HP が 0 もしくは戦闘不能・石化・ストップ・混乱・麻痺・睡眠・歌っている・無敵状態・隠れているのいずれかの状態であれば、処理を行いません。SFC 版 FF5 および PS 版 FF5 では、「たたかう」「とくいわざ」以外の攻撃を受けた場合のみ、バーサクの状態の場合も処理を行いません。GBA 版 FF5A では、攻撃の種類にかかわらずバーサク状態の場合も処理を行いません。
なお、敵モンスターの「何もしない」という行動に対しても「まほうバリア」は発動します。この「何もしない」は、敵からランダムに 1 体の対象を選択して、何もおこらない攻撃を行うようになっているためです。(『魔法の数値系データ (ff5magparam.txt)』『魔法のフラグ系データ (ff5magflag.txt)』, 「さいせい (No.170)」参照)
「ワンダーワンド」を装備して「たたかう」「みねうち」「ねらう」で攻撃すると、「No.018(012): ケアル」から「No.053(035): アスピル」までの白魔法・黒魔法を順番に発動していくことができます。ただし、「No.019(013): ライブラ」は発動しません (「ケアル」が発動するときのみ、ワンダーワンドの使用回数が 2 回進みます)。「No.053(035): アスピル」の発動後は、次に発動する魔法が「No.018(012): ケアル」に戻ります。
「ワンダーワンド」を装備欄から使用すると、「リターン」が発動して戦闘をやり直すことができますが、このとき無敵状態のキャラクタを対象にしてはいけません。これについては「バグ: 「リターン」を無敵状態のキャラクタに使用する」をご覧ください。
以下は「まほうのランプ」を使用した場合に実行される魔法のリストです。「まほうのランプ」で召喚される召喚獣は、「しょうかん」や「よびだす」で指定される「No.083(053): オーディン」「No.084(054): バハムート」などの召喚獣の名前ではなく、直接、魔法の番号を指定しています (「チョコボ」のみ例外)。そのため、「オーディン: ざんてつけん・グングニルの判定」を行わずに「ざんてつけん」を実行することができます。
「まほうのランプ」を使用した回数 | 実行される魔法の番号 |
---|---|
0 | No.109(06D): メガフレア |
1 | No.108(06C): だいかいしょう |
2 | No.106(06A): ざんてつけん |
3 | No.105(069): サンダーストーム |
4 | No.104(068): ルビーのひかり |
5 | No.103(067): あくまのひとみ |
6 | No.102(066): アースウォール |
7 | No.101(065): だいちのいかり |
8 | No.100(064): じごくのかえん |
9 | No.099(063): さばきのいかずち |
10 | No.098(062): ダイアモンドダスト |
11 | No.097(061): まとわりつき |
12 | No.096(060): かぜのささやき |
13〜31 | No.072(047): チョコボ |
32 回以上 | No.115(073): エッグチョップ |
「チョコボ」を使用したとき、「チョコボキック」と「デブチョコボ」のどちらが発動するかは、0〜99 の乱数を取得して、この乱数の値が 8 未満であれば「デブチョコボ」が発動します。そうでなければ、「チョコボキック」が発動します。
「オーディン」を使用したとき、「ざんてつけん」と「グングニル」のどちらが発動するかは、以下の判定を行って決定します。処理の途中でどちらを発動するかが決定した時点で、それ以降の処理は行いません。
「ざんてつけん」の発動確率 = (使用者のレベル + 80) - 1 番目のモンスターのレベル
(下限: 1, 上限: 99) の式で求められます。上記の判定を行っても決定しなければ、「ざんてつけん」が発動します。
「しのせんこく」は対象を死の宣告の状態にします。「しのせんこく」はボス特性を持つキャラクタには効果はありません。なお、死の宣告の状態そのものには耐性はありません。
死の宣告の状態になると、「ATB タイマーの計算式」(もしくは以下の表をご覧ください) によって残り時間が決定され、死の宣告タイマーの発動までのフレーム数が 0 になったときに対象は戦闘不能になります。ただし、ゾンビ状態のキャラクタには効果はありません。
「しのせんこく」によって戦闘不能になった場合は、「モンスターを倒したフラグ」と「モンスターが逃走したフラグ」のどちらもセットされません。よって、「しのせんこく」で倒したモンスターからは経験値・ギル・アイテムを獲得しません。しかし、これらのフラグがリセットされるわけではありませんので、あからじめ普通に倒したモンスターを復活させてから「しのせんこく」で倒した場合は経験値などを獲得してしまいます。
対象の状態 | 発動までのフレーム数 | 表示されるカウント |
---|---|---|
ヘイスト | 225 | 15 |
スロウ | 900 | 60 |
通常 | 450 | 30 |
「とくいわざ」の攻撃による処理は以下のようになります。
以上の命中判定に失敗していなければ、対象にダメージを与える処理を行います。
[...]
ダメージを処理したら、次に「とくいわざ」による状態変化の処理を行います。ただし、この処理を行う前に、「ゴーレム」の効果が残っているかどうかを確認して、もし残っていれば状態変化の処理を行いません。味方キャラクタではなく敵モンスターを攻撃する場合は「ゴーレム」の判定を行いません。「とくいわざ」による状態変化の処理は以下のとおりです。
「グランドクロス」は 0〜17 の乱数を取得して、この乱数の数値によって、以下の状態異常もしくは特殊な効果を与えます。ただし、対象が戦闘不能・石化・ゾンビのいずれかの状態なら、乱数の取得も含めすべての処理を行いません。
「ストーカーしょり」はサンドウォームとの戦闘かどうかによって、別々の処理を行います。
通常戦闘での「ストーカーしょり」の処理は以下のとおりです。
サンドウォームとの戦闘における「ストーカーしょり」の処理は以下のとおりです。
$7E384F,X = { 7: #%01110000, 8: #%10101000, 9: #%11000100 }
「ビブロスしょり」は、「ビブロスしょり」を実行したモンスターを消去して、モンスターパーティに設定された次の番号のモンスターを出現させます。消去するモンスターの倒したフラグをセットし、出現するモンスターの倒したフラグをクリアします。ただし、次の番号のモンスターが設定されていなければ処理を行いません。
マギサとの戦闘の前に、レナが毒状態になります。
サンドウォームとの戦闘では、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 番目のキャラクタの「うた」を解除してしまうバグです。
これは SFC 版 FF5 にのみ存在します。
「かくれる」「あらわれる」「とらえる」「はなつ」を 4 番目のアビリティから使用すると異常動作を起こします。これは「かくれる」のコマンドを「あらわれる」に変更する処理 (「とらえる」なども同様) でのジャンプ命令のアドレスが間違っているために、4 番目のコマンドを変更したあとに領域外のメモリを指してしまうことで起こります。
「あらわれる」を使用すると、そのキャラクタの「かくれる」を選択したあとに行われる対象選択の動作が変更されます。通常、「かくれる」は対象を選択せずに自動的に実行されますが、「あらわれる」の使用後は、このコマンドは自分自身を選択してからしか実行できなくなります。
これは SFC 版 FF5 にのみ存在します。
「かくれる」や「ジャンプ」ですべての味方キャラクタがいない場合に「こうかがなかった」が表示されると、その後の魔法攻撃がすべて無効になります。この現象は、攻撃対象として、全体攻撃 (味方がカーソルで対象を選択する場合は、ふたり以上のキャラクタ)、出現していないキャラクタ、戦闘不能・石化・離脱もしくは隠れている・ジャンプしているキャラクタのいずれかが選択されるまで続きます。
これは SFC 版 FF5 および PS 版 FF5 に存在します。
まず、アイテム変化バグを発生させるには以下の条件をすべて満たす必要があります。(以下、執筆中につきやや不正確です)
以上の条件を満たしたら、次にアイテム変化バグが発生するキャラクタが判定されます。対象になるキャラクタはクイックを使ったキャラクタから、4 番目のキャラクタまでです。ただし、クイックを使ったキャラクタを先頭のキャラクタとして扱います。同様に、次のキャラクタを 2 番目, さらに次を 3番目, ... とします。対象キャラクタが以下の条件を満たすとき、そのキャラクタの左手の盾のアイテム番号を 1 減算します。
ところで、なぜアイテム変化が成功するためには、スリップダメージを受ける周期である必要があるのでしょうか。実は、アイテム変化バグとは「スリップダメージによって HP を 1 減算する」処理が「アイテム番号を 1 減算する」処理に変わってしまうことで発生します。したがって、アイテム変化バグはスリップダメージを受ける周期ではない場合は成功しません。スリップダメージを受ける周期は 4 フレームに 1 回ですから、アイテム変化バグが成功する確率は 1/4 となります。
これは SFC 版 FF5 にのみ存在します。
「ちょうごう」のメニューを実行したあとに「れんぞくま」を使用すると、「れんぞくま」の 1 回目に選択した対象が、2 回目に選択した対象に変更されてしまいます。このバグは「ちょうごう」のメニューを実行したあと、「アイテム」「のむ」「なげる」のメニューを実行することで回避できます。
これは SFC 版 FF5 にのみ存在します。
エンディングの戦闘シーンで、薬士のキャラクタがいるとゲームがハングアップします。このバグの原因となっているプログラムコードの意図はよくわからないのですが、おそらく「(必要のない) 余計なプログラムをいれてしまった」という単純なミスである可能性が高そうです。
「ちからのくすり」を飲むと、実際には「右手の攻撃力」「左手の攻撃力」がそれぞれ 20 ずつ上昇します。この「右手/左手の攻撃力」の値は「ゴブリンパンチのパラメータ」には影響するものの、通常の武器による攻撃にはまったく影響しません。
戦闘中に装備欄もしくはアイテム欄の位置を変更すると、アイテムの効果による状態異常が再適用されます。これを使えば「ミラージュベスト」の「ぶんしん」を何度でも復活させることなどができます。
「まほうバリア」は対象がリフレクの状態になっていると発動しません。また、既にシェルの状態になっていれば「まほうバリア」は必要ないのですが、そんなことはお構いなしに、何度でも発動してしまいます。プログラムを見た限りでは、開発段階では「まほうバリア」は「リフレク」の効果だったが、あとになって「シェル」の効果に変更されたのではないかと考えられます。
敵の 1 回目の攻撃で、味方キャラクタ全員が攻撃を受けても、最初のキャラクタ以外は「まほうバリア」を使用できません。ただし、敵の攻撃が 2 回目以降なら、「まほうバリア」は正しく発動します。
状態異常への耐性を持つ防具を装備して戦闘を行うと、その戦闘終了時に、その防具のデータが「キャラクタ自身の状態異常への耐性」に書き込まれます。この「キャラクタ自身の状態異常の耐性」は装備していた防具を変更しても変わらないので、次の戦闘でもう一度おなじ防具の耐性を身につけることができます。
なお、「キャラクタ自身の状態異常の耐性」への書き込みは、戦闘終了時に毎回発生するため、装備していた防具の耐性を持ち越せるのは次の戦闘の 1 回限りとなります。
通常、敵モンスターの最大 MP は 9999 に設定されています。これを利用して、「エーテル」や「エリクサー」で敵モンスターの MP を回復させると、最大値である 9999 まで減らすことができます。おそらく、初期状態では「MP が足りない」魔法を持っている敵モンスターのためにこのような設定になっているのでしょう。
逃げられないモンスターパーティとの戦闘で LR を入力すると、「逃げられない!」のメッセージが表示されます。これを入力し続けることで、戦闘プログラムを 1 フレームずつ進めることができます。ただし、ATB 処理の「行動決定」と「行動実行」の直前では、通常の戦闘処理とは別に逃走判定が行われます。このとき、「逃げられない!」のメッセージが通常よりも 1 回多く表示されることに注意してください。
戦闘中に「ポーズ」を連打すると、その間は戦闘中の時間の流れが遅くなります。とくに、残り時間を示すカウントはこの影響を大きく受けます。残り時間を示すカウントは、ポーズを解除した直後は進まないためです。したがって、連打するほど残り時間を稼ぐことができます。
「しらべる」はゲーム中の説明では敵の弱点を表示するとありますが、実際にはそうはなっていません。
「リターン」を無敵状態のキャラクタに対して使用するっと、画面が暗転したままになってしまうバグがあります。「リターン」の処理は次のようになっているのですが、
このとき無敵状態のキャラクタを対象にした場合には、「戦闘プログラムがリセットされるように設定」する処理が行えないためにこの問題が起こります。
「弱点カテゴリ」に設定されている攻撃を行うと、その攻撃の「倍率」が 2 倍になりますが、プログラムが間違っているために与えるダメージには影響しません。
「さばきのつえ」「ひかりのつえ」による攻撃は、「たたかう」「みだれうち」「みねうち」「ねらう」「ツインランサー」 [ATTACK] で攻撃するとダメージの倍率が半減します。一方、「ためる」「ぶんどる」「ジャンプ」「つるぎのまい」で攻撃した場合はダメージの倍率は半減しません。これは、[ATTACK] で攻撃した場合に、単体攻撃を全体化したと見なされるためです。
これは SFC 版 FF5 および PS 版 FF5 の仕様です。
戦闘中にカーソルの位置を動かしてから「リターン」を使用すると、以前に記憶したカーソルの位置が失われます。GBA 版 FF5A では「リターン」した直後は戦闘開始時のカーソル位置に戻るようになりました。
味方のカウンター行動が決定された直後に、そのキャラクタがスリップダメージで戦闘不能になると ATB のタイマーが進まなくなります。キャラクタのカウンター行の処理動は次のようになっているのですが、
スリップダメージによってその味方が戦闘不能になってしまうと、「自分がカウンター行動」以降の処理ができなくなってしまうことが原因ではないかと推測しています。なお、敵の場合は、カウンター行動時にはスリップダメージが発生しないため、この問題は起こりません。
二刀流にして、左手に「だいちのハンマー」「だいちのベル」「かぜきりのやいば」を装備して攻撃すると、左手の武器の特殊効果が発動したときに攻撃が失敗します。
アトモスとの戦闘において、混乱したまま戦闘不能になったキャラクタが「ワームホール」で吸い込まれると、アトモスは以後「ワームホール」以外の行動を行わなくなります。
バーサク状態や「みだれうち」「はなつ (単体攻撃)」などの「自動的に対象を選択する」攻撃は、サンドウォームにはほとんど命中しません。
通常、攻撃対象を選択したあとにその攻撃対象がいなくなってしまった場合は、その対象を自動的に選択しなおします。しかしながら、サンドウォーム戦では、このような場合は攻撃対象を「あな」に命中するように変更します。これは「サンドウォームへの攻撃を選んだあとに『あな』に潜られた場合は、攻撃は命中しない」という演出のためではないかと考えられます。
ところが、「自動的に対象を選択する」攻撃は、1〜8 番目のモンスターからランダムに選択した敵モンスターを対象とするだけなので、その攻撃対象がいない場合には「あな」に命中することになります。
サンドウォームが選ばれる確率は 1/8、「あな」が選ばれる確率は 2/8、そしてそれ以外の敵モンスターが選ばれる確率は 5/8 なのですが、それ以外の敵モンスターを攻撃した場合は「あな」に命中するわけですから、実際に「自動的に対象を選択する」攻撃がサンドウォームに命中する確率は 1/8 となります。
どくろイーターや32ページなどを「しのせんこく」で倒すと、出現していないモンスターの分の経験値を獲得するようです。これは敵モンスターの種類に関係なくそうなるようにプログラムされています。
戦闘開始時に出現していない敵モンスターには「モンスターを倒したフラグ」と「モンスターが逃走したフラグ」が同時に立っています。普通に敵モンスターを倒すと「モンスターが逃走したフラグ」が適用され、出現していないモンスターは「逃走した」扱いになりますので、倒したことにはなりません。
ところが、「しのせんこく」および「サークル」だけですべての敵モンスターを倒した場合は「モンスターが逃走したフラグ」は適用されません。この場合は出現していないモンスターは「倒した」という扱いになりますので、それらのモンスターの経験値を獲得します。
老化の状態異常と同時に、沈黙・麻痺の状態異常が発生すると、沈黙・麻痺の状態は自動的には回復しません。実際にこの状態異常が同時に発生する攻撃はほとんどないのですが、例えばギルガメの「かめのこうら」やハーデスの「かま」を受けるとこのバグが発生します。
敵が魔法攻撃と物理攻撃を連続して行うと、盾やゴーレムなどで回避する演出効果が正しく行われません。
敵が 3 回以上の行動を連続して行うと、ゴーレムが物理攻撃を正しく防がないことがあります。これは、敵の 2 回目の攻撃が物理攻撃だと、それ以降の攻撃をすべて物理攻撃と見なし、攻撃が魔法攻撃であれば、それ以降の攻撃をすべて魔法攻撃と見なすためです。
「うた」を歌っているキャラクタを、沈黙、ミュートによって、歌っている状態が解除されると、タイミングによってはそのキャラクタが行動できなくなります。このタイミングは、そのキャラクタが次に行動できるようになるまでの時間と同じです。「うた」を歌っていても、内部的には ATB ゲージは進んでいます。この ATB ゲージが進んで行動できるようになると、キャラクタの ATB ゲージは一時的に--別の行動をするまで--停止します。ところが、「うた」を沈黙、ミュートによって解除すると、ATB ゲージが止まったままの状態になってしまいます。
これは GBA 版 FF5A にのみ存在します。未確認なのですが、欧州版の FF5A では修正されているようです。
FF5A (日本語版および USA 版) では、「リターン」を使用しても、残りの制限時間がもとに戻りません。
これは 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 では、パンテーラのモンスターパーティの設定が異なります。この違いを以下の表に示します。
No. | モンスターの名前 | モンスターの状態 | SFC 版での HP | GBA 版での HP |
---|---|---|---|---|
1 | パンテーラ | 最初から出現 | 18000 | 18000 |
2 | パンテーラ | 分身後に出現 | 18000 | 18000 |
3 | パンテーラ | 分身後に出現 | 18000 | 18000 |
4 | 空欄 | 出現しない | 65535 | 0 |
FF5 と FF5A では、4 番目のモンスター (「空欄」) の HP が異なっています。
次に、パンテーラは「ぶんしん!!」のメッセージを表示したあとに、「ストーカーしょりの処理: 通常戦闘の場合」の処理を行うのですが、これには次の処理が含まれています。
FF5A では、4 番目のモンスター (「空欄」) の HP が 0 になっているので、「1〜4 番目のモンスターのうちもっとも少ない HP を読み込む」の結果はかならず 0 になります。そして、敵モンスターの HP をこの読み込んだ数値 (= 0) に設定しなおすので、結果として敵モンスターが全滅してしまいます。
ff_analyzer および各種プログラムの解析資料を公開されている遠藤慎悟氏 (Index of /~s-endo/) にお礼申し上げます。ff_analyzer はとても参考になりました。各種プログラムの解析資料は、筆者がファイナルファンタジー V のプログラムを理解するための大きな手助けをしてくれました。