5.32. デバッグ

5.32.1. 構造に関する構成要素
5.32.1.1. 定数 $C1FFFE: デバッグスイッチ
5.32.1.2. 構造体 $C8D4B0: デバッグコマンド
5.32.1.3. 構造体 $C8A3AF: いんちきルーラ
5.32.1.4. 構造体 $C8F661: フラグショップ
5.32.2. 振る舞いに関する構成要素
5.32.2.1. デバッグコマンド群の振る舞い
5.32.2.2. すごろく
5.32.2.3. 「ぼうけんのしょ3」新規作成でパーティーが編成済み
5.32.2.4. ゲームショーモード

本節ではデバッグに関するプログラム構成要素について述べる。 読者がデバッグモードを試す場合には、次のように設定するのが良いと思われる。

表 5.93 デバッグモードのための PAR コード改造

アドレス
$C02799 #$80
$C1FFFE #$FFFF
$C6FFFA #$80

ゲームの途中ならば $C1FFFE に対する値の上書きだけで構わない。

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

デバッグに関連するデータの構造について述べる。 データ自身については付録に収録したものを参照して欲しい。

5.32.1.1. 定数 $C1FFFE: デバッグスイッチ

アドレス $C1FFFE の値によって一部プログラムの振る舞いが変化する。 製品版ではこのアドレスの値は #$0000 であり、これを標準モードや製品モードと呼ぶことにする。 このアドレスの値が #$0001 であれば、ゲームショーモード、 何か負の値、例えば #$FFFF であれば、デバッグモードとそれぞれ呼ぶことにする。

5.32.1.2. 構造体 $C8D4B0: デバッグコマンド

デバッグコマンドとは、デバッグモードにおいて移動モードでコントローラーの L ボタンと押すと 表示されるメニューウィンドウにリストされているコマンド群のことを指すものとする。

図 5.4 デバッグメニュー

デバッグメニュー

アドレス $C8D4B0 に配列されているオブジェクトそれぞれがコマンドを表現する。 オブジェクトの型の詳細を次の表に示す。

表 5.94 構造体 $C8D4B0

オフセット 属性
#$00 #$00FFFF 名前
#$02 #$FFFFFF コマンドハンドラー

各属性の詳細は次のとおり。

名前

文字列の ID を値とする属性であり、コマンドの名前を表現する。 文字列については 5.2 文字列 で述べる。

コマンドハンドラー

サブルーチンの完全アドレスを値とする属性であり、メニュー項目選択時の処理を実行する。 各処理については 5.32.2 以降で述べる。

5.32.1.3. 構造体 $C8A3AF: いんちきルーラ

いんちきルーラとは、デバッグコマンドの一つであり、 現在地やキャラクターの MP に由来する制約を無視して指定の地点へ移動することを目的とするものだ。

図 5.5 いんちきルーラ

いんちきルーラ

詳細は 5.28.1.2 構造体 $C8A3AF: ルーラ で述べる。

5.32.1.4. 構造体 $C8F661: フラグショップ

フラグショップとは、デバッグコマンドの一つであり、物語の進行状況を制御することを目的とするものだ。

図 5.6 フラグショップ

フラグショップ

アドレス $C8F661 に配列されているオブジェクトそれぞれがフラグを操作する処理コードのアドレスを保持している。 オブジェクトの型の詳細を次の表に示す。

表 5.95 構造体 $C8F661

オフセット 属性
#$00 #$00FFFF 名前
#$02 #$FFFFFF コマンドハンドラー

各属性の詳細は 5.32.1.2 と同様だ。

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

デバッグモードでのさまざまな振る舞いについて述べる。

5.32.2.1. デバッグコマンド群の振る舞い

デバッグメニュー各コマンドの振る舞いについて簡単に述べる。

いんちきルーラ

5.32.1.3 の冒頭の説明を参照。

いんちきリレミト

だれの MP を消費することもなしにリレミト処理を行う。 リレミトが意味のあるところにいる限り、リレミト相当の処理を実行する。 ピラミッドの地下などでも機能する。 コマンドが成功しないときにはメッセージが表示される。

いんちきラナルータ

だれの MP を消費することもなしにラナルータ処理を行う。

ラナルータが禁止されていない限り、ラナルータ相当の処理を実行する。 ラナルータを成功させる要素が 4 つあるようだが、現在地にちなむもの以外は不明だ。

おみせ

図 5.7 おみせ

おみせ

