4.13. アイテム

4.13.1. 構造体 $C4003D: アイテム
4.13.2. アイテム構造体メソッド

本節ではアイテム一般のデータ構造について述べる。 アイテムを表現する構造体をメンバーごとに簡単に解説した後、 プログラムがそれらの属性をどのように参照や更新するのかについてまとめていく。

アイテムの引き起こす振る舞いについては、移動モードと戦闘モードの両方について考慮する必要がある。 前者については 4.24 移動中の道具使用コマンド処理 で述べる。 後者については戦闘コマンドとして実装されているので 4.22 戦闘コマンド が関連項目となる。

4.13.1. 構造体 $C4003D: アイテム

次の表に示すようなメモリーレイアウトの構造体オブジェクトがアドレス $C4003D から 256 個配列されている。 本章ではこの型をアイテム構造体と呼ぶことにする:

表 4.49 構造体 $C4003D

オフセット 属性
#$00 #$FFFF 名前
#$02 #$FFFF 価格
#$04 #$00FF
#$05 #$00FF アイテム分類
#$06 #$00FF 装備作用属性
#$07 #$FFFF 属性値変化量
#$09 #$FFFF かっこよさ変化量
#$0B #$0001 永続フラグ
#$0B #$0002 処分許可フラグ
#$0B #$0004 安全フラグ
#$0B #$0008 (未使用)
#$0C #$0010 装備者 #$00
#$0C #$0020 装備者 #$01
#$0C #$0040 装備者 #$02
#$0C #$0080 装備者 #$03
#$0D #$0001 装備者 #$04
#$0D #$0002 装備者 #$05
#$0D #$0004 装備者 #$06
#$0D #$0008 装備者 #$07
#$0D #$0010 装備者 #$08
#$0D #$0020 装備者 #$09
#$0D #$0040 装備者 #$0A
#$0D #$0080 装備者 #$0B
#$0E #$0001 装備者 #$0C
#$0E #$0002 装備者 #$0D
#$0E #$0004 装備者 #$0E
#$0E #$0008 装備者 #$0F
#$0E #$0010 装備者 #$10
#$0E #$0020 装備者 #$11
#$0E #$0040 装備者 #$12
#$0E #$0080 装備者 #$13
#$0F #$0001 装備者 #$14
#$0F #$0002 装備者 #$15
#$0F #$0004 装備者 #$16
#$0F #$0008 装備者 #$17
#$0F #$0010 整理フラグ
#$0F #$1FE0 戦闘時攻撃アニメーション
#$10 #$00E0 消費度
#$11 #$FFFF つかうコマンドメッセージ
#$13 #$FFFF 鑑定メッセージ #$00
#$15 #$FFFF 鑑定メッセージ #$01
#$17 #$FFFF カジノコイン交換枚数
#$19 #$00FF

以下に各属性の概要を記す。

名前

このアイテムの名前を表す文字列の ID を値とする属性だ。 この文字列は仲間キャラクターの所持品リストウィンドウや店屋のメニューウィンドウに表示される。

文字列については 4.2 文字列 で述べる。

価格

価格とは、このアイテムを店屋で購入するときに必要となるゴールドの値を表す属性だ。

アイテム分類

すべてのアイテムオブジェクトをこの属性値で分類することができる。下の表のような意味がある:

表 4.50 アイテム分類

分類
0 武器
1 装飾品
2 道具
3
4
5

装備作用属性

装備作用属性とは、このアイテムを装備する仲間キャラクターに対して、 どの属性値を増加させるのかを表す値を取る属性だ。 値と作用する仲間キャラクター型の属性との対応を次の表に示す:

表 4.51 装備作用属性

作用する属性
0 なし
1 攻撃力
2 すばやさ
3 守備力

属性値変化量

属性値変化量とは、このアイテムを装備する仲間キャラクターに対して、 装備作用属性の値をどの値だけ増減させるのかを表す値を取る属性だ。 例えば、この属性値が 100 で装備作用属性値が 1 ならば、 攻撃力を 100 ポイント増加させることを意味する。

かっこよさ変化量

かっこよさ変化量とは、このアイテムを装備する仲間キャラクターに対して、 そのかっこよさ属性値をどの値だけ増減させるのかを表す値を取る属性だ。

この属性値に関しては負の値であるものがある。

永続フラグ

永続フラグとは、このアイテムを「つかう」ことによって、 オブジェクトが消滅せず、道具袋に残るかどうかを意味するブーリアン値を取る属性だ。

処分許可フラグ

処分許可フラグとは、このアイテムを捨てたり売ったりすることが許されているかどうかを意味するブーリアン値を取る属性だ。 宝箱等からこのアイテムを発見したときに効果音が再生されるか否かについても、この属性値で決まる。

