- FRAXY Try script -

スクリプトの構成とサンプル



ここではトライの作り方やスクリプトの構成方法を説明します。

プレイヤー設定
プリプロセッサ命令



トライの作成に必要なもの
・適当なテキストエディタ

専用のエディタなどはありません。
テキストエディタで必要最低限の内容を記述し、拡張子を*.ftdにすればトライとして認識されるようになります。


初期設定に関して
初期状態では以下のような設定になっています。

・全方向
・スクリーン(ウインドウ)サイズはプログラム起動時の設定が使用される
・プレイヤーはトライ開始直後に生成される
・プレイヤーのタイプや装備はフリープレイの設定が使用される
・その他背景などの設定もフリープレイの設定が使用される

縦や横スクロール風にしたり、オープニングなどの演出を加えたい場合は
各種命令を使って設定を変更する必要があります。


Hello world!
まずはお約束のこんにちは世界から。
実行すると画面左上に文字が表示されると同時にトライが終了します。

"FRAXY_TRY", "Try Sample", 0
"MESSAGE", "Hello world!"
"END"
1行目の "FRAXY_TRY" はトライを宣言するための重要な命令です。
この命令によりトライとして認識されるようになります。
必ず最初に記述してください。
パラメータとして指定されている 0 は初期設定オプションです。
今回は特に指定することが無いので 0 としています。

"MESSAGE" は文字を画面左上のシステムメッセージ欄に表示します。
手軽なため、頻繁に使う命令です。

最後の "END" はトライを終了します。
トライは必ずこの命令か "GAMEOVER" で終了するようにしてください。


スクリプトの基本
スクリプトは1行目から順番に実行されます。

以下はサンプルを見てください。
敵を1機生成し、それが破壊されると終了します。

"FRAXY_TRY", "Try Sample", 0
"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"LIMIT", 0, 0
"END"
"LIMIT" は敵やパーツの数によってスクリプトの実行を停止します。
パラメータは敵の数とパーツの数です。

敵の数はコアとして認識されているパーツの数です。
敵が分離するとコアの数が変化するので注意してください。

パーツの数は存在している全てのパーツの合計です。

このサンプルではどちらも 0 が指定されているので
敵が1機以上、もしくはパーツが1つ以上存在している場合、"LIMIT" の行で処理が停止することになります。

これらの値に -1 を指定するとそのパラメータは無視されます。
例えば "LIMIT", -1, 0 と記述した場合、
パーツが1つ以上存在している場合に "LIMIT" の行で処理が停止することになり、敵の数は無視されます。


Break属性について
上のサンプルでは "LIMIT" を使ってスクリプトを制御していました。
"LIMIT" はBreak属性を持っていて、スクリプトを制御する上でとても重要になります。

トライはゲーム処理とスクリプト処理を交互に行います。
Break属性はスクリプト処理を中断してゲーム処理に実行権を移すことを意味します。

上のサンプルは別の方法でも同様の事が可能です。
まずは "WAITFOR" を使ったサンプルです。

"FRAXY_TRY", "Try Sample", 0
"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"WAITFOR", ((getinfo(50,0) = 0) & (getinfo(51,0) = 0)), 0
"END"
"WAITFOR" はBreak属性を持ち、値を評価します。
値が真ならばBreakも停止もせずに次の行に移行します。
値が偽ならばBreakし、任意のフレームの間だけ処理を停止します。

ここでは getinfo(50,0) と getinfo(51,0) のどちらも 0 の場合に真になるようにしています。
getinfo(50,0) は敵(コア)の数、getinfo(51,0) はパーツの数を返す関数です。

"LIMIT" は敵の数とパーツの数による判定で、待ち時間は 0 で固定されていますが、
"WAITFOR" は任意の値や式で判定し、待ち時間も自由に指定できます。


"REPEAT"の使い方
"REPEAT" は任意の回数だけ処理を繰り返します。
この命令でも上のサンプルと同様の処理が実現できます。
"LIMIT" と比較すると行数が大幅に増えて面倒に思えますが、
ループの中で変数操作や他の命令を加える事でより複雑な処理も実現できます。

"FRAXY_TRY", "Try Sample", 0
"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"REPEAT", -1
	"IF", ((getinfo(50,0) = 0) & (getinfo(51,0) = 0))
		"EXITLOOP"
	"ENDIF"
	"WAIT", 0
"LOOP"
"END"
"REPEAT" は必ず "LOOP" と対で記述してください。

ここではループ回数に -1 を指定して無現ループにしています。
無限ループの中で getinfo(50,0) と getinfo(51,0) の値を監視し、
どちらも 0 になった場合に "EXITLOOP" で無限ループから脱出します。

"WAIT" はBreak属性を持ち、任意のフレームの間だけスクリプトの処理を停止します。
このスクリプトで "WAIT" を入れ忘れた場合、
Break属性の無い命令のみで無限ループを実行する事になり、理論上ではハングアップすることになります。
対策として1フレームで実行できる命令の回数が1024回までに制限されているためハングアップすることはありませんが、
非常に動作が遅くなるため注意してください。


"CONTINUE"の使い方
"CONTINUE" はループ内で使用する命令で、
任意の位置でループカウンタを加算しループの開始位置に戻ります。
ループ回数が残っていない場合は終了位置にジャンプします。

