APLC32ユーザーガイド(日本語訳)

■APLC32 V1.25 Users Guide
■APLC32 V1.24 FS98 Information


■APLC32 V1.25 Users Guide
Copyright 1996-98, Martin H. Smith. All rights reserved.

日本語訳 SAKI(VYA04610@nifty.ne.jp)
1.00■はじめに
2.00■初心者はこちらから
3.00■必要となるシステム環境
4.00■インストール/アンインストール
5.00■使用言語について
5.01■演算子の優先順位
5.02■語彙の制約
5.03■変数
5.04■予約語
5.05■ビット演算と小数点以下の数
5.06■括弧つきリスト
6.00■APLC32の拡張機能
6.01■バージョンチェック
6.02■Pragmaコマンド
6.03■新しいコマンド
6.04■FS95/98の新機能
6.05■FS98で変更されたコマンド
6.06■新しいFS組み込み変数
6.07■FS98での新しいFS組み込み変数(6.6以外のもの)
6.08■FS98で使える様になった新しい関数
6.09■FS98で使えなくなったシステム変数
6.10■FS98の新しいファシリティー
6.11■出力ディレクトリーオプション
6.12■プロシージャー
6.13■ユーザー関数
6.14■ファイルインクルード
6.15■文字列変数
6.16■文字列変数の内部構造
6.17■音声文字列プレイコマンド
6.18■プレイグループ
7.00■サンプルコンパイル
8.00■APLC32のコンパイルオプション
9.00■Flight ShopのATC WorkShopでAPLC32を使用する方法
10.00■古いファイルの変換
11.00■コンパイルのフェーズ
12.00■著作権と法律上の問題
13.00■コンタクト先
14.00■FAQs
15.00■WWW Links
16.00■技術的な補足事項
17.00■修正履歴

 
1.00■はじめに

APLC32はFlight Shopに付属のaplc.exeプログラムを置き換えるプログラムです。
このプログラムはAPLCでコンパイルされるものと同一の言語ソースをコンパイル
しますが、FS95やFS98でも使用可能なアドベンチャーファイルを作成できます。

バージョン1.22からFS5.1フォーマットのアドベンチャーも作成できるようになり
ました。しかしながら、このファイルフォーマットでは64Kバイトまでという制約
があり、またFS5.1でアドベンチャーを実行する時にはFlight Shopが必要である事
は覚えておく必要があります。これについては、別の文書に詳細が記述されています。

もし、あなたがシェアウェアやアドベンチャーを自動作成するフライトプランナー
や類似のソフトを商業目的で作成している開発者で、ユーザーサポートの為、私の
サポートを必要する場合は、まず私にその正規のソフトパッケージを送付するよう
にして下さい。私はそれらのパッケージの全てを購入するつもりは全然ありません
から。

APLC32はFS5用のバイナリーアドベンチャーファイルから新しいフォーマットに変換
するよりも高い品質のアドベンチャーファイルを作成することを目的に開発されまし
た。

また、64Kバイト以上のサイズのADVファイルが作成できます。ただし、FS6がこ
の64Kバイト以上の大きさのファイルをどの様に扱うかという点については保証する
ことはできません。これはコードが如何にうまく作成されているかにもよるからです。

APLC32はFlight ShopのATC WorkShopで使用でき、指定されたオプションでコンパ
イルを行うことができますが、FSFSアドベンチャーソースファイルを扱うことを
主目的に作成されたものでは無い事に留意して下さい。これはFS5とFS6ではアドベ
ンチャードライバーに変更が加えられており、この変換が100%成功するとは限らな
い為です。

このプログラムは.ADVファイルの分析によって開発されたもので、私の作成した
FS6ADVアドベンチャーコンバーターの派生品といってよいでしょう。フライトシ
ミュレータやFlight Shopに付属の実行ファイルをディスアセンブルした結果では
ありません。私はあえて不完全になるとしてもその様な事を行うことを避けています。

このプログラムの開発には非常に多くの労力をついやしましたが、見落としを避け
ることはできません。各々のバージョンはリリース前に以前に行った全てのテスト
を使用して確認テストを行っていますので以前よりよくなっているとは言えるで
しょう。

 
2.00■初心者はこちらから

私はフライトシミュエータとアドベンチャーの関係についてよくわからないという
メールをたくさん頂きます。もし、あなたが初心者の場合は、これを御読みくださ
い。そうでない場合は読み飛ばして頂いて結構です。


アドベンチャーとは何ですか?

アドベンチャーはフライトシミュレータの一部として動作する小さなプログラムで
す。このプログラムはシミュレーション環境の状態を読んだり、場合によっては(天
候条件などを)変更したりします。
また、アドベンチャーは実際の航空管制や無線通信をシミュレートすることにより、
よりインターラクティブな飛行を実現します。

もし、あなたがフライトシミュレータの初心者で「FSを買ってきました。離陸と飛
行は行えますが、すぐ墜落してしまいます。」といった状態であれば、まずATC(航空
管制)アドベンチャーを是非試して下さい。色々な種類の良く出来たチャレンジ(A点
からB点に飛んで着陸する)やストラクチャー(特定の高度を特定の針路で飛ぶ)があ
ります。これはInternetで入手できますし、色々な会社から市販もされています。


なぜ、コンパイラーが必要なのですか?

アドベンチャーは.ADVという拡張子でバイナリーファイルとして収められています。
アドベンチャーはCとBasicから形式を借りてきた言語で書かれておりフライト
シミュレータで使用する前には必ずコンパイルされなければなりません。
これがAPLC32の仕事です。アドベンチャー言語ソースが書かれたテキストファイル
を入力し、フライトシミュレータ用のバイナリーファイルを出力します。


XXXXXXXというソフトはどう使えば良いのですか?

申し訳ありませんが、異なるフライトプランニングソフトは異なるやり方で動作し
ます。この為、明確にAPLC32に関係した問題以外のこの種の質問には答えられません。
フリーウェアに関するものでは、Internet上に数百もの参考資料がありますし、
もしそのソフトを買われたのでしたら、製造元に照会してください。


自分でアドベンチャーを作成できますか?

できます。その為には自分でプログラムを作らなければなりません。もし、複雑な
フライトプランを扱おうとした場合、ナビゲーション(航法)についてやり方と計算
方法についても知らなくてはなりません。
例えば、Flight Shopで6から7の地点を経由するアドベンチャーの場合、3600行もの
ソーステキストが必要になります。

多くの人はもっと簡単に作成する為にフライトプランニングソフトを使用していま
す。このソフトはあなたに代わって必要な計算をやってくれます。もし、それでも
APLC32を使用したい時には、LINKSにある色々な参照サイトを見ながら作成して
下さい。


私はFS95を持っていますが、FS98にグレードアップする必要はありますか?

これは、少し慎重に考える必要のある問題です。それでも、もしあなたが、良い
グラフィックアクセレレータ(ビデオカード)やフォースフィードバック付きのジョ
イスティックをお持ちの場合、FS98へのアップグレードを真剣に考えられた方が良
いでしょう。良いビデオカードを持っていればフレームレートの改善、より精細な
解像度、深みのある色合いという得難い果実を得ることができますし、それによっ
て飛行時間そのものが変わってくるでしょう。また、FS95は3Dビデオカードの恩恵
をうけることができません。

FS98では、過去のバージョンになかった色々な修正が加えられていますし、改善さ
れたエアポートディレクトリーといった使いやすい新機能も追加されています。

 
3.00■必要となるシステム環境

32ビットWindowsアプリケーションが稼動する環境が必要です。もし、現在FS95か
FS98が動いているようであれば、それで充分です。

アドベンチャーを使用するにはFS95またはFS98を導入する必要があります。更に、
Microsoftアドベンチャーコンバータをダウンロードし、導入することによって、
それに含まれるアドベンチャードライバーのパッチを当てておく必要があります。
これはFS95及びFS98双方に共通です。

