3.15. アイテム解析

3.15.1. $23B081 アイテム価格配列
3.15.2. $23B159 アイテム各種フラグ配列
3.15.3. $23B231 アイテム種別配列
3.15.4. $23B309 インパス参照 1 配列
3.15.5. $23B3E1 インパス参照 2 配列
3.15.6. $23B4B9 アイテム上昇パラメータ配列
3.15.7. $23B591 アイテム装備可能フラグ(人間)配列
3.15.8. $23B669 アイテム装備可能フラグ(モンスター)配列

SFC 版ドラクエ 5 におけるアイテムの表現方法の特徴は、 アイテムを構成するすべてのパラメータ・データを、まとめて一つの構造体に配列していないところにある。 その代わり、各パラメータ・データそれぞれを配列しているような感じである。

アイテムに関係するパラメータ・データの配列のアドレスが バンク $23 内のある領域に連続して出現するため、 そこにあるすべての配列だけでアイテムデータを構成すると考えてよいだろう。 なお、アイテム名を表す文字列は別のところにある(3.7.2 文字列へのアクセス方法参照)。

3.15.1. $23B081 アイテム価格配列

アドレス $23B081 に 1byte データの配列がある。 配列長はアイテム ID 総数と同じく 216 である。 これはアイテム価格そのものが配列されているのではなく、 価格を 10 の N 乗で割ったものが配列されている(意図は不明)。 SFC 版ドラクエ 5 では、各アイテムの値段データを以下のような形で内部的に格納している。 $23B081 から格納されているのは P のデータである。

P * Q, (where 0 <= P and P < 256; 0 <= Q and Q < 65536)

プログラムはこの配列のインデックスを次の配列(3.15.2 $23B159 アイテム各種フラグ配列参照)内から取得する。

3.15.2. $23B159 アイテム各種フラグ配列

アドレス $23B159 に 1byte データの配列がある。 配列長はアイテム ID 総数と同じく 216 である。 この配列の各データは、そのアイテムに関する各種フラグビット列である。

メモリレイアウトは次のとおりである。

表 3.37 $23B159 配列 アイテム各種データ メモリレイアウト

Byte:Bit 80 40 20 10 08 04 02 01
00 「つかう」表示 仲間につかう 消耗品 処分不可 下取不可 不明 値段 Q

「つかう」表示

例えば、移動中に「ひのきのぼう」をつかうと、 最初に表示されるメッセージは 「○○○○は ひのきのぼうを つかった!」となる。 これが一般的なメッセージであるが、アイテムによっては例えば 「○○○○は においぶくろを あけた!」のように、 多少凝った文言を表示する。 それを区別するためのフラグである。

仲間につかう

1 であるアイテムは、使用者以外の仲間を対象にできる。 例えば「やくそう」「どくけしそう」はこのビットが 1 である。 それに対し、「ちからのたね」「せかいじゅのしずく」「キメラのつばさ」など、 仲間一人を特定しないで「つかう」アイテムは 0 である。

消耗品

1 であるアイテムは消耗品である。 例えば「せかいじゅのは」を死んでいる仲間に対してつかうと、 生き返った後に「せかいじゅのは」がなくなる。

処分不可

1 であるアイテムは、「すてる」と「それを捨てるなんてとんでもない!」と表示される。 また、特定のキャラクターに渡せないアイテムでもある。

下取不可

店屋に売りたくても買い取ってくれないアイテムであれば 1 である。

不明

プログラム中で読み取られている様子がない。しかし、 データ表を調べると 3 ビット目の値と一致している。

値段 Q

3.15.1 $23B081 アイテム価格配列で述べたアイテム価格表現における Q のデータを格納する配列 $21A47B のインデックスである。 $21A47B に存在する 2byte データの配列長 4 の配列である。 C 言語風に書くと、以下のようなものである。

Q[4] = {1, 10, 100, 1000};

3.15.3. $23B231 アイテム種別配列

アドレス $23B231 に1byte データの配列がある。 配列長はアイテム ID 総数と同じく 216 である。 これも基本的には各種フラグを詰め合わせた値の配列である。 メモリレイアウトを以下に示す。

表 3.38 $23B231 アイテム種別配列 1 バイトのメモリレイアウト

Byte:Bit 80 40 20 10 08 04 02 01
00 移動時つかう 戦闘時つかう 戦闘時対象 戦闘時だれに直後 呪い 種別

移動時つかう

1 のとき、このアイテムを移動中に「つかう」と、 「しかし 今は 何も おこらなかった……!」と表示される。

戦闘時つかう

1 のとき、このアイテムを戦闘中に「つかう」と、 「だれに」ウィンドウが表示される。

戦闘時対象

戦闘中に「つかう」ときの対象が、味方側か敵側なのかを表す。 1 のとき、対象が敵側であることを示す。

戦闘時だれに直後

詳細不明。

呪い

