「りも」トップページへ
インデックスページへ

「りも」デジタルノベルシステム
シナリオデータのテキスト形式フォーマット

Jul.24.1999
れろれろ@ふみ
(國兼憲太郎)

○概要

実際にプログラムが読み込み、実行するのはバイナリ形式のデータで あるが、開発手順においていきなりこれを記述するのは困難なので テキスト形式のタグファイルとしてシナリオを記述しそれをバイナリに 変換(コンパイル)する手順をふむ。
また実行部分の実装によってはコンパイルしたバイナリデータでなく、 テキスト形式のまま実行できる可能性もある。

基本的にシナリオはベタテキストで、コマンドや制御コードを記述 するのにSGMLライクなタグを用いる。

以後シナリオというと、本文で解説するテキスト形式のデータの事を さす。

○ファイル規定

シナリオファイルは *.scn を拡張子に持つテキストファイルである。
拡張子を除いたファイルネームに規定はないが、startup.scn という ファイルだけは特別な意味を持つ。startup.scn はどのファイルよりも 優先して実行されるという特性を持つ。他のファイルはこの startup.scn から呼び出されていったリンクの先に存在する。

ゆえに、最初に実行されるコード以外の目的で startup.scn という ファイル名は使えないし、バイナリ変換時に startup.scn が見つから なければエラー扱いとなる。

○シナリオ構文

構文的には「タグ」と「文章」に分類される。

タグは1バイト文字の不等号 <> で囲まれたもので、主にシナリオ内の 制御コマンドを意味する。またそのシナリオファイルの宣言やテキ ストの管理もタグで行う。

文章はタグ以外の部分すべてである。 ただしテキストファイル内において、タグにてその本体部分が明示 してあるので、厳密にいえばシナリオ部分のタグでないところという 言い方になる。
そのコード体系は色々あって S-JIS コードオンリーとする。ゆえにシナリオデータは S-JIS で書かれていなければ ならない。
文章についてはタグとの兼ね合いから1バイトの不等号 <> を使う事が できない。
動作アプリによっては、フォントの関係上文章は2バイト文字のみと 定義する。2バイト文字のみとしておくことを推奨。

文章部分において2バイトの空白文字は認識されるが、1バイトの空白 文字(Space,TAB,CR)はすべて無視される。これを利用して、シナリオ データ内を見やすく整形することが可能。
それら1バイト空白文字はバイナリ変換時にすべて無視される。

○注意事項

グラフィック周りの用語についてはターゲットとプログラムの実装に 依存するので場合に応じて読み替える必要がある。

○リファレンス

シナリオファイルにおけるタグの用法を記述する。

・<scene> 〜 </scene>
テキストファイル内<scene>で囲まれた部分をシナリオとして認識 する。ここからここまでがシナリオですよという宣言。
この構文を使ってシナリオをブロックとして区分。シナリオ分岐 に用いる。

・<title> 〜 </title>
シナリオブロックに名称をつける。
ここで宣言した名称を用いてブロック間のシナリオ分岐(ジャンプ) を行うことになる。また、<scene>内にこの名称宣言がない場合 バイナリ変換時にエラーとして扱われる。
宣言は<scene>内のどこでも良いことになっているけど、なるべく 頭の方に書くのが理想かと。

・<goto 〜>
〜で示されたシナリオブロックへジャンプする。
基本的に<scene>が終わってしまうと次どこのブロックへ行くかと いうのは無保証であり、場合によってはフリーズを引き起こす。
シナリオはその<scene>ブロックの中で<goto>を明示して、次どの ブロックへ行くかを指示してやらなければならない。
条件タグとの併用によりシナリオ分岐を実現出来る。

・<end>
ゲームの終了を示す特別タグ。
動作内容については実装(実行プログラム)によって異なる。

・<clear>
画面の消去。
主に画面上の文字を消去する。

・<page>
改ページ。
確認のキー入力を促した後、画面を消去する。
<wait><clear> と等価。

