Wiz

Wizardry(NES) データ構造
========================



Wiz10進表現

                    • -

"\x12\x34\x56" というデータで10進数の 123456 を表す、といった数値表現法がた
まに出てくる(EXP, 金など)。


ダイス式

              • -

// Size: 3
struct DiceExpr{
U8 個数
U8 面数
U8 追加値
}


乱数範囲

              • -

アイテムテーブル、モンスターテーブルで使われる。

// Size: 5
struct RandomRange{
U8 基本値
U8 増分
U8 増分を加える最大回数
U8 最後に加える乱数幅
U8 増分を加える確率
}

詳しくはルーチン $DEE2 を参照。


アイテムデータ

                          • -

// Size: 0x40
struct ItemData{
U8 不確定名_文字列長
char[16] 不確定名 // 余白は 0x20 で埋められている
U8 確定名_文字列長
char[16] 確定名 // 余白は 0x20 で埋められている

// -- 0x22 --
U8 種別
// 0x00:武器
// 0x01:鎧
// 0x02:盾
// 0x03:兜
// 0x04:小手
// 0x05:薬/巻物/イベントアイテム
// 0x06:その他の装備品

U8 アラインメント // 0x02:中立, 0x04:悪, 0x07:全て

U8 呪い // 0x00:呪われていない, 0xFF:呪われている

U8 スペシャルパワー
// 0x01:STR+1
// 0x11:忍者に転職
// 0x16:最大HP+1
// 0x17:パーティーのHPフル
//
// SCROLL of PAIN: 0x00
// SCROLL of AGONY: 0x00
// RING of MOVEMENT: 0x00
// RING of DISPELLING: 0x00
// 全てのSTATUE/KEY/RIBBON: 0x00
// その他: 0xFF

U8 使用/SP発動時に壊れる確率(256分率)
U8 壊れた場合に変化するアイテムID

U48 買値 // Wiz10進表現
U8 初期在庫数 // 0xFF:無限

U8 使用時の効果(魔法ID) // 0xFF:使用不可

// -- 0x30 --
U8 装備可能な職業 // 上位bitからNLSBTPMF

S8 ヒーリング

S8 AC修正値

S8 STR修正値
U8 最低攻撃回数
DiceExpr ダメージダイス

U8 クリティカルフラグ // ARMOR of LORDS, SHURIKENのみ 0xFF, 他は全て 0x00

U16 タイプ別打撃防御
// bit15: 竜
// bit14: 神話
// bit13: 巨人
// bit12: 小人・忍者(該当モンスターなし)
// bit11: 盗賊
// bit10: 僧侶
// bit9: 魔術師
// bit8: 戦士
// bit7: ?(タイプ15に対応。該当モンスターなし)
// bit6: ?(タイプ14に対応。該当モンスターなし)
// bit5: 魔法生物
// bit4: 昆虫
// bit3: 悪魔
// bit2: 不死
// bit1: 獣人
// bit0: 動物

U8 属性抵抗
// bit7: ?
// bit6: 呪文
// bit5: 石化
// bit4: 吸収
// bit3: 毒
// bit2: 冷気
// bit1: 火
// bit0: 友好
//
// WERDNA'S AMULET: 0xFE

U16 タイプ別倍打 // 倍打判定にはバグがあるので注意

U8 unknown // 常に 0
U8 unknown // 常に 0
}


モンスターデータ

                              • -

