5.11. 店屋

5.11.1. 構造に関する構成要素
5.11.1.1. 構造体 $C30900: 店屋
5.11.1.2. 店屋台詞集
5.11.2. 振る舞いに関する構成要素
5.11.2.1. サブルーチン $C3C77C: 店屋
5.11.2.2. サブルーチン $C3C7EF: かいにきた
5.11.2.3. サブルーチン $C3CB74: 購入時呪い処理
5.11.2.4. サブルーチン $C3CBBE: 売却時呪い処理
5.11.2.5. サブルーチン $C3CC21: 所持金が十分あるか判定する
5.11.2.6. サブルーチン $C3CC37: 購入代金を計算する
5.11.2.7. サブルーチン $C3CC51: 購入取引成立処理
5.11.2.8. サブルーチン $C3CCB1: うりにきた
5.11.2.9. サブルーチン $C3CE2A: 所持金の増え方を調べる
5.11.2.10. サブルーチン $C3CE5B: 売却取引成立処理
5.11.2.11. サブルーチン $C3CE93: 仲間の誰かまたはふくろにアイテムがあるか調べる

本節では武器と防具の店、道具屋、そしてよろず屋について述べる。

5.11.1. 構造に関する構成要素

店屋を表現するオブジェクト型および店員台詞集について記す。

5.11.1.1. 構造体 $C30900: 店屋

アドレス $C30900 には次の表で示すような型のオブジェクトが配列されている。 ここにあるオブジェクトそれぞれが対応する店屋のサービスを表現する。

表 5.32 構造体 $C30900

オフセット 属性
#$00 #$007F 店屋分類
#$00 #$0080 まとめ買い許可
#$01 #$00FF 商品 0
#$02 #$00FF 商品 1
#$03 #$00FF 商品 2
#$04 #$00FF 商品 3
#$05 #$00FF 商品 4
#$06 #$00FF 商品 5
#$07 #$00FF 商品 6

各属性の意味を次に記す。

店屋分類

店屋の分類とは、基本的には店員の台詞回しを決めるものだと考えてよい。

まとめ買い許可

この店屋で同一アイテムを複数個一括して買うことが可能かどうかを示すブーリアン値を取る属性だ。

商品 k (k = 0..6)

この店屋の商品のアイテム ID を値に取る属性だ。 アイテムについては 5.23 アイテム で述べる。

5.11.1.2. 店屋台詞集

アドレス $C3CA2A から各種店屋の台詞 ID が定義されている。 例えば「ようこそ」を表示するために店屋の種類ごとに 5 タイプの台詞が用意されている。 汎用台詞表示サブルーチン $C1A95A を呼び出すことで店員の台詞を表示している。

台詞配列を表にしてまとめておくと次のようになる。店屋が「武器と防具の店」の台詞例を付しておく。

表 5.33 店屋台詞集

