Famous Writerでの属性とは、一般的なプログラミング言語の型みたいなもので、「整数系属性」「文字系属性」があります。
基本的には、整数系属性には整数値を、文字系属性には文字列を入れて使います。
命令の右辺や、変数は、この属性の種別に従って、適切に記述してゆきます。
さらに、整数系は整数型・論理型・カラー型・位置型に別れ、文字系は文字型・テキスト型・ファイル型に別れます。
同じ系統のものは、相互に使えます。

型に近いものですので、属性内に変数や数式を使って記述することが出来ます。
ただし、細かいルールがいくつかございますので、慣れるまでは指定の数値・文字のみを使うといいでしょう。
それぞれの属性型で簡単な記述ルールや省略形、エイリアスがあります。
例えば、かんたん命令の&EzCGは、
&EzCG = int1, file, int2;
と表され、&EzCGが命令、int1はint型属性でレイヤー番号、fileはfile型属性で読み込むファイル、int2はint型属性で画面効果番号となります。
命令マニュアルでは、以上のような表記で書かれています。
整数型と文字型は相互変換されます。
つまり、整数系属性を取る所に文字型変数をいれると、それを無理に数値として変換します(REALbasicのStr関数丸投げ…)。
同様に、文字系属性に整数型変数を入れると、その数値の文字列に変換します(REALbasicのVal関数丸投げ…)。
いずれにしろ、タイプミスマッチ的なエラーが出るようにはなってませんので、注意してください。
# アクティブレイヤー番号を指定する命令です &Layer.No = 128;
# レイヤーのαブレンドモードを指定します &Layer.AlphaBlend = True; # 数値で指定するとこんな感じ &Layer.AlphaBlend = 1; # いわゆるフラグも、Bool型で扱うと楽です %Flag1 = on; %Flag2 = off;
# 色はHTMLと同じように書くことができます &Layer.Fill = #000033; &Layer.Fill = gray;

# (200,180)の位置を指定 &Layer.Pos= 200,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;
多項式で属性を指定するルールの前に、変数についてご説明いたします。
変数には、ローカル変数とグローバル変数があり、また、それぞれに整数型と文字型があります。
使用にあたって特に定義や宣言は必要なく、使いたい場所でいきなり使用可能です。PerlやPHPみたいに使っていただければと。
変数名は、半角英数字を使って下さい。全角文字を使った時の動作は保証いたしません。
また、=+-*/^!#$%&_<>など、命令内で使用する文字と紛らわしいものは使わないでください。
変数の記述方法や、サンプルコード等は、命令マニュアルをご参照下さい。
属性と同様、整数型は±2,147,483,648(32bit)の範囲で、文字型は文字数に制限はありません。
仕様上は、ローカル整数型/ローカル文字型/グローバル整数型/グローバル文字型、それぞれ2,147,483,648個(約21億個)まで識別します。
従って、事実上無制限と言えると思います。
ローカル変数は1プレイが終了する(Famous Writerを終了させる)と消えてしまう変数で、グローバル変数は全てのプレイに共通の変数になります。
一般的なプログラム言語とは「ローカル」と「グローバル」の意味(スコープ)が根本的に異なりますので、プログラムの経験がある方は注意してください。
例えば、ローカル変数はゲームの進行フラグなどを保存、グローバル変数にはゲームのクリアデータなどを保存、という使い分けができます。
仕様としては、セーブファイルに保存されるものがローカル変数、FmWr.iniに保存されるものがグローバル変数です。
グローバル変数は、FmWr.iniファイルに保存されます。
以下のような記述方法で、ローカル変数に近い「代入」の形を取りますが、その都度FmWr.iniへ読み書きのため、ディスクアクセスが発生いたします。
%!hoge = True; %foo = %!hoge
ディスクアクセスは、ハードウェア的にいわゆる「重い」動作です。
頻繁に使うと、ノートパソコン等、HDDが非力なパソコンではパフォーマンスが低下します。
従って、なるべく演算や条件判断は、ローカル変数にコピーして行っていただき、終わったら戻すようにしてください。
また、そのような使用を意図してるため、演算命令がございません。
属性は、整数値または文字だけでなく、変数や数式で記述することができます。
ローカル変数だけでなく、グローバル変数も項のひとつとして使えますが、速度とパソコンに負荷がかかる問題があります。
グローバル変数の動作仕様をご理解いただき、適切に使用してください。
数式を使う場合は、各項と演算子の間のホワイトスペースは無視します。
これもお好きなように、タブやスペースでテキストを整形できます。
# 以下の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;
「+」演算子のみ、連結に使えます。
他の演算子はすべて文字とみなします。
演算子の優先順位は、以下の通り(数学と同じです)。
内部の演算アルゴリズムは、上の優先順位をつけたスタック型の方法で行っております。
具体的には「逆ポーランド記法」に少し手を加えた方法です。
コンパイルの時に、項のエラーチェックと逆ポーランド記法への変換をし、実行エンジンで(項が変数の場合は解決しつつ)計算いたします。