- FRAXY Try script -

スクリプトの記述方法



ここではスクリプトの記述方法を説明します。
>> スクリプト記述のルール
>> コメント
>> 変数
>> 変数操作
>> 関数
>> 演算子
>> ラベル
>> プリプロセッサ命令
>> 命令文とパラメータ
>> ファイルの読み込み(検索優先順位)
>> 処理の流れ
>> メインスクリプトとサブスクリプト

スクリプト記述のルール
このスクリプトはマルチステートメント(一行に複数の内容を記述する事)に対応していません。
よって一行に一つだけ内容を記述することになります。
この内容とは命令文や変数操作、ラベルになります。

命令文の前やパラメータの間などには半角スペースやタブを挿入することができます。
区切りごとに段を形成すればスクリプトが見やすくなります。


コメント
行の最初に / や ; をつけるとコメント行になります。
また、命令文などの後に // や ; をつけると以降行末までがコメントになります。

"WAIT",10 ; ウェイトをかける
test+100 // testに100加算


変数
変数は値を保持したり計算するための入れ物です。
基本的に初期化は必要なく、変数に代入する時に変数の型やサイズが自動的に変更されます。
変数は以下の型があり、それぞれ保有できる値が違います。

int型整数値-2147486948 ~ 2147483647
double型実数値小数点含め約17桁まで
str型文字列65535文字まで

変数名は32文字までで以下の文字が使用できます。
ただし一文字目に数字は使用できず、大文字と小文字は区別されません。
また、関数と同じ名前の変数は使用できません。

a~z A~Z 0~9半角英数字
_アンダーバー

以下の変数は予め定義されています。
通常は各値の参照に使用してください。

_null用途無し
_statシステムが返す値
_cnt現在のループカウンタ、 0 からカウントされます
_timeタイマーの値
_winx現在のウインドウの横幅
_winy現在のウインドウの縦幅
_pxプレイヤーの絶対座標 X
_pyプレイヤーの絶対座標 Y
_pscore現在のスコア
_pleftプレイヤー残機
_penergyプレイヤーのエネルギー
_penergymaxプレイヤーのエネルギー最大値
_pstockプレイヤーのエネルギーストック
_pstockmaxプレイヤーのエネルギーストック最大値
_killcoreキルカウント(Core)の値
_killpartsキルカウント(Parts)の値
_global1グローバル変数1
_global2グローバル変数2
_global3グローバル変数3
_global4グローバル変数4
_global5グローバル変数5
_global6グローバル変数6
_global7グローバル変数7
_global8グローバル変数8

グローバル変数は全体で共有される特殊な変数です。
スクリプト内での制御だけでなく、敵のイベントからも制御することができます。
この変数をうまく使えば敵データだけでは実現できなかった事ができるようになります。
(敵が敵を呼び出す、攻撃パターンを敵ファイルごとに分割する等)


変数操作
変数操作は基本的に以下のような形で記述します。

対象変数演算子数値や数式
test=1
test=(abc+100)*5

変数操作の演算子は数式の演算子と動作が異なります。
以下が変数操作で使用できる演算子とその動作になります。

演算子意味
=代入test = 1// testに1を代入する
==代入test == 3// testに3を代入する
+加算test + 5// testに5を加算する
-減算test - 5// testから5を減算する
+=加算test += 5// testに5を加算する
-=減算test -= (3+2)// testから(3+2)を減算する

以下は変数操作で利用できる特殊な記述方法や演算子とその動作です。

+インクリメントtest +// testを1増やす // test+1
++インクリメントtest ++// testを1増やす
-デクリメントtest -// testを1減らす // test-1
--デクリメントtest --// testを1減らす
=リセットtest =// testを0にする // test=0
==リセットtest ==// testを0にする

加算(test+1)とインクリメント(test+,test++)は実行結果は同じですが
インクリメントは数式を無視するので少しだけ高速に処理されます。
test+1と記述した場合はインクリメント、test+(1)と記述した場合は加算に変換されます。
これらはデクリメント、リセットでも同様です。


