# QAS 2.0 スクリプトリファレンス

このファイルは QAS 2.0 のスクリプトリファレンスです。

## 構文基礎

QAS 2.0 スクリプトの構文の基礎部分を解説します。

### コメント

`;`(セミコロン)を記述すると、 如何なる場所においてもその行の終わりまでがコメントとして扱われ、 スクリプトとして一切の意味を持たなくなります。

### コマンド種別

コマンドは、大別して二種類のものに分けられます。

- #(シャープ)で始まる一般コマンド
- その他一部の文章表示コマンド

また、一部に実行を伴うコマンドが存在します。

各種コマンドは実行を伴うコマンドに到達するまで溜め込まれてから 一括して実行されます。

`#music improvise.mid ;BGM読み込み(まだ実行されない)
#sound bowwow.wav ;効果音読み込み(まだ実行されない)
#back mountains.gif ;画像読み込み(まだ実行されない)
@文章表示. ;文章表示(これまでコマンドとこのコマンドが一括実行される)`

### 変数

Variables.xml で定義した変数を使用できます。 詳しくは Variables.xml の設定方法、 後述の数値関連、変数関連の説明をご覧ください。

### 数式

コマンド中で数値の入力が可能な個所では、 数式を書くことによって基礎的な計算を行うことができます。

計算を行わず、変数や数値、関数を単体で書いても構いません。

数式内で使える演算子には以下のものがあります。

+
  加算（足し算）
-
  減算（引き算）
*
  乗算（掛け算）
/
  除算（割り算）
%
  剰余（割った余り）

``100
;数値 100
encounter
;変数「encounter」の値
encounter - 3
;変数「encounter」の値から 3 を引いたもの
(encounter - 10) * 3
;変数「encounter」の値から 10 引き、3 を掛けたもの``

通常の算術記号と同じように、 乗算、除算、剰余が先に計算され、 加算、減算が後から計算されます。 但し、括弧()を付けていた場合には、 その中身が優先して計算されます。

### 関数

数値や数式の一部に使える値として、 関数というものが用意されています。

#### rand - 乱数発生関数

任意の乱数を発生させることができる関数です。

``rand(数値)``

0 から、数値で指定した値より 1 小さい数値までの整数を返します。

``rand(3)
;0, 1, 2 のどれかになる
20 * (10 + rand(5))
;200, 220, 240, 260, 280 のどれかになる
rand(impression)
;0 から impression - 1 までのどれかになる``

### 条件式

条件式の入力が可能な個所では、 二つの数値を比較することができます。

条件式で比較に使える演算子は以下の通りです。

<
  左辺値が右辺値より小さい
>
  左辺値が右辺値より大きい
<=
  左辺値が右辺値より小さいか等しい
>=
  左辺値が右辺値より大きいか等しい
=
  左辺値と右辺値が等しい
!=
  左辺値と右辺値が等しくない

``10 > 5
;成立
encounter = 5
;変数「encounter」が 5 なら成立
-8 = 0
;成立しない
-8 != 0
;成立``

### 数値挿入

スクリプトの文章入力可能な個所では、 好きな場所に数値を挿入することができます。

使用するには、以下の構文を文章内に記述します。

``$数値$``

サンプルは以下のようになります。

``「おはようございます。$encounter$回目のご来店ですね」``

こうすることで、文章内に変数「encounter」の内容が挿入されます。

もしも変数「encounter」の値が 3 であった場合、 挿入結果の文章はこうなっているでしょう。

``「おはようございます。3回目のご来店ですね」``

以下のように、数式を記述することもできます。

``「あと$5 - encounter$回ご利用になれます」``

この場合は、5 から変数「encounter」の値を引いた数が挿入されます。

もしも変数「encounter」の値が 4 であった場合、 挿入結果の文章はこうなっているでしょう。

``「あと1回ご利用になれます」``

### 特殊情報挿入

上記の「変数挿入」のようにして文章内に挿入できる 特別な情報がいくつか存在します。