もし、あなたがアドベンチャーでサウンドを聞きたい時は、Microsoftからaafwav.zip
もダウンロードする必要があります。FSFSをインストールしている場合も同様です。
さもないと、サウンドが歪んだり、聞くに堪えないものになってしまいます。

もし、ATC workshopでアドベンチャーを作りたい場合は、Flight Shopを購入し、
導入する必要があります。また、アドベンチャーファイルを作成する他のフライト
プランナーソフトを使用することもできます。例えば、Flightplanner 4.0 は
フリーウェアですが、ユーザーインターフェイスが素晴らしく、そのホームページ
からダウンロードできます。WWW Linksの項目にURLが記載されています。

Flightplanner 4.0 は現状では、音声のでるアドベンチャーを作成することができ
ません。その様なアドベンチャーを作成したい方はApproach Controllerを試して
下さい。このプログラムもフリーウェアで音声付きのアドベンチャーを作成可能です。
推薦します。 

Approach Controller はflightsim.com等のアーカイブサイトから入手できます。
もし、見つけることができなければ、rec.aviation.simulatorsでたずねる様に
して下さい。くれぐれも私に尋ねないで下さい。現状のApproach Controllerの
バージョンは1.32です。これには別のパッチファイルがあります。

 
4.00■インストール/アンインストール

この文書を読まれるのに使用された様に新しいウインドウ インストーラーが用意
されています。
インストールに際し、貴方が指定したディレクトリー、もしくは、システムにFS95
またはFS98が存在する場合は一番新しいフライトシミュレータのADVディレクトリー
にAPLC32.EXEはコピーされます。
いくつかのフライトプランニングソフトでは、APLC32.EXEがそこにあるものと想定
されています。どちらのバージョンのフライトシミュレータもシステムにない場合
は警告メッセージがでますが、インストールそのものは正常に進行します。

APLC32を導入する時にはデフォルト以外にも特定のディレクトリーを指定すること
もできます。バージョンアップの際には、そのディレクトリーがデフォルトになり
ます。バージョンアップの際にはデフォルトでは、常に既存のAPLC32は上書きされ
ます。最初に以前のバージョンをアンインストールすることもできますが、通常、
上書きするのが安全であろうと思われるからです。

APLC32をアンインスールする場合はWIN95やNT4+の場合はコントロールパネルの「ア
プリケーションの追加と削除」を使用します。また、NT3.51の場合はプログラムグル
ープに作成されるアンインストールアイコンを使用します。


 
5.00■使用言語について

ソースを記述する言語についてはFSFSのドキュメントを参照しなくてはなりません。
ここでは、その様な長い解説は行いません。FSFSのマニュアルは著作権で保護され
ていますので、ここでこれを書き直したりするつもりもありません。

もし、どなたか、アドベンチャープログラムの記述の仕方の入門書やレファレンス
を書かれるのでしたらお好きなようにしてください。
ここでは、違いや新機能について記述します。

また、最近、Ernest K. Alston氏がアドベンチャープログラミングについて書かれ
たものをオンラインで見る事ができます。そのURLはこの文書のWWW LINKセクション
を参照してください。
 
 
5.01■演算子の優先順位

FS5とFS6のアドベンチャーで使用するソース言語はFSFSのドキュメント中では
非公式(あるいは不明瞭)なものでした。この為、公式の文法が作成された時にも
あいまいさが残ってしまいました。

APLC32を作成する上で演算子の優先順位についてC言語をモデルにしましたが、
これは元々のドキュメントに明示的には書かれていませんでした。従って、
複雑な式の場合、オリジナルのAPLCと正確に同じ結果がでるかどうかは保証できま
せん。

この言語では、ビット演算については、C言語での場合よりも高い優先順位が与え
られていることがその後分かりましたので、この点で演算結果が異なる可能性が有
ります。これについての私のアドバイスとしては、第一に、ビット論理演算を含む
式は必ず括弧書きすること。また、第二は、本当にそういう演算が必要かどうかを
確かめることです。コードサイズに制限がなくなった32ビット環境ではビット単位
のフラグを使用しなければならない必要性は非常に小さくなりました。

 
5.02■語彙の制約

入力行の長さについての制限が緩和されました。現在、一行には2048文字までが、
また一語の長さは512文字までが許容されています。

その他の制約としては、コンパイル時のフリーメモリーに関するものだけです。式
の複雑さに関しては特に制約はありません。ネストの深さについても同様です。出
力コードサイズ等についても同じです。実行時間については、これはAPLC32という
よりフライトシミュレータによるものです。

 
5.03■変数

APLC32では問題解析を容易にするため、アサインされていなかったり、参照されて
いない変数についてのエラーメッセージが追加されました。これが多くの人を混乱
させるようです。メッセージが'Warning' であればそれは、アドベンチャーに一つ
以上の問題があることを意味しますが、アドベンチャーのコンパイルは継続されま
す。

一文字の変数を宣言することは、それが一回だけ行われるならば、もはやエラーで
はなくなりました。このエラーメッセージは私には古いコンパイラーの中で特に非
論理的だと思われるものでした。

 
5.04■予約語

言語に関する限りある特定の言葉が特定の合言葉である場合は予約語として扱われ
ます。例えば、APLCではSHIFTという名の変数を使用することができますがAPLC32
ではこれは予約語となります。これはKV機能の独立変数として使用される為です。
言語設計者として私はこれはバグであるとは思いません。予約語を変数に使用され
ている場合に限りこれは悪いニュースです。

 
5.05■ビット演算と小数点以下の数

ビット演算を小数点以下の数の計算に使用することは止めて下さい。古いFS5の表
現では固定小数点数の計算は有効でしたが、FS6の分数では倍精度の浮動小数点数
としてストアされます。この為、特定ビットに単純にマッピングすることができ
なくなったことからビット計算ができなくなりました。

 
5.06■括弧つきリスト

APLCコンパイラーでは括弧付きの表現を認めていたという指摘がありました。必ず
しも明示されていた訳ありませんがSETPOSITION(x,y,z) の様な表現は許容された
というものです。

私はこのオプションを付けることは間違いであると思います。これにより括弧が括
弧付きリストの一部なのか、式の一部なのか判然としなくなる為、文法的な混乱を
招くからです。

上記の様な表現を許容することにより、他の文法的に正しい表現を拒絶しなくては
ならなくなってしまいます。例えば、次のような式を古いAPLCに読ませることで、
私が意味する処をご理解頂けると思います。

SETPOSITION (x +2) * 3,y,z
SETPOSITION (x+1),y,z


 
6.00■APLC32の拡張機能

6.01■バージョンチェック

APLC32でコンパイルされたかどうか、また、どのバージョンで処理されたかが分
かるようになりました。

この機能を使う場合はAPLC32_VERSION変数をアドベンチャーソースのどこかに通
常の形で宣言して下さい。

そのアドベンチャーがAPLCでコンパイルされており、FS5上またはマイクロソフト
のコンバータでアドベンチャーがFS6用にコンバートされていれば、アドベンチャ
ーのスタート時、この変数は0になります。

アドベンチャーがAPLC32でコンパイルされている場合は、この変数はバージョンナ
ンバーを示す数字になります。例えば、version1.10の時、この値には110がセット
されます。この変数にはあなたが指定した違う数字を入れることもできます。

例えば、次のコードは最新のバージョンであるかをチェックします。この場合、こ
のチェックが入っていないと本当に以前のバージョンであるかチェックできないこ
とに注意してください。

DECLARE aplc32_version

IF aplc32_version > 0 AND aplc32_version < 125 THEN
	PRINT_TIME 5
	PRINT "You need to upgrade your copy of APLC32"
	WAIT 5
	END
ENDIF

 
6.02■Pragmaコマンド

