5.21. 予想屋解析

5.21.1. 解析
5.21.1.1. 予想屋共通処理サブルーチン
5.21.1.2. 予想モンスターの名前を調べるサブルーチン

格闘場に必ず併設されている予想屋。 本節では、その共通処理サブルーチンの解析を行う。

先に結論を述べると、実際に予想をしているのは彼らではなく、 格闘場マッチメイクを実装するサブルーチンだ。 つまり、予想屋に話しかける前にその予想が既に決まっているのだ。 格闘場のフロアに入場する際の処理でマッチメイクがなされるわけだが、 出場モンスターを決めるついでに、予想勝ちモンスターの出場番号も同時に決めているのだ。 これは5.19 格闘場マッチメイク解析で詳しく解析を行う。

5.21.1. 解析

世界各地の格闘場にいる予想屋に「はなす」と呼び出されるサブルーチンは共通して $C3EFBE を呼び出す。 予想屋の話す台詞は、 メッセージ ID 2 バイト値を引数として渡すサブルーチン $C1A92E でウィンドウに表示するようなので、 逆アセンブルコードを解読する際には、これらの呼び出しの合間を読むようにする。

5.21.1.1. 予想屋共通処理サブルーチン

サブルーチン $C3EFBE は、アレフガルドに朝が来たなどの特殊なイベント中でない限りは、 予想屋に「はなす」となされる処理だ。

  • 予想屋がメッセージ (ID: #$0618) の台詞 「次の試合の予想がたったの5ゴールド! お聞きになりますか?」を言う。

  • はい・いいえウィンドウを表示して、プレイヤーの入力を待つ。

    • プレイヤーが「いいえ」と答えたか、もしくはキャンセルボタンを押したとき、 プログラム制御を【予想を聞かない】へ移す。

    • プレイヤーが「はい」と答えたとき、次の処理へ進む。

  • A レジスタと X レジスタに #$0005#$0000 をそれぞれロードしてから、 汎用サブルーチン $C45B66 を呼び出す。 すなわちパーティの所持金から 5 だけ減らそうとする。

    • もし処理に失敗した場合、つまりパーティの所持金が 5 に満たないときは、 制御を【予想を聞かない】へ移す。

    • それ以外の場合は、次へ進む。

  • X レジスタに $3378 の値をロード、 それから A レジスタに $2000,X の値をロードする。 さらにサブルーチン $F022 を呼び出すことで、 次の予想屋の台詞に出てくるモンスター名を決定する。

    既に $3378 には予想勝ちモンスターの出場番号がセットされている。 マッチメイクのついでにセットされたものだ。

  • 予想屋がメッセージ (ID: #$0619) の台詞 「よろしい! では予想をお聞かせしましょう! 次はズバリ~」 を言う。

  • 【終了】へ制御を進める。

  • 【予想を聞かない】

    • 予想屋がメッセージ (ID: #$061A) の台詞 「おや? たった5ゴールドすらはらえない?」 を言う。

    • そのまま【終了】へ制御を進める。

  • 【終了】

    • サブルーチンを終了し、呼び出し元に制御を戻す。

5.21.1.2. 予想モンスターの名前を調べるサブルーチン

サブルーチン $F022 は、予想屋が予想を言うときのモンスター名の表記をどうするのかを決める。 同種のモンスターが複数エントリーしているときにのみ、このサブルーチンが意味を持つ。 例えば、おおありくいが 4 匹からなるようなマッチメイクがなされているとする。 このとき、どのおおありくいを予想しているのかを識別する目的で、 モンスター名「おおありくい」に suffix を付与するのだ。

  • 【事前条件】

    • X レジスタは、勝ちモンスターのエントリー番号を表す。

    • A レジスタは、勝ちモンスターのモンスター構造体 ID を表す。

  • $338C, $338EA レジスタが表すモンスターの登場匹数カウンターとして用いる。

  • 予想モンスターと同種のものが自身も含めて 2 以上出場する場合は、 LDA $C30EF5,X (where X == 予想番号 * 2) してサブルーチン呼び出し元に処理を戻す。

    構造体 $C30EF5文字列 ID 値が 4 つ並ぶ小さなものだ。 先頭から #$0314, #$0315, #$0316, #$0317 と配列されており、 その表す文字列は、それぞれ A, B, C, D だ。

  • 予想モンスターと同種のものが自分以外にいないときは、 A レジスタに #$0023 (null) をロードしてサブルーチン呼び出し元に処理を戻す。

  • 【事後条件】

    • A レジスタに勝ち予想モンスター suffix 用の文字列 ID がロードされている。