使用するには、以下の構文を文章内に記述します。

``%特殊情報名%``

特殊情報は以下に示すものしかありません。

chapter
  章の名前
year
  挿入時の西暦での実際の年数（通常なら 4 桁）
month
  挿入時の実際の月（1 から 12）
day
  挿入時の実際の日（1 から 31）
hour
  挿入時の実際の時間（0 から 24）
minute
  挿入時の実際の分（0 から 60）
second
  挿入時の実際の秒（0 から 60）

日時に関する情報は、QAS を起動するマシンに依存します。 もしもマシンの設定がズレていた場合、 ズレた情報が挿入されます。

サンプルは以下のようになります。

``現在の章は %chapter% です。``

この「特殊情報」は文章のどこにでも使えますが、 ゲーム内で実際の時間を知る必要はほとんど無いでしょう。 「特殊情報」は元々セーブファイル名を付けるために作られた機能です。 詳しくは Settings.xml の設定方法をご覧ください。

## コマンドリファレンス

各種コマンドの一覧と簡単な解説です。

### 文章表示コマンド

#### メッセージコマンド

実行を伴うコマンドです。

@(アットマーク)で始まり、.(コンマ)で終了します。以下のような特性があります。

- 通常のメッセージ表示に使われます。
- コマンド内の改行は表示に反映されます。但し、空行は無視されます。
- テキスト表示領域を越えた文字は自動的に改行されます。

``@文章表示テスト.``

#### 選択肢コマンド

実行を伴うコマンドです。

始めと終わりを !(エクスクラメーションマーク) で囲んで表記します。

各選択肢は、

``選択肢文,選択された場合にジャンプするラベル``

という形式になっています。

サンプルは以下のようになります。

``!
すぐに起きる,wakeup
まだ眠る,sleep
!``

更に、

``条件式:選択肢文,選択された場合にジャンプするラベル``

とすることによって、 条件式が成立した場合のみ選択肢を表示させることができます。

``!
すぐに起きる,wakeup
まだ眠る,sleep
clearVariable=1:電話する,telephone ;変数「clearVariable」が 1 なら出現
!``

#### 文章表示位置設定コマンド

テキストを表示する領域を設定します。

``#textbox x座標,y座標,幅,高さ``

選択肢文はこの領域を越えると表示されません。 また、通常文はこの領域の幅を超える前に自動改行されます。

サンプルは以下のようになります。

``#textbox 173,325,440,132``

#### 文章半透明設定コマンド

テキスト表示領域のみ暗くします。 特に枠を設けなくても文字を見やすくすることができます。

``#trans on
#trans off``

on を指定すると暗くなります。

``#trans on``

off を指定することで明るい状態に戻すことができます。

``#trans off``

#### 章の名前設定コマンド

現在の章の名前を設定します。 セーブ名などの特殊な用途に用いられます。

``#chapter 章の名前``

### 画像表示コマンド

Layers.xml で定義されているレイヤーに対して画像ファイルを読み込みます。

``#レイヤー名 画像ファイル名``

ビルド環境によって左右されますが、 読めるファイルは最大で以下のとおりになります。

- JPEG
- GIF
- PNG
- BMP
- PNM
- XPM
- LBM
- PCX
- TGA

サンプルは以下のようになります。

``#testlayer dog.gif ;レイヤー「testlayer」に dog.gif を読み込み``

### BGM、効果音コマンド

#### BGM コマンド

BGM ファイルを読み込みます。曲は自動的に無限ループします。 また、現在の BGM が鳴っている時に次の BGM の再生が行われた場合、 現在の BGM は中断され新しい BGM が再生されます。

ビルド環境によって左右されますが、 読めるファイルは最大で以下の通りになります。

- MP3
- MIDI
- Ogg Vorbis
- WAVE
- MOD

サンプルは以下のようになります。

``#music test.mp3 ;test.mp3 を再生``

#### 効果音コマンド

効果音ファイルを読み込みます。

