FTイベントスクリプトタグリスト

勢力番号=エディタ内用語での「マスター番号」のこと.
勢力ごとが持つユニークな値で,その勢力に属するマスターキャラによって変化するわけではない
(イベントタグCharSet&CharDeleteによって勢力内のマスターキャラが変更されていても勢力は同一である)
のでここでは勢力番号という言葉を用いることにした.

1.ウィンドウ表示関係
状況説明や会話文の表示に必須.

《Window》→《Conversation or Size》→《Print》→《WindowOn》→《WindowOff》
がとりあえず基本的な記述順序.
(中段表示の場合はWindowOnの前にWindowCenterを入れる)

同一人物が一度に表示できない長い話をするような場合は
上のPrint〜WindowOnまでの処理をまとめて[+]で表すと
《Window》→《Conversation》→《[+]→Clear》→《[+]→Clear》→…→《WindowOff》

同一ウィンドウで複数人が連続して話すような場合は
Conversation〜WindowOnまでの処理をまとめて[*]で表すと
《Window》→[*]→[*]→…→《WindowOff》

のような感じか.

  

カレントウィンドウの指定


シナリオ作成者はウィンドウを2つ使用できる.
ウィンドウ表示を行うには,最初にカレントウィンドウを指定し,
その後にカレントウィンドウに対する各種設定を行い,
WindowOnタグで描画を行う.
Window [0or1]
カレントウィンドウの選択
(ほぼ表示位置設定)
カレントウィンドウの指定.(指定しないときのデフォ設定はWindow 0の状態なようだ)
上段ウィンドウと下段ウィンドウがありWindow 0or1でカレント(以降のタグで設定を行う対象)を切り替える.
ウィンドウ表示位置は0なら上段、1なら下段.(ただしWindowCenterタグにより中段へ設定可能)

面倒なことにWindowタグはウィンドウの設定状態をことごとく解除してしまうため,
カレントを切り替えるごとに毎回同じようなタグを並べて再設定を行わねばならない.

ウィンドウのモード(用途)設定

カレントウィンドウを指定したら,ウィンドウの用途に応じてウィンドウのモードを2種から選択し,設定する.
かならずどちらかに設定を行わねばならない.
どちらにも設定しない場合,バグって正しく表示されなくなる.
Conversation キャラNo
MODE1-type1:セリフ用
ウィンドウを指定したキャラのセリフ表示用に設定.

ウィンドウにはキャラの名前,顔絵(顔絵の無いキャラの場合は代わりにユニット絵を拡大したもの)と吹き出しが表示される.

キャラNoはキャラごとのユニークな値である模様だが,
%キャラID として獲得できるので直接数値で指定することは極めて稀.
(とゆーか番号の付け方がよくわからん.エディタで表示されてるNoというわけではないみたいだ)

Conversationはウィンドウサイズを専用のサイズに設定する.Clearの効果も持つ.
また,WindowCenterを解除する.
※このタグに続いてSizeを用いてはならない.バグる.
FaceOut キャラNo
MODE1-type2:顔絵表示
顔絵のみで吹き出しの画像が表示されない以外,働きはConversationと同一.
(故に,FaceOut指定をしたウィンドウにPrintを行うことも可能だが黒字で表示されるのでとても読み難い)
デフォではイベント発生エリアの支配マスターを表示するのに使われている.
Size x,y
MODE2:自由描画用
特に用途限定の無いウィンドウに設定する.
(初期で何も描画されていない素のウィンドウを生成するのに使う)

こちらのモードではx,yによりウィンドウサイズを設定することができ,Clearタグの動作も素直.
カレントウィンドウを文章による状況説明や画像表示といった用途に使うならこちら.

ウィンドウ内描画状態の設定

ウィンドウ内に描画される文字や画像を設定する.
Print 文字列
文章の描画
ウィンドウへの文字列の描画.1命令につき1行分の文字列を設定.
自動で改行され,次のPrintタグによる描画位置は次の行になる.
セリフ用モードのウィンドウサイズでは1ウィンドウ内に3行まで表示できる.
文字の色は,ウィンドウモードがセリフ用の時は黒,自由描画用の時は白になる.
文字の背景は透過するので,Pictureで描画した画像の上に文字を描くことが可能.

