基礎知識
戦闘関係
この項目は、以下ウェブサイト様などを参考にさせていただきました。
ここでは、「ライブ・ア・ライブ」の内部データのどこに何があるのか、つまりデータマップ及び、ゲームプレイ中のメモリマップを紹介する。
上記ウェブサイト様から引用したデータも数多く、先達の皆様に深く感謝する次第である。
筆者のプログラミング知識の不足ゆえに、誤りがある可能性も高いことをご了承いただきたい。
未調査の部分も多く、今後追記するかもしれない。
「ライブ・ア・ライブ」は、容量が「16メガビットロムカセット」のスーパーファミコンソフトである。
1バイトは8ビット(2進数8文字分)なので、16メガビット = 16000000ビット = 2メガバイト = 2000000バイト分のデータで構成されているということになる。
このデータがスーパーファミコン本体のメモリ領域に読み込まれてゲームをプレイする。
メモリ領域のアドレスは16進数6桁で表し、上2桁を「バンク」、下4桁を「アドレス」と呼ぶ。
ここでは、
$00:0000
という形で、バンクとアドレスを「:」区切りで表記する。
一番最初の$は16進数を意味しており、この先も頭に$がついている数は16進数を示す。
スーパーファミコンのバンクは$00から$FFまで、その各バンク内に$0000から$FFFFまでアドレスが割り振られている。
1つのアドレスに入るのは、1バイト分のデータである(16進数2文字分、つまり$00~$FFが入る。10進数なら0~255)。
ゲームデータは$00:0000から順に入るのではなく、入る場所が決まっている。
ライブ・ア・ライブだと、
$00~$1Fのアドレス$8000~$FFFF$40~$5Fのアドレス$0000~$FFFFという位置に、ゲームカセット内のデータ16メガビット分が丸ごと入っている。
ゲームカセット内のデータはゲームプレイの元となる基本のデータなので、ゲームプレイの最中、読み取りはしても上書きすることはない。
こういった領域をROM(Read-Only Memory)領域と呼ぶ。
一方で、戦闘のダメージ量計算などに使う、読み取りも書き込みもできる領域がRAM(Random-Access Memory)である。
また、まったく同じデータが入っている(ミラーリング)箇所も多い。
例えばバンク$00~$7Dは、バンク$80~$FDでミラーリングなので、大雑把に言えば、スーパーファミコンのメモリ領域を半分で区切り、前半部を後半部でミラーリングしているようなものである。
なぜ同じデータをミラーリングするのかだが、ゲームプレイの最中、ゲーム内部では各種データの読み込みや書き込みをしつつ様々な計算を行うことになる。
読み込み・書き込みをする時、次に探したいデータの位置が近くにある方が素早くアクセスできる。
ミラーリングにより同じデータを散らし、近い位置のアドレスからより速く読み書きできるようにしている、らしい。
そういう理由から、ゲームプレイ中は頻繁に使われる一部データが更にミラーリングされていることもある。
「ライブ・ア・ライブ」は、スーパーファミコンのメモリの、
$00~$1F(ミラーリング:$80~$1F)のアドレス$8000~$FFFF$40~$5F(ミラーリング:$C0~$DF)のアドレス$0000~$FFFFに、ゲームデータが入っていると述べた通りだが、筆者にわかる範囲でどこに何があるか記す。
画像・音関係については未調査なので、非常に大雑把である。
詳しくはわからないが同じ文字でひたすら埋まっている箇所もあり、おそらくは未使用のアドレス部分なのであろう。
| バンク | 内容 | ||
|---|---|---|---|
$00 | $80 | プログラム | |
$02 | $82 | BGM関連のデータ(音源?) | |
$03 | $83 | BGM関連のデータ(音源?) | |
$10 | $90 | テキストデータ(シナリオ関連) | |
$11 | $91 | テキストデータ(シナリオ関連) | |
$16 | $96 | テキストデータ(敵の名前・技名・技説明 など) | |
$40 | $C0 | プログラム(主にマップ関係) | |
$41 | $C1 | プログラム(主に戦闘関係) | |
$42 | $C2 | プログラム | |
$43 | $C3 | プログラム/BGM関連のデータ(楽譜?) | |
$44 | $C4 | BGM関連のデータ(楽譜?) | |
$45 | $C5 | BGM関連のデータ(楽譜?) | |
$46 | $C6 | BGM関連のデータ(楽譜?) | |
$51 | $D1 | テキストデータ(シナリオ関連) | |
$55 | $D5 | 味方キャラデータ | $D5:00C0~$D5:04CA |
| 敵キャラデータ | $D5:04CB~$D5:24CA | ||
| 味方技データ | $D5:24CB~$D5:3DB1 | ||
| 敵技データ | $D5:3DB2~$D5:56CA | ||
| 敵移動データ | $D5:6D05~$D5:71C3 | ||
| アイテムデータ | $D5:71C4~$D5:81C3 | ||
$56 | $D6 | 敵パーティデータ | $D6:4280~$D6:512F |
プログラム関係はバンク$C0~$C3、各種データはバンク$D5~$D6からロードすることが多いようである。つまりミラーリングから読み込みしている。
筆者が調べた範囲のみ。
| アドレス | 内容 |
|---|---|
$C0:1A69~$C0:1ADB | マップタイマーのカウントダウン計算 |
$C0:328A~$C0:32AF | マップタイマー初期値読み込み |
$C0:263E~$C0:266B | カウントアップ処理(サモを仲間にする時与えるアイテム用 他もありかも) |
$C0:378F~$C0:37BE | マップでの乱数イベント関連(戦闘中のテレポート飛び先判定も含む) |
$C0:37D8~$C0:3806 | 持ち物一覧を開いて何かのアイテムを選ぶことで進行するイベント |
$C0:47E8~$C0:482C | アイテム取得時に持ち物欄の空欄に該当アイテムを入れ個数を+1する、または既に所持しているなら該当アイテムの個数を+1する処理 |
$C0:4839~$C0:4853 | アイテム使用時に持ち物欄から指定アイテム個数を-1する処理 |
$C0:B900~$C0:B924 | マップ乱数計算(イベント用乱数含む) |
$C0:BA16~$C0:BA75 | 16bit×16bit乗算サブルーチン |
| アドレス | 内容 |
|---|---|
$C1:166E~$C1:169D | 戦闘終了時ドロップアイテム判定 |
$C1:2363~$C1:243D | 戦闘終了時取得経験値計算 |
$C1:6150~$C1:61A4 | 戦闘用乱数計算 |
$C1:77CE~$C1:783A | 単発ダメージ計算 |
$C1:7843~$C1:7851 | 単発ダメージ+乱数ブレ分 |
$C1:9D13~$C1:9D86 | Xボタンの「ひとつ前の技」関連処理 |
$C1:CD32~$C1:CD53 | 総ダメージ量の回避属性半減処理・999を越えている時999に変える処理 |
$C1:CDF7~$C1:CE08 | 2桁の16進数の値を10進数に解釈し直すサブルーチン(ほいこーろーのダメージ量計算処理で使用) |
$C1:D6B9~$C1:D725 | 攻撃技のヒット数計算 |
$C1:D870~$C1:D8B1 | 命中判定計算 |
$C1:D9A7~$C1:D9D9 | 敵へダメージ与える前の処理(眠り状態解除~オディオモールなら単発ダメージ量を1に) |
$C1:E94E~$C1:E9FC | 「ひとつ前の技」がない場合は、味方キャラデータの技一覧から、最初の技のIDを取り出して、「ひとつ前の技」に登録 |
RAM(Random-Access Memory)領域はバンク$00~$3Fの$0000~$1FFF、バンク$7E(ただしバンク$7E:$0000~$1FFFはバンク$00:$0000~$1FFFのミラーリング)で、先に記した通りにバンク$80~にはバンク$00~がミラーリングされている。
何かしらの計算をする時はだいたい、$00:0000~$00:1FFF(ミラーリング:$7E:0000~$7E:1FFF)の領域を一時的な変数のように扱っている、と思って良い。
解説サイトなどでは、ミラーリングである$7E:????でどのメモリが何の役割かを説明していることが多いことから、ここでもわかりやすさ優先で、ミラーリングのバンク$7Eの値を以下に記す。
※下位バイト・上位バイトについて
アドレス1つに入るデータは1バイト(16進数2文字)だが、中には連続した2つのアドレスを使って、2バイト(16進数4文字)のデータを記録している値もある。
その場合は、下位バイトのアドレスに下2桁、上位バイトのアドレスに上2桁が入っており、上位バイトアドレスの値・下位バイトアドレスの値を繋げて2バイト分のデータとする。
| アドレス | 内容 |
|---|---|
$7E:000C | マップ乱数計算用の値(戦闘中一時停止) |
$7E:000D | マップ乱数(戦闘中一時停止) |
$7E:002D | ランダムエンカウント時 増加値(下4ビット) |
$7E:0036 | マップ乱数($7E:000Dと同値) |
$7E:0070 | 通常は$00、デモ画面は$01以上(変動) |
$7E:011F | ランダムエンカウント時 エリア危険度 |
$7E:0107 | ランダムエンカウント時 危険度 |
$7E:013D | アイテム取得や使用時、該当アイテムのアイテムIDが入る |
$7E:0160 | 場面チェンジのエフェクト $00=黒にフェードアウト/$02=白にフェードアウト/$04=モザイク/$05=丸囲み/$06=三角囲み(戦闘突入時) |
$7E:01BB | ランダムエンカウント時 危険度合計値 |
$7E:01C0~ | セリフ関係(テキスト呼び出し、吹き出し形状など) |
$7E:01C1 | 吹き出しの位置と形状(吹き出しについている▽のマークの位置も) |
$7E:01C6~$7E:01C7 | セリフテキスト読み込み位置指定 |
$7E:0200 | 通常$00 フィールドでプレイヤーが操作できない時$01?(セリフ中や、敵シンボルと接触した時) |
$7E:0565~$7E:0566 | 現代編・対戦相手画面 (2バイト、通常$FFFF、対戦相手を選ぶと値が入る。ナムキャット$0000、エイジャ$0001、トゥーラ・ハン$0002、森部$0003、モーガン$0004、イヤウケア$0005 |
$7E:0A00 | プレイ中のシナリオ 対応表 |
$7E:0A01 | シナリオのクリア状況 (8ビットが各シナリオ対応。上の桁から順に中世、原始、SF、功夫、西部、現代、近未来、幕末) |
$7E:0A02~03 | 現在居るエリアのID (マップに対応した数値、シナリオ毎に異なる) |
$7E:0A10 | 最終編主人公 対応表 |
$7E:0A11 | 2人目のシナリオ別キャラデータID |
$7E:0A12 | 3人目のシナリオ別キャラデータID |
$7E:0A13 | 4人目のシナリオ別キャラデータID |
$7E:0A14 | パーティの人数($00:1人、$01:2人、$02:3人、$03:4人) |
$7E:0A15 | 心山拳老師&師範が誰か(功夫編・最終編のみ) $00=老師 $01=ユン $02=レイ $03=サモ |
$7E:0A20 | キャラ1 移動中のX座標のマスとマスの間の位置? |
$7E:0A21 | キャラ1 マップのX座標(マス目) |
$7E:0A22 | キャラ2 移動中のX座標のマスとマスの間の位置? |
$7E:0A23 | キャラ2 マップのX座標(マス目) |
$7E:0A24 | キャラ3 移動中のX座標のマスとマスの間の位置? |
$7E:0A25 | キャラ3 マップのX座標(マス目) |
$7E:0A26 | キャラ4 移動中のX座標のマスとマスの間の位置? |
$7E:0A27 | キャラ4 マップのX座標(マス目) |
$7E:0A28 | キャラ1 移動中のY座標のマスとマスの間の位置? |
$7E:0A29 | キャラ1 マップのY座標(マス目) |
$7E:0A2A | キャラ2 移動中のY座標マスとマスの間の位置? |
$7E:0A2B | キャラ2 マップのY座標(マス目) |
$7E:0A2C | キャラ3 移動中のY座標マスとマスの間の位置? |
$7E:0A2D | キャラ3 マップのY座標(マス目) |
$7E:0A2E | キャラ4 移動中のY座標マスとマスの間の位置? |
$7E:0A2F | キャラ4 マップのY座標(マス目) |
$7E:0A34 | キャラ1 向き 下=$00/上=$01/左=$02/右=$03 |
$7E:0A35 | キャラ2 向き 下=$00/上=$01/左=$02/右=$03 |
$7E:0A36 | キャラ3 向き 下=$00/上=$01/左=$02/右=$03 |
$7E:0A37 | キャラ4 向き 下=$00/上=$01/左=$02/右=$03 |
$7E:0A38 | キャラ1 出入り口(0,0)との相対距離の移動中のX座標のマスとマスの間の位置? |
$7E:0A39 | キャラ1 出入り口(0,0)との相対距離のX座標(マス目) 左方向は$FF~、右方向は$01~ |
$7E:0A3A | キャラ2 出入り口(0,0)との相対距離の移動中のX座標のマスとマスの間の位置? |
$7E:0A3B | キャラ2 出入り口(0,0)との相対距離のX座標(マス目) |
$7E:0A3C | キャラ3 出入り口(0,0)との相対距離の移動中のX座標のマスとマスの間の位置? |
$7E:0A3D | キャラ3 出入り口(0,0)との相対距離のX座標(マス目) |
$7E:0A3E | キャラ4 出入り口(0,0)との相対距離の移動中のX座標のマスとマスの間の位置? |
$7E:0A3F | キャラ4 出入り口(0,0)との相対距離のX座標(マス目) |
$7E:0A40 | キャラ1 出入り口(0,0)との相対距離の移動中のY座標のマスとマスの間の位置? |
$7E:0A41 | キャラ1 出入り口(0,0)との相対距離のY座標(マス目) 上方向は$FF~、下方向は$01~ |
$7E:0A42 | キャラ2 出入り口(0,0)との相対距離の移動中のY座標マスとマスの間の位置? |
$7E:0A43 | キャラ2 出入り口(0,0)との相対距離のY座標(マス目) |
$7E:0A44 | キャラ3 出入り口(0,0)との相対距離の移動中のY座標マスとマスの間の位置? |
$7E:0A45 | キャラ3 出入り口(0,0)との相対距離のY座標(マス目) |
$7E:0A46 | キャラ4 出入り口(0,0)との相対距離の移動中のY座標マスとマスの間の位置? |
$7E:0A47 | キャラ4 出入り口(0,0)との相対距離のY座標(マス目) |
$7E:0A53 | 1人目のキャラの向き? 下=$00/上=$01/左=$02/右=$03 |
$7E:0A54 | 1人目のキャラの座標?状態? |
$7E:0A55 | 1人目のキャラに対する2人目のキャラの相対距離?(移動中$00 ダッシュ$04 停止$80 向き変えで値変わる) |
$7E:0A56 | 1人目のキャラに対する3人目のキャラの相対距離? |
$7E:0A57 | 1人目のキャラに対する4人目のキャラの相対距離? |
$7E:0A60 | フィールド上BGM サウンドルームBGMとは異なる BGM一覧表 |
$7E:0A61 | BGMの再生ピッチ?(通常$FF、「いいお天気でしょっ!」の夜バージョンは$60) |
$7E:0AB0 | 最終編だと$01 他シナリオは$00 |
$7E:0AB1 | 最終編だと$00 他シナリオは$01 |
$7E:0AB4~$7E:0AB5 | セーブ回数 下位バイト/上位バイト 999回($03E7)を越えると0に戻る |
$7E:0AC0~$7E:0AC1 | マップタイマー00~15のON・OFF C0に下位バイト、C1に上位バイト |
$7E:0AC2~$7E:0AC3 | マップタイマー00~15関連フラグ値 C2に下位バイト、C3に上位バイト |
$7E:0AC5 | 原始編・近未来編のシンボルエンカウントのON/OFF |
$7E:0ACE | 主人公キャラID(最終編は$08で固定)対応表 |
$7E:0AE0~$7E:0AE1 | マップタイマー00残り時間 下位バイト/上位バイト |
$7E:0AE2~$7E:0AE3 | マップタイマー01残り時間 下位バイト/上位バイト |
$7E:0AE4~$7E:0AE5 | マップタイマー02残り時間 下位バイト/上位バイト |
$7E:0AE6~$7E:0AE7 | マップタイマー03残り時間 下位バイト/上位バイト |
$7E:0AE8~$7E:0AE9 | マップタイマー04残り時間 下位バイト/上位バイト |
$7E:0AEA~$7E:0AEB | マップタイマー05残り時間 下位バイト/上位バイト |
$7E:0AEC~$7E:0AED | マップタイマー06残り時間 下位バイト/上位バイト |
$7E:0AEE~$7E:0AEF | マップタイマー07残り時間 下位バイト/上位バイト |
$7E:0AF0~$7E:0AF1 | マップタイマー08残り時間 下位バイト/上位バイト |
$7E:0AF2~$7E:0AF3 | マップタイマー09残り時間 下位バイト/上位バイト |
$7E:0AF4~$7E:0AF5 | マップタイマー10残り時間 下位バイト/上位バイト |
$7E:0AF6~$7E:0AF7 | マップタイマー11残り時間 下位バイト/上位バイト |
$7E:0AF8~$7E:0AF9 | マップタイマー12残り時間 下位バイト/上位バイト |
$7E:0AFA~$7E:0AFB | マップタイマー13残り時間 下位バイト/上位バイト |
$7E:0AFC~$7E:0AFD | マップタイマー14残り時間 下位バイト/上位バイト |
$7E:0AFE~$7E:0AFF | マップタイマー15残り時間 下位バイト/上位バイト |
$7E:0B01~$7E:0BFF | アイテム欄に入っているアイテムID(中世編&最終編) |
$7E:0B28~$7E:0B4C | アイテム欄に入っているアイテムID(原始編) |
$7E:0B4D~$7E:0B66 | アイテム欄に入っているアイテムID(西部編) |
$7E:0B67~$7E:0B88 | アイテム欄に入っているアイテムID(幕末編) |
$7E:0B89~$7E:0BBB | アイテム欄に入っているアイテムID(近未来編) |
$7E:0BBD~$7E:0BE0 | アイテム欄に入っているアイテムID(功夫編) |
$7E:0BF5~$7E:0CF9 | アイテム欄に入っているアイテムID(SF編) |
$7E:0C01~$7E:0CFF | アイテム欄に入っているアイテムIDの各個数(中世編&最終編) |
$7E:0C28~$7E:0C4C | アイテム欄に入っているアイテムIDの各個数(原始編) |
$7E:0C4D~$7E:0C66 | アイテム欄に入っているアイテムIDの各個数(西部編) |
$7E:0C67~$7E:0C88 | アイテム欄に入っているアイテムIDの各個数(幕末編) |
$7E:0C89~$7E:0CBB | アイテム欄に入っているアイテムIDの各個数(近未来編) |
$7E:0CBD~$7E:0CE0 | アイテム欄に入っているアイテムIDの各個数(功夫編) |
$7E:0CF5~$7E:0DF9 | アイテム欄に入っているアイテムIDの各個数(SF編) |
$7E:10E5 | 最終編の戦闘時のBGM |
$7E:11F0~ | イベントカウンター用メモリ(シナリオによりカウントする値は変わる) |
$7E:1200~$7E:12FF | シナリオ進行フラグ($00か$01) |
$7E:1300~$7E:1301 | 心山拳伝承者 下位バイト/上位バイト $0001ならユン、$0100ならレイ、$0000だとサモ |
$7E:1D05 | 現在のBGM BGM一覧表 |
$7E:1DE2 | 現在のBGM BGM一覧表 |
$7F:8E00~ | 各シナリオ専用データ |
| シナリオ | ID | キャラクター |
|---|---|---|
| 中世 | $00 | オルステッド |
| 原始 | $01 | ポゴ |
| SF | $02 | キューブ |
| 功夫 | $03 | 心山拳老師 |
| 西部 | $04 | サンダウン |
| 現代 | $05 | 高原日勝 |
| 近未来 | $06 | アキラ |
| 幕末 | $07 | おぼろ丸 |
| 最終 | $08 | - |
タイトルはサウンドトラックに準拠。
(「いいお天気でしょっ!」の夜バージョンなど、一部楽曲のスローテンポな曲は原曲の再生ピッチを変更して流しているらしい)
| ID | タイトル |
|---|---|
| $00 | 無音(BGMなし) |
| $01 | 魔王への叙曲 |
| $02 | 凛然たる戦い |
| $03 | 忍音 |
| $04 | WANDERER |
| $05 | 殺陣! |
| $06 | THE WILDS |
| $07 | UNDER THE FAKE |
| $08 | UNSEEN SYNDROME |
| $09 | NATIVE LIFE |
| $0A | WAIT FOR TRUTH |
| $0B | PSYCHOで夜露死苦!! |
| $0C | 猛者達… |
| $0D | 鳥児在天空飛翔 魚児在河里游泳 |
| $0E | 在中国的戦闘 |
| $0F | 効果音 |
| $10 | KNOCK YOU DOWN! |
| $11 | 効果音(馬が走る音) |
| $12 | 効果音(SF編・宇宙船内) |
| $13 | 効果音(近未来編・港) |
| $14 | 老拳師下深山 |
| $15 | いいお天気でしょっ! |
| $16 | KISS OF JEALOUSY |
| $17 | 密命 |
| $18 | GO!GO!ブリキ大王!! |
| $19 | 届かぬ翼 |
| $1A | 魔王山を往く |
| $1B | 魔王オディオ |
| $1C | PURE ODIO |
| $1D | 効果音(アキラ レベルアップ音) |
| $1E | 効果音(木魚のポクポク音) |
| $1F | 効果音(風の吹く音) |
| $20 | 効果音(キューブの機械音) |
| $21 | 効果音(オルステッド レベルアップ音) |
| $22 | 効果音(おぼろ丸 レベルアップ音) |
| $23 | 効果音(サモ・ユン レベルアップ音・アチョーボイス) |
| $24 | 効果音(レイ レベルアップ音・ボイス) |
| $25 | SELECT・A・LIVE |
| $26 | 効果音(ポゴ レベルアップ音・ボイス) |
| $27 | 効果音(ゴリのボイス/馬のいななき 兼用) |
| $28 | 効果音(高原日勝 レベルアップ音・ボイス) |
| $29 | 効果音(サンダウン レベルアップ音・銃声) |
| $2A | 効果音(近未来編・木琴) |
| $2B | MEGALOMANIA |
| $2C | 効果音(強風の吹く音) |
| $2D | 効果音(SF編/近未来編・パソコン効果音) |
| $2E | 効果音(近未来編・筑波研究所最奥) |
| $2F | 効果音(功夫編 銅鑼) |
| $30 | 効果音(西部編 鐘) |
| $31 | 効果音(幕末編 アイテム入手時) |
| $32 | 効果音(原始編 ウホウホ) |
| $33 | 最強-VICTORY ROAD- |
| $34 | LIVE・A・LIVE |
| $35 | CRY・A・LIVE |
| $36 | WARM・A・LIVE |
| $37 | 絶望の都 |
| $38 | Sancho・de・Los・Panchoz |
| $39 | 効果音(マラカス) |
| $3A | 効果音(各シナリオ開始時の低い音) |
| $3B | 原始編・宴(リメイク版の「生贄の宴」) |
| $3C | Silent Labyrinth |
| $3D | ARMAGEDDON |
| $3E | CAPTAIN SQUARE |
| $3F | 星屑のキャプテン |
| $40 | 効果音(近未来編・オルガン むすんでひらいて) |
| $41 | 効果音(近未来編・オルガン 猫ふんじゃった) |
| $42 | 効果音(近未来編・オルガン トッカータとフーガ) |
| $43 | 効果音(近未来編・オルガン チョコボのテーマ) |
| $44 | Live over Again |
| $45 | Live for Live |
| $46 | 効果音(崩壊) |
| $47 | 効果音(SF編・警告音) |
| $48 | 効果音(功夫編・夜 虫の音) |
| $49 | CAPTAIN SQUARE |
| $4A | 効果音(ゲーム開始時「SQUARE SOFT」ボイス) |
| $4B | ILLUSION… |
| $4C | Versus! |
| $4D | 原始編・宴 ボイスのみ |
| $4E以降は無音 | |
各シナリオのキャラ用データ。
1キャラあたり64バイトの容量がある。
戦闘中もそれ以外も同じアドレスに入っている。
主人公+仲間3キャラのIDは順に$7E:0A10, $7E:0A11, $7E:0A12, $7E:0A13に入る(加入順?)
最終編以外は、主人公キャラのID・$08・$09・$0Aという順で上のアドレスに入ることになるが、最終編は各シナリオの主人公たちがパーティに加わった時点で2人目以降の値が更新されていく。
| ID | アドレス | 原始 | SF | 功夫 | 西部 | 現代 | 近未来 | 幕末 | 中世 | 最終 |
|---|---|---|---|---|---|---|---|---|---|---|
| $00 | $7E:0D00~ | - | - | - | - | - | - | - | オルステッド | オルステッド |
| $01 | $7E:0D40~ | ポゴ | - | - | - | - | - | - | - | ポゴ |
| $02 | $7E:0D80~ | - | キャプテン スクウェア /キューブ | - | - | - | - | - | - | キューブ |
| $03 | $7E:0DC0~ | - | - | 心山拳老師 | - | - | - | - | - | 心山拳師範 |
| $04 | $7E:0E00~ | - | - | - | サンダウン | - | - | - | - | サンダウン |
| $05 | $7E:0E40~ | - | - | - | - | 高原 日勝 | - | - | - | 高原 日勝 |
| $06 | $7E:0E80~ | - | - | - | - | - | アキラ | - | - | アキラ |
| $07 | $7E:0EC0~ | - | - | - | - | - | - | おぼろ丸 | - | おぼろ丸 |
| $08 | $7E:0F00~ | ゴリ | - | ユン・ジョウ | マッドドッグ | - | タロイモ | とらわれの男 | ストレイボウ | - |
| $09 | $7E:0F40~ | べる | - | レイ・クウゴ | - | - | 無法松 | カラクリ丸 | ウラヌス | - |
| $0A | $7E:0F80~ | ざき | - | サモ・ハッカ | - | - | ブリキ大王 | - | ハッシュ | ブリキ大王 |
便宜上、64バイト分のデータに$00~$3Fと番号を付けた。
空欄は筆者には不明な部分。
| 数値 | 内容 |
|---|---|
$00 | キャラID(ブリキ大王は$40) |
$01 | |
$02 | |
$03 | |
$04 | $04を下位バイト、$05を上位バイトとした4桁の値+$D50000に、味方キャラデータがそっくり入っている |
$05 | |
$06 | レベル |
$07 | |
$08 | 現在HP(下位バイト) |
$09 | 現在HP(上位バイト) |
$0A | 最大HP(下位バイト) |
$0B | 最大HP(上位バイト) |
$0C | 前に出した技 |
$0D | 覚えた技(下位バイト)技00~07を2進数で表す |
$0E | 覚えた技(上位バイト)技08~15を2進数で表す |
$0F | |
$10 | 力(力+装備上昇分) |
$11 | 力 |
$12 | 力(装備上昇分) |
$13 | 速(速+装備上昇分) |
$14 | 速 |
$15 | 速(装備上昇分) |
$16 | 体(体+装備上昇分) |
$17 | 体 |
$18 | 体(装備上昇分) |
$19 | 知(知+装備上昇分) |
$1A | 知 |
$1B | 知(装備上昇分) |
$1C | 側面補正 |
$1D | 背面補正 |
$1E | 経験値 |
$1F | 無効状態異常 (下位バイト) |
$20 | 無効状態異常 (上位バイト) |
$21 | 回避属性(下位バイト) |
$22 | 回避属性(上位バイト) |
$23 | |
$24 | 頭装備 |
$25 | 右装備 |
$26 | 左装備 |
$27 | 体装備 |
$28 | 足装備 |
$29 | アクセサリー1 |
$2A | アクセサリー2 |
$2B | アクセサリー3 |
$2C | アクセサリー4 |
$2D | アクセサリー5 |
$2E | |
$2F | 防御の値(=装備の防御の値合計値) |
$30 | |
$31 | |
$32 | |
$33 | |
$34 | 名前1文字目 |
$35 | 名前2文字目 |
$36 | 名前3文字目 |
$37 | 名前4文字目 |
$38 | 名前5文字目 |
$39 | 名前6文字目 |
$3A | 名前7文字目 |
$3B | 名前8文字目 |
$3C | 名前9文字目 |
$3D | 名前10文字目 |
$3E | 名前11文字目 |
$3F | 名前12文字目 |
上のキャラクターの名前にも関係するが、本作の文字コードを説明する。
1文字あたり、ひらがな・カタカナ・アルファベット・記号は1バイト、漢字は2バイトのデータを使う。
1バイトの場合は上表に対応した値をそのまま使うが、漢字は上表のように上位バイトに$1D・$1E・$1F、下位バイトに$00~$FFの数値を入れて、$1D??, $1E??, $1F??とする。
シナリオ別キャラデータの名前1文字目~名前12文字目の部分は、漢字だとアドレスを2バイト使うため、漢字のみだと最大6文字になる。
また、文字コードはセリフなどのテキスト表示にも使うため、中には改行用コード($01)や、本来2文字分の「‥‥」を1バイト分のデータ「$07」としていたりもする。
例:
「オルステッド」だと、$7E:0D34~$7E:0D3Fの12バイトに入っているデータは、
| 数値 | $65 | $89 | $6D | $73 | $91 | $A5 | $00 | $00 | $00 | $00 | $00 | $00 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 対応文字 | オ | ル | ス | テ | ッ | ド | - | - | - | - | - | - |
「高原 日勝」だと、$7E:0E74~$7E:E73Fの12バイトに入っているデータは、
| 数値 | $1D | $E1 | $1D | $BC | $20 | $1F | $3A | $1E | $55 | $00 | $00 | $00 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 対応文字 | 高 | 原 | (空白) | 日 | 勝 | - | - | - | ||||
戦闘中のアドレスと内容について。
| アドレス | 内容 |
|---|---|
$7E:0338 | 戦闘用乱数4(新たな乱数を計算するための値) |
$7E:0339 | 戦闘用乱数3(新たな乱数を計算するための値) |
$7E:033A | 戦闘用乱数2(新たな乱数を計算するための値) |
$7E:033B | 戦闘用乱数1(現在の乱数) |
$7E:034? | このあたりにコントローラーのボタンを押した判定の数値 |
$7E:0355 | 敵パーティレベル |
$7E:0356 | 操作キャラがブリキ大王かどうか(ブリキ大王操作時は$01、それ以外は$00) |
$7E:0358 | 上位バイトはアイテムドロップ率計算用数値、下位バイトは敵の総数 |
$7E:03AE | 行動ポイント(下位バイト) |
$7E:03AF | 行動ポイント(上位バイト) |
$7E:04C8~$7E:04FF | 戦闘フィールドマスの状態(後述) |
$7E:9009 | 場の属性 |
$7E:901D | 直前の技の属性(反撃時参照値) |
$7E:A0?? | 戦闘中、各技特有の一時的な値の記録アドレス |
$7E:A010~$7E:A011 | 現代編ワタナベイベント判定用の計算値(「カミツキ(青)」使用時のみ0以外が入る) |
$7E:A01A | サモの「ほいこーろー」のSTEP数が蓄積される |
$7E:A01D | 現代編ワタナベイベントのエイジャの向き判定 左上向きは$79、それ以外は$38 |
$7E:FEF0 | 戦闘中タイマー(下位バイト) |
$7E:FEF1 | 戦闘中タイマー(上位バイト) |
戦闘中タイマーは戦闘用乱数の初期値計算と、キャラのモーションやエフェクト表示などのタイミングなどを合わせるための時間調整に使われている、と思われる。
$7E:04C8~$7E:04FEの戦闘フィールドについて戦闘フィールドは7×7マスで構成されているが、各マスに対応したアドレスは以下の通り。
$7E:04C??の??の値部分のみ記している。
各アドレスに、現在居るキャラクターと、ダメージフィールド状態が記録される。
| C8 | C9 | CA | CB | CC | CD | CE | CF |
| D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 |
| D8 | D9 | DA | DB | DC | DD | DE | DF |
| E0 | E1 | E2 | E3 | E4 | E5 | E6 | E7 |
| E8 | E9 | EA | EB | EC | ED | EE | EF |
| F0 | F1 | F2 | F3 | F4 | F5 | F6 | F7 |
| F8 | F9 | FA | FB | FC | FD | FE | FF |
一番右の灰色背景部分は実際には戦闘フィールドではないため、$00が入っている。
プログラミング上、7という数字はキリが悪いので、横8×縦7でアドレスを設定しているようである。
各アドレスに入る数値は、何もなければ$00、それ以外はキャラクターの数値+ダメージフィールド状態の合計値になる。
敵が複数マスにまたがっている場合は該当マスに同じ数値が入る。
| 数値 | 内容 |
|---|---|
$01 | 味方キャラ1 |
$02 | 味方キャラ2 |
$03 | 味方キャラ3 |
$04 | 味方キャラ4 |
$11 | 敵キャラ1 |
$12 | 敵キャラ2 |
$13 | 敵キャラ3 |
$14 | 敵キャラ4 |
$15 | 敵キャラ5 |
$16 | 敵キャラ6 |
$17 | 敵キャラ7 |
$18 | 敵キャラ8 |
$19 | 敵キャラ9 |
$1A | 敵キャラA |
$1B | 敵キャラB |
$1C | 敵キャラC |
$1D | 敵キャラD |
$1E | 敵キャラE |
$80 | 水フィールド |
$A0 | 毒フィールド |
$C0 | 火炎フィールド |
$E0 | 電撃フィールド |
戦闘時に読み書きされるアドレス。
最大4キャラ分のデータ領域。各64バイト。
| 味方キャラ番号 | アドレス |
|---|---|
| 1 | $7E:1C00~$7E:1C3F |
| 2 | $7E:1C40~$7E:1C7F |
| 3 | $7E:1C80~$7E:1CBF |
| 4 | $7E:1CC0~$7E:1CFF |
各キャラに入る64バイト分のデータは以下の通り。
便宜上、64バイト分のデータに$00~$3Fと番号を付けた。
空欄は筆者には不明な部分。
| 数値 | 内容 |
|---|---|
$00 | 味方キャラID |
$01 | 戦闘状態($00:戦闘離脱 $40:敵操作状態 $FF:通常) |
$02 | |
$03 | シナリオ別キャラデータ開始アドレス(下位バイト) |
$04 | シナリオ別キャラデータ開始アドレス(上位バイト) |
$05 | 経験値 |
$06 | タメ時間ありの技発動までの時間 |
$07 | 実行しようとしている技のタメ時間 |
$08 | |
$09 | |
$0A | |
$0B | |
$0C | |
$0D | |
$0E | |
$0F | |
$10 | キャラの位置のX軸(ピクセル単位・後述) |
$11 | |
$12 | キャラの位置のY軸(ピクセル単位・後述) |
$13 | |
$14 | ひとつ前の技(初期値$00の時にXボタンで前の技を選ぶと初期技を選択) |
$15 | |
$16 | |
$17 | |
$18 | キャラ位置のマス目のX座標(左から$00~$06) |
$19 | キャラ位置のマス目のY座標(上から$00~$06) |
$1A | 戦闘開始後は$18と同値? |
$1B | 戦闘開始後は$19と同値? |
$1C | |
$1D | 向き(右下00/左下01/左上03/右上04) |
$1E | |
$1F | |
$20 | 戦闘中に経験値が増える行動をしたかのフラグ。行動なし:$00 行動あり:$80 |
$21 | |
$22 | |
$23 | |
$24 | |
$25 | |
$26 | |
$27 | |
$28 | |
$29 | |
$2A | |
$2B | |
$2C | |
$2D | |
$2E | |
$2F | |
$30 | 力(通常値) |
$31 | 速(通常値) |
$32 | 体(通常値) |
$33 | 知(通常値) |
$34 | 力(現在値) |
$35 | 速(現在値) |
$36 | 体(現在値) |
$37 | 知(現在値) |
$38 | LV(現在値) |
$39 | 状態異常 |
$3A | |
$3B | |
$3C | 被ダメージの単発値 |
$3D | |
$3E | |
$3F |
味方キャラが戦闘フィールドのどの位置に居るかを記録しているアドレスは、上の通りに$10と$12、$18~19に入る。
$18~19は、マス目を単位としており、$18は横方向(X座標・左から$00~$06)、$19は縦方向(Y座標・上から$00~$06)である。
$10と$12だが、マス目ではなく、ゲーム画面の戦闘フィールド上のピクセル単位、つまりドット数での位置を示していると思われる。
スーパーファミコンの解像度は横256×縦224ピクセルで、戦闘フィールドは横32ピクセル×7マス(合計224ピクセル)、縦24ピクセル×7マス(合計168ピクセル)である。
16進数にすると、1マスのサイズは、横$20ピクセル、縦$18ピクセルで、戦闘フィールド全体は横$E0ピクセル、縦$A8ピクセルになる。

$10に入る値は、戦闘フィールド左隅からの、該当キャラのドット絵の中心位置(単位ピクセル)になる。
$12に入る値は、戦闘フィールド上隅からの、該当キャラのドット絵の中心位置(単位ピクセル)になる。
例えば該当キャラが、左から2マス、上から3マスの位置に居る場合は、下図のようになる。

キャラの中心位置までの距離なので、横は$60ピクセル、縦は$3Cピクセル。
味方キャラデータ$10に入る値は$60、味方キャラデータ$12に入る値は$3Cということになる。
この値はピクセル単位で記録されているため、たとえばキャラが移動中、マス目とマス目の間にいる時はその値がフレーム単位(リアルタイム)で更新される。
また、ダメージをくらった時、キャラが左右に小さく動くモーションがあるが、この時にも横軸(X軸)にあたる味方キャラデータ$10の数値が少し動く。
以上から、マス目単位の味方キャラデータ$18~$19は、向きや方向、位置を考慮した上でのダメージ量計算やターゲット計算などに用いられ、ピクセル単位でキャラの位置を記録する味方キャラデータ$10と$12は、キャラのドット絵、技のモーションやエフェクトなどの表示位置計算に使っているのだろう、ということが推測できる。
味方キャラが技を使っている最中(技選択~技を出すまで)に、以下アドレスに該当技の技データ00~34がそのまま入る。
| 味方キャラ番号 | アドレス |
|---|---|
| 1 | $7E:9010~$7E:9028 |
| 2 | $7E:9050~$7E:9068 |
| 3 | $7E:9090~$7E:90A8 |
| 4 | $7E:90D0~$7E:90E8 |
最大16種類の技、$00~$0Fとしておく。
| 味方キャラ番号 | アドレス |
|---|---|
| 1 | $7E:E900~$7E:E93F |
| 2 | $7E:E940~$7E:E97F |
| 3 | $7E:E980~$7E:E9BF |
| 4 | $7E:E9C0~$7E:E9FF |
下2桁が$00~0Fに技ID、$10~1Fに該当技が出せなくなる状態異常(技データ08)、$20~2Fに技データ14、$30~3Fに反撃専用だと$01、他は$00が入る。
各状態異常の残り時間が入る。
| 味方キャラ番号 | アドレス |
|---|---|
| 1 | $7E:EA00~ |
| 2 | $7E:EA40~ |
| 3 | $7E:EA80~ |
| 4 | $7E:EAC0~ |
| 数値 | 内容 |
|---|---|
$00 | 首かため回復までの残り時間 |
$01 | 足かため回復までの残り時間 |
$02 | 腕かため回復までの残り時間 |
$03 | 毒回復までの残り時間 |
$04 | マヒ回復までの残り時間 |
$05 | 眠り回復までの残り時間 |
$06 | 酔い回復までの残り時間 |
$07 | 石化すると値がつく。0になっても石化は回復しない。 |
戦闘では最大4種類の敵が出現する。
最大4種類分のデータ領域。各64バイト。
| 敵種類 | アドレス |
|---|---|
| 1 | $7E:1A00~$7E:1A3F |
| 2 | $7E:1A40~$7E:1A7F |
| 3 | $7E:1A80~$7E:1ABF |
| 4 | $7E:1AC0~$7E:1AFF |
| 数値 | 内容 |
|---|---|
$00 | 敵ID |
$01 | |
$02 | |
$03 | |
$04 | 横の幅 |
$05 | 縦の幅 |
$06 | |
$07 | |
$08 | |
$09 | |
$0A | |
$0B | レベル |
$0C | |
$0D | |
$0E | |
$0F | |
$10 | HP10を下位バイト、11を上位バイトとした4桁の値 |
$11 |
|
$12 | 技1の反撃属性1 |
$13 | 技2の反撃属性1 |
$14 | 技3の反撃属性1 |
$15 | 技4の反撃属性1 |
$16 | 技1の反撃属性2 |
$17 | 技2の反撃属性2 |
$18 | 技3の反撃属性2 |
$19 | 技4の反撃属性2 |
$1A | 技1が使用不可になるステータス異常 |
$1B | 技2が使用不可になるステータス異常 |
$1C | 技3が使用不可になるステータス異常 |
$1D | 技4が使用不可になるステータス異常 |
$1E | 敵データ00 |
$1F | 敵データ01 |
$20 | 敵データ02 |
$21 | 敵データ03 |
$22 | 敵データ04 |
$23 | 敵データ05 |
$24 | 敵データ06 |
$25 | 敵データ07 |
$26 | 敵データ08 |
$27 | 敵データ09 |
$28 | 敵データ0A |
$29 | 敵データ0B |
$2A | 敵データ0C |
$2B | 敵データ0D 敵の技1個目 |
$2C | 敵データ0E 敵の技2個目 |
$2D | 敵データ0F 敵の技3個目 |
$2E | 敵データ10 敵の技4個目 |
$2F | 敵データ11 |
$30 | 敵データ12 |
$31 | 敵データ13 |
$32 | 敵データ14 |
$33 | 敵データ15 |
$34 | 敵データ16 |
$35 | 敵データ17 |
$36 | 敵データ18 |
$37 | 敵データ19 |
$38 | 敵データ1A ドロップアイテム1 |
$39 | 敵データ1B ドロップアイテム2 |
$3A | 敵データ1C ドロップアイテム3 |
$3B | 敵データ1D |
$3C | 敵データ1E |
$3D | 敵データ1F |
$3E | |
$3F |
敵は最大で15体出現する。便宜上、0~Eと番号を振ってある。
最大15キャラ分のデータ領域。
なお、戦闘に入った時、前の敵データを消さずに上書きするだけらしく、例えば敵パーティが4体の戦闘の後に敵パーティが2体の戦闘になった時、敵0と敵1のデータは上書き更新されるが、前の戦闘の敵2と敵3のデータは残ったまま。
| 敵キャラ | アドレス |
|---|---|
| 0 | $7E:1B00~$7E:1B0F, $7E:AA00~$7E:AA0F, $7E:AB00~ |
| 1 | $7E:1B10~$7E:1B1F, $7E:AA10~$7E:AA1F, $7E:AB10~ |
| 2 | $7E:1B20~$7E:1B2F, $7E:AA20~$7E:AA2F, $7E:AB20~ |
| 3 | $7E:1B30~$7E:1B3F, $7E:AA30~$7E:AA3F, $7E:AB30~ |
| 4 | $7E:1B40~$7E:1B4F, $7E:AA40~$7E:AA4F, $7E:AB40~ |
| 5 | $7E:1B50~$7E:1B5F, $7E:AA50~$7E:AA5F, $7E:AB50~ |
| 6 | $7E:1B60~$7E:1B6F, $7E:AA60~$7E:AA6F, $7E:AB60~ |
| 7 | $7E:1B70~$7E:1B7F, $7E:AA70~$7E:AA7F, $7E:AB70~ |
| 8 | $7E:1B80~$7E:1B8F, $7E:AA80~$7E:AA8F, $7E:AB80~ |
| 9 | $7E:1B90~$7E:1B9F, $7E:AA90~$7E:AA9F, $7E:AB90~ |
| A | $7E:1BA0~$7E:1BAF, $7E:AAA0~$7E:AAAF, $7E:ABA0~ |
| B | $7E:1BB0~$7E:1BBF, $7E:AAB0~$7E:AABF, $7E:ABB0~ |
| C | $7E:1BC0~$7E:1BCF, $7E:AAC0~$7E:AACF, $7E:ABC0~ |
| D | $7E:1BD0~$7E:1BDF, $7E:AAD0~$7E:AADF, $7E:ABD0~ |
| E | $7E:1BE0~$7E:1BEF, $7E:AAE0~$7E:AAEF, $7E:ABE0~ |
| アドレス | 内容 |
|---|---|
$1B00 | 敵ID |
$1B01 | 戦闘状態($00:戦闘離脱 $40:敵操作状態 $FF:通常) |
$1B02 | |
$1B03 | |
$1B04 | 向き(右下$00/左下$40/右上$80/左上$C0) |
$1B05 | |
$1B06 | |
$1B07 | 行動状態 |
$1B08 | 初期位置計算用のマス目のX座標(左から$00~$06)※敵の左上マス基準 |
$1B09 | 初期位置計算用のマス目のY座標(上から$00~$06)※敵の左上マス基準 |
$1B0A | 現在のキャラ位置のマス目のX座標(左から$00~$06)※敵の左上マス基準 |
$1B0B | 現在のキャラ位置のマス目のY座標(上から$00~$06)※敵の左上マス基準 |
$1B0C | キャラの位置のX軸(ピクセル単位) |
$1B0D | |
$1B0E | キャラの位置のY軸(ピクセル単位) |
$1B0F | |
$AA00 | 現在HP 00を下位バイト、01を上位バイトとした4桁の値 |
$AA01 | |
$AA02 | 行動異常 |
$AA03 | 力(現在値) |
$AA04 | 速(現在値) |
$AA05 | 体(現在値) |
$AA06 | 知(現在値) |
$AA07 | 状態異常 |
$AA08 | 首かため回復までの残り時間 |
$AA09 | 足かため回復までの残り時間 |
$AA0A | 腕かため回復までの残り時間 |
$AA0B | 毒回復までの残り時間 |
$AA0C | マヒ回復までの残り時間 |
$AA0D | 眠り回復までの残り時間 |
$AA0E | 酔い回復までの残り時間 |
$AA0F | 石化すると値がつく |
$AB00 | LV(現在値) |
$AB01 | 攻撃/回復中$01が入り、終わると$00 |
$AB02 | 被ダメージ/回復量のヒット数 |
$AB03 | ヒット数(倒れるか999以上の時$FF?) |
$AB04 | 被ダメージの単発値 |
$AB05 | |
$AB06 | |
$AB07 | |
$AB08 | |
$AB09 | |
$AB0A | |
$AB0B | |
$AB0C | |
$AB0D | |
$AB0E | |
$AB0F | |
$AC04 | BREAK DOWNする敵の状態? |