5.23. アイテム解析

5.23.1. 解析
5.23.1.1. $C40043 アイテム構造体

本章の目的は、すべてのアイテムデータを抽出し、 構造体の各フィールドを完全解析することである。

5.23.1. 解析

アイテム解析は定番中の定番なので、すでに先人の手が入っている (例えば [URL1])。 基礎データは解析済であるので、以下ではより細部の解析を試みる。

5.23.1.1. $C40043 アイテム構造体

アドレス $C40043 に全アイテムのデータが定義されている。 1 アイテム当たりが占めるデータ量は #$0013 byte であり、 これが #$E5 (229) 個配列されている。

アイテム構造体のメモリレイアウトは以下のようになっている。

表 5.31 $C40043 アイテム構造体

Byte:Bit 80 40 20 10 08 04 02 01
00 名前文字列 ID (2byte)
01
02 アイテム種別 (1byte)
03 装備パラメータ種別 (1byte)
04 装備によるパラメータ増加値 (2byte)
05
06 職業による装備可能性(次のバイトの下位に続く)
07 整理フラグ 性別 (2bit) 呪いフラグ 希少フラグ 可処分フラグ 消耗フラグ (続き)
08 戦闘行動 ID(次のバイト下位へ続く)
09 大事フラグ $FEE82C 構造体 ID (6bit) (続き)
0A 価格 (3byte)
0B
0C
0D 職業による使用可能性 (2byte)
0E
0F 移動時「つかう」処理 ID (1byte)
10 「みる」「みせる」処理 ID (1byte)
11 アイコン ID (7bit) 謎ビット
12 性格 ID (1byte)

名前文字列 ID

アイテムの名前を表す文字列 ID である。

アイテム種別

アイテムの種類を表す数値である。以下のようになっている。

表 5.32 アイテム種別

意味
0 ぶき
1 よろい
2 たて
3 かぶと
4 そうしょくひん
5 どうぐ


装備パラメータ種別

あるキャラクターがその道具を装備することができるとき、 装備することによって、 そのキャラクターの増加するパラメータが何であるかを示す値である。

表 5.33 装備パラメータ種別

増加するパラメータ
0 (なし)
1 こうげきりょく
2 すばやさ
3 しゅびりょく
4 かしこさ
5 うんのよさ
6 たいりょく


装備によるパラメータ増加値

あるキャラクターがその道具を装備することができるとき、 装備することによって、 そのキャラクターのパラメータがどれだけ増加するかを示す値である。

職業による装備可能性

このアイテムが装備可能であるとき、 キャラクターの職業によって装備ができるか、そうでないかを示す値である。 1 ビットのフィールドが職業一つに対応しており、 このフィールドの値が 1 のときに限り装備可能である。

表 5.34 アイテム構造体 職業による装備可能性

Byte:Bit 80 40 20 10 08 04 02 01
06 遊び人 商人 賢者 武闘家 僧侶 魔法使い 戦士 勇者
07 盗賊


消耗フラグ

その道具に対する「つかう」コマンドが成功したときに、 その道具を消耗しないのであれば 1 が、 そうでなければ 0 が格納されている。 例 「やくそう」は 0 であるが「けんじゃのいし」は 1 である。 例 「めざめのこな」等は 1 である。

可処分フラグ

その道具を「すてる」ことができるかどうかを示す値である。 1 ならば捨てられるが、0 ならば捨てることができない。

希少フラグ

その道具がいわゆるレアアイテムであるかどうかを示す値である。 1 ならばレアであり、 店屋でその道具を売ろうとすると、店屋から確認の問い合わせを食らう。 プログラムの中では上記の可処分フラグを優先的に参照する場合が多いようだ。

呪いフラグ

あるキャラクターがその道具を装備できるとする。 もしその道具を装備した場合、呪われるか否かを示す値である。 このフィールドは 1 ならば、呪いがかかっている道具である。 ちなみに、そのような道具は 8 種類存在する。

性別

その道具を装備するために、 キャラクターに性別に関する条件がつくか否かを示す値である。

表 5.35 性別

意味
0 おとこ専用
1 おんな専用
2 指定なし


ちなみに装備用のアイテムではないので問題はないのだが、 「あたまがさえるほん」のこのフィールドの値はなぜか 1 である。

整理フラグ

「さくせん→どうぐせいり→だれの」コマンドにおいて、 その道具がキャラクターの持ち物リストにあるとき、 それをふくろに収納するかどうかを示す値である。 1 ならばふくろに移すが、0 ならばそのままキャラクターの持ち物リストに残す。