"FRAXY_TRY", "Try Sample", 0
"REPEAT", 5
	a++
	"IF", (a ! 3)
		"CONTINUE"
	"ENDIF"
	"MESSAGE", "a = 3"
"LOOP"
"WAIT", 120
"END"


"REPEAT"を使って複数の敵を生成する
例えば敵を複数生成したい場合、一つ一つ記述するのは効率的ではありません。
規則性があるならば "REPEAT" を使って簡単に生成できます。

"FRAXY_TRY", "Try Sample", 0
"CREATE", "starfish.fed", 2048, -1024, 150, 0, 1
"CREATE", "starfish.fed", 2048,  -512, 150, 0, 1
"CREATE", "starfish.fed", 2048,     0, 150, 0, 1
"CREATE", "starfish.fed", 2048,   512, 150, 0, 1
"CREATE", "starfish.fed", 2048,  1024, 150, 0, 1
"LIMIT", 0, 0
"END"


"FRAXY_TRY", "Try Sample", 0
"REPEAT", 5
	"CREATE", "starfish.fed", 2048, -1024+_cnt*512, 150, 0, 1
"LOOP"
"LIMIT", 0, 0
"END"
"REPEAT" を使用している方で _cnt というシステム変数を使用しています。
これはループカウンタで現在実行中の "REPEAT" のループした回数が代入されています。
ループ回数は 0 からカウントされます。

ループカウンタはループごとに値を保持しているため、多重ループの場合は現在実行中のループのカウンタを参照します。

"FRAXY_TRY", "Try Sample", 0
"REPEAT", 5
	x = _cnt
	"REPEAT", 5
		y = _cnt
		"MESSAGE", "x,y = "+x+","+y
		"WAIT", 80
	"LOOP"
"LOOP"
"END"


"GOTO"の使い方
"GOTO" は任意のラベルの行にジャンプします。
これは単純なプログラムジャンプです。

"FRAXY_TRY", "Try Sample", 0
"GOTO", "*LABEL1"
"MESSAGE", "このメッセージは飛ばされる"
*LABEL1
"MESSAGE", "終わり"
"END"
"GOTO" は "REPEAT" と同じようにループ構造を作ることができます。
この場合、"EXITLOOP" は使えないので "GOTO" を使って抜け出す事になります。

"FRAXY_TRY", "Try Sample", 0
*LABEL1
	"WAIT", 0
	x++
	"IF", x = 200
		"GOTO", "*LABEL2"
	"ENDIF"
"GOTO", "*LABEL1"
*LABEL2
"END"
注意しなくてはならないのは "REPEAT" のループ内や "GOSUB" のサブルーチンから "GOTO" で抜けだしてはいけないという点です。
"REPEAT" はシステムにループの基点情報を書き込み、 "LOOP" や "EXITLOOP" でその情報を消去しています。
"GOSUB" も "RETURN" で情報を消去しています。
"GOTO" で抜けてしまった場合はその情報が消去されずシステム内に溜まり続けてエラーを引き起こします。

"FRAXY_TRY", "Try Sample", 0
*LABEL3
"REPEAT", -1
	"WAIT", 0
	x++
	"GOTO", "*LABEL2"	// "EXITLOOP" を使わなければならない
"LOOP"
*LABEL2
"IF", x < 100
	"GOTO", "*LABEL3"
"ENDIF"
"END"


"GOSUB"とサブルーチンの使い方
"GOSUB" は任意のラベルの行にジャンプします。
"GOTO" との違いはジャンプする前の位置をシステムに保持する点です。
そのため "RETURN" で元の位置に戻る事ができ、そして "RETURN" で戻らなければならないという事でもあります。

"GOSUB" の飛び先のラベルから "RETURN" までのコードをサブルーチンと呼びます。
注意点は "REPEAT" と同様、サブルーチン内から "GOTO" で抜け出してはいけません。

"FRAXY_TRY", "Try Sample", 0
"GOSUB", "*LABEL1"
"MESSAGE", "RETURNで戻ってきた"
"END"

*LABEL1
	"MESSAGE", "GOSUBで*LABEL1に飛んだ"
	"RETURN"
サブルーチンは処理を部分的に分離して呼び出すように使用するのが一般的です。
複数個所で同じ処理を行うような場合はサブルーチン化することでコードを短くでき、
修正や変更する場合もサブルーチンに集約しているため楽になります。

上で「サブルーチン内から "GOTO" で抜け出してはいけません」と書いていますが、
例えば次のような場合は構造的には問題ない(結果的に戻ってきて "RETURN" が実行される)ためエラーは発生しません。
これは "REPEAT" でも同じ事が言えます。

"FRAXY_TRY", "Try Sample", 0
"GOSUB", "*LABEL1"
"END"

*LABEL1
	"GOTO", "*LABEL2"
*LABEL3
	"RETURN"

*LABEL2
	"GOTO", "*LABEL3"
また次のように別の "RETURN" で戻ってもエラーにはなりません。
しかし構造的に解りにくくなるので推奨はしません。

"FRAXY_TRY", "Try Sample", 0
"GOSUB", "*LABEL1"
"END"