// Size: 0x6F
struct MonsterData{
U8 不確定名単数形_文字列長
char[15] 不確定名単数形 // 余白は 0x20 で埋められている
U8 不確定名複数形_文字列長
char[15] 不確定名複数形 // 余白は 0x20 で埋められている
U8 確定名単数形_文字列長
char[15] 確定名単数形 // 余白は 0x20 で埋められている
U8 確定名複数形_文字列長
char[15] 確定名複数形 // 余白は 0x20 で埋められている

// -- 0x40 --
U8 モンスタータイプ
// 0x00:戦士, 0x01:魔術師, 0x02:僧侶, 0x03:盗賊, 0x04:小人・忍者(存在しない),
// 0x05:巨人, 0x06:神話, 0x07:竜, 0x08:動物, 0x09:獣人,
// 0x0A:不死, 0x0B:悪魔, 0x0C:昆虫, 0x0D:魔法生物

U8 unknown // 常に 0

DiceExpr 出現数ダイス

DiceExpr HPダイス(ダイス個数=モンスターLVとなる)

S8 AC

// 最大攻撃回数はCHIMERAの6
U8 攻撃回数
DiceExpr[6] 攻撃ごとのダメージダイス

U8 エナジードレインLV
U8 ヒーリング

U8 アイテムテーブル(徘徊)
U8 アイテムテーブル(玄室)

// -- 0x60 --
U8 後続モンスターID
U8 後続モンスター出現確率(256分率)

U8 MAGE呪文LV
U8 PRIEST呪文LV

U8 unknown // LVL 7 FIGHTERのみ 0x00, 他は全て 0xFF

U8 ブレス属性

U8 呪文無効化率(256分率)

U8 属性抵抗

U8 弱点/特殊攻撃フラグ
// bit7: 常に0
// bit6: 仲間を呼ぶ
// bit5: 逃走する
// bit4: 弱点:眠
// bit3: 特殊:首
// bit2: 特殊:麻
// bit1: 特殊:毒
// bit0: 特殊:石

U8 unknown // 常に 0
U8 unknown // 常に 0
U8 unknown // 常に 0

U24 EXP // Wiz10進表現
}



キャラデータ

                      • -

// Size: 0x80
struct CharaData{
U8 unknown

U8 名前_文字列長
char[8] 名前 // 余白は 0x20 で埋められている

U8 種族 // 0:HUMAN, 1:ELF, 2:DWARF, 3:GNOME, 4:HOBBIT
U8 職業 // 0:FIG, 1:MAG, 2:PRI, 3:THI, 4:BIS, 5:SAM, 6:LOR, 7:NIN
U8 アラインメント // 0:善, 1:中立, 2:悪

U8 STRENGTH
U8 I.Q.
U8 PIETY
// -- 0x10 --
U8 VITALITY
U8 AGILITY
U8 LUCK

U48 GOLD // Wiz10進表現
U48 EXP // Wiz10進表現

U16 現在HP // ビッグエンディアン
// -- 0x21 --
U16 最大HP // ビッグエンディアン

U16 LV // ビッグエンディアン

U8 STATUS
// 0:OK, 1:ASLEEP, 2:AFRAID, 3:PARALY, 4:STONED, 5:DEAD, 6:ASHED, 7:LOST

S8 年齢
U8 週 // 0x34 で +1 歳

S8 AC

U8[7] MAGE呪文現在MP
// -- 0x30 --
U8[7] PRIEST呪文現在MP
U8[7] MAGE呪文最大MP
U8[7] PRIEST呪文最大MP

// -- 0x45 --
U8[7] 習得呪文(呪文ID順のビットセット)

U8[8] アイテム状態
// bit7: 装備
// bit6: 呪い
// bit5: 不確定名
// bit4:
// bit3:
// bit2:
// bit1:
// bit0:

// -- 0x54 --
U8[8] アイテムID

U8 アイテム個数

U8 unknown

U8 x座標
U8 y座標
// -- 0x60 --
U8 階層

U8 POISON値

U8[14] unknown
U8[16] unknown
}


* Wiz

Wizardry (NES) Memory Map
=========================

使い回しもあるので注意


RAM ($0000-$07FF)

                                • -

$10 U8 フレームカウンタ(ただし壁に当たったりすることで0にリセットされる)

$11-14 U8[4] 1P 入力バッファ
$15-18 U8[4] 2P 入力バッファ
$19 U8 スタックポインタ退避用



$1D-$20 U8[4] 方向キー入力記録用?入力処理の消費クロック数に影響


$2E-2F U16 間接アドレッシングのためにしばしばキャラデータアドレスが書き込まれる


$3B U8 x座標
$3C U8 y座標
$3D U8 階層
$3E U8 方角 # 0:北, 1:東, 2:南, 3:西

$3F ? ?

