变数嘛…


 KAG 中所谓的变数其实就是、

・记录某些数据的东西

 而已。

 但是呢、KAG 因为是基于 TJS2 这一脚本语言的系统、KAG 的变数实际上继承了 TJS2 变数的功能,可以发挥很强大的作用。(译注:口胡,给我一个能保存的数据类再说……)

 这个初级教程只讲了些基本的用法、像 KAG 内部的方法、属性之类的操作、使用吉里吉里本体功能之类的没有详细说、完全是一片泥沼的状态、容易掉坑的请注意(笑)。

变数的种类

 KAG 变数的种类一共有 3 种。随着游戏档案存取的普通的「游戏变数」と、和游戏档案的存取无关的、可以一直被记录的「系统变数」、临时记录用的「临时变数」。「系统变数」在吉里吉里/KAG 程序关闭之后、再执行这个游戏的话,内容依然保留。「临时变数」在关闭游戏后即自动清除、也不会被游戏存档记录。

 游戏变数以 f 、系统变数以 sf 、临时变数以 tf 作为名字的开头。

 此外、KAG ( 其实也就是 TJS2 ) 的变数、可以记录文字列或者数值 ( 文字列数值一类的、变数中记录的内容种类即是所谓的「类型」 )。变数的命名相当自由,变数的个数没有限制。存储的文字列没有长度限制,数值的话也支持实数等等。
 KAG 3.x 之后「数组」和「字典」也可以使用了 ( 在这个文档里没有说明 )。

Note
 TJS2 的整数型为 64bit、实数型为 double ( 双精度 ) 。
 文字列支持以0为终结符的 UNICODE 文字列、没有长度限制。

变数命名的规定

 吉里吉里 / KAG 中、变数的命名是相当自由的。但是、再怎么自由,吉里吉里 / KAG 可以使用的变数名字还是有一定规则的。

变数名可以使用半角英数和全角文字、_ (下划线)
 abc&def 或者、a-z 像这样的变数名不能用。
 final_count 像这样含有下划线、主人公的名字 这样使用全角文字都是可以的(全角記号也全部可以用于给变数明明)。
不过要注意 变数名不能以半角数字开头
 2friends 或者 3com 像这样的变数名不能用 ( 全角数字开头的话就 OK )。

 这些变数名的前面、游戏变数的话就加上 f. を、系统变数的话就加上 sf. 、临时变数则加上 tf.
 例如、以下这些变数名。

f.flag1 sf.username sf.playcount tf.i f.enokazu f.变数その1 ...

 此外、第一次使用变数(等于是变数刚创建的时候),变数的内容默认为 0 、对文字列来说就是 '' ( 空文字列 ) 、这是有点特殊的状态。一般情况下、第一次使用这个变数的时候,请给变数赋一个值比较好。


Note
 f 或者 sf 或者 tf 之外还有 kag 开头的变数、kag 开头的变数,可以对 KAG 的系统内部一些数值进行操作(比如说kag.fullsreen,代表窗口是否处在全屏状态)。

变数的代入

 要对变数赋値、通常使用 eval 指令。例如、想把 1000 代入变数 f.flag1 的话・・・

[eval exp="f.flag1 = 1000"]

 就像以上这样。也就是、变数名之后写上 = (等号)、之后写上想要代入的数值。

 想要代入文字的话、

[eval exp="f.变数之1 = '文字列'"]

 则是像以上这样。也就是、 = 之后要使用 '' 把想代入的文字列括起来 ( 请注意单引号和双引号的差别哦 )。
 没有文字列用的变数、数值用变数这样的差别、变数类型会随着值的类型变化而自动改变。

 给一个变数赋其他变数的值、

[eval exp="f.flag1 = f.flag2"]


则是像以上这样写。

变数的演算


 想要对某些变数进行计算的情况、

[eval exp="f.flag1 = f.flag1 + 1"]

 也是一样的。在这个例子中、会将 f.flag1 加 1 后的值代入 f.flag1 ( 也就是相当于 f.flag1 的值加上了 1 )。
 exp 属性就是用来书写 TJS2 相关的「」的。
 TJS 式中、*(乘) /(除) +(加) -(减) 之类的 演算子照常规使用 ( 和数学式一样,有计算的优先顺序,例如乘除优先于加减 )。在式子中也可以使用 ( ) 括号。
 例如、

[eval exp="f.flag1 = f.flag1 + f.flag2 * f.flag3"]

 这样的话、f.flag2 和 f.flag3 的乘积加上 f.flag1 的和将被代入 f.flag1 。

 除法计算的话则是使用 / (斜线) 符号。

[eval exp="f.flag1 = f.flag2 / f.flag3"]

 以上的例子 f.flag2 除以 f.flag3 的商将被代入 f.flag1 。
 但是、除不尽的情况下, f.flag1 的值将会是实数、假如想要获得整数值的话、请使用整数除算演算子 \ 、

[eval exp="f.flag1 = f.flag2 \ f.flag3"]

 写成以上这样。


 此外、文字列之间的计算,也可以使用 + 演算子。


[eval exp="f.flag2 = 'hoge'"]
[eval exp="f.flag3 = 'une'"]
[eval exp="f.flag1= f.flag2 + f.flag3"]

 像上面的例子、 f.flag1 的值将会是 'hogeune' 。