*LABEL1
	"GOTO", "*LABEL2"
	"RETURN"

*LABEL2
	"RETURN"



タイマーの設定と使い方
タイマーはシステムとして用意されているタイムカウンタです。
"TIMER" で時間(秒単位)を設定し "START" でカウントを開始、"STOP" で停止できます。
時間切れになるとゲームオーバーになります。
"TIMERADD" で残り時間に任意の秒数を加算できます。
残り時間はシステム変数の _time で参照できますが、こちらは秒ではなくフレーム単位(1秒=40フレーム)になります。

"FRAXY_TRY", "Try Sample", 0
"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"TIMER", 10
"START"
"MESSAGE", "_timeの値は "+_time
"LIMIT", 0, 0
"END"
"TIMEREND" で時間切れの処理を変更できます。
ラベルジャンプを指定した場合は以下の点に注意してください。
・ジャンプする際にループなどの情報は全て破棄される
・ジャンプするスクリプトは常にメインスクリプト(ID0)のみ

"FRAXY_TRY", "Try Sample", 0
"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"TIMER", 10
"TIMEREND", 2, "*TIMEUP"
"START"
"LIMIT", 0, 0
"END"

*TIMEUP
	"MESSAGE", "時間切れでラベルに飛んだ"
	"WAIT", 80
	"END"


"CHOICES" 選択肢の作成と使い方
"CHOICES" は選択肢を作成します。
選択肢が生成されると全てのスクリプトが強制的に停止状態になり選択待ちになります。
項目が選ばれるとシステム変数 _stat に項目のIDを返し、"CHOICES" が実行されたスクリプトから再開されます。
IDは項目一つ目から順番に 0, 1, 2... と割り振られています。

"FRAXY_TRY", "Try Sample", 0
"CHOICES", "Item-1", "Item-2", "Item-3"
"MESSAGE", "IDは "+_stat
"END"


"CHOICES" 選択肢の項目の細かい設定
通常の "CHOICES" は画面中央に簡単な選択肢を生成します。
各項目は位置や表示タイプを設定することができます。

表示タイプと位置を設定してから "CHOICES" を実行します。
このサンプルでは文字タイプを使用していますが他のタイプに関してはトライフォルダ内のサンプルをご覧ください。

"FRAXY_TRY", "Try Sample", 0
"CHOICEWORD", 0
"CHOICEWORD" ,1
"CHOICEWORD", 2
"CHOICEPOS", 0, 5, 4, -60, 0
"CHOICEPOS", 1, 5, 4,   0, 0
"CHOICEPOS", 2, 5, 4,  60, 0
"CHOICES", "Item-1", "Item-2", "Item-3"
"MESSAGE", "IDは "+_stat
"END"


"CHOICES" 時限式の選択肢
少し複雑になりますがサブスクリプトを使用することで時限式の選択肢を作る事もできます。
"SETCOOPERATIVE" で協調レベルを変更し、"CHOICES" による強制停止を無効化している点が重要になります。

"FRAXY_TRY", "Try Sample", 0

// サブスクリプト作成、協調レベルを 1 に設定
"ADDSUBSCRIPT", "*CHOICE_TIMER", subID_CHOICE_TIMER
"SETCOOPERATIVE", subID_CHOICE_TIMER, 1

// タイマーとして使う変数 280/40=約7秒
t = 280

// 表示用オブジェクト作成
"CREATEOBJECT", objID_message,   5, 1, 0,  20, -1, 8
"OBJECTWORD", "", objID_message

// 選択肢作成
"CHOICES", "Item-1", "Item-2", "Item-3"
"MESSAGE", "IDは "+_stat

// 選択肢が選ばれた場合、サブスクリプト削除
"IF", (subID_CHOICE_TIMER ! 0)
	"DELSUBSCRIPT", subID_CHOICE_TIMER
"ENDIF"
"WAIT", 80
"END"

// サブスクリプト本体、時間切れになった場合は選択肢に-1を返しサブスクリプトを削除する
// 協調レベルが 1 に設定されているので "CHOICES" が実行されても止まらない
*CHOICE_TIMER
	"WAIT", 0

	// タイマー処理
	t--
	"OBJECTSTRING", "残り "+strf("%2.2f",(double(t)/40))+" 秒", objID_message, 256

	// タイマーが 0 になったら選択肢の結果を -1 として破棄し、実行中のサブスクリプトを削除
	"IF", t = 0
		subID_CHOICE_TIMER = 0
		"DESTROYCHOICES", -1
		"DELSUBSCRIPT", -1
	"ENDIF"
	"GOTO", "*CHOICE_TIMER"


ウインドウサイズの設定
ウインドウサイズを変更するには "WINDOW" を使用します。
変更されたウインドウサイズはトライ終了時に自動的に復元されます。

"FRAXY_TRY", "Try Sample", 0
"WAIT", 80
"WINDOW", 320, 240
"WAIT", 80
"END"


移動可能領域の設定
プレイヤーの移動可能領域を設定するには "AREALIMIT" を使用します。
この領域は円形と四角形があります。

"FRAXY_TRY", "Try Sample", 0

"MESSAGE", "四角形"
"WINDOW", 480, 360
"AREALIMIT", 2, 3, 160, 160
"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"LIMIT", 0, 0