この属性値が 0 ならば、永続フラグ属性値は 1 でなければならないと思わがちだが、 「せかいじゅのしずく」や「ときのすな」のような用例のものはその限りではない。 余談になるが、「ときのすな」を一度使うと消滅してしまうのはこれらの属性値から生じる現象ではなく、 別に存在する不具合による。

安全フラグ

安全フラグとは、このアイテムが装備について安全であるかどうかを意味するブーリアン値を取る属性だ。 といっても、プログラムを読み解いた限りでは、この属性値は意味のある使われ方をしていないようだ。 本作では呪いの状態の概念が存在しないからだ。

装備者 k (k = #$00..#$17)

4.16.1 構造体 $C8BD12: 仲間キャラクター特性 の属性「装備グループ」の項を参照して欲しい。

整理フラグ

整理フラグとは、移動中の「どうぐせいり」コマンドによって、 仲間キャラクターの装備状態にない所持品が「ふくろ」に収納されるかどうかを意味するブーリアン値を取る属性だ。 例えば「けんじゃのいし」等の回復用品や「まほうのじゅうたん」等の移動用品に 1 が設定されている。

戦闘時攻撃アニメーション

戦闘において、仲間キャラクターがこのアイテムを装備して標準攻撃コマンドを実行するときのアニメーションを指定する属性だ。

消費度

消費度とは、このアイテムを「インパス」コマンドで鑑定するときの内容を指示する属性値だ。 値と鑑定内容の対応は次のようなものだ:

表 4.52 消費度

鑑定結果
0 言及なし
1 一度きりの使い捨て
2 永続性がある
3 壊れることがある

先の永続性フラグ属性との違いは、「使う」の意味合いの違いから来るようだ。 永続性フラグでの「使う」はコマンドとしての「つかう」に対応し、 本属性での「使う」はそれに加えて、それ以外の状況での利用をも考慮して意味を表しているようだ。

つかうコマンドメッセージ

移動中にこのアイテムを「つかう」と(何も起こらないようなときに)表示されるメッセージの ID を値とする属性だ。

移動中のメッセージウィンドウに描画されるテキストについては 4.3 テキスト で述べる。

鑑定メッセージ k (k = #$00..#$01)

このアイテムを「インパス」コマンドで鑑定するときにメッセージウィンドウに描画されるメッセージの ID を値とする属性だ。

カジノコイン交換枚数

このアイテムをカジノの景品交換所で購入するときに必要となるコインの枚数を表す属性だ。

4.13.2. アイテム構造体メソッド

以下に $C4003D 構造体の各属性を参照するためのサブルーチンの一覧を示す。 アイテム ID の他に、他の構造体(仲間キャラクター構造体)をも呼び出し側が指定する必要があるものについては掲載しない。

表 4.53 アイテム構造体メソッド

サブルーチン 固定引数長 入力 出力 機能
$C45EB8 2 par0 par1 名前文字列を取得
$C45EEC 2 par0 par1 価格を取得
$C45F3C 2 par0 par1 下取価格を取得
$C460B7 2 par0 par1 攻撃力の変化量
$C46104 2 par0 par1 守備力の変化量
$C46151 2 par0 par1 すばやさの変化量
$C461CC 2 par0 par1 かっこよさの変化量
$C461FA 1 par0 c 処分禁止かどうかを判定
$C4624D 0 A A 装備作用属性を取得

固定引数長とあるのは、各 JSR 命令に続く非プログラムバイト列の長さのことだ。 入力列および出力列に現れる par0 および par1 は、固定引数列の 0 および 1 バイト目の値が示す何らかのアドレスまたはレジスターを意味する。 例えば値が 4A ならばアドレス $4A を意味し、 値が FF, FE, FD ならばレジスター A, X, Y をそれぞれ指定していることを意味する。 小文字の c は carry レジスターを意味する。

例として、アイテムのかっこよさを参照する処理を一つ挙げておく。 ここでは $C461CC の入力と出力がそれぞれ A と X レジスターとなる。 負であるかもしれない値と正の定数との大小比較のコードについてはここでの本題ではないので説明を省く。

C1/FB27:    AD4230      LDA $3042           ; アイテム ID
C1/FB2A:    22CC61C4    JSR $C461CC         ; かっこよさの変化量
C1/FB2E:    FFFE
C1/FB30:    8A          TXA
C1/FB31:    3005        BMI $FB38
C1/FB33:    C91500      CMP #$0015
C1/FB36:    B003        BCS $FB3B           if(かっこよさ < 0 || かっこよさ < 20){
C1/FB38:    006719      BRK #$1967              ; message #$1967: [DE]ああ こりゃひどい! センスの[AD]かけらもないや! (...)
                                            }

なお、この表にないアイテム属性の参照には、$C92C39 等の汎用の構造体メンバー参照サブルーチンを用いる。