関数
変数操作やパラメータなどの数式にはいくつかの関数が使用できます。
以下が使用できる関数とその動作になります。

関数名意味備考

sinsin値を返すtest = sin(40)入力値(int) : 0~4095
出力値(int) : -4096~4096

coscos値を返すtest = cos(40)入力値(int) : 0~4095
出力値(int) : -4096~4096

limit一定範囲内の整数を返すtest = limit(abc,-10,20)limit(対象値,最低値,最大値)
返される値の型は入力と同じになります。

abs絶対値を返すtest = abs(abc)返される値の型は入力と同じになります。

sqrt平方根を返すtest = sqrt(abc)返される値は実数値(double)になります。

rand乱数を生成するtest = rand(50)0~(n-1)の乱数を生成します。
値は整数値(int)になります。

int整数値に変換test = int("50")

double実数値に変換test = double(10)

str文字列に変換test = str(50)

strf数値文字列の変換test = strf("%f",20)strf("変換書式文字列",変換する値)
変換書式文字列はC言語のsprintfとほぼ同じですが指定できる値は一つだけになります。
書式に問題があるとエラーが発生するので注意してください。

getpathファイルパス文字列の変換test = getpath("file",8)getpath("変換する文字列",変換タイプ)
変換タイプ
&1 : 拡張子を除くファイル名
&2 : 拡張子のみ(.???)
&8 : ディレクトリ情報を取り除く
&16 : 文字列を小文字に変換する
&32 : ディレクトリ情報のみ

strlen文字列の長さ(byte)を返すtest = strlen(123)
test = strlen("abcde")
入力の型が整数や実数の場合は桁数を返します。
返される値は整数値(int)になります。
半角文字は1byte、全角文字は2byteで数えられます。

peek1byte読み出すtest = peek(12345,0)
test = peek("abcde",1)
peek(対象,読み出す位置)
入力の型は何でも構いません。
返される値は整数値(int)になります。

chr文字コードを変換test = chr(65) // A
test = chr(66) // B
test = chr(97) // a
chr(文字コード)
文字コードは 0~255 を指定してください。
返される値は文字列(str)になります。

getinfo情報を取得するtest = getinfo(2,0)
test = getinfo(3,0)
getinfo(タイプ,パラメータ)
タイプとパラメータは"GETINFO"と同じです。
詳細は getinfoの値 を参照してください。


演算子
このスクリプトの数式では以下の演算子が使用できます。
=,==,!,>,<,>=,<= は真=1、偽=0になります。

=同じ
==同じ
!同じでない
>
<未満
>=以上
<=以下
+足し算
-引き算
*掛け算
/割り算
%割り算の余り
&論理演算(and)
|論理演算(or)
^論理演算(xor)
<<左方向ビットシフト
>>右方向ビットシフト


ラベル
ラベルは"GOTO"や"GOSUB"でジャンプするための目印です。
ラベルを記述する場合は必ず一文字目に * を付けてください。 最大文字数は * を含めて63文字までになります。
また、ラベル指定は""で囲む必要がありますがラベル自体には付けてはいけません。

"GOSUB", "*TEST_LABEL"
"END"
*TEST_LABEL
// 飛び先の処理
"RETURN"

ラベル指定はノーマルラベルとマルチラベルの2種類があります。
飛び先が一つの場合はノーマルラベル、複数の場合はマルチラベルになります。

例えば、次の場合は飛び先が *TEST_LABEL だけなのでノーマルラベルです。
"GOSUB", "*TEST_LABEL"

次の場合は飛び先が複数考えられるためマルチラベルになります。
"GOSUB", "*TEST_LABEL"+abc
この場合、変数abcの値が0~2の範囲を取るならば
*TEST_LABEL0
*TEST_LABEL1
*TEST_LABEL2
のいずれかに飛ぶことになります。
もし飛び先のラベルが存在しない場合はジャンプが行われません。
例外として"TIMEREND"でマルチラベルが見つからない場合はエラーを返しトライの処理を停止します。


プリプロセッサ命令
プリプロセッサ命令はスクリプトの変換前に実行される特殊な命令です。
通常の命令と違い命令内容を表す文字列を""で囲まず、先頭に#をつけます。

