この節では戦闘モードにおける戦闘員および、移動モードにおける仲間キャラクターの何らかの実行単位を表現する概念、すなわちコマンドについて述べる。 本章では、コマンドとは、仲間キャラクターに対しては、戦闘モードならば「こうげき」「じゅもん」「ぼうぎょ」「どうぐ/つかう」を、 移動モードならば「じゅもん」「どうぐ/つかう」に共通する概念をカプセル化したオブジェクト型であると定義している。
冒頭で述べたコマンドをカプセル化したオブジェクト型とは、次の表が示すようなものだ。
この型のオブジェクトがアドレス $C21860
で配列をなしていて、
プログラムのコマンドを必要とする処理は、この中から必要に応じて対応オブジェクトの所望の属性を参照するという設計になっている。
表 5.16 構造体 $C21860
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$FFFF
|
名前 |
#$02
|
#$00FF
|
対象決定判断 0 |
#$03
|
#$00FF
|
対象決定判断 1 |
#$04
|
#$00FF
|
対象決定判断 2 |
#$05
|
#$00FF
|
効果音 |
#$06
|
#$FFFF
|
処理アドレス(戦闘) |
#$08
|
#$00FF
|
|
#$09
|
#$FFFF
|
メッセージ |
#$0B
|
#$00FF
|
記述 |
#$0C
|
#$FFFF
|
演出処理アドレス 0 |
#$0E
|
#$FFFF
|
演出処理アドレス 1 |
#$10
|
#$FFFF
|
演出処理アドレス 2 |
#$12
|
#$00FF
|
ダメージ |
#$13
|
#$00FF
|
打撃ダメージ算出 |
#$14
|
#$00FF
|
処理アドレス(移動) |
#$15
|
#$0003
|
対象範囲 |
#$15
|
#$00FC
|
MP |
#$16
|
#$0007
|
対象陣営 |
#$16
|
#$00F8
|
系統分類 |
#$17
|
#$000F
|
(調査中) |
#$17
|
#$00F0
|
成功率係数 0 |
#$18
|
#$000F
|
成功率係数 1 |
#$18
|
#$0030
|
戦闘終了時述語 |
#$18
|
#$0040
|
マホトーン状態を考慮 |
#$18
|
#$0080
|
マホカンタ状態を考慮 |
#$19
|
#$0001
|
フバーハ状態を考慮 |
#$19
|
#$0002
|
マヌーサ状態を考慮 |
#$19
|
#$0004
|
覚醒考慮 |
#$19
|
#$0008
|
ダメージ転嫁装備考慮 |
#$19
|
#$0010
|
みかわし考慮 |
#$19
|
#$0020
|
バイキルト考慮 |
#$19
|
#$0040
|
会心の一撃考慮 |
#$19
|
#$0080
|
集中攻撃考慮 |
#$1A
|
#$0001
|
空振り時対象再抽選考慮 |
#$1A
|
#$0002
|
コマンド選択判断考慮 |
#$1A
|
#$0004
|
アストロン考慮 |
#$1A
|
#$0008
|
攻撃ミス装備考慮 |
#$1A
|
#$0010
|
キラー装備考慮 |
#$1A
|
#$0020
|
どくばりダメージ固定化 |
#$1A
|
#$0040
|
即死装備考慮 |
#$1A
|
#$0080
|
はやぶさのけん考慮 |
#$1B
|
#$0001
|
経験値取得 |
#$1B
|
#$0002
|
メッセージ抑制 |
#$1B
|
#$0004
|
演出タイミング |
#$1B
|
#$0008
|
演出を敵陣全体に作用させる |
#$1B
|
#$0010
|
うんのよさ考慮 |
#$1B
|
#$0020
|
コマンド対象確定考慮(自陣側) |
#$1B
|
#$00C0
|
対象生存条件 |
#$1C
|
#$0001
|
コマンド対象確定考慮(敵陣側) |
#$1C
|
#$0002
|
格闘場使用許可 |
#$1C
|
#$0004
|
ゴールド取得 |
#$1C
|
#$0008
|
倒した標的を記憶する |
#$1C
|
#$0010
|
混乱時通常攻撃化 |
#$1C
|
#$00E0
|
(未使用) |
各属性の意味を以下に記す:
このコマンドの名前を意味する文字列(5.2 文字列)の ID を値とする属性だ。 名前はコマンド入力ウィンドウやメッセージ出力ウィンドウ上のテキスト内に表示される。
対象決定判断とは、戦闘員がこのコマンドを自分のレパートリーの中から選択するかどうかを決定するサブルーチンを要素とするジャンプテーブルの行番号を値とする属性だ。 ここで k の値は戦闘員のコマンド選択判断属性から決まるものなのだが、 単純化して説明すると k の値が高いほど選択判断の質が高くなる。 詳しくは 5.5 モンスター で述べる。
例えばラリホーのコマンドは決定判断ロジックは 3 通りある。 最も愚直なものは、相手陣の生存キャラクターの有無しか確認しない。 中間のものは、それに加えてラリホー状態の者の有無を考慮に入れる。 最も高級な判断は、さらに自身のマホトーン状態まで考慮に入れて、実行可否を決定する。
コマンド実行時に再生する効果音の ID を値を取る属性だ。
配列 $C23CA2
の添字になる。
データを見ればわかるように、属性値として取りうる値は 0..3 しかない。 無効値、攻撃時の効果音、呪文効果音、逃走時の効果音をそれぞれ意味する。 なお、配列要素は自陣側と敵陣側とで値が異なる。
戦闘モードにおけるこのコマンドの挙動を表現するコードの完全アドレスを意味する属性だ。 ただし、各コマンド処理に共通する部分は戦闘処理パイプラインの一部で実現されているので、 単純な呪文コマンドなどについてはこのアドレスを見るだけでは詳細はわからないことが普通だ。
このコマンドが戦闘モードで実行されるとメッセージ出力ウィンドウに最初に表示されるメッセージ(5.1.1 戦闘モード)の ID を表す属性だ。
例えば呪文コマンド全般は「[BC][B7]は [B2]を となえた![B1]」を指定する #$0051
を属性値とする。
このコマンドが呪文コマンドであるとき、選択ウィンドウに隣接するミニウィンドウに表示される記述データの ID を値とする属性だ。
アドレス $C2398E
にメッセージ ID 三つの組からなる配列があり、この属性値とはその配列添字だ。
記述オブジェクトについては 5.7 コマンドに関する記述 で述べる。
バンクが $C4 のアドレス型属性で、コマンド実行時の視聴覚的演出処理コードを表す。
添字 k = 0 のものは、実行時直後の効果を表す。 |
添字 k = 1 のものは、理由は不明だが値 #$8D71 でなければならない。 |
添字 k = 2 のものは、このコマンドで敵陣戦闘員が無力化されたときの効果を表す。 |
このコマンドに関連するダメージオブジェクト(5.8 ダメージ)を特定する値を取る属性だ。 ダメージオブジェクトとは、このコマンド実行によるダメージ量(または回復量)の計算の基本情報と考えてよい。
このコマンドによって相手にダメージを与えようとしたが、実行直前に対象戦闘員が既に無力化してしまったとする。
そのとき、自動的に別の生きている戦闘員に攻撃を振り返る処理が実施されると仮定する。
この属性は、このときの新しい打撃ダメージを計算する手法を指示する値を表す。
コードの観点からは、ジャンプテーブル $C2BE5E
の行番号だ。
移動モードにおけるこのコマンドの挙動を表現するコードのアドレスを意味する属性だ。
値は配列 $C30B31
の添字を意味する。
このコマンドの標的が次のいずれに分類されるのかを意味する値を取る属性だ。
このコマンドを実行するキャラクターが必要とする MP の量を意味する数値型の属性だ。 実行する際にこの数だけの MP がなければならないし、実行するとこの数だけ戦闘員の MP が減少する。
このコマンドの対象をどの陣営から選択され得るかを示す数を値として取る属性だ。 厳密に言えば、対象者ウィンドウの(最初の)表示を決めるのに用いる値だ。
この値と対象範囲属性を組み合わせることで、コマンドの用途が大づかみでわかる。
系統分類とは、このコマンドの系統的性質を表現する数を値に取る属性だ。 モンスター(5.5 モンスター)の耐性属性や装備品の規定する耐性と関係がある。 値と系統には次のような対応関係があるようだ。
表 5.20 系統分類
値 | 系統 |
---|---|
#$00
|
それ以外 |
#$01
|
メラ・ギラ・イオ |
#$02
|
ヒャド |
#$03
|
バギ |
#$04
|
デイン |
#$05
|
ザキ |
#$06
|
メガンテ |
#$07
|
ニフラム |
#$08
|
マホトラ |
#$09
|
ボミオス・バシルーラ |
#$0A
|
ラリホー |
#$0B
|
マホトーン |
#$0C
|
マヌーサ |
#$0D
|
ルカニ |
#$0E
|
メダパニ |
#$0F
|
炎 |
#$10
|
吹雪 |
#$11
|
ザラキ |
#$12
|
ザオラル |
#$13
|
ドラゴラム |
#$14
|
せいすい |
#$15
|
眠り攻撃 |
#$16
|
毒攻撃 |
#$17
|
マヒ攻撃 |
何に参照されているかが不明。
コマンドの成功する確率を制御する値を表す属性だ。 最も単純な場合には、いずれも単純に属性値 / 8 がそのまま成功確率を表すと考えてよろしい。 実際にはコマンド対象者の装備品が確率決定のパラメーターに含まれ、抽選計算は複雑になる。
添字 k = 0 のものは、戦闘モードで自陣戦闘員同士の実行ではないもの、および、 移動モードにおける実行において参照される。 この場合、さらにコマンドのうんのよさ考慮属性値(後述する)が 1 ならば、 対象者のうんのよさ属性値も確率決定のためのパラメーターになる。
添字 k = 1 のものは、戦闘モードで自陣戦闘員同士の実行において参照される。 データを見ると、ニフラム、バシルーラ、せいすいが絶対に効かないことがわかる。 ザオラルと「ふっかつのつえ」が 1/2 で成功し、 他のほとんど全てのコマンドは確実に成功するようだ。
このコマンドで敵陣戦闘員を無力化すると、その戦闘終了時のメッセージが何になるのかを表す属性だ。 一般には戦闘時には相異なる複数のコマンドを実行するが、それらの最も大きい属性値が採用される。
属性値と戦闘終了メッセージとの対応は次のとおりだ。
表 5.21 戦闘終了時述語
ID | メッセージ |
---|---|
0 | [BC]モンスターは いなかった![C2][AC] |
1 | [BC][B7]は にげだした![AC] |
2 | [BC][B7]は さっていった。[AC] |
3 | [BC][B7]を やっつけた![AC] |
ブーリアン型属性値で、この値が 1 ならばマホトーン状態の戦闘員がこのコマンドを実行すると、 「しかし じゅもんは ふうじこめられている!」のようなメッセージが表示されて、 実行は失敗することを意味する。
ブーリアン型属性値で、この値が 1 ならばマホカンタ状態の戦闘員に対してこのコマンドを実行すると、 光の壁が実行者にそれを跳ね返すことを意味する。
プログラム側で「メガンテ」を特別扱いしている。実行時の度にランダムで 0 または 1 として処理する。
ブーリアン型属性値で、この値が 1 ならばフバーハ状態の戦闘員に対してこのコマンドを実行すると、 基本ダメージ量を規定の 2/3 に減少させることを意味する。
ブーリアン型属性値で、この値が 1 ならばマヌーサ状態の戦闘員がこのコマンドを実行すると、 半分の確率で攻撃を失敗することを意味する。
ブーリアン型属性値で、この値が 1 であるコマンドを自陣側戦闘員がラリホー状態またはメダパニ状態の自陣側戦闘に対して実行すると、 それらの状態異常を回復させることがあることを意味する。
ちなみに回復する確率はどちらも 7/8 となっている。
ブーリアン型属性値で、この値が 1 であるコマンドをある種のアイテムを装備している自陣側戦闘員が実行すると、 その装備品から定まる特殊なダメージ処理が発生することを意味する。
該当する装備品は「もろはのつるぎ」「やいばのよろい」「なげきのたて」となっている。
ブーリアン型属性値で、この値が 1 であるコマンドは標的戦闘員によってかわされる可能性があることを意味する。
基本的には自陣側戦闘員は 1/64 の確率で身をかわす。
敵陣の場合は 5.5.1 構造体 $C20000
: モンスター のみかわし属性の項目で説明する。
ブーリアン型属性値で、この値が 1 であるコマンドはダメージ計算処理中に基本ダメージ値を倍になることを意味する。
ブーリアン型属性値で、この値が 1 であるコマンドは会心または痛恨の一撃に変化する可能性があることを意味する。
ブーリアン型属性値で、集中攻撃タイプの敵側戦闘員がこのコマンドを利用することが可能であるかどうかを意味する。
ブーリアン型属性値で、このコマンドの標的が実行直前までに無力化されていた場合に、 改めて別の標的を決定するかどうかを意味する。
ブーリアン型属性値で、この値が 1 であるコマンドを敵陣戦闘員が実行しようとするときに、 (その戦闘員の選択判断属性値が 0 でなければ)コマンドの対象を確定しようとする傾向を意味する。
ブーリアン型属性値で、アストロン状態の戦闘員はこの値が 1 であるコマンドを受け付けないことを意味する。
ブーリアン型属性値で、この値が 1 であるコマンドをある種のアイテムを装備している戦闘員が実行すると、 攻撃を失敗する可能性があることを意味する。 ここで、ある種のアイテムとは「はかいのつるぎ」「じごくのよろい」「まじんのオノ」を指す。
ブーリアン型属性値で、この値が 1 であるコマンドをある種のアイテムを装備している戦闘員が、 ある種の属性値がある戦闘員に実行すると、与えるダメージがランダムに増量することを意味する。 ここで、ある種のアイテムとは「ドラゴンキラー」「ゾンビキラー」を指す。
ブーリアン型属性値で、この値が 1 であるコマンドを「どくばり」を装備している戦闘員が実行すると、 会心の一撃が発生しないことを意味する。
ブーリアン型属性値で、この値が 1 であるコマンドを「どくばり」または「アサシンダガー」を装備している戦闘員が実行すると、 実行相手の急所を直撃して即死する可能性があることを意味する。
通常は 1/16 の確率で即死する。
ブーリアン型属性値で、この値が 1 であるコマンドを「はやぶさのけん」を装備している戦闘員が実行すると、 一回のコマンド実行で 2 度のダメージが発生することを意味する。
ブーリアン型属性値で、この値が 1 であるコマンドを実行することで敵陣戦闘員を無力化すると、 戦闘終了後にその戦闘員から経験値が得られることを意味する。
ブーリアン型属性値で、この値が 1 であるコマンドを実行するとメッセージ属性値の定めるメッセージが適切なタイミングで表示されなくなることを意味する。 この属性値はすべてのオブジェクトで 0 が設定されているので、実質使用されていない。
ブーリアン型属性値で、この値によって視聴覚的演出の発生タイミングが変化するものと思われる。 この属性値はすべてのオブジェクトで 0 が設定されているので、実質使用されていない。
ブーリアン型属性値で、この値が 1 であるコマンドの視覚的演出が対象を無視して敵陣全体に発生することを意味する。
ブーリアン型属性値で、この値が 1 であるコマンドの効力は対象者のうんのよさ属性値が影響することを意味する。 ただし、戦闘中において自陣側から自陣側へのコマンド実行の際にはこの属性値は関係しない。
成功率係数属性についても併せて参照して欲しい。
ブーリアン型属性値で、あるコマンドを戦闘員が実行しようとしたが、 そのコマンドがコマンド選択判断考慮が不要であったり、空振りのときの対象の再選択が不要であったりする場合に、 確定考慮属性値が 1 ならば、それでもなおコマンド対象の確定をする。
データを見ると一グループ直接攻撃コマンドにのみ 1 が設定されている。
このコマンドが成立する対象の条件を意味する属性だ。値と意味の対応は次のようになっている:
ブーリアン型属性値で、この値が 1 であれば格闘場においても通常の戦闘と同様に戦闘員は実行することが許される。 この値が 0 のものは、普通の攻撃に置き換わるものとする。
ブーリアン型属性値で、この値が 1 であるコマンドを実行することで敵陣戦闘員を無力化すると、 戦闘終了後にその戦闘員からゴールドが得られることを意味する。
ブーリアン型属性値で、この値が 1 であるコマンドを実行することで敵陣戦闘員を無力化すると、
最近倒したモンスターを保持するための変数 $7E23A9
に戦闘員のモンスター ID を更新することを意味する。
戦闘終了後に宝箱を落としたモンスターがいた場合には、この変数がそれを表している。
ブーリアン型属性値で、この値が 1 であるコマンドを戦闘員が実行すると普通の攻撃に置き換わることを意味する。
主に戦闘コードからコマンドオブジェクトの各属性を参照するために、次に列挙するサブルーチンが実装されている。 これを先に把握してからコードの逆アセンブルや解読作業に着手できれば理想的であった。
表 5.23 コマンド構造体の属性にアクセスするサブルーチン
サブルーチン | 固定引数長 | 入力 | 機能 |
---|---|---|---|
$C2CC03
|
2 | x | 2 バイト長の属性値を取得する |
$C2CC0A
|
2 | y | 2 バイト長の属性値を取得する |
$C2CC25
|
4 | x | ビットフィールド属性値を取得する |
$C2CC2C
|
4 | y | ビットフィールド属性値を取得する |
$C2CC47
|
4 | x | ビットフィールド属性値をテストする |
$C2CC4E
|
4 | y | ビットフィールド属性値をテストする |
各レジスターがコマンド ID を指示し、サブルーチン呼び出し命令直後の何バイトかが実引数のようなものだ。
1860
などはコマンドオブジェクトのバイトオフセット(この場合は 0 に相当する)などを意味し、
ビットフィールドアクセス呼び出しの場合にある続く 2 バイトは属性値が厳密に位置するビット列を抽出するためのマスクを意味する。