FS2000 APL SDK Language Features



■APL言語仕様
 ホワイトスペース
 大文字/小文字
 コード内のコメント(リマークス)
 16進定数(Hex Constants)
 引用符
 度、分、秒
 ブール定数
■APLコンパイラーの使い方
 コンパイラーエラーメッセージ
■コマンドの構文と意味
 キー値の仕様
 イベント起動プログラミング
 特別のサブルーチンの使用方法
■FS2000での天候の使用方法。
 Note: アドベンチャー内でATISを使用しないで下さい。 




■APL言語仕様

Adventure Programming Language(APL)は、殆どの言語機能をBASIC及びC言語を借りてきて
います。また一部はMASM(Microsoft Macro Assembler)からも取り込んでいます。
また、APLは行単位(1行1コマンド)のプログラム言語です。


ホワイトスペース

APLでは、それが意味をなすならどこでもブランクやタブによるホワイトスペースを使う事
ができます。例えば、数式の前後やコンマの後に段落(インデント)を付ける場合などです。
文法でスペースが必要な場合は、スペースやタブはいくつつけても構いません。
ホワイトスペースは二つの演算子を分けるという効果を持ちます。
ホワイトスペースが有効でないのは引用符内の文字列に対する場合のみで、この場合は引用
符の中はスペースがあっても一つの文字列として扱われます。


大文字/小文字

APLでは、全てのコマンドや変数は大文字、小文字を区別しません。


コード内のコメント(リマークス)