(ex)WindowOnと併用して

Window 0
Conversation %ゴート
Print 一行目
WindowOn 2000
Print 二行目
WindowOn 0
WindowOff

などとすれば一行目と二行目の表示の間に一呼吸入れたりできる.
OutPrint x,y,文字列
文字列の描画
ウィンドウ座標(x,y)位置(文字列の左上端のくる位置を指定)に文字列を描画.
PrintやPrintKzとは独立に,任意の位置に文字列を表示できるが,その際の文字の色と背景の色が
直前までのタグによって下記のように変化するので多少扱いづらい感がある.

OutPrint以前のタグ ウィンドウMODE1
(Conversation,FaceOut)
ウィンドウMODE2
(Size)
文字色 背景色 文字色 背景色
Window(デフォルト) 透過
Print,PrintKz 透過 透過
Clear ウィンドウ背景色
DeleteFill ウィンドウ背景色 ウィンドウ背景色

まず,WindowでOutPrintの描画色がデフォルトのものになる.
その後はPrint,PrintKz,Clear,DeleteFillのタグが処理されるごとに上記表のようにOutPrintの描画色が設定される.
ClearとDeleteFillは背景色のみを変更する.故に,例えば,
Window→Size→Print→Clear→OutPrint
の順にタグを記述した場合,OutPrintの描画色は
文字:白 文字背景:ウィンドウ背景色(暗い青) となる.

Window→Size→OutPrint→PrintKz→OutPrint
と書いた場合,1番目のOutPrintと2番目のOutPrintの描画色は異なるということになる.

表からわかるようにPrint,PrintKzの後に記述した場合が一番素直なので
OutPrintとPrintやPrintKzとを合わせて表示を作る場合は,記述する順番をそのようにするといい.
使用例
Sizeを指定したウィンドウでは
PrintKzの描画が中央揃えであることを利用して
OutPrintと組み合わせて表示してみた例.
無意味な例
Set a,10
Window 0
Size 350,65
PrintKz a
OutPrint 53,16,作戦の準備には  Ley掛かります.
Print この作戦を実行しますか?
WindowCenter
WindowOn 0
WindowOff


↑OutPrintの座標合わせには
 それなりの根気が必要.
Window 0
Conversation 1
WindowCenter
Set a,0
Print このPrint行はOutPrintの文字色を設定するだけ
Start
if(a<30)
{
Plus a,1
Clear
Set x,Random(50)
Plus x,200
Set y,Random(30)
Plus y,45
OutPrint x,y,な,なんだってぇー!
WindowOn 40
GoTo
}
WindowOn 1000
Clear
Print  
Print またしてもノストラダムスか!
WindowOn 0
WindowOff

PrintKz 変数
変数値の描画
Printとほぼ一緒.こちらは変数の値を描画できる.
(ex)Print a
Picture ファイル名,x座標,y座標
画像の描画
ウィンドウへの画像の描画.画像ファイル名と描画位置(画像の左上隅がくる位置)を指定する(座標原点はウィンドウ左上).ファイル名に拡張子はつけない.
(指定ファイルが無い場合,エラー表示等は無く処理は続行される模様.安全なのかは不明.)

ユニットなどとは違って黒は黒のまま描画される.透明色になるわけではない.ちょっと残念.
ウィンドウ領域外にはみ出てしまう部分は描画されない(これも安全かどうかは不明).
使うbmpはそのシナリオのPictureフォルダかファーレン本体のPictureフォルダ(Title1.bmpとかがあるところ)に入れるのが基本.しかし,ユニット画像など別フォルダにある画像を表示したいときに,わざわざPictureフォルダにコピーを持つのは嫌.
そこで小技→ファイル名をPictureフォルダからの相対パスで指定すれば他フォルダ内の画像も使える.
(ex)Picture ..\CharDir1\Char1
Clear
ウィンドウ内クリア
主に同一人物が一度に表示できない長ゼリフを吐くようなときに必要なタグ.
ConversationやWindowCenterの指定は持続する.
Clearは次のPrintの表示位置を1行目に戻す.