図のようなサブメニューを表示する。 選択する項目により、店屋の共通処理が始まる。

「ぶきや」「ぼうぐや」「どうぐや」「よろずや」の処理については 5.11 店屋 を、 「しんぷ」「シスター」は 5.14 教会、 「やどや」は 5.13 宿屋、 「ぎんこう」は 5.17 ゴールド銀行、 「なかまとうろくじょ」は 5.16 冒険者たちの登録所、 「ルイーダのさかば」は 5.15 ルイーダの酒場、 「ダーマのしんでん」は 5.18 転職、 「なまえかえや」は 5.19 命名神、 「かくとうじょう」「よそうや」「マッチメイク」は 5.20 格闘場、 「ふっかけみせや」は 5.12 ふっかけ店屋、 「メダルおじさん」は 5.22 メダルおじさん、 「シスターセーブ」「おうさま」は 5.10 王様 をそれぞれ参照。

レベルアップ

図 5.8 レベルアップ

レベルアップ

レベルアップコマンドは、仲間キャラクター一人のレベルを変更する機能だ。

この項目を選択すると、コマンドウィンドウで「つよさ」を選択したときと同じサブウィンドウ群が出る。 さらにこの状態でキャラクターを選択すると、「つよさ」ウィンドウが出る代わりに、 数値入力ウィンドウが出現する(上記画像)。 ここで 1 から 99 までの値を入力すると、選択したキャラクターのレベルがその値となる。 キャラクターのパラメーターや、習得呪文もそれらしいものになる。 従ってレベルダウンも可能である。 0 の入力はキャンセル扱いになり、100 以上の値の入力は 99 が入力されたものとみなされる。

てんしょく

コードとしてはキャリーフラグをリセットするだけで、処理は本当に何もない。 デバッグコマンド「おみせ」から「ダーマ」を選択すればよいだろう。

せいかく

図 5.9 せいかく

せいかく

せいかくコマンドは、仲間キャラクター一人の素の性格を変更する機能だ。

