Data\Adv\DAT\Chapter0003.ybc(4月1週のアドベンチャーパート)を例に。
ちなみに解析結果から先に書いてしまうとこんな感じ。
ちなみに解析結果から先に書いてしまうとこんな感じ。
04 00 00 00 14 00 00 00 //ヘッダ AE 15 00 00 //アドレス15AEからファイルのパスを記述 0E 16 00 00 0E 16 00 00 //アドレス160Eから台詞のデータを記述 38 00 08 00 00 00 00 20 //暗転 43 00 08 00 00 00 00 00 45 00 28 00 00 00 00 20 00 00 00 20 44 01 00 20 00 00 00 20 35 00 00 20 00 00 00 20 00 00 00 20 00 04 00 20 80 00 00 20 //週の開始処理 38 00 08 00 03 00 00 20 //フェードイン 0D 00 08 00 58 02 00 20 //週タイトルを表示・クリック待ち 38 00 08 00 04 00 00 20 //フェードアウト 4A 00 04 00 //週タイトルを消去 0C 00 08 00 1E 00 00 20 //?(画面のリフレッシュ?) 14 00 08 00 01 00 00 20 //? 3F 00 08 00 02 00 00 20 //音楽を再生(M-002.mp3) 1B 00 10 00 01 00 00 20 FF FF FF 2F FF FF FF 2F //名前なしメッセージ枠を画面中央に表示 38 00 08 00 03 00 00 20 //フェードイン 2B 00 08 00 01 00 00 20 //画面中央のメッセージエリアをアクティブに 11 00 06 00 00 00 //台詞を表示【エルメナスと呼ばれる大地の片隅に、】 11 00 06 00 01 00 //台詞を表示【豊かなイチイに包まれた静かな森がある。】 11 00 06 00 02 00 //台詞を表示【この地を後にして、いつしか九年……】 32 00 04 00 //メッセージ後のクリック待ち▼を表示 33 00 04 00 //クリック待ち 2C 00 04 00 //アクティブのメッセージを消去 11 00 06 00 03 00 //台詞を表示【ともすれば見失いそうになる小道を抜け、】 11 00 06 00 04 00 //台詞を表示【雪解けのせせらぎを渡り、澄んだ野池に】 11 00 06 00 05 00 //台詞を表示【映るエンラッドの大連峰を望む。】 32 00 04 00 //メッセージ後のクリック待ち▼を表示 33 00 04 00 //クリック待ち 2C 00 04 00 //アクティブのメッセージを消去 : :
解析結果はおおむね全部適当なので間違ってる可能性は大有。
書き方が判りにくいかもしれない。誰か判りやすく書き換えてくれる人募集中というか勝手に書き換えてください。
書き方が判りにくいかもしれない。誰か判りやすく書き換えてくれる人募集中というか勝手に書き換えてください。
ヘッダ部分
①先頭8バイト | 固定。Chapterファイルの識別子? |
②続きの4バイト | 週タイトル画像のパスやらこのファイルの次に実行するChapterファイルのパスやらの開始アドレス(後述) |
③続きの4バイト×2 | 台詞データ部分の開始アドレス(後述)。何故か2回繰り返し。 |
本体部分
本体部分の命令は何度も繰り返し出てくる。
①38 00 08 00 xx 00 00 20 | 画面の暗転・陽転。xxは以下のスイッチ。 00…暗転 02…陽転 03…フェードインして陽転 04…フェードアウトして暗転 05…白背景からフェードイン 06…白背景へフェードアウト ちなみに01にするとホワイトアウトして固まりました。 |
②-1)43 00 08 00 xx 00 00 00 | ヘッダ②に記載のアドレス+(xx×48バイト)から記述されている画像ファイルを表示。この場合、週タイトルの画像を表示している。 |
②-2)45 00 28 00 00 00 00 20 xx xx 00 20 yy yy 00 20 00 00 00 20 35 00 00 20 00 00 00 20 00 00 00 20 ww ww 00 20 hh hh 00 20 | 表示した画像ファイルの原点を横xx xx、縦yy yyに移動、幅ww ww、高さhh hhで表示。週タイトル画像の場合xx xxが00 00(0px)、yy yyが44 01(324px)、ww wwが00 04(1024px)、hh hhが80 00(128px)。画像ファイルはタイル状に繰り返し配置されているらしく、例えばhh hhを倍にすると縦2倍に拡大表示されるんじゃなくて週タイトル画像が縦に2枚表示される。なんでやねん。他のスイッチは解析中。 |
③0D 00 08 00 58 02 00 20 | 週タイトル表示後のクリック待ちをしているらしい。解析中 |
④4A 00 04 00 | 週タイトル画像を消去 |
⑤0C 00 08 00 xx 00 00 20 | ウェイトのようだ。重りじゃなくて待つほうの。ウェイト時間はxx×20msくらい。 |
⑥14 00 08 00 01 00 00 20 | 謎。無くても動く。解析中 |
※「無くても動く」とは言いつつ、ヘッダ部分の②・③で指定した開始アドレスがずれると強制終了がかかるので、単純に削除した場合はヘッダ②・③のアドレスを書き換える必要がある
⑦3F 00 08 00 xx 00 00 20 | BGMを再生する。xxはData\SOUND\BGMフォルダ内のM-yyy.mp3のyyy部分を16進表現したもの、01(001)~17(022)まで。0E(014)と13(018)は欠番。 |
⑧1B 00 10 00 xx 00 00 20 FF FF FF 2F FF FF FF 2F | 名前なしメッセージ枠をxxの位置に表示する。xxは以下の通り。 01…画面中央 02…左下 03…右下 04…下中央 |
⑨2B 00 08 00 xx 00 00 20 | xxのメッセージエリアをアクティブにする。xxは⑧または⑯で指定したもの |
⑩11 00 06 00 xx 00 | アクティブのメッセージエリアにxx番目の台詞(1行単位)を表示する。つまりここの例で言うと00~02番目までの3行を連続で表示していることになる。台詞そのものはファイル末尾のデータ部分(後述)にまとめて載ってる。 |
⑪32 00 04 00 | メッセージ表示後のクリック待ちを示す下三角(▼)を表示。 |
⑫33 00 04 00 | クリック待ち。ユーザーからのクリック入力(もしくはSpaceの押下)があるまでこれ以降の処理はいったん停止する。 |
⑬2C 00 04 00 | (クリック入力後)アクティブのメッセージエリアの台詞を消去する |
⑭3B 00 10 00 00 00 00 20 xx 00 00 20 yy 00 00 20 | 背景画像を表示。xxはData\Adv\binフォルダのbg001_a.binを01として、以下bg001_b.binを02、bg001_c.binを03、bg001_d.binを04、bg002_a.binを05…と16進表示したもの。ただしbg030_x.bin(75)以降はbg031_x.binが76、bg032_x.binが77…となる。 yyは表示方法のスイッチ。01でフェードせずにいきなり表示、02でフェードインしながら表示、03でフェードアウト、04で白背景からフェードイン、05で白背景へフェードアウト。 |
⑮1C 00 08 00 xx 00 00 20 | xxの位置にある名前なしメッセージ枠を消去。xxは⑧で指定したもの |
⑯1E 00 14 00 xx 00 00 20 yy 00 00 20 zz 00 00 20 tt 00 00 20 | 名前ありメッセージ枠をxxの位置に表示。名前なし枠は主人公(純潔の盾の長)専用、名前あり枠はそれ以外のキャラクタ用だな。xxのスイッチは以下の通り。 05…左下 06…右下 07…上左 08…中右 09…下左 0A…中央、左にキャラクタ画像 0B…中央、右にキャラクタ画像 続けてキャラクタ番号yyの画像と名前を表示する。キャラクタ番号の詳細は登場キャラクタ一覧を参照のこと。zzはキャラクタの表情(後述)。ttはキャラクタ画像を表示してから枠を表示するまでのウェイト時間(×20ms) |
⑰41 00 08 00 xx 00 yy 00 | キャラクタボイスを再生する。xxはフォルダ番号。yyはファイル番号。実際のファイル名との対応は![]() |
⑱28 00 0C 00 xx 00 00 20 yy 00 00 20 | xxの位置にあるキャラクタの表情をyyに変更する。xxは⑯で指定したもの。yyのスイッチは下記、でも全部のキャラクタに全部の表情が用意されてるわけではない。 00…標準 01…笑顔 05…半泣き |
⑲1A 00 14 00 xx 00 00 20 yy 00 00 20 zz 00 00 20 ww 00 00 20 | xxの位置にあるメッセージ枠をyyに差し替えてzzのキャラクタをwwの表情で表示するっぽい。xxは⑧、yyは⑯で指定したもの。 |
⑳21 00 10 00 xx 00 00 20 yy 00 00 20 zz 00 00 20 | xxの位置にあるキャラクタをyyのキャラクタに差し替えてzzの表情で表示するっぽい。 |
21)24 00 04 00 | 謎。キャラクタの表示関連? |
22)2F 00 0C 00 xx 00 00 20 yy 00 00 20 | アクティブエリアのフォントの横サイズをxx割、縦サイズをyy割に縮小(拡大)。イリオンの「ボク、ボク…」専用に作られた機能であるかのよーだ。 |
23)30 00 04 00 | アクティブエリアのフォントのサイズを元に戻す。 |
フッタ部分・データ部分
24)15 00 04 00 | 終了処理っぽい。解析中。続きの0C 00 08 00~は⑤のウェイトだわな。 |
25)0F 00 08 00 xx 00 00 00 | 次のChapterファイルへ飛ぶ。次のChapterファイルのパスはヘッダ②で指定したアドレス+(xx×48バイト)から記述してある。ここでの例の場合は15AE+(1×48バイト)=15DE=フッタ②(下記)になる。 |
26)13 00 04 00 | Chapterファイルを終了する。 |
①48バイト | 週タイトルの画像ファイル名。ここのアドレスはヘッダ②で指定したアドレス(ここの例では15AE)。 |
②次の48バイト | 次に実行するアドベンチャーパート(Chapterファイル)のファイル名。 |
③xx xx 00 00 | ここのアドレスはヘッダの③で指定したアドレス(ここの例では160E)。で、ここから下は台詞に関するデータ。台詞の全部の行数をxx xxの2バイトで明示。ここの例で言うと03 01なのでこのChapterファイル内の台詞は全部で16進の103(10進の259)行あるということになる。ヘッダでのアドレス指定もそうだけど、バイトの前後が入れ替わってるのはIntelプロセッサのリトルエンディアンのため。 |
④xx xx yy yy | 0番目を0行目の台詞、1番目を1行目の台詞…として、それぞれの台詞データの開始アドレスをxx xx、データの長さをyy yyで表示。ただしyy yyに関しては機能していない様子(別の値に書き換えても正常に台詞が表示される)。開始アドレスは③からの相対位置で表示。ここの例で言うと0番目の台詞データの開始位置は③の160E+410=1A1Eということになる。下の図参照。 |
⑤ | 見ての通り台詞データ。台詞と台詞の間は00 00で区切り。それぞれの開始アドレスは上記④で指定。 |
まとめ
以上を一覧にしてみる。Chapterxxx.ybcファイルからの自動変換は解析ツールをご利用あれ~。XさんThanks!
ヘッダ部分
①先頭8バイト | Chapterファイルの識別子? |
②続きの4バイト | 週タイトル画像のパスやこのファイルの次に実行するChapterファイルのパスの開始アドレス |
③続きの4バイト×2 | 台詞データ部分の開始アドレス |
本体部分
38 00 08 00 xx 00 00 20 | 画面の暗転・陽転。 00…暗転 02…陽転 03…フェードインして陽転 04…フェードアウトして暗転 05…白背景からフェードイン 06…白背景へフェードアウト |
43 00 08 00 xx 00 00 00 | ヘッダ②に記載のアドレス+(xx×48バイト)から記述されているファイル画像を表示 |
45 00 28 00 00 00 00 20 xx xx 00 20 yy yy 00 20 00 00 00 20 35 00 00 20 00 00 00 20 00 00 00 20 ww ww 00 20 hh hh 00 20 | 表示した画像ファイルの原点を横xx xx、縦yy yyに移動、幅ww ww、高さhh hhで表示。解析中 |
0D 00 08 00 58 02 00 20 | 週タイトル表示後のクリック待ち? |
4A 00 04 00 | 週タイトル画像を消去 |
0C 00 08 00 xx 00 00 20 | ウェイト。ウェイト時間はxx×20msくらい。 |
14 00 08 00 01 00 00 20 | 謎。無くても動く。 |
3F 00 08 00 xx 00 00 20 | BGMを再生(Data\SOUND\BGM\M-yyy.mp3) |
1B 00 10 00 xx 00 00 20 FF FF FF 2F FF FF FF 2F | 名前なしメッセージ枠を表示 00…画面中央横長 01…画面中央 02…左下 03…右下 04…下中央 |
2B 00 08 00 xx 00 00 20 | xxのメッセージエリアをアクティブに |
11 00 06 00 xx 00 | アクティブのメッセージエリアにxx番目の台詞を表示 |
32 00 04 00 | メッセージ表示後のクリック待ち下三角(▼)を表示 |
33 00 04 00 | クリック待ち。処理はいったん停止 |
2C 00 04 00 | アクティブのメッセージエリアの台詞を消去する |
3B 00 10 00 00 00 00 20 xx 00 00 20 yy 00 00 20 | 背景画像を表示(Data\Adv\bin\bgzzz_z.bin) 01…フェードせずに表示 02…フェードイン 03…フェードアウト 04…白背景からフェードイン 05…白背景へフェードアウト |
1C 00 08 00 xx 00 00 20 | xxの位置にある名前なしメッセージ枠を消去 |
1E 00 14 00 xx 00 00 20 yy 00 00 20 zz 00 00 20 tt 00 00 20 | 名前ありメッセージ枠をxxの位置に表示 05…左下 06…右下 07…上左 08…中右 09…下左 0A…中央、左にキャラクタ画像 0B…中央、右にキャラクタ画像 続けてキャラクタ番号yyの画像(表情zz)と名前を表示。ttはキャラクタ画像を表示してから枠を表示するまでのウェイト時間(×20ms) |
1D 00 14 00 xx 00 00 20 yy 00 00 20 zz 00 00 20 1E 00 00 20 | 名前ありメッセージ枠をxxの位置に表示、続けてキャラクタ番号yyの画像(表情zz)と名前を表示。1Eで始まるものと違いメッセージの最初の1行はフェードインなしで表示される。 |
41 00 08 00 xx 00 yy 00 | キャラクタボイスを再生 |
28 00 0C 00 xx 00 00 20 yy 00 00 20 | xxの位置にあるキャラクタの表情をyyに変更 00…標準 01…笑顔 05…半泣き |
1A 00 14 00 xx 00 00 20 yy 00 00 20 zz 00 00 20 ww 00 00 20 | xxの位置にあるメッセージ枠をyyに差し替えてzzのキャラクタをwwの表情で表示 |
21 00 10 00 xx 00 00 20 yy 00 00 20 zz 00 00 20 | xxの位置にあるキャラクタをyyのキャラクタに差し替えてzzの表情で表示 |
24 00 04 00 | キャラ変更を行なった際に、表示変更が終了するのを待つ。 |
2F 00 0C 00 xx 00 00 20 yy 00 00 20 | アクティブエリアのフォントの横サイズをxx割、縦サイズをyy割に縮小(拡大) |
30 00 04 00 | アクティブエリアのフォントのサイズを元に戻す |
本体部分(その他)
3D 00 14 00 00 00 00 00 xx 00 00 00 yy 00 00 00 zz 00 00 00 ... | 選択肢を表示。xxは選択肢の総数、yyは選択肢0の台詞番号、zzは選択肢1の台詞番号。以下、選択肢の数だけ続く。 |
3D 00 18 00 00 00 00 00 xx 00 00 00 yy 00 00 00 zz 00 00 00 ... | 選択肢を表示。上記との違いはまだ不明、上が2択でこっちは3択だったけどそれかなぁ。解析中 |
08 00 14 00 01 00 00 00 00 00 00 00 xx 00 00 20 yy yy 00 00 | 選択肢表示の後に出てくるコマンド。選択肢xxを選択した場合にアドレスyy yyへ処理をジャンプする。ここでのアドレスは本体部分開始位置からの相対アドレス。つまり実際のジャンプ先はyy yy+0x14(ヘッダ部分の長さ)になる。このあたりの解析はChapter310、309などを参照のこと。 |
A9 00 0C 00 00 00 00 00 1D 00 00 20 | 前回の戦術結果によって分岐する。5選択肢(Perfect、Excellent、Congratulation、Never Mind、Bad Luck)の分岐として扱われるため、直後に08 00 14 00~の処理ジャンプコマンド×5が続く。Chapter311の開始直後などを参照のこと。 |
90 00 08 00 xx 00 00 20 | キャラ番号xxのキャラクタを学級に追加する。生徒でも先生でもOK。 |
91 00 08 00 xx 00 00 20 | キャラ番号xxのキャラクタを学級から削除する。 |
0B 00 08 00 xx xx 00 00 | アドレスxx xxへ処理をジャンプする。アドレスは本体部分開始位置からの相対アドレス(xx xx+0x14)。 |
18 00 0C 00 xx 00 00 20 02 00 00 20 | xxの位置にある名前なしメッセージ枠を消去する。2番目のスイッチはよくわからないが01~03以外ではちゃんと動作しない。 |
1f 00 0C 00 xx 00 00 20 yy 00 00 20 | xxの位置にある名前ありメッセージ枠を消去する。まず枠を消去して、yy×20msぐらい後からキャラクタ画像を消去する。妙なところで芸が細かいな。 |
フッタ部分
15 00 04 00 | 表示されている背景・キャラクタ・枠を全て非表示にする。 |
0F 00 08 00 xx 00 00 00 | 次のChapterファイル(パスはヘッダ②で指定したアドレス+(xx×48バイト)から記述)へ飛ぶ。 |
13 00 04 00 | Chapterファイルを終了する |
データ部分
①48バイト | 週タイトルの画像ファイル名 |
②次の48バイト | 次に実行するアドベンチャーパート(Chapterファイル)のファイル名 |
③xx xx 00 00 | 台詞の全部の行数をxx xxの2バイトで明示 |
④xx xx yy yy×台詞の行数 | 台詞データの開始アドレスをxx xx、データの長さをyy yyで表示。開始アドレスは③からの相対位置 |
⑤ | 台詞データ。台詞と台詞の間は00 00で区切り |