変数の基本

Date:

変数の基本を押さえておきたいと思います。
一本道なので、変数なんて使わないという場合でも、設定に変数が使用されていますので、オート読み進みモードにしたい、スキップモードにしたい、といった場合には変数操作を行う必要があります。
また、キャラの表示位置を変数で指定しておくと後から変更を加える場合に楽になるというようなこともあります。

変数と定数

どちらも、何かを覚えておくための物です。
変数は何度でも入れ替えができるもの、定数は決まった値を参照するための物です。
「数」となっていますが、数字だけでなく、文字列もtrue, falseも覚えておくことができます。

定数は変数の特殊な場合ですので、とりあえずはすべて変数として扱えば問題ありません。
当サイトでも基本的に定数の扱いの場合でも変数という言葉を使います。本業の方には「そんなの気持ち悪い」と思われるかもしれませんが、脳内で変換をお願いいたします。

変数の種類

基本の3つ + 1つの4種類があります。ここでは、基本の3つについて説明します。

一時変数
ゲームを終了するまでだけの雑用変数です。
繰り返し処理の回数のカウントなどに使用します。
ゲーム起動時にはすべて消去されていますので、毎回初期化が必要です。
セーブ、ロードの影響を受けません。

セーブ変数
セーブデータ毎に保存される変数です。
ゲーム終了時に消えますが、セーブデータを読み込むことで復活します。

システム変数
セーブデータに関係なく、ゲームを終了しても保存される変数です。

変数の動き

簡単に変数の動きを紹介します。

システム変数にsys1、セーブ変数にsave1、一時変数にtmp1を入れた状態で、[recoad_place][save place=1]でセーブ。
その後、システム変数にsys2、セーブ変数にsave2、一時変数にtmp2を入れます。

ここで、[load place=1]で先ほどのセーブデータを読み込みます。
システム変数はセーブに関係なく保存されますので、sys2のままです。
セーブ変数はセーブされたデータを読み込みますので、セーブ時点のsave1に戻ります。
一時変数はセーブ&ロードの影響を受けませんので、tmp2です。

次に一旦再起動します。
システム変数はゲームを終了しても保存されますので、sys2が残っています。
セーブ変数はセーブデータにしか残りませんので、無い状態です。
一時変数は保存されませんので、無い状態です。

もう一度[load place=1]でセーブデータを読み込みます。
システム変数はセーブに関係なく保存されますので、sys2のままです。
セーブ変数はセーブされたデータを読み込みますので、セーブ時点のsave1が復活します。
一時変数はセーブ&ロードの影響を受けませんので、無い状態のままです。

変数に代入、変数参照

代入

変数に代入するには、[let]タグもしくは&計算を使用します。&計算は文法の項を参照ください。
name=:変数の名前
text=:代入する値
cast=:代入するタイプ(未指定時は自動。数字優先)

変数の名前に使用できる文字に特に指定はありませんが、+-*/\%=!<>のような計算に使用する記号、[]#{}$'":という他の意味に解釈できる文字は使わないのが無難です。
○-△のようにしたい場合は○_△とアンダーバーを使用すると良いと思います。

名前の付け方
まずは変数の種類を指定します。システム変数の場合はsys:、セーブ変数の場合はsave:、一時変数の場合はtmp:の記述をします。ただし、一時変数の場合は指定の省略が可能です。
その後、const.を入れることで定数として扱うことができます。入れなければ通常の変数として扱われます。
自分で変数を作る際は入れることは少ないかと思いますが、組み込み定数はconst.が使われています。const.で始まる場合は、操作できない変数です。

cast
代入するタイプは5種類あります。
num:数字。無指定の場合はこちらが優先されます。
int:整数。
uint:正の整数。
bool:trueかfalse
str:文字列

例えば、「01.3」を代入する場合、numの場合は「1.3」、intuintの場合は「1」、boolの場合は「true」、strの場合は「01.3」となります。
intuintは最大値が異なります。大きな数を扱おうとして、変な動作に感じた場合はその点も考えてみてください。

参照

タグで値を指定する時に、&で始めると計算式で指定することができます。
この時、変数の名前を指定すると、その内容を参照します。
変数名に計算記号が入っていますと、ここで思わぬ動作になる場合があります。
「&a-b」の場合、「a-b」という変数の値を参照するのか、「a」の値から「b」の値を引いた値なのかの判別ができませんので。

もうひとつ。

AIRNovel:

  1. [let name=test text=01 cast=str]
  2. [ch text=&test]

この場合、[ch]では「01」ではなく、「1」となります。
testという変数にはきちんと「01」では入っているのですが、読み出す時もできるだけ数字として扱うルールが有効になっているためです。
このような場合は、変数名の後に@strをつけることで、文字列として読み出すことができるようになります。
それを踏まえて、書き直すと次のようになります。

AIRNovel:

  1. [let name=test text=01 cast=str]
  2. [ch text=&test@str]

配列のように扱う

AIRNovelにはきちんとした配列はないのですが、変数名に変数を使用することができますので、それを利用して配列のように扱うことができます。

基本ルール(変数aには12が入っているとします。)
次の変数名はすべて同じものとして扱われます。
test.a12
test['a12']
test['a'+a]
test['a#{a}']
test['a$a']

この性質を利用して、配列のように扱います。
代入時は、変数名に「.」を入れておきます。これが、切れ目の目安になります。
参照時は手前の「.」を外して一区画を[]で囲みます。[]で囲むことで、その中だけで計算を行った結果になります。

例えば、test.0に0、test.1に1…、test.10に10を入れ、その後それぞれに1を足す場合、次のように表現することができます。

AIRNovel:

  1. [let name=text=0]
  2. *loop
  3. [let name="&'test.'+i" text=&i]
  4. [let name=text="&i+1"]
  5. [jump label=*loop]
  6. [let name=text=0]
  7. *loop2
  8. [let name="&'test.'+i" text="&test[i]+1"]
  9. [let name=text="&i+1"]
  10. [jump label=*loop]

name="&test[i]"のようにしますと、例えばtest.1の中身の名前の変数1に代入されることになります。

[]を利用して変数を指定する場合には、""で指定全体を囲んでおきます。
タグの[]ではないとはっきりとさせるためです。