"MESSAGE", "円形"
"WINDOW", 480, 360
"AREALIMIT", 1, 1, 160, 0
"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"LIMIT", 0, 0

"END"


縦スクロール風にする
通常は全方向フリースクロールとなっていますが、よくある縦/横スクロール風にすることもできます。
以下の命令で設定します。

"AREAFIXED" でフリースクロールを無効化。
"AREALIMIT" で移動可能領域を制限。
"PLAYERANGLE" でプレイヤーの方向を制限。
その他スクロールを設定する命令でスクロール方向に合わせる。

"FRAXY_TRY", "Try Sample", 0

"WINDOW", 480, 360
"AREAFIXED", 1
"AREALIMIT", 2, 2, 140, 170
"PLAYERANGLE", 0, 1
"ITEMSCROLL", 256, 1, 2048, 1
"BGSCROLL", 1024, 0, 2048, 0

"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"LIMIT", 0, 0
"END"


横スクロール風にする
縦スクロールのサンプルを横スクロールに変更したものです。
とりあえず実行してみると…何か違和感を感じるかもしれません。

"FRAXY_TRY", "Try Sample", 0

"WINDOW", 480, 360
"AREAFIXED", 1
"AREALIMIT", 2, 0, 230, 170
"PLAYERANGLE", 1024, 1
"ITEMSCROLL", 256, 1, 3072, 1
"BGSCROLL", 1024, 0, 3072, 0

"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"LIMIT", 0, 0
"END"
プレイヤーが上方向基準で生成され、くるりと回転して右を向いているはずです。
これは初期状態でプレイヤーが上方向基準で生成されているために発生する現象です。
これを修正するには "FRAXY_TRY" のオプションでプレイヤーを生成せずに開始し、
設定が終わった段階で "SETPLAYER" でプレイヤーを生成するようにします。
縦スクロールの場合もこのように設定しておくと確実です。

"FRAXY_TRY", "Try Sample", 1

"WINDOW", 480, 360
"AREAFIXED", 1
"AREALIMIT", 2, 0, 230, 170
"PLAYERANGLE", 1024, 1
"ITEMSCROLL", 256, 1, 3072, 1
"BGSCROLL", 1024, 0, 3072, 0
"SETPLAYER"

"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"LIMIT", 0, 0
"END"


ランクに関わる設定
敵のランク関連はフリープレイの設定が引き継がれますが設定を変える事もできます。
"RANK" はランクを任意の値に設定、"RANKRATE" は敵パーツを破壊した際の上昇率を設定します。
また、敵を生成する際にランクを指定するパラメータがあります。
生成時にランク指定を 0 にすると現在のランク値が適用されます。

"FRAXY_TRY", "Try Sample", 0

// rank:40    rate:100%
"RANK", 40
"RANKRATE", 100

// 現在のランク値で生成
"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"LIMIT", 0, 0

// 任意のランク値(rank:80)で生成
"CREATE", "starfish.fed", 2048, 0, 160, 80, 1
"LIMIT", 0, 0

"END"


スコアに関わる設定
ランク関連と同様にスコア関連もフリープレイの設定が引き継がれますが設定を変える事もできます。
"SCORESYSTEM" でパーツ破壊時のスコアや倍率の表示とどのように倍率を適用するかを設定します。
"SCORERATE" で設定できる倍率は "SCORESYSTEM" で任意の倍率指定がされている際に適用されます。


"FRAXY_TRY", "Try Sample", 0

// 倍率表示、任意の倍率指定
"SCORESYSTEM", 1, 2
"SCORERATE", 3

"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"LIMIT", 0, 0

// 獲得スコア表示、任意の倍率指定
"SCORESYSTEM", 2, 2
"SCORERATE", 3

"CREATE", "starfish.fed", 2048, 0, 160, 0, 1
"LIMIT", 0, 0

"END"


プレイヤーの生成と消去
特に何も指定せずに開始するとすぐにプレイヤーが生成されます。
これを任意のタイミングで生成する場合はまず "FRAXY_TRY" のオプションに &1 を設定します。
このオプションが指定されると初期化時にプレイヤーを生成しないようになります。
次に生成したいタイミングで "SETPLAYER" でプレイヤーを生成します。

既に生成されているプレイヤーを消去したい場合は "DESTROYPLAYER" を使用します。
オプションで消去時のエフェクトを指定できます。

"FRAXY_TRY", "Try Sample", 1

// 80Frame待ってから生成
"WAIT", 80
"SETPLAYER"

// 消去、エフェクト無し
"WAIT", 80
"DESTROYPLAYER", -1

"WAIT", 80
"SETPLAYER"

// 消去、爆発エフェクト
"WAIT", 80
"DESTROYPLAYER", 0

"WAIT", 80
"SETPLAYER"

// 消去、フェイズインエフェクト
"DESTROYPLAYER", 1
"WAIT", 80

"END"


敵を生成する
敵を生成する命令は "CREATE" と "CREATE2" があります。
"CREATE" はプレイヤーの位置を基準に生成方向と距離を指定します。
初期方向は生成される敵がどの方向を向いて生成されるかを指定します。

"FRAXY_TRY", "Try Sample", 0

