4.6. 店屋

4.6.1. データ
4.6.1.1. 構造体 $C58B93: 店屋
4.6.1.2. 配列 $C5FD18: 店屋台詞セット
4.6.2. 処理手順
4.6.2.1. やめる
4.6.2.2. かいにきた
4.6.2.3. ほかにも用は
4.6.2.4. うりにきた

本節では各地の武器屋、防具屋、道具屋、よろず屋を表現するデータ構造および店員との商品売買処理について記す。 なお、本章を通じて、武器屋、防具屋、道具屋、よろず屋を一般化した概念を店屋という単語で総称する。

4.6.1. データ

各地の店屋を表現するデータ構造を示す。

4.6.1.1. 構造体 $C58B93: 店屋

アドレス $C58B93 にある配列要素のそれぞれが対応する店屋オブジェクトを表現する。 以下に示すメモリレイアウトの 8 バイト長のオブジェクトが 80 弱配列されている:

表 4.30 構造体 $C58B93

オフセット 属性
#$00 #$FFFF 店屋分類
#$02 #$00FF 商品 0
#$03 #$00FF 商品 1
#$04 #$00FF 商品 2
#$05 #$00FF 商品 3
#$06 #$00FF 商品 4
#$07 #$00FF 商品 5

各属性の意味は次のとおり:

店屋分類

店屋分類とは、このオブジェクトがどの種類の店なのかを示す値、いわば分類コードを取る属性だ。 この属性値は店屋の台詞回しを指定するために参照される。 値と意味との対応は次のとおりだ:

表 4.31 店屋分類

分類
0 (n/a)
1 武器屋
2 防具屋
3 道具屋
4 よろず屋
5 カジノ景品交換所

商品 k (k = 0..5)

商品とは、このオブジェクトが商う品物のアイテム ID を値に取る属性だ。 メニューウィンドウにはこの順番でアイテムが列挙され、 品揃えの少ない店では値 #$00 を添字 k の大きい側に詰めてある。

4.6.1.2. 配列 $C5FD18: 店屋台詞セット

アドレス $C5FD18 には店屋分類に応じた台詞セットのアドレスが配列されている。 各台詞セットはメッセージ ID の配列として表現されている。 以下にこれらのデータを直接示す。セミコロンから右側が本書が独自に付したコメントだ:

C5/FD3B:    45FD    ; 台詞セット 1
C5/FD3D:    7BFD    ; 台詞セット 2
C5/FD3F:    B1FD    ; 台詞セット 3
C5/FD41:    E7FD    ; 台詞セット 4
C5/FD43:    1DFE    ; 台詞セット 5

