$C3C77C
: 店屋
$C3C7EF
: かいにきた
$C3CB74
: 購入時呪い処理
$C3CBBE
: 売却時呪い処理
$C3CC21
: 所持金が十分あるか判定する
$C3CC37
: 購入代金を計算する
$C3CC51
: 購入取引成立処理
$C3CCB1
: うりにきた
$C3CE2A
: 所持金の増え方を調べる
$C3CE5B
: 売却取引成立処理
$C3CE93
: 仲間の誰かまたはふくろにアイテムがあるか調べる
本節では武器と防具の店、道具屋、そしてよろず屋について述べる。
店屋を表現するオブジェクト型および店員台詞集について記す。
アドレス $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 |
各属性の意味を次に記す。
店屋の分類とは、基本的には店員の台詞回しを決めるものだと考えてよい。
この店屋で同一アイテムを複数個一括して買うことが可能かどうかを示すブーリアン値を取る属性だ。
この店屋の商品のアイテム ID を値に取る属性だ。 アイテムについては 5.23 アイテム で述べる。
アドレス $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] |
店屋の処理を細かく分解すると、パーティーの所持金の変更、仲間キャラクターの持ち物状態の変更、 仲間キャラクターの状態テスト等、総合的な機能を有したサブルーチンの合成物の様相を呈している。
店屋共通処理サブルーチンは $C3C77C
に定義されている。
武器と防具の店、道具屋、よろず屋の処理を一手に引き受ける。
ポイントは次のとおりだ。
最初に与えられた店屋 ID から店屋オブジェクトを読み込み、適宜メモリーにセットする。
ちなみに店屋 ID は $7E3538
の #$003F
部分に保存される。
店員の挨拶を表示した後、サービス選択メニューを表示する。 ここで「やめる」を選択すると、お別れの挨拶をして店屋処理全体が終了する。 それ以外については、各サービスの処理を終えた後、店員が他の用事の有無を尋ね、再度選択メニューを表示する。
サブルーチン $C3C7EF
は店屋サービスの「かいにきた」を選択した場合の処理だ。
この処理は特に複雑なので、重要なポイントに絞って解説する。
まとめ買い可能な店かどうかで、メニューウィンドウの仕様が若干異なる。
購入品が戦闘中に使うことで効果があるかどうかで店員の台詞が加わるかどうかの判定は、 対象アイテムオブジェクトの戦闘モードコマンド属性値の判定による。 この属性については 5.23.1 構造に関する構成要素 で解説する。
受取人の所持品が満杯のときには店員が整理するオプションが与えられる。 ここで、整理後も道具袋が満杯のままであれば、そのときには専用の台詞が表示される。
受取人の装備品を更新する際に、現在の装備品が呪われている状況かどうかを判定する。
サブルーチン $C3CB74
は、
装備するための品物を買い、同時に装備させてもらおうとしたが、今装備しているものが呪われているときの処理だ。
ポイントは次のとおりだ。
購入したアイテムと同じアイテム分類である対象キャラクターの装備アイテムを参照する。
装備アイテムがある場合に限り、そのアイテムの呪い属性値を判定する。
呪い属性値が 1 のときに限り、効果音 #$002A
を再生する。
さらに店員の台詞集の中から、この状況用のそれをメッセージウィンドウに表示する。
サブルーチン $C3CBBE
は持ち物を売ろうとするときに呼び出される。
ポイントは次のとおりだ。
売却対象アイテムがふくろにある場合には以下の処理を行わない。
売却対象アイテムの分類を参照し、所有キャラクターの装備品からその分類値と一致するものを検索する。 装備していない場合には以下の処理を行わない。
対象アイテムの呪い属性値を判定する。呪い属性値が 1 でない場合には以下の処理を行わない。
効果音 #$002A
を再生する。
店員の台詞集の中から、この状況用のそれをメッセージウィンドウに表示する。
サブルーチン $C3CC21
は、店屋で品物を買うことが決まった直後の処理であり、
所持金が足りるかを調べる。
後述のサブルーチン $C3CC37
で計上した金額がパーティーの所持金以下であることを判定する過程で、
既にパーティーの所持金が減額されてしまっている。
それを汎用所持金加算サブルーチン $C45B1A
を呼び出すことで埋め合わせるというものだ。
サブルーチン $C3CC37
は購入代金を計算して、パーティーの所持金から引いてみるというものだ。
乗算には汎用乗算サブルーチンを用いる。
「パーティーの所持金から引いてみる」と書いたが、成功した場合だけ所持金が減るようになっている。 それゆえ、呼び出し元の状況次第で再度ゴールドを埋め合わせる必要が生じることもある。
サブルーチン $C3CC51
は「かいにきた」一回分のトランザクションだ。
要点を以下に列挙する。
購入品が「おうじゃのけん」である場合には特別な処理をする。
すなわち、おうじゃのけん入手フラグをセットし、現在の店屋 ID を #$0023
に上書きして対応する店屋オブジェクトを読み込む。
購入代金を計算する。5.11.2.6 サブルーチン $C3CC37
: 購入代金を計算する で述べた処理を利用する。
受け取り対象がキャラクターの場合、対象者の道具袋に購入品を購入数分だけ反復して追加していく。 道具袋が満杯になったら、余りをパーティー共有のふくろに回す。
受け取り対象がふくろの場合にも、購入品を購入数分だけ反復して追加していく。 こちらの場合はストックが溢れても構わないものとする。
サブルーチン $C3CCB1
は「うりにきた」を選択した場合の処理だ。
この処理は特に複雑なので、重要なポイントに絞って解説する。
売却品のアイテムオブジェクトの属性を参照することで、 それが処分禁止か貴重品かそれ以外かを同時に判定する。 アイテムが処分禁止ならば、それが「オリハルコン」であり、 なおかつ店屋分類が 8 であれば通常品扱いをするという特殊処理が入る。 アイテムが貴重品ならば、店員が確認の台詞を言うようになる。
所持金と買取額の和が 1,000,000 以上になる場合には、この取引は成立しない。
アイテム売却後、店員が他にも売り物はあるかを尋ねる条件がある。 その条件とは「パーティーの誰かの道具袋または共有のふくろにアイテムが存在する」かつ 「パーティーの所持金が 999,999 ゴールド未満である」だ。
サブルーチン $C3CE2A
は、パーティの所持金に指定金額を加算すると、
それがいくらになるのかを調べる処理だ。
加算結果が 1,000,000
ゴールド以上になるかどうかをも調べる。
サブルーチン $C3CE5B
は「うりにきた」一回分のトランザクションだ。
要点を以下に列挙する。
先に対象アイテムの売却額をパーティーの所持金に加算する。
所有者がキャラクターならばその者の道具袋から、パーティー共有のふくろならば、ふくろから対象アイテムを一つ取り除く。