4.23. 移動中の呪文コマンド処理

4.23.1. 呪文ハンドラーテーブル
4.23.2. 解析
4.23.2.1. ホイミ・べホイミ・ベホマ
4.23.2.2. べホマラー・べホマズン
4.23.2.3. キアリー
4.23.2.4. ザオラル
4.23.2.5. ザオリク
4.23.2.6. ルーラ
4.23.2.7. リレミト
4.23.2.8. くちぶえ
4.23.2.9. トヘロス
4.23.2.10. トラマナ
4.23.2.11. フローミ
4.23.2.12. タカのめ
4.23.2.13. とうぞくのはな
4.23.2.14. しのびあし
4.23.2.15. ねる
4.23.2.16. おおごえ
4.23.2.17. あなほり
4.23.2.18. インパス
4.23.2.19. レミラーマ
4.23.2.20. おもいだす・もっとおもいだす・ふかくおもいだす
4.23.2.21. わすれる

本節では移動中に呪文を唱えるときに発生する処理を呪文ごとに見ていく。 プレイヤーがコマンドメニューから「じゅもん」を選択し、 どのパーティーにメンバーが唱えるのかを選択したあとに一つ呪文を選択する。 すると十分な MP があるときに、プログラムは選択された呪文に対応するサブルーチンを呼び出す。

4.23.1. 呪文ハンドラーテーブル

呪文の文字列インデックスと処理コードの開始アドレスとの対応表はアドレス $C3B814 に次のように定義されている。 呪文ウィンドウで選択された呪文文字列のインデックスと行前半が一致すれば、 プログラムカウンターを行後半のアドレスへ JMP させる。

C3/B814:    3000A4B9    ; ホイミ
C3/B818:    330049BA    ; べホイミ
C3/B81C:    360050BA    ; べホマ
C3/B820:    390057BA    ; べホマラー
C3/B824:    3A00CABA    ; べホマズン
C3/B828:    3E00D1BA    ; キアリー
C3/B82C:    3B004ABB    ; ザオラル
C3/B830:    3C00F8BB    ; ザオリク
C3/B834:    410070BC    ; ルーラ
C3/B838:    9E004ABD    ; リレミト
C3/B83C:    A900A6BD    ; くちぶえ
C3/B840:    A100DEBD    ; トヘロス
C3/B844:    A00010BE    ; トラマナ
C3/B848:    A40024BE    ; フローミ
C3/B84C:    A2007FBE    ; タカのめ
C3/B850:    A500F9BE    ; とうぞくのはな
C3/B854:    A80055BF    ; しのびあし
C3/B858:    A30077BF    ; ねる
C3/B85C:    A70095BF    ; おおごえ
C3/B860:    AA0066C0    ; あなほり
C3/B864:    9F0044C3    ; インパス
C3/B868:    A6001BC7    ; レミラーマ
C3/B86C:    AB0064C7    ; おもいだす
C3/B870:    AD0079C7    ; もっとおもいだす
C3/B874:    AC008EC7    ; ふかくおもいだす
C3/B878:    AE00A3C7    ; わすれる

4.23.2. 解析

