本節では「どうぐ」アイテムについての詳細を説明していく。 まず、アイテムを構成する各属性をプログラムではどのように表現しているのかについて簡単に述べる。 それから、アイテムの属性それぞれの物理的な定義位置と、性質を述べる。 最後に、ゲーム中に現れるアイテム全てのデータを抽出して CSV ファイルを作成する。
SFC 版ドラクエ 5 ではアイテムデータの物理的な表現方法に特徴がある。 後続のシリーズでの実装では、アイテムだけでなく、キャラクターにせよコマンドにせよ、 ゲーム構成要素の定数的な属性の全てを一つの構造体にカプセル化して定義し、 そのオブジェクトをメモリー上で連続的に配列することで定義するというのが標準的な表現手法だ。 ところが本プログラムでは、アイテムオブジェクトを属性ごとに分割して、それぞれを別々の場所で配列するという手法を採っている。
本書では、アイテムを次のようにモデル化し、議論を進める:
表 3.44 アイテムモデル
属性 | 定義開始位置 | 意味 |
---|---|---|
ID | n/a | アイテムに関連付けられている 1 バイトサイズの一意的な値 |
名前 |
$23CE0E
|
3.7.2 文字列へのアクセス方法参照 |
値段 | $23B081 および $23B159 |
(本節で後述する) |
売却禁止 |
$23B159
|
(本節で後述する) |
廃棄禁止 | ||
消耗品 | ||
移動時対象者指定 | ||
移動時定型文省略 | ||
分類 |
$23B231
|
(本節で後述する) |
呪い | ||
戦闘時複数対象 | ||
戦闘時対敵用途 | ||
戦闘時対象選択 | ||
移動時利用 | ||
特別効果鑑定 |
$23B309
|
(本節で後述する) |
売値鑑定 | ||
消耗性鑑定 | ||
戦闘時メッセージ |
$23B3E1
|
(本節で後述する) |
装備可能者鑑定 | ||
分類鑑定 | ||
変化量 |
$23B4B9
|
(本節で後述する) |
装備許可フラグ列 | $23B591 および $23B669 |
(本節で後述する) |
オブジェクト指向的な発想では、アイテムには上に挙げた属性だけではなく、振る舞いという特徴もある。 ただし、振る舞いについては本節では扱わずに、戦闘コマンドと移動コマンドという枠組で議論をしたい。
本節ではアイテムの属性それぞれの物理的な定義位置と性質を述べていく。
アドレス $23B081
から始まる 1 バイトデータの配列は、アイテムの価格情報を表現する。
これはアイテムの価格そのものが配列されているのではなく、
価格を 10 の N 乗で割ったものが配列されている。
その N を格納する配列がアドレス $23B159
から始まっている。
言い換えると、SFC 版ドラクエ 5 では、各アイテムの価格を次のような形で物理的に格納している:
P * Q, (where 0 <= P and P < 256; 0 <= Q and Q < 65536)
このデータ表現を採用することで、消費する ROM が 135 バイトほど節約できる。 上記計算コードのメモリー量が 135 を下回っていれば、全体としても節約できたと言える。
アドレス $23B159
には次の表で示す 1 バイト長構造体の配列がある。
主に移動中でのアイテムの振る舞いや性質に関係する属性を集めたようだ。
表 3.45 $23B159 構造体
桁 | 属性 |
---|---|
#$03
|
値段オーダー |
#$04
|
(未使用) |
#$08
|
売却禁止 |
#$10
|
廃棄禁止 |
#$20
|
消耗品 |
#$40
|
移動時対象者指定 |
#$80
|
移動時定型文省略 |
値段オーダーとは、前項で述べたアイテム価格表現における 10 のべき乗項だ。
ただし、実際のデータとしては、10 のべき乗の数値を格納する配列 $21A47B
の添字として実現している。
C 言語風に表せば、次の配列のような定数配列が存在して、その添字そのものだということだ。
Q[4] = {1, 10, 100, 1000};
売却禁止とは、どの店においてもこのアイテムを売却処分することをプレイヤーに禁じるためのフラグ型属性だ。 この値が 1 であれば、売却を許さない。
廃棄禁止とは、このアイテムを「すてる」ことを許さないことを意味するフラグ型属性だ。 この値が 1 であれば、廃棄処分が許さないことを意味する。 また、特定のキャラクターに渡せないアイテムであることをも意味する。 例えば「ラーのかがみ」をヘンリーに「わたす」ことは、このフラグのせいで実現できない。
消耗品とは、このアイテムを「つかう」と消滅するというフラグ型性質だ。 例えば「せかいじゅのは」を死んでいる仲間に対して「つかう」と、 生き返った後に「せかいじゅのは」がなくなる。
この値が 1 であれば、「つかう」により対象アイテムを消費する。
仲間用とは、このアイテムに対応する移動中のコマンドが、所持者以外の仲間一人を対象とすることを示すフラグ型属性だ。 言い換えると、「だれに」ウィンドウの表示を必要とするかどうかを意味する。 例えば「やくそう」「どくけしそう」はこのビットが 1 である。 それに対し、「ちからのたね」「せかいじゅのしずく」「キメラのつばさ」など、 仲間一人を特定しないで「つかう」アイテムは 0 である。
専用メッセージ表示とは、移動中にこのアイテムを「つかう」と表示するメッセージを、 定型文の表示を省略して、アイテム固有のものにするかことを示すというフラグ型属性だ。
例えば、移動中に「ひのきのぼう」をつかうと、 最初に表示されるメッセージは 「○○○○は ひのきのぼうを つかった!」となる。 これが一般的なメッセージであるが、アイテムによっては例えば 「○○○○は においぶくろを あけた!」のように、 独自の文言を表示する。
この値が 1 であれば、移動中にアイテムを「つかう」と、
メッセージ ID #$01A2
のメッセージを表示せずに、
アイテムに対応するどうぐコマンドハンドラーによる固有のメッセージ出力に頼る。
アドレス $23B231
には次の表で示す 1 バイト長構造体の配列がある。
主に戦闘中でのアイテムの振る舞いや性質に関係する属性を集めたようだ。
分類とは、武器類や盾類等のアイテムの分類を管理するための数値だ。 プログラムは 3 ビットの値でアイテム分類を取り扱う。 以下のように分類されている。
呪いとは、これを装備すると呪いの効果音が鳴ることを示すフラグ型属性だ。 この属性の値が 1 であれば、「そうび」直後に呪いの効果音が鳴る。
戦闘時複数対象とは、戦闘中に使用する対象が味方全員、敵グループ、あるいは敵全体に作用することを示すフラグ型属性だ。 言い換えると、効果がキャラクター単体ではないようなアイテムである。 この属性の値が 1 であれば、このアイテムの対象が複数あるものとする。
戦闘時対敵用途とは、戦闘中に使用する対象が敵側であることを示すフラグ型属性だ。 この属性の値が 1 であれば、アイテムを戦闘中に使用すると、敵側に効果がある振る舞いを引き起こすものとする。
戦闘時対象選択とは、戦闘中にこのアイテムを選択するか「つかう」と、 プレイヤーにその対象を指定させることを示すフラグ型属性だ。
この属性の値が 1 であるアイテムを戦闘中に選択するか「つかう」と、 前述の戦闘時対敵用属性も考慮した上で、 「だれに」ウィンドウまたはモンスターグループ選択ウィンドウを表示するものとする。
戦闘時利用とは、戦闘時に「つかう」と対応する戦闘コマンドが発動するようなフラグ型属性だ。 この属性の値が 1 であるアイテムを戦闘中に使用すると、「特別な効果がある」のだ。 また、移動中に「つかう」と「しかし 今は 何も おこらなかった……!」と表示される。
付録 B データ に関連戦闘コマンド一覧を掲載する。
アドレス $23B309
には次の表で示す 1 バイト長構造体の配列がある。
「インパス」の呪文コマンドをアイテムに対して適用した際に表示するメッセージを制御するフラグ群だ。
特別効果鑑定とは、インパス鑑定中に、何らかの特別効果があることを示すメッセージを特定するための ID 型属性だ。
メッセージ出力処理がテーブル参照とプログラム的処理のハイブリッドになっているので、まとめにくい。
どの没アイテムについてもゼロがセットされている。
この値が #$38
未満ならば、
メッセージ ID #$048F
からのオフセット値として用いられる。
この値がそれ以外の値であれば、メッセージ表示をプログラムで指定する。
該当アイテムは「てんくうのよろい」「ふうじんのたて」「てんくうのたて」だけだ。
売値鑑定とは、インパス鑑定中に、売値を鑑定するかどうかを示すフラグ型のアイテム属性だ。 この属性の値が 1 であるアイテムを鑑定すると、売却時に得られるゴールドがわかる。
消耗性鑑定とは、インパス鑑定中に、このアイテムの消耗品属性が 0 であるときに、 「何回つかってもなくならないらしい」メッセージを表示することを示すフラグ型のアイテム属性だ。 この属性の値が 1 であるアイテムを鑑定すると、この文言が示される。
インパス自身の挙動については、移動時の呪文コマンドの節で述べたい。
アドレス $23B309
には次の表で示す 1 バイト長構造体の配列がある。
前項の続きに加え、戦闘時のメッセージ出力に関するものもある。
戦闘時表示メッセージとは、戦闘時に「つかう」と専用メッセージを表示することを示す ID 型のアイテム属性だ。
この属性値が #$06
ならば、動的にメッセージを変更することがあるが、
それ以外は戦闘メッセージ ID が格納されている配列 $2781D0
のインデックスを表現している。
配列 $2781D0
は戦闘メッセージ ID の対を要素とする。
一例を挙げる。例えば「ほのおのリング」の当属性値は #$1F
だ。
これが指す配列要素は
27/820E: CE EB
となっている。それぞれのメッセージ ID に対応するテキストは 付録 B データ にある戦闘メッセージ CSV ファイルで確認できるようにしてある。
装備可能者鑑定とは、フラグ型のアイテム属性であり、 インパスによる鑑定中に「これを装備できるのは……」メッセージを表示することを示すものだ。 この属性の値が 1 のときにこの表示処理が入る。
分類鑑定とは、インパスによる鑑定中に前述したアイテム分類を鑑定するかどうかを示すフラグ型のフラグ型のアイテム属性だ。 この属性の値が 1 のときにこの表示処理が入る。
アドレス $23B4B9
には、使用対象キャラクターの何らかの属性値に対する変化量そのものの配列がある。
変化量とは、例えばアイテムが武器であれば攻撃力の上昇値、
身に着けるものならば守備力の上昇値、というような値のことだ。
値は 1 バイト長だ。 変化量が特殊なものか、または変化をまったく引き起こさないアイテムの属性値はゼロになっている。
アドレス $23B591
にある 8 ビット列の配列は、
各ビットがそのアイテムをビット位置に対応するキャラクターが装備できるかどうかを示すフラグである。
値が 1 ならば装備を認める。
表 3.50 $23B591 構造体
桁 | 装備を認めるキャラクター |
---|---|
#$80
|
主人公 |
#$40
|
ビアンカ |
#$20
|
ヘンリー |
#$10
|
フローラ |
#$08
|
サンチョ |
#$04
|
ピピン |
#$02
|
クーパー |
#$01
|
アニー |
ビアンカは子供大人共通とする。パパスとベラはいずれにも該当していない。
アドレス $23B639
にある 16 ビット列の配列は、
各ビットがそのアイテムをビット位置に対応するキャラクターが装備できるかどうかを示すフラグである。
値が 1 ならば装備を認める。
表 3.51 $23B669 構造体
桁 | 装備を認めるキャラクターのモンスター名 |
---|---|
#$8000
|
ベビーパンサー キラーパンサー |
#$4000
|
スライム ホイミスライム はぐれメタル ベホマスライム キングスライム スライムベホマズン |
#$2000
|
ドラキー ダンスニードル ばくだんベビー |
#$1000
|
ドラゴンキッズ |
#$0800
|
ブラウニー オークキング エリミネーター |
#$0400
|
スライムナイト ソルジャーブル アンクルホーン |
#$0200
|
まほうつかい ネーレウス |
#$0100
|
パペットマン ゴーレム |
#$0080
|
クックルー キメラ ホークブリザード |
#$0040
|
くさったしたい ばくだんいわ |
#$0020
|
イエティ ビックアイ ミニデーモン アームライオン |
#$0010
|
おどるほうせき メガザルロック |
#$0008
|
ケンタラウス |
#$0004
|
ドラゴンマッド グレイトドラゴン |
#$0002
|
キラーマシン ヘルバトラー |
#$0001
|
メッサーラ シュプリンガー ライオネック |
本節で説明したアイテム属性を単独の CSV ファイルに統合して 付録 B データ に収録する。