戦闘行動 ID

戦闘中にその道具を「つかう」と起こる戦闘行動の ID である。 特に効果のない道具の値は #$6B であることを憶えておくとよい。

大事フラグ

「どうぐ」コマンドでキャラクターの持ち物リストをカーソルが動くときに、 画面右上に小さく表示するウィンドウの中身を 「だいじなもの/ひつようなときにつかおう」 にするかどうかを示す値である。

$FEE82C 構造体 ID

[URL3] によると、 戦闘時のグラフィックとか音とかを定義する構造体のデータ ID と思われる。 詳細調査中。

価格

その道具を店屋で買うときに必要な価格である。

職業による使用可能性

キャラクターの職業によって、 このアイテムを戦闘中に「つかう」ことができるかどうかを示す値である。 1 ビットのフィールドが職業一つに対応しており、 このフィールドの値が 1 のときに限り装備可能である。

表 5.36 アイテム構造体 職業による使用可能性

Byte:Bit 80 40 20 10 08 04 02 01
0D 遊び人 商人 賢者 武闘家 僧侶 魔法使い 戦士 勇者
0E 0 盗賊


移動時「つかう」処理 ID

移動時における「つかう」コマンドによる処理を指示する値である。 端的に言えばジャンプテーブル $C30B31 のインデックスである。

「すごろくけん」(ID: #$00E4) を例を挙げる。 ダンプによると、このフィールドの値は #$0058 である。

C3/0B31:    970DC9  // 0000
C3/0B34:    990DC9  // 0001
C3/0B37:    AB0DC9  // 0002
...
C3/0C39:    161DC9  // 0058

$C91D16 のコードが「すごろくけん」を移動時に「つかう」処理を実装していることがわかる。

C9/1D16:    22D4A8C1    JSR $C1A8D4    1
C9/1D1A:    9A0D
C9/1D1C:    22D4A8C1    JSR $C1A8D4    2
C9/1D20:    9C0D
C9/1D22:    22F740C3    JSR $C340F7
C9/1D26:    18          CLC 
C9/1D27:    6B          RTL

1

メッセージ #$0D9C を表示する。すなわち [C0]は [B5]を[AD]にぎりしめた![AF][AC]

2

メッセージ #$0D9C を表示する。すなわち なんだか 胸が わくわくする。[AC]

「みる」「みせる」処理 ID

パーティに職業が商人であるキャラクターがいるときに、 道具を「みる」または「みせる」ときの処理を指示する値である。 端的に言えばジャンプテーブル $C30C66 のインデックスである。

以下に「やくそう」(ID: #$00B8) の「みる」処理のコードを記す。

C9/276A:    BFBD25C9    LDA $C925BD,X       1
C9/276E:    225AA9C1    JSR $C1A95A
C9/2772:    BF8925C9    LDA $C92589,X       2
C9/2776:    225AA9C1    JSR $C1A95A
C9/277A:    208127      JSR $2781           3
C9/277D:    20A827      JSR $27A8           4
C9/2780:    6B          RTL

1

「やくそう」を鑑定するときには、X の値は 0 だ。 従って $C925BD の値である #$0E10 をメッセージ ID として A に取る。 それをサブルーチン JSR $C1A95A の呼び出しにより表示する。

すなわち、[CD][C0]「これは 体力を 回復する[AD]くすりのようです。[AF][AC] を表示する。

2

同様にして、メッセージ #$0DC1 を表示する。 [CD][C0]「でも いちど使うと[AD]なくなってしまうようですね。[AF][AC]

3

サブルーチン $2781 を呼び出し、売値鑑定の処理を行う。

4

サブルーチン $27A8 を呼び出し、呪い鑑定の処理を行う。

謎ビット

いくら解析しても、このフィールドを参照しているコードがない……。

アイコン ID

ダンプリストの観察結果や、 参照位置周辺の処理(コードで言うとバンク $C5$C6 に二箇所ずつある)の流れからすると、 プレイヤーが「しらべる」コマンドで何らかのアイテムを発見したときや、 すごろくイベントでアイテムを見つけたときに 画面上に描画する小さな画像(便宜的にアイコンと呼ぶ)の ID ではないかと思われる。

性格 ID

その道具が装備品であれば、キャラクターがそれを装備したときに変化する性格の性格 ID である。 その道具が本であれば、キャラクターがそれを「つかう」と変化する性格の性格 ID である。 これはサブルーチン $C452E3 からコードを辿っていくとわかる。 「エッチなほん」に関しては、サブルーチン $C45319 で性別により性格を振り分けている。