私は、このソースファイルに埋め込まれたコンパイラーコマンドの名前をC++から
借りてきました。
私は古いAPLCにはコメントになるようなフォーマットを使用しましたので、APLCで
は無視されるだけです。プログラムの発展によって、より多くのpragmaコマンドが
追加されることを期待しています。

ご注意:このメカニズムは特別な効果を達成する為に上級アドベンチャープログラ
マーが使用することを想定しています。もし、あなたがこのメカニズムを理解して
いないならば、使わない様にして下さい。

pragmaコマンドを使用する場合は正確に以下のフォーマットでソースコードにコメ
ントを記入して下さい。追加のスペースを入れても、スペースを削除してもいけま
せん。とりわけセミコロンとキーワードPRAGMAの間にスペースがあってはいけませ
ん。大文字、小文字、またはその混在が使用できます。

;PRAGMA keyword option

現在、使用できるキーワードはWEATHER_ALTITUDESとWARNINGSです。

;PRAGMA WEATHER_ALTITUDES FEET
;PRAGMA WEATHER_ALTITUDES METRES

これは、clouds / winds / temperatureレイヤーの高度の指定単位を コマンドラ
インの-aオプションを置き換えて指定することができます。

;PRAGMA WARNINGS OFF
;PRAGMA WARNINGS ON

これは、コンパイルコードの-wオプションを変更します。WARNINGS OFFにより、
ワーニングが出る部分であってもコンパイラーはワーニングを出さなくなります。

 
6.03■新しいコマンド

このセクションでは、FSFSマニュアルには記載されていないが使用可能であるコマ
ンドをカバーしています。それらは拡張コマンドと考えられ、厳密なコードオプシ
ョンが適用された場合は使用できなくなります。これは、元々の言語ドキュメント
にない為、ユーザーコードで使用される変数との重複が懸念される為です。

PLAY_VIDEO "filename"

これは飛行レッスンでフライトシミュレータのフライトビデオで記録したビデオ
ファイルを再生するのに用いられます。ビデオ再生中はユーザー入力は不能にな
りますが、飛行機の位置等のデータは更新されます。

FS6と一緒に出荷された飛行レッスンはビデオ再生中であるかそうでないかを基本
的には教官モードであるかどうかでチェックします。
(以下のセクションを参照してください。)

私はこれが、フライトシミュレータの初心者の為の新しいレッスンを作成するのに
使用されることを期待しています。

 
6.04■FS95/98の新機能

FIX_TO_FIX_DISTANCE4(lat1, lon1, lat2, lon2)

GROUND_DISTANCEに似た数値を返す機能ですが、飛行機の現在位置から目的地まで
の距離の替わりに指定した2地点間の距離を返します。 

 
6.05■FS98で変更されたコマンド

WAITコマンドは1又は2ののパラメータ(2番目のパラメータはKEYPRESS)からなり
ますが、FS98では別のオプションが使える様になりました。WAIT MESSAGEが使用さ
れるとアドベンチャーはメッセージ出力の完了まで待ちに入ります。
書式は以下の様になります。

WAIT MESSAGE

 
6.06■新しいFS組み込み変数

FS6/FS98に付属のアドベンチャーを見るとFSFSにはなかったシステム組み込み変数
があるのが分かります。これらは現在FS98SDKの名前と同じになるよう名称変更が
おこなわれています。
この最初の変数はFS95及びFS98で共通に使用できます。

AIRSPEED_INDICATOR_TAS	Read / write	機体速度がIAS(0)またはTASであるかを指定。 
AUTO_COORDINATION	Read / write	オートコーディネーションのオン/オフ。
VOR_1_COURSE_DEVIATION	Read only	NAV1 OBS VOR/LOCからの偏差。
VOR_1_GS_DEVIATION	Read only	NAV1 OBS グライドスロープからの偏差。
APL_SOUND		Read / write	アドベンチャー音声のオン/オフ
APL_MESSAGES		Read / write	アドベンチャーメッセージ行のオン/オフ
INSTRUCTOR_CONTROL	Read only	飛行レッスンでの教官(1)か訓練生(0)かの選択

 
6.07■FS98での新しいFS組み込み変数 (6.6以外のもの)

ELAPSED_TIME		Read only	アドベンチャーがスタートしてからの時間(秒)
THROTTLE_1		Read / write	エンジン1のスロットル位置 (範囲 0.0 - 1.0)
THROTTLE_2		Read / write	エンジン2のスロットル位置 (範囲 0.0 - 1.0)
THROTTLE_3		Read / write	エンジン3のスロットル位置 (範囲 0.0 - 1.0)
THROTTLE_4		Read / write	エンジン4のスロットル位置 (範囲 0.0 - 1.0)
VOR_1_TO_FROM		Read only	VOR 1 to/from フラグ 
VOR_2_TO_FROM		Read only	VOR 2 to/from フラグ
ADF_BEARING		Read only	現在のADF方位
ENGINE_CONTROL_SELECT	Read / write	エンジンの選択 (bit 0 = E1, bit 1 = E1 etc.)
VOR_2_COURSE_DEVIATION	Read only	NAV2 OBSコースからの偏差
AIRSPEED_INDICATOR_FAIL	Read / write	速度計が故障しているかどうかを示す。
ALTIMETER_FAIL		Read / write	高度計が故障しているかどうかを示す。
ANGLE_OF_ATTACK		Read only	機体の迎え角
ATTITUDE_INDICATOR_FAIL	Read / write	姿勢指示器が故障しているかどうかを示す。
FLAPS_CONTROL		Read / write	フラップ位置
G_LOAD			Read only	機体にかかっているGの値
GEAR_FAIL		Read / write	着陸脚が故障しているかどうかを示す。
GEAR_CONTROL		Read / write	着陸脚の状態を示す。
HEADING_INDICATOR_FAIL	Read / write	方向指示器が故障しているかどうかを示す。
PANEL_LIGHTS		Read / write	パネルライトのオン、オフ
PANEL_LIGHTS_FAIL	Read / write	パネルライトが故障しているかどうかを示す。
STROBES			Read / write	ストロボのオン、オフ
STROBES_FAIL		Read / write	ストロボが故障しているかどうかを示す。
TURN_COORDINATOR_FAIL	Read / write       旋回傾斜計が故障しているかどうかを示す。
TURN_COORDINATOR_BALL	Read only	旋回傾斜計の位置を示す。
VERTICAL_SPEED_FAIL	Read / write	昇降計が故障しているかどうかを示す。
EVENT_COUNT		??????????	SDKには記載されていない。

ENGINE_CONTROL_SELECT変数はエンジンを選択する機能でこの変数だけではエンジ
ン故障にはなりません。プレイヤーに対し単にエンジンの選択をさせるだけの機能
です。ただし、この機能を使用してエンジン故障を実現することができます。エン
ジンを選択または解除の上で推力をゼロにし、プレーヤーが推力をあげても、推力
ゼロにするようループを設定すれば良いと思われます。
しかしながら、ENGINE_CONTROL_SELECT変数ではどのエンジンが生きているか、
また、そのエンジンの推力がどうなっているかはわかりません。

 
6.08■FS98で使える様になった新しい関数

INRANGE360(heading, min, max)

この関数はINRANGE関数と同じ様な働きをしますが、ヘッデイングと角度で示す点
が異なります。例えばINRANGE360(plane_heading, 100, 10)とすると、
100度から360度を経由して10度までの場合に1(真)を返し、11度から99度の場合は
0(偽)を返します。

 
6.09■FS98で使えなくなったシステム変数

ADF_RADIAL		Read only	あまり意味のない変数で、FS98で使用不可。

 
6.10■FS98の新しいファシリティー

(1) DEBUG_WINDOW と DEBUG_PRINTコマンドがFS98では使用できるようになりま
した。このコマンドはFS5 + FSFSでは使用できましたが、FS95では使えなくなっ
ていたものです。アドベンチャーのデバッグ補助ツールとして有効であり、別ウ
インドゥになったことで一層、使い勝手が良くなりました。

