5.29. しらべる

5.29.1. モデル
5.29.1.1. 構造体 $C898E2: 「しらべる」対象分類
5.29.1.2. 「しらべる」対象抽象基底構造体
5.29.1.3. 構造体 $C87067: アイテム発見
5.29.1.4. 構造体 $C87C99: ゴールド発見
5.29.1.5. 構造体 $C87DB1: 情報取得
5.29.1.6. 構造体 $C88185: 罠
5.29.1.7. 構造体 $C88218: 特殊イベント
5.29.2. 処理手順

本節では移動コマンド「しらべる」の実装詳細について述べる。 まずは「しらべる」コマンドの対象であるオブジェクトのすべてを表現する ROM データの構造について説明する。 また、それらの構造それぞれについて、その型のオブジェクトデータを解釈して得られるテキスト CSV ファイルを提示する。 それから「しらべる」コマンドを実行するときのプログラムの手順を、可能な限りコードを引用した上で説明する。

5.29.1. モデル

本節では移動コマンド「しらべる」に直接関係するデータ構造を説明していく。 本質的には前作モデルのマイナーチェンジでしかないので、 4.5.1 モデル での説明が通用する要素についてはここでは繰り返さない。 また、読者の必要に応じて 付録 B データ に収録したデータを確認しながら読んで欲しい。

5.29.1.1. 構造体 $C898E2: 「しらべる」対象分類

アドレス $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.29.1.2. 「しらべる」対象抽象基底構造体

前作と設計が同様であるため、本節でも次のような概念上の構造体を導入しておく。 これを抽象クラスとみなして、後述の構造体群をその派生クラスとみなすことで論理的な構造を見通しやすくなるはずだ。

表 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 とは、それぞれこのオブジェクトの位置する MX または MY 座標を M 座標系で表現した値をとる属性だ。 これらの属性は前作モデルにも存在する。

LV

LV とは、これも前作から引き継いだ概念の属性であり、このオブジェクトが存在する空間内のどの「高さ」に配置されるかを示す値をとる属性だ。

描画関連

描画関連とは、このオブジェクトがどのように描画されるのかを制御する数をとる属性だと思われる。 既に開封済みの宝箱のスプライトをどうするか、等に影響を与えるのではないだろうか。 本書では現在詳細不明の属性だ。

5.29.1.3. 構造体 $C87067: アイテム発見

アドレス $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 だ。

5.29.1.4. 構造体 $C87C99: ゴールド発見

アドレス $C87C99 には以下に示すメモリーレイアウトの 8 バイト長オブジェクトが 0x23 個配列されている。この構造体は前作の 4.5.1.4 構造体 $C8477E: ゴールド発見 と同じ役割がある。

表 5.69 構造体 $C87C99

オフセット 属性
#$00 #$001F 分類
#$00 #$3FE0 MX
#$01 #$7FC0 MY
#$02 #$0180 LV
#$03 #$007E 描画関連
#$03 #$0080 (未使用)
#$04 #$FFFF ゴールド
#$06 #$FFFF フラグ

ゴールド

ゴールドとは、このオブジェクトを「しらべる」ことで入手できるゴールドの正味の額面を値とする属性だ。 前作とは異なり、金額が直接一つの属性値として表現されている。

5.29.1.5. 構造体 $C87DB1: 情報取得

アドレス $C87DB1 には以下に示すメモリーレイアウトの 7 バイト長オブジェクトが 0x8C 個配列されている。 この構造体は前作の 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 レミラーマ
#$04 #$00FE (未使用)
#$05 #$FFFF メッセージ

派生部分の属性については前作と同様につき、説明を省く。 4.5.1.5 構造体 $C848B6: 情報取得 を参照して欲しい。

5.29.1.6. 構造体 $C88185: 罠

アドレス $C88185 には以下に示すメモリーレイアウトのオブジェクトが 20 強配列されている。 この構造体は前作の 4.5.1.6 構造体 $C85534: 罠 と同じ役割がある。

表 5.71 構造体 $C88185

オフセット 属性
#$00 #$001F 分類
#$00 #$3FE0 MX
#$01 #$7FC0 MY
#$02 #$0180 LV
#$03 #$007E 描画関連
#$03 #$1F80 イベント戦
#$05 #$FFFF フラグ

イベント戦

この属性値は配列 $C8AC66 のインデックス、 すなわち「しらべる」コマンド実行後に発生する戦闘に対するイベント戦の ID だ。

5.29.1.7. 構造体 $C88218: 特殊イベント

アドレス $C88218 には以下に示すメモリーレイアウトの 0x0D バイト長オブジェクトが 0x8C 個配列されている。この構造体は前作の 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 フラグ

インパス処理

インパス処理とは、このオブジェクトに移動コマンド「インパス」を適用したときの処理の開始アドレスを値とする属性だ。 前作ではオブジェクトの型および中身で色を決定したが、本作ではサブルーチンへのジャンプで実装されている。 しかし、データによると各処理の中身は定数を共通する変数に設定するだけに過ぎない。

5.29.2. 処理手順

サブルーチン $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 が割り込む。

調査済みの場合

前作の対応工程と同様だ。

後処理処理は前作と同様だ。