配列 台詞例
$C3CA2A [D6]ここは 武器と防具の店だ。[AD]どんな用だい?[AC]
$C3CA34 [D6]なにを 買うかね?[AF][AC]
$C3CA3E [D6]おっと ざんねんだが[AD]お金が たりないようだ。[AF][AC]
$C3CA48 [D6][B5]だね。[AD]どうも ありがとう。[AF][AC]
$C3CA52 [D6][B5] [BB]個だね。[AD]どうも ありがとう。[AF][AC]
$C3CA5C [D6]これは 戦いのときに[AD]どうぐとして 使っても[AD]効力が あるよ。[AF][AC]
$C3CA66 [D6]だれが 持つかね?[AF][AC]
$C3CA70 [D6]おや? わるいが [C0]は[AD]それ以上 持てないみたいだ。[AD]持ちものを 整理するかい?[AC]
$C3CA7A [D6]よし! 整理したぜ。[AF][AC]
$C3CA84 [D6]おや? しかし [C0]の[AD]持ちものは 大事なものばかりで[AD]勝手に 整理できないぞ。[AF][AC]
$C3CA8E [D6]ほかの人が 持つかね?[AC]
$C3CA98 [D6]じゃあ その [C3]に[AD]いれておくぜ![AF][AC]
$C3CAA2 [D6][C0]は これを[AD]そうびできないが[AD]それでも いいかね?[AC]
$C3CAAC [D6]ここで そうび していくかい?[AC]
$C3CAB6 [D6]ほらよっ [C0]さん![AF][AC]
$C3CAC0 [D6]じゃあ [C0]の[AD]ひつぎの中に いれておくよ。[AF][AC]
$C3CACA [AC]
$C3CAD4 [D6]持ちきれなかったぶんは[AD]その[C3]に いれておくよ。[AF][AC]
$C3CADE [D6]ほかにも 買うかね?[AF][AC]
$C3CAE8 [D6]だれが 売ってくれるんだい?[AF][AC]
$C3CAF2 [D6]おや? でも [C0]は[AD]なんにも 持ってないぜ。[AF][AC]
$C3CAFC [D6]おや? その [C3]には[AD]なんにも はいってないぜ。[AF][AC]
$C3CB06 [D6]わるいが それは うちでは[AD]買いとれないなあ。[AF][AC]
$C3CB10 [D6]しかし それを 売っちまうと[AD]2度と 手に入らないかも[AD]しれないぜ。 いいのかい?[AC]
$C3CB1A [D6][B5]だね。[AD][BB]ゴールドで[AD]引きとろう。いいかい?[AC]
$C3CB24 [D6]よし! たしかに買いとったぜ。[AF][AC]
$C3CB2E [D6]それは ざんねんだな。[AF][AC]
$C3CB38 [D6]おっと! 買いとりたいが[AD]それ以上 お金を[AD]持てないみたいだぜっ。[AF][AD]売るまえに うちで[AD]なにか 買っていきなよ。[AF][AC]
$C3CB42 [D6]ほかにも 売ってくれるかい?[AF][AC]
$C3CB4C [D6]ほかにも 用は あるかね?[AC]
$C3CB56 [D6]また 来てくれよなっ![AC]
$C3CB60 [D6]わっ びっくりした! その[AD][B5]は 呪いで[AD]はずれないようだぜ。[AF][AD]しょうがないなあ… とりあえず[AD]受けとっておくれよ。[AC]
$C3CB6A [D6]うわっと! こいつは おどろいた![AD]買いとりたいのは やまやまだが[AD]呪いで はずれないようだぜ。[AF][AC]

5.11.2. 振る舞いに関する構成要素

店屋の処理を細かく分解すると、パーティーの所持金の変更、仲間キャラクターの持ち物状態の変更、 仲間キャラクターの状態テスト等、総合的な機能を有したサブルーチンの合成物の様相を呈している。

5.11.2.1. サブルーチン $C3C77C: 店屋

店屋共通処理サブルーチンは $C3C77C に定義されている。 武器と防具の店、道具屋、よろず屋の処理を一手に引き受ける。 ポイントは次のとおりだ。

  • 最初に与えられた店屋 ID から店屋オブジェクトを読み込み、適宜メモリーにセットする。 ちなみに店屋 ID は $7E3538#$003F 部分に保存される。

  • 店員の挨拶を表示した後、サービス選択メニューを表示する。 ここで「やめる」を選択すると、お別れの挨拶をして店屋処理全体が終了する。 それ以外については、各サービスの処理を終えた後、店員が他の用事の有無を尋ね、再度選択メニューを表示する。

5.11.2.2. サブルーチン $C3C7EF: かいにきた

サブルーチン $C3C7EF は店屋サービスの「かいにきた」を選択した場合の処理だ。 この処理は特に複雑なので、重要なポイントに絞って解説する。

  • まとめ買い可能な店かどうかで、メニューウィンドウの仕様が若干異なる。

  • 購入品が戦闘中に使うことで効果があるかどうかで店員の台詞が加わるかどうかの判定は、 対象アイテムオブジェクトの戦闘モードコマンド属性値の判定による。 この属性については 5.23.1 構造に関する構成要素 で解説する。

  • 受取人の所持品が満杯のときには店員が整理するオプションが与えられる。 ここで、整理後も道具袋が満杯のままであれば、そのときには専用の台詞が表示される。

  • 受取人の装備品を更新する際に、現在の装備品が呪われている状況かどうかを判定する。

5.11.2.3. サブルーチン $C3CB74: 購入時呪い処理

サブルーチン $C3CB74 は、 装備するための品物を買い、同時に装備させてもらおうとしたが、今装備しているものが呪われているときの処理だ。 ポイントは次のとおりだ。

  • 購入したアイテムと同じアイテム分類である対象キャラクターの装備アイテムを参照する。

  • 装備アイテムがある場合に限り、そのアイテムの呪い属性値を判定する。

  • 呪い属性値が 1 のときに限り、効果音 #$002A を再生する。 さらに店員の台詞集の中から、この状況用のそれをメッセージウィンドウに表示する。

5.11.2.4. サブルーチン $C3CBBE: 売却時呪い処理

