文法について
NS KAG の文法について
NS KAG は、テキストの間にタグと呼ばれる命令を挟んでいくことによってコンテンツの動きを制御するための言語であり、その文法は KAG3 と互換性があります。
また、ver.2 から KAG3 文法の上位互換である拡張文法モードを使用することができるようになりました。「拡張文法モードについて」も併せて参照してください。
テキスト
タグ、コマンド行、ラベル行、コメント行のどれにも属さない部分をテキストと呼びます。
この部分に書いた文字は、前後のタグなどの指定に従いつつも、基本的にそのまま出力されます。
また、テキストの中では空行、改行およびタブはコンテンツの再生に影響を及ぼさないので、これらのものは自由に置くことができます。
使うのに注意が必要な文字
"[" および "]" は、タグをくくるために使う文字なので、テキスト中で使う場合には以下の規則に従う必要があります。
- "[" をタグをくくるためではなく、単なるテキストとして使いたい場合には、"[[" というように2つ並べて書きます。これで、1文字分の "[" というテキストとみなされます。
- "]" は、タグ以外の場所では自動的に単なるテキストとみなされますので、特段の注意なく使うことができます。
"@"、"*" および ";" は、行頭に置かない限りはテキスト中に使うことが可能です。
タグおよびコマンド行
タグ
タグは半角の大括弧("[" と "]")でくくられた部分を指します。"[" の直後に置かれた文字列は、タグ名となります。"]" を置けば、その時点でそのタグは終わりです。
タグの途中で改行をしてはいけません。
タグは必ずしも行頭から始める必要はなく、行中、行末に位置していても構いません。
また、1つの行に2つ以上のタグがあっても構いません。
以下のサンプルスクリプトでは、赤字の部分がタグにあたります。
この部分はテキストです。
[l]
この部分はテキストです。
[l]
この部分はテキストです。
[p][cm]
コマンド行
タグの特殊な書き方として、コマンド行があります。
コマンド行は、半角のアットマーク "@" から始まる行を指します。"@" の直後に置かれた文字列がタグ名となります。改行をすれば、その時点でそのタグは終わりです。
したがって、コマンド行には1つのタグしか書くことができず、必ず行頭から始める必要があります。
文法に則してさえいれば、あるタグを書くにあたって、"[" と "]" で括る書き方をするか、コマンド行の書き方をするかは完全に自由です。
以下のサンプルスクリプトでは、赤字の部分がコマンド行にあたります。また、このスクリプトは、1つ上のスクリプトと完全に同じ意味を持ちます。
この部分はテキストです。
@l
この部分はテキストです。
@l
この部分はテキストです。
@p
@cm
属性と値
基本的な文法
タグ名だけのタグも存在しますが、多くのタグは、タグ名とあわせてそのタグの動きを指定するための属性と値のセットを持つことができます。
属性と値のセットをタグに含める場合は、タグ名の後に半角スペースを入れ、その後に属性、半角イコール"="、値を置きます。
属性と値のセットは、タグの種類によっては複数置くことができます。この場合、属性と値のセットの後に半角スペースを入れ、その後に再び属性、"="、値を置く形でセットを増やしていきます。
属性と "=" の間および "=" と値の間に余分な文字は入れないでください。
値の書式
値は、半角ダブルクォーテーション「"」で括ることも、括らないこともできます。
ただし、半角スペースを含む文字列を値に使いたい場合には、その値は「"」で括らなければいけません。
以下のサンプルスクリプトでは、青字の部分が属性、緑字の部分が値にあたります。
@quake
time= 1000
hmax= 10
vmax= 30
[font
face=" MS Pゴシック" color= 0xff0000]
この部分はテキストです。
値の省略
属性と値のセットのうち、"=" 以降を書かないと、値は省略されたものとみなされます。
値が省略された場合、その属性の値に "true" を指定した場合と同じ動作をします。
したがって、以下の2つのスクリプトは、完全に同じ意味を持ちます。
[wt canskip]
[wt canskip="true"]
ラベル行
半角アスタリスク "*" から始まる行はラベル行とみなされます。
詳しくは「ラベルについて」で説明しますが、"*" から始まる行はその行の終わりまで、ラベルを定義する役割を持ちますので、タグを置いたり、テキストを置いたりすることはできません。
コメント行
半角セミコロン ";" から始まる行はコメント行とみなされます。
コメント行は、コンテンツの再生には一切関係しませんので、備忘録などを自由に書くことができます。
コメントを書くためには、必ずその行の頭に ";" を置く必要があります。ある行の途中以降をコメントアウトする方法はありません。
ファイル名の扱いについて
上記の文法に従って NS KAG を記述し、novelsphere.js コンテンツを制作していくことになりますが、NS KAG ではファイル名の取扱が若干特殊です。
画像の表示やサウンドの再生にあたって、NS KAG 内から画像ファイルや音声ファイルの名前を指定する際には、以下の点に留意してください。
- ファイルパスは省略し、ファイル名のみを記述してください
- ファイル名に拡張子は含めないでください
- ファイル名の大文字・小文字は区別されません
- ASCII 文字コード範囲外の文字(例えば日本語)や、半角スペース、その他ファイル名に使用できない記号を持つファイル名を指定することはできません
例えば、画像を表示する時のことを考えてみます。
画像の表示は、[image]タグの storage 属性に表示したい画像ファイルを指定することで実現できます(詳しくは「画像について」で説明します)。仮に、プロジェクトフォルダ内の data フォルダ内の image フォルダに存在する test.png というファイルを表示したい場合、タグの書き方は以下のとおりとなります。
[image storage="test" layer="0"]
storage 属性の値が "test" となっていることがわかると思いますが、これが正しい指定です。
パスを含めて "data/image/test" としたり、拡張子を含めて "test.png" としたりしないでください。
なお、拡張子を含めないという規則は、画像ファイル・サウンドファイル・動画ファイルを指定する場合にのみ適用されます。その他のファイル(例えばシナリオファイル)を指定するときには、拡張子を含めて指定してください。
プロジェクトフォルダ内に同じファイル名・異なる拡張子を持つファイルが存在した場合、画像ファイルの場合は png>jpg>jpeg の優先順位で読み込まれます。例えば、test.png と test.jpg が同時に存在している状態で上記サンプルスクリプトを実行した場合、test.jpg は無視され、test.png が読み込まれることになります。
厳密には、画像ファイルを指定する場合に限り、拡張子を含んだファイル名を指定することもできますが、記法の一貫性の観点から推奨されません。また特に、サウンドファイルや動画ファイルを指定する場合には、拡張子を含んだファイル名を指定してはいけません。
また、どのようなファイルを指定する際にも、パスを含めた場合には正常に動作しなくなりますので、パスを含めてはいけません。
拡張文法モード
ver.2 から使用できる拡張文法モードは、ここまで説明してきた従来の文法(KAG3 互換文法モード)に対して、上位互換性を持ちます。
特段の指定なくビルドを行った場合、拡張文法モードでビルドされることになります。従来の文法モードでビルドしたい場合は、ビルドの際に明示的に指定する必要があります。詳しくは「Builder リファレンス」を参照してください。
拡張文法モードは、従来の文法と比べ、以下のような違いがあります。
タグ中での改行
拡張文法モードでは、タグの中での改行が行えるようになりました。これにより、以下のような書き方が可能になります。
[position layer="message0"
page="back"
top="530"
left="10"
width="620"
height="100"
color="0x000000"
visible="false"
]
なお、コマンド行の中での改行は行えないままです。
行頭以外からのコメント
拡張文法モードでは、セミコロン ";" によるコメントを、行頭以外の場所にも置くことができるようになりました。これにより、以下のような書き方が可能になります。
[position layer="message0" ;レイヤ名を指定
page="back" ;ページを指定
top="530" ;上端位置を指定
left="10" ;左端位置を指定
width="620" ;横幅を指定
height="100" ;縦幅を指定
color="0x000000" ;背景色を指定
visible="false" ;可視か不可視かを指定
]
複数行コメント
拡張文法モードでは、複数行にわたるコメントを置くことができるようになりました。"/*" と "*/" で括ることで複数行コメントとしてみなされます。
[trans method="crossfade" time="500"]
[wt]
/*
この間はコメントとしてみなされるので、何でも好きなものを書くことができます。
途中で改行しても問題ありません。
*/
[wait time="1000"]