5.10. 店屋解析

5.10.1. 解析
5.10.1.1. 店屋共通処理サブルーチン
5.10.1.2. 「かいにきた」処理サブルーチン
5.10.1.3. 台詞
5.10.1.4. 呪い装備中(かいにきた版)
5.10.1.5. 呪い装備中(うりにきた版)
5.10.1.6. 所持金が足りるかテスト
5.10.1.7. 購入代金を計算する
5.10.1.8. 買いトランザクション
5.10.1.9. 「うりにきた」処理サブルーチン
5.10.1.10. 所持金の増え方を調べる
5.10.1.11. 売りトランザクション
5.10.1.12. パーティまたはふくろにアイテムがあるか調べる
5.10.1.13. 店屋構造体アクセスサブルーチン

本節では武器と防具の店、道具屋、そしてよろず屋に共通する処理部のコードを解析する。 店屋の処理を細かく分解すると、パーティーの所持金の変更、仲間キャラクターの持ち物状態の変更、 仲間キャラクターの状態テスト等、総合的な機能を有したサブルーチンの合成物の様相を呈している。

5.10.1. 解析

5.10.1.1. 店屋共通処理サブルーチン

店屋共通処理サブルーチンは $C3C77C に定義されている。 武器と防具の店、道具屋、よろず屋の処理を一手に引き受ける。 これらの唯一の違いである台詞まわしの差だが、この実現方法は、 王様共通処理サブルーチンと同じだ。

サブルーチン $C3C77C の処理内容のアウトラインを以下に示す。 なお、解読していないコードや、本処理とは本質的に関係しない細部の説明は省く。

  • 【事前条件】

    • A == 店屋構造体 ID

  • $7E3538 & #$003F 部分のビットをセットするためにサブルーチン $C902E9 を呼び出す (意図不明)。

  • 店屋構造体アクセスサブルーチンを呼び出す。

  • X = $2BB2; 店屋の台詞パターン

  • 「ここは武器と防具の店だ」系統の台詞 (ID: $C3CA2A,X) を表示する。

  • 【かいにきた・うりにきた・やめる】

    用事を尋ねるウィンドウを表示して、プレイヤーの入力を待つ。

    • キャンセルボタン抜け or やめる ⇒【終了】へジャンプ

    • かいにきた ⇒【かいにきた】へジャンプ

    • うりにきた ⇒【うりにきた】へジャンプ

  • 【終了】

    • 「また来てくれよな」系統の台詞 (ID: $C3CB56,X) を表示する。

    • 呼び出し元に制御を戻す。

  • 【かいにきた】

  • 【うりにきた】

  • 【他に用は】

    • 「ほかにも用はあるかね?」系統の台詞 ($C3CB4C,X) を表示する。

    • 【かいにきた・うりにきた・やめる】へジャンプ

このサブルーチンは、プレイヤーが選択したメニュー項目次第で、 専用の補助サブルーチンに処理を委譲するということに徹している。

5.10.1.2. 「かいにきた」処理サブルーチン