サブルーチン $C3CBBE は持ち物を売ろうとするときに呼び出される。 ポイントは次のとおりだ。

  • 売却対象アイテムがふくろにある場合には以下の処理を行わない。

  • 売却対象アイテムの分類を参照し、所有キャラクターの装備品からその分類値と一致するものを検索する。 装備していない場合には以下の処理を行わない。

  • 対象アイテムの呪い属性値を判定する。呪い属性値が 1 でない場合には以下の処理を行わない。

  • 効果音 #$002A を再生する。

  • 店員の台詞集の中から、この状況用のそれをメッセージウィンドウに表示する。

5.11.2.5. サブルーチン $C3CC21: 所持金が十分あるか判定する

サブルーチン $C3CC21 は、店屋で品物を買うことが決まった直後の処理であり、 所持金が足りるかを調べる。

後述のサブルーチン $C3CC37 で計上した金額がパーティーの所持金以下であることを判定する過程で、 既にパーティーの所持金が減額されてしまっている。 それを汎用所持金加算サブルーチン $C45B1A を呼び出すことで埋め合わせるというものだ。

5.11.2.6. サブルーチン $C3CC37: 購入代金を計算する

サブルーチン $C3CC37 は購入代金を計算して、パーティーの所持金から引いてみるというものだ。 乗算には汎用乗算サブルーチンを用いる。

「パーティーの所持金から引いてみる」と書いたが、成功した場合だけ所持金が減るようになっている。 それゆえ、呼び出し元の状況次第で再度ゴールドを埋め合わせる必要が生じることもある。

5.11.2.7. サブルーチン $C3CC51: 購入取引成立処理

サブルーチン $C3CC51 は「かいにきた」一回分のトランザクションだ。 要点を以下に列挙する。

  • 購入品が「おうじゃのけん」である場合には特別な処理をする。 すなわち、おうじゃのけん入手フラグをセットし、現在の店屋 ID を #$0023 に上書きして対応する店屋オブジェクトを読み込む。

  • 購入代金を計算する。5.11.2.6 サブルーチン $C3CC37: 購入代金を計算する で述べた処理を利用する。

  • 受け取り対象がキャラクターの場合、対象者の道具袋に購入品を購入数分だけ反復して追加していく。 道具袋が満杯になったら、余りをパーティー共有のふくろに回す。

  • 受け取り対象がふくろの場合にも、購入品を購入数分だけ反復して追加していく。 こちらの場合はストックが溢れても構わないものとする。

5.11.2.8. サブルーチン $C3CCB1: うりにきた

サブルーチン $C3CCB1 は「うりにきた」を選択した場合の処理だ。 この処理は特に複雑なので、重要なポイントに絞って解説する。

  • 売却品のアイテムオブジェクトの属性を参照することで、 それが処分禁止か貴重品かそれ以外かを同時に判定する。 アイテムが処分禁止ならば、それが「オリハルコン」であり、 なおかつ店屋分類が 8 であれば通常品扱いをするという特殊処理が入る。 アイテムが貴重品ならば、店員が確認の台詞を言うようになる。

  • 所持金と買取額の和が 1,000,000 以上になる場合には、この取引は成立しない。

  • アイテム売却後、店員が他にも売り物はあるかを尋ねる条件がある。 その条件とは「パーティーの誰かの道具袋または共有のふくろにアイテムが存在する」かつ 「パーティーの所持金が 999,999 ゴールド未満である」だ。

5.11.2.9. サブルーチン $C3CE2A: 所持金の増え方を調べる

サブルーチン $C3CE2A は、パーティの所持金に指定金額を加算すると、 それがいくらになるのかを調べる処理だ。 加算結果が 1,000,000 ゴールド以上になるかどうかをも調べる。

5.11.2.10. サブルーチン $C3CE5B: 売却取引成立処理

サブルーチン $C3CE5B は「うりにきた」一回分のトランザクションだ。 要点を以下に列挙する。

  • 先に対象アイテムの売却額をパーティーの所持金に加算する。

  • 所有者がキャラクターならばその者の道具袋から、パーティー共有のふくろならば、ふくろから対象アイテムを一つ取り除く。

5.11.2.11. サブルーチン $C3CE93: 仲間の誰かまたはふくろにアイテムがあるか調べる

サブルーチン $C3CE93 は、パーティーが何らかのアイテムを一つでも所有しているかどうかを判定するためにある。 処理の概略は以下のようになっている。

  • 先にパーティーキャラクターの所持品を勘定する。後列の者から検索対象となる。

  • この時点でアイテムが何もなければ、ふくろを先頭から調べる。有効アイテムを発見すれば検索を終了する。