本節ではアイテム一般のデータ構造について述べる。 アイテムを表現する構造体をメンバーごとに簡単に解説した後、 プログラムがそれらの属性をどのように参照や更新するのかについてまとめていく。
アイテムの引き起こす振る舞いについては、移動モードと戦闘モードの両方について考慮する必要がある。 前者については 4.24 移動中の道具使用コマンド処理 で述べる。 後者については戦闘コマンドとして実装されているので 4.22 戦闘コマンド が関連項目となる。
次の表に示すようなメモリーレイアウトの構造体オブジェクトがアドレス $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 文字列 で述べる。
価格とは、このアイテムを店屋で購入するときに必要となるゴールドの値を表す属性だ。
すべてのアイテムオブジェクトをこの属性値で分類することができる。下の表のような意味がある:
装備作用属性とは、このアイテムを装備する仲間キャラクターに対して、 どの属性値を増加させるのかを表す値を取る属性だ。 値と作用する仲間キャラクター型の属性との対応を次の表に示す:
属性値変化量とは、このアイテムを装備する仲間キャラクターに対して、 装備作用属性の値をどの値だけ増減させるのかを表す値を取る属性だ。 例えば、この属性値が 100 で装備作用属性値が 1 ならば、 攻撃力を 100 ポイント増加させることを意味する。
かっこよさ変化量とは、このアイテムを装備する仲間キャラクターに対して、 そのかっこよさ属性値をどの値だけ増減させるのかを表す値を取る属性だ。
この属性値に関しては負の値であるものがある。
永続フラグとは、このアイテムを「つかう」ことによって、 オブジェクトが消滅せず、道具袋に残るかどうかを意味するブーリアン値を取る属性だ。
処分許可フラグとは、このアイテムを捨てたり売ったりすることが許されているかどうかを意味するブーリアン値を取る属性だ。 宝箱等からこのアイテムを発見したときに効果音が再生されるか否かについても、この属性値で決まる。
この属性値が 0 ならば、永続フラグ属性値は 1 でなければならないと思わがちだが、 「せかいじゅのしずく」や「ときのすな」のような用例のものはその限りではない。 余談になるが、「ときのすな」を一度使うと消滅してしまうのはこれらの属性値から生じる現象ではなく、 別に存在する不具合による。
安全フラグとは、このアイテムが装備について安全であるかどうかを意味するブーリアン値を取る属性だ。 といっても、プログラムを読み解いた限りでは、この属性値は意味のある使われ方をしていないようだ。 本作では呪いの状態の概念が存在しないからだ。
#$00
..#$17
)
4.16.1 構造体 $C8BD12
: 仲間キャラクター特性 の属性「装備グループ」の項を参照して欲しい。
整理フラグとは、移動中の「どうぐせいり」コマンドによって、 仲間キャラクターの装備状態にない所持品が「ふくろ」に収納されるかどうかを意味するブーリアン値を取る属性だ。 例えば「けんじゃのいし」等の回復用品や「まほうのじゅうたん」等の移動用品に 1 が設定されている。
戦闘において、仲間キャラクターがこのアイテムを装備して標準攻撃コマンドを実行するときのアニメーションを指定する属性だ。
消費度とは、このアイテムを「インパス」コマンドで鑑定するときの内容を指示する属性値だ。 値と鑑定内容の対応は次のようなものだ:
先の永続性フラグ属性との違いは、「使う」の意味合いの違いから来るようだ。 永続性フラグでの「使う」はコマンドとしての「つかう」に対応し、 本属性での「使う」はそれに加えて、それ以外の状況での利用をも考慮して意味を表しているようだ。
移動中にこのアイテムを「つかう」と(何も起こらないようなときに)表示されるメッセージの ID を値とする属性だ。
移動中のメッセージウィンドウに描画されるテキストについては 4.3 テキスト で述べる。
#$00
..#$01
)
このアイテムを「インパス」コマンドで鑑定するときにメッセージウィンドウに描画されるメッセージの ID を値とする属性だ。
このアイテムをカジノの景品交換所で購入するときに必要となるコインの枚数を表す属性だ。
以下に $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
等の汎用の構造体メンバー参照サブルーチンを用いる。