変なことをしない限り,ウィンドウ内クリアだと思っておけばいいが,
一応このタグの描画的働き(?)は以下のような感じ.
・ウィンドウモードがセリフ用のとき:一定領域を白で塗りつぶす(位置は吹き出し内部に相当するあたり)
・ウィンドウモードが自由描画用とき:ウィンドウ内全体をウィンドウ背景色で塗りつぶす
DeleteFill x1,y1,x2,y2
矩形領域を背景色で塗りつぶし
ウィンドウ内の(x1,y1)-(x2,y2)矩形領域をウィンドウの背景色で塗りつぶす.
それ以上でもそれ以下でもない=Clearの領域限定版というわけではない(Printの位置は持続する).
座標1と2の順序には気を配らなくていい(座標1が左上でなくてもいい).
いまいち使い道がないが,例えば

//画像の表示
Window 0
Size 384,288
Picture PowerMap,0,0
WindowOn 0

とかしておいて後で

//上から滑らかに消してみせる
Set a,0
Start
Plus a,2
DeleteFill 0,0,384,a
WindowOn 100
if(a<288)
{
 GoTo
}
WindowOff

とか書いて少しずつ画像を消していくみたいな演出とかができる(不必要だが).

ウィンドウ表示位置の変更


WindowCenterは単に一時的にカレントウィンドウの表示位置を中段に変えるだけで,第3のウィンドウを使えるわけではない.
WindowCenter
表示位置を中段に設定
ウインドウ表示位置を中央(中段)に設定.
なにやら他タグによりこの設定はキャンセルされることが多いので,確実に効果を得るにはWindowOnの直前に置くといい.
WindowCenterはSize,Conversation,Print等の状態を変更したりはしない.

画面へのウィンドウ表示と消去

必要な設定が終わったらWindowOnで実際にウィンドウを画面に表示する.
表示したウィンドウはWindowOffで消去する.
WindowOn 表示時間
ウィンドウの表示
ウィンドウの表示.このタグに処理が到達して初めてウィンドウ描画がなされる.

数値で表示時間を指定(その間スクリプトの実行は待たれる).単位は多分ms.
指定時間が過ぎなくてもマウスクリックされると処理は次に移る.
表示時間の指定可能最大値は不明だが,
値を0とすると時間∞にできるっぽい.→絶対に読ませたい文に使うと吉.

表示ウィンドウの場所,サイズや内部に描画されるものは,これ以前に書かれたタグ内容の総合的な結果となる.
WindowOnは他タグによるウィンドウへの設定を解除することはない.
WindowOff
全表示中ウィンドウ消去
表示しているウィンドウの消去.



2.キャラクタ配置,変数操作,演出などその他の命令系
人材の獲得や移籍,同盟関係の操作など.

CharSet エリアNo,キャラNo
キャラの配置
指定したエリアに指定したキャラを配置する。
配置前にはそのエリアに開きがあるか調べるべし.
CharDelete キャラNo
キャラを死亡状態化
指定したキャラを消去(死亡状態に)する.
検索により始めに見つかった1キャラのみを消去する模様.
検索順序は不明だが,おそらくエリアNoの若い順&同一エリア内では表示並び順(戦力値が高いほど先)か?
死なすよりも
CharDelete %人材A
CharSet 1,人材A
のようにして人材の強制移動を行う場合が多いか.
Set 変数A,値B
代入
変数Aに値Bを代入
(ex) Set a,1
Plus 変数A,値B
加算
変数Aに値Bを加算(A+=B)
マイナス値を加算すれば減算が可能
Music
BGM演奏
BGMを指定したMIDIファイルに変更する.拡張子は不要.
AreaFocus エリアNo
エリアを中央に表示
指定したエリアが中心にくるように全体マップの表示位置を移動させる。
後にBaseAreaをつけられることが多い。
YesNo(string)
はいorいいえの選択肢提示
はい、いいえ、の選択肢メッセージボックスの表示.
括弧内の文字列がメッセージボックスに表示される.
選択結果によりtrueかfalseの値を返すので,↓の例のように変数に代入するのがデフォの用法.
(ex) Set b,YesNo(仲間にしますか)
→「はい」を選択するとbにtrueが,「いいえ」ならfalseが代入される
Set League 勢力番号,勢力番号,n
同盟関係の設定
指定した勢力間にnターンの同盟を組ませる.
n=99にすると同盟期間が無限に,n=0で同盟解除になる.
※SetとLeagueの間に空白が入るので注意.