// "create", "filename", 初期方向, 生成方向, 生成距離, ランク値, オプション
"CREATE", "starfish.fed", 2048, 0, 160, 80, 1
"LIMIT", 0, 0

"END"
"CREATE2" は絶対座標で生成します。
基準となる座標は 0,0 で、これは "POS" で変更できます。

"FRAXY_TRY", "Try Sample", 0

// "create2", "filename", 初期方向, X, Y, ランク値, オプション
"CREATE2", "starfish.fed", 2048, 0, -160, 80, 1
"LIMIT", 0, 0

"END"
敵の生成に失敗した場合、システム変数の _stat に負数を返します。
敵の生成に成功した場合、システム変数の _stat にコアパーツのIDを返します。
コアパーツのIDは "DESTROYENEMY" などで必要になります。

また、生成直後であれば getinfo によっていくつかの情報が取得できます。

getinfo(52,ID)
直前に生成した敵の任意のパーツのIDを取得します。
IDにはエディタで読み込んだ際のIDを指定してください。

getinfo(53,0)
直前に生成した敵のパーツ数を取得します。


敵を削除する
敵を削除する命令は "CLEARENEMY" と "DESTROYENEMY" があります。
"CLEARENEMY" は現存する全ての敵を削除します。

"FRAXY_TRY", "Try Sample", 0

"CREATE", "starfish.fed", 2048, -512, 200, 80, 1
"CREATE", "starfish.fed", 2048, 0, 200, 80, 1
"CREATE", "starfish.fed", 2048, 512, 200, 80, 1
"WAIT", 100
// 敵全てを削除(破壊)
"CLEARENEMY", 0

"CREATE", "starfish.fed", 2048, -512, 200, 80, 1
"CREATE", "starfish.fed", 2048, 0, 200, 80, 1
"CREATE", "starfish.fed", 2048, 512, 200, 80, 1
"WAIT", 100
// 敵全てを削除(フェイズイン)
"CLEARENEMY", 1

"END"
"DESTROYENEMY" は任意の敵を削除することができます。
任意の敵を指定するには敵のIDが必要になるので
"CREATE" などで生成した際にIDを変数に格納しておく必要があります。

"FRAXY_TRY", "Try Sample", 0

"CREATE", "starfish.fed", 2048, -512, 200, 80, 1

// 2機目のIDを target に格納して削除する
"CREATE", "starfish.fed", 2048, 0, 200, 80, 1
target = _stat

"CREATE", "starfish.fed", 2048, 512, 200, 80, 1
"WAIT", 100
"DESTROYENEMY", target, 1

"END"


敵の存在を確認する
敵の存在を確認するには getinfo(10,ID) で調べる事ができます。
しかしこれは単純にIDが使用中かどうかの検知しかできません。
敵が破壊された後に再び生成された敵が同じIDを使う事があるため、任意の敵の存在を確認できないのです。

そこで任意の敵が存在しているかどうかを確認するにはUIDを使います。
UIDは敵(パーツ)に対して割り振られるユニークなIDで基本的に重複しません。
敵生成時にIDとUIDを変数に記録しておき、調べたい時にUIDを比較します。
getinfo(11,ID) でUIDを取得できます。

"FRAXY_TRY", "Try Sample", 0

// 敵を生成、IDとUIDを保持する
"CREATE", "starfish.fed", 2048, 0, 200, 80, 1
target = _stat
target_UID = getinfo(11,target)

"WAIT", 100

// 敵のUIDが一致するか調べる
"IF", (getinfo(11,target) = target_UID)
	"MESSAGE", "存在する"
"ENDIF"

"END"


敵ファイルのプリロード
これまでのサンプルでは敵を生成する際にファイル名を指定していました。
シンプルな構成のトライであればその方法でも良いのですが、
同じ敵を複数体同時に生成する場合やパーツ数の多い敵を生成するのには向いていません。
ファイル指定の場合、ファイルの読み込みとテキストの解析処理が毎回実行されるためです。

そこで、敵ファイルを予めバッファと呼ばれる入れ物に読み込んでおくことで生成速度を向上することができます。
バッファは敵ファイルをテキスト形式からバイナリ形式に変換したものを格納するため、
読み込みと解析処理が無い分だけ生成速度が速くなります。

手順は "BUFFER" でバッファを作成し "LOAD" で敵ファイルを読み込みます。
そして生成はファイル名の代わりに "*0" という風にアスタリスクにバッファのIDを付けて指定します。

"FRAXY_TRY", "Try Sample", 0

// バッファサイズ 32678byte で 4 個作成(IDは0~3が使える)
"BUFFER", 32768, 4

// ID 0 に読み込む
"LOAD", "starfish.fed", 0

"CREATE", "*0", 2048, -512, 200, 80, 1
"CREATE", "*0", 2048, 0, 200, 80, 1
"CREATE", "*0", 2048, 512, 200, 80, 1
"LIMIT", 0, 0

"END"
バッファが作成済みの状態で再び "BUFFER" を実行すると以前作成したバッファは削除され、内容もクリアされます。
つまりバッファの数は動的に増やす事ができません。
トライの初期化時に十分なバッファの確保を行ってください。

