この節では戦闘モードに移行する際における敵方の編成を決定する情報および処理について述べる。 移動モードから戦闘モードに突入する状況は大きく分けると、次の三つがある:
仲間パーティーが移動しているとランダムに発生するもの
敵キャラクターに話しかけたり、怪しい物を調べたりすると発生するもの
カジノの格闘場で試合を観戦することで発生するもの
本節ではこのうちの最初の二項目について記す。 最後の格闘場における試合については 3.10.1.17 格闘場で述べる。
まずは、プログラムが敵方編成を決定するのに必要なデータ型について解説する。 これらのデータ型では登場する可能性のあるモンスターや頭数等の情報が含まれる。 そして、ランダム発生戦闘における敵方編成の仕組みについて、プログラムされた処理を構成するコードを検討していく。 最後に、本節で採り上げたデータ型オブジェクトを全て抽出した CSV ファイルを提供する。
プログラムが敵方編成を決定するのに利用するデータについて解説する。
本節の冒頭で示した分類でいうところのランダム戦闘では構造体 $2396F3
と構造体 $23B04B
とが対応し、
イベント戦闘には構造体 $23D757
がそれぞれ議論の対象となる型だ。
以下、それぞれのデータ型の構成について記す。
アドレス $2396F3
にはバイトサイズ #$16
のオブジェクトが
#$55
個配列されている。それらのオブジェクトの構造を次に示す:
表 3.52 構造体 $2396F3: 通常の戦闘用編成
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$FF
|
レベル |
#$01
|
#$07
|
頻度 #$00 |
#$01
|
#$38
|
グループ複数時頭数 0 |
#$01
|
#$C0
|
追加グループ数頻度 0 |
#$02
|
#$07
|
頻度 #$01 |
#$02
|
#$38
|
グループ複数時頭数 1 |
#$02
|
#$C0
|
追加グループ数頻度 1 |
#$03
|
#$07
|
頻度 #$02 |
#$03
|
#$38
|
グループ複数時頭数 2 |
#$03
|
#$C0
|
追加グループ数頻度 2 |
#$04
|
#$07
|
頻度 #$03 |
#$04
|
#$38
|
グループ複数時頭数 3 |
#$04
|
#$C0
|
先制攻撃抽選 |
#$05
|
#$07
|
頻度 #$04 |
#$05
|
#$38
|
グループ複数時頭数 4 |
#$05
|
#$40
|
(未使用) |
#$05
|
#$80
|
戦闘発生率調整 A |
#$06
|
#$07
|
頻度 #$05 |
#$06
|
#$38
|
グループ単数時頭数 0 |
#$06
|
#$40
|
(未使用) |
#$06
|
#$80
|
戦闘発生率調整 B |
#$07
|
#$07
|
頻度 #$06 |
#$07
|
#$38
|
グループ単数時頭数 1 |
#$07
|
#$40
|
(未使用) |
#$07
|
#$80
|
戦闘発生率調整 C |
#$08
|
#$07
|
頻度 #$07 |
#$08
|
#$38
|
グループ単数時頭数 2 |
#$08
|
#$40
|
(未使用) |
#$08
|
#$80
|
仲間可能性 |
#$09
|
#$07
|
頻度 #$08 |
#$09
|
#$38
|
グループ単数時頭数 3 |
#$09
|
#$40
|
(未使用) |
#$09
|
#$80
|
昼夜判定 |
#$0A
|
#$07
|
頻度 #$09 |
#$0A
|
#$38
|
グループ単数時頭数 4 |
#$0A
|
#$C0
|
(未使用) |
#$0B
|
#$07
|
頻度 #$0A |
#$0B
|
#$F8
|
敵陣グループ固定戦 ID |
#$0C
|
#$FF
|
グループ複数時モンスター 0 |
#$0D
|
#$FF
|
グループ複数時モンスター 1 |
#$0E
|
#$FF
|
グループ複数時モンスター 2 |
#$0F
|
#$FF
|
グループ複数時モンスター 3 |
#$10
|
#$FF
|
グループ複数時モンスター 4 |
#$11
|
#$FF
|
グループ単数時モンスター 0 |
#$12
|
#$FF
|
グループ単数時モンスター 1 |
#$13
|
#$FF
|
グループ単数時モンスター 2 |
#$14
|
#$FF
|
グループ単数時モンスター 3 |
#$15
|
#$FF
|
グループ単数時モンスター 4 |
各属性の意味は次のようなものとなる(処理コードが戦闘を発生させる処理で参照する順序でなるべく列挙する):
戦闘発生率調整とは、プレイヤーキャラクターが移動中にこのオブジェクトの定義するモンスターの群と遭遇する確率を調整する数値型属性だ。
物理的には三つのメンバーに分割されているが、論理的にはこれらの和が一つの ID 型属性であり、
乱数範囲を定義する配列 $23EA44
の添字を与えるものだ。
プレイヤーキャラクターが戦闘地域を移動しているとする。戦闘発生テストは一歩進むたびに行われると考える。 前回戦闘時から S 歩動いたとすると、まず次の係数表から対応する戦闘発生率調整値 M を取る:
表 3.53 配列 $23EA44: 戦闘発生係数
オフセット | 値 |
---|---|
#$00
|
#$10
|
#$01
|
#$16
|
#$02
|
#$2B
|
#$03
|
#$40
|
#$04
|
#$50
|
#$05
|
#$60
|
#$06
|
#$70
|
#$07
|
#$80
|
次に調整値 M と歩数 S を乗じて積を得る。さらにそれを 6 ビット右シフトする。 このシフト後の 2 バイト値 P の上位バイト Pu が非ゼロならば、戦闘の敵陣抽選へと進む。 そうではなく Pu がゼロならば、次は P の下位バイト Pl と乱数とを比較する。 乱数が Pl の下位バイトを超えれば戦闘の敵陣抽選へと進む。 超えなければ、戦闘は発生しないものとする。
先制攻撃抽選とは、最初のターンで自陣か敵陣のどちらか一方しかコマンド実行をしないような状況を決定するために用いる数値型属性だ。 この属性値を基にした乱数処理により、先制攻撃権の発生を決める。
レベルとは、このオブジェクトが定義する戦闘において、必要なときに主人公のレベルとの比較対象となる数値型属性だ。 レベルそのものを表すわけではないので、0 も有効な値だ。
例えばプレイヤー側の「にげる」コマンドの成功条件、ダメージ計算時に参照する耐性テーブルの決定、 敵キャラクターの戦闘コマンド決定ルーチン、 あるいは戦闘終了後において、倒した仲間候補モンスターが起き上がる条件等に影響する。
仲間可能性とは、戦闘終了後に倒したモンスターが起き上がる可能性があることを示すブーリアン型属性だ。 この値が 1 であるときに限り、倒したモンスターが起き上がって、仲間になりたそうにこちらを見る可能性がある。
幼少期、光の教団本部内、およびエビルマウンテンでの遭遇パターンでは 0 が割り当てられている。
#$00
..#$0A
)
頻度とは、敵陣のグループ数や構成モンスターを大まかに決定するのに用いられる数値型配列属性だ。
まずこの配列の総和を求め、それからその値を上限とする乱数を生成する。
次に配列の初項からの部分和が初めて総和以上となる添字を求める。
要するに、この配列は #$00
から #$0A
までの値を確率変数とする離散確率分布を表現している。
この添字が配列の前半か後半のどちらに属するかで、まずは敵陣のグループが単独なのか複数なのかを決める。 グループが単数のときのモンスター ID と、複数のときの先頭グループのモンスター ID は、 それぞれそのまま後述するグループ単数時モンスター配列およびグループ複数時モンスター配列の添字とする。
昼夜判定とは、この遭遇パターンが夜しか現れないことを示すブーリアン型属性だ。 この値が 1 だと、昼で遭遇したとしても戦闘発生をキャンセルするらしい。
実際のゲームデータでは、どのオブジェクトもこの属性値が 0 になっている。 事実上、夜専用の遭遇パターンというのは存在しない。
先述した敵陣の陣容を決定するモンスター抽選処理中に、
部分和のための添字が配列末尾まで行くと、特殊な通常戦闘用編成を発動するしたい。
それには 3.14.1.2 構造体 $23B04B
: 特殊な通常戦闘用編成 で定義されている遭遇オブジェクトをこのオブジェクトの代用とするのだが、
この属性はそのオブジェクトの ID を表すものだ。
グループ単数時頭数とは、敵陣が単独グループで構成することを決定した後に
そのグループにおける構成員の頭数を抽選するために参照される ID 型配列の属性だ。
言い換えると、頭数範囲を表現する定数テーブル $23EA63
および $23EA73
の添字の配列だ。
下に示す表のように暫定的にグループを構成するモンスターの頭数が決まるが、
グラフィック上の都合なのか、後ほど頭数が間引かれることがある。
表 3.54 配列 $23EA63 および $23EA73: 頭数範囲指定
オフセット |
$EA63
|
$EA73
|
暫定頭数 |
---|---|---|---|
#$00
|
1 | 1 | 1 |
#$01
|
2 | 1 | 2 |
#$02
|
3 | 1 | 3 |
#$03
|
1 | 2 | 1..2 |
#$04
|
2 | 2 | 2..3 |
#$05
|
3 | 2 | 3..5 |
#$06
|
4 | 4 | 4..7 |
#$07
|
8 | 1 | 8 |
#$08
|
1 | 1 | 1 |
#$09
|
1 | 2 | 1..2 |
#$0A
|
1 | 3 | 1..3 |
#$0B
|
1 | 4 | 1..4 |
#$0C
|
1 | 5 | 1..5 |
#$0D
|
1 | 6 | 1..6 |
#$0E
|
1 | 7 | 1..7 |
#$0F
|
1 | 8 | 1..8 |
グループ単数時モンスターとは、敵陣が単独グループで構成することを決定した後に そのグループを構成するモンスターの ID からなる配列の属性だ。
追加グループ数頻度とは、敵陣が複数グループで構成することを決定した後に、 最初のグループに加えて、あといくつグループを追加するのかを抽選するために用いる数値型配列属性だ。 抽選方式は、先に述べた頻度属性値における方式と同様だ。
グループ複数時頭数とは、先述のグループ単数時頭数と同じく、 敵陣が複数グループで構成することを決定した後に、 グループそれぞれに何頭のモンスターを割り当てるのかを抽選するために用いる ID 型配列属性だ。
先述のグループ単数時モンスター抽選と同じく、 グループ複数時モンスターとは、敵陣が複数グループで構成することを決定した後に、 グループそれぞれを構成するモンスターの ID からなる配列の属性だ。
アドレス $23B04B
にはバイトサイズ #$06
のオブジェクトが
9 個配列されている。それらのオブジェクトの構造を次に示す:
表 3.55 構造体 $23B04B: 特殊な通常戦闘用編成
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$FF
|
モンスター 0 |
#$01
|
#$FF
|
モンスター 1 |
#$02
|
#$FF
|
モンスター 2 |
#$03
|
#$0F
|
表示位置調整 0 |
#$03
|
#$F0
|
頭数指定 0 |
#$04
|
#$0F
|
表示位置調整 1 |
#$04
|
#$F0
|
頭数指定 1 |
#$05
|
#$0F
|
表示位置調整 2 |
#$05
|
#$F0
|
頭数指定 2 |
各属性の意味は次のようなものとなる:
モンスター k とは、敵陣グループ k を構成するモンスターの ID を値とする属性だ。
ただし、値が #$FF
であれば、グループ k にモンスターを割り当てないことを意味する。
表示位置調整 k とは、敵陣グループ k にいるモンスターの描画位置を画面垂直方向に調整するための値を取る属性だと思われる。 どのオブジェクトも属性値が 0 につき、詳細不明。
頭数指定 k とは、グループ k に何頭のモンスターを割り当てるのかを抽選するために用いる ID 型配列属性だ。 ID とは、前述の定数テーブルの行番号だ。
我々の印象に妙に残る「ブルーイーター数匹・エビルマスター・レッドイーター数匹」だとか 「はぐれメタル・メタルスライム数匹」だとかの遭遇パターンは、このオブジェクト配列によるものだ。
アドレス $23D757
にはバイトサイズ #$0D
のオブジェクトが
おそらく #$40
個配列されている。それらのオブジェクトの構造を次に示す:
表 3.56 構造体 $23D757: イベント戦専用編成
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$03
|
先制攻撃 |
#$00
|
#$04
|
(未使用) |
#$00
|
#$08
|
格闘場 |
#$00
|
#$10
|
乱入 |
#$00
|
#$20
|
パパス単独 |
#$00
|
#$40
|
逃走禁止 |
#$00
|
#$80
|
制限モード |
#$01
|
#$FF
|
モンスター 0 |
#$02
|
#$FF
|
モンスター 1 |
#$03
|
#$FF
|
モンスター 2 |
#$04
|
#$FF
|
モンスター 3 |
#$05
|
#$FF
|
頭数 0 |
#$06
|
#$FF
|
頭数 1 |
#$07
|
#$FF
|
頭数 2 |
#$08
|
#$FF
|
頭数 3 |
#$09
|
#$FF
|
表示位置調整 0 |
#$0A
|
#$FF
|
表示位置調整 1 |
#$0B
|
#$FF
|
表示位置調整 2 |
#$0C
|
#$FF
|
表示位置調整 3 |
各属性の意味は次のようなものとなる(未説明のもののみとする):
格闘場モードとは、ウィンドウ表示およびテキスト描画の処理が格闘場でのそれになることを示すフラグ型の属性だ。 ただし、実際のデータではすべてのオブジェクトでこの値は 0 となっている。
乱入とは、戦闘中にパパスや妻が割り込んでくるイベントを含むことを示すフラグ型の属性だ。
パパス単独とは、これが自陣側がパパス一人による自動戦闘であることを示すフラグ型の属性だ。 この属性のある戦闘には、メインのコマンド入力ウィンドウが一切表示されない、 その終了後に仲間キャラクターが経験値を獲得しない、 ゴールドが入らない、モンスターが宝箱を落とさない、仲間にならない等の性質がある。
逃走禁止とは、この戦闘を「にげる」コマンドで終了することが失敗することを示すフラグ型の属性だ。
制限モードとは、ある一定の戦闘コマンドの振る舞いが制限されることを示すフラグ型の属性だ。 例えばビアンカのリボンやキメラのつばさの「つかう」時の挙動、 パルプンテの選択肢およびその挙動、 どくばり、キラーピアス、どくがのナイフ、ゆうわくのけん、まどろみのけん、あくまのツメ装備時の直接攻撃による付加効果、 敵側仲間呼びの結果、混乱時の挙動、 死亡時のメガンテのうでわの反応有無、 あるいは敵キャラクターの初期化に影響する。
敵陣決定手順を説明する。
戦闘地域を移動していると、一歩歩くたびにサブルーチン $23E7C2
が呼び出される。
このサブルーチンの冒頭で通常の戦闘用編成 ID を決定し、それから戦闘発生をするかどうかを決定し、
あとは敵陣を構成をしつつ、無理があれば中止するというのが大まかな処理手順だ。
以下、ID 決定直後から呼び出し元に戻るまでの制御を見ていこう。
TBW
本節で説明したデータ構造それぞれのオブジェクト配列を単独の CSV ファイルに統合して 付録 B データ に収録する。 特に、論理的なまとまりを優先して CSV を作ったので、データフィールドの順序はメモリーレイアウトを反映していないし、 一部のフィールド群については、それらが論理的に一体のものであるならば、一つの値にまとめた。