3.状態変数とか

ゲーム内の情報へのアクセス.たいがいは条件判断のために参照するもの.
Turn
現在のターン数
ターン数.最初はターン1.
StartTurn
シナリオ開始から経過したターン数
シナリオ開始からの経過ターン数.
こちらは経過ターンなので初期値は0.
(ex)
if(StartTurn==0)
{
  ゲーム開始時のイベント
}
KuniFlag[勢力番号]
勢力の存続
勢力が存続しているかの判定.指定した勢力番号の勢力が存続しているなら真値.
KuniPlayer[勢力番号]
勢力の操作者
プレイヤー操作かの判定.指定した勢力をプレイヤーが操作しているなら真.
a〜z
一時変数
一時変数.(a〜zの26個が使用可能なことが解っているみたい)
一時変数はターンを超えて値を保持しつづけることはできない.
Plus,Set等で値を操作して使用.おそらく整数値.
Random(n)
乱数値の取得
乱数の取得.得られる値は0〜(n-1)の整数.
(ex)Set a,Random(100)
Flag[n]
状態フラグ
bool型グローバル変数.初期値はfalse.一時変数であるa〜z(int+boolな感じ)と違い,trueかfalseの二通りの値しか保持することはできないが,ゲームを通して値が保持されるのでイベント発生の制御に向いている.
使用可能なnは0〜399?(400番が使えるかは未確認)
401以降はエンディングフラグに予約されている模様→プレイヤーの操作するマスターのNoがmのとき,ゲームクリアするとFlag[400+m]が立つ.
AreaKuni[エリアNo]
エリア所有勢力
指定したエリア(エリアNoも1から始まる値)を支配している国の勢力番号.
中立エリアなら値は0となる.
BaseArea[勢力番号]
マスター所在地
指定した勢力にいるマスターキャラの現在地のエリアNo.
マスターキャラが複数いる勢力の場合は…優先順位がよくわらん(実際に操作してみて自軍フェイズ開始時に表示されるエリアにいるマスターを調べることで確認することはできる).
既に敗北した勢力等マスターがいない勢力の場合は0になるみたい.
AreaButaiKz[エリアNo]
エリアのユニット数
指定したエリアの部隊数を示す.1エリアの最大部隊数は20.
CharSetはこの値を見て定員に開きがあるか調べてからにすること.
HeroFlag[キャラNo]
人材の所在地
キャラクターの現在地のエリアNo.
指定キャラが死亡している場合,値は0になるので,
HeroFlag[%キャラ]!=0
のようにして生存確認を行うことも多い.

放浪人材の場合は100になるみたい.
HeroKuni[キャラNo]
人材の所属勢力
指定したキャラが所属する勢力番号.放浪中で何処にも所属してなかったり死亡している場合は0.
true
真値
真値.例えばSet b,trueとすれば当然,
if (b)
{
...
}
は実行される
false
偽値
偽.Flagの初期値はこっちになってる模様.
Ley[勢力番号]
資金
指定した勢力が所有している Leyの量.Set及びPlusで値の書き換えが可能.最大値は999.
AreaCity[エリアNo]
エリアの街の数
指定したエリアの街の量.Set及びPlusで値の書き換えが可能.
AreaWall[エリアNo]
エリアの城壁の数
指定したエリアの城壁の量.Set及びPlusで値の書き換えが可能.
AreaRoad[エリアNo]
エリアの道の数
指定したエリアの道の量.Set及びPlusで値の書き換えが可能.
Scenario
プレイシナリオ
開始したシナリオの番号(最小値1)を示す.
MostWin[n]
撃破数ランキング
n番目に撃破数の多い人材のキャラNoと思われ.エンディングの撃破数ランキングに使われている
WinKz[キャラNo]
人材の撃破数
人材の撃破数.エンディングの撃破数ランキングに使われている


