4.7. 宿屋

4.7.1. データ
4.7.1.1. 構造体 $C58E0B: 宿屋
4.7.1.2. 配列 $C7D0DD: 宿屋台詞セット
4.7.2. 処理手順

本節では宿屋のデータ構造および処理について述べる。 まず宿屋のサービスを表現するための構造体について説明する。 最後に宿屋すべてに共通する処理手順の概要を記述する。

4.7.1. データ

各地の宿屋を表現するデータ構造を説明する。

4.7.1.1. 構造体 $C58E0B: 宿屋

以下に示すメモリーレイアウトのオブジェクトがアドレス $C58E0B から 37 個配列されている。 この 4 バイト長のサイズしかないオブジェクトそれぞれが関係する宿屋のサービスを表現している。

表 4.32 構造体 $C58E0B

オフセット 属性
#$00 #$FFFF 台詞セット
#$02 #$01FF 宿代

属性それぞれの概要をいかに述べる。

台詞セット

台詞セット属性は、宿屋の台詞の集合を指定する ID 値を取る。 台詞セットはメッセージ ID を要素とするものであり、配列 $C7D0DD にそれらの集合オブジェクトのアドレスが格納されている。 この属性値は、この配列の方の ID を意味する。

データを観察すると、集合オブジェクトは 2 セットしかないことがわかる。 それぞれ、標準の宿屋とマウントスノーの宿屋に逗留している旅の剣士のそれに対応する。

宿代

宿代属性は、その宿屋に一泊するために必要なゴールドを表す数を取る。 この値にパーティーの生存者数を乗じた値が支払金額となる。

4.7.1.2. 配列 $C7D0DD: 宿屋台詞セット

宿屋の話す台詞集はメッセージ ID の配列の形式で表現されている。 その台詞セットのアドレスの配列がアドレス $C7D0DD にある。

以下に台詞セットのデータを直接示す。セミコロンから右側が本書が独自に付したコメントだ: 読者はメッセージ ID と実際のテキストとの対応を 付録 B データ に収録した移動モードテキストデータを参照すれば確認できる。

C7/D0DD:    E1D0    ; 一般の宿屋のセリフ ID セット
C7/D0DF:    EDD0    ; マウントスノーの宿屋の剣士のセリフセット

C7/D0E1:    FD18    ; #$00: [DE]ようこそ 旅の宿に。[AF]
C7/D0E3:    FE18    ; #$01: [DE]ひと晩 [BB]ゴールドですが[AD]お泊まりに なりますか?
C7/D0E6:    FF18    ; #$02: [DE]さようなら 旅の人。[AD]お気をつけて 旅を[AD]つづけられますように。
C7/D0E7:    0019    ; #$03: [DE]でも お金が[AD]たりないようですね。[AF][D5]
C7/D0E9:    0119    ; #$04: [DE]それでは ごゆっくり[AD]おやすみください。
C7/D0EB:    0219    ; #$05: [DE]おはようございます。[AD]では いってらっしゃいませ。

C7/D0ED:    3D02    ; #$00: この町の ありさまは[AD]いったい どうしたことなのだ。[AF](...)
C7/D0F0:    3E02    ; #$01: おぬしらも 泊まっていくか?[AD]宿代の [BB]ゴールドは[AD]わしが あずかっておこう。
C7/D0F2:    4202    ; #$02: そうか ならば[AD]好きに するが いい。
C7/D0F4:    4102    ; #$03: わしも タダで 泊まって[AD]いるわけでは ない。[AD]金が ないなら ダメだな。
C7/D0F6:    3F02    ; #$04: よかろう。[AD]ゆっくり 休むが いい。
C7/D0F8:    4002    ; #$05: [D4][DE][D3]たちは 目がさめた。

これらの台詞を表示するためのサブルーチンが用意されており、 宿屋の処理中では汎用のメッセージ表示サブルーチンを呼び出す代わりに、 サブルーチン $C7D0BA を用いる。 呼び出し例を示す:

C7/CF9C:    A90100      LDA #$0001          ; [DE]ひと晩 [BB]ゴールドですが[AD]お泊まりに なりますか? or おぬしらも 泊まっていくか?
C7/CF9F:    20BAD0      JSR $D0BA           ; 台詞表示

4.7.2. 処理手順

はなすオブジェクトが宿屋である場合は、その振る舞いは基本的に次のようになる:

CD/FEDE:    A22300      LDX #$0023          ; 宿屋 ID
CD/FEE1:    2221CFC7    JSR $C7CF21         ; 宿屋処理
CD/FEE5:    6B          RTL

サブルーチン $C7CF21 が宿屋共通処理を実装するコードだ。 このコードは対話的な処理を含むので、比較的長いものとなっている。 要点を以下に列挙する:

  • 宿屋の台詞表示はここでしか使わないサブルーチンでカプセル化されている。

  • 宿代計算では死んだ仲間を勘定に入れない。

  • 宿代が不足しているときの料金不足を告げた後の処理が標準と旅の剣士とで異なる。 後者はさようなら 旅の人に相当する台詞がない。

  • モンストルの宿屋 (#$0009) でのみ特殊なフラグをオンにする処理が入る。

  • 生存キャラクターのみ HP と MP を全回復する。 実装の詳細では +999 ということになる。

  • 回復の後に宿屋の効果音 (#$0025) を再生する。

  • 宿屋を正常利用することで $7E3D2D#$0002 ビットがオンになる。 このフラグが結局のところ何に参照されるのかは不明だ。