APLは二つのコメント記述をサポートしています。セミコロン(;)とアポストロフィ(')がそれ
です。この二文字で始まる行、及び、行の途中でこの文字があった場合はそれ以降の文字は
コメント文として扱われます。
コメントが有効でないのは引用符内の文字列に対する場合のみで、この場合は引用符の中は
コメント文字があっても一つの文字列として扱われます。

またコメントを表すのにRemコマンドも使用できます。


16進定数(Hex Constants)

APLでは、通常、数字は10進数として扱われます。しかし、整数の独立変数が期待できる場所
ではどこでも16進数を使用することができます。この場合はC言語と同様に"0x"をプリフィッ
クスとして使用します。例えば"0xFF00"は文字の上位ビットマスクを特定します。実数を表す
場合は16進数に小数点を付けます。例えば"0x000F.F000"は15.9375を表します。(15と16分の15)


引用符

特定文字列にはダブルクォーテーションマークを使用します。開始のダブルクォーテションマ
ーク以降の文字列は終了のダブルクォーテションマークがでてくるまで特定文字列の一部とし
て扱われます。引用符の中では行末文字を使用することができません。引用符内の二つのダブ
ルクォーテーションマークは引用符内文字列の中の一つのダブルクォーテーションマークとし
て扱われます。また、引用符内の大文字/小文字は変更されません。


度、分、秒

しばしば、APLのプログラム内で緯度、経度の座標を示す必要があります。通常、この座標は
度、分、秒であらわされます。そしてこれを小数点付きの度に変換することは面倒なものです。
APLではコロン(:)を度、分、秒を区別するのに使用することができます。例えば12:34:56.7は
12度34分56.7秒(12°34′56.7″)を表します。


ブール定数

True は1、Falseは0と予め定数定義されています。




■APLコンパイラーの使い方

Aplc.exeは単独で動くWindowsベースの32ビットコンソールプログラムです。Windows95, Windows 
98,WindowsNT,Windows 2000上のMS-DOSプロンプトから走らせることができますが、純粋なMS-DOS
上やOEM版のMS-DOSマシン上では走らせることができません。

Aplc.exeはAPLソースコードをアドベンチャーバイナリー(.advファイル)に変換します。
コンパイラーは入力としてASCIIテキストを使用し、バイナリーファイルを出力します。

構文
APLC ≪options≫ ≪name1≫ [≪name2≫]

options
-eをoptionsに使用した場合は、コンパイルエラーが発生した場合は、標準エラーとは異なり、
ファイルに書き出されます。エラーが発生した時に書き出されるファイルは出力ファイル
(.adv)が書き出されるパスネームで拡張子が.errになります。エラーがなかった場合は、既存の
エラーファイルは削除されます。その為、Aplc.exeを走らせた時、エラーファイルの有無をコ
ンパイルが成功したかどうかの目安とする事ができます。

-qを使用した場合はcopyrightのバナーが出力されません。

name1
入力テキストファイルの名前を指定します。拡張子が指定されていない場合は.txtであるもの
として扱われます。name1にはマイナスサイン(-)が使用できます。この時はtextファイルの
替わりに標準入力が使用されます。この場合、name2が必ず指定されなければなりません。

name2
オプションです。出力ファイルの名前を指定します。name2が指定されなかった場合はname1
の名前が使用され拡張子は.advに変更されます。
(アドベンチャーファイルは必ず.advの拡張子となります。)

コンパイルが成功した場合は(DOSエラーレベルの)exit statusは0となります。コンパイル中に
エラーが発生した場合は該当のエラーメッセージが標準エラー又はファイルに書き出され出力
ファイル(.adv)は削除され、exit statusは1となります。


コンパイラーエラーメッセージ

以下の表にはAPLコンパイラー(Aplc.exe)が出す全ての構文エラーメッセージを示します。必要な部
分ではエラーメッセージの説明があります。

・Division by 0.
	ゼロ除算

・Duplicate label "%s".	
	ラベル名が重複している。行数は二つ目(またはそれ以上)のラベル%sが出てきた場所を示す。
	重複したラベル名は%sの部分に実際に使用された
	名前で表示される。

・Duplicate variable name "%s".   
	この名前の変数は既に宣言されている。重複した変数名は%sの部分に実際に使用された名前
	で表示される。

・ELSE with no IF.
	IFのないELSEが使用された。 

・ELSEIF found after ELSE.
	ELSEの後にELSEIFが見つかった。

・ELSEIF without matching IF.
	IFに対応しないELSEIFがある。

・ENDIF with no IF.
	IFに対応しないENDIFがある。

・ENDWHILE with no WHILE.
	WHILEがないENDWHILEがある。

・Extra characters on line.
	有効な命令語の後にコンパイラーが処理できない文字(列)がコンパイル後に残ってしまった。
	これは最初の部分のエラーがコンパイラーには誤ったコマンドとして認識された可能性のあ
	る込み入ったエラーかもしれない。

・FOR at line %d has no NEXT %s.  
	NEXTのないFORがある。
	%dはForコマンドが見つかった行番号を示す。%sはFORコマンドの制御変数を示す。

・GOSUB expected.
	OnCrash, OnStall, OnKeyコマンドに必要とされるGosubが見つからない。

・IF at line %d has no ENDIF.
	ENDIFのないIF文がある。%dはIFコマンドの行数を表す。

・Illegal character "%c". 
	%cで示される使用できない文字が使われている。

・Illegal character.
	ASCIIコードにない文字が使われている。

・Invalid coverage for this  cloud type
	Cloudコマンドで示されたタイプの雲にはcoverageキーワードは有効でない。

・Invalid number.
	その行にコンパイラーが評価できない数値がある。例えば、数字が入ってくると想定されて
	いる所に文字列が入ってきた場合や小数点が2つ以上ある数値の場合はこのエラーとなる。

・KEYPRESS expected.
	WaitコマンドにKeypressパラメータがない。このエラーはコンパイラーが時間数値とコンマ
	を見つけ、その行にkeypressパラメター以外が指定されていた場合やパラメターのスペルが
	違っていた場合にも発生する。

・Key specification expected.
	KV()関数が変数を理解できない。Key値の仕様を参照して下さい。

・Keyword expected.
	コンパイラーがキーワードを期待している時に、それ以外を見つけた。このエラーは句読点
	の付け間違いにより発生していることがある。

・Label name expected.
	コンパイラーがラベル名を期待している時にラベル名以外の語が見つかった。このエラーは
	句読点の付け間違い、または、ラベル名の誤りにより発生していることがある。ラベル名は
	アルファベットで始まり、アルファベット、数字、アンダースコアのみ使用できます。

・Line too long.
	一行が255文字超の長さになることは許容されていません。(また行中にCRやLF記号が含まれ
	ることも禁止されています。)

・Missing ")".
	この行には開始括弧の数が終了括弧の数より多くあります。括弧が閉じられていません。

・Missing label "%s" referenced at line %d.
	%d行にあるGoTo, GoSub, OnCrash, OnStall, OnKeyコマンドが参照している%sで示されるラ
	ベル名が見つかりません。 ラベル名の誤り及びラベル名の付け間違いをチェックして下さい。 

・NEXT variable does not match FOR.
	Forコマンドによって指定された変数はNextコマンドに指定された変数と対になっている必
	要があります。このエラーはNextコマンドがないか、スペルミスによっても発生します。

・NEXT without matching FOR.
	FORコマンドがないNEXTコマンドがあります。

・Only one TITLE per adventure.   
	TITLEが複数あります。

・Operand expected.
	コンパイラーは期待しているオペランド(変数や値、括弧内の式等)を見つけられません。こ
	のエラーは句読点の付け間違い、2つの演算子並んでいる時、または演算子で行が終了して
	いる場合に起こります。

・Quoted string expected. 
	このコマンドは引用符付き文字列を期待しています。このエラーは引用符を閉じていないケ
	ースでも起こります。

・String expected.
	Declare <変数> = ステートメントは引用符付きでない文字列を使用します。

・String in KV must be 1 character long.  
	KV()の変数が引用符付きの場合は一文字である必要があります。Key値の値の項目を参照し
	て下さい。

・Syntax error.
	構文エラー。句読点の間違いによっても発生します。

・System variable name "%s" reused.
	%sという名前の変数はフライトシミュレータでの既定変数(FS変数)であるか関数である為、
	使用できません。

・THEN expected.
 	IF文でTHENがありません。

・TITLE too long (limit is %d characters).
	TITLE名が長すぎます。TITLE名は63文字以内にして下さい。

・TO expected.
	TOコマンドがありません。

・Two ELSEs with same IF. 
	一つのIFに二つのELSEがあります。

・Unbalanced quotation marks.
	引用符が閉じられていません。

・Unknown key name "%s".
	KV()関数は%sをキーの名前として認識できません。%sは実際の文字である必要があります。

・Unrecognized command "%s".
	%sは認識できないコマンドの名前です。コマンドのスペルをチェックして下さい。

・Unrecognized keyword "%s".	
	%sは認識できないキーワードです。キーワードのスペルをチェックして下さい。

・Undeclared variable "%s".	
	%sは既定変数ではないか、宣言の行われていない変数です。変数は使用する前に必ず宣言さ
	れなければなりません。変数のスペルをチェックして下さい。

・Variable name expected.
	コンパイラーは変数名を見つけられませんでした。このエラーは句読点の付け間違いや変数
	名の付け方を間違えている時に発生します。
	変数名はアルファベットで始まり、アルファベット、数字、アンダースコアのみ使用できま
	す。

・WHILE at line %d has no ENDWHILE.
	%dの行にあるWHILEコマンドにはENDWHILEがありません。

・"(" expected.	
	括弧"(" がありません。

・")" expected.	
	括弧")" がありません。

・"," expected.	
	"," がありません。

・"=" expected.	
	"="がありません。

・TRUE or FALSE are reserved keywords.
	TRUEとFALSEは組み込み定数である為、変数名として宣言する事はできません。 




■コマンドの構文と意味


キー値の仕様

Key値(Onkey命令の変数やKey変数の値として仕様される)は各キーの内部的な値で整数で与え
られます。ここではAPLでこの値がどの様に使われるかを説明します。
APLでは、KV()関数をKeyの値を示すのに使用します。KV()関数は他の関数と異なり、通常の
数値ではなく特別のキーワードを組み合わせて使用します。また引用符も使用できます。
KV()の引数には以下の表に含まれるキーワードを使用できます。

Keyword         説明

ALT             ALT key pressed.
CTRL            CTRL key pressed.
SHIFT           SHIFT key pressed.

実際のキーは引用符付きのASCII文字または名前で示されるASCII以外のキーで特定できます。
ASCII文字が引用符付きで使用された場合はそのキーがSHIFT付きであることを示します。

KV()関数が認識するキーの名前は次の表に示されています。
キーの名前              キーの場所

KeyPad0-KeyPad9         Numeric keypad keys.
KeyPadPeriod            Numeric keypad period (.), or DEL, key.
F1-12                   Function keys.

例えば、KV(CTRL+KeyPad9)はCTRL+PgUpを、KV(SHIFT+Q )はSHIFT+QをKV(CTRL+ALT+F1)は
ALT+CTRL+F1を示します。

Note: 内部テスト以外では、アドベンチャーの内部キー値を明示的に使用するのは避けるべ
きです。


イベント起動プログラミング

イベント起動プログラムとはAPLによる明示的なサブルーチンコールがなく、あるイベント
が発生するとそれを引き金にしてサブルーチンがコールされることを意味します。この引き
金になるイベントが発生した時に実行されるサブルーチンをイベントハンドラーと呼びます。

イベント起動プログラミングの一番の有利さは、開発者が繰り返し特定条件を判別し、サブ
ルーチンをコールするループを記述する必要が無く、システムが条件をチェックし、イベン
トが発生すれば、自動的にサブルーチンがコールされるという点にあります。いくつかの条
件が同時にチェックされなければならない場合(例えば、飛行機が正しい針路、高度、位置に
あるかの判別のチェックのようなケースです。)、通常のコードでは管理しきれなくなりま
す。APLでは、イベント起動プログラミングにより通常のプログラミングに比べより管理しや
すくなります。なぜなら、イベントの発生判断がフライトシミュレータの内部状態と緊密に
シンクロしており、かつイベントハンドラーが特別のサブルーチンであるからです。

Onexp_True、Onexp_Bool_Change、Onexp_Changeの三つのAPLコマンドがイベントハンドラー
と共にイベント起動条件に連動しています。これらのコマンドが起動される条件や定義につ
いては各々のコマンド項目を参照して下さい。 これらのコマンドの一つが見つかった時には、
イベントリストにイベント情報が追加されます。 フライトシミュレータがAPLインタープリ
ターをコールする時は、インタープリターが停止していなければ、いつでも、イベントリス
トは参照され、イベント起動条件がチェックされます。もし、イベントが起動されれば、適
切なイベントハンドラーが特別のサブルーチンとしてコールされます。

必要がなくなればエベントリストからOnexp_Clearコマンドでイベントを外す事もできます。


特別のサブルーチンの使用方法

OnCrash、OnStall、OnKeyコマンド等(イベント起動コマンド)を使用する場合は、特定のイベ
ントが起動された時に、コールされる特別のサブルーチンの為のポインターをセットする必
要があります。 これら特別のサブルーチンはフライトシミュレータが起動されたらいつでも
使用される可能性があります。しかし、この特別のサブルーチンは一度には一つしか起動で
きません。例えば、OnKeyルーチン実行中にストールが発生した場合は、OnStallルーチンは
コールされません。(OnKeyルーチンの終了後、なお、ストールしていればOnStallルーチンは
コールされます。)

特別のサブルーチンがコールされた時には、そのリターンアドレスはGoSubコマンドが実行さ
れた時と同様にスタックにストアされます。そして、リターンコマンドによってリターンア
ドレスが戻されるまでの間、特別のサブルーチンが動き続けます。
もし、特別のサブルーチンが更にサブルーチンをコールしている場合、このコールされたサ
ブルーチンは特別のサブルーチンの一部であると解釈されます。APLインタープリターは特別
のサブルーチンが終了するまでコントロールをフライトシミュレータに戻しません。

特別のサブルーチンがコールされた場合:
・      フライトシミュレータが命令を通常通りに実行している間、特別のサブルーチンが
        コールされていない時はリターンアドレスは実行されるべき次のコマンドを示します。
・      Waitコマンド実行中だった時は、特別のサブルーチンが終了後、それがコールされた
        時点のWAITコマンドが戻されます。従って、待機時間は最初のWAITコマンドが発行
        されてからの通算になります。 Wait Keypressの場合は特定キーが押されるのを待つ
        ことになります。

特別のサブルーチンはフライトシミュレータに制御を戻すことなく実行される為、フライト
シミュレータがインタープリターを起動して10000命令がすぎた段階でアドベンチャーは終了
させられます。




■FS2000での天候の使用方法。

FS2000では天候システムがFS98から大幅に変更されました。ユーザーはローカルやグローバ
ルな天候が色々な視点からみて制御を行いやすくなっています。
フライト(FLT)ファイルをセーブした時、フライトシミュレータはフライトファイルと関連し
た天候情報の詳細を収録している天候(WX)ファイルを生成します。

このバージョンのAPLはこれらの新しい天候機能に対するアクセス手段を提供しておりません。
APLはFS2000の天候エリアを設定できますが、新しい天候システムでは設定はグローバルなも
のとして読み替えられます。従って、APLを使用してローカルな天候設定を行なう事はできな
くなりました。それに加えて、Internetからリアルタイムの天候をダウンロードする機能は
APLではサポートされておりません。
従って、FS98で利用できた天候コマンドやFS変数は未だ(制約の元で)サポートされてはいる
もののその内容はこのドキュメントの中では触れられておりませんし、アドベンチャーやレ
ッスンでの使用については使用されないようお勧めします。それに代わってアドベンチャー
で使用される核となるFLTファイルで全ての天候条件を予め設定しておき、WXファイルとして
FLTファイルと一緒に使用される事をお勧めします。


Note: アドベンチャー内でATISを使用しないで下さい。
多くの既存のアドベンチャーではユーザーがATIS周波数に無線を合わせた時にATIS音声を再
生する独自のATISシステムが用意されています。これらの機能はフライトシミュレータのど
のサブシステムとも関係なく実現されています。この為、派生的にアドベンチャーが動作し
ている間はFS2000のATIS機能は停止されています。そうした事から、アドベンチャー内でフ
ライトシミュレータのATIS機能は使用しないで下さい。




BACK TO MAIN INDEX BACK TO SDK INDEX
Last Update 2000/2/18