4.処理の流れの制御&その他
条件分岐は
if直後の( )内に、==,>,>=,<,<=,!=,&&,||等を用いてイベント発生の条件を記述する.
ただし,&&と||に優先順位がきちんと定められていない模様なので注意が必要.
&&,||はそれが出てきた時点で即評価される?
→(a || b && c) は ((a || b) && c)と解釈される?
( )での順位づけすらできない?
if(条件式)
{
  イベントタグ群
}
条件分岐
条件分岐.後に続く条件式が真の場合,ifブロック内のイベントタグ群が実行される.
イベント発生条件の指定に必須.残念ながらelseは無いらしい.
End
処理の終了
イベントスクリプトの処理は初めてEnd文にであった時点で終了する.とりあえず最後には書くべし.
Start
Goto移動先指定
GoToの移動先を示すラベル的存在.ループ処理の実現に欠かせない.
GoTo
処理をStartに飛ばす
直前のStartの位置まで処理を飛ばす.無限ループにはくれぐれも注意.
break 詳細不明.たぶんifブロックからの強制脱出かな?
Check 文法などのバグチェックができるらしいが詳細不明.




テクニック?
というか,実際やってみたりしたこととかをメモ

内容 タグ記述例とか
グローバル変数の確保
イベントスクリプトで使える変数a〜zは一時変数なので次のターンには値を失ってしまう.
ターンをまたいで処理したいイベントに必要な値を確保するために未使用エリアの町や城壁の数を利用する.

例えば「ある時点からnターン後に起こるイベント」をFlagのみで実装するのは困難だが,ターンをまたいで値を保持できれば簡単に実装可能であろう.
エディタで町や道,壁がやたらと多い(この数が変数の最大値になるので)エリアを作り,シナリオではこのエリアを未使用に設定する.
町,壁,道の数はPlusで増減できる他,Setで直接代入もできる.
その際,マイナス値や最大以上の値になる演算はその場で範囲内に収まる値に矯正される.
 マイナス値→0
 最大より大きい→最大

とりあえず開幕イベントで初期値代入を行っておくべき.
if(StartTurn==0)
{
 Set AreaCity[???],0
 Set AreaWall[???],0
 Set AreaRoad[???],0
}
とか.(???は未使用エリアのエリアNo)
勢力の滅亡
勢力内に所属するマスターの人数が0のときに滅亡(敗北)と判断される.
初期配置のマスターの生存が条件なわけではない.
つまり,勢力内にマスターキャラが複数いる場合,その全員が死亡状態にならなければ滅亡ではない.(ただし,勢力滅亡時のメッセージ「○○が死んだ」には,エディタで設定したマスターの名前が使われるし,勢力ウィンドウ?の顔グラフィックもそのマスターの顔が使われる.)

「AとB」という名前のダミーマスターを使って勢力を作り,「A」「B」という名前の2人のマスターを配置すれば,なんとなく2人の人物が共同で治める国完成.
両方死んだときの滅亡メッセージは「AとBが死んだ!」となります.
選択不能勢力
プレイヤーが選べないが,ゲーム中に存在する勢力をつくる.
その勢力をシナリオでは使わないことにしたにもかかわらず使うことで実現.
多分製作者の想定していない設定方法だと思う.
ある勢力を,エディタのマスターの設定で,そのシナリオに登場しない設定にする→が,エリア設定で所属をその勢力にしてしまう.
そのようにして存在する勢力は以下の特徴をもつ.

・プレイヤーが選択できない.
・内部的には本来存在しないので,勢力情報等の表示がなされない.
 ただ,勢力地図には名前が出ないものの,色塗りはされるようだ.
・基本的に戦闘以外の操作は一切行われないので,
 兵を雇ったりエリア間移動したり他国に攻め込んだりはしない.
 ただただ初期の内政設定である町開発のみを毎ターン行う.
