文法について


命令行とインライン行

Famous Writerは、テキストファイルの1行ごとに実行してゆきます。
各行は、「命令行」と「インライン行」という二種類に振り分けて処理します。
命令行は画像描画や音声再生などをし、インライン行はメッセージウインドウにテキストを書く、という動作になります。

命令行かどうかは、頭の文字で判断します。これがないとインライン行とみなします。
また、この文字はだいたいの動作が決まっていて、それは以下の通りです。
#: 注釈文
@: アンカー
&: 実行命令
?: 条件判断
%: 数値変数
$: 文字変数
*: setting.txt用→これの解説は別ページに

# 命令行の例
&Layer.Load = /hoge.pct
%foo = 12;

# インライン行(出典:『方丈記』鴨長明氏)
行く河の流れは絶えずして、しかも、もとの水にあらず。
よどみに浮かぶうたかたは、かつ消え、かつ結びて、久しくとどまりたる&r=例:ためし&なし。

行構造

テキストファイルは、基本的にテキストエディタで見たままの形で行を解釈します。
正確には、改行記号(CR:13HとLF:10H)までで1行とみなします。
が、以下のルールで、テキストを見やすいように整形して書くことが出来ます。

マルチステートメントで書くことが出来ます。
区切り記号は半角のセミコロン(;)です。

# それぞれが命令行1行
&Layer.No = 0
&Layer.Load = /hoge.pct

# マルチステートメント表記(動作は上の例と同じ)
&Layer.No = 0; &Layer.Load = /hoge.pct;

# マルチステートメントで、命令行とインライン行を混在させることもできます
クリックすると音が鳴るよ!; &Snd.Play;

行末に半角のピリオド(.)があると、次の行と連結して解釈されます。

# 命令行でピリオドを使った例
&Select = .
	選択肢1: &Jmp=@1 ,.
	選択肢2: &Jmp=@2 ,.
	選択肢3: &Jmp=@3 ;

# 上の例は、以下のように1行で書いたのと同じ動作になる
&Select = 選択肢1: &Jmp=@1 , 選択肢2: &Jmp=@2 , 選択肢3: &Jmp=@3;

# インライン行の例
1行目/.
2行目/.
3行目

# 上の例は以下と同じ動作
1行目/2行目/3行目

命令行の基本構文

イコール区切り

命令行の書き方は、基本的に「命令 = 属性1 [,属性2 ,...];」となります。
つまり「=」で区切り、左辺が命令、右辺が属性という表記が基本になります。
命令行の前後や、=の前後にあるタブやスペースなど(いわゆるホワイトスペース)は無視しますので、お好きなようにインデントを入れて見やすく書くことが出来ます。

例えば、かんたん命令の&EzCGは、
   &EzCG = int1, file, int2;
と表され、&EzCGが命令、int1はint型属性でレイヤー番号、fileはfile型属性で読み込むファイル、int2はint型属性で画面効果番号となります。
このマニュアルは、以上のような表記で書かれています。

属性は、一般的なプログラミング言語の型みたいなもので、それぞれの属性型で簡単な記述ルールや省略形、エイリアスがあります。
例えば、座標など数値を入れるべき所に文字が入れられないようになってます。
このページを読み進めてゆくと、属性と型について説明があります。

ピリオド区切り

命令はピリオド(ドット)で区切られてるものが多いんですが、少し時間がたってからテキストを見直した時や、命令を忘れた時でも英語から容易に意味を類推できるようにするため、このようなスタイルになってます。
さらにドットを「の」「に」「を」など、日本語の助詞に置き換えると、もっとわかりやすくなると思うんで、このマニュアルを見ながら想像してみてください。

&Layer.No = 1; # レイヤー「の」番号
&Layer.Load = hoge.bmp; # レイヤー「に」ロード
&Layer.Clear; # レイヤー「を」クリア

文法の特徴

Famous Writerの命令は、なるべくひとつの命令がひとつの属性を取るように、一対一対応するようにしています。
そのため、以下の特徴があるので、採用するか否かの参考になれば幸いです。
・長所:命令を見ただけですぐ、何をやってるかわかる。
・短所:冗長。覚える命令が多い。

便利な書き方

エイリアス

エイリアスを持つ命令もあります。
どれを書いても同じように機能します。見やすいとか打ち込みやすいとか適当に理由をつけて、好きなものを使ってください。
なお、コンパイルの時にエイリアスの解決処理をするので、エイリアスのコンパイルは若干遅くなります。

エイリアスはそもそも、書きやすいように短縮形として生まれたり、以前のバージョンとの後方互換の意味で残っている表記方法です。
このため、ゲーム開発時に見やすさと書きやすさを天秤にかけられたり、古いバージョン用のテキストファイルでも大きな変更無く動作します。

属性について・概略

属性は、「整数系属性」「文字系属性」があります。
基本的には、整数系属性には整数値を、文字系属性には文字列を入れて使います。
同じ系統のものは、相互に使えます。