C5/FD45:    4818    ; #$00: [DE]ここは 武器の店だ。[AD]どんな用だい?
C5/FD47:    6218    ; #$01: [DE]じゃあ また 来てくれよな!
C5/FD49:    4918    ; #$02: [DE]どれに するかね?[AF][D5]
C5/FD4B:    6118    ; #$03: [DE]ほかにも 用は あるかい?
C5/FD4D:    4A18    ; #$04: [DE]おっと それを買うには[AD]お金が 足りないようだ。[AF][D5]
C5/FD4F:    4B18    ; #$05: [DE][B5]だな。[AF][D5]
C5/FD51:    4D18    ; #$06: [DE]だれが 持つかね?[AF][D5]
C5/FD53:    5318    ; #$07: [DE]さっそく そうび するかい?
C5/FD55:    5418    ; #$08: [DE][B3]は [B5]を[AD]そうび させてもらった![AF][D5]
C5/FD57:    5218    ; #$09: [DE][B3]は これを[AD]そうびできないが[AD]それでも いいかね?
C5/FD59:    5618    ; #$0A: [DE]じゃあ [B3]の[AD]ひつぎの中に[AD]入れておくからな![AF][D5]
C5/FD5B:    5518    ; #$0B: [DE]ほらよ! [B3]さん![AF][D5]
C5/FD5D:    5718    ; #$0C: [DE]よし! じゃあ[AD]馬車の中の [B3]に[AD]とどけておくからな![AF][D5]
C5/FD5F:    5118    ; #$0D: [DE]じゃあ その [C3] の中に[AD]入れておくぜ![AF][D5]
C5/FD61:    4F18    ; #$0E: [DE]少し 持ちものを へらして[AD]また 来るといい。[AF][D5]
C5/FD63:    4E18    ; #$0F: [DE]ん? [B3]は[AD]それ以上 持てないようだぞ。[AF][D5]
C5/FD65:    5918    ; #$10: [DE]おや? [B3]さんは[AD]なんにも 持っていないぜ![AF][D5]
C5/FD67:    5818    ; #$11: [DE]だれが 売ってくれるんだい?[AF][D5]
C5/FD69:    5B18    ; #$12: [DE]どれを 売るんだい?[AF][D5]
C5/FD6B:    5E18    ; #$13: [DE][B5]だな。[AD][BB]ゴールドで[AD]引きとろう。いいかい?
C5/FD6D:    6018    ; #$14: [DE]それは ざんねんだな。[AF][D5]
C5/FD6F:    5F18    ; #$15: [DE]よし! たしかに買いとったぜ。[AF][D5]
C5/FD71:    5C18    ; #$16: [DE]わるいが それは うちでは[AD]買いとれないなあ。[AF][D5]
C5/FD73:    5A18    ; #$17: [DE]おや? その[C3]には[AD]なんにも はいっていないぜ![AF][D5]
C5/FD75:    5D18    ; #$18: [DE]おっと! 買いとりたいが[AD]それ以上 お金を[AD]持てないみたいだぜっ![AF][AD](...)
C5/FD77:    4C18    ; #$19: [DE]これは 戦いのときに[AD]どうぐとして つかっても[AD]効力が あるぜ![AF][D5]
C5/FD79:    5018    ; #$1A: [DE]ほかの人が 持つかね?

C5/FD7B:    6318    ; #$00: [DE]ようこそ 防具の店に。[AD]ご用は なんでしょう?
C5/FD7D:    7C18    ; #$01: [DE]ありがとうございました。[AD]また おいでくださいませ。
C5/FD7F:    6418    ; #$02: [DE]お買いあげですね。[AD]どれに なさいますか?[AF][D5]
C5/FD81:    7B18    ; #$03: [DE]ほかに なにか ございますか?
C5/FD83:    6518    ; #$04: [DE]もうしわけ ありませんが[AD]それを お買いになるには[AD]お金が たりないようです。[AF][D5]
C5/FD85:    6618    ; #$05: [DE][B5]ですね。[AD]ありがとうございます。[AF][D5]
C5/FD87:    6818    ; #$06: [DE]どなたが お持ちになりますか?[AF][D5]
C5/FD89:    6E18    ; #$07: [DE]ここで そうび なさいますか?
C5/FD8B:    5418    ; #$08: [DE][B3]は [B5]を[AD]そうび させてもらった![AF][D5]
C5/FD8D:    6D18    ; #$09: [DE][B3]さまは これを[AD]そうび できませんが[AD]よろしいですか?
C5/FD8F:    7018    ; #$0A: [DE]それでは [B3]さまの[AD]ひつぎの中に[AD]入れておきますね。[AF][D5]
C5/FD91:    6F18    ; #$0B: [DE]では [B3]さま どうぞ。[AF][D5]
C5/FD93:    7118    ; #$0C: [DE]それでは 馬車の中にいる[AD][B3]さまに[AD]おとどけしておきます。[AF][D5]
C5/FD95:    6C18    ; #$0D: [DE]では その [C3]の中に[AD]お入れしますね。[AF][D5]
C5/FD97:    6A18    ; #$0E: [DE]少し 持ちものを へらしてから[AD]また おいでください。[AF][D5]
C5/FD99:    6918    ; #$0F: [DE]しかし [B3]さまは[AD]もう 持てないようです。[AF][D5]
C5/FD9B:    7318    ; #$10: [DE]しかし [B3]さまは[AD]なにも 持っていませんが。[AF][D5]
C5/FD9D:    7218    ; #$11: [DE]どなたの物を[AD]お売りいただけますか?[AF][D5]
C5/FD9F:    7518    ; #$12: [DE]どの品物を[AD]お売りいただけますか?[AF][D5]
C5/FDA1:    7818    ; #$13: [DE][B5]で[AD]ございますね。[AF][AD]それなら[AD][BB]ゴールドで[AD]お引きとり いたしますが?
C5/FDA3:    7A18    ; #$14: [DE]そうですか。[AD]それは ざんねんです……。[AF][D5]
C5/FDA5:    7918    ; #$15: [DE]どうも ありがとうございます。[AF][D5]
C5/FDA7:    7618    ; #$16: [DE]もうしわけありませんが[AD]そのような 貴重な物は[AD]お引きとりできません。[AF][AD](...)
C5/FDA9:    7418    ; #$17: [DE]しかし [C3]の中は[AD]からっぽで ございますが。[AF][D5]
C5/FDAB:    7718    ; #$18: [DE]おや? お金を わたそうにも[AD][C9]さまは それ以上[AD]持てないようです。[AF][AD](...)
C5/FDAD:    6718    ; #$19: [DE]これは 戦いのときに[AD]どうぐとして つかっても[AD]効力が ございますよ。[AF][D5]
C5/FDAF:    6B18    ; #$1A: [DE]ほかの人が 持ちますか?

