5.23. メダルおじさん

5.23.1. 構造に関する構成要素
5.23.1.1. 構造体 $C31350: メダルおじさんの景品
5.23.2. 振る舞いに関する構成要素
5.23.2.1. サブルーチン $C3F076: メダルおじさんメイン
5.23.2.2. サブルーチン $C3F199: 次の景品を調べる
5.23.2.3. サブルーチン $C3F1BD: 持参したメダルを回収する
5.23.2.4. サブルーチン $C3F21E: 報酬 ID に対してアイテムを取得する
5.23.2.5. サブルーチン $C3F239: 報酬 ID に対して必要枚数を取得する

本節ではメダルおじさんについて述べる。

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

メダルおじさんに関わるデータおよびその構造について述べる。

5.23.1.1. 構造体 $C31350: メダルおじさんの景品

アドレス $C31350 には次のオブジェクト型要素が 12 個配列されている。 これはメダルおじさんにちいさなメダルを献上した際の報酬を表現している。

表 5.48 構造体 $C31350

オフセット 属性
#$00 #$00FF 必要枚数
#$01 #$00FF 景品

属性の意味を以下に記す。

必要枚数

メダルおじさんが報酬をよこすのに必要となるちいさなメダルの枚数を値に取る属性だ。 配列 $C31350 の要素群はこの属性値をキーとして昇順にソートされている。

景品

景品を表すアイテム ID を値に取る属性だ。

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

メダルおじさんの振る舞いについて述べる。

5.23.2.1. サブルーチン $C3F076: メダルおじさんメイン

サブルーチン $C3F076 は、メダルおじさんに「はなす」とすぐに始まる処理だ。 以下に要点を挙げる。

  • 最初にメダルおじさんに譲渡済のメダル枚数を参照する。 アドレス $7E3538#$03FC 部分がその値だ。

  • 最終景品の枚数を確認する。 5.23.2.5 参照。

    パーティーの所持品とふくろからメダルを適宜回収する。 5.23.2.3 参照。

  • 回収したばかりの枚数分と献上済みメダル枚数の和をアドレス $7E3538#$03FC 部分に上書きする。

  • 次回報酬を参照する。 5.23.2.2 参照。 もし全ての報酬が果たされていれば、おじさんの台詞だけで本処理を終了する。

  • ここで初めておじさんの台詞が入る。

  • 献上済み枚数がゼロの場合は初回説明処理のようなものをする。

  • おじさんが現在の献上済み枚数を教える。

    • 今回回収枚数がゼロの場合は、現在献上済み枚数告知まで処理をスキップする。

    • 今回回収枚数+献上済み枚数が次回報酬に必要な枚数未満ならば、 次回の報酬を予告するところまで処理をスキップする。

    • 今回回収枚数+献上済み枚数が次回報酬に必要な枚数以上ならば、 報酬アイテムをパーティーの所持品に追加する。

      受け取りメッセージの表示後、 次の報酬 ID が上限に達していない限り、 報酬と必要枚数を参照して枚数を判定する処理( 5.23.2.4 および 5.23.2.5 参照) を実行する。

      さらにパーティー所持品追加処理を実行する。 これを累計枚数が次回報酬枚数未満になるまでループする。 ループ中に全ての報酬が果たされれば、おじさんの台詞で本処理を終了する。

  • おじさんが現在の献上済み枚数を教える。

    おじさんが次回の報酬を予告する。

5.23.2.2. サブルーチン $C3F199: 次の景品を調べる

サブルーチン $C3F199 は、メダルおじさんに譲渡済みのメダル枚数を基に、 次の褒美に対応するメダル必要累積枚数と、報酬のアイテム ID を検索するコードだ。 内容はループで 5.23.2.5 で述べる処理の出力を判定するというものだ。

5.23.2.3. サブルーチン $C3F1BD: 持参したメダルを回収する

サブルーチン $C3F1BD は、持参したメダル枚数を献上枚数が 100 を超えない分だけ回収する処理だ。 以下に要点を挙げる。

  • パーティー各キャラクターの所持品からちいさなメダルを一枚ずつ回収しながら回収枚数をカウントし続ける。 このとき、カウンターと献上済み枚数の和が最終枚数 (100) 以上となれば、 その時点でこの回収枚数を呼び出し元に返す。 そうでなければ、カウンターの増加とキャラクター所持品の更新を行い反復処理を続行する。

  • 次にふくろ内のちいさなメダル枚数を参照する。 先程と同様に、ちいさなメダルを一枚ずつ回収しながら回収枚数をカウントし続ける。 このとき、カウンターと献上済み枚数の和が最終枚数以上となれば、 その時点でこの回収枚数を呼び出し元に返す。 そうでなければ、カウンターの増加とふくろのちいさなメダル枚数更新を行い反復処理を続行する。

  • 最終的なカウンターの値が、メダルおじさんの手許にあるメダル枚数を表す。

5.23.2.4. サブルーチン $C3F21E: 報酬 ID に対してアイテムを取得する

サブルーチン $C3F21E は、報酬 ID を入力として、 対応するメダルおじさん報酬オブジェクトのアイテム属性値を参照するだけの小さなコードだ。

5.23.2.5. サブルーチン $C3F239: 報酬 ID に対して必要枚数を取得する

サブルーチン $C3F239 は、報酬 ID を入力として、 対応するメダルおじさん報酬オブジェクトの必要枚数属性値を参照するだけの小さなコードだ。