============================= = = = 汎用ADV作成カーネル = = - AZUSA - Ver0.?? = = = = とりあえず、1996/04/03 現在においての仕様書(^^; = = = ============================= 1.- AZUSA - 1−1.AZUSA.C main() は、起動するためのものでしかありません。 まず、オプション指定を解釈して、その後 cnf ファイルを読み、cnf ファイル から得た情報で、シナリオファイルを読み込みます。 まず、SCE_PATH と START_SCE で指定されるシナリオファイル名を sce_conv()に 与え、返り値を b_maker() に通し、さらにその返り値を HARUNA() に渡してメイン の処理に移ります。 画面モード等の初期化を行います。 詳しいことは、ソースを見た方が分かり易いので、ここでは内容には触れません。 main() で得られる argv[0] を引数に与えます。 実行ファイルと同じ名前で、拡張子が「CNF」のファイルをコンフィグファイル として読み込み、解釈します。 結果を SCE_PATH , GRP_PATH , START_SCE に 反映します。 1−2.AZUSA.CNF AZUSA.x のコンフィグファイルです。 プログラムをリネームすると、コンフィグ の名前も変えなければなりません。 例えば、 AZUSA.x → BEE.x AZUSA.CNF → BEE.CNF 先頭が「%」の行は、設定の記述があると解釈します。 同じ行にはコメントを 置かないでください。 先頭が「%」でない行はコメントとみなし、無視します。 設定内容は、以下のとおりです。 SCE_PATH : シナリオファイルのベースディレクトリ。最後に必ず \ を つけてください。 GRP_PATH : グラフィックデータのベースディレクトリ。最後には必ず \ を つけてください。 START_SCE : 最初に - AZUSA - 渡すシナリオファイルのファイル名。 PATH は記述しないでください。 2.HARUNA HARUNA.C シナリオを直接取り扱う、言わば本体となるルーチンです。 HARUNA自体は、非常に基本的なことしかしません。 まず、コールされると階層を1上げて、階層が1になります。 次に block_initset() を実行して、扱うシナリオファイルのブロックやラベルの 構造を調べ、エントリーします。 block_initset() は、シナリオの先頭ポインタを与えるとその内部構造を調べ ブロックをエントリーして、最初のブロックの「{」の位置へのポインタを返す ような関数です。 エントリーが終了したら、シナリオの実行に移ります。 ih_search() でヘッダ まで移動します。 見つかったヘッダが「&」だったら対応するコマンドに処理を移しまず。 「{」だったら階層を1つ上げます。 「}」だったら階層を一つ下げます。 - HARUNA -コマンドは HARUNA() の先頭で、分岐先を関数へのポインタ配列 として持っています。 「&」に続く文字列が com_str[] の中のどれかと一致した場合 com_ptr[] に記述してある対応する関数を呼び出します。 呼びだし時には、その コマンドの「&」の次の位置へのポインタを与え、返り値に次に実行すべき位置への ポインタを得ます。 返り値のポインタを新しいポインタとして、同じ作業を繰り 返します。 従って、コマンドの追加をするには com_str[] と com_ptr[] に新しい要素を付け 加えればOKです。 シナリオファイルコンバータです。 - HARUNA - で記述したシナリオファイルのファイル名を与えます。 ファイル名はそのまま使用されます。 cnf ファイル内で指定された SCE_PATH との 合成などは行いません。 sce_conv() は、シナリオファイル内のコメントや SPACE , TAB などの余分な 部分を削除して整理し、その先頭のポインタを返します。使用メモリの節約になり また、- HARUNA - コマンドのプログラムの記述も楽になります。 3.システムブロックメーカー - AZUSA - では変数やラベル等を管理する際に、変数ブロックや ラベルブロックを用います。 プログラムの実行中に、変数のエントリーや解放が 行われれば、それぞれのブロックの大きさも変化してくるわけですが、プログラムを 起ち上げるにあたって、まず最初にそのブロックの基盤を作らなければなりません。 その、最初の初期化の行程を担うのが、システムブロックメーカーです。 b_maker() には、変換後のシナリオデータの先頭位置へのポインタを与えます。 実行が開始されると、各種ブロックの基盤作成を行い、システム変数のプリセット を行い、- HARUNA - の階層を0にして処理を終了します。 返り値には、シナリオの先頭位置が返ります。 つまり、引数と同じです。 システム変数のプリセットを行うためのサブルーチンです。 プログラム内部は SVB_entry() を列挙してあるだけのものです。 以下にシステム変数名と、その意味を示します。 STATUS コマンドからの終了コード等を反映します。 MES_TorG &message の文字を 0:TEXT PCG 1:TEXT GRP で表示。 MES_LOC_X &message の文字の左上座標 MES_LOC_Y MES_LOC_DX &message 終了時の文字消去エリア MES_LOC_DY MES_KWAIT_X キー待ちメッセージの表示位置 MES_KWAIT_Y MES_遅延 &message の遅延キャンセルモード。0:CAPS 1〜:reserve MES_強調 &message の文字を default で強調モードにするか MES_4倍 &message の文字を default で4倍にするか MES_COL &message の文字のカラー指定。 MES_LINE_16 &message の16ドット文字の1ラインのドット数 MES_LINE_24 &message の24ドット文字の1ラインのドット数 MES_LINE_32 &message の32ドット文字の1ラインのドット数 MES_NEXT_KEY &message で、左クリックと同等の機能を持つキーのcode KW_STRING キー待ち文字列への先頭ポインタ KW_SIZE キー入力待ち文字列の基本文字サイズ 8 or 12 or 16 KW_強調 キー待ち文字列を default で強調にするか。 KW_4倍 キー待ち文字列を default で4倍にするか。 KW_COL キー待ち文字列の色。 FACE_X フェイスウィンドウの左上座標 FACE_Y FACE_DX フェイスウィンドウの広さ FACE_DY SELWIN_TorG セレクトウィンドウの文字をTEXT PCGにするかTEXT GRPにするか. SELWIN_COL セレクトウィンドウの文字の色。 SELWIN_SIZE セレクトウィンドウの文字のサイズ SELWIN_強調 セレクトウィンドウの文字を default で強調にするか。 SELWIN_4倍 セレクトウィンドウの文字を defaukt で4倍にするか。 SELWIN_X セレクトウィンドウの左上サイズ SELWIN_Y SELWIN_DX セレクトウィンドウの広さ。 SELWIN_DY SELWIN_USE &selectがコールされる度にセレクトウィンドウをオープン、クローズするか SELWIN_LINE セレクトウィンドウに表示する文字の1行のドット数 SELWIN_SPC セレクトウィンドウの上下ダミードット数 SELWIN_LOC_X セレクトウィンドウの文字の左上座標 SELWIN_LOC_Y MOUSE_MODE マウスポインタは、常に表示するか。 MOUSE_AREA マウスポインタの移動範囲。 SELCUR_X セレクトカーソルのX座標 SELCUR_DX セレクトカーソルの横幅 SELCUR_DU セレクトカーソルの、上ダミースペース SELCUR_DD セレクトカーソルの、下方向のドット数 SELCUR_PAGE セレクトカーソルを表示するテキストプレーン WIN_SIDE 重厚ウィンドウを使用するか。 WIN_SIDEPTN 疑似重厚ウィンドウのパターンストリングへのポインタ WIN_COLOR ウィンドウの色 4.補助サブルーチン群 - HARUNA - コマンドを作ったりする際に頻繁に使用する 補助サブルーチン群です。 便宜上、これ以降 0x00 以外に - HARUNA - のヘッダも文字列の エンドコードとみなす方法を、拡張エンドコードと呼ぶことにします。 拡張エンドコードとして認識する文字コードば、場合によって違ってきます。 4−1.HR_SUBS.C s_ptr で指定されたシナリオポインタから前方に1文字づつ検索して ヘッダを発見したら、その位置を示すポインタを返します。 途中にダブルクォーテーション「"」を発見したら、対応する「"」までスキップ します。 「"」をヘッダと見なしたい場合は、ih_search2() を使います。 最初に与えたポインタが示す文字も検索に含めるので、与えたポインタがすでに ヘッダを示していたら、与えたポインタと同じ位置を返すことになります。 <ヘッダと認識する文字> & : { } # $ ! @ , + - / * > < = 0x00 基本的に ih_search() と同じですが、「"」もヘッダと認識します。 基本的に ih_search2() と同じですが、ih_search2() に加え、「;」もヘッダと 認識します。 s_ptr で示すシナリオポインタから前方に1文字ずつ検索して、ch で指定した キャラクタを発見したら、その位置を示すポインタを返します。 最初に与えた位置も検索に含めますので、その位置がすでに ch を指していたら 同じ位置を示すポインタを返すことになります。 まず、与えるシナリオポインタ s_ptr が「{」を指していることが前提です。 与えたシナリオポインタから前方に1文字ずつ検索して、対応する「}」を発見 したら、その「}」を示すポインタを返します。 最初に与える s_ptr の位置が「{」を示していないと、正常な動作は望めない ので、注意してください。 最初に与えたシナリオポインタの位置から前方に検索して「&else」か「&endif」 を発見したら、その「&」の位置を示すポインタを返します。 途中に「&if」を発見した場合は、対応する「&endif」までスキップしてから 検索を再開するので、「&if」をネスティングしていた場合、最初に与えたポインタ に対応する「&else」か「&endif」へのポインタを返すことになります。 基本的にはC言語標準の strcmp() と同様ですが、- HARUNA - のヘッダも 文字列のエンドコードと見なします。 <エンドコードと認識する文字> [Space] : $ ; = { @ } % & ! # , " + - * / = < > 基本的には hr_strcmp() と同様ですが、演算子をエンドコードと見なしません。 <エンドコードと認識する文字> [Space] : $ ; = { @ } % & ! # , " < > 基本的にはC言語標準の strcpy() と同様ですが、- HARUNA - のヘッダも 文字列のエンドコードと見なします。 <エンドコードと見なす文字> [Space] : $ ; = { @ } % & ! # , " + - * / = < > 基本的に hr_strcpy() と同様ですが、[Space] [LF] {CR] しかエンドコードと 認識しません。 基本的にC言語標準の atoi() と同じですが、- HARUNA - のヘッダも 文字列のエンドコードとして認識します。 また、与えたポインタが - HARUNA - の変数を示していた場合、その変数 の値を展開します。 <エンドコードとみなす文字> [Space] : $ ; = { @ } % & ! # , " + - * / < > 与えたキャラクタコード ch が、シフトJISの全角文字の1バイト目か どうかを調べ、全角の1バイト目だった場合1を返し、そうでなかったら0を 返します。 与えたキャラクタコード ch が、- HARUNA - の変数のヘッダだった場合 1を返し、変数のヘッダでなければ0を返します。 s_ptr で与えたポインタを文字列の先頭ポインタと見なし、その文字列の長さを 調べ、その長さ分のバッファを確保し、確保したバッファにその文字列をコピーし コピーした文字列へのポインタを返します。 コピー先の文字列には、エンドコード 0x00 が付加されます。 確保したバッファは、free() 関数で解放できます。 <エンドコードと見なす文字列> [Space] : $ ; = { @ } % & ! # , " + - * / = < > 基本的には hr_lenalloccpy() と同様ですが「"」以外はエンドコードと 見なしません。 name で指定された変数名で、システム変数をエントリーします。 文字列のエンドコードには、拡張エンドコードを使用します。 name は hr_lenalloccpy で別領域にコピーされ、変数を扱う別の関数内では その先頭ポインタを使用します。 初期値に data を代入します。 name で指定された変数名で、グローバル変数をエントリーします。 文字列のエンドコードには、拡張エンドコードを使用します。 初期値には0が代入されます。 name で指定された変数名で、セミグローバル変数をエントリーします。 文字列のエンドコードには、拡張エンドコードを使用します。 name は hr_lenalloccpy で別領域にコピーされ、変数を扱う別の関数内では その先頭ポインタを使用します。 初期値には0が代入されます。 name で指定されたブロック名で、システムブロックをエントリーします。 文字列のエンドコードには、拡張エンドコードを使用します。 name は、hr_lenalloccpy でコピーされません。 name で指定されたラベル名で、ラベルをエントリーします。 文字列のエンドコードには、拡張エンドコードを使用します。 name は、hr_lenalloccpy でコピーされません。 name で指定された変数名で、layer で指定された - HARUNA - の階層に ローカル変数をエントリーします。 name には、拡張エンドコードを用います。 name は hr_lenalloccpy で別領域にコピーされ、変数を扱う別の関数内では その先頭ポインタを使用します。 当然、layer は現在の - HARUNA - の階層以下でなければなりません。 そうでない場合、正常な動作は望めません。 name で指定された変数に、data で指定された数値を代入します。 name には、拡張エンドコードを用います。 当然、name は、すでにエントリーされている変数名である必要があります。 そうでなかった場合は、エラーメッセージを表示して - AZUSA - 自体を 強制終了します。 name で指定された変数に、data で指定された数値を代入します。 name には、拡張エンドコードを用います。 当然、name は、すでにエントリーされている変数名である必要があります。 そうでなかった場合は、エラーメッセージを表示して - AZUSA - 自体を 強制終了します。 name で指定された変数に、data で指定された数値を代入します。 name には、拡張エンドコードを用います。 当然、name は、すでにエントリーされている変数名である必要があります。 そうでなかった場合は、エラーメッセージを表示して - AZUSA - 自体を 強制終了します。 layer で指定された階層から下に向かって順番に調べていって、初めて遭遇した name で指定された変数に、data で指定された数値を代入します。 name には、拡張エンドコードを用います。 当然、name は、すでにエントリーされている変数名である必要があります。 そうでなかった場合は、エラーメッセージを表示して - AZUSA - 自体を 強制終了します。 name で指定されたブロック名でエントリーされているシステムブロックを探し そのブロックへのシナリオポインタの位置を返します。 シナリオ上では、システムブロックは &set_block block_name { ・・・ のように宣言されますが、SBB_ref() は、block_name の b の位置、つまり ブロック名の先頭の位置へのポインタを返します。 name には、拡張エンドコードを用います。 当然、name は、すでにエントリーされているブロック名である必要があります。 そうでなかった場合は、エラーメッセージを表示して - AZUSA - 自体を 強制終了します。 name で指定されたラベル名でエントリーされているラベルを探し、そのラベル へのシナリオポインタの位置を返します。 シナリオ上では、ラベルは :label_name; のように宣言されますが、LB_ref() は、label_name の l の位置、つまり ラベル名の先頭の位置へのポインタを返します。 name には、拡張エンドコードを用います。 当然、name は、すでにエントリーされているラベル名である必要があります。 そうでなかった場合は、エラーメッセージを表示して - AZUSA - 自体を 強制終了します。 name で指定された変数名でエントリーされている変数を探し その値を返します。 name には、拡張エンドコードを用います。 当然、name は、すでにエントリーされている変数名である必要があります。 そうでなかった場合は、エラーメッセージを表示して - AZUSA - 自体を 強制終了します。 name で指定された変数名でエントリーされている変数を探し その値を返します。 name には、拡張エンドコードを用います。 当然、name は、すでにエントリーされている変数名である必要があります。 そうでなかった場合は、エラーメッセージを表示して - AZUSA - 自体を 強制終了します。 name で指定された変数名でエントリーされている変数を探し その値を返します。 name には、拡張エンドコードを用います。 当然、name は、すでにエントリーされている変数名である必要があります。 そうでなかった場合は、エラーメッセージを表示して - AZUSA - 自体を 強制終了します。 layer で指定された - HARUNA - の階層から下に向かって調べて、初めて 遭遇した name という名前でエントリーされている変数の値を返します。 name には、拡張エンドコードを用います。 当然、name は、すでにエントリーされている変数名である必要があります。 そうでなかった場合は、エラーメッセージを表示して - AZUSA - 自体を 強制終了します。 layer は、- HARUNA - の階層以下の数値でなければなりません。 そうでない場合、暴走する可能性があります。 layer で指定された - HARUNA - の階層から下に向かって順に調べて name という名前でエントリーされている変数を見つけたら、その変数がエントリー されている階層を返します。 name には、拡張エンドコードを用います。 name は、すでにエントリーされている変数名である必要があります。 そうでなかった場合は、エラーメッセージを表示して - AZUSA - 自体を 強制終了します。 layer は、- HARUNA - の階層以下の数値でなければなりません。 そうでない場合、暴走する可能性があります。 セミグローバル変数を初期化します。 つまり、何もエントリーされていない状態に戻します。 システムブロックの情報を初期化します。 つまり、何もエントリーされていない状態に戻します。 ラベルの情報を初期化します。 つまり、何もエントリーされていない状態に戻します。 layer で指定された階層に、ローカル変数ブロックを追加します。 layer で指定した階層のローカル変数ブロックを破棄します。 st で指定された文字列を拡張エンドコードで解釈して、その文字列を別の バッファにコピーし、エンドコード0x00を付加し、その先頭ポインタを返します。 「別のバッファ」として、勝手に80バイトのバッファを確保します。 このバッファは、free() 関数で解放できます。 <エンドコードと見なす文字> [Space] : $ ; = { } % & ! # , " @ + - * / < > 4−2.HR_SUBS2.C name で指定された変数名で、dx*dy(dots)のサイズのグラフィックパターンを エントリーします。 name には、拡張エンドコードを使用します。 name は、hr_lenalloccpy() で別バッファにコピーされます。 dx*dy*2 バイト分の空きメモリが必要なので、注意して使ってください。 メモリ不足などのエラー終了はサポートしていませんので、メモリが足りなく なった場合は暴走します。 name というパターン名でエントリーされたグラフィックパターン用のバッファに (px,py)を左上の座標、(dx,dy)を大きさとする矩形領域のパターンデータを格納 します。 name には、拡張エンドコードを使用します。 name は、すでにエントリーされているパターン名でなければなりません。 そうでない場合、エラーメッセージを表示して - AZUSA - 自体を強制終了 します。 name で指定されたグラフィックパターンを破棄します。 グラフィックパターンの破棄に伴い、エントリーも解除します。 name には、拡張エンドコードを使用します。 name は、すでにエントリーされているパターン名でなければなりません。 そうでない場合、エラーメッセージを表示して - AZUSA - 自体を強制終了 します。 (px,py)を左上の座標、(dx,dy)を広さとする疑似重厚ウィンドゥをグラフィック 画面に描画します。 ウィンドゥの基準色を col で指定します。 d_ptr は、疑似重厚ウィンドウの枠の形状を示す文字列へのポインタです。 疑似重厚ウィンドウの枠の形状を指定するフォーマットは、以下のとおりです。 「 col1,col2,col3...... coln,E 」 ウィンドウの外側の端から内側に向かって、col1 , col2 , ... の順で太さ1dotの ボックスを描いていくことにより、ウィンドウの枠を装飾し、E の位置で 終了します。 (px,py)を左上の座標、(dx,dy)を広さとする疑似重厚ウィンドゥの枠のみを グラフィック画面に描画します。 d_ptr は、疑似重厚ウィンドウの枠の形状を示す文字列へのポインタです。 疑似重厚ウィンドウの枠の形状を指定するフォーマットは&win_draw()と同じです。 マウスの左クリックか、ch で指定したキーがキーインされるまで待ちます。 ch は、iocsコールの B_KEYINP() B_KEYSNS() に準拠します。 マウスの左右のボタンが両方とも解除されるまで待ちます。 - HARUNA - の階層を1ダウンして、ダウンした先のシナリオポインタを 返します。 &gosub や &select 等で分岐+階層アップした階層から下りる場合は そのリターン位置へのポインタを返し、そうでなく、普通に「{」でアップした場合 の階層から下りる場合は、与えられた s_ptr をそのままスルーして返します。 - HARUNA - の階層が0になると、HARUNA はプログラムの実行を 終了し、処理を AZUSA に返します。 - HARUNA - の階層を1アップします。 &gusub や &switch 等による 分岐+階層アップの時には、mode に 1 を指定し、add にはリターン位置への ポインタを与えてください。 そうでなく、普通に「{」で階層アップする場合には mode , add 共に 0 を与えて下さい。 5.コマンドプログラム群 - HARUNA - コマンドのプログラムです。 - HARUNA - からコマンドがコールされると、以下の対応するサブルーチン が実行されます。 関数は必ずコマンドのヘッダ「&」へのシナリオポインタを受へ取り、次の 実行位置へのシナリオポインタを返す形で記述されます。 従って、関数は必ず char *H_????(char *s_ptr) という形になります。 5−1.H_commands.c : &message 書式 : &message [