この項目を選択すると、コマンドウィンドウで「つよさ」を選択したときと同じサブウィンドウ群が出る。 さらにこの状態でキャラクターを選択すると、「つよさ」ウィンドウが出る代わりに、 性格リストウィンドウ (ID: #$A7) が出現する(上記画像)。 どれか性格を選択すると、選択キャラクターの素の性格がそれに設定される。

おかね

おかねコマンドは、パーティーの所持金を変更する機能だ。

金額入力ウィンドウが出現する。 ここ値を入力すると、そのまま現在のパーティの所持金として設定される。

フラグショップ

5.32.1.4 の冒頭の説明を参照。

各項目の詳細は後述する。

ひとじょうたい

図 5.10 ひとじょうたい

ひとじょうたい

ひとじょうたいコマンドは、仲間キャラクター一人の「しに・まひ・どく」状態を 1 にする機能だ。 仲間キャラクターオブジェクトの属性については 5.4 仲間キャラクターオブジェクト で述べる。

「だれを」ウィンドウが出現して、パーティー内キャラクターのだれか一人を選択する。 キャラクターを選択すると、ステータスを「しに・まひ・どく」の中から設定することができる。

「しに」を選択すると、キャラクターの HP がゼロにすることで死なせる。 「まひ」「どく」はキャラクター状態ビットを ON にする処理である。

ゲームじょうたい

図 5.11 ゲームじょうたい

ゲームじょうたい

ゲームじょうたいコマンドは、現在地のある種の属性を表示する機能だ。

ウィンドウ (ID: #$7D) が出現する。 例えば「ルーラ」では「できる」「できない」「あたまをぶつける」のどれかが表示される。

どうぐふくろ

どうぐふくろコマンドは、ID が #$0000 から #$00E4 までのアイテムを一個ずつふくろに追加する機能だ。

実際には ID がゼロのアイテムはヌルアイテムなので、これは袋サブルーチンで除外される。

せんたくせんとう

図 5.12 せんたくせんとう

せんたくせんとう

せんたくせんとうコマンドは、敵陣構成を指定して戦闘を開始する機能だ。 モンスターについては 5.5 モンスター で述べる。

まず、モンスターせんたくウィンドウ (ID: #$D1) が出現する。 ここでモンスターを示す項目を選択すると、さらに数値入力ウィンドウが出現する。 数値を入力すると、再びモンスターせんたくウィンドウがアクティブになる。

モンスターと数値のペアを 4 回入力すると、さらに数値入力ウィンドウが出現する (同じ場所に出てくるため、わかりにくい)。 ここで入力するのは戦闘背景 ID である。 ゼロを入力するとランダムに背景が決まり、 #$004A 以上の値を入力すると #$0049 を入力した扱いになる。

戦闘背景 ID を入力すると、戦闘モードに切り替わる。 登場するモンスターの群れは、先程指示したモンスターグループとなる。 各グループのモンスター頭数が、指定数値を考慮したものになっている。 画面背景も指定のものになっている。

タイルせんとう

図 5.13 タイルせんとう

タイルせんとう

タイルせんとうコマンドは、戦闘地域 ID を指定して戦闘を開始する機能だ。 戦闘地域オブジェクトについては 5.30.1.2 構造体 $C8ADD1: 通常戦 で述べる。

数値入力ウィンドウが出現する。初期値は現在値が戦闘地域ならばその ID の値が既定値として表示されている。 ここで #$0069 未満の数値を入力すると、いきなり戦闘モードに切り替わり、 その敵陣構成は指定した ID に基づくものになっている。

モンスターをみる

図 5.14 モンスターをみる

モンスターをみる

モンスターをみるコマンドは、モンスターのアニメーションを確認する機能だ。 モンスターについては 5.5 モンスター で述べる。

画面が切り替わり、背景が戦闘背景 #$0001 になる。 ウィンドウにリストされているモンスターを選択すると、 そのモンスターのスプライトに関連するアニメーションの個数だけ数字がリストされたミニウィンドウが出現する。 ここで番号を選択すると、対応するアニメーションが再現される。

ぜんかいふく

ぜんかいふくコマンドは、パーティー全員の毒・マヒ状態を回復してから HP と MP を完全に回復する。

死んでいるキャラクターにもこの回復を適用するが、 カンオケスプライトの更新は次のキャラクター再描画の機会まで発生しない。

プログラムスタート

名前とは裏腹に、このデバッグメニューウィンドウを消去して、 再びデバッグメニューウィンドウを表示するという処理になっている。

サウンド

サウンドコマンドは、BGM と効果音を再生する機能だ。

まず数値入力ウィンドウが出現する。 ここで数値を入力すると、この値を ID とする BGM なり効果音なりが演奏される。 ゼロの入力は単に無視される。 入力値が #$017E 以上のときは、#$017E が入力されたとして扱われる。 演奏ストップ機能はないらしい。

ほこうせってい

図 5.15 ほこうせってい

ほこうせってい

ほこうせっていコマンドは、キャンセル歩行モードを切り替える機能だ。

図のようなメッセージが出現する。 「はい」と答えると、キャンセル歩行ができる ($7E3500 |= #$0002) ようになり、 「いいえ」はその逆 ($7E3500 &= ~#$0002) となる。

キャンセル歩行が有効であるとは、SELECT ボタンを押しながら十字キーを押すことで、 壁や水場等の通過できない地形を通過することができる状態を指すようだ。 船で移動中の場合は、上陸しないでそのまま移動し続けることになる。

エンカウントせってい

図 5.16 エンカウントせってい

エンカウントせってい

エンカウントせっていコマンドは、戦闘地域の移動中にランダムに戦闘が発生するかどうかを指定する機能だ。

図のようなメッセージが出現する。 「いいえ」と答えると、フィールドやダンジョンを歩いていても敵が一切出現しなく ($7E3500 &= ~#$0001) なる。 「はい」はその逆 ($7E3500 |= #$0001) である。 通常のゲームモードでは「はい」の状態である。

スタートフロアせってい

図 5.17 スタートフロアせってい

スタートフロアせってい

スタートフロアせっていコマンドは、冒険の書を選択してゲームを開始する地点をインチキフロアとするかどうかを指定する機能だ。 インチキフロアとは、勇者の家そっくりの謎の空間のことだ。

図のようなメッセージが出現する。 「はい」と答えると、 冒険の書を選択してゲームを開始する時点でのフロアが、 上述の謎空間 (ID: #$0001) となるフラグ ($7E3500 |= #$0004) が立つ。 「いいえ」はその逆となる。

ざひょうウィンドウ

図 5.18 ざひょうウィンドウ

ざひょうウィンドウ

ざひょうウィンドウコマンドは、座標ウィンドウ表示機能の有効性を切り替える機能だ。

図のようなメッセージが出現する。 「はい」と答えると、移動モードにおいて R ボタンを押したときに、 画面右下に現在の座標を表示するウィンドウ (ID: #$7C) が出現するようになる。

図 5.19 ざひょうウィンドウ

ざひょうウィンドウ

ひとひょうじ

図 5.20 ひとひょうじ

ひとひょうじ

ひとひょうじコマンドは、移動モードでパーティーキャラクターおよび「はなす」対象キャラクターのスプライト描画の有効性を切り替える機能だ。

図のようなメッセージが出現する。 「いいえ」と答えると、移動モードでパーティーキャラクターおよび「はなす」対象キャラクターのスプライトが描画されなくなる。 通常は「はい」の状態である。

ROMバージョン

図 5.21 ROMバージョン

ROMバージョン

ROMバージョンコマンドは、ウィンドウ #$B0 を表示する機能だ。

ROMバージョンの情報を示すウィンドウが画面右上に出現する。 デバッグモードでは、このデバッグメニューから表示しなくても、 冒険の書メニュー画面や、王様に冒険の書を記録させるときにもこの ROMバージョンウィンドウが出現する。

プレゼンよう

プレゼンようコマンドは、画面をエンディングの終盤付近(スタッフロール終了後くらい)に切り替える機能だ。

へんげのつえ

へんげのつえコマンドは、アイテムのへんげのつえを次に使うときに化けるスプライトを設定する機能だ。

数値入力ウィンドウが出現する。ここで 9 未満の数値を入力すればよい。 0 を入力することはデバッグ機能を使わないことを意味する。 1 から 8 までの入力は、ここから 1 を引いて配列 $C89839 の要素の位置を指定する。 この配列要素の値は 5.26.1.2 構造体 $C893D4: 「はなす」対象分類 で述べるオブジェクトの ID だ。

5.32.2.2. すごろく

デバッグモードが有効であると、通常のすごろくの振る舞いに加えて、次の操作を実現することができる。

出目操作

図 5.22 出目操作

出目操作

すごろくコマンドウィンドウを出す前に L ボタンを押すと、図のように数値入力ウィンドウが出現する。 ここに 1 以上 6 以下の値を入力すると、次回以降、マス移動のためのサイコロの出目が入力値と同じになる。 0 を入力するか、入力をキャンセルすると、サイコロの出目は通常の振る舞い(ランダム)に戻る。

ランダムイベント指定

図 5.23 サイコロ操作の画像と似てしまった

サイコロ操作の画像と似てしまった

「?」マスに止まった直後、図のように数値入力ウィンドウが出現する。 ここで 49 未満の数値を入力すればよい。 0 を入力することはデバッグ機能を使わないことを意味する。 1 から 48 までの入力は、ここから 1 を引いて 5.31.1.4 構造体 $C8F1F4: すごろくランダムイベント列 で述べる配列 ID とする。 この配列要素の値が 5.31.1.3 配列 $C8F188: すごろくランダムイベントハンドラー で述べるハンドラーの ID となる。

5.32.2.3. 「ぼうけんのしょ3」新規作成でパーティーが編成済み

「ぼうけんのしょ3」を新規作成すると、最後のステレオ・モノラル選択直後、 性格診断から始まらずに、図のフロア(テスト)からゲームが始まる。 勇者の性格は「まけずぎらい」であり、レベルがすでに 99 になっている。 そして、3 人の仲間「モツオ」「はげまる」「いんちき」とパーティーを組んでいる。 それぞれレベル 99 の戦士、魔法使い、遊び人だ。 いずれも呪文はすべて習得済みであり、性格が空白になっている。

図 5.24 謎のパーティー

謎のパーティー

5.32.2.4. ゲームショーモード

おそらく $C1FFFE の値が #$0001 であるビルドは、 SFC 版ドラクエ 3 の発売以前にゲームショー等でプログラムを動作させるためのものだと思われる。 製品ビルドとの振る舞いの違いには次のようなものがある。

  • 王様等の記録処理において、冒険の書を実は記録しなくなる。

  • 仲間キャラクターのレベルが 5 を上限に上がらなくなる。 ただし経験値は普通に上がっていく。

  • いざないの洞くつで「まほうのたま」を設置すると、 なぜか「すべてをつかさどる者」の台詞 (ID: #$0FAC-#$0FB1) が出現して、ゲームが終了する (画面暗転後、ENIX のロゴマーク表示)。 そして、冒険の書選択画面になる。

    図 5.25 まほうのたま使用直後

    まほうのたま使用直後