$40 U16 乱数



$6D U16/U8 打撃ダメージ/キャラメイク時の選択可能職業(bitset) # 打撃ダメージはU16



$84- ? メッセージバッファ?



$022A U8[8] 戦闘時のアイテム別装備フラグ

$0238-$023B U8[4]? unknown

$0249 char[8] キャラメイク時の名前
$0251 U8 キャラメイク時の種族 # 0:HUM, 1:ELF, 2:DWA, 3:GNO, 4:HOB
$0252 U8 戦闘/キャラメイク時の職業 # 0:FIG, 1:MAG, 2:PRI, 3:THI, 4:BIS, 5:SAM
$0253 U8 戦闘/キャラメイク時のアラインメント # 0:善, 1:中立, 2:悪
$0254 U8 キャラメイク時のSTRENGTH
$0255 U8 キャラメイク時のI.Q.
$0256 U8 キャラメイク時のPIETY
$0257 U8 キャラメイク時のVITALITY
$0258 U8 キャラメイク時のAGILITY
$0259 U8 キャラメイク時のLUCK

$025B U8 キャラメイク時のボーナスポイント


$0273-$276 U8[4] 現在階の未解析64Byteデータのうちのどれか4Byte(変化するようだが法則未解析)


$027A U8 直前x座標?
$027B U8 直前y座標?

$027C U8 戦闘時の攻撃者(術者)番号/宝箱開封時の開封者番号
$027D U8 戦闘時の被攻撃者番号
$027E U8 戦闘時の被攻撃者数($027D 以下、この数だけ攻撃される。存在しない分は無視)

# PTステータス
$027F U8 光源値 # 1歩で1減少。0xFF で無限(LOMILWA の場合)
$0280 U8 敵識別フラグ # 非0で識別あり。LATUMAPICを使うと 0xFF になる
$0281 S8 永続ACボーナス # 城に戻るまで常にこの値がPT全体のACに加算される。MAPORFICを使うと 0xFE (-2) になる
$0282 U8 呪文封じフラグ # 非0で呪文が効果を発揮しない("But nothing happens")。呪文封じエリアに踏み込むと 0xFF になる

$028D U8 unknown (呪文関係と思われる)

$028E U8 unknown (呪文関係と思われる)


$02BB U8 unknown


$0500 ItemData 戦闘時、アイテムデータがロードされる


$0540-$058F U8[0x50] 玄室エンカウントフラグ? # bit5が立っていると対応する玄室で玄室エンカウント




SRAM ($6000-$7FFF)

                                  • -

$6000 CharaData 訓練所リスト1人目のキャラデータ
$6080 U8[0x80] ?
# これが20人分存在する($73FF まで)

$7400 U8 ボルタック在庫初期化フラグ # 0:未初期化, 1:初期化済

$7401-7465 U8[101] ボルタックの在庫 # 0xFF で無限
# 0xFE の状態でもう1つ売っても 0xFE のまま。
# つまり元々在庫無限のもの以外は無限にならない



$7500-$75D2 char[211] 画面下のPTステータス画面表示用バッファ



$7870-$79EFあたり char[] キャラステータス画面表示用バッファ



$7ABF U8 先制値 # 0:無, 1:PT先制, 2:敵先制

$7AC0 U16 PT内でステータス異常にかかっていない者のLVの合計

$7AC2 U16 ステータス異常にかかっていない敵のLVの合計

$7AC4 U8 PT生存者数(DEAD以上で死亡と判定)
$7AC5-$7AC8 U8[4] 各敵グループの生存者数

$7AC9-$7ACC U8[4] 各敵グループのMAGE呪文LV
$7ACD-$7AD0 U8[4] 各敵グループのPRIEST呪文LV

$7AD1 U8 メイン敵ID
$7AD2-$7AD5 U8[4] 各敵グループのモンスターID

$7AD6-$7ADB U8[6] 各PTキャラのタイプ別打撃防御1Byte目
$7ADC-$7AE1 U8[6] 各PTキャラのタイプ別打撃防御2Byte目

$7AE2 U8[6] 各PTキャラの命中力