1 であるアイテムは呪いがかけられている。 すなわち、このアイテムを装備するキャラクターは、呪い状態になることを意味する。

種別

プログラムは 3bit の値でアイテム種別を取り扱う。 大体以下のように分類されているようだ。

表 3.39 アイテム種別

種別
0 ぶき
1 よろい
2 たて
3 かぶと
4 一般?
5 ほしふるうでわ
6 ビアンカのリボン
7 一般装飾品?

3.15.4. $23B309 インパス参照 1 配列

アドレス $23B309 に 1byte データの配列がある。 配列長はアイテム ID 総数と同じく 216 である。 インパスをアイテムに対して適用した際に表示するメッセージを制御するためのビット群からなる値である。

表 3.40 $23B309 インパス参照 1 メモリレイアウト

Byte:Bit 80 40 20 10 08 04 02 01
00 非消耗判定 売値表示 特別効果メッセージ

非消耗判定

インパスによる鑑定中に 「何回つかってもなくならないらしい」メッセージを含めるビットである。 1 のときに表示する。

売値表示

インパスによる鑑定中に 「もし店屋に売れば」メッセージを含めるビットである。 1 のときに表示する。

特別効果メッセージ

この 6bit の値は、インパスによる鑑定中に、何らかの特別効果があることを教えるメッセージを制御する。 値とメッセージの対応の一例を以下に示す。

表 3.41 特別効果メッセージ

メッセージ
0 表示一切なし
1 特別な効果はないようだ
2 特別な効果があるようだ
3 伝説の勇者が~
4 これで急所をつけば~

3.15.5. $23B3E1 インパス参照 2 配列

アドレス $23B3E1 に 1byte データの配列がある。 配列長はアイテム ID 総数と同じく 216 である。 前項の続きのようなものである。

表 3.42 $23B3E1 インパス参照 2 メモリレイアウト

Byte:Bit 80 40 20 10 08 04 02 01
00 種別表示 装備可能性表示 戦闘時表示メッセージ

非消耗判定

インパスによる鑑定メッセージ中に 「何回つかってもなくならないらしい」メッセージを表示するビットである。 1 のときに表示する。

装備可能性表示

インパスによる鑑定メッセージ中に 「これを装備できるのは……」メッセージを表示するビットである。 1 のときに表示する。

戦闘時表示メッセージ

これはインパスとは関係ないメンバーである。 1 のアイテムに対しては、戦闘時に「つかう」と特殊なメッセージを表示することになることを示すビットである。

3.15.6. $23B4B9 アイテム上昇パラメータ配列

アドレス $23B4B9 に 1byte データの配列がある。 配列長はアイテム ID 総数と同じく 216 である。 アイテムが武器であれば攻撃力の上昇値、 身に着けるものならば守備力の上昇値……といったパラメータの配列である。

3.15.7. $23B591 アイテム装備可能フラグ(人間)配列

アドレス $23B591 に 1byte データの配列がある。 配列長はアイテム ID 総数と同じく 216 である。 各アイテムを装備できる人間の仲間キャラクターを示すフラグをまとめたものである [7]

表 3.43 装備可能マスク

マスク キャラクター
80 主人公
40 ビアンカ ビアンカ幼
20 ヘンリー
10 フローラ
08 サンチョ
04 ピピン
02 クーパー
01 アニー
00 パパス ベラ

3.15.8. $23B669 アイテム装備可能フラグ(モンスター)配列

アドレス $23B669 に 2byte データの配列がある。 配列長はアイテム ID 総数と同じく 216 である。 各アイテムを装備できるモンスターの仲間キャラクターを示すフラグマスクである [8]

表 3.44 装備可能マスク

マスク 仲間モンスター
8000ベビーパンサー キラーパンサー
4000 スライム ホイミスライム はぐれメタル ベホマスライム キングスライム スライムベホマズン
2000ドラキー ダンスニードル ばくだんベビー
1000ドラゴンキッズ
0800ブラウニー オークキング エリミネーター
0400スライムナイト ソルジャーブル アンクルホーン
0200まほうつかい ネーレウス
0100パペットマン ゴーレム
0080クックルー キメラ ホークブリザード
0040くさったしたい ばくだんいわ
0020イエティ ビックアイ ミニデーモン アームライオン
0010おどるほうせき メガザルロック
0008ケンタラウス
0004ドラゴンマッド グレイトドラゴン
0002キラーマシン ヘルバトラー
0001メッサーラ シュプリンガー ライオネック



[7] これとは別に、アドレス $21A632 にある 1byte 値の配列が各キャラクターに対応するマスク値を定義する。

[8] わかりにくいのを承知で書かせてもらうと、 アドレス $23AED1 にある 9byte 構造体データの最後の 1byte の下位 4 ビットが各キャラクターに対応するマスクである。 この 4 ビット値が、アドレス $21A63E にあるモンスター装備マスク配列のインデックスとなる。