FF3 のスクリプトデータの解析

cheap さんの掲示板に投稿しようとおもったのですが、.pl ファイルが not found で投稿できませんでした. (直してくださったらこの件はそっちに書きます)

[引数なし]
00-bf (未調査) FF2 と同じで町人などの移動や方向制御だと思う
c0-cf プレイヤーキャラの移動や方向制御
d0 ゆれる
d1 雷鳴
d2 暗くなる
d3 明るくなる
d4 HP回復
d5 MP回復
d6 隠し通路解錠関連その1
d7 隠し通路解錠関連その2
d8 reset game
d9 アムル西に船を停泊
da dance
db opening
dc poem
dd ending
de なにかのフラグセットと浮上後(寸前)の外の大陸にいく.; b@6011 |= 0x80; b@0078 = 3
df いきかえり
e0 PC $b64f; 外マップでは止まらないが詳細不明
e1 PC $b668; 同上
e2 ひかる
fd 1つ前に移動(デジョンx1).
fe 繰り返し(?)
ff script 終了

[引数1つ]
e3-e6 xx 効果なし; rts のみ
e7 xx アイテム1つ消費. 引数はアイテムID
e8 xx b@6102 &= xx; 状態異常解除(全員), 0x00 で全部解除
e9 xx b@6102 |= xx; 状態異常付加(全員), 0xff で全部付加
ea xx w@601d += xx; 所持金を256ぎる単位で加算
eb xx w@601d -= xx; 上記の減算版
ec xx b@601b += xx; キャパシティ加算
ed xx b@601b -= xx; 上記の減算版
ee xx b@600b = xx; NPC 設定
ef xx 外で起こすようなスプライト制御系統のイベント
f0 xx セリフを出すその1
f1 xx セリフを出すその2
f2 xx address $6020-$603f の RAM へ OR 演算で bit を立てる. ゲーム進行のフラグを立てている. 引数の bit2:0 が対象 data bit で、 bit7:3 が address offset.
f3 xx 上記の AND 演算で bit を下げる版
f4 xx script data 0xf2 から 対象アドレスを $6080-$609f に変えたもの.
f5 xx 上記の AND 演算で bit を下げる版
f6 xx script data 0xe7 の消費を取得に変えたもの
f7 xx 戦闘開始. 引数は敵のグループ番号.
f8 xx BGM 変更. 引数は曲番号.
f9 xx 特定の外の場所へ移動
fa xx 特定の屋内の場所へ移動
fb xx 用途不明; b@0045 = xx; b@0044 = $80
fc xx xx frames 待機

注)

  • 移動,戦闘,演出は滞在中の大陸や屋内屋外で挙動が変わるものが結構ある
  • b@6102 は address $6102 を byte 単位で扱っての意味. w@601d は little endian 16 bit 単位で扱う.
  • &, |, ^ 演算子の意味は C と同じ
  • セリフコマンドが2種類ある理由は未調査

(2022年1月19日追記)
command 0xf3 と 0xf5 が XOR 演算版と書いていましたが誤りでした. 該当部は訂正しました. さらに cheap さんにその間違いをアドバイスするという失態. すいませんでした.

言い訳なんですが FF2 は XOR 演算だった先入観と $b9a6 eor #$ff; $and $6020,y を $b9a6 eor $6020,y とななめ読みして、早合点してました.

f:id:na6ko:20220119005012p:plain