本節では移動中に呪文を唱えるときに発生する処理を呪文ごとに見ていく。 プレイヤーがコマンドメニューから「じゅもん」を選択し、 どのパーティーにメンバーが唱えるのかを選択したあとに一つ呪文を選択する。 すると十分な MP があるときに、プログラムは選択された呪文に対応するサブルーチンを呼び出す。
呪文の文字列インデックスと処理コードの開始アドレスとの対応表はアドレス
$C3B814 に次のように定義されている。
呪文ウィンドウで選択された呪文文字列のインデックスと行前半が一致すれば、
プログラムカウンターを行後半のアドレスへ JMP させる。
C3/B814: 3000A4B9 ; ホイミ C3/B818: 330049BA ; べホイミ C3/B81C: 360050BA ; べホマ C3/B820: 390057BA ; べホマラー C3/B824: 3A00CABA ; べホマズン C3/B828: 3E00D1BA ; キアリー C3/B82C: 3B004ABB ; ザオラル C3/B830: 3C00F8BB ; ザオリク C3/B834: 410070BC ; ルーラ C3/B838: 9E004ABD ; リレミト C3/B83C: A900A6BD ; くちぶえ C3/B840: A100DEBD ; トヘロス C3/B844: A00010BE ; トラマナ C3/B848: A40024BE ; フローミ C3/B84C: A2007FBE ; タカのめ C3/B850: A500F9BE ; とうぞくのはな C3/B854: A80055BF ; しのびあし C3/B858: A30077BF ; ねる C3/B85C: A70095BF ; おおごえ C3/B860: AA0066C0 ; あなほり C3/B864: 9F0044C3 ; インパス C3/B868: A6001BC7 ; レミラーマ C3/B86C: AB0064C7 ; おもいだす C3/B870: AD0079C7 ; もっとおもいだす C3/B874: AC008EC7 ; ふかくおもいだす C3/B878: AE00A3C7 ; わすれる
以下、各呪文の処理を簡単に説明していく。 その前に、実際にはハンドラーごとにコード化されているものの、 各呪文に共通して見られる仕様傾向を列挙しておく。 これらの事実についてはいちいち個々の呪文解説の項では、例外的な扱いがある場合を除き繰り返さない。
$C3B8C5 呼び出しにより、特定の効果音 (ID: #$00B0) を鳴らす。#$00CA で決定する。
ホイミ・べホイミ・ベホマの各コマンドは開始直後に同一の処理 $C3B9A8 に合流するので、まとめて解説する。
これらの呪文は、対象者一人が死んでいなければ、そのメンバーの HP をある量だけ回復しようとするものだ。
ここで、ある量とは指定する範囲にある数からランダムに選ぶものであり、
ホイミ系 5 種の呪文に対する回復量テーブルは $C3B963 において次のように定められている。
C3/B963: 30001E002800 ; ホイミ C3/B969: 33004B005F00 ; べホイミ C3/B96F: 3600E703E703 ; べホマ C3/B975: 390064007800 ; べホマラー C3/B97B: 3A00E703E703 ; べホマズン
十六進数を十進数で書き直し、表にまとめると次のようになる:
表 4.109 $C3B963 ホイミ系回復量テーブル
| コマンド | 下限値 | 上限値 |
|---|---|---|
| ホイミ | 30 | 40 |
| べホイミ | 75 | 95 |
| べホマ | 999 | 999 |
| べホマラー | 100 | 120 |
| べホマズン | 999 | 999 |
乱数の適用は、ホイミ系専用サブルーチン $C3B8FC で行う。
具体的には、汎用乱数系サブルーチン $C00F28 を利用して回復量を決める。
つまり、ゼロから回復量範囲の長さまでのいずれかの数をランダムに発生させ、
これに下限値を加えた値を回復量とする。
指定メンバーへの HP の回復処理自体はキャラクターのプロパティー設定サブルーチンの一種である
$C44685で行う。
回復量が過剰な場合はそこで対処することを期待する。
最後に効果音 #$00CD を鳴らし、メッセージを表示して終了する。
べホマラー・べホマズンの各コマンドは開始直後に同一の処理 $C3BA5B に合流するので、まとめて解説する。
これらの呪文は、パーティーにいるメンバーを先頭から順番に、HP をある量だけ回復しようとするものだ。 ただし、死んでいるメンバーは単にスキップする。 また、回復量をメンバーごとに 4.23.2.1 ホイミ・べホイミ・ベホマ のようにしてランダムに決定する。 回復処理、効果音、メッセージについても同様だが、呪文を受けたメンバーごとに発生する。
全員の回復メッセージを表示し終えた後、パーティーの HP/MP ウィンドウを表示してコマンドを終了する。
キアリーは、対象者一人が死んでいなければ、その毒状態をクリアするコマンドだ。
サブルーチン $C44CA3 により、指定メンバーの状態をテストする。
「しに」状態ならばいつものようにキャンセル扱いとする。
そうでなければ、指定メンバーの「もうどく」「どく」フラグがセットされているかをテストする。
これらのフラグのどちらもセットされていないならば、「しかし 何も おこらなかった」を表示して終了する。
この場合には MP の返還は発生しない。
対象が本当に毒に冒されている場合には、
キャラクターのプロパティー設定サブルーチンの一種であるサブルーチン
$C44E2B により「もうどく」「どく」フラグをリセットする。
最後にメッセージ #$16A9 を表示し、コマンドを終了する。
ザオラルは対象者一人が死んでいれば、半分の確率で生き返らせ、HP を最大値の半分とするコマンドだ。
サブルーチン $C44CA3 により、指定メンバーの状態をテストする。
「しに」状態でなければいつものようにキャンセル扱いとする。
死んでいる場合にはサブルーチン $C00E97 により乱数を発生させる。
この値が奇数ならば(最下位ビットを調べる)、ザオラルの結果を失敗とする。
メッセージ #$16A8 を表示し、当然ながら MP を返還せずに終了とする。
乱数が偶数ならば成功とする。この場合、次の一連の処理を行う:
$C44D34 でメンバーの状態をすべてクリアする。$C44729 でメンバーの最大 HP を取得する。
次に LSR 命令でその半分の値を計算する。$C44685 でメンバーの HP を回復する。
最後にメッセージ #$16A7 を表示し、コマンドを終了する。
ザオリクは対象者一人が死んでいれば、HP ごと完全回復するコマンドだ。 処理内容は 4.23.2.4 ザオラル で説明したものから、 乱数関連と半減関連を取り除いたものになる。
ルーラはパーティーが訪問したことがある場所の一定の集合から一点を選択し、そこへ一瞬で移動するコマンドだ。 次のような処理になっている:
サブルーチン $C435B3 を呼び出す。
これにより、パーティーが一度訪問したすべての移動先候補地点をアドレス $7E48D8 に配列としてセットする。
なお、訪問情報は $7E3E60 にビット列として保持されている。
また、すべての移動先候補地点は $C8A162 に 1 バイト型の配列として定義されている。
$7E48D8 に要素があれば、そこから移動先候補をいくつか取り除く。
サブルーチン $C7CAD5 を実行することで、
パーティーが現在いるフィールド区分(フィールド、したフィールド、かいてい、はざま)に一致しない候補を検索し、取り除く。
この結果、移動先候補が全くなくなればメッセージ #$16D8 を表示して、
コマンドをキャンセル扱いで終了する。
#$004E か #$004F に使い分ける。
呪文効果音を鳴らしたら、サブルーチン $C7C650 を実行する。
このとき、次に述べるような失敗パターンがあり、いずれもコマンドキャンセル扱いとなる。
#$16AC を表示する。
#$16D8 を表示する。
#$16AD を表示する。
リレミトは現在パーティーがいる地域から「脱出」するコマンドだ。 次のように処理する:
サブルーチン $C7C783 を呼び出すことで、
パーティーが現在いる地域や状況がリレミトを許可するかどうかを調べる。
リレミトが意味のない場所ならばメッセージ #$16D6 を、
何らかのイベント中であるなどの理由により禁止されているならばメッセージ
#$16D8 を、それぞれ表示してコマンドを終了する。
この場合、消費済みの MP を呪文を唱えたメンバーに返還する。
サブルーチン $C7C783 のチェック内容は次のようなものだ:
$7E5EE1 != #$0000 であるか。
ゼロでなければ、リレミトにより「何も起こらない」場である。
いんちきリレミトすら認めない場ということだ。
$7E3E28 & #$0001 がセットされているかを調べる。
どちらかならば、リレミトに「不思議なちから」が作用する。
$7E3D2B & #$0002 がセットされているか。
セットされていればリレミトが発動する。
これらを全てクリアすればリレミトが発動する。
$C7C9CE を実行する。
これがリレミトの本体処理だ。リレミトが成功する条件が思いのほか複雑であることがわかる。
くちぶえは現在パーティーがいる戦闘地域に基いて、強制的に通常戦闘を引き起こすコマンドだ。 次のように処理する:
$C79447 を呼び出し、
適切なタイルせんとう ID を取得する。
4.1.2.10 タイルせんとうで既定値として表示される値とこの ID は同じだ。
この値がゼロだと、メッセージ「しかし 何も おこらなかった」を出力してコマンドを終了する。$7E3D2A & #$0010 をテストすることで確認する。
なお、このフラグは 4.1.2.12 いんちきせっていメニューにある「エンカウント」の操作対象そのものだ。
フラグがリセットされていると、メッセージ「しかし 何も おこらなかった」を出力してコマンドを終了する。$C7952C を呼び出す。全くの個人的な感想だが、フラグのテストを ID 取得より先に処理して欲しい。
トヘロスは次の処理を行うコマンドだ:
$7E3BA9 をリセットする。$7E3D2B & #$0004 をセットする。$7E3D2B & #$0010 をリセットする。
最後にメッセージ #$16B6 を表示し、コマンドを終了する。
フローミはパーティーが現在いる場所のメッセージを表示するコマンドだ。 次のように処理する:
$C7CAFA を呼び出し、
フローミ名とフローミ階数を得る。
このフローミ階数がゼロだと、呪文に意味がない旨を示すメッセージ
(ID #$16C5) を表示してコマンドを終了する。
この場合 MP の返還処理はない。フローミ階数の符号により、表示メッセージを若干変える。
正数の場合は単に ID #$16C3 のメッセージを出力する。
負数の場合はいわゆる二の補数で表現された値の絶対値を計算してから
ID #$16C4 のメッセージを出力する。
C3/BE59: 49FFFF EOR #$FFFFC3/BE5C: 1A INC A
C3/BE5D: 8D2E5A STA $5A2E
C3/BE60: AD305A LDA $5A30
C3/BE63: 2900FF AND #$FF00 C3/BE66: 8D305A STA $5A30 C3/BE69: 22C22DC0 JSR $C02DC2
C3/BE6D: C416
どちらかのメッセージを出力した後、コマンドを終了する。
タカのめは近くにある城や街等の現在パーティーがいる地点からの相対的な位置を調べるコマンドだ。
探索処理をサブルーチン $C7CB22 で、
データ処理とメッセージ処理を当ハンドラー内でそれぞれ実行する。
当ハンドラーでの手続きはこのようなものだ:
サブルーチン $C7CB22 を呼び出し、探索処理を実行する。
これにより位置データを変数 $7E6C[D1:D8] にセットする。
この結果 $6CD3 と $6CD1 の両方がゼロだと、
失敗メッセージ #16C0 を出力してコマンドを終了する。
前者が南北方向の歩数で、後者が東西方向の歩数を表す。
$7E6CD5 の符号を調べる。
正ならば東に何歩とのメッセージ #16BC を、
負ならば西に何歩とのメッセージ #16BD をそれぞれ出力する。
$7E6CD7 の符号を調べる。
正ならば南に何歩とのメッセージ #16BF を、
負ならば北に何歩とのメッセージ #16BE をそれぞれ出力する。
本質的な処理はサブルーチン $C7CB22 以下のコードによる。
$C8A188 のメンバーを調べることによる。
余談だが、この構造体配列を精査すれば、タカのめが有効な地域は「フィールド」および「したフィールド」しかないことが判明する。
$7E5F19 と $7E5FB9 を並行して調べる。
興味がある値とは、前者の値の最下位ビットが立っていて、かつ後者の要素が 3 または 4 となる
添字だ。
この添字に対応する配列
$7E62D9,
$7E6199,
$7E6379,
$7E6239 の要素も利用する。
#$0012 以上離れているか、
あるいは南北方向に #$000E 以上離れているならば、
その候補地点はタカのめの解から除外する。
とうぞくのはなは現在パーティーがいる階や部屋に「しらべる」で入手できるお宝やゴールドがどれだけあるかを知るコマンドだ。 次のような手続きを行う:
$C7CC26 を呼び出し、探索処理を実行する。
#$16C7 を、
そうでなければメッセージ #$16C6 をそれぞれ表示して、
コマンドを終了する。
とうぞくのはなの本質的な処理はサブルーチン $C7CC26 以下になる。
手続きの概要のみ記す:
$7E679D だ。
検索対象は三つ組の配列 $7E641D,
$7E65DD, $7E661D となる。
配列 $7E641D はマップ内のマスが「しらべる」コマンドの対象であるかを
管理するようだ。上位 2 ビットの状態によりスキップするかどうかを決める。
このうち #$4000 のビットのほうがこのコマンド専用のデータ扱いになっている。
配列 $7E65DD で「しらべる」コマンドによる反応対象の種別を管理している。
値については下記の表を参照。この値によってサブルーチンを呼び分ける。
配列 $7E661D ではマップ内の各マスに対応する
各種お宝構造体配列の添字、
すなわち「しらべる」イベントの ID を管理している。
$7E3D2A のビットセットだ。
一度「しらべる」コマンドで入手した項目に対応するビットは 1 になっている。
このアルゴリズムで調べたいのは、そのようなビットが 0 になっているものの個数だ。
表 4.110 しらべる反応種別
| 値 | 種別 | 参照構造体 |
|---|---|---|
| 0 | どうぐ |
$C83E5C
|
| 1 | ゴールド |
$C8477E
|
| 2 | 立て札・貼り紙・本棚 | n/a |
| 3 | 罠モンスター |
$C85534
|
| 4 | (不明) |
$C855AB
|
しのびあしは次の処理を行うコマンドだ:
$7E3BAD をリセットする。$7E3D2B & #$0008 をセットする。
最後にメッセージ #$16B6 を表示し、コマンドを終了する。
おおごえは旅の店屋を呼びつけて営業をさせるコマンドだ。次のようなことを行う:
$7E3BA9 をリセットする。$C7CC76 を呼び出し、現在おおごえを利用可能かどうかを調べる。
無効な場合にはメッセージ #$16D5 を表示してコマンドを終了する。
$7E3D2B & #$0040 をセットする。最近訪問した店と同じ品揃えの旅の店屋、 ある旅の宿屋、または旅の神父がそれぞれ確率 1/3 で現れる。
$7E3B77 に格納済みの店屋 ID を参照する。
店の種別に合わせて出力メッセージ用に誰が現れるのかを決め、
4.6.2 処理手順 で述べる処理を実行する。#$0024 の宿屋が現れる。
それから 4.7.2 処理手順 で述べるサブルーチンを実行する。
宿賃は一人 100 ゴールドだ。#$0006 の教会が現れる。
つまり「おいのりをする」がない教会だ。
それから 4.8.2.1 サブルーチン $C3D3E3: 標準的な教会 で述べるサブルーチンを実行する。
$7E3D2B & #$0040 をリセットする。フラグをリセットしたら、コマンドを終了する。
あなほりは物品またはゴールドをランダムに入手するコマンドだ。 できればアクティビティー図でも描いて展望を明瞭にしておきたいところだが、文章でコマンドの手続きを示す:
$C7CC3A を実行し、あなほりが利用可能な状況かどうかを判定する。
単に変数 $7E85EF がゼロであるかをテストするだけだ。
ゼロでなければメッセージ #$16D3 を表示してコマンドを終了する。
$7E5ED3 がそれだが、
この値が 5 以上ならばメッセージ #$16D2 を表示してコマンドを終了する。
#$16D2 を表示してコマンドを終了する。
確率 1/2 でアイテム抽選を行うかどうかを補助サブルーチンの呼び出しにより抽選する。 この抽選処理の概要は後述する。
$C3ED1D を実行して獲得した物品をパーティーの所持品の空きまたはふくろに追加する。
#$16D1 を出力する。
#$002C を鳴らし、演奏終了を待機する。
$7E5ED3 を 1 だけ加える。
そこでは値が 5 を超えるようならば 5 のまま保留する。
アイテム抽選に漏れた場合は確率 1/128 で所持金の半額を掘り当てる。
$C427E0 を呼び出してパーティーの所持金を問い合わせる。
次に LSR 命令と ROR 命令を併用して半額を計算し、これを収入額とする。
最後にサブルーチン $C42862 を呼び出して所持金に収入額を加算し、
メッセージ #$16D0 を表示する。
以上でコマンドを終了する。
次にアイテム抽選を行うかを決定する補助サブルーチンの処理を示す:
パーティーがいる地域のタイルせんとうデータを参照する。
4.17.1.1 構造体 $C6843C: 通常の戦闘用編成 で述べたオブジェクト内の頻度属性値の総和を計算する。
この和がゼロならば、アイテム抽選を行わないものとする。
ゼロからこの和までの間の数をランダムに一つ取る。
この乱数から、タイルせんとうデータ内の頻度メンバーデータを一つずつ順に減算する。 この値が負になるところで反復処理を中断するが、 最後まで行っても負にならない場合は、アイテム抽選を行わないものとする。
反復処理中断時のインデックスを基に、タイルせんとうデータ中のモンスターを決定する。 モンスターの ID がゼロならば、アイテム抽選を行わないものとする。
このモンスターの宝箱を落とす確率をモンスターデータの対応属性(4.14.1 参照)に基いて決定する。 確率表は 表 4.55 アイテム確率 のものを参照する。 それから当選確率がこの値であるような抽選をする。
このモンスターの宝箱が元々設定されていないならば、アイテム抽選を行わなかったものとする。
変数 $7E5A2A に宝箱の中身のアイテム ID をセットして、
この補助サブルーチンを終了する。
補足だが、処理中に乱数取得処理がいくつかあるが、そのほとんどはサブルーチン
$C00F28 だが、アイテム確率だけは分母が大きいのでサブルーチン
$C00F49 を採用している。
インパスは次のような三段構造のコマンドだ:
「まじゅつしのとう」入場に関する処理はサブルーチン
$C7CC8E 以下に実装されており、その内容とは次のようなものだ:
#$024D) でなければ抜ける。
$C6DE8A を呼び出すことで達成する。
この扉を開ける処理がなされると、インパスのコマンド処理が終了する。 そうでなければ、以下の処理へ進む。
宝箱またはツボの中身を判定する処理はサブルーチン
$C7CCEF 以下で実装されている。次のようになっている:
このサブルーチン呼び出しにより、インパスが宝箱またはツボに反応する可能性があるかどうかがわかる。 コマンドハンドラー側ではこの戻り値によって、選択ウィンドウ「たからばこ アイテム」や 「ツボ アイテム」ウィンドウを表示するかどうかを決める。
#$16AE から #$16B4 のいずれかの固定メッセージを表示してコマンドを終了する。
「アイテム」を選択すると、次に述べる鑑定処理を実行する。
最後に所持品の鑑定となる:
#$00CB を表示して、
鑑定する品物を所持するパーティーメンバーまたは「ふくろ」のいずれかをプレイヤーに選択させる。
ここでキャンセルされた場合は、再び宝箱・ツボチェックまで戻る。
パーティーメンバーが選択されると、所持品があるのかどうかを調べる。
何も持っていなければメッセージ #$1527 を表示して
コマンド入力を一つ戻す。
道具袋が選択されると、中身が何かあるのかどうかを調べる。
何も収納されていなければメッセージ #$1722 を表示して
コマンド入力を一つ戻す。
鑑定する品物が決まったら、呪文効果音を鳴らして鑑定処理を実行する:
$C4608D により、鑑定品の道具種別情報を取得する。
$C41A3D のデータから取得するが、
種別が道具か否かで出力手続きが異なる。
メッセージ出力が最も多くなるのは、鑑定品が装備可能品かつ
装備していると特殊な効用があり、さらに戦闘中に使うと何か起こるものだ。
$C41A3D の関連メンバーを取得し、
メッセージ #$163F から #$1641 までのいずれかを表示する。
$C45FA6 で情報取得を、
配列 $7E3BB6 で各員の装備可能性を保持する。
#$1642 か #$1648 を示して売値評価へ進む。
あるいは装備可能者が 6 名以上いるか否かで、メッセージ表示が異なる。
詳細は割愛する。
#$164A を、
そうでなければサブルーチン $C45F3C で売値を計算し、
メッセージ #$1649 で知らせる。
以上でコマンドを終了する。
レミラーマはパーティーの近くにある怪しいものを目立たせるコマンドだ。 ハンドラーでの処理は次のようになっている:
$C7CCF4 を呼び出して、このコマンドが利用可能であるかを問い合わせる。
利用できなければメッセージ #$16D8 を出力し、
キャンセル扱いでコマンドを終了する。
$C7CD10 を呼び出して、怪しいものを目立たさせる。
サブルーチン $C7CCF4 の処理は単純で、
変数 $7E5ED1 の値が #$FFFF でないことをテストするものだ。
サブルーチン $C7CD10 の処理では画面内の怪しい地点を光らせて効果音を鳴らす。
具体的な内容は説明が困難なので、明らかな処理のみ記す:
おもいだす・もっとおもいだす・ふかくおもいだすの各コマンドは同一の処理
$C7CDAF に合流するので、まとめて解説する。
今まで記憶したメッセージの ID は配列 $7E3EAC に最大 32 個格納されている。
これらはこのメッセージを配列の先頭から高々規定個数分を連続してウィンドウに出力するコマンド群だ。
メッセージ数の上限はコマンドによって異なり、次のようになっている:
この配列には値 #$FFFF が混入していることがある。
そのときにはこの値をスキップして次に行く(配列の末尾まで #$FFFF のはずだが)。
また、メッセージ内の米印文字は星印文字に置換して出力する。
この配列の中身 32 個が全て #$FFFF で埋まっている場合、
このコマンドはメッセージ #$16DB を表示して終了する。
プレイヤーがメッセージ出力中にキャンセルボタンを押した場合、
出力するメッセージが残っていてもコマンドを終了する。
また、配列内が事実上空のときにはメッセージ #$16DB を表示してコマンドを終了する。
わすれるは、メッセージ配列 $7E3EAC の内容を対話的に削除するコマンドだ。
この配列の中身 32 個が全て #$FFFF で埋まっている場合、
このコマンドはメッセージ #$16DC を表示して終了する。
候補メッセージがあるならば、画面に「?つまえ」ウィンドウおよびメッセージ出力ウィンドウを表示する。
「?つまえ」ウィンドウは二種類あり、メッセージ個数が 1 ならば ID #$00A8 のものを用いるが、
普通は #$00A7 のものを表示する。
プレイヤーは十字キーの左右でメッセージをめくり、対象を一個決定する。
何かメッセージを決定すると、ウィンドウ #$00A6「わすれる はい・いいえ」を表示する。
プレイヤーが「はい」と答えると、サブルーチン $C6E125 を呼び出すことで、
現在表示されているメッセージをメッセージ配列 $7E3EAC から取り除き、
それ以降のメッセージ ID をすべて最近覚えた方向にシフトし、
配列の末尾に #$FFFF をセットするという一連の処理を実行する。
画面に「?つまえ」ウィンドウが表示している間にプレイヤーがキャンセルボタンを押すか、 わすれるためのメッセージ配列が空になったらコマンドを終了する。