C5/FDB1:    7D18    ; #$00: [DE]はい いらっしゃい![AD]ここは どうぐの店。[AD]どんな ご用でしょう?
C5/FDB3:    9618    ; #$01: [DE]ありがとうございました。[AD]今後とも ごひいきに!
C5/FDB5:    7E18    ; #$02: [DE]お買いあげですね。[AD]なにに いたしましょう?[AF][D5]
C5/FDB7:    9518    ; #$03: [DE]ほかに ご用は?
C5/FDB9:    7F18    ; #$04: [DE]おや お金が たりませんよ。[AF][D5]
C5/FDBB:    8018    ; #$05: [DE][B5]ですね。[AD]かしこまりました![AF][D5]
C5/FDBD:    8218    ; #$06: [DE]どなたが 持ちますか?[AF][D5]
C5/FDBF:    8818    ; #$07: [DE]さっそく そうびなさいますか?
C5/FDC1:    5418    ; #$08: [DE][B3]は [B5]を[AD]そうび させてもらった![AF][D5]
C5/FDC3:    8718    ; #$09: [DE]おや? [B3]さんは[AD]これを そうびできませんが[AD]それでも よろしいですか?
C5/FDC5:    8A18    ; #$0A: [DE]では [B3]さんの[AD]ひつぎの中に[AD]入れておきますね。[AF][D5]
C5/FDC7:    8918    ; #$0B: [DE]はい どうぞ [B3]さん。[AF][D5]
C5/FDC9:    8B18    ; #$0C: [DE]では 馬車の中の[AD][B3]さんに[AD]とどけておきますね。[AF][D5]
C5/FDCB:    8618    ; #$0D: [DE]では その [C3]の中に[AD]入れておきますね。[AF][D5]
C5/FDCD:    8418    ; #$0E: [DE]もち物を へらしてから[AD]また 買ってくださいね。[AF][D5]
C5/FDCF:    8318    ; #$0F: [DE]おやおや [B3]さんは[AD]もち物が いっぱいですよ。[AF][D5]
C5/FDD1:    8D18    ; #$10: [DE]え? [B3]さんは[AD]なにも 持ってませんが。[AF][D5]
C5/FDD3:    8C18    ; #$11: [DE]どなたが 売ってくれますか?[AF][D5]
C5/FDD5:    8F18    ; #$12: [DE]どの品物を 売りますか?[AF][D5]
C5/FDD7:    9218    ; #$13: [DE]ええと [B5]なら[AD][BB]ゴールドで[AD]買いとりますが いいですか?
C5/FDD9:    9418    ; #$14: [DE]そうですか。[AD]それは ざんねんです。[AF][D5]
C5/FDDB:    9318    ; #$15: [DE]売って いただけますか。[AD]まいど どうも![AF][D5]
C5/FDDD:    9018    ; #$16: [DE]お客さん それは[AD]売ってしまわないほうが[AD]いいと思いますよ。[AF][D5]
C5/FDDF:    8E18    ; #$17: [DE]え? その[C3]の中は[AD]からっぽ みたいですよ。[AF][D5]
C5/FDE1:    9118    ; #$18: [DE]あれれ? お客さん。[AD]しかし それ以上 お金を[AD]持てないみたいですよ。[AF][AD](...)
C5/FDE3:    8118    ; #$19: [DE]これは 戦いのときに[AD]どうぐとして つかっても[AD]おトクな 品物ですよ。[AF][D5]
C5/FDE5:    8518    ; #$1A: [DE]ほかの人が 持ちますか?