・同一勢力の支配地が隣接していれば戦闘での離脱は通常通り行う.
・滅亡の処理すら行われないのでマスターがいなくても存続.
 全エリアを失った際も特にメッセージ表示もない.
・戦闘でマスターキャラが死んだ場合,その戦闘は敗北となり終了する.(滅亡にはならない.)ただ,そのエリアにいた部隊は排除される模様.
・ゲーム中での同盟締結もできない.ただし,エディタによる初期同盟状態の設定や,タグによる設定は反映される.その場合,同盟期間終了時のメッセージ表示はなく,ひっそりと同盟破棄が行われる.
・KuniFlagの値が0(滅亡状態).よって存在をKuniFlagでは判断不能.
 が,AreaKuniは正しくこの勢力の番号を返すのでエリアごとの判断は可能.
・収入は無い模様.Leyの値は常に0.

以上をふまえると,
町の開発を行う中立エリアのごとく振舞うが兵力は増えないといった感じか.
ちょっとした人材のいる地方勢力みたいなものの表現に便利か.
1エリア限定勢力とかにして適当なマスターキャラ置いとけば「大将さえ倒せば制圧できる地域」みたくなるかな.
雇用はイベントで代行すれば一応なんとかできるか.
マスター置き換えによるバランス調整
敵のマスターは初期からランクが高いという状況を作り,敵マスターの頓死を少しでも防ぐ.
まず,エディタでの初期配置はマスターのランクを高く(例えばBとかに)しておく.
開幕イベントで,プレイヤー操作勢力のマスターを置き換えることにより,Eランク化する.
結果,敵マスターが多少は強く見える.
人材データを別途用意することなく簡易的に能力値水増し効果を得られるところが便利.
前提:キャラNoが(%マスター)なマスターキャラが勢力番号1の初期マスターとして初期ランクE以外で配置されている

if(StartTurn==0 && KuniPlayer[1])
{
  Set a,BaseArea[1]
  CharSet a,%マスター
  CharDelete %マスター
}

説明:CharSetによりEランクのマスターが配置される.
CharDeleteは高いランクの方を先に検出して取り除くので,結果,マスターのランクをE化することができる.
どうやらイベントスクリプトの実行中もゲーム状態は監視されているらしく,タグの順番を逆にすると,CharDeleteの時点でマスター不在状態を検知され,勢力1は敗北となってしまうので注意が必要.
1ターンに複数雇用
エリア特有の雇用ユニットがモンスター以外の種族の場合,雇っても雇用行動を取ったキャラが行動終了にならないので資金の許す限り兵を雇うことができる.
Callableファイルの記述で,雇用できるユニットにモンスター以外の種族のユニットを指定する.
使えるテクニックというよりもむしろ困るバグといった感じだ.
バイナリエディタでいじる(反則?)
ファーレンのエディタではできないことも多い.
たとえば移動力は何故か最低値が5である.
しかしデータファイルを自己責任で直接いじれば移動力0の動けないユニットとかも作れる.
実際,移動力0のユニットが欲しかったので作ってみたが,
ファーレンエディタを使うごとに,ご丁寧にも移動力は5に戻されてしまう.
毎回テストプレイの前に16進数いじくるのは面倒すぎなので結局やめました.
イベントスクリプトの解釈は未完成?
条件式の厳密な文法解釈はできていない模様.
正しい条件提示をしているのにちゃんと動かない場合は,一時変数を使うなどして対応する必要がありそうだ.
もしかしたら( )や[ ]を含む条件式をうまく解釈できないのかもしれない.
HeorKuni[%人材A]の値が2であるにもかかわらず,

if(HeroKuni[%人材A]==1)
{
  イベント
}

の条件式が真と解釈され,イベントが実行されてしまうのを確認.これを

Set z,HeorKuni[%人材A]
if(z==1)
{
  イベント
}

と書けばきちんと判定された.スクリプトで参照できるゲーム内状態変数を条件に使うときは,値を一旦一時変数に格納し,その値を条件式に使用したほうが安全なのか?