#include "str1"



命令文とパラメータ
命令文は命令内容を表す最初の文字を以下のように""で囲って記述します。

"FRAXY_TRY","str1",int2
"PLAYERFLAG",int1,int2,int3

命令を表す最初の文字列は大文字でも小文字でも構いません。
例えば "PLAYERFLAG" は "playerflag" や "PlayerFlag" と記述しても認識されます。
ただし例外として "FRAXY_TRY" だけは全て大文字で記述してください。

最初の文字列以降の内容はパラメータの指定になります。
パラメータはいくつかの型があり、型によって記述方法が異なります。
パラメータには以下の型があります。

int 整数値

str 文字列

var 変数

label ラベル


パラメータを省略した場合は基本的に以下の値が自動で代入されます。

int0
str""
var_stat
label""

例外として一部のパラメータは省略すると定義値が自動で代入されます。
定義値がある場合はパラメータの説明欄に[-1]や[SizeX/2]、[ignore]のように記述されています。
[ignore]と記述されているパラメータを省略するとそのパラメータを適用せず無視します。


ファイルの読み込み(検索優先順位)
ファイルを読み込む場合、
その*.ftdがあるフォルダ、対応するデフォルトフォルダの順番に検索します。
見つからなかった場合は読み込まれません。

指定するファイル名は相対パスでフォルダ情報を加えることもできます。
例えば
fraxy/try/sample/test.ftd
から
fraxy/try/sample/data/enemy.fed
を読み込む場合は
"data/enemy.fed"
と指定します。


処理の流れ
上から一行ずつ順番に実行します。
基本的にトライの処理は連続して実行しますが、Break属性を持つ命令を実行するとトライの処理を停止してゲームの処理に戻ります。
以下の命令はBreak属性を持っています。

"END"
"LIMIT"
"WAIT"
"BGMSTOP"
"SESTOP"
"CHOICES"
"GAMEOVER"

フリーズや無限ループ対策として1フレームに連続して実行できる回数が1024回に制限されています。
ゲームの処理に戻らずトライの処理を実行し続けるのは動作が遅くなるため推奨しません。


メインスクリプトとサブスクリプト
このスクリプトはメインスクリプトとサブスクリプトに分類されます。
"FRAXY_TRY"によって開始されたスクリプトはメインスクリプト、
"ADDSUBSCRIPT"によって開始されたスクリプトはサブスクリプトになります。
スクリプト仕様などは基本的に大きな違いはありません。

メインスクリプトはID=0として定義され、"DELSUBSCRIPT"で削除することができません。
サブスクリプトはIDが自動的に割り振られます。
登録できるサブスクリプトの最大数は15個までなのでIDは1〜15になります。
登録を削除して空いたIDは再利用されますがソートは行われません。
例えばID0,1,2,3を使用していて1を削除、ID0,2,3となった状態で"ADDSUBSCRIPT"を実行するとID1に追加されます。
処理の実行はID順に行われるため登録する順番に注意してください。

"LIMIT"と"WAIT"による停止はメインスクリプトとサブスクリプトでそれぞれ個別に管理しています。
メインスクリプトが停止中でもサブスクリプトは実行されるため独自のシステムを組み込みたい場合に有効です。

基本的に上記以外の要素はメインスクリプトと全てのサブスクリプトで共有します。
例えば、サブスクリプトで"CHOICES"を使用するとメインスクリプトも停止することになります。
変数やオブジェクトも共有するため、"CREATEOBJECT"などを使用するサブスクリプトを重複登録する場合は注意してください。

サブスクリプトはラベルが開始点になるため、以下のような構造のスクリプトが作れます。

// サブスクリプトをループさせ1フレーム毎に処理を実行する
"ADDSUBSCRIPT","*sub1",sub1_id
...
*sub1
// ここに処理を書く
"WAIT",0
"GOTO","*sub1"

// 処理を1回だけ実行し登録を削除する
"ADDSUBSCRIPT","*sub1",sub1_id
...
*sub1
// ここに処理を書く
"DELSUBSCRIPT",-1