(2) ONEXP_TRUE condition GOSUB true_label [, false_label]

このコマンドで特定の条件の発生をモニターし、条件を満足する事象の発生都度定
期的に、指定したラベルへのGOSUBを実行させることができます。一度、この条件
が設定されると、他の割り込みなしにコールが実行されます。ラベルを2つ設定し
た場合は、最初のラベルは条件が真の時に、定期的にコールされ、二つ目のラベル
は条件が偽の時に実行されます。ラベルを一つだけ指定した場合は条件が真の時に
のみ、実行されます。

例えば、
ONEXP_TRUE NOT_COURSE_INRANGE(plane_heading, 20, 40) GOSUB offcourse
とした場合は、針路がレンジの値を外れた時にoffcourseがコールされることにな
ります。

なお、このコマンドの使用例はexamples\event.txtを参照して下さい。また、FS98
のみで使用可能な点、注意が必要です。

(3) ONEXP_BOOL_CHANGE condition GOSUB label1 [, label2]

このコマンドもイベントモニター(ある事象の発生をモニターする)コマンドの一つ
ですが、引数がブール値で、この引数の値の真から偽への変化によってラベルがコ
ールされます。

(4) ONEXP_CHANGE  condition GOSUB true_label

このコマンドは前のコマンドと似ていますが、サブルーチンが定期的にコールされ
るのではなく、モニターされている条件の値が変化された時に一度コールされます。

例えば
 ONEXP_CHANGE inrange(vor_1_obs, 100, 110) GOSUB on_label 
ではvor_1_obsの値が99から100に変わった時や110から111に変わった時にラベルが
コールされます。

(4) ONEXP_CLEAR [label]

このコマンドはイベントモニターを停止します。このコマンドに続くラベルはこの
コマンド以前に発行されたONEXP_TRUE, ONEXP_CHANGE or ONEXP_BOOL_CHANGE
コマンドの中でキャンセルするイベントを特定するのに使用します。ラベルを指定
しなかった場合は全てのイベントモニターがクリアーされます。

注意事項

現時点ではイベントハンドラーが一度に何個まで使用可能であるか、また、シミュ
レーションに悪影響を与えることを避ける為に行うべきでない事柄等の制約事項が
あるどうか、更には、アドベンチャーの実行スピードに与える影響等は不明です。

これらのファシリティーは将来変更となる可能性があります。これらの新ファシリ
ティーについて貴方の経験を報告して下さい。それによってこのガイドをより完全
なものにできます。
現時点では一度に非常に多くのイベントをオフにすることでFS98が不安定になるこ
とが分かっています。イベントハンドラーについては、その使用を最低限にするこ
とが賢明と思われます。

 
6.11 ■出力ディレクトリーオプション

バージョン1.14から追加されたオプションでAPLC32でコンパイルしたアドベンチャ
ーファイルをFS6のアドベンチャーディレクトリーに作成します。このオプション
をオンにするとシステムレジストリーにフラグがセットされます。コマンドライン
でディレクトリーが指定された場合は、このオプションに優先されます。

この機能を有効にするためにはDOSウインドウを立上げ、ディレクトリーをAPLC32
をインストールした場所に変更します。その次に APLC32 -fY コマンドをタイプ
して下さい。フラグがセットされたというメッセージが表示されます。これによって、
APLCソースを生成するプログラムやフライトプランナーがコンパイルを行った時は
ADVサブディレクトリーにADVファイルを作成するようになります。

このオプションは、オプションを無効にするコマンドが入力されない限り、それ以降
の全てのコンパイル時に適用されます。
オプションを無効にするコマンドは APLC32 -fNです。

この-fオプションは他のオプションやコンパイルと同時に指定することはできませ
ん。このオプションが実行されると同時にプログラムは終了し、メッセージが出力
されるので、重要な変更が行われたことがすぐ分かります。

もし、あなたがアドベンチャーのエンドユーザーである場合、コピーを自分で行う
様なフライトプランナーで障害が起こるのでなければ、このオプションをオンにし
ておかれることをお勧めします。
また、あなたが、アドベンチャーの開発者であるか、あるいは別の目的がある場合
にはオプションをオフにしておかれると良いでしょう。

ADVファイルの出力ディレクトリーはマイクロソフトのインストールプログラムが
設定したレジストリー及びその情報によって決定されます。これは、出力先がきち
んと設定される為にはFS6が正しくインストールされている必要があることを意味
します。

レジストリーのキーはHKEY_CURRENT_USERの下に作成されます。これは、あなたの
マシンを使用する一人一人に対して個別にセットされるということになります。
あなたがマルチユーザー環境のPCを使用していて、このオプション動かない時には
この事を思い出して下さい。また、このオプションが動かない時にはコンパイルに
使用したAPLC32が1.14以上であることも良く確認して下さい。
フライトプランナー等のソフトで古いバージョンのAPLC32を特別のディレクトリー
に確保し、使用していることが有ります。

FS98でこの機能を使う時やコマンドラインの替わりにOPTIONS.EXEを使用するに際し
ての追加情報はFS98.DOCを参照して下さい。

 
6.12■プロシージャー

V1.16からプロシジャー定義の機能を限られた形で導入しました。これにより、よ
り構造化されたコーディングを行う事が出来るようになりました。しかし、アドベ
ンチャーにこの機能を使用する場合はFS5では使用できなくなります。もっとも、
追加された構造体によって利益をうけるケースを考えれば、FS5用にコンパイル
するにはどのみち大きすぎるアドベンチャーであろうと思われますので、それ程、
大きな問題とはならないと思われます。

この機能を使用する場合はこのセクションを注意深く読んで下さい。FS6のアドベ
ンチャーランタイムプログラムの為、付けざるを得なかった制約事項がいくつかあ
ります。

プロシージャーは次の構文によって定義されます。

DEFINE PROCEDURE example(p1, p2, p3)

LOCAL v1, v2

statements forming procedure body .......

ENDDEFINE

DEFINE PROCEDURE に続き、名前を与える必要があります。上の例の場合は名前は
exampleになります。この名前はこれ以前に付けられたプロシージャー(や関数)の
名前や予約語と重複しないものである必要があります。変数やラベル名と同じ様に
名前が大文字か小文字かは区別しません。(EXAMPLEはexampleと同じです。)

プロシジャーは自分の名前域を持ちますので、ラベルやユーザー変数と同じ名前を
付けても構いませんが、潜在的に混乱の元になりますので、同じ名前をつけない方
がよいでしょう。

名前に続いて、プロシジャーの公式のパラメータリストを続けます。パラメータは
いくつであっても構いません。この例ではパラメータは三つあります。もしパラメ
ータがないプロシージャーの場合でも一対の()を明示的に記入しなければなりませ
ん。

プロシージャーではLOCALに続いていくつかの変数を宣言します。この変数の名前
は予約語と同じであってはならず、加えて、プロシジャーのパラメータと同じ名前
であってもいけません。

LOCAL文はいくつあっても構いませんし、プロシージャー定義のどこにあっても構
いませんが、LOCAL変数はプロシージャーの最初に置かれる様に、強くお勧めしま
す。これはグローバル変数を誤って参照しない為です。

LOCALによって作成された変数はプロシジャーの中でのみ参照され、同じ名前のグ
ローバル変数からは隠されます。これにより同じ名前のローカル変数を別の名前の
プロシージャーで用いても、競合が発生することはありません。これによってエラ
ーの減少が期待されます。
プロシージャーのパラメータは暗示的にそのプロシジャーローカルなものとなります

プロシジャー本体の終わりには暗示的にRETURNが存在しますのでRETURNを記述する
必要はありません。プロシジャーの中には複数のRETURNを置くことができます。
その様なスタイルのコードはお勧めしませんが、そうするかどうかはあなた次第で
す。

