本節では各地の教会を表現するデータ構造と処理を説明する。
各地の教会を表現するデータ構造を説明する。
アドレス $C58E9F
にある配列要素のそれぞれが対応する教会オブジェクトを表現する。
6 バイト長のオブジェクトが 8 個配列されている。
表 4.33 構造体 $C58E9F
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$FFFF
|
台詞セット |
#$02
|
#$0001
|
おいのり |
#$02
|
#$00FE
|
(未使用) |
#$03
|
#$FFFF
|
処理アドレス |
#$05
|
#$00FF
|
各属性の意味は次のとおり:
台詞セット属性は、教会にいる神父等の台詞の集合を指定する ID 値を取る。
具体的に言えば、後述する配列 $C3D9F8
の添字に相当する。
おいのりはブーリアン型属性で、教会のメニューに「おいのりをする」の項目があるかどうかを示す。
教会の処理は大部分は一つのサブルーチンで実装されてはいるものの、 場所によっては若干振る舞いに差異がある。 この属性はその「差分」を実装するサブルーチンのフルアドレスを値とする。
データによると以下のようなことを表現していることがわかる:
表 4.34 処理アドレス
値 | 意味 |
---|---|
$C3D3E3
|
普通の教会処理 |
$C3D849
|
アモールの教会が掃除をしている最中 |
$C3D8C3
|
下の世界で、パーティが実体化していないとき |
$C3D910
|
マウントスノー初期状態の教会 |
教会のサービス担当者の話す台詞集(一部システムメッセージを含む)はメッセージ ID の配列の形式で表現されている。
その台詞セットのアドレスの配列がアドレス $C3D9F8
にある。
以下に台詞セットのデータを直接示す。セミコロンから右側が本書が独自に付したコメントだ: 読者はメッセージ ID と実際のテキストとの対応を 付録 B データ に収録した移動モードテキストデータを参照すれば確認できる。
C3/D9F8: FCD9 ; 台詞セット 1 のアドレス C3/D9FB: 32DA ; 台詞セット 2 のアドレス C3/D9FC: CA18 ; #$00: [DE]生きとし生けるものは(...) C3/D9FE: E418 ; #$01: [DE]おお 神よ![AD]この者[B2]に(...) C3/DA00: CB18 ; #$02: [DE]では 神のまえに[AD]これまでの(...) C3/DA02: CE18 ; #$03: [DE]なんばんの 冒険の書に[AD]記録するのじゃ? C3/DA04: D318 ; #$04: [DE]たしかに 記録しましたぞ(...) C3/DA06: D418 ; #$05: [DE]おお神よ![AD]この者[B2]に ひとときの(...) C3/DA08: CD18 ; #$06: [DE]記録しないと申されるか(...) C3/DA0A: D018 ; #$07: [DE]まだ 冒険を(...) C3/DA0C: D118 ; #$08: [DE]なんと 記録せずに(...) C3/DA0E: D218 ; #$09: [DE]では そなたの冒険が(...) C3/DA10: CC18 ; #$0A: [DE]そして この冒険の書に(...) C3/DA12: CF18 ; #$0B: [DE]そうすると [B2]LV[BB]の[AD]記録が(...) C3/DA14: D518 ; #$0C: [DE]神の声が 聞こえます。[AF][D5] C3/DA16: D618 ; #$0D: [DE][C0]よ。[AD]あと[BB]の経験で(...) C3/DA18: E318 ; #$0E: [DE]ほかに ご用は おありかな? C3/DA1A: D718 ; #$0F: [DE][C0]よ。[AD]そなたは もう(...) C3/DA1C: D818 ; #$10: [DE]どなたを 生きかえして(...) C3/DA1E: D918 ; #$11: [DE]なんと [B3]どのは(...) C3/DA20: E218 ; #$12: [DE]なんと やめると申されるか。[AF] C3/DA22: DF18 ; #$13: [DE]さすれば わが教会に[AD][BB]ゴールドの(...) C3/DA24: E018 ; #$14: [DE]なんと 寄付をするには(...) C3/DA26: E118 ; #$15: [DE]それもまた そなたの意志(...) C3/DA28: DA18 ; #$16: [DE]おお わが主よ![AD]全知全能の神よ(...) C3/DA2A: DB18 ; #$17: [DE][B3]は よみがえった![AF][D5] C3/DA2C: DC18 ; #$18: [DE]どなたの毒を(...) C3/DA2E: DE18 ; #$19: [DE]おお神よ! わが主よ![AD][B3]の身体より(...) C3/DA30: DD18 ; #$1A: [DE]はて [B3]どのは(...) C3/DA32: E518 ; #$00: [DE]ここは 神にみちびかれし[AD]迷える子羊たちの(...) C3/DA34: FB18 ; #$01: [DE]神さまは いつも 私たちを[AD]みまもってくれています(...) C3/DA36: E618 ; #$02: [DE]では 神のまえに[AD]これまでの おこないを(...) C3/DA38: E918 ; #$03: [DE]なんばんの 冒険の書に(...) C3/DA3A: EE18 ; #$04: [DE]たしかに 記録しました(...) C3/DA3C: EF18 ; #$05: [DE]あなた[B2]に ひとときの[AD]やすらぎが(...) C3/DA3E: E818 ; #$06: [DE]では これまでのことは[AD]記録しないで(...) C3/DA40: EB18 ; #$07: [DE]まだ 冒険を[AD]おつづけに なりますか? C3/DA42: EC18 ; #$08: [DE]では 記録せずに[AD]休むと(...) C3/DA44: ED18 ; #$09: [DE]そうすると 冒険が[AD]前の記録まで(...) C3/DA46: E718 ; #$0A: [DE]そして この冒険の書に(...) C3/DA48: EA18 ; #$0B: [DE]すると [B2]LV[BB]の[AD]記録が(...) C3/DA4A: D518 ; #$0C: [DE]神の声が 聞こえます。[AF][D5] C3/DA4C: D618 ; #$0D: [DE][C0]よ。[AD]あと[BB]の経験で(...) C3/DA4E: FA18 ; #$0E: [DE]ほかに ご用は ありますか? C3/DA50: D718 ; #$0F: [DE][C0]よ。[AD]そなたは もう(...) C3/DA52: F018 ; #$10: [DE]どなたを 生きかえして(...) C3/DA54: F118 ; #$11: [DE]あら [B3]さんは(...) C3/DA56: F918 ; #$12: [DE]あら? やめるのですね。[AF] C3/DA58: F618 ; #$13: [DE]それでは わが教会に[AD][BB]ゴールドの(...) C3/DA5A: F718 ; #$14: [DE]ざんねんですが[AD]お金が(...) C3/DA5C: F818 ; #$15: [DE]無理にとは いいません(...) C3/DA5E: F218 ; #$16: [DE]ああ 天に まします[AD]われらが 神よ(...) C3/DA60: DB18 ; #$17: [DE][B3]は よみがえった![AF][D5] C3/DA62: F318 ; #$18: [DE]どなたの毒を(...) C3/DA64: F518 ; #$19: [DE]ああ われらが神よ。[AD][B3]を むしばむ毒を(...) C3/DA66: F418 ; #$1A: [DE]あら? [B3]さんは[AD]毒に(...)
これらの台詞を表示するためのサブルーチンが用意されており、
教会の処理中では汎用のメッセージ表示サブルーチンを呼び出す代わりに、
サブルーチン $C2D7B9
を用いる。
呼び出し例を示す:
C3/D401: A90000 LDA #$0000 ; [DE]生きとし生けるものは(...) or [DE]ここは 神にみちびかれし[AD]迷える子羊たちの(...) C3/D404: 20B9D7 JSR $D7B9 ; 台詞表示
各地の教会に共通する処理手順を説明する。
本当の意味での共通サブルーチンは $C3D3AE
から始まるが、
本節では教会オブジェクトの処理アドレス属性値が表すサブルーチンを解説する。
サブルーチン $C3D3E3
は標準的な教会処理の実装だ。
対話的な処理が多いのでコードがたいへん長い。要点のみをいくつかに分けて列挙していく。
初期状態からメニューの表示までの処理手順を次に示す。以下では説明の便宜上、担当者を神父と呼ぶ。
教会 ID を基に台詞セットの ID を参照する。
神父が挨拶する。
メニュー表示。 教会オブジェクトのおいのり属性値に基づき、メニューを表示し分ける。
プレイヤーの選択項目に対応する処理手順にスキップする。
「おいのりをする」の処理概要を次に示す:
初期状態。 冒険の書に記録するかどうかを神父が問うので、プレイヤーは回答する。 「はい」ならば冒険の書選択に、 それ以外は記録取り消しにそれぞれ処理手順を進める。
記録取り消し。 神父が冒険の書を更新しないことをやんわりと断る。 それから続行確認に処理手順を進める。
冒険の書選択。 神父の台詞のあと、冒険の書選択ウィンドウが表示される。 ここでキャンセルすると、記録取り消しに処理手順を進める。
次に、選択された冒険の書が、現在のそれとマッチするかどうかを調べる。 マッチしていれば記録開始に処理手順を進める。 そうでなければ、神父が上書きになるが構わないかと聞いてくるので、プレイヤーは回答する。 「はい」ならば再度冒険の書選択の冒頭に処理手順を戻し、 それ以外ならば記録開始に処理手順を進める。
記録開始。 たいへん重要な処理であるので、別サブルーチン呼び出しで実現する。 神父が冒険の書に記録したことを告げ、冒険を続行するか尋ねるので、プレイヤーは回答する。 「はい」ならば終了状態に処理手順を進める。 それ以外は冒険中断に処理手順を進める。
冒険中断。 神父の台詞を以って画面暗転、おつかれさまでしたメッセージの表示となる。 パーティーの人数が単数か複数かで僅かに文面を変える必要があり、 そのためのちょっとしたサブルーチン呼び出しがある。
続行確認。 神父がまだ冒険を続けるか問うので、プレイヤーは回答する。 「はい」ならば終了状態に処理手順を進める。 それ以外は神父が記録をしていないのにいいのかと念を押してくる。 ここで再度回答する必要がある。 「はい」ならば冒険中断に、 それ以外は初期状態に処理手順を進める。
「おつげをきく」の処理概要を次に示す:
各パーティーメンバーにつき、以下の手順を繰り返す: まず、仲間キャラクターの次のレベルがいくつかを求める。 この新レベルに対して、必要経験値をサブルーチン呼び出しで得る。 同時に現在レベルが既に上限に達しているかどうかも判明する。そのときは、そなたはもう十分に強いという台詞となる。 そうでなければ、必要経験値と現在経験値の差を求め、神父がその差分を告げる。
レベルアップ処理自体については 4.20 レベルアップ の述べる。
他の用事の有無を問う。 神父が他に用があるか尋ねる。 そして、先述のメニュー表示手順に戻る。
「いきかえらせる」の処理概要を次に示す:
神父の台詞のあとに「だれを」ウィンドウを表示する。
選択した仲間キャラクターの状態が「しに」であることを試す。 死んでいない場合は神父の台詞の後、先述の他の用事の有無を問うに処理手順を進める。
寄付金計算請求処理を呼び出す。
生き返らせる際の寄付金は、キャラクターのレベルを level
とすると Python コード風に言えば
(((level ** 2) // 10) + 1) * 10
ゴールドとなる。
神父の台詞のあとに、対象の仲間キャラクターの状態ビットを全てリセットする専用サブルーチンを呼び出す。
対象の仲間キャラクターの HP を回復する専用サブルーチンを、回復量 999 として呼び出す。
効果音 #$0026
を再生する。
メッセージ 「~は よみがえった!」を表示する。 先述の他の用事の有無を問うに処理手順を進める。
「どくのちりょう」の処理概要を次に示す:
神父の台詞のあとに「だれを」ウィンドウを表示する。
選択した仲間キャラクターの状態が「もうどく」または「どく」であることを試す。
金額を 5 ゴールドとして、寄付金請求処理を呼び出す。 キャンセルすると、先述の他の用事の有無を問うに処理手順を進める。
効果音 #$0026
を再生し、
「もうどく」または「どく」状態をリセットする専用サブルーチンを呼び出す。
それから先述の他の用事の有無を問うに処理手順を進める。
料金請求処理を細かく説明すると、次のようになる:
料金請求処理。 神父が寄付金を要求するので、プレイヤーが回答する。 答えが「はい」でなければ、神父の台詞を表示して呼び出し元に戻る。
寄付金額を支払える十分な所持金があるかどうかを判定する処理を実行する。
この判定処理は店屋共通処理でも利用されているサブルーチン $C3EE59
を用いる。
これに失敗すると、神父の台詞を表示して呼び出し元に戻る。
所持金から寄付金を減算し、寄付が発生したフラグをレジスターに立てて呼び出し元に返す。
所持金の更新はサブルーチン $C42895
実行のよる。
サブルーチン $C3D849
はアモールの教会が掃除中のときに神父に話すときの処理だ。
サービスは冒険の書に記録することしかできない。
なお、現在の冒険の書以外のものに上書きしようとしても、プレイヤーに対する意志確認がない。
サブルーチン $C3D8C3
はゲーム序盤でトルッカの教会の神父に話すときの処理だ。
サービスは冒険の書に記録することしかできない。
こっそりおいのりすることに決めると、冒険の書メニューが無言で表示される。
その上、現在の冒険の書以外のものに上書きしようとしても警告がない。