Note
 TJS2 的语法是参考 JavaScript (ECMAScript) 设计的、这些方面非常相似 ( 但并不是完全相同 )。
 通常的算术演算动作等等是基本相同的。文字列之间的计算或者文字列和数值的混合计算也基本相同。

文字列和数值

 KAG 的变数、并不会有文字列类、数值类的强制区别,变数一旦建立,名字也不会改变。
 当把文字列赋给变数时,就成为保存文字列用的变数、把数值赋给变数时,就成为保存数值用的变数。
 最麻烦的是进行混用的时候。比如说,+ 这个符号就有了很多很多的意义(^^;

 文字列与文字列和并会使用到 + 演算子、数值的加法也会使用到 + 演算子、文字列和数值混合计算的场合、如果参与计算的其中一个是文字列、那么其他的数值也会被自动转换成文字列。

 例如、f.flag2 内记录的是 'hoge' 这个文字列、f.flag3 则记录着 10 这个数值、

[eval exp="f.flag1 = f.flag2 + f.flag2"]

 那么、f.flag1 里记录的会是 'hoge10' 这个文字列。

 此外、如果无论如何都希望把文字列转为数值的话,也是有办法的。例如使用 [input] 指令让玩家输入数字、这种情况下也是使用 + 演算子。把+ 演算子放在想转换成数值的内容之前。例如、f.flag1 中记录着 '20' 这个文字列、


[eval exp="f.flag1 = +f.flag1"]


 这么写的话、f.flag1 的内容就会转换为数值、再次记入 f.flag1 中。f.flag1 现在记录的就是数值型的 20 。


Note
 + 演算子连写的情况也必须注意。想把 f.flag3 变为数值型,并和 f.flag2 相加的话、写成 f.flag2++f.flag3 这种形式是会出错的 (因为 ++ 是另外一个演算子 )。请在加号间空一格,写成 f.flag2+ +f.flag3 的形式。


Note
 单个的 + 演算子 ( 如之前举例的 f.flag1 = +f.flag1 例子中的 + ) 、文字列内如果有着小数点 ( 0.3 之类 ) 的话、结果会转换成实数。想要结果变为整数 ( 小数点以下舍去 )、写成 int + 的话就 OK 了。还是以之前的例子示范、就是写成 f.flag1 = int +f.flag1 这样。

变数的删除・其他

 想要删除变数的话就使用 delete 来进行。delete 变数名 这么写的话就可以把变数删除。
 例如、想要删除 f.flag1 的话、

[eval exp="delete f.flag1"]

 就写成这样。

 此外、使用 clearvar 指令的话、可以把所有游戏变数(f.开头的变数)全部删除。

 此外、TJS2 中还可以使用一些其他演算子, math 对象,三角函数等等相关的计算 ( 也不知道是不是有用呢 ) 。详细的说明请看吉里吉里 SDK 的 TJS2 说明文档。

 使用 , (逗号)的话,可以在一个 eval 指令内写入多个计算式。
比如说、

[eval exp="f.first=true"]
[eval exp="f.flag0=0"]
[eval exp="f.flag1=0"]

 这三个式子、可以简写成以下的样子。

[eval exp="f.first=true, f.flag0=0, f.flag1=0"]


 此外、使用 iscript 指令、可以代替连续的 eval 指令,让格式变得简单。

 例如、还是之前的三个式子、


[iscript]
f.first=true;
f.flag0=0;
f.flag1=0;
[endscript]


 可以写成以上这样。各式的后面,请千万不要忘记写上 ; ( 分号 ) 哦。
 像这样使用 , (逗号) 或者 iscript 来书写代码,效率会提高很多。

显示变数的内容

 想要在剧本中表示变数的内容、请使用 emb 指令。
 例如说、像以下这样。

[wait time=200]
*start
[cm]
[eval exp="f.数值=200"][eval exp="f.mojiretu='文字列'"]
f.数值 的内容 : [emb exp="f.数值"][l][r]
f.mojiretu 的内容 : [emb exp="f.mojiretu"][l][r]


 执行起来的话,游戏画面上会显示出:

f.数值 的内容 : 200
f.mojiretu 的内容 : 文字列

 这样的对话。

实体(entity)

 所谓的实体(entity)是指、以变数的内容、替换其他指令的属性值的功能。
 书写格式是、属性名 = & 变数名。

[wait time=200]
*start
[cm]
[eval exp="f.fontsize=60"]
[font size="&f.fontsize"]这是60号的文字[resetfont]


 这种情况下、f.fontsize 里记录的 60 这个值、就成为了 font 指令的 size 属性值。

 实体的本质是:对 & 之后的部分进行计算,并将计算结果作为属性值。也就是说、& 的后面,除了变数名以外,也可以写入 TJS 式。

条件判断

 要判断变数和某个值是否相同,可以使用以下的演算子。

a==b    a 和 b 相等的情况下为真(true)
a!=b    a 和 b 不相等的情况下为真(true)
a<b     a 小于 b 的情况下为真(true)
a>b     a 大于 b 的情况下为真(true)


 此外也可以使用 >= や <= (大于等于、小于等于) 。
 像这样的条件判断,主要是用在 if 指令中的。

 if 指令是、如果 exp 属性的值为 真(true) ,就执行从if 到 endif 中间的剧本段内容。


[if exp="f.flag1==2"]f.flag1 的值是 2 [endif]
[if exp="f.flag1!=2"]f.flag1 的值不是 2 [endif]


 变数的用途非常广泛,拥有很强大的功能。