ネストされたプロシージャーを宣言することもできますが、そうすることの意味は
ないと思われます。たとえ、他のプロシジャーの内部で宣言されたものであっても、
全てのプロシージャーとユーザー関数の名前はグローバルに宣言されます

非常に重要な注意事項

FS6はADVランタイムプログラムにスタックフレームを与える方法を用意していませ
ん。これは、帰納回帰的な機能をコーディングし、何度回帰的にコールされても各
々のプロシジャーは一対のローカル変数しかもたないということになります。もし、
この説明の意味が理解できない場合は帰納回帰的なプロシージャーを明示的にも暗
示的にも書かない様にして下さい。また、そうした場合の結果についても驚かない
ようにして下さい。

ENDDEFINE までのステートメントがプロシジャー本体になります。ADVランタイム
プログラムはDEFINE PROCEDUREまできた時には、コード上にプロシージャー定義部分
がないかの様に振舞います。
言い換えれば、誤ってプロシジャー部分に落ち込むことはありません。
 
プロシジャー内部で定義されたラベルは通常とは異なった取り扱いになります。
これらのラベル名はプロシージャー内部でのみ有効で、プロシージャーはプロシー
ジャーの外で定義されたラベル名を見る事ができません。これは以下の2つの重要
な結果を導きます。

(1)プロシージャーの中、または外からGOTOやGOSUBで入ったり、出たりすることが
できない。これにより、ブロック構造が強化され、エラーを防ぐことができる。
(2)異なるプロシージャーで同じラベル名を使用することができる。

プロシージャーの呼び出しにはプロシージャー名と実際のパラメータ引数を括弧
付きで指定します。全てのパラメータは値を引き渡しますのでプロシジャー内で
パラメータの値を変更してもメインプログラムの値にはなんら影響を与えません。
幾人かの方はこれを制約と受け取るでしょうが、これによりエラーが見つけにくく
なる原因を除去することができます。指定するパラメータの数はプロシージャーで
定義したパラメータの数と同じである必要があります。そうでない場合はエラーと
なります。

上記のプロシージャーを呼び出す場合は次の様なコードを書くことになるでしょう。

example(10, (x + 5) / 2, autopilot_altitude)

プロシージャー(と以下に述べるユーザー関数)は、プログラムの中に定義があれば、
定義した部分の前の場所でコールすることができます。INCLUDE機能と同時に使用す
ること及び、定義の実行時の振舞いから、メインプログラムの前でも後でもプロシ
ージャー定義をプログラムの中で配置することができます。

 
6.13■ユーザー関数

APLC32では制約が多い内容ですがユーザー関数を定義することができます。この制
約はわずらわしいものですが、ADVランタイムプログラムの機能上の制約の下では
一番ましなものと考えて下さい。繰り返しますが、この機能を使用される前にこの
セクションを読み通して下さい。

ユーザー関数はプロシージャーと殆ど同じ様に定義します。違いはDEFINE FUNCTION
という宣言とコールに対し値を返す場所の違いだけです。下の例が関数とプロシジ
ャーの違いをより複雑にしてくれるでしょう。

DEFINE FUNCTION lbtokg(X)
	RETURN X / 2.22
ENDDEFINE

関数の中の計算を気にする必要はありません。条件付きのステートマントを指定す
ることもできます。

プロシジャーの場合と同様にパラメータはいくつでも使用できます。また、それら
は暗示的にユーザー関数内でLOCALなものになります。プロシージャーの時と同様、
コールする時の引数は定義した数と同じでなければなりません。

LOCALな変数をユーザー関数内で作ることができる点もプロシージャーと同様です。

RETURNをユーザー関数定義外の表現(訳注:ラベル名や変数名か?)と共に使用すると
エラーになります。

ユーザー関数定義にRETURN文がないときにはエラーになります。

警告
もし、ユーザー関数の制御構造で、RETURNを通らないパスを作った場合、エラー
メッセージはでませんが、コールした結果は 定義なし となるので気をつけて下
さい。例えば以下の例はバグになります。

DEFINE FUNCTION wrong()

	IF 1 = 0 THEN
		RETURN 99
	ENDIF

	; leaving function without returning anything

ENDDEFINE

ユーザー関数をコールする場合は、少々不器用な構文になります。これはプロ
シージャーとユーザー関数に異なる名前域を割り当てる為であり、また、より
一般的な表現を割り当てる方法がないからでもあります。

variable = FUNCTION lbtokg(10)

コールの中にはFUNCTIONというキーワードが必ずなくてはなりません。また、
パラメータリストの括弧を閉じた後には、なにも付け加えてもいけません。別の
言葉で言えば、ユーザー関数のコールはより大きな表現の一部であってはいけま
せん。あなたは、事前のチェックで、この表現上の制約を乗り越えないとなりま
せん。

これが、大きな制約であることは承知していますし、格好が悪いことも承知してい
ます。ただ、ADVランタイムがコントロールフローと表現解釈を厳密に区分してい
る為、これ以外の方法を見つける事ができませんでした。

本当に重要な注意事項
プロシージャーの注意事項で述べた帰納回帰的なコーディングに対する注意はここ
でも、全く同様に適用されます。もし、あなたが回帰的にパラメータやローカル変
数を使用した場合には、まず確実に思った通りに動作することは期待できません。

これらのプロシージャーやユーザー関数を使用する事により、より分かりやすいコ
ードを書くことができます。見えない処では、以前は手作業でコードしていたのと
同じ様な一時的な変数の割り当て作業が行われています。しかしながら、コンパイ
ラーがうまく動作している限り、その様な問題はエラーが入り込むことなく実行さ
れています。

プロシジャーを使用することでパフォーマンス面では若干のインパクトがあり、ま
た、アドベンチャーファイルは多少大きくなりますが、コードは一層読みやすくな
ります。

 
6.14■ファイルインクルード

APLC32には簡単なファイルインクルード機能があります。

INCLUDE "filename"

このコーディングにより、filenameに示されたファイルの内容が移し込まれます。
ファイルのサーチは以下の順番で行われます。

(1)APLC32が実行されている時のカレントディレクトリー
(2)カレントディレクトリーが含まれているディレクトリー
(3)APLC32がインストールされているディレクトリー 
(4)FS98がインストールされている時はそれに含まれているサブディレクトリー
(5)FS95がインストールされている時はそれに含まれているサブディレクトリー

コマンドラインでの指定と異なりインクルードするファイル名は.TXTがデフォルト
とはなっておらず、拡張子を含め明示的に指定する必要があります。

例えば、あなたがFS6を E:\GAMES\FS6 にインストールしていた場合は、
E:\GAMES\FS6\Include\test\wibble.txt を"test\wibble.txt"として
インクルードできます。また、その名前のファイルが他の場所にもなければエラー
になります。 

ファイル指定時にはWindowsまたはUNIXのパス指定文字をファイル名と一緒に使用
することができます。言い換えれば"test/wibble.txt"と"test\wibble.txt"
は同じファイルを示します。 

全ての警告及びエラーメッセージは問題が発生したファイル名とそのファイルの中
の行番号に置き換えられます。

INCLUDEコマンドはネストすることができます。何段階のネストが可能であるかは
WINDOWSが同時に実行可能な実行形式の数に依存します。15段階程度までは可能で
すが、そうする事はあまり賢いやり方とは言えないでしょう。

この機能の主な目的はライブラリーから目的とコードが確立されているプロシージ
ャー定義を使用出来るようにすることです。

もし、あなたが一般的な目的の為のプロシージャーやユーザー定義関数を作られた
時は、是非御送り下さい。それによって次のバージョンに実装するユーティリティ
ライブラリーを作り上げることができます。御送り頂いたAPLコードはソース形態
としてフリーウェアとして無制限に分配されるか、又は私が承認した組織によりデ
ィスクまたはCD-ROM形式で配布されることになります。
コードを送付頂く事はこの条件を承認したものとみなされます。ソースにある貴方
の名前等はファイル上においてそのまま残され、コードに対する著作権もそのまま
残ります。