変数や数式で記述することもできますが、細かいルールがありますので、はじめての方は、指定の数値・文字のみを使うといいでしょう。
細かいルールについては、このページの下の方にあるんで、より深く理解したい時にご参照下さい。

整数系属性

# アクティブレイヤー番号を指定する命令です
&Layer.No = 128;
# レイヤーのαブレンドモードを指定します
&Layer.AlphaBlend = True;

# 数値で指定するとこんな感じ
&Layer.AlphaBlend = 1;

# いわゆるフラグも、Bool型で扱うと楽です
%Flag1 = on;
%Flag2 = off;
# 色はHTMLと同じです
&Layer.Fill = #000033;
&Layer.Fill = gray;

pos

# 例:
&Layer.Pos= -40,+180;

# 横方法だけ相対指定で動かしたい場合
&Layer.Pos= -40,+0;

# 横方向を相対指定で20px右に、縦方向を絶対座標の下寄せで指定
&Layer.Pos= +20,bottom;

文字系属性

# ボタンに[3]のキーを割り当てます
&B.Key = 3;
# レイヤーにテキストを描きます
&Layer.Text = これは&c=red&レイヤー3&c=&です。;
# ファイルの頭に飛ぶジャンプ命令です
&Jmp = /scenario/hoge.txt;

# ファイルの特定のアンカーに飛ぶこともできます
&Jmp = /txt/chapter2.txt@section2;

# BGMトラックにファイルを読み込みます
&BGM.Load = /aac/bgm16.m4a;

# 同じフォルダの画像を読み込みます
&Layer.Load = ./sub.jpg;

属性について・詳細

属性の中では、整数値または文字だけでなく、変数や数式で記述することができます。
ローカル変数だけでなく、グローバル変数も項のひとつとして使えますが、速度とパソコンに負荷がかかる問題があります。
詳しくは、変数のページをご参照いただき、グローバル変数の仕様をよく理解の上で、適切に使用してください。

数式を使う場合は、各項と演算子の間のホワイトスペースは無視します。
これもお好きなように、タブやスペースでテキストを整形できます。

# 以下の2行は同じ
%var=(1+2)*3;
%var = (  1 + 2  )   *3;

# グローバル変数を使った例
%a = %Flag1 * %!Flag0

整数系属性

Famous Writerは、加(+)減(-)乗(*)除(/)と、べき乗(^)を使った数式を解釈します。
ただし、負の値を示したい時は、減算の-と区別がつかないので、(-1)などと項をカッコでくくってください。
同様に、システム変数など、頭に*がつくものもカッコでくくります。

項の頭に#をつけた項は、16進数として扱われます。表記はビッグエンディアンです。
各項は、内部では全て整数型で扱われ、32bitで格納されます(16進数は符号付きとして扱われます)。

# 16進数でも指定できますが、マニア向け
&Layer.No = #80;

# True/Falseなどは定数なので、項として使えます
&Layer.Visible = %Flag * true;

# 負の値はカッコをつけます
%foo = ( (-2) * %var - 5 ) / 4

# システム変数の場合もカッコを
%seconds = (*system.hour) *3600 + (*system.minute) *60 + (*system.second)
本日の経過秒数は%seconds%秒です。

# 数式を使うとこんなこともできます
&Rnd = 255; %red = &Rnd; %green = &Rnd; %blue = &Rnd; 
&Layer.Fill = %red * #10000 + %green * #100 + %blue;
&Layer.Fill = %red * 65536 + %green * 256 + %blue; # 10進数

# 色を変数として使っても便利かも
%DarkRed = #330000;
&Layer.Fill = %DarkRed;

# Pos型の自動計算も、数式の中に入れることができます
&Layer.Pos = center -8, (topcenter +10) /2;

# 例えば絶対座標の(-10,-20)の位置にしたい場合、
&Layer.Pos = -10, -20;
# だと相対位置と見なされるので
&Layer.Pos = 0-10, 0-20;
# と書くか、もしくは変数を使うこと
%x = -10; %y = -20
&Layer.Pos = %x, %y;

# 変数で相対位置にしたい場合は、以下の通り
%x = 10; %y = 20
&Layer.Pos = - %x, - %y;

文字系属性

「+」演算子のみ、連結に使えます。
他の演算子はすべて文字とみなします。

演算の詳細仕様

演算子の優先順位は、以下の通り(数学と同じです)。
1. ()
2. ^
3. * と /
4. + と -
内部では、上の優先順位をつけた逆ポーランド記法に変換して計算してます。
コンパイルの時に、項のエラーチェックと逆ポーランド記法への変換をし、実行エンジンで(項が変数の場合は解決しつつ)計算します。

整数型と文字型は相互変換されます。
つまり、整数系属性を取る所に文字型変数をいれると、それを無理に数値として変換します(REALbasicのStr関数丸投げ…)。
同様に、文字系属性に整数型変数を入れると、その数値の文字列に変換します(REALbasicのVal関数丸投げ…)。
いずれにしろ、タイプミスマッチ的なエラーが出るようにはなってませんので、注意してください。


目次へ戻る
ホームページへ

Ads by TOK2