C5/FDE7:    9718    ; #$00: [DE]いらっしゃい。[AD]ここは よろず屋じゃよ。
C5/FDE9:    AF18    ; #$01: [DE]それじゃ また いつでも[AD]きがるに 来るがええぞ。
C5/FDEB:    9818    ; #$02: [DE]さあて どの品物を[AD]買ってくれるのかの?[AF][D5]
C5/FDED:    AE18    ; #$03: [DE]ほかにも なにか[AD]用は あるかの?
C5/FDEF:    9918    ; #$04: [DE]ありゃ?[AD]それを 買うには お金が[AD]ちと 足らないようじゃよ。[AF][D5]
C5/FDF1:    9A18    ; #$05: [DE][B5]じゃな。[AD]ありがたいことじゃ。[AF][D5]
C5/FDF3:    9C18    ; #$06: [DE]だれが 持つんじゃ?[AF][D5]
C5/FDF5:    A218    ; #$07: [DE]それじゃ さっそく[AD]装備してみるかの?
C5/FDF7:    5418    ; #$08: [DE][B3]は [B5]を[AD]そうび させてもらった![AF][D5]
C5/FDF9:    A118    ; #$09: [DE][B3]は これを[AD]装備することが できんが[AD]そんでも ええんじゃな?
C5/FDFB:    A418    ; #$0A: [DE]それじゃ [B3]の[AD]ひつぎの中に 入れておくぞ。[AF][D5]
C5/FDFD:    A318    ; #$0B: [DE]ほれっ [B3]![AF][D5]
C5/FDFF:    A518    ; #$0C: [DE]それじゃ 馬車の中にいる[AD][B3]に とどけておくぞ。[AF][D5]
C5/FE01:    A018    ; #$0D: [DE]それじゃ その [C3]の中に[AD]入れておくぞよ。[AF][D5]
C5/FE03:    9E18    ; #$0E: [DE]少し 持ち物を へらしてから[AD]また 来るとええ。[AF][D5]
C5/FE05:    9D18    ; #$0F: [DE]そんなこと いっても[AD][B3]は それ以上[AD]持てやせんぞ。[AF][D5]
C5/FE07:    A718    ; #$10: [DE]ありゃ? [B3]は[AD]なにも 持ってないぞよ。[AF][D5]
C5/FE09:    A618    ; #$11: [DE]だれが 売ってくれるんじゃ?[AF][D5]
C5/FE0B:    A918    ; #$12: [DE]どれを 売ってくれるんじゃ?[AF][D5]
C5/FE0D:    AB18    ; #$13: [DE]はいよ。[AD][B5]じゃな。[AF][AD]それじゃったら[AD][BB]ゴールドで[AD]引きとるが どうじゃ?
C5/FE0F:    AD18    ; #$14: [DE]それは ざんねんじゃのう。[AF][D5]
C5/FE11:    AC18    ; #$15: [DE]ふむ ありがたいことじゃ。[AF][D5]
C5/FE13:    AA18    ; #$16: [DE]うーむ。わるいが[AD]そいつは 引きとれないぞよ。[AF][D5]
C5/FE15:    A818    ; #$17: [DE]ありゃ? その [C3]には[AD]なにも 入ってないようじゃ。[AF][D5]
C5/FE17:    B018    ; #$18: [DE]ありゃ? 引きとろうにも[AD][B3]は お金が いっぱいで[AD]もう 持てないようじゃ。[AF][AD](...)
C5/FE19:    9B18    ; #$19: [DE]この品は 戦いの時に[AD]道具として つかっても[AD]やくに立つ すぐれもんじゃぞ。[AF][D5]
C5/FE1B:    9F18    ; #$1A: [DE]だれか ほかの人が 持つかの?