一度読み込んだファイルはループせずに終了します。 また、現在の効果音が鳴っている時に次の効果音の再生が行われた場合、 現在の効果音は中断され新しい効果音が再生されます。

ビルド環境によって左右されますが、 読めるファイルは最大で以下の通りになります。

- Ogg Vorbis
- WAVE

サンプルは以下のようになります。

``#sound panch.wav ;panch.wav を再生``

### 制御系コマンド

#### ラベルコマンド

ラベルを設定します。

``#label ラベル名``

このコマンドを書いた場所にラベルが設定されます。 ラベルはシナリオファイルごとに個別に管理されています。

ラベル個所にジャンプする処理が行われた場合、 ジャンプした先のラベルの直後からスクリプトが継続されます。 コマンドは移動前のものも含めて 実行を伴うコマンドに到達するまで蓄積されます。

#### ジャンプコマンド

指定されたラベルの個所に移動します。

``#jamp 移動先のラベル名``

ラベルはシナリオファイルごとに個別に管理されているため、 同じシナリオファイルのラベルにしか飛べません。 別のシナリオファイルの特定のラベルに飛びたい場合は load コマンドを使用してください。

#### 変数操作コマンド

変数に対して数値の入力、数値の増加、数値の減少といった操作を行うことができます。

``#variable 操作対象変数 =(イコール) 数式
#variable 操作対象変数 +(プラス) 数式
#variable 操作対象変数 -(マイナス) 数式``

サンプルは以下のようになります。

``#variable clearFlag = 1 ;変数「clearFlag」に 1 入力
#variable encounter + 1 ;変数「encounter」を 1 増加
#variable impression - encounter ;変数「impression」を encounter 分だけ減少``

#### 条件ジャンプコマンド

条件式が成立した場合のみジャンプを行います。

``#ifjamp 条件式,移動先のラベル名``

サンプルは以下のようになります。

``#ifjamp clearFlag = 1,nextStage
;変数「clearFlag」が 1 の場合、ラベル「nextStage」に移動
#ifjamp encounter < 1,first
;変数「encounter」が 1 より小さい場合、ラベル「first」に移動
#ifjamp impression >= 3,room
;変数「impression」が 3 より大きいか等しい場合、ラベル「room」に移動``

#### シナリオロードコマンド

指定したシナリオファイルを読み込むことができます。

``#load 条件式,移動先のラベル名``

サンプルは以下のようになります。

``#load secondFile,person
;シナリオファイル「secondFile」を読み込み、ラベル「person」に移動
``

また、移動先のラベル名は省略することもできます。 省略した場合には指定したシナリオファイルの先頭から継続されます。

``#load secondFile
;シナリオファイル「secondFile」を読み込む
``

#### リセットコマンド

全ローカルフラグをクリアし、 読み込んでいたコマンドを消去し、 スクリプトを start の先頭に戻します。

``#reset``

クリア後、単に jamp コマンドで最初に戻った場合には、 各種ローカル変数が残ったままになっています。

一度このコマンドで全情報をリセットするか、 手動で全情報をリセットすべきでしょう。

### 画面制御コマンド

#### マスクコマンド

現在の画面の画像を全て隠します。画像の消去は行いません。

``#mask on
#mask off``

画面に黒い幕を掛けるのだと思ってください。

on を指定すると画面の画像を全て隠します。

``#mask on``

off を指定することで隠された画像が 全て元通り表示されるようになります。

``#mask off``

#### 画面切り替えコマンド

実行を伴うコマンドです。

画面を徐々に切り替えます。

``#mix``

以下のような使い方ができます。

``#back back.jpg ;レイヤー「back」に画像読み込み
@背景を更新しました。.
#mask on ;画面を真っ暗にして、
#mix ;暗くした画面へ切り替え
;画像が徐々に消えていく
#back new_back.jpg ;その間に新しい画像を読み込み
#mask off ;画像を元に戻して、
#mix ;暗い画面から、新しい画像が徐々に出てくる``