本節では移動コマンド「しらべる」の実装詳細について述べる。 まずは「しらべる」コマンドの対象であるオブジェクトのすべてを表現する ROM データの構造について説明する。 また、それらの構造それぞれについて、その型のオブジェクトデータを解釈して得られるテキスト CSV ファイルを提示する。 それから「しらべる」コマンドを実行するときのプログラムの手順を、可能な限りコードを引用した上で説明する。
本節では移動コマンド「しらべる」に直接関係するデータ構造を説明していく。 本質的には前作モデルのマイナーチェンジでしかないので、 4.5.1 モデル での説明が通用する要素についてはここでは繰り返さない。 また、読者の必要に応じて 付録 B データ に収録したデータを確認しながら読んで欲しい。
アドレス $C898E2
には以下に示すメモリーレイアウトのオブジェクトが 30 弱配列されている。
この構造体は前作の 4.5.1.1 構造体 $C20000
: 「しらべる」対象分類 と同じ役割がある。
表 5.66 構造体 $C898E2
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$00F0
|
ヒットテスト座標成分上限 |
#$00
|
#$000F
|
ヒットテスト座標成分右限 |
#$01
|
#$00F0
|
ヒットテスト座標成分下限 |
#$01
|
#$000F
|
ヒットテスト座標成分左限 |
#$02
|
#$0007
|
キャラクターが上向きのときの対応座標成分オフセット |
#$02
|
#$01C0
|
キャラクターが右向きのときの対応座標成分オフセット |
#$02
|
#$0038
|
キャラクターが下向きのときの対応座標成分オフセット |
#$03
|
#$0010
|
キャラクターが左向きのときの対応座標成分オフセット |
#$03
|
#$0020
|
キャラクターが上向き禁止 |
#$03
|
#$0040
|
キャラクターが右向き禁止 |
#$03
|
#$0080
|
キャラクターが下向き禁止 |
#$03
|
#$000E
|
キャラクターが左向き禁止 |
#$04
|
#$FFFF
|
初訪問時のメッセージ |
#$06
|
#$FFFF
|
無効な方向からのメッセージ |
#$08
|
#$FFFF
|
罠であるときのメッセージ |
#$0A
|
#$FFFF
|
何もないときのメッセージ |
#$0C
|
#$FFFF
|
再訪問時のメッセージ |
#$0E
|
#$FFFF
|
王さま用実行メッセージ |
#$10
|
#$FFFF
|
王さま用結果メッセージ |
#$12
|
#$FFFF
|
女王さま用実行メッセージ |
#$14
|
#$FFFF
|
女王さま用結果メッセージ |
#$16
|
#$01FF
|
初訪問時の効果音 |
#$17
|
#$03FE
|
再訪問時の効果音 |
以下、前作の対応構造体に存在しない属性しか記さない。次節以降も同様。
これらの属性は、主人公がロマリアで王様になっているときに参照される。 主人公が何をしらべても、これらの値を ID とするメッセージがウィンドウに出力され、 「しらべる」対象の状態が変化することを防ぐ。
これらの属性は、主人公が女勇者のときのロマリアイベントで参照される。 上述の対と同じ意味がこれらの属性にはある。
以降、本節ではロマリアで王様なり女王様なりにさせられたときの状態をロマリアモードと称することにする。
前作と設計が同様であるため、本節でも次のような概念上の構造体を導入しておく。 これを抽象クラスとみなして、後述の構造体群をその派生クラスとみなすことで論理的な構造を見通しやすくなるはずだ。
表 5.67 「しらべる」対象抽象基底構造体
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$001F
|
分類 |
#$00
|
#$3FE0
|
MX |
#$01
|
#$7FC0
|
MY |
#$02
|
#$0180
|
LV |
#$03
|
#$007E
|
描画関連 |
これについては属性を省略しないで説明しておきたい。
分類とは、5.29.1.1 構造体 $C898E2
: 「しらべる」対象分類 オブジェクト ID を値とする属性だ。
この値が「足もと」「宝箱」「ツボ」「タル」等々を表現していると解釈できる。
これは前作にもあった属性だ。
MX または MY とは、それぞれこのオブジェクトの位置する MX または MY 座標を M 座標系で表現した値をとる属性だ。 これらの属性は前作モデルにも存在する。
LV とは、これも前作から引き継いだ概念の属性であり、このオブジェクトが存在する空間内のどの「高さ」に配置されるかを示す値をとる属性だ。
描画関連とは、このオブジェクトがどのように描画されるのかを制御する数をとる属性だと思われる。 既に開封済みの宝箱のスプライトをどうするか、等に影響を与えるのではないだろうか。 本書では現在詳細不明の属性だ。
アドレス $C87067
には以下に示すメモリーレイアウトのオブジェクトが 450 弱配列されている。
この構造体は前作の 4.5.1.3 構造体 $C83E5C
: アイテム発見 と同じ役割がある。
表 5.68 構造体 $C87067
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$001F
|
分類 |
#$00
|
#$3FE0
|
MX |
#$01
|
#$7FC0
|
MY |
#$02
|
#$0180
|
LV |
#$03
|
#$007E
|
描画関連 |
#$03
|
#$7F80
|
アイテム |
#$04
|
#$0080
|
(未使用) |
#$05
|
#$FFFF
|
フラグ |
以下、抽象基底構造体にない属性しか記述しない(後続の構造体も同様)。
アイテムとは、この対象を「しらべる」ことによって入手できるアイテムの ID を値とする属性だ。 前作同様。
フラグ ID とは、この対象が調査済みであるかどうかを管理するフラグの ID を値とする属性だ。
仕様は前作と同様だが、本作ではフラグビット列のベースアドレスは $7E353A
だ。
アドレス $C8477E
には以下に示すメモリーレイアウトのオブジェクトが 30 以上配列されている。
この構造体は前作の 4.5.1.4 構造体 $C8477E
: ゴールド発見 と同じ役割がある。
表 5.69 構造体 $C87C99
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$001F
|
分類 |
#$00
|
#$3FE0
|
MX |
#$01
|
#$7FC0
|
MY |
#$02
|
#$0180
|
LV |
#$03
|
#$007E
|
描画関連 |
#$04
|
#$0080
|
(未使用) |
#$04
|
#$FFFF
|
ゴールド |
#$06
|
#$FFFF
|
フラグ |
ゴールドとは、このオブジェクトを「しらべる」ことで入手できるゴールドの正味の額面を値とする属性だ。 前作とは異なり、金額が直接一つの属性値として表現されている。
アドレス $C848B6
には以下に示すメモリーレイアウトのオブジェクトが 140 配列されている。
この構造体は前作の 4.5.1.5 構造体 $C848B6
: 情報取得 と同じ役割がある。
表 5.70 構造体 $C87DB1
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$001F
|
分類 |
#$00
|
#$3FE0
|
MX |
#$01
|
#$7FC0
|
MY |
#$02
|
#$0180
|
LV |
#$03
|
#$007E
|
描画関連 |
#$03
|
#$0080
|
とうぞくのはな |
#$04
|
#$0001
|
レミラーマ |
#$05
|
#$00FE
|
(未使用) |
#$05
|
#$FFFF
|
メッセージ |
派生部分の属性については前作と同様につき、説明を省く。
4.5.1.5 構造体 $C848B6
: 情報取得 を参照して欲しい。
アドレス $C85534
には以下に示すメモリーレイアウトのオブジェクトが 20 強配列されている。
この構造体は前作の 4.5.1.6 構造体 $C85534
: 罠 と同じ役割がある。
表 5.71 構造体 $C85534
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$001F
|
分類 |
#$00
|
#$3FE0
|
MX |
#$01
|
#$7FC0
|
MY |
#$02
|
#$0180
|
LV |
#$03
|
#$007E
|
描画関連 |
#$03
|
#$1F80
|
イベント戦 |
#$05
|
#$FFFF
|
フラグ |
この属性値は配列 $C8AC66
のインデックス、
すなわち「しらべる」コマンド実行後に発生する戦闘に対するイベント戦の ID だ。
アドレス $C855AB
には以下に示すメモリーレイアウトのオブジェクトが 140 配列されている。
この構造体は前作の 4.5.1.7 構造体 $C855AB
: 特殊イベント と同じ役割がある。
表 5.72 構造体 $C88218
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$001F
|
分類 |
#$00
|
#$3FE0
|
MX |
#$01
|
#$7FC0
|
MY |
#$02
|
#$0180
|
LV |
#$03
|
#$007E
|
描画関連 |
#$03
|
#$0080
|
とうぞくのはな |
#$04
|
#$0001
|
レミラーマ |
#$04
|
#$00FE
|
(未使用) |
#$05
|
#$FFFF
|
しらべる処理 |
#$07
|
#$00FF
|
|
#$08
|
#$FFFF
|
インパス処理 |
#$0A
|
#$00FF
|
|
#$0B
|
#$FFFF
|
フラグ |
インパス処理とは、このオブジェクトに移動コマンド「インパス」を適用したときの処理の開始アドレスを値とする属性だ。 前作ではオブジェクトの型および中身で色を決定したが、本作ではサブルーチンへのジャンプで実装されている。 しかし、データによると各処理の中身は定数を共通する変数に設定するだけに過ぎない。
サブルーチン $C66F59
が「しらべる」処理の主要部だ。
以下に主要処理、各工程失敗時の処理、後始末処理の流れを述べるが、
そのうちの 4.5.2 処理手順 と同様の工程については説明を繰り返さない。
単にキャリーレジスターをオンにするだけのサブルーチンを呼び出すが、これは前作コードの残骸だ。 仮にパーティー全員がカンオケ状態であったとしても、 「このままでは 調べられない!」のメッセージをプレイヤーが目にすることはないはずだ。
この工程は前作とほぼ同様だ。 生存状態のパーティーメンバーを一人、 および「しらべる」処理最中であることを示すフラグを設定・保存しておく。
参照する変数が $7EDB05
となるが、前作の対応工程と同様だ。
前作の対応工程と同様だ。
この工程は本作固有のものだ。
変数 $7E354F
のビット #$0002
をテストすることで、現在ロマリアモードどうかを判定する。
もしそうであれば、後述のロマリアモード専用工程に処理を移る。
前作の対応工程と同様だ。
前作の対応工程と同様だ。
前作の対応工程と同様だ。ただしデータ構造の変化に伴う変更がある。
対象の分類がアイテムであれば、パーティーはオブジェクトに設定されたアイテムを入手する。 万が一アイテムを表す属性値がゼロである場合は、何もないときのメッセージの出力しかしない。
メッセージ「なんと![AD][B5]を みつけた!」を出力した直後で行う、 発見アイテムのアイコン表示と効果音再生における若干処理は、 アイテムが処分可能かつ希少であるかそれ以外であるかで異なるのだが、詳細は割愛する。
残りの処理は前作と同様だ。
余談だが、ふくろの利用可能判定も一応行っており、
変数 $7E353E
のビット #$0001
が立っている必要がある。
このような判定はプログラム全体を通してここにしかないと思われる。
対象の分類がゴールドであれば、しらべる対象のゴールド属性をそのまま参照し、 メッセージ「[C0]は[AD][BB]ゴールドを 手に入れた。」を出力してから、 パーティー所持金のその金額を直接加算する。
それぞれ前作と同様だ。
前作と同様だ。
本流の処理中に何らかのテストが失敗したときに処理される工程を以下に示す。 ここに挙げる工程それぞれにはお互いに関係しない。 また、いずれの工程の終了後も後述の後始末処理に移るものだ。
まずロマリアモードかどうかのテストを実施する。これは前述した方法と同じようにする。 ロマリアモードでない場合には、現在使用中の乗り物に応じてメッセージを 2 通出力する。
表 5.73 配列 $C67171: 何もないときのメッセージ
乗り物 | メッセージ |
---|---|
徒歩 | [C0]は 足もとを 調べた![AF] |
船 | [C0]は 水面を 目をこらして[AD]みつめた。[AF] |
船(不明) | [C0]は 水面を 目をこらして[AD]みつめた。[AF] |
船(屋内) | [C0]は 水面を 目をこらして[AD]みつめた。[AF] |
ラーミア | [C0]は 大空から[AD]大地をながめた。[AF] |
船(アレフガルド) | [C0]は 水面を 目をこらして[AD]みつめた。[AF] |
表 5.74 配列 $C6717D: 何もないときのメッセージ
乗り物 | メッセージ |
---|---|
徒歩 | しかし 何も 見つからなかった。 |
船 | しかし 何も 見つからなかった。 |
船(不明) | しかし 何も 見つからなかった。 |
船(屋内) | しかし 何も 見つからなかった。 |
ラーミア | しかし 空からでは よく わからない! |
船(アレフガルド) | しかし 何も 見つからなかった。 |
前作の対応工程と同様だ。
しらべる対象の分類とパーティー先頭の性別でパラメーター化されている。
パーティー先頭の性別がおんなならば、女王さま用実行メッセージと女王さま用結果メッセージを出力し、
そうでなければ、王さま用実行メッセージと王さま用結果メッセージを出力する。
どちらの場合でも、メッセージの間にメッセージ ID #$0150
が割り込む。
前作の対応工程と同様だ。
後処理処理は前作と同様だ。