C5/FE1D:    7D18    ; #$00: [DE]はい いらっしゃい![AD]ここは どうぐの店。[AD]どんな ご用でしょう?
C5/FE1F:    9618    ; #$01: [DE]ありがとうございました。[AD]今後とも ごひいきに!
C5/FE21:    9919    ; #$02: [DE]どれと こうかん しますか?[AF]
C5/FE23:    9518    ; #$03: [DE]ほかに ご用は?
C5/FE25:    9B19    ; #$04: [B5]と[AD]こうかん するには[AD]コインが たりないようです。[AF]
C5/FE27:    9A19    ; #$05: [DE][B5] ですね?[AD]それで いいですか?[AF]
C5/FE29:    8218    ; #$06: [DE]どなたが 持ちますか?[AF][D5]
C5/FE2B:    8818    ; #$07: [DE]さっそく そうびなさいますか?
C5/FE2D:    5418    ; #$08: [DE][B3]は [B5]を[AD]そうび させてもらった![AF][D5]
C5/FE2F:    8718    ; #$09: [DE]おや? [B3]さんは[AD]これを そうびできませんが[AD]それでも よろしいですか?
C5/FE31:    8A18    ; #$0A: [DE]では [B3]さんの[AD]ひつぎの中に[AD]入れておきますね。[AF][D5]
C5/FE33:    8918    ; #$0B: [DE]はい どうぞ [B3]さん。[AF][D5]
C5/FE35:    8B18    ; #$0C: [DE]では 馬車の中の[AD][B3]さんに[AD]とどけておきますね。[AF][D5]
C5/FE37:    8618    ; #$0D: [DE]では その [C3]の中に[AD]入れておきますね。[AF][D5]
C5/FE39:    8418    ; #$0E: [DE]もち物を へらしてから[AD]また 買ってくださいね。[AF][D5]
C5/FE3B:    8318    ; #$0F: [DE]おやおや [B3]さんは[AD]もち物が いっぱいですよ。[AF][D5]
C5/FE3D:    8D18    ; #$10: [DE]え? [B3]さんは[AD]なにも 持ってませんが。[AF][D5]
C5/FE3F:    8C18    ; #$11: [DE]どなたが 売ってくれますか?[AF][D5]
C5/FE41:    8F18    ; #$12: [DE]どの品物を 売りますか?[AF][D5]
C5/FE43:    9218    ; #$13: [DE]ええと [B5]なら[AD][BB]ゴールドで[AD]買いとりますが いいですか?
C5/FE45:    9418    ; #$14: [DE]そうですか。[AD]それは ざんねんです。[AF][D5]
C5/FE47:    9318    ; #$15: [DE]売って いただけますか。[AD]まいど どうも![AF][D5]
C5/FE49:    9018    ; #$16: [DE]お客さん それは[AD]売ってしまわないほうが[AD]いいと思いますよ。[AF][D5]
C5/FE4B:    8E18    ; #$17: [DE]え? その[C3]の中は[AD]からっぽ みたいですよ。[AF][D5]
C5/FE4D:    9118    ; #$18: [DE]あれれ? お客さん。[AD]しかし それ以上 お金を[AD]持てないみたいですよ。[AF][AD](...)
C5/FE4F:    8118    ; #$19: [DE]これは 戦いのときに[AD]どうぐとして つかっても[AD]おトクな 品物ですよ。[AF][D5]
C5/FE51:    8518    ; #$1A: [DE]ほかの人が 持ちますか?

4.6.2. 処理手順

各地の店屋において展開される商品売買に共通する処理手順を説明する。 サブルーチン $C5F5BE が店屋のすべてに共通する処理を表す。 すべてを解説するのは煩雑になるので、要点のみを列挙する:

  • 最初に店屋がカジノかどうかで分岐する。 カジノならばコイン枚数判定と景品交換の意志を確認してから、 後述のどれにする?手順にジャンプする。 それ以外の店屋ならば挨拶の直後にかいにきた手順にジャンプする。

  • 店屋メニュー表示手順。 「かいにきた」「うりにきた」「やめる」からなるメニューを表示する。 プレイヤーが選択する項目に対応する処理手順にジャンプする。