以下、各呪文の処理を簡単に説明していく。 その前に、実際にはハンドラーごとにコード化されているものの、 各呪文に共通して見られる仕様傾向を列挙しておく。 これらの事実についてはいちいち個々の呪文解説の項では、例外的な扱いがある場合を除き繰り返さない。

  • サブルーチン $C3B8C5 呼び出しにより、特定の効果音 (ID: #$00B0) を鳴らす。
  • 途中でキャンセルしたり、呪文の効果が無効であったりすると、呪文選択時に消費した MP を返還する。
  • コマンドの対象がパーティーメンバーの一人となるものについては、それをウィンドウ #$00CA で決定する。

4.23.2.1. ホイミ・べホイミ・ベホマ

ホイミ・べホイミ・ベホマの各コマンドは開始直後に同一の処理 $C3B9A8 に合流するので、まとめて解説する。

これらの呪文は、対象者一人が死んでいなければ、そのメンバーの HP をある量だけ回復しようとするものだ。 ここで、ある量とは指定する範囲にある数からランダムに選ぶものであり、 ホイミ系 5 種の呪文に対する回復量テーブルは $C3B963 において次のように定められている。

C3/B963:    30001E002800 ; ホイミ
C3/B969:    33004B005F00 ; べホイミ
C3/B96F:    3600E703E703 ; べホマ
C3/B975:    390064007800 ; べホマラー
C3/B97B:    3A00E703E703 ; べホマズン

十六進数を十進数で書き直し、表にまとめると次のようになる:

表 4.109 $C3B963 ホイミ系回復量テーブル

コマンド 下限値 上限値
ホイミ 30 40
べホイミ 75 95
べホマ 999 999
べホマラー 100 120
べホマズン 999 999


乱数の適用は、ホイミ系専用サブルーチン $C3B8FC で行う。 具体的には、汎用乱数系サブルーチン $C00F28 を利用して回復量を決める。 つまり、ゼロから回復量範囲の長さまでのいずれかの数をランダムに発生させ、 これに下限値を加えた値を回復量とする。

指定メンバーへの HP の回復処理自体はキャラクターのプロパティー設定サブルーチンの一種である $C44685で行う。 回復量が過剰な場合はそこで対処することを期待する。

最後に効果音 #$00CD を鳴らし、メッセージを表示して終了する。

4.23.2.2. べホマラー・べホマズン

べホマラー・べホマズンの各コマンドは開始直後に同一の処理 $C3BA5B に合流するので、まとめて解説する。

これらの呪文は、パーティーにいるメンバーを先頭から順番に、HP をある量だけ回復しようとするものだ。 ただし、死んでいるメンバーは単にスキップする。 また、回復量をメンバーごとに 4.23.2.1 ホイミ・べホイミ・ベホマ のようにしてランダムに決定する。 回復処理、効果音、メッセージについても同様だが、呪文を受けたメンバーごとに発生する。

全員の回復メッセージを表示し終えた後、パーティーの HP/MP ウィンドウを表示してコマンドを終了する。

4.23.2.3. キアリー

キアリーは、対象者一人が死んでいなければ、その毒状態をクリアするコマンドだ。

サブルーチン $C44CA3 により、指定メンバーの状態をテストする。 「しに」状態ならばいつものようにキャンセル扱いとする。 そうでなければ、指定メンバーの「もうどく」「どく」フラグがセットされているかをテストする。 これらのフラグのどちらもセットされていないならば、「しかし 何も おこらなかった」を表示して終了する。 この場合には MP の返還は発生しない。

対象が本当に毒に冒されている場合には、 キャラクターのプロパティー設定サブルーチンの一種であるサブルーチン $C44E2B により「もうどく」「どく」フラグをリセットする。

最後にメッセージ #$16A9 を表示し、コマンドを終了する。

4.23.2.4. ザオラル

ザオラルは対象者一人が死んでいれば、半分の確率で生き返らせ、HP を最大値の半分とするコマンドだ。

サブルーチン $C44CA3 により、指定メンバーの状態をテストする。 「しに」状態でなければいつものようにキャンセル扱いとする。

死んでいる場合にはサブルーチン $C00E97 により乱数を発生させる。 この値が奇数ならば(最下位ビットを調べる)、ザオラルの結果を失敗とする。 メッセージ #$16A8 を表示し、当然ながら MP を返還せずに終了とする。

乱数が偶数ならば成功とする。この場合、次の一連の処理を行う:

  • サブルーチン $C44D34 でメンバーの状態をすべてクリアする。
  • サブルーチン $C44729 でメンバーの最大 HP を取得する。 次に LSR 命令でその半分の値を計算する。
  • サブルーチン $C44685 でメンバーの HP を回復する。

最後にメッセージ #$16A7 を表示し、コマンドを終了する。

4.23.2.5. ザオリク

ザオリクは対象者一人が死んでいれば、HP ごと完全回復するコマンドだ。 処理内容は 4.23.2.4 ザオラル で説明したものから、 乱数関連と半減関連を取り除いたものになる。

4.23.2.6. ルーラ

ルーラはパーティーが訪問したことがある場所の一定の集合から一点を選択し、そこへ一瞬で移動するコマンドだ。 次のような処理になっている:

  • サブルーチン $C435B3 を呼び出す。 これにより、パーティーが一度訪問したすべての移動先候補地点をアドレス $7E48D8 に配列としてセットする。

    なお、訪問情報は $7E3E60 にビット列として保持されている。 また、すべての移動先候補地点は $C8A162 に 1 バイト型の配列として定義されている。

  • 次に配列 $7E48D8 に要素があれば、そこから移動先候補をいくつか取り除く。 サブルーチン $C7CAD5 を実行することで、 パーティーが現在いるフィールド区分(フィールド、したフィールド、かいてい、はざま)に一致しない候補を検索し、取り除く。 この結果、移動先候補が全くなくなればメッセージ #$16D8 を表示して、 コマンドをキャンセル扱いで終了する。
  • ルーラウィンドウを表示する。 候補先の個数に応じてウィンドウの ID を #$004E#$004F に使い分ける。
  • 呪文効果音を鳴らしたら、サブルーチン $C7C650 を実行する。 このとき、次に述べるような失敗パターンがあり、いずれもコマンドキャンセル扱いとなる。

    • 天井に頭をぶつけるパターン。 この場合はメッセージ #$16AC を表示する。
    • 不思議なちからで失敗するパターン。 この場合はメッセージ #$16D8 を表示する。
    • 特定の状況かつ特定の行き先について、パーティーにチャモロがいない(しに状態である)ために失敗するパターン。 この場合はメッセージ #$16AD を表示する。
  • 以上をすべてクリアすれば画面を切り替えてコマンドを終了する。

4.23.2.7. リレミト

リレミトは現在パーティーがいる地域から「脱出」するコマンドだ。 次のように処理する:

  • サブルーチン $C7C783 を呼び出すことで、 パーティーが現在いる地域や状況がリレミトを許可するかどうかを調べる。 リレミトが意味のない場所ならばメッセージ #$16D6 を、 何らかのイベント中であるなどの理由により禁止されているならばメッセージ #$16D8 を、それぞれ表示してコマンドを終了する。 この場合、消費済みの MP を呪文を唱えたメンバーに返還する。

    サブルーチン $C7C783 のチェック内容は次のようなものだ:

    • $7E5EE1 != #$0000 であるか。 ゼロでなければ、リレミトにより「何も起こらない」場である。 いんちきリレミトすら認めない場ということだ。
    • 現在「不思議なちから」が作用する場にいるか、 または $7E3E28 & #$0001 がセットされているかを調べる。 どちらかならば、リレミトに「不思議なちから」が作用する。
    • $7E3D2B & #$0002 がセットされているか。 セットされていればリレミトが発動する。

    これらを全てクリアすればリレミトが発動する。

  • 許可されているならば、サブルーチン $C7C9CE を実行する。 これがリレミトの本体処理だ。

リレミトが成功する条件が思いのほか複雑であることがわかる。

4.23.2.8. くちぶえ

くちぶえは現在パーティーがいる戦闘地域に基いて、強制的に通常戦闘を引き起こすコマンドだ。 次のように処理する:

  • サブルーチン $C79447 を呼び出し、 適切なタイルせんとう ID を取得する。 4.1.2.10 タイルせんとうで既定値として表示される値とこの ID は同じだ。 この値がゼロだと、メッセージ「しかし 何も おこらなかった」を出力してコマンドを終了する。
  • 現在、通常戦闘が発生してよい状況なのかどうかをフラグ $7E3D2A & #$0010 をテストすることで確認する。 なお、このフラグは 4.1.2.12 いんちきせっていメニューにある「エンカウント」の操作対象そのものだ。 フラグがリセットされていると、メッセージ「しかし 何も おこらなかった」を出力してコマンドを終了する。
  • フラグがセットされていれば、戦闘開始サブルーチン $C7952C を呼び出す。

全くの個人的な感想だが、フラグのテストを ID 取得より先に処理して欲しい。

4.23.2.9. トヘロス

トヘロスは次の処理を行うコマンドだ:

  • トヘロス系カウンター $7E3BA9 をリセットする。
  • トヘロスフラグ $7E3D2B & #$0004 をセットする。
  • せいすいフラグ $7E3D2B & #$0010 をリセットする。

最後にメッセージ #$16B6 を表示し、コマンドを終了する。

4.23.2.10. トラマナ

トラマナはトラマナフラグ $7E3D2B & #$0020 をセットするコマンドだ。 実装はここというよりはサブルーチン $C7CC5C の呼び出しで済ませている。

4.23.2.11. フローミ

フローミはパーティーが現在いる場所のメッセージを表示するコマンドだ。 次のように処理する:

  • サブルーチン $C7CAFA を呼び出し、 フローミ名とフローミ階数を得る。 このフローミ階数がゼロだと、呪文に意味がない旨を示すメッセージ (ID #$16C5) を表示してコマンドを終了する。 この場合 MP の返還処理はない。
  • フローミ階数の符号により、表示メッセージを若干変える。 正数の場合は単に ID #$16C3 のメッセージを出力する。 負数の場合はいわゆる二の補数で表現された値の絶対値を計算してから ID #$16C4 のメッセージを出力する。

    C3/BE59:    49FFFF      EOR #$FFFF          1
    C3/BE5C:    1A          INC A               2
    C3/BE5D:    8D2E5A      STA $5A2E           3
    C3/BE60:    AD305A      LDA $5A30           4
    C3/BE63:    2900FF      AND #$FF00
    C3/BE66:    8D305A      STA $5A30
    C3/BE69:    22C22DC0    JSR $C02DC2         5
    C3/BE6D:    C416
    

    1 2

    情報処理試験の基本問題でよく見かけるように、 負の整数はそのビットを反転させて 1 を加えれば絶対値を得る。

    3 4

    $5A2E は次のメッセージ中の [BB] に当てはめる値。 一方 $5A30 はこの場合は無視してよい。

    5

    メッセージ #$16C4: ここは [B2]の[AD]地下[BB]階のようだ。

どちらかのメッセージを出力した後、コマンドを終了する。

4.23.2.12. タカのめ

タカのめは近くにある城や街等の現在パーティーがいる地点からの相対的な位置を調べるコマンドだ。 探索処理をサブルーチン $C7CB22 で、 データ処理とメッセージ処理を当ハンドラー内でそれぞれ実行する。 当ハンドラーでの手続きはこのようなものだ:

  • サブルーチン $C7CB22 を呼び出し、探索処理を実行する。 これにより位置データを変数 $7E6C[D1:D8] にセットする。

    この結果 $6CD3$6CD1 の両方がゼロだと、 失敗メッセージ #16C0 を出力してコマンドを終了する。 前者が南北方向の歩数で、後者が東西方向の歩数を表す。

  • メッセージ中の東西何歩なのかを決めるために $7E6CD5 の符号を調べる。 正ならば東に何歩とのメッセージ #16BC を、 負ならば西に何歩とのメッセージ #16BD をそれぞれ出力する。
  • メッセージ中の南北何歩なのかを決めるために $7E6CD7 の符号を調べる。 正ならば南に何歩とのメッセージ #16BF を、 負ならば北に何歩とのメッセージ #16BE をそれぞれ出力する。
  • コマンドを終了する。

本質的な処理はサブルーチン $C7CB22 以下のコードによる。

  • パーティーがタカのめにとっての有効地域にいるかどうかは 構造体 $C8A188 のメンバーを調べることによる。 余談だが、この構造体配列を精査すれば、タカのめが有効な地域は「フィールド」および「したフィールド」しかないことが判明する。
  • 長さが 160 の二つの配列 $7E5F19$7E5FB9 を並行して調べる。 興味がある値とは、前者の値の最下位ビットが立っていて、かつ後者の要素が 3 または 4 となる 添字だ。 この添字に対応する配列 $7E62D9, $7E6199, $7E6379, $7E6239 の要素も利用する。
  • アルゴリズムはパーティーのいる地点との Manhattan 距離が最小をとる候補地点を一つ検索する。
  • 候補地点が基準点から東西方向に #$0012 以上離れているか、 あるいは南北方向に #$000E 以上離れているならば、 その候補地点はタカのめの解から除外する。

4.23.2.13. とうぞくのはな

とうぞくのはなは現在パーティーがいる階や部屋に「しらべる」で入手できるお宝やゴールドがどれだけあるかを知るコマンドだ。 次のような手続きを行う:

  • 現在パーティーがいる階や部屋がフィールド系であるかどうかを調べる。 フィールド系だとメッセージ「しかし 何も おこらなかった」を出力してコマンドを終了する。 余談だが、このチェックでははざまの世界後半部フィールドを漏らしている。
  • サブルーチン $C7CC26 を呼び出し、探索処理を実行する。
  • 戻り値によって出力メッセージを使い分ける。 値がゼロならばメッセージ #$16C7 を、 そうでなければメッセージ #$16C6 をそれぞれ表示して、 コマンドを終了する。

とうぞくのはなの本質的な処理はサブルーチン $C7CC26 以下になる。 手続きの概要のみ記す:

  • お宝カウンターは $7E679D だ。
  • 検索対象は三つ組の配列 $7E641D, $7E65DD, $7E661D となる。

    配列 $7E641D はマップ内のマスが「しらべる」コマンドの対象であるかを 管理するようだ。上位 2 ビットの状態によりスキップするかどうかを決める。 このうち #$4000 のビットのほうがこのコマンド専用のデータ扱いになっている。

    配列 $7E65DD で「しらべる」コマンドによる反応対象の種別を管理している。 値については下記の表を参照。この値によってサブルーチンを呼び分ける。

    配列 $7E661D ではマップ内の各マスに対応する 各種お宝構造体配列の添字、 すなわち「しらべる」イベントの ID を管理している。

  • 基本的には「しらべる」コマンドで得られる対象物は、 一度アクセスしたら二度目以降は反応しない。そのフラグを管理するのは配列 $7E3D2A のビットセットだ。 一度「しらべる」コマンドで入手した項目に対応するビットは 1 になっている。 このアルゴリズムで調べたいのは、そのようなビットが 0 になっているものの個数だ。

表 4.110 しらべる反応種別

種別 参照構造体
0 どうぐ $C83E5C
1 ゴールド $C8477E
2 立て札・貼り紙・本棚 n/a
3 罠モンスター $C85534
4 (不明) $C855AB

4.23.2.14. しのびあし

しのびあしは次の処理を行うコマンドだ:

  • しのびあし歩数 $7E3BAD をリセットする。
  • しのびあしフラグ $7E3D2B & #$0008 をセットする。

最後にメッセージ #$16B6 を表示し、コマンドを終了する。

4.23.2.15. ねる

ねるは本人の状態をサブルーチン $C44F0D 呼び出しによってねむり状態にするコマンドだ。

4.23.2.16. おおごえ

おおごえは旅の店屋を呼びつけて営業をさせるコマンドだ。次のようなことを行う:

  • トヘロス・せいすい歩数 $7E3BA9 をリセットする。
  • サブルーチン $C7CC76 を呼び出し、現在おおごえを利用可能かどうかを調べる。 無効な場合にはメッセージ #$16D5 を表示してコマンドを終了する。
  • おおごえフラグ $7E3D2B & #$0040 をセットする。
  • 最近訪問した店と同じ品揃えの旅の店屋、 ある旅の宿屋、または旅の神父がそれぞれ確率 1/3 で現れる。

    • 店屋の場合には $7E3B77 に格納済みの店屋 ID を参照する。 店の種別に合わせて出力メッセージ用に誰が現れるのかを決め、 4.6.2 処理手順 で述べる処理を実行する。
    • 宿屋の場合には ID #$0024 の宿屋が現れる。 それから 4.7.2 処理手順 で述べるサブルーチンを実行する。 宿賃は一人 100 ゴールドだ。
    • 教会の場合には ID #$0006 の教会が現れる。 つまり「おいのりをする」がない教会だ。 それから 4.8.2.1 サブルーチン $C3D3E3: 標準的な教会 で述べるサブルーチンを実行する。
  • おおごえフラグ $7E3D2B & #$0040 をリセットする。

フラグをリセットしたら、コマンドを終了する。

4.23.2.17. あなほり

あなほりは物品またはゴールドをランダムに入手するコマンドだ。 できればアクティビティー図でも描いて展望を明瞭にしておきたいところだが、文章でコマンドの手続きを示す:

  • サブルーチン $C7CC3A を実行し、あなほりが利用可能な状況かどうかを判定する。 単に変数 $7E85EF がゼロであるかをテストするだけだ。 ゼロでなければメッセージ #$16D3 を表示してコマンドを終了する。
  • あなほりカウンターを参照する。変数 $7E5ED3 がそれだが、 この値が 5 以上ならばメッセージ #$16D2 を表示してコマンドを終了する。
  • 確率 1/2 でスカかどうかを抽選する。 スカならばメッセージ #$16D2 を表示してコマンドを終了する。
  • 確率 1/2 でアイテム抽選を行うかどうかを補助サブルーチンの呼び出しにより抽選する。 この抽選処理の概要は後述する。

    • 当選すれば、サブルーチン $C3ED1D を実行して獲得した物品をパーティーの所持品の空きまたはふくろに追加する。
    • 発見メッセージ #$16D1 を出力する。
    • サウンド #$002C を鳴らし、演奏終了を待機する。
    • 補助サブルーチンを呼び出して、あなほりカウンター $7E5ED3 を 1 だけ加える。 そこでは値が 5 を超えるようならば 5 のまま保留する。
  • アイテム抽選に漏れた場合は確率 1/128 で所持金の半額を掘り当てる。

    • 当選すれば、サブルーチン $C427E0 を呼び出してパーティーの所持金を問い合わせる。 次に LSR 命令と ROR 命令を併用して半額を計算し、これを収入額とする。
    • 落選すればランダムに 1 または 2 ゴールドを収入額とする。

    最後にサブルーチン $C42862 を呼び出して所持金に収入額を加算し、 メッセージ #$16D0 を表示する。

  • 前述のあなほりカウンター補助サブルーチンを呼び出して、あなほりカウンターを更新する。

以上でコマンドを終了する。

次にアイテム抽選を行うかを決定する補助サブルーチンの処理を示す:

  • パーティーがいる地域のタイルせんとうデータを参照する。

    4.17.1.1 構造体 $C6843C: 通常の戦闘用編成 で述べたオブジェクト内の頻度属性値の総和を計算する。 この和がゼロならば、アイテム抽選を行わないものとする。

    ゼロからこの和までの間の数をランダムに一つ取る。

    この乱数から、タイルせんとうデータ内の頻度メンバーデータを一つずつ順に減算する。 この値が負になるところで反復処理を中断するが、 最後まで行っても負にならない場合は、アイテム抽選を行わないものとする。

    反復処理中断時のインデックスを基に、タイルせんとうデータ中のモンスターを決定する。 モンスターの ID がゼロならば、アイテム抽選を行わないものとする。

    このモンスターの宝箱を落とす確率をモンスターデータの対応属性(4.14.1 参照)に基いて決定する。 確率表は 表 4.55 アイテム確率 のものを参照する。 それから当選確率がこの値であるような抽選をする。

    このモンスターの宝箱が元々設定されていないならば、アイテム抽選を行わなかったものとする。

    変数 $7E5A2A に宝箱の中身のアイテム ID をセットして、 この補助サブルーチンを終了する。

補足だが、処理中に乱数取得処理がいくつかあるが、そのほとんどはサブルーチン $C00F28 だが、アイテム確率だけは分母が大きいのでサブルーチン $C00F49 を採用している。

4.23.2.18. インパス

インパスは次のような三段構造のコマンドだ:

  • 「まじゅつしのとう」入場に関する処理
  • 宝箱またはツボの中身を判定する処理
  • 所持品を一つ鑑定する処理

「まじゅつしのとう」入場に関する処理はサブルーチン $C7CC8E 以下に実装されており、その内容とは次のようなものだ:

  • 現在パーティーがいるのが「まじゅつしのとう」玄関外部 (ID: #$024D) でなければ抜ける。
  • パーティーの先頭メンバーが入口の扉の前面に、扉の方を向いているかどうかを調べ、 かつ扉がまだ閉まっているかどうかを調べる。いずれかの条件が成り立っていなければ抜ける。
  • この扉を開く。
  • ルーラフラグ列内「まじゅつしのとう」のビットをセットする。 これにはサブルーチン $C6DE8A を呼び出すことで達成する。

この扉を開ける処理がなされると、インパスのコマンド処理が終了する。 そうでなければ、以下の処理へ進む。

宝箱またはツボの中身を判定する処理はサブルーチン $C7CCEF 以下で実装されている。次のようになっている:

  • パーティーの先頭メンバーの正面に宝箱またはツボが置いてあるかどうかを調べる。 具体的には、その対象に対応する「しらべる」メッセージ構造体配列の添字の値を見て、 それが宝箱なのかツボなのかを判定する。 対象が宝箱とツボのいずれでもなければ抜ける。
  • とうぞくのはなやレミラーマの要領で、対象の中身が収拾済みかどうかを確認する。 また、中身が未回収ならばアイテム、ゴールド、罠の種別に応じて色を決める。

このサブルーチン呼び出しにより、インパスが宝箱またはツボに反応する可能性があるかどうかがわかる。 コマンドハンドラー側ではこの戻り値によって、選択ウィンドウ「たからばこ アイテム」や 「ツボ アイテム」ウィンドウを表示するかどうかを決める。

  • ここでキャンセルされた場合は、コマンド自体をキャンセル扱いで終了する。
  • プレイヤーが「たからばこ」と「ツボ」のどちらかを選択すると、下の表に示した色に応じて #$16AE から #$16B4 のいずれかの固定メッセージを表示してコマンドを終了する。 「アイテム」を選択すると、次に述べる鑑定処理を実行する。

表 4.111 インパスにおける色と内容の対応

内容
0 からっぽ 回収済みにつき空
1 品物
2 ゴールド
3


最後に所持品の鑑定となる:

  • ウィンドウ #$00CB を表示して、 鑑定する品物を所持するパーティーメンバーまたは「ふくろ」のいずれかをプレイヤーに選択させる。 ここでキャンセルされた場合は、再び宝箱・ツボチェックまで戻る。
  • パーティーメンバーが選択されると、所持品があるのかどうかを調べる。 何も持っていなければメッセージ #$1527 を表示して コマンド入力を一つ戻す。

    道具袋が選択されると、中身が何かあるのかどうかを調べる。 何も収納されていなければメッセージ #$1722 を表示して コマンド入力を一つ戻す。

  • 鑑定する品物が決まったら、呪文効果音を鳴らして鑑定処理を実行する:

    • サブルーチン $C4608D により、鑑定品の道具種別情報を取得する。
    • 鑑定メッセージを 2, 3 表示する。 この際にメッセージ ID を道具構造体 $C41A3D のデータから取得するが、 種別が道具か否かで出力手続きが異なる。 メッセージ出力が最も多くなるのは、鑑定品が装備可能品かつ 装備していると特殊な効用があり、さらに戦闘中に使うと何か起こるものだ。
    • 別サブルーチン呼び出しにより鑑定品の耐久性を鑑定する。 道具構造体 $C41A3D の関連メンバーを取得し、 メッセージ #$163F から #$1641 までのいずれかを表示する。
    • 装備品ならば、パーティーメンバーの誰が装備可能なのかを調べる。 具体的にはサブルーチン $C45FA6 で情報取得を、 配列 $7E3BB6 で各員の装備可能性を保持する。
    • 前処理に基いて装備可能者をメッセージで表示する。 大きく分けて三通り。 誰も装備できないならばメッセージ #$1642#$1648 を示して売値評価へ進む。 あるいは装備可能者が 6 名以上いるか否かで、メッセージ表示が異なる。 詳細は割愛する。
    • 最後に売値を評価する。 貴重品ビットのセットされた品物ならばメッセージ #$164A を、 そうでなければサブルーチン $C45F3C で売値を計算し、 メッセージ #$1649 で知らせる。

以上でコマンドを終了する。

4.23.2.19. レミラーマ

レミラーマはパーティーの近くにある怪しいものを目立たせるコマンドだ。 ハンドラーでの処理は次のようになっている:

  • サブルーチン $C7CCF4 を呼び出して、このコマンドが利用可能であるかを問い合わせる。 利用できなければメッセージ #$16D8 を出力し、 キャンセル扱いでコマンドを終了する。
  • 次にサブルーチン $C7CD10 を呼び出して、怪しいものを目立たさせる。

サブルーチン $C7CCF4 の処理は単純で、 変数 $7E5ED1 の値が #$FFFF でないことをテストするものだ。

サブルーチン $C7CD10 の処理では画面内の怪しい地点を光らせて効果音を鳴らす。 具体的な内容は説明が困難なので、明らかな処理のみ記す:

  • とうぞくのはなのアルゴリズムと同様にして、 パーティーがいる地点近辺の怪しい地点を探索する。 ただし、配列 $7E641D のテストするビットが異なる。 レミラーマの場合は最上位ビットに加えて #$0200 を見る。
  • 怪しい地点が光るときの効果音は #$00CD を用いる。 これはホイミ系と同じ効果音だ。

4.23.2.20. おもいだす・もっとおもいだす・ふかくおもいだす

おもいだす・もっとおもいだす・ふかくおもいだすの各コマンドは同一の処理 $C7CDAF に合流するので、まとめて解説する。

今まで記憶したメッセージの ID は配列 $7E3EAC に最大 32 個格納されている。 これらはこのメッセージを配列の先頭から高々規定個数分を連続してウィンドウに出力するコマンド群だ。 メッセージ数の上限はコマンドによって異なり、次のようになっている:

表 4.112 おもいだす系コマンドのメッセージ数上限

コマンド 上限
おもいだす 3
もっとおもいだす 10
ふかくおもいだす 32


この配列には値 #$FFFF が混入していることがある。 そのときにはこの値をスキップして次に行く(配列の末尾まで #$FFFF のはずだが)。 また、メッセージ内の米印文字は星印文字に置換して出力する。

この配列の中身 32 個が全て #$FFFF で埋まっている場合、 このコマンドはメッセージ #$16DB を表示して終了する。

プレイヤーがメッセージ出力中にキャンセルボタンを押した場合、 出力するメッセージが残っていてもコマンドを終了する。 また、配列内が事実上空のときにはメッセージ #$16DB を表示してコマンドを終了する。

4.23.2.21. わすれる

わすれるは、メッセージ配列 $7E3EAC の内容を対話的に削除するコマンドだ。

この配列の中身 32 個が全て #$FFFF で埋まっている場合、 このコマンドはメッセージ #$16DC を表示して終了する。

候補メッセージがあるならば、画面に「?つまえ」ウィンドウおよびメッセージ出力ウィンドウを表示する。 「?つまえ」ウィンドウは二種類あり、メッセージ個数が 1 ならば ID #$00A8 のものを用いるが、 普通は #$00A7 のものを表示する。 プレイヤーは十字キーの左右でメッセージをめくり、対象を一個決定する。

何かメッセージを決定すると、ウィンドウ #$00A6「わすれる はい・いいえ」を表示する。 プレイヤーが「はい」と答えると、サブルーチン $C6E125 を呼び出すことで、 現在表示されているメッセージをメッセージ配列 $7E3EAC から取り除き、 それ以降のメッセージ ID をすべて最近覚えた方向にシフトし、 配列の末尾に #$FFFF をセットするという一連の処理を実行する。

画面に「?つまえ」ウィンドウが表示している間にプレイヤーがキャンセルボタンを押すか、 わすれるためのメッセージ配列が空になったらコマンドを終了する。