もし、あなたが、アドベンチャー作成プログラムを開発されており、私の提案した
インクルード機能を使用したい場合は、標準ライブライーを上記の特定のプロダク
トサブディレクトリーに設定し、ソースコード上は"product/whatever.txt" と
コーディングするようにすれば良いでしょう。

 
6.15■文字列変数

今まで、何人もの方からの問い合わせにADVランタイムの機能上の制約があって文
字列変数はサポートできないと回答してきましたが、なんとか擬似的な文字列変数
を実現できました。この機能にはADVランタイム上の制約の中で通常文字列変数に
期待されている機能が実現されていると思います。

この機能を使用される前にこのセクション(と技術的な内容については次のセクシ
ョン)をお読み下さい。この機能を使用される場合の制約はいつもの通りFS6
ADVランタイムの機能上の制約に関連して発生したものです。FS6のソースコードを
2時間でも読めればと思います。(そしたら修正できるのに。)

文字列変数は名前の最後に昔懐かしい$サインをつけることで識別されます。これら
はDECLAREまたは、 LOCAL文によって作成され、プロシージャーやユーザー関数のパ
ラメータにも使用する事ができます。 

文字列変数を使用することで以下のたった4つのことができるようになります。
(1)文字列を変数にアサインすること。
(2)他の文字列変数をその文字列変数にアサインすること。
(3)プロシージャーやユーザー関数のパラメータとしてその文字列を引き渡したり
受け取ること。
(4)PRINT_STRING, SCROLL_STRING, PLAY_STRINGの新コマンドを使用して文字列
変数にアクセスすること。 

4つの使い方の使用例は下記の通り。

my_string$ = "wibble"
my_string$ = my_other_string$
my_procedure(my_string$, 4)
PRINT_STRING my_string$

PRINT_STRING, SCROLL_STRING, PLAY_STRINGコマンドはたった一つの文字列変数
を引数としています。 文字列を表示する場合、改行することはできません。
その替わり、PRINTコマンドにはコンマで続ける機能があります。

文字と数値には明確な形式上の相違があります。この二つを混ぜ合わせてアサイン
したり、プロシージャーやユーザー関数の引数に使用するとエラーになります。

文字列を戻すユーザー関数を作成することはできません。言語的に、文字列操作の
命令子がありませんので、そうされても意味がありません。

文字列機能の使用例は配布された圧縮ファイルにprocstr.txtの名前で入っています。

 
6.16■文字列変数の内部構造

文字列変数が内部でどの様に扱われているかを知る事で、この機能の制約を説明す
ることができこの機能の不都合な部分を知る事ができます。

文字列変数の右側にアサインされたり、プロシージャーやユーザー関数のコール
パラメータとして与えられたソースコード上の個々の文字列は識別番号を与えられ
文字列テーブルに収納されます。

コンパイラーに関する限り、ここで文字列の割り当ては数値の割り当てに替わりま
す。文字列変数は単純に現在の文字列を表す数値をアサインされます。

PLAY_STRING, PRINT_STRING, SCROLL_STRINGコマンドで文字列が使われると、
コンパイラーによる一連のGOSUBコードブロックが作成されます。

3ブロックまでのコードが生成され、これには、貴方の入力に対応する、文字列
テーブルへの入り口を示すコードが含まれています。例えば、あなたのコードに
PLAY_STRINGコマンドが含まれていると、コンパイラーは、コード上に存在する変数
にアサインされた文字列全てに対するPLAY文の固まりを生成します。

上記から、PRINT_STRINGやSCROOL_STRINGコマンドに文字列変数を使用しないこと
で、メモリーの使用量を減らす事ができるということが明らかになります。
しかし、この方法しか、私にはバイナリーアドベンチャーファイル上で文字列を扱
う方法を見つけ出すことができませんでした。

生成されたコードブロックは1段階または2段階のON GOTO文からなるテーブルを
持ち出力用に使用されるコードへジャンプする形になっています。コード上に含ま
れる文字列が1個のON GOTOで扱える個数以上(255上)ある時には自動的に2段階の
テーブルが作成されます。実際にはこの様な形のコードが生成されるわけではあり
ませんが、コンセプト的には以下の様なコードが生成されると考えれば良いでしょう。

PRINT_ENTRYPOINT:

ON PRINT_SELECTOR GOTO STRING0, STRING1, STRING2

STRING0:

	PRINT "string1 value",
	RETURN

STRING1:

	PRINT "string2 value",
	RETURN

STRING2:

	PRINT "string2 value",
	RETURN

そして、PRINT_STRINGコマンドがprint string1 をコールした時には以下の様に
なります。

PRINT_SELECTOR = 1
GOSUB PRINT_ENTRYPOINT

他の新しい機能と同様に、あなたがプログラムしたり修正しやすくすることと、
実行時間やコードサイズとの間にはトレードオフの関係が有ります。同じ文字列
には同じIDが付けられることから、全く同じ文字列を多く使用することで生成さ
れるコードサイズを小さくできます。
一方、PRINT_STRING, PLAY_STRING, SCROLL_STRINGも三つ共使ったり、文字列を
多く使用することで、コードサイズは相当大きなものになります。 

文字列テーブルへアクセスする代償にGOSUB命令を追加する事による実行時間の追
加というオーバーヘッドが必要になります。それがどの程度重要であるかは私には
わかりません。

 
6.17■音声文字列プレイコマンド

V1.20から新コマンドが追加されました。このコマンドでコールサインやナブエイ
ドの識別名や周波数を取り扱うのが簡単になりました。以前は各々の言葉に別々の
PLAYコマンドをコーディングしなければなりませんでしたが、このコマンドでコン
パイラーがこの面倒な仕事をあなたに変わって行います。
新しいコマンドの構文は以下の通りです。

PLAY_PHONETIC string_literal

例えば、PLAY_PHONETIC "N45LJ"とコーディングすると、
November Four Five Lima JulietというWAVファイルが流されます。

この文字列には文字、数字、小数点を指定することができます。
アンダースコアー(_)はFSFSのWAVファイルをお持ちの場合は'heavy'という言葉に
なります。

残念なことにこのコマンドは文字列のみに有効で文字列変数には有効ではありま
せん。この理由は、文字列変数でも動くようにするにはプログラム中の全ての文字
列をPLAY_PHONETICの潜在的な対象とせざるを得ず、それによりADVファイルが非常
に大きなもの(TEXT一文字あたり7バイトになります)になってしまう為です。

このコマンドを使用する一番良い方法は、プロシージャーを使って、カプセル化し
てしまうことです。
こうすることで、修正は一個所だけ行うことで良くなります。
以下は一例です。

DEFINE PROCEDURE Callsign()
	PLAY "FSLEA"			; say Learjet
	PLAY_PHONETIC "N45LJ"		; say the callsign
END_DEFINE

 
6.18■プレイグループ

ある引数を変更することで、違ったサウンドファイルを実行できる様にしたいとい
うのは、誰でも考える正しい要望だと思います。例えば、同じ 'クライム' という
言葉の入った異なる3つのファイルをclimb0.wav、climb1.wav、climb2.wav
という名前で持っていたとします。そして、それを使用する状況によって変数を使
用して0、1、2と指定することで使うファイルを変更したいとします。以前であれば、
こういう時には以下の様なコーディングになったかと思います。

ON selected_voice GOTO c0,c1,c2

c0:

	PLAY "climb0"
	GOTO cend

c1:

	PLAY "climb1"
	GOTO cend

c2:

	PLAY "climb2"
	GOTO cend

cend:

あなたが50種類ものランダムに選択する航空管制用の音声ファイルを持っていた
場合を想像して見てください。冗長なだけでなく、エラーを起し易いコーディング
であることが分かると思います。