バッファのサイズは読み込むファイルのサイズを考慮して決めてください。
バイナリ形式に変換すると元のテキストよりも大きくなる場合があります。
目安は読み込む敵ファイルの中で最も大きいファイルに少し余裕を持たせるくらいです。


アイテムを作成する
"ITEM" と "ITEM2" は敵のコアを破壊した際に生成されるようなアイテムを任意の位置に作成することができます。

"ITEM" はプレイヤーを原点として方向と距離による相対位置に生成し、
"ITEM2" は "POS" で指定されている点を原点としてX,Yのオフセット指定による相対位置に生成します。

パラメータの一つ目はアイテムのタイプ指定です。
0 を指定すると通常のアイテム、
1 を指定すると任意の構成のアイテム、
負数を指定するとシステム定義のアイテムが生成されます。
詳しくは ITEM を参照してください。

"FRAXY_TRY", "Try Sample", 0

"ITEM", 0, 0, 100
"ITEM2", 0, 100, 100

"WAIT", 300
"END"


アイテムの構成を変更する
"ITEMCONSTRUCT" は "ITEM" と "ITEM2" の一つ目のパラメータに 1 を指定した場合に生成される任意の構成のアイテムを設定します。

一つ目のパラメータに構成要素数を指定し、以降のパラメータに構成要素数の数だけアイテムを指定します。
詳しくは ITEMCONSTRUCT を参照してください。

"FRAXY_TRY", "Try Sample", 0

"ITEMCONSTRUCT", 7, 1, 2, 3, 4, 5, 6, 7
"ITEM", 1, 0, 100

"WAIT", 300
"END"


背景の読み込みと設定
トライでは背景を予め読み込んでおき、命令一つで切り替えることができます。
まず背景を "BGLOAD" で読み込み、"BGCHANGE" で背景を切り替えます。

"FRAXY_TRY", "Try Sample", 0

BG_Set = 1
"BGLOAD","401/401_01.BMP", BG_Set, 0, 1600, 3, 255
"BGLOAD","401/401_02.BMP", BG_Set, 1, 1250, 4, 255
"BGLOAD","401/401_03.BMP", BG_Set, 2, 1000, 4, 255
"BGCHANGE", BG_Set

"WAIT", 300
"END"
この例では背景セット(1)に3つの画像を読み込んでいます。

パラメータは次の通りです。
"BGLOAD", "ファイル名", 背景セット, ID, Z値, ブレンドモード, ブレンド率

背景セットは1〜4の4つが使用でき、一つのセットに3つまで画像を登録することができます。
セット内での表示順位はID依存で0から順番に描画されます。
Z値はスクロールの処理に影響するもので表示順位には影響しません。


複数の背景を切り替える
背景を切り替える際のフェード速度は "BGFADE" で変更できます。
フェード速度は1〜255の範囲で値が大きいほど遅くなります。

"FRAXY_TRY", "Try Sample", 0

BG_Set_A = 1
"BGLOAD","401/401_01.BMP", BG_Set_A, 0, 1600, 3, 255
"BGLOAD","401/401_02.BMP", BG_Set_A, 1, 1250, 4, 255
"BGLOAD","401/401_03.BMP", BG_Set_A, 2, 1000, 4, 255

BG_Set_B = 2
"BGLOAD","401/401_04.jpg", BG_Set_B, 0,   -1, 3, 255
"BGLOAD","401/401_02.BMP", BG_Set_B, 1, 1250, 4, 255
"BGLOAD","401/401_03.BMP", BG_Set_B, 2, 1000, 4, 255

"BGCHANGE", BG_Set_A
"WAIT", 300

"BGFADE", 128, 128, 128
"BGCHANGE", BG_Set_B
"WAIT", 400

"BGCHANGE", BG_Set_A

"WAIT", 300
"END"


背景を動かす
背景セットに読み込まれた画像には基点が設定されています。
基点は実際に描画する際に描画位置のオフセットとして使われます。

"BGBASEPOS" は基点を設定する命令、"BGMOVE" は基点を自動的に移動させる命令です。
これらの命令で基点を動かすことで背景を動いているように見せかけることができます。

"FRAXY_TRY", "Try Sample", 0

BG_Set = 1
"BGLOAD","401/401_04.jpg", BG_Set, 0,   -1, 3, 255
"BGLOAD","401/401_02.BMP", BG_Set, 1, 1250, 4, 255
"BGLOAD","401/401_03.BMP", BG_Set, 2, 1000, 4, 255
"BGCHANGE", BG_Set

"BGMOVE", BG_Set, 0, -2048, 0, 500, 1

"WAIT", 500
"END"


オブジェクトとは
オブジェクトはトライスクリプトで文字や画像を表示する際の実体です。
文字ならば文字列を保有したオブジェクト、
画像ならば画像IDと画像情報を保有したオブジェクトといった具合になります。

オブジェクトを生成するには "CREATEOBJECT" を使用し、
明示的に破棄するには "DESTROYOBJECT" を使用します。

"FRAXY_TRY", "Try Sample", 0

"CREATEOBJECT", objID, 0, 4, 0, 0, -1, 0
"DESTROYOBJECT", objID, 0, 0, 0

