Show page source of スクリプト文法 #94519

= スクリプト文法
[[PageOutline]]
== メッセージウィンドウ
=== メッセージウィンドウへの表示
「"」で囲まれた文字列を記述すると、メッセージウィンドウへ表示する文字列となります
{{{ code c
// 「メッセージを表示します」とメッセージウィンドウに表示します
"メッセージウィンドウを表示します"
}}}

=== 改行
メッセージを連続して記述すると、改行してメッセージを表示します
{{{ code c
"春はあけぼの。"
"やうやうしろくなりゆく山ぎは、すこしあかりて、"
"紫だちたる雲のほそくたなびきたる。"

// ■上記記述は、以下のように表示します
// "春はあけぼの。"
// "やうやうしろくなりゆく山ぎは、すこしあかりて、"
// "紫だちたる雲のほそくたなびきたる。"
}}}
なお、メッセージウィンドウのサイズには制限があるため、次の項で説明する「改ページ」を適切に入れる必要があります。

=== 改ページ
メッセージ末尾に「¥」を指定することで、改ページすることができます。そして改ページ記号の位置で、キーの入力待ちをします。
{{{ code c
"春はあけぼの。"
"やうやうしろくなりゆく山ぎは、すこしあかりて、"
"紫だちたる雲のほそくたなびきたる。¥"
"夏は夜。月のころはさらなり、"
"闇もなほ、蛍のおほく飛びちがひたる。¥"
"また、ただ一つ二つなど、"
"ほのかにうち光りて行くもをかし。¥"
"雨など降るもをかし。¥"

// ■上記記述は、以下のように表示します
// "春はあけぼの。"
// "やうやうしろくなりゆく山ぎは、すこしあかりて、"
// "紫だちたる雲のほそくたなびきたる。" // ←ここで改ページ待ち

// "夏は夜。月のころはさらなり、"
// "闇もなほ、蛍のおほく飛びちがひたる。" // ←ここで改ページ待ち

// "また、ただ一つ二つなど、"
// "ほのかにうち光りて行くもをかし。" // ←ここで改ページ待ち

// "雨など降るもをかし。" // ←ここで改ページ待ち
}}}

=== 改行のエスケープ
「"」によるメッセージ改行を回避するには、メッセージ末尾に「/」を指定します
{{{ code c
"春はあけぼの。/"
"やうやうしろくなりゆく山ぎは、すこしあかりて、"
"紫だちたる雲のほそくたなびきたる。"

// ■上記記述は、以下のように表示します
// "春はあけぼの。やうやうしろくなりゆく山ぎは、すこしあかりて、" // ←1行目を改行せずに2行目をつなげている
// "紫だちたる雲のほそくたなびきたる。"
}}}

=== 表示色
メッセージ開始の「"」の直後に「#」を指定することで、文字列の色を指定することができます。
書式は#rrggbbで指定します。値は先頭からR成分、G成分、B成分を16進数で指定します。
{{{ code c
"#ff0000このメッセージは赤色で表示されます。" // 赤色でメッセージを表示します
}}}

=== 表示ディレイ
メッセージ開始の「"」直後に「!d数字(ミリ秒)」を指定することで、1文字ごとのメッセージ表示速度にディレイをかけることができます。
{{{ code c
"!d1000このメッセージは、ゆっくり、ゆっくり、表示されます" // 1秒ごとに1文字ずつ表示する
}}}
=== 表示ウェイト
特定の位置だけウェイト(待ち)を入れたい場合には、「!w数値(ミリ秒)」を使用します
{{{ code c
"3秒待ちます。!w3000表示を再開します" // "3秒待ちます"、の表示3秒後に次にメッセージを表示します
}}}
=== 変数の表示
「$数字」により変数を表示することができます
{{{ code c
$100 = 250
"変数の中身を表示します。$100は250です"

// 上記記述は、以下のように表示されます
// "変数の中身を表示します。250は250です"
}}}
※変数の詳細については、変数の項目を参照

== 制御構造
=== if文
{{{ code python
if(式)
{
  文
}
}}}
「式」が真である場合「文」を実行します(式については論理式の項目を参照)
=== else文
{{{ code python
if(式)
{
  文1
}
else
{
  文2
}
}}}
「式」が真である場合「文1」を実行します。そして「式」が偽である場合「文2」を実行します。
=== elif文
{{{ code python
if(式1)
{
  文1
}
elif(式2)
{
  文2
}
}}}
「式1」が真の場合、「文1」を実行します。この場合、「式2」は評価せず、「文2」が実行されることはありません。[[BR]]
また「式1」が偽の場合、「式2」を評価します。そして「式2」が真であれば「文2」を実行します。「式2」が偽であれば、何も実行しません