・<wait n>
文章ウェイトまたは確認用キー入力待ち。
ウェイト時間 n が指定されていたら、指定時間だけウェイトを入れ その後処理を続行する。n が指定されていなかった場合プレイヤーが ボタンを押下するまで待つ。
ウェイト時間 n の単位と範囲は実装による。

・<br>
文章改行。

・<sp>
空白文字。

・<p>
改段落。
<br><sp> と等価。

・<bgm 〜>
〜で指定された楽曲をリクエストする。
〜がファイル名かリスト番号かは実装による。

・<se 〜>
〜で指定された効果音をリクエストする。
〜がファイル名かリスト番号かは実装による。

・<graphic 〜>
〜で指定されたBGを画面に表示する。
〜がファイル名かリスト番号かは実装による。
バッファに転送しないので<clear><dispscreen>を実行するとバッ ファ内のグラフィックで上書きされてしまう。文字クリアに使い たい場合はバッファに転送した後、そのバッファの内容を表示する ようにする。

・<gbuffer 〜>
〜で指定されたBGをバッファに転送する。表示はしない。
〜がファイル名かリスト番号かは実装による。

・<dispscreen>
バッファ内のグラフィックをスクリーン(画面)に転送・表示をする。
<clear>と等価だが、文字の表示位置をリセットしない。

・<obj 〜 x y>
オブジェクトグラフィック 〜 を、座標(x,y)に合成表示する。
〜がファイル名かリスト番号かは実装による。
バッファに影響は与えない。

・<obuffer 〜 x y>
オブジェクトグラフィック 〜 を、バッファの座標(x,y)に転送 合成する。
〜がファイル名かリスト番号かは実装による。

・<flgon n>
n番のフラグをONに設定する。
nの最大値は実装による。
また、n が数値でフラグ番号を指すか文字列でフラグ名を指すかも 実装による。

・<flgoff n>
n番のフラグをOFFに設定する。

・<flgset n m r>
n番のフラグ(兼パラメータ)に値mをセットする、その際0〜rの 乱数をmに加算する。
数値範囲は実装による。

・<flgadd n m r>
n番のフラグ(兼パラメータ)に値mを加算する、その際0〜rの 乱数をmに加算する。

・<flgsub n m r>
n番のフラグ(兼パラメータ)に値mを加算する、その際0〜rの 乱数をmに加算する。

・<ifflgon n> 〜 </ifflgon>
n番のフラグがONだったら〜の範囲にあるシナリオを実行する。
逆に言うとフラグがOFFだったら</ifflgon>までシナリオを スキップする。

・<ifflgoff n> 〜 </ifflgoff>
n番のフラグがOFFだったら〜の範囲にあるシナリオを実行する。

・<ifflgeq n m> 〜 </ifflgeq>
n番のフラグ(パラメータ)の数値がmだったら〜の範囲にあるシナ リオを実行する。

・<ifflgne n m> 〜 </ifflgne>
n番のフラグ(パラメータ)の数値がmでなかったら〜の範囲にある シナリオを実行する。

・<ifflggt n m> 〜 </ifflggt>
n番のフラグ(パラメータ)の数値がmより大きかったら〜の範囲に あるシナリオを実行する。

・<ifflglt n m> 〜 </ifflglt>
n番のフラグ(パラメータ)の数値がmより小さかったら〜の範囲に あるシナリオを実行する。

・<select> 〜 </select>
〜の範囲にあるアイテム設定を選択肢としてプレイヤーに選択を 要求する。
アイテム設定は以下のタグで行われ、これらは<select>の範囲内 のみで有効である。

<item n m> 〜 </item>

〜が選択される文章を表わす。
結果このアイテムが選択された場合、n番のフラグにmがセット されて<select>の処理を終了する。
選択肢の数はこの<select>内の<item>の個数から判別される事と なる。


rero2@yuumu.rim.or.jp