$7B0C-$7B12 U8[6] 各PTキャラのクリティカルフラグ

$7B36-$7B3B U8[6] 各PTキャラのヒーリング値

$7B60-$7B65 U8[6] 各PTキャラの攻撃回数



$7B8A-$7B8F U8[6] 各PTキャラの属性抵抗

$7BB4-$7BB9 U8[6] 各PTキャラのステータス
$7BBA-$7BDD U8[4][9] 敵のステータス # 存在しない敵は 0xFF
# グループ番号順に9Byteずつ。敵を普通に倒すと 0x05 (DEAD) になる。

$7BDE-$7C07 U8[42] 味方/敵の現在HPの下位バイト # 味方(PT並び順)、敵第1グループ、…という順
$7C08-$7C31 U8[42] 味方/敵の現在HPの上位バイト

$7C32-$7C5B U8[42] 味方/敵の最大HPの下位バイト
$7C5C-$7C85 U8[42] 味方/敵の最大HPの上位バイト

$7C86-$7CAF U8[42] 味方/敵のLV
# 味方のLVが 0xFF を超えている場合は 0xFF になる

$7CB0-$7CD9 U8[42] 戦闘時の行動ID
$7CDA-$7D03 U8[42] 戦闘時の行動順位

$7D04 U8[42] 沈黙値 # TODO: 値自体に意味はあるのか?

$7D2E-$7D33 U8[6]? unknown

$7D34-$7D57 S8[36] 敵のAC

$7D58-$7D5D U8[6] 各PTキャラの攻撃対象グループ番号(1-origin)

$7D82-$7D87 U8[6] 各PTキャラのダメージダイス個数
$7D88-$7D8D U8[6] 各PTキャラのダメージダイス面数
$7D8E-$7D93 U8[6] 各PTキャラのダメージダイス追加値

$7D94-$7D99 U8[6] 運勢値1
$7D9A-$7D9F U8[6] 運勢値2
$7DA0-$7DA5 U8[6] 運勢値3
$7DA6-$7DAB U8[6] 運勢値4
$7DAC-$7DB1 U8[6] 運勢値5

# 倍打判定にはバグがあるので注意
$7DB2-$7DB7 U8[6] 各PTキャラのタイプ別倍打1Byte目
$7DB8-$7DBD U8[6] 各PTキャラのタイプ別倍打2Byte目

$7DBE-$7DC3 U8[6] 各PTキャラのドレインを受けたかどうかのフラグ(0:受けてない、1:受けた)

$7DC4-$7DC9 U8[6] 各PTキャラのレベルの下位バイト
$7DCA-$7DCF U8[6] 各PTキャラのレベルの上位バイト

$7DD0-$7DD5 S8[6] 各PTキャラのAC

$7DD6-$7DDB U8[6] 各PTキャラのPOISON値

$7DDC-$7DE1 U8[6] 各PTキャラのキャラデータアドレスの上位バイト(0x60 + 訓練所内ID)

$7DEE U8 エンカウントの種類? # 0:徘徊(廊下), 1:徘徊(室内), 2:玄室

$7DEF U8 PTの人数

$7DF0- ? unknown

$7DF6 U8 ALARMフラグ? # B4Fの警報床では変化しないようだ

$7DF7 U8 宝箱の罠 # 0:無, 1:毒, 2:ガ, 3:矢, 4:爆, 5:ス, 6:テ, 7:メ, 8:プ, 9:警

$7DF8-$7DFD U8[6] 各PTキャラの宝箱の罠調査結果

$7DFE U8 PTの呪文無効化率??

$7DFF-$7E02 U8[4] 各敵グループの呪文無効化率

$7E03-$7E71 MonsterData 戦闘時、モンスターデータがロードされる

$7E72- U8[6]? unknown # $7DDC- のコピー??

$7E78 U8 unknown

$7E79-$7E7E U8[6]? unknown

$7E7F-$7EA2 U8[36] 敵のグループ内位置([0, 8])
# ステータス異常の者はスキップして考える
# ターン終了時に更新されるが、ステータス異常の者については書き込み自体行われないのでゴミが残ることに注意