== 四則演算
四則演算として以下のものが使用できます。
||'''演算子'''||'''演算方法'''||
||+|| 加算||
||−|| 減算||
||*|| 乗算||
||/|| 除算||
{{{ code c
$100 = 50 + 200 // 変数$100に、「50+200」の計算結果を代入します
}}}
※変数・代入については、変数の項目を参照してください

=== 演算の優先順位
'*'と'/'は、'+'と'−'よりも優先して演算を行います
{{{ code c
$100 = 2 + 3 * 4 // この計算結果は、20ではなく、14となります
}}}

=== 括弧による優先順位
'('と')'を使用することで、演算を優先して行うことができます
{{{ code c
$100 = (2 + 3) * 4 // この計算結果は、20となります
}}}

== 変数
「$」+「数値」による値を、変数(変更可能な値)として使用することができます。
=== 有効な値
有効な変数の範囲と値は以下のようになります。
||'''有効な変数の範囲'''||$0〜$999||
||'''有効値'''|| -2147483648 ~ +2147483647(4byte整数値)||
=== 変数への代入
「=」により変数へ値を代入することができます
{{{ code c
$100 = 20 // 変数$100に20を代入する
}}}

== 論理式
if文などの制御を行う場合、制御パラメータとして論理式を与える必要があります。(※if文については、「制御構造」の項目を参照)

=== 論理演算子一覧
論理式のための演算子としては、以下のものが使用できます
||'''演算子'''||'''真となる条件'''||'''例'''||
||==||左辺と右辺が同一である||100==100 → 真||
||!=||左辺と右辺が同一でない||100!=100 → 偽||
||<||左辺が右辺より小さい|| 50 < 100 → 真||
||<=||左辺が右辺以下|| 100 <= 100 → 真||
||>||左辺が右辺よりも大きい|| 100 > 50 → 真||
||>=||左辺が右辺以上|| 100 >= 100 → 真||
||!||論理演算結果が偽(演算結果を反転する)|| !(100 == 100) → 偽||
||&&||左辺が真かつ右辺が真||(100 == 100)&&(200 == 200) → 真||
||||||左辺が真または右辺が真||(100 == 100)||(200 == 100) → 真||

== ラベル
スクリプトの流れに分岐を作るために、ラベルの定義とラベルジャンプ(goto)を使用することができます。

=== ラベルの定義
行頭に「*」で開始する文字列を指定するとラベルとなります。
{{{ code python
*scene001
draw_bg(0)
draw_ch(100, c)
}}}
このラベル定義により、後述する「goto」命令を使用して実行位置のジャンプを行うことができます
=== ラベルジャンプ
goto命令により、ラベルジャンプを行うことができます。
{{{ code c
goto scene001
}}}
上記コードは、scene001ラベルにジャンプします。存在しないラベル名を指定した場合、コンバート時にエラーとなります。

== ファンクション

=== ファンクションの定義
「def」で開始するブロックはファンクションとなります。
{{{ code c
def scene002
{
  // ファンクションブロック
}
}}}
ファンクションブロックは、call命令以外では実行されることはありません。

=== ファンクションコール
call命令により、ファンクションコールをすることが可能です。
{{{ code c
call scene002
}}}
上記コードは、scene001ラベルをコールします。存在しないファンクション名を指定した場合、コンバート時にエラーとなります。
なお、呼び出したラベルのブロックを超えた場合には、call命令により呼び出した位置に戻ります。

=== return命令
call命令により呼びだされたラベル内で「return」命令を行うと、その時点で呼び出し元に戻ります
{{{ code c
def scene002
{
  if($1 == 5)
  {
    // $1 が 5 だったら処理を行わない
    return;
  }
  "$1は5ではありません\"
}
}}}

== スクリプトジャンプ
「load」命令を使用すると、実行中のスクリプトを変更することができます。
{{{ code c
load("scene2") // 現在のスクリプトを終了して、"scene2"を開始します 
}}}
goto / call 命令との違いは以下のようになります
 1. 対象スクリプトを#includeする必要はない
 2. 呼び出し元に戻ることはできない