イベントについては今回でラストです。1〜4の内容を踏まえて、ボスバトル、選択肢会話、
セリフを用いた既存イベント検索法の3本立てで締め括りたいと思います。
ボスバトルの中身についてはBNE2での準備作業が中心となります。まずモンスターパーティ【ボス】で
登場させるモンスターや配置、ABP、BGMなどを設定しておきます(下記画像)。
次にモンスターエンカウント(固定)でどのボス戦にどのパーティを登場させるか設定します(下記画像)。
この画像の左端の数字がボス戦の通し番号=IDです。イベントコードにはこの番号が必要ですので
ボスバトルを記述する前に準備が必要となります。ボス戦のイベントコードはWikiを見ると・・・
<BD xx yy>
と書いてあります。このxxに通し番号を入れて、yyには戦闘時の背景画像を指定します。基本的に
yyにはFFが指定されています。FFはマップエントリーに設定された背景画像をそのまま使うという
指定となります。マップ準拠にしない場合は、自分で決めた背景番号を指定します。
ウォルスの塔のガルラ戦は原作Romの$87111からBD 06 FFと指定されています。
イベントのボス戦では、NPCのボスキャラシンボルが戦闘後に消滅する演出となっていますが、
コードにはボス戦に突入する直前にボスシンボルを消す命令が入っています。イベントでのNPCは
0x80から順に割り振られていて、80 09 80 22…といったように割り振られた番号と動作命令を
セットにして2バイトで記述していきます。動作命令8x 0AはNPC8xを消すという命令で、ガルラ戦では
ガルラに84が割り振られているので84 0Aというコードでガルラを消しています。$8710Fから
84 0A BD 06 FFと記述されていて、NPC84を消す→ボスバトル06にマップ準拠の背景で突入する
という意味になります。ですが、実際の画面上ではボスバトル開始前にはガルラは消えず、
戦闘が終わってからガルラが消えます。ですので原作に沿ってボスシンボルを消す→ボスバトル
という順番でイベントコードを記述すれば大丈夫です。実はもう一つ、ボスバトルコードがあります。
<E2 xx yy _ _ _ _> 固定戦闘設定 [分岐] 勝利/退却の場合 _ _ _ _ の 4 バイトを飛ばす
この命令では、ボス戦で勝った場合と負けた場合で異なるストーリー展開に分岐させることが
できます。負けてもオープニング画面には移らず、そのままイベントが続きます。原作では
第2世界の孤島でのアブダクター戦がこのイベントコードで記述されています。
実際にはE2 xx yy CD aa bb FFというふうに、サブイベント呼び出しのCD xx yyが直後に置かれます。
勝利の場合はこの4バイトを飛ばして5バイト目からの記述内容が実行され、敗戦の場合には
このサブイベントで指定したイベントが実行されて直後のFFでイベントが終わります。
サブイベント呼び出し命令のCD xx yyには直接イベント番号を入れても正常に機能しません。
これは筆者も長い間しくみに気がつかず、イマイチ理解できていませんでした。このxx yyには
イベント番号を2倍した値を書き込む必要があります。なんでそうなるのかに気づくのには
更に時間がかかりました。とりあえず下の画像をご覧下さい。BNE2のイベントデータoffsetです。
左側の数値はイベントの通し番号=IDで、右はオフセットです。例えばイベント005Bを見ますと
オフセットは0xC8A671となっています。$8A671からイベント005Bが始まるという意味です。
このイベントをCD xx yyで呼び出す場合にCD 5B 00と記述しても呼び出せません。この005Bを
2倍した00B6を指定する必要があります。CD B6 00と記述して初めてイベント005Bを正確に
呼び出すことができます。なんでこんな事してるのか筆者も長い間わからなかったのですが、
実はBNE2で表示されるイベントデータoffsetは大き目の括りで、このイベントIDを更に細かく
分ける、内部的な隠しIDがあるんです。
内部イベントを呼び出す場合は005Bを2倍した00B6に1を足した00B7を用いてCD B7 00と書きます。
これが厄介で、オフセットは$83545にD3 A6 C8と指定されています。ひっくり返して$8A6D3から
始まるという意味です。再度上の画像をご覧下さい。イベント005Bの次の005Cはオフセットが
0xC8A94Dとなっています。BNE2だけを見ると実際には$8A6D3から始まる内部的な区切りには
気がつきません。内部的な区切りを無理やりつくるためにIDを2倍して1加えて奇数のIDを
水増ししているというカラクリでした。そのせいでCD xx yyは元のイベントIDを2倍してから
ひっくり返すという面倒なことになっています。
正直、一読しただけでは意味がよくわからないかもしれませんが、BNE2で表示されている
イベントデータoffsetには実は内部的な区切りがあるという点と、CD xx yyを使うときは
イベントIDを2倍してひっくり返すという点。この2点をなんとなく頭に入れておいて頂ければと
思います。
Wikiを参照しますと・・・
<F0 xx yy _ _ _ _> 選択肢会話 いいえを選択した場合は_ _ _ _ の 4 バイトを飛ばす
言い換えれば、はいを選択した場合はF0 xx yyの直後の4バイトを実行するということです。
xx yyはメッセージ表示命令のC8 xx yyと同じくメッセージIDをひっくり返して指定します。
そして、前項の分岐戦闘と同じく空欄の4バイトにはCD xx yy FFが記述されています。はいの場合は
サブイベントを実行して終わり。更にいいえの場合も別のサブイベントに飛ばすことが多いです。
実際のイベントで確認すると、トゥールの村の初心者の館に案内してくれる紫色のおじいさんの
選択肢会話コードが$96FBBからF0 D8 00 CD 0E 04 FF CD 0F 04 FFと記述されています。
初心者の館に行くか? はいならCD 0E 04つまりイベント0207を実行します。いいえなら、
040F - 1 = 040Eなので、イベント0207の内部イベントを実行します。
ではBNE2でイベント0207のオフセットを調べると、$954A8とわかりますので見てみます。
C8 DA 00 E3 20 00 D4 2E 00……と続いています。メッセージ00DAを表示してから画面暗転移動で
XY座標D4 2Eへ移動。実際にはX座標には向きも含まれていて、+C0で左向き指定です。つまり
D4 - C0 = 14となり、実際のX座標は0x14となります。なにはともあれ、選択肢会話ではいを
選んだ場合はおじいさんと一緒に初心者の館の前までワープして、いいえの場合にはメッセージ
00D9を表示させて終了というふうにコードが組まれています。
選択肢会話では、はい/いいえの2つのジャンプ先を指定して、それぞれの先で分岐した内容を
組んでいくという流れになります。いいえの場合に、一切何もせずに即終了させたい場合は
CD 09 00で汎用的なサブイベントが呼べるので、それを使えばOKです。このサブイベの内容は
$849F4から始まるFFの1バイトのみで、呼んだ瞬間にイベント終了となります。
これにてイベント改造法の基本の総仕上げとなります。原作のイベントコードには、スクウェアの
プログラマーさんが様々な工夫を凝らして多彩な演出を組み込んでいます。それらを参照すると
様々なテクニックに触れることができ、既存イベントを潰して新たなイベントを組み立てる際の
大きなヒントになります。例えばエクスデスがクリスタルからビームを放つ演出はどうなって
いるんだろうかと疑問に思ったら、長老の木のイベントを探す必要があります。そのイベント検索に
セリフを利用するとすんなりイベントが見つかります。実はこのイベント検索のコツは、Wikiの
FF6のイベントのページに書いてありました。原文を引用しますと・・・
例)ゲーム開始直後・炭坑都市ナルシェ
ガード「帝国の魔導アーマー!?とうとうこのナルシェにまで!
この会話番号は00Dであり、会話データオフセットは0CE61Cにある。
その値は 67 02 なので 0267 + 0D0000 = 0D0267 からこの会話
データ文字列がある。
(この事から、会話を含むイベントの格納場所、会話番号、会話オフセット、会話データ文字列のうち
どれかが分かれば、全てが逆算で導ける。)
FF5では勝手が違うのですが、セリフをバイナリに変換→Stirlingで検索→オフセットから
メッセージIDを調べる→C8 xx yyで検索→ヒットした周辺がお目当てのイベントコードという
具合に目的のイベントに辿りつけます。
セリフは遠藤慎悟さんのff_analyzerで抽出したセリフ集かドラクエビューアで調べられます。
ムーアの長老の木のイベントではエクスデスの「クリスタルに、ひざまづくがよい!」という
セリフがあります。見つけやすいように「ひざまづくがよい」をバイナリに変換して検索すると
$AAE0Aがヒットします。ここからセリフの始点を探すと$AAE03とわかります。これをBNE2の
FF5セリフoffsetで探すと、セリフID:05C3だとわかります。これをひっくり返してC8 C3 05を
Stirlingで検索すると、$96190がヒットします。この周辺が長老の木内部でガラフとエクスデスが
戦うイベントのコードだとわかります。このような手順でセリフからイベントを検索できます。
これにてイベントチュートリアルを終わります。