"WAIT", 200
"END"
オブジェクトは生成しただけでは何も表示されません。
"OBJECTIMAGE" や "OBJECTWORD" などでタイプと値を設定する必要があります。


オブジェクトで文字を表示する
オブジェクトを生成し "OBJECTWORD" で文字列型に設定します。
既に文字列型であれば "OBJECTSTRING" で文字を変える事ができます。

"FRAXY_TRY", "Try Sample", 0

"CREATEOBJECT", objID, 0, 4, 0, 0, -1, 0
"OBJECTWORD","Hello!", objID, -1, 0
"WAIT", 200

"OBJECTSTRING","Bye bye.", objID, 0 
"WAIT", 200

"DESTROYOBJECT", objID, 0, 0, 0
"WAIT", 40
"END"


オブジェクトで画像を表示する
オブジェクトを生成し "OBJECTIMAGE" で画像型に設定します。
画像は "LOADIMAGE" で予め読み込んでおく必要があります。
画像型は "OBJECTANGLE" や "OBJECTZOOM" が使用できます。

"FRAXY_TRY", "Try Sample", 0

imageID = 1
"LOADIMAGE", "common_01.bmp", imageID

"CREATEOBJECT", objID, 5, 4, 0, 0, -1, 32
"OBJECTIMAGE", objID, imageID, 384, 48, 80, 80, 5, 255
"WAIT", 40

"REPEAT", 256
	"OBJECTANGLE", objID, _cnt*_cnt/4
	"OBJECTZOOM", objID, 512+_cnt*16, 512+_cnt*16
	"WAIT", 0
"LOOP"

"DESTROYOBJECT", objID, 0, 0, 0
"WAIT", 40
"END"


オブジェクトで矩形を塗りつぶす
オブジェクトを生成し "OBJECTFILL" で塗りつぶし型に設定します。
で塗りつぶし型は "OBJECTANGLE" や "OBJECTZOOM" が使用できます。

"FRAXY_TRY", "Try Sample", 0

"CREATEOBJECT", objID, 5, 4, 0, 0, -1, 32
"OBJECTFILL", objID, 255,128,0, 100,100, 5,255
"WAIT", 40

"REPEAT", 256
	"OBJECTANGLE", objID, _cnt*_cnt/4
	"OBJECTZOOM", objID, 512+_cnt*16, 512+_cnt*16
	"WAIT", 0
"LOOP"

"DESTROYOBJECT", objID, 0, 0, 0
"WAIT", 40
"END"


サブスクリプトとは
サブスクリプトは一つのトライで複数のスクリプトを並列して実行する機能です。
トライとして読み込まれ最初に実行されるスクリプトをメインスクリプトと呼び、
"ADDSUBSCRIPT" で追加されたスクリプトをサブスクリプトと呼びます。

サブスクリプトは例えば
『他のスクリプトが A という状態を待っている間、常に B の処理を実行したい場合』
このような他のスクリプトの状態に依存せず独立した処理を実行したい場合に有効です。

メインスクリプトのIDは 0 で、サブスクリプトは追加された順に 1〜15 が割り振られます。
削除されたサブスクリプトのIDは追加される際に再利用されます。

上でサブスクリプトは並列実行と書きましたが内部実装としてはID順の直列実行になります。
まずメインスクリプトが実行されBreak属性のある命令によってスクリプトの処理が中断されるとID1のサブスクリプトが実行されます。
同じようにID1のサブスクリプトでBreak属性のある命令が実行されるとID2のサブスクリプトが実行…という順番になっています。


サブスクリプトの追加と破棄
"ADDSUBSCRIPT" でサブスクリプトを追加し、"DELSUBSCRIPT" で破棄します。
サブスクリプトの実行起点はラベルであるため、"GOTO" で無限ループを作れば常に何らかの処理を実行させることができます。
無限ループを作る場合は必ずBreak属性のある命令を挟むようにしてください。

"FRAXY_TRY", "Try Sample", 0

//	メインスクリプト
subID = 0
"ADDSUBSCRIPT", "*SUB", subID
"WAIT", 400
"END"

//	サブスクリプト
*SUB
	"WAIT", 0
	"IF", (count%40) == 0
		"MESSAGE", "count = "+count
	"ENDIF"
	count++
	"GOTO", "*SUB"


サブスクリプトの使用例
トライフォルダの sample_subscript にいくつかサンプルがあるので参考にしてみてください。
その他にも "CHOICES" 時限式の選択肢 などがあります。


"BGMPLAY"と"SEPLAY"
"BGMPLAY" はBGMを再生するための命令です。
MCIを使用しているため再生できるファイル形式はその実行環境に依存します。
別のBGMを再生したい場合は "BGMSTOP" で再生を停止する必要があります。

"SEPLAY" は効果音を再生するための命令です。
MCIを使用しているため複数の効果音を同時多重再生することができません。
別の効果音を再生したい場合は "SEPLAY" で再生を停止する必要があります。

どちらの命令もMCIを使用する古い命令です。
可能であればDSE系命令を使用する事を推奨します。


DSE系命令
DSE系命令は DirectSound を使用して効果音などを再生する命令です。
"SEPLAY" よりも再生負荷が低く複数の効果音を同時多重再生でき、
音量調整や自動フェードなども使用できます。