4.6.2.1. やめる

店員が挨拶をして店屋処理全体を終了する。

4.6.2.2. かいにきた

  • 品物メニュー表示手順。 店員の台詞の後、品物メニューを表示する。 このメニューは店屋カジノかどうかで画面に出力する額面の決め方が異なる。 カジノならばアイテム構造体のカジノコイン枚数属性値を参照し、 そうでなければ価格属性値を参照する。

  • 品物を選択すると、所持ゴールドまたはコインが十分かを判定する。 不足ならば店員の台詞の後にほかにも用は処理にジャンプする。

  • アイテムの性質によって店員の台詞が増える。 戦闘時つかえるか、何もないか、道具かという順序で判定する。 この判定にはアイテム構造体のインパスメッセージ属性値を参照する。

  • こちらのパーティーが一人しかいず、かつふくろもないような状態であるか判定する。 もしそのようならば、所持品満杯のキャラクターに受け取らせようとしたときの手順にジャンプする。

  • 所持品満杯のキャラクターに受け取らせようとしたときには、 パーティー人数が複数いれば店員が他の人にするかと言うが、 そうでない場合はふくろの有無を確認する。ふくろもない場合は所持品を減らしてから来るように店員が言う。

  • 受け渡しでは、アイテムが装備品かどうかをまず判定し、 次にアイテムの受け渡し人に対する装備可能性を判定する。 装備可能性により、店員の台詞が異なる。

  • 装備が発生しない受け渡しでは、受取人が死亡状態であるかどうか、 受取人が馬車にいるかどうかの順に判定し、それに応じて店員の台詞が異なる。

  • どの場合においても、所持品リストの更新が終わった後に所持ゴールドまたはコインの残高を更新する。 装備させてもらうときは、残高更新の後にそれを実施する。 所持金の減算更新にはサブルーチン $C42895 を、 カジノコインの減算更新にはサブルーチン $C42A50 をそれぞれ実行する。

  • 装備させてもらうと、キャラクターの属性値の変動量のうち、かっこよさしかメッセージとして表示されない。

4.6.2.3. ほかにも用は

カジノの場合にはカジノの処理にジャンプし、 それ以外店屋の場合には店員の台詞を表示してから店屋メニュー表示手順にジャンプする。

4.6.2.4. うりにきた

  • 最初にこちらのパーティーが一人しかいず、かつふくろもないような状態であるか判定する。 もしそうならば、そのメンバーの所持品が何かあるか判定する。 何かあればどれを売る処理手順にジャンプし、そうでなければ店員の台詞を表示する。

  • だれが売る?手順。 ふくろか否かで分岐する。

  • どれを売る?手順。 キャラクターの所持品を売るのか、ふくろの中身を売るのかでコードが別になっている。 キャラクターの場合には装備解除を考慮するといった違いはあるものの、構造は同じなのでまとめて説明する。

  • アイテムの処分可能属性値が 1 でなければ、店屋は物を買い取らない。

  • アイテムの売却額はサブルーチン $C45F3C の呼び出しで求める。 値は価格の 3/4 なのだが、複数バイトにわたる値なので汎用の乗算ルーチンを利用する。

  • 店員が金額を提示した直後に、パーティーの現在の所持金が 999,999 ゴールドであるかどうかを判定する。 もしそうならば、店員側から買い取りを取り消してくる。 この金額より少しでも低ければ売れるのだが、オーバーフロー分の金額は失われる。

  • 取引が成立すると、ふくろまたはキャラクターからアイテムを取り除き、それから所持金を更新する。 所持金の加算更新処理にはサブルーチン $C42862 を用いる。

  • 売った直後、ふくろまたはキャラクターにアイテムがまだ残っていれば、 それぞれの対応するどれを売る?手順に戻る。 そうでなければほかにも用は?手順に戻る。