PLAY_GROUPコマンドは、以下の構文になります。

PLAY_GROUP format_string, control_expression, limit

format string は実行する音声ファイルを定義します。ここでは文字とWAVファイル
のナンバーで置き換わるパーセント(%)文字で指定します。選択するファイルの上限
が10未満の場合は1文字で置き換えられ、10以上の場合は2文字で置き換えられます。
もし、あなたが0を含む2文字で置き換えられたく無い場合はパーセントの替わりに
ダラー($)を指定する様にして下さい。

control_expressionは有効な数値表現であれば使用できます。1以上limitまでの数
値であるかどうかが評価されます。ただ、コンパイル時にはチェックされませんの
で正しいかどうかは自分で確認しておく必要があります。

limitの値は1から99までの数値ある必要があります。また、利用可能なWAVファイル
の数を示します。 
以下に示すコードで上記のコーディングが代替できます。

PLAY_GROUP "climb%", selected_voice, 3

ATC00chat.wavからATC49chat.wavまでのファイルから1つをランダムに選択して流す
時には以下の様にします。

PLAY_GROUP "ATC%chat", random * 50, 50

Flight ShopからATCのchatterファイルでこのコマンドを使った例はAPLC32の
exampleディレクトリーに入っています。

 
7.00■サンプルコンパイル

以下のコードはサンプルコンパイル用のプログラムです。以下のテキストコードで
test.txtというファイルを作成し APLC32 test.txt とコマンドラインから打ち込ん
でコンパイルして下さい。test.advというファイルが作成されますので、FS6の
ADVディレクトリーにコピーしてFlightsメニューのAdventureリストから選択
して見てください。

TITLE "Test"
DESCRIPTION "A Test Adventure"

PRINT_TIME 5
PRINT "HELLO WORLD"
WAIT 5
PRINT "IT SEEMS TO WORK"
WAIT 5

 
8.00■APLC32のコンパイルオプション

APLC32のコマンドラインの構文は以下の通りです。

aplc32 [options] input_file [output_file]

入力ファイルの拡張子は .TXT か .APL であると想定されています。入力ファイル
名としては、まず与えられた名前でサーチされ、それが見つからない時は拡張子を
 .APLに変更してサーチされます。それでも見つからないときには .TXTの名前でサ
ーチされます。これはもし、X.APLとX.TXTの二つのファイルが同じディレクトリー
にある場合に入力ファイル名を X で指定すると、X.APLが入力ファイルになるとい
うことです。

もし、出力ファイル名の名前が指定されていない時には、カレントディレクトリー
に入力ファイルの拡張子を .ADVに変えて書き出されます。出力ファイルの拡張子は
必ず .ADVとなり、出力ファイル名として違った拡張子が指定されていても無視され
ます。また、入力ファイルの拡張子が.ADVで指定された場合はエラーになります。
これにより、ソースファイルが誤って書き換えられることを防いでいます。

optionは付けなくても構いません。有効なオプションは以下の通りです。

-c		文法チェックのみ。出力ファイルを作成しない。
-k		古いソースを書き換え、コンパイル可能な様に変換する。(廃止)
-o		追加的な最適化を無効にする。
-oo		全ての最適化を無効にする。
-s		エラー出力ファイル名としてstderrの替りにstdoutを使用する。
-w		コンパイル時に警告をだす。
-v		システム変数がアサインされているかどうかのチェックをオフにする。
-a		高度の補正をオフにする。
		(訳注:高度指定の単位を m単位から ft単位に変更する。)
-fy or -fn	出力ディレクトリーをFSのADVディレクトリーにするかどうかのオン、オフ。
-x		APLC32の拡張機能をオフにする。互換性のチェックに有効。
-95		FSFW95用の出力ファイルの作成。 (V.1.18から追加)
-98		FS98用の出力ファイルの作成。 (V.1.18から追加)
-5		FS5.1+ Flight Shop用の出力ファイルの作成。 (V1.22から追加)

-oオプションは、古いAPLCでは使用できない、私が追加した新しい最適化を無効に
します。-ooは全ての最適化を無効にします。殆どの最適化は定数表現を事前に計算
することに関係しています。

バグチェック以外の目的では、このオプションは使用しないようにして下さい。
もし、-oや-ooオプションを使用した時にアドベンチャーが通常とは違う動きになっ
た場合、おそらく、APLC32のバグと思われます。

Windowsの様な原始的なOSが供給するコマンドシェルはstderrをリダイレクトする
機能がないので-sオプションが必要になります。 APLC32 -s buggy.txt | MORE 
のようなコマンドを使用する時に便利かと思います。

-kオプションの効果は以下で述べます。APLC32がFlight ShopのATC Workshopから
コールされた場合は-kオプションと-oオプションが自動的に選択されます。
注意:新しいバージョンでは機能改善により不要になったことから、このオプショ
ンは現在では廃止されています。

-aオプションは高度単位の補正をオフにします。多くの人が気付いているように
FS6の高度に関わる変数はフィートではなくメートルで値を返します。これは私に
とっては非常に不便であると感じました。そこで、デフォルトではこれを行わない
様にすることにしました。-aオプションはこの補正を解除します。この目的はFS5用
に書かれたコードをKV()関数と数値キーコードを使うことなくコンパイルを可能
することです。

-vオプションは、通常読みだしのみと考えられるシステム変数に数値設定を行うこ
とを可能にします。今の処、これを可能にすることで効果があるという証拠はあり
ません。使われる場合は自己責任でお願いします。

コンパイルが成功するとFS6やFS98で使用可能なアドベンチャーが出力されます。
Unixで変換した時のプログラムの出口ステータスは全てOKの時は0、エラーがある
場合は1になります。

新しいV1.18ではコマンドラインオプションとして出力ファイルフォーマットの選
択が出来るようになりました。
(出力条件等の設定変更について、詳しくは、FS98.docを参照して下さい。) 

 
9.00■Flight ShopのATC WorkShopでAPLC32を使用する方法

Flight ShopとFlight SimulatorでAPLC32を使用する場合は以下の様にして下さい。 

APLC32.EXEをフライトシミュレータのADVディレクトリーにコピーします。
ATC Workshopをスタートし、ADVコンパイラーのパス指定で上記のコピーした
APLC32のパスを設定します。
フライトプランをロードしファイルします。これでADVディレクトリーに使用可能
なADVファイルが作成されます。コンバータを実行する必要はありません。

コンパイルがうまくできない場合はflight shop ディレクトリーにあるAPLC32.ERR
ファイルを確認して下さい。原因が書かれている筈です。ATC Workshopでは原因不
明のコンパイルエラーが良く発生します。
APLC32.ERRにエラーがない場合(警告メッセージは除く)、もう一度ファイルして下
さい。原因が分かった場合はアップデートを行うつもりです。
注意: これは引き続き発生しており、Flight Shopのバグと思われます。私にAPLC32
を修正するようレポートすることは是非止めてください。

FSFSのアドベンチャーで飛んでいる時には、適切な管制施設と交信し続ける必要
があります。これを行う為には、COMラジオの周波数を指定されたものに合わせ、
Ctrl-Kを押して下さい。これを行わないと後続の指示が受けられません。前のメッ
セージをもう一度繰り返す時はCtrl-Rが使用出来ます。また、アドベンチャーのス
タート時にCtrl-Xを押せば、使用できるキーの説明が表示されます。 

注意:特定のアドベンチャーで使用するキーはアドベンチャー作者によって異なり
ます。全てのADV作者がFlight ShopのATCアドベンチャーと同じ慣行を使うとは限
りません。もし、ADVでどのキーを使うかわからなければ、そのADVの作者に尋ねて
下さい。

 
10.00■古いファイルの変換