この命令はBGM再生にも利用できます。
ただしストリーミング再生には対応していません。
ファイルをメモリに丸ごと展開するため、大きいファイルを扱う場合は注意が必要です。
トライフォルダの sample_dse にBGM再生のサンプルがあります。

読み込み可能なファイル形式は wav と mp3 になります。
mp3 は読み込むとファイルサイズの10倍くらいのメモリを必要とします。
大きいファイルの読み込みは少し時間がかかるため、
スクリプトの初期設定時やシーンの移り変わりなどの節目に読み込むようにすると良いでしょう。


"DSEPLAY"による再生
まず "DSELOAD" でサウンドファイルをバッファに読み込みます。
バッファは 0〜63 の64個が使用できます。
"DSEPLAY" にはバッファIDを指定します。

"FRAXY_TRY", "Try Sample", 0

snd = 0	//	バッファ 0
"DSELOAD", "explosion_01.wav", snd
"WAIT", 80
"REPEAT", 10
	"DSEPLAY", snd, 70-_cnt*7, 0, 0	//	ID, volume(%), loopflag, fadein
	"WAIT", 30
"LOOP"
"WAIT", 100
"END"


スクリーンエフェクトについて
スクリーンエフェクトは画面全体に様々な特殊効果を発生させます。
敵パーツが発生させるスクリーンエフェクトと
トライスクリプトで発生させるスクリーンエフェクトは内部では同じものになります。
同じ種類のスクリーンエフェクトは多重で実行することができず、最後に実行されたものが有効になります。


"DEBUGMODE"と"DEBUG"の使い方
"DEBUGMODE" でデバッグを有効にすると
ポーズ時やトライ終了時にスクリプトの実行ログを見る事ができます。
スクリプトが想定通りに動作しているかどうかの確認に使用してください。
"DEBUG" で実行ログに任意の文字列を書き込むことができます。

"FRAXY_TRY", "Try Sample", 0

//	デバッグモード ログタイプは全て指定
"DEBUGMODE", 65535

"DEBUG", "*** starfish.fed を生成 ***"
"CREATE", "starfish.fed", 2048, 0, 160, 0, 1

"LIMIT", 0, 0
"DEBUG", "*** 敵が全滅した ***"

"END"


#includeの使い方
#include はスクリプトを結合します。
例えば次のようにコードを部分ごとに分割したい時に使います。

try_sample.ftd

"FRAXY_TRY", "Try Sample", 0

subID = 0
"ADDSUBSCRIPT", "*SUB", subID
"WAIT", 400
"END"

#include "sub.txt"

sub.txt

*SUB
	"WAIT", 0
	"IF", (count%40) == 0
		"MESSAGE", "count = "+count
	"ENDIF"
	count++
	"GOTO", "*SUB"

try_sample.ftd の出力結果は以下のようになります。

"FRAXY_TRY", "Try Sample", 0

subID = 0
"ADDSUBSCRIPT", "*SUB", subID
"WAIT", 400
"END"

*SUB
	"WAIT", 0
	"IF", (count%40) == 0
		"MESSAGE", "count = "+count
	"ENDIF"
	count++
	"GOTO", "*SUB"


ファイルの読み込みとパスについて
敵や画像などのファイルを読み込む際は次の順番でファイルを検索します。

1. 実行中のトライデータ(*.ftd)があるフォルダ
2. fraxy.exeがあるフォルダ
3. fraxyのtryフォルダ
4. fraxyのファイルタイプ別フォルダ(enemy,img,bgm,se)


キルカウンターについて
キルカウンターは敵が破壊されたり削除された際に値が増加します。
値を参照するには getinfo(98,n) を使うかシステム変数を使用します。

・キルカウンター(ALL) ... getinfo(98,0)
状態や手法を問わずパーツが削除されると増加します。
例えば10個のパーツで構成された敵が削除されるとこの値が10増加します。

・キルカウンター(Enemy) ... getinfo(98,1)
大元のコアパーツが削除されると増加します。
これは分離などでコアパーツになったものはカウントされません。

・キルカウンター(Core) ... getinfo(98,2) もしくは _killcore
パーツのキルカウントフラグに &1 や &2 が指定されていて条件を満たす場合にカウントされます。

・キルカウンター(Parts) ... getinfo(98,3) もしくは _killparts
パーツのキルカウントフラグに &4 や &8 が指定されていて条件を満たす場合にカウントされます。


スクロールについて
スクロールは背景などを任意の方向に動かすことで実際に飛んでいるように錯覚させるものです。
これはプレイヤーやプレイヤーの弾、敵、敵弾には影響を与えません。

トライでスクロールを使用する場合は "BGSCROLL" で背景のスクロールを設定します。
"EFFECTSCROLL" は爆発などのエフェクトオブジェクト、"ITEMSCROLL" はアイテムのスクロールを設定できます。
これらは "BGSCROLL" と同じ値を指定すれば背景と合うようになります。
当然それぞれ別の値を指定しても構いません。

スクロール方向は『背景を動かす方向』を指定します。
例えばよくある縦スクロールにしたい場合、プレイヤーが上向きに飛んでいるようにするために背景は下向きに動かします。
よってスクロール方向は下方向である 2048 を指定します。