サブルーチン $C3C7EF は「かいにきた」を選択した場合の処理だ。

  • 【事前条件】

    • X == 店屋の台詞タイプを表す数値

  • 「なにを買うかね?」系統の台詞 (ID: $C3CA34,X) を表示する。

  • 【かいにきた序盤】

    • サブルーチン $C3CF84 を呼び出し、$2BE2,X = #$01 (X = 0..7) とする。

    • $33BA = $33A0; 商品リストウィンドウでの選択位置

    • まとめ買い対応かどうか ($2BB8) をテストする。 このフラグにより、商品をリストするウィンドウの型が異なる。

    • 商品リストウィンドウを表示して、プレイヤーの入力を待つ。

  • 【商品選択直後】

    • サブルーチン $C32413 を呼び出す ($33B6 |= #$4000)

      • キャンセルボタン ⇒ 呼び出し元に制御を戻す。

    • $33DA = 選択した商品のリスト順序

    • $33DA = 選択した商品のアイテム ID

    • $33E2 = 選択した商品の単価(ただし 4 バイト長)

    • $33E6 = 選択した商品の購入個数

    • サブルーチン $C3CC21 を呼び出し、 所持金が十分あるかテストする。不足している場合、

      • 「おっと残念だがお金が足りないようだ」系統の台詞 (ID: $C3CA3E,X) を表示する。

      • 呼び出し元に制御を戻す。

  • 【トランザクション直後】

    • 購入個数 ($33E6) をテストする。

      • 1 でなければ、「○○○○ ×個だね。どうもありがとう」系統の台詞 (ID: $C3CA52,X) を表示する。

      • 1 ならば、「○○○○だね。どうもありがとう」系統の台詞 (ID: $C3CA48,X) を表示する。

    • A = $33DA; アイテム ID

    • アイテム種別取得サブルーチン $C44FE2 を呼び出し、 アイテム (A) の種別(武器とか装飾品とか)を取得 (A) する。

      • A == 5 ⇒【だれが持つ】へジャンプ。

    • A = $33DA; アイテム ID

    • アイテムサブルーチン $C451A3 を呼び出し、 装備可能なアイテム (A) が戦闘中に利用できるものかどうかを調べる。

      • 戦闘中の特別な利用法がなければ、【だれが持つ】へジャンプ。

    • 「これは戦いのときに道具として使っても~」系統の台詞 (ID: $C3CA5C,X) を表示する。

  • 【だれが持つ】

    • 「だれが持つかね?」系統の台詞 (ID: $C3CA66,X) を表示する。

    • $33BA = $33A4; 「だれが」ウィンドウの選択位置

    • 「だれが」ウィンドウ(と持ち物ウィンドウ)を表示して、入力を待つ。

    • サブルーチン $C32413 を呼び出す ($33B6 |= #$4000)

      • キャンセルボタン ⇒ 呼び出し元に制御を戻す。

    • $33D6 = $33A4 = $BE7D = だれウィンドウの順番

      • Overflow == 1 ⇒【ふくろに入れる】へジャンプ。

    • キャラクターの持ち物個数取得サブルーチン $C446A4 を呼び出し、 選択したキャラクター (A) の持ち物の個数を取得 (Y) する。

      • 現在の持ち物の個数が 12 より小さければ【整理直後】へジャンプ。

    • 「持ちものを整理するかい?」系統の台詞 (ID: $C3CA70,X) を表示する。

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

      • キャンセルボタン or 「いいえ」⇒【他の人が持つ】へジャンプ。

    • A = $33D6; だれ

    • サブルーチン $C3BD17 を呼び出し、選択キャラクターの装備状態に何らかの操作をする。 未調査。

    • 再びキャラクターの持ち物個数取得サブルーチン $C446A4 を呼び出し、 選択したキャラクター (A) の持ち物の個数を取得 (Y) する。

      • 持ち物の個数が 12 以上 ⇒【大事なものばかり】へジャンプ。

    • 「よし! 整理したぜ」系統の台詞 (ID: $C3CA7A,X) を表示する。

    • 【整理直後】へジャンプ。

  • 【大事なものばかり】

    • 「おや? ○○○○の持ちものは大事なものばかりで~」系統の台詞 (ID: $C3CA84,X) を表示する。

  • 【他の人が持つ】

    • 「ほかの人が持つかね?」系統の台詞 (ID: $C3CA8E,X) を表示する。

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

      • キャンセルボタン or 「いいえ」⇒ 呼び出し元に制御を戻す。

    • 【だれが持つ】へジャンプ。

  • 【ふくろに入れる】

    • サブルーチン $C3CC51 を呼び出し、 買いトランザクションを実行する。

    • 「じゃあ そのふくろにいれておくぜ」系統の台詞 (ID: $C3CA98,X) を表示する。

    • 【所持金がゼロか調べる】へジャンプ。

  • 【整理直後】

    • A = $33DA; アイテム ID

    • アイテム種別サブルーチン $C44FE2 を呼び出し、 アイテム (A) の種別を取得 (Y) する。

      • 種別が 5 ⇒【キャラクターに持たせる】へジャンプ。

    • Y = $33D6; だれ

    • キャラクターパラメータ計算サブルーチン $C44A72 を呼び出し、 キャラクター (Y) がアイテム (A) を装備するときのパラメータ変化を計算する。

      • 選択キャラクターがアイテムを装備できない場合は【装備できないが】へジャンプ。

    • 「ここで装備していくかい?」系統の台詞 (ID: $C3CAAC,X) を表示する。

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

      • キャンセルボタン or 「いいえ」⇒【キャラクターに持たせる】へジャンプ。

    • サブルーチン $CB74 を呼び出す。 選択キャラクターが呪われた装備をしているかどうかのテストだ。

      • 呪われている ⇒【装備品の変更なし】へジャンプ。

    • サブルーチン $C3CC51 を呼び出し、 買いトランザクションを実行する。 (このときの Carry ビットを憶えておく)

    • A = $33D6; だれ

    • 再びキャラクターの持ち物個数取得サブルーチン $C446A4 を呼び出し、 選択したキャラクター (A) の持ち物の個数を取得 (Y) する。

    • --Y

    • キャラクター装備品更新サブルーチン $C44C1B を呼び出し、 選択キャラクター (A) の装備品を更新する。

    • メッセージ「○○○○は××××を装備させてもらった!」(ID: #$011B) を表示する。

    • 憶えておいた Carry ビットをテストする。

      • Carry == 1 ⇒【持ちきれない分は~】へジャンプ。

    • 【所持金がゼロか調べる】へジャンプ。

  • 【装備できないが】

    • 「○○○○は これを装備できないが~?」系統の台詞 (ID: $C3CAA2,X) を表示する。

  • 【装備品の変更なし】

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

      • キャンセルボタン or 「いいえ」⇒【他にも買うかね】へジャンプ。

  • 【キャラクターに持たせる】

    • サブルーチン $C3CC51 を呼び出し、 買いトランザクションを実行する。 (このときの Carry ビットを憶えておく)

    • A = $33D6; だれ

    • キャラクターステータス取得サブルーチン $C43F87 を呼び出し、 キャラクター (A) のステータスを取得 (A) する。

    • A & #$0010 をテストし、キャラクターの生死状態を考慮する。

      • 死んでいる ⇒ 「○○○○の棺の中にいれておくよ」系統の台詞 (ID: $C3CAC0,X) を表示する。

      • 生きている ⇒ 「ほらよっ○○○○さん!」系統の台詞 (ID: $C3CAB6,X) を表示する。

    • 憶えておいた Carry ビットをテストする。

      • Carry == 0 ⇒【所持金がゼロか調べる】へジャンプ。

  • 【持ちきれない分は~】

    • 「持ちきれなかった分はその袋に~」系統の台詞 (ID: $C3CAD4,X) を表示する。

  • 【所持金がゼロか調べる】

    • 所持金サブルーチン $C45AB0 を呼び出し、 パーティの現在の所持金を取得 ($70) する。 ただし 3 バイト長で処理する。

      • $70 == #$000000 ⇒ 呼び出し元に制御を戻す。

  • 【他にも買うかね】

    • 「ほかにも買うかね?」系統の台詞 (ID: $C3CADE,X) を表示する。

    • サブルーチン $CA1F を呼び出し、 $BE6B & #$0040 != 0 かどうかをテストする (意味不明)。

      • キャンセル ⇒ 呼び出し元に制御を戻す。

    • 【かいにきた序盤】へジャンプ。

5.10.1.3. 台詞

ここで台詞処理について整理しておく。 アドレス $C3CA2A から各種店屋の台詞 ID が定義されている。 例えば「ようこそ」を表示するために店屋の種類 (X) ごとに 5 タイプの台詞が用意されている。 Opcode #$BFLDA 命令で以下のアドレスから ID 値をロードして、 台詞表示サブルーチン $C1A95A で店屋の台詞を表示している。

表 5.17 店屋台詞集

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

5.10.1.4. 呪い装備中(かいにきた版)

サブルーチン $CB74 は 「装備するための品物を買い、ついでに装備させてもらおうとしたが、 今装備しているものが呪われている」ときに呼び出される。

  • 【事前条件】

    • $33D6 == だれウィンドウの順番

    • $33DA == 購入する品物のアイテム ID

  • アイテム種別取得サブルーチン $C44FE2 を呼び出し、 アイテム (A) の種別を取得 (A) する。

  • キャラクターの装備品取得サブルーチン $C44A03 を呼び出し、 キャラクター (Y) が装備しているアイテム種別 A のアイテム ID を取得 (A) する。

    • 指定したアイテム種別のアイテムを装備していない ⇒【Carry クリア】へジャンプ。

  • アイテム呪い属性取得サブルーチンを呼び出し、 装備アイテム (A) に呪い属性があるか否かをテスト (Carry) する。

    • 呪い属性がない ⇒【Carry クリア】へジャンプ。

  • 効果音 (ID: #$002A) を鳴らし、鳴り終わるまで待つ。

  • A = $C3CB60,X; メッセージ ID

  • 台詞「わっ びっくりした! その××××は呪いで外れないようだぜ」(ID: A) を表示する。

  • Carry = 1

  • 【終了】へジャンプ。

  • Carry クリア】

    • Carry = 0

  • 【終了】

    • 呼び出し元に制御を戻す。

  • 【事後条件】

    • Carry == 1 ⇔ 呪われているため、買った品物を装備させてもらえなかった

5.10.1.5. 呪い装備中(うりにきた版)

サブルーチン $CBBE は持ち物を売ろうとするときに呼び出される。

  • 【事前条件】

    • $33D6 == だれウィンドウの順番

    • $33DA == 売りたい持ち物のアイテム ID

    • $33DC == リストウィンドウでの選択番号

  • パーティ人数取得サブルーチンを呼び出し、 パーティの人数を取得 (A) する。

    • $33D6 >= A ⇒ ふくろに入っている道具を売るものとみなし、 【Carry クリア】へジャンプ。

  • A = $33DA; 売りたい持ち物のアイテム ID

  • アイテム種別取得サブルーチン $C44FE2 を呼び出し、 アイテム (A) の種別を取得 (A) する。

  • キャラクターの装備品取得サブルーチン $C44A03 を呼び出し、 キャラクター (Y) が装備しているアイテム種別 A のアイテム ID を取得 (A) する。

    • 指定したアイテム種別のアイテムを装備していない ⇒【Carry クリア】へジャンプ。

  • アイテム呪い属性取得サブルーチンを呼び出し、 装備アイテム (A) に呪い属性があるか否かをテスト (Carry) する。

    • 呪い属性がない ⇒【Carry クリア】へジャンプ。

  • キャラクター装備アイテム数取得サブルーチン $C446D6 を呼び出し、 キャラクター (Y) の装備しているアイテムの総数 (A) を取得する。

    • A - 1 < $33DC ⇒【Carry クリア】へジャンプ。

  • 効果音 (ID: #$002A) を鳴らし、鳴り終わるまで待つ。

  • A = $C3CB6A,X; メッセージ ID

  • 台詞「買い取りたいのはやまやまだが 呪いで外れないようだぜ」(ID: A) を表示する。

  • Carry = 1

  • Carry クリア】

    • Carry = 0

  • 【終了】

    • 呼び出し元に制御を戻す。

  • 【事後条件】

    • Carry == 1 ⇔ 売ろうとした装備品が呪われているため、売れなかった

5.10.1.6. 所持金が足りるかテスト

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

  • 【事前条件】

  • サブルーチン $CC37 を呼び出し、 購入代金を計算、所持金が商品の値段以上であるか否かを調べる。

    • 所持金が不足している ⇒ Carry ビットを 0 にして、 【終了】へジャンプ。

  • 所持金加算サブルーチン $C45B1A を呼び出し、 先程のサブルーチン内部処理で減算された金額 ($70) を再び所持金に加算する。

  • Carry ビットを 1 にする

  • 【終了】

    • 呼び出し元に制御を戻す。

  • 【事後条件】

    • Carry == 1 ⇔ 所持金が間に合う

    • 所持金は変更されていない。

5.10.1.7. 購入代金を計算する

サブルーチン $CC37 は購入代金を計算する。

  • 【事前条件】

    • $33E2 == 商品価格(ただし 4 バイト長で比較する)

    • $33E6 == 購入個数

  • $70 = $33E2; 商品価格(ただし 4 バイト長でセット)

  • A = $33E6; 購入個数

  • X = #$0070; 次のサブルーチン呼び出しの中で利用する。

  • 汎用乗算サブルーチン $C01107 を呼び出し、$70 *= A を計算する。

  • ゴールド関係サブルーチン $C45B66 を呼び出し、 所持金 ($3696) から金額 $70 をマイナスにならないように引けるか調べる。

  • 呼び出し元に制御を戻す。

  • 【事後条件】

    • A == 代金の下位 2 バイト

    • Y == 代金の上位 2 バイト; ただしこの上位バイトはゼロ

    • Carry == 1 ⇔ 所持金から代金を引いても負にならない

5.10.1.8. 買いトランザクション

サブルーチン $C3CC51 は「かいにきた」一回分のトランザクションだ。

  • 【事前条件】

    • $33D6 == だれウィンドウの順番

    • $33DA == アイテム ID

    • $33E6 == 購入個数

  • 購入する品物が「おうじゃのけん」であるかどうかをテストする。 もし「おうじゃのけん」であれば、

    • フラグビットセットサブルーチン $C908F0 を呼び出し、 $7E353A 最下位ビットから #$0053 番目にあるビットをセットする。

    • A = #$0023; マイラの道具屋(「おうじゃのけん」抜き)を示す店屋構造体 ID

    • フラグビットセットサブルーチン $C902E9 を呼び出し、 $7E3538 & #$003F 部分のビットをセット (A) する。

    • 店屋構造体アクセスサブルーチンを呼び出し、 店屋データをリセット (A) する。

  • サブルーチン $CC37 を呼び出し、 購入個数と商品価格の積を求める。

  • X = $33E6; 購入個数

  • Y = $33D6; だれウィンドウの順番

  • パーティ人数取得サブルーチン $C4297C を呼び出し、 パーティにいる人数を取得 (A) する。

    • $33D6 == A ⇒【ふくろに追加】へジャンプ。

  • 【キャラクターの持ち物に追加】

    • $33DA = A; 購入アイテム ID

    • キャラクター持ち物更新サブルーチン $C44739 を呼び出し、 アイテム (A) を一個、パーティのキャラクター (Y) の持ち物配列に追加する。

      • Carry == 1 ⇒【ふくろに追加】へジャンプ。

    • --X; 購入個数をデクリメント

      • X != 0 ⇒【ふくろに追加】へジャンプ。

  • Carry = 0

  • 【終了】へジャンプ。

  • 【ふくろに追加】

    • $33DA = A; 購入アイテム ID

    • ふくろアイテム追加サブルーチン $C45399 を呼び出し、 ふくろにアイテム (A) を一個追加する。

    • --X; 購入個数をデクリメント

      • X != 0 ⇒【ふくろに追加】へジャンプ。

  • Carry = 1

  • 【終了】

    • 呼び出し元に制御を戻す。

  • 【事後条件】

    • Carry == 0 ⇔ ふくろの中身は更新しなかった

5.10.1.9. 「うりにきた」処理サブルーチン

サブルーチン $C3CCB1 は「うりにきた」を選択した場合の処理だ。

  • 【事前条件】

    • X == 店屋の台詞タイプを表す数値

  • 「だれが 売ってくれるんだい?」(ID: $C3CAE8,X) 系統の台詞を表示する。

  • 【だれがウィンドウ表示】

    • 「だれが」ウィンドウとその持ち物をリストしたウィンドウを表示して、プレイヤーの入力を待つ。

      • 「だれが」ウィンドウでキャンセルしたとき、 【だれがウィンドウをキャンセルした】へジャンプ。

    • $33D6 = A; $33A2 = A; $BE7D = A; だれウィンドウの順番

      • ふくろを選択した ⇒【ふくろを選択した】へジャンプ。

      • $2BEE != 0 ⇒【キャラクターを選択した】へジャンプ。

    • サブルーチン $C32413 を呼び出す ($33B6 |= #$4000)

    • 「でも ○○○○は何にも持ってないぜ」系統の台詞 (ID: $C3CAF2,X) を表示する。

    • 呼び出し元に制御を戻す。

  • 【だれがウィンドウをキャンセルした】

    • サブルーチン $C32413 を呼び出す ($33B6 |= #$4000)

    • 呼び出し元に制御を戻す。

  • 【キャラクターを選択した】

    • $33B8 = $33D6; だれウィンドウの順番

    • 持ち物リストウィンドウでの入力を待つ

      • キャンセル ⇒【だれがウィンドウ表示】へジャンプ。

    • $33DA = A; アイテム ID

    • $33DC = $33BE; リストウィンドウでの選択番号

    • サブルーチン $C32413 を呼び出す ($33B6 |= #$4000)

    • 【道具の希少性をテスト】へジャンプ。

  • 【ふくろを選択した】

    • $2BF0 != 0

      • 【ふくろ中身選択】へジャンプ。

    • サブルーチン $C32413 を呼び出す ($33B6 |= #$4000)

    • 「おや? そのふくろには何にも入ってないぜ」系統の台詞 (ID: $C3CAFC,X) を表示する。

    • 呼び出し元に制御を戻す。

  • 【ふくろ中身選択】

    • 持ち物リストウィンドウでの入力を待つ

      • キャンセル ⇒【だれがウィンドウ表示】へジャンプ。

    • $33DA = A; アイテム ID

    • サブルーチン $C32413 を呼び出す ($33B6 |= #$4000)

  • 【道具の希少性をテスト】

    • $BE79 = $33DA; アイテム ID

    • アイテムサブルーチン $C44F00 を呼び出し、 アイテム (A) の希少性を取得する。

      • Carry == 1 ⇒【売却不可能】へジャンプ。

      • Overflow == 0 ⇒【引き取ろう】へジャンプ。

    • 【希少品】へジャンプ。

  • 【引き取ろう】

    • A = $33DA; アイテム ID

    • アイテム売値取得サブルーチン $C44EA6 を呼び出し、 アイテム (A) の売値を取得 ($70) する。

    • $BE81 = $70; アイテム売値 (3 バイト)

    • 「○○○○だね。××××ゴールドで引きとろう」系統の台詞 (ID: $C3CB1A,X) を表示する。

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

    • キャンセルボタン or 「いいえ」⇒

      • 【残念だ】へジャンプ。

    • サブルーチン $C3CE2A を呼び出し、 所持金の増え方を調べる。

      • 所持金が上限を超えないような場合は【呪いチェック】へジャンプ。

    • 「それ以上 お金を持てないみたいだぜっ」系統の台詞 (ID: $C3CB38,X) を表示する。

    • 呼び出し元に制御を戻す。

  • 【売却不可能】

    • A == #$00B1 && X == #$0008

      • 【引き取ろう】へジャンプ。 ある店屋においては、オリハルコンを買い取らせることができる。

    • 「悪いがうちでは買いとれないなあ」系統の台詞 (ID: $C3CB06,X) を表示する。

    • 【売り終了後】へジャンプ。

  • 【呪いチェック】

    • サブルーチン $CBBE を呼び出し、 キャラクターがそのアイテムを装備していて、なおかつ呪われているかをテストする。

    • そのような場合⇒

      • 【売り終了後】へジャンプ。

    • サブルーチン $C3CE5B を呼び出す。

    • 「よし! たしかに買いとったぜ」系統の台詞 (ID: $C3CB24,X) を表示する。

    • $33DA == #$00B1

      • フラグセットサブルーチン $C908F0 を呼び出し、 $7E353E の最下位から #$009B ビット目のビットを立てる。

    • 【売り終了後】へジャンプ。

  • 【残念だ】

    • 「それは残念だな」系統の台詞 (ID: $C3CB2E,X) を表示する。

    • 【売り終了後】へジャンプ。

  • 【希少品】

    • 「しかしそれを売っちまうと2度と手に入らないかも~」系統の台詞 (ID: $C3CB10,X) を表示する。

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

    • キャンセルボタン or 「いいえ」⇒

      • 【売り終了後】へジャンプ。

    • 【引き取ろう】へジャンプ。

  • 【売り終了後】

    • サブルーチン $C3CE93 を呼び出し、 パーティが道具を持っているかどうか調べる。

      • 持っていなければ、呼び出し元に制御を戻す。

    • $70 = #$000001

    • サブルーチン $C3CE2A を呼び出し、 現在の所持金に $70 つまり 1 を加えて 1000000 G 以上になるか否かをテストする。

      • なりそうなときは、呼び出し元に制御を戻す。

    • 「ほかにも売ってくれるかい?」系統の台詞 (ID: $C3CB42,X) を表示する。

    • サブルーチン $CA1F を呼び出し、 $BE6B & #$0040 != 0 かどうかをテストする (意味不明)。

      • キャンセル ⇒ 呼び出し元に制御を戻す。

    • 【だれウィンドウ表示】へジャンプ。

5.10.1.10. 所持金の増え方を調べる

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

  • 【事前条件】

    • $70 == 加算したい金額 (2 バイト)

  • 所持金取得サブルーチン $C45AB0 を呼び出し、 パーティの所持金を取得 ($73; 4 バイト) する。

  • $73 += $70; 4 バイト

  • A = $75 & #$00FF

  • A の値を見る

    • A == #$0000 ⇒【終了】へジャンプ

    • A < #$000F ⇒【終了】へジャンプ

  • $73#$4240 を比較し、その結果を Carry ビットに残す。

  • 【終了】

    • 呼び出し元に制御を戻す。

  • 【事後条件】

    • $73 == パーティ所持金 + $70 (4 バイト)

    • Carry == 1$73 >= #000F4240 (4 バイト)

5.10.1.11. 売りトランザクション

サブルーチン $C3CE5B は「うりにきた」一回分のトランザクションだ。 二つの更新処理からなり、一つはパーティの所持金の更新で、 もう一つはキャラクターもしくはふくろのアイテムリストの更新だ。

  • 【事前条件】

    • $33D6 == だれウィンドウの順番

    • $33DA == アイテム ID

    • $33DC == リストウィンドウでの選択番号

  • X = $33DA; アイテム ID

  • アイテム売値計算サブルーチン $C44EA6 を呼び出し、 アイテム (X) の下取価格を取得 ($70) する。

  • 所持金加算サブルーチン $C45B1A を呼び出し、 基本的に、所持金 ($3696) を $70 だけ増やす。

  • パーティ人数取得サブルーチン $C4297C を呼び出し、 パーティにいる人数を取得 ($70) する。

  • $33D6 < $70

    • ふくろアイテム操作サブルーチン $C453F7 を呼び出し、 ふくろに入っているアイテム (X) の個数を 1 だけ減らす。

    • 【終了】へジャンプ。

  • A = $33D6; だれウィンドウの順番

  • X = $33DC; リストウィンドウでの選択番号

  • キャラクターアイテム操作サブルーチン $C4487F を呼び出し、 パーティにいるキャラクター (A) の持っているアイテム (X) を削除する。

  • 【終了】

    • 呼び出し元に制御を戻す。

5.10.1.12. パーティまたはふくろにアイテムがあるか調べる

サブルーチン $C3CE93 は、パーティの各キャラクターが何かアイテムを持っているか、 またはふくろの中にアイテムが入っているかどうかを調べる。 処理の概略は以下のようになっている。

  • パーティ人数取得サブルーチンを呼び出し、 パーティの人数を取得 (X) する。

  • $70 = 0; カウンターとして利用する。

  • 【パーティの持ち物の個数を数える】

    • --X; キャラクターのパーティ内での並び順

      • X < 0 ⇒【ふくろのアイテムの個数を数える】へジャンプ。

    • サブルーチン $C446A4 を呼び出し、 キャラクター (X) の持ち物の個数を取得 (A) する。

    • $70 += A; 持ち物の個数を加算

    • 【パーティの持ち物の個数を数える】へジャンプ。

  • 【ふくろのアイテムの個数を数える】

    • A = $70; パーティの持ち物の個数

    • もし A がゼロでなければ、

      • サブルーチン $C3305F を呼び出し、 ふくろにしまってある相異なるアイテムの個数を取得 ($2BF0) する。

      • $2BF0 がゼロ ⇒

        • Carry = 0

        • 【終了】へジャンプ。

    • Carry = 1

  • 【終了】

    • 呼び出し元に制御を戻す。

  • 【事後条件】

    • Carry == 1 ⇔ パーティの持ち物またはふくろの中身になんらかのアイテムがある

5.10.1.13. 店屋構造体アクセスサブルーチン

サブルーチン $C3CEC6 では、店屋の ID を与えて店屋構造体のデータを取得する。 これは、それぞれの店を特徴付ける情報を保持するものだ。 アクセス汎用サブルーチン ($C9050D, $C90717) を利用しているのがポイントだ。

  • 【事前条件】

    • A == 店屋構造体 ID

  • 【事後条件】

    • 下の表の通り:

      表 5.18 サブルーチン $C3CEC6 事後条件

      Address Value
      $2BB2 店屋の台詞パターン ID; 0,2,4,6,8 のどれか
      $2BB6 店屋の商品リスト数
      $2BB8 店屋でまとめ買いができるかどうかを示す値; 0,1 のどれか
      $2BBA 店屋の商品[0] アイテム ID
      $2BBC 店屋の商品[1] アイテム ID
      $2BBE 店屋の商品[2] アイテム ID
      $2BC0 店屋の商品[3] アイテム ID
      $2BC2 店屋の商品[4] アイテム ID
      $2BC4 店屋の商品[5] アイテム ID
      $2BC6 店屋の商品[6] アイテム ID
      $2BCA3 バイト長) 店屋の商品[0] 価格; $2BBA が非ゼロのときに限る
      $2BCD3 バイト長) 店屋の商品[1] 価格; $2BBC が非ゼロのときに限る
      $2BD03 バイト長) 店屋の商品[2] 価格; $2BBE が非ゼロのときに限る
      $2BD33 バイト長) 店屋の商品[3] 価格; $2BC0 が非ゼロのときに限る
      $2BD63 バイト長) 店屋の商品[4] 価格; $2BC2 が非ゼロのときに限る
      $2BD93 バイト長) 店屋の商品[5] 価格; $2BC4 が非ゼロのときに限る
      $2BDC3 バイト長) 店屋の商品[6] 価格; $2BC6 が非ゼロのときに限る

    • サブルーチン $C3CF84 呼び出しの事後条件