古いFS5のソースファイルをコンパイルする時、-kオプションを付けると以下のよ
うな現象がでます。
注意:キーボートの取り扱いの改善とデフォルトで単位の変換がオンになっている
ので、このオプションを指定する必要はありません。このセクションは参考用とし
て残しています。

ADV_KEYSとONKEYでのキースキャンコードを参照して新しい値に変換されます。
この変換はキーボードレイアウトによってスキャンコードが異なる為、100%信頼
できるものではありません。この問題はインターナショナルキーボードを使用し
ているユーザーにあてはまります。
ソース上でPLAY "X.WAV" と書かれている場合、.WAVがないフォーマットに変換さ
れます。(これは現在では、-kオプションの有無に拘わらず行われます。)
PLANE_ALT, GROUND_ALTITUDE, AUTOPILOT_ALTITUDEの値を参照した場合、単位は
変換されます。その為、FS6の測定結果も引き続き有効です。但し100%ではありま
せん。
AUTOPILOT_ALTITUDE変数がアサインされた場合の補正も行われています。実際的
には、FSFSアドベンチャーではFlight Plan Auto Pilotがアップローチとコンタ
クトするまで有効です。これと上記オプションは現在ではデフォルトになってい
ます。この機能をオフにするには、明示的に指定する必要があります。現在では
この明示指定に-kオプションが使われています。

ソースコード上の数値キーをKV()関数のコールで置き換えることが望ましいと思わ
れます。

キーコードの変換は数値キーについてのみ行われます。もし、ソースコードが
ADV_KEYS ADD,100+X/5のようなコードを含んでいる場合、うまく動かなくなります。
それについては自己責任だと私は思います。警告は入力ファイル上で危険なものと
みなされる場合にのみ表示されます。

この変換作用はアドベンチャーコンバーターの働きに良く似ています。APLC32によ
る修正はバイナリーコードではなく分岐ノード分析よりおこなわれますので、信頼
性は多少高いでしょう。

 
11.00■コンパイルのフェーズ

コンパイルは4段階で行われます。このどの段階でエラーが起こってもコンパイル
は停止されます。
もし、警告メッセージだけであった場合はコンパイルは継続し次の段階に進みます。
各段階はパスではなくフェーズと呼ばれ、検査の為、語彙、文法、意味の分析が並
行的に実施されます。ソースファイルは参照されるだけです。

文法分析(Syntax Analysis) : この段階ではソースのテキストはトークンに分割さ
れ分岐分析が行われます。

グローバルチェック(Global Checks) : 全てが定義され要求されている全てが満足
されているか−例えばアドベンチャーのタイトルがあるか−等がチェックされます。
 また、使われていない変数や、アサインされていても参照されていない変数がない
かがチェックされ警告メッセージが作られます。

コードサイズ決定(Code Sizing) :  ラベルのアドレスや出力ファイルのサイズが決
定されます。

コード生成(Code Generation) : アドベンチャーファイルをディスクに書き出します。

検査メッセージが作られる場合は以下のフォーマットになります。

[filename Line 12345, ] Severity: message text

ラインナンバーはソースコード上でメッセージが発生した特定の行を示します。
Severityは深刻さの度合いで、通常Warning, Error, Fatalのいずれかを表示します。
Fatalの場合はコンパイルは即時停止されます。
Fatalエラーは内部チェックの失敗に関係しており、度々でることはありません。
 
 
12.00■著作権と法律上の問題

省略

 
13.00■コンタクト先

改善の提案、苦情、コメント等は以下のアドレスにE-Mailして下さい。
 fs6@sharrow.demon.co.uk.

もし、問題点についての報告をする場合はできるだけ詳しく問題点を記述し、問題
が発生したと思われる部分のソースコードを添付して下さい。「うまく動かない」
だけでは問題解決に結びつきません。また、問題がでたAPLC32のバージョンナン
バーも記入して下さい。新しいバージョンでは問題が解消しているかもしれません。

フライトシミュレータやFS6、またどこにファイルがあるか等の基本的な質問を私に
しないで下さい。
これら基本的な質問に対する回答に答えるインターネット上のサイトは非常にたく
さんあります。私の欠点の一つは非常に短気であるという点で、機嫌の悪い時はこ
の種の質問に対して失礼な回答を返すことがあります。

問題点等に対する多くのE-Mailを送られた皆さんに感謝します。それによって多く
の修正や改善を行う事ができました。ここで名前をあげるには多すぎますが、皆さ
んのレポートの多くはMicrosoftにも送付されFS98での修正に繋がっています。

コマンドに関する新しいイベントに「公式」な名前を与えてくれたこと、SDKのリリー
スに対するコミットメント及びFSへのADD-ON作成勧奨に対してMicrosoft社に対して
も感謝します。

 
14.00■FAQs

FS5用のバージョンとして64Kのリミットが外せるものを作成しないのかとの質問を
何人かの方に質問されますが、残念ながらFS5のアドベンチャーファイルの全ての
オフセットは16ビットである為、これを行う事は不可能です。FS6での主要な構
造変更はこれらのオフセット値が32ビットになったことにあります。

FSのアドベンチャーランタイムの機能そのものの改善を提案される方もありますが、
その為にはドライバーコードをディスアセンブルし、修正しないといけないことを
考えてください。私にはそれを行う時間も意志もありません。

ビットフィールドや小数点以下の数について知りたい方はこの文書に私が注意書き
したものを読んで下さい。基本的には、そういうものに頼ることはできません。

括弧付きリストの付いたSETPOSITIONの使用方法についてはこの文書の始めの方に
ある適切なセクションを読んで下さい。

もし、あなたがアドベンチャーソースをAPLCでコンパイルしMicrosoftのアドベン
チャーコンバータを流すとFTOM(PLANE_LAT)でPLANE_LAT変数が正確でない値を返し
ます。APLC32でコンパイルした場合は正常な値が返ります。
FS98での注意 : FS98アドベンチャーコンバータではこの問題は解決しています。

ソース言語では文字列変数や文字列操作機能はありません。可能な事は文字列を表
示する機能だけです。私を責めないで下さい。私がデザインしたわけではありません。
私は私が見つけたものを使っているだけです。ただ、現在では、最低限の機能を果
たすものを追加しています。この文書の該当部分を見てください。

FS6で小数点以下の数値について、いくつかのコマンドにバグと思われるものがあ
ります。典型的なものはWAIT と VISIBILITYについてです。
FS98での注意 : FS98アドベンチャーコンバータに含まれているパッチでは、
VISIBILITYについての問題は解決しています。

GPWSはAPLC32(V1.16以降)でうまく動きます。実際非常に良く動作しているといって
良いでしょう。
ATC/Approach Controllerのユーザーはパッケージ作者の(下記のURLの)HPをチェッ
クして下さい。GPWS6でうまく動いているようです。

APLC32の最新版は ftp.iup.eduまたは FlightPlanner 4.0のHPで常にオンライン配
布されています。 

 
15.00■WWW Links

Microsoft FS Page		http://www.microsoft.com/games/fsim
FlightPlanner 4.0		http://www.worldaccess.nl/~mmaessen/
ATC/Approach Controller		http://sailfish.exis.net/~rfoster/ 
APL Programming			http://idt.net/~alstone/fsfsapl.htm

もし、上記のリンクがうまく動かない時はサイト管理者にコンタクトして下さい。

 
16.00■技術的な補足事項

コンパイラーは1クラスのC++で書かれています。表現評価はネット上で使用できる
GNU BisonベースのANSI C 文法でプロトタイプが作成されており、評価手法改善の
為、下方回帰形式にハンドコードされています。

再帰テストではコンパイラーの色々なバージョンをテストし、同一結果が得られる
かどうかをチェックするため、Perlドライバスクリプトが作成されました。

 
17.00■修正履歴

修正履歴は別ファイルになりました。history.docを参照してください。




LAST UPDATE: 1999/03/05