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

= スクリプト文法
[[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
$1 = 0
Label_Loop:
$1 += 1
if($1 < 5)
{
  goto Label_Loop
}
}}}
上記コードは、変数"$1"が5を超えるまで、Label_Loopラベルにジャンプし続けます。
なお、存在しないラベル名を指定した場合、コンバート時に未定義エラーとなります。

== ファンクション

=== ファンクションの定義
「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. 呼び出し元に戻ることはできない

== 選択肢
選択肢により分岐を行う場合は、「select」命令を使用します。
{{{ code c
select("問題文")
{"選択肢1"
  // 選択肢1を選んだ場合、このブロックの処理を行う。
}
{"選択肢2"
  // 選択肢2を選んだ場合、このブロックの処理を行う。
}
{"選択肢3"
  // 選択肢3を選んだ場合、このブロックの処理を行う。
}
}}}
例えば、選択肢1を選んだ場合、選択肢1のブロックを実行を実行します。
そして選択肢1のブロックの末尾に達すると、この全ての選択肢ブロックの終端にジャンプします。
(選択肢2/選択肢3のブロックは実行されません)

=== 問題文の複数行表示
{{{ code c
select("問題文1行目"
"問題文2行目"
"問題文3行目"
)
{"選択肢1"
}
{"選択肢2"
}
}}}
という記述をすることで問題文を複数行表示することができます。[[BR]]
もしくは、
{{{ code c
select("問題文1行目" "問題文2行目" "問題文3行目")
{"選択肢1"
}
{"選択肢2"
{
}
}}}
というようにスペース区切りで1行にまとめて定義することが可能です。

== コメント
スクリプトの補足説明をするために、変数やラベルの開始部分などにコメントを入れることができます。コメントを開始する部分に「//」を入れると、以降の文字列は行末までコメントとみなし、実行しません
{{{ code c
// 学校の背景を描画します。 ←コメントとして扱い、実行しない
draw_bg(30)
}}}

また「/*」から「*/」までの間はコメントブロックとなります。
{{{ code c
/*
 ここの間はコメントとなり
 表示されません
 */
}}}

== 乱数
乱数を使うと、ランダムな値を取得できるため、それを使ってランダムにイベントを発生させたりすることができます。
書式は以下のようになります。
{{{
rand(開始値,  終了値)
開始値〜終了値の範囲で、乱数を発生します
}}}
{{{ code c
$1 = rand(0, 99)
if($1 < 30)
{
  // 30%の確率でこちらのブロックが実行されます
}
else
{
  // 70%の確率でこちらのブロックが実行されます
}
}}}

== 描画命令
=== 描画命令一覧
||'''命令'''||'''説明'''||'''構文'''||'''引数'''||
||draw_bg|| 背景の描画|| draw_bg(id, effectId) ||・id : 画像ID or 色(#rrggbb 単色による塗りつぶし)[[BR]]・effectId : エフェクトID (省略時はEF_NORMAL)||
||erase_bg|| 背景の消去|| erase_bg(effectId) ||・effectId : エフェクトID (省略時はEF_NORMAL)||
||draw_ch|| キャラの描画|| draw_ch(id, pos, effectId) ||・id : 画像ID or 色(#rrggbb 単色による塗りつぶし)[[BR]]・pos : 立ち位置 ("c:"中心 "l":左 "r":右)[[BR]]・effectId : エフェクトID (省略時はEF_NORMAL)||
||draw_ch_pos|| キャラの描画 (座標指定・左上)|| draw_ch_pos(id, posX, posY, effectId)||・id : 画像ID or 色(#rrggbb 単色による塗りつぶし)[[BR]]・posX : スクリーン座標(X)[[BR]]・posY : スクリーン座標(Y)[[BR]]・effectId : エフェクトID (省略時はEF_NORMAL)||
||erase_ch|| キャラの消去|| erase_ch(pos, effectId) ||・pos : 立ち位置 ("c:"中心 "l":左 "r":右)[[BR]]・effectId : エフェクトID (省略時はEF_NORMAL)||
=== エフェクトID一覧
描画命令 (draw_bg / draw_chなど) に指定可能なエフェクトIDの一覧は以下のものとなります。
||'''ID'''||'''説明'''||
||EF_NORMAL||瞬間表示||
||EF_SCROLL_L||左スクロール||
||EF_SCROLL_R||右スクロール||
||EF_SCROLL_U||上スクロール||
||EF_SCROLL_D||下スクロール||
||EF_SHUTTER_L||左シャッター||
||EF_SHUTTER_R||右シャッター||
||EF_SHUTTER_U||上シャッター||
||EF_SHUTTER_D||下シャッター||
||EF_ALPHA||半透明||
||EF_GRAY||グレースケール||
||EF_SEPIA||セピア||
||EF_NEGA||反転||

== 画面演出
||'''命令'''||'''説明'''||'''構文'''||'''引数'''||
||shake|| 画面を揺らす|| shake(ms, amp)||・ms : 揺れ時間 (ミリ秒)[[BR]]・amp (開始揺れ幅)||

== サウンド命令
=== サウンド命令一覧
||'''命令'''||'''説明'''||'''構文'''||'''引数'''||
||play_bgm|| BGMの再生||play_bgm(id, loop, fade) ||・id :サウンドID[[BR]]・loop :ループ回数。省略時は0で無限ループ再生 [[BR]]・fade :フェードイン時間(ミリ秒)。省略時は0でフェードなしで再生||
||stop_bgm|| BGMの停止||stop_bgm(fade) ||・fade :フェードアウト時間(ミリ秒)。省略時は0でフェードなしで停止||
|| play_se ||  SEの再生|| play_se(id, loop)||・id :サウンドID[[BR]]・loop :ループ回数。省略時は1で1回のみ再生する。0で無限ループ再生||
|| stop_se || SEの停止|| stop_se(id)||・id :サウンドID||

== セーブ命令
save 命令を使用すると以下の情報が保存されます。
 * 実行中のスクリプト名
 * プログラム・カウンタ
 * 描画している背景画像番号
 * 描画しているキャラ画像番号
 * 再生しているBGM番号
 * 再生しているSE(ループのみ)
 * 変数の値
 * 実行スタック
 * コールスタック