基礎定義ファイル 単純変数 配列変数 辞書変数 辞書変数のオプションパラメータ プリプロセスシンボル システムシンボル システム変数(パッシブ) システム変数(アクティブ) システム関数 エラー/デバッグ出力 コメント 暗号化 SAORI 注意点、豆知識等 |
基礎定義ファイル misaka.ini は基礎定義ファイルである。以下のエントリが存在する。 dictionaries { misaka.txt hoge.txt data\misaka.txt } debug,0 debugsaori,0 error,0 propertyhandler,0 dictionaries ブレス内には辞書ファイルとして読み込みファイルを列挙する。相対パスも使用可能。使用できるファイル名に制限はない。 debug はデバッグ出力を行うか否かを bool 値で指定する。デバッグ出力は美坂のホームディレクトリに misaka_debug.txt の名で保存され、異常動作時の最終処理行調査等に役立つログが記録される。なおこの処理は(主にディスクへの書き込み処理が)極めて重いため、必要なときのみ ON にする必要がある。デフォルト値は 0(OFF)。 debugsaori は SAORI のデバッグ出力を行うか否かを bool 値で指定する。SAORI デバッグログは美坂のホームディレクトリに misaka_debugsaori.txt の名で保存される。今のところ記録されるのはリクエストおよびレスポンスログのみ。デフォルト値は 0(OFF)。 error はプリプロセス時の簡易文法エラー検出/出力を行うか否かを bool 値で指定する。デバッグ出力は美坂のホームディレクトリに misaka_error.txt の名で保存される。デフォルト値は 0(OFF)。 propertyhandler はプロパティハンドラの使用の可否を bool 値で指定する。プロパティハンドラは確かに便利な面があるが、制御経路を非常に複雑にし、これが開発環境でのデバッグや misaka_debug.txt によるトレースにとってかなりマイナスになる。また、プロパティハンドラは変数が変化するたびにコールされるので(別に目に見えて重いというわけではないが)理論上重い。従って初めから全く使用しないことが分かっているなら OFF にした方がよい。デフォルト値は 0(OFF)。 |
単純変数 いつでも自由に変数を作成、使用できる。変数は型を持たず、使用時に決定される。数値として解釈できない文字列を数値として扱おうとした場合、値 0 として評価される。 bool 値は true および false という定義済み文字列として扱われる。 扱える数字は正負の整数に限られ、小数点数は扱えない。 文字列リテラルにはダブルクォートを付与する。 変数に値を代入するには、以下の構文を用いる。代入時点でその変数がまだ存在していなかった場合、変数は新たに作成される。 = で結ぶことにより単純な値の代入が行われる。例示 {$z=128} {$nyo="にょーん"} 文字列を代入する際は必ずそれをダブルクォートしなくてはならない。 右辺が数式だった場合はその計算結果が代入される。例示 {$z=(1+1)*4} クォートの重要性はここにある。仮に以下のように記述した場合、それは数式に見えるだけの文字列として扱われ、計算も行われない。 {$z="(1+1)*4"} 以下のような C 的な短縮書式も使用できる。 上から、$z に 1 を加算、$z から 1 を減算、$z に n を加算、$z から n を減算、$z に n を乗算、$z を n で除算。 変数から値を取り出すには、以下の構文を用いる。 {$z} 評価はいつでも可能で、また無限にネストできる。例示 {$z=({$a}+1)*{$b}} 変数を制御するために有用なシステム関数がいくつか定義されている。システム関数の項を参照。 単純変数は自動保存/復帰の対象となる。終了時に保持していた変数は次回起動時も同じ値を持ったまま復帰する。 |
配列変数 自由に配列変数を作成できる。配列変数は複数の値を持つという点を除き、基本的に単純変数と同じである。 宣言段階では単純変数と配列変数の間に記述上の違いはない。例えば これは配列変数 $list を空にする。 配列変数に値を追加するにはシステム関数 append を用いる。 このようにして配列となった変数を引数なしで参照した場合、全リストの中からランダムで一つが返る。つまり、上の 2行の処理を行ったのち {$list} とすると「あいうえお」もしくは「かきくけこ」という文字列がランダムで返る。 特定の位置の文字列を取得するにはスクエアブラケットを用いて添え字を与える。 これは常に「かきくけこ」を返す。 配列の最大数に制限はない。 配列変数を制御するために有用なシステム関数がいくつか定義されている。システム関数の項を参照。 配列変数も単純変数同様自動保存/復帰の対象となる。 |
辞書変数 起動時に辞書ファイルから読み出される変数は辞書変数と呼ばれ、構造上配列変数に近いが、以下の特殊な性質を持つ。 0.リードオンリー 1.採用条件式が持てる この2点を除けば、辞書変数の扱いは配列変数と全く変わらない。 配列変数を制御するシステム関数においても辞書変数は通常の配列変数と同様に使用できる。ただし、その際辞書変数は通常の配列変数として扱われ、上記の特性は一時的に失われる。 |
辞書変数の採用条件式を含むオプションパラメータ 辞書変数は通常の変数と異なりいくつかのオプションパラメータを持てる。 論理式付き辞書変数は、採用条件が存在する変数であり、イベント反応の多様性を維持するために頻繁に使用される。論理式は以下のように記述される。 $OnBoot; {$if ({$hour}==12)}; \0\s0起動、12時。\e $OnBoot \0\s0それ以外。\e辞書においてこのような定義を行った場合、現在時が 12 のときは上の変数が、それ以外のときは下の変数が採用される。このような構造を利用することで同一のイベントに対し簡単に多様な反応を返すことができる。 シンボルは定義が早かったもの(ファイルの先頭に近いもの、複数ファイルインクルード時には先にインクルードされたもの)から順に評価される。美坂はこの構造を用いて if else ネストを構築する。従って何の論理式もない無条件採用の辞書変数は必ず一番遅く定義しなくてはならない(仮に無条件採用辞書変数を先に宣言してしまった場合、それ以降宣言された辞書変数は絶対に成立しないことになる)。 パラメータは「論理式」であり、必ずしも $if 構文である必要はない。例えば以下のような式も正しい。 $Dummy; {$stringexists({$array},{$s})}; \0\s0既にある。\e $Dummy \0\s0ない。\e nonoverlap パラメータが指定された辞書変数は、全要素が一巡するまで絶対に取得要素が重複しない。ただし全要素からランダム取得されることに変わりはない。この性質は主にランダムトークの重複をブロックするために用いる。例示 $_OnTalkCore; nonoverlap; A B C D E F$_OnTalkCore は通常の辞書変数同様コールされるたびリストからランダムに文字列を返すが、連続で呼び出しても例えば「ADBFEC」「CFADEB」のように全要素出現まで絶対に重複した要素が出ない。 sequential パラメータが指定された辞書変数は、必ず要素 0 から順に読まれ、全要素が一巡すると再び 0 に戻る動作を繰り返す。この性質は主にある程度の間隔を置きつつ連続して話させたい一連のセンテンスを制御するために用いる。例示 $_alphabet; sequential; A B C D E F$_alphabet はコールされるたび ABCDEFABCDEF... の順で文字列を返す。 全パラメータはいくつでも重複できる。論理式と nonoverlap 等を同時に指定しても問題ない。複数指定する場合は以下のように列挙する。 $OnBoot; {$if ({$hour}==12)}; nonoverlap;ただし論理的に整合しないパラメータの組み合わせではいずれかのパラメータが無効になる場合がある。例えば nonoverlap と sequential は動作内容が競合するため同時に使用することはできない。 |
プリプロセスシンボル #_Common シンボルで宣言された論理式は、当該ファイル内の全てのシンボルに関係演算子 && で付与される。この構造は主に多モードを持つゴーストで有効である。つまり、#_Common でモード判定式を記述すれば、以降そのファイル内で一切モード判定式を書く必要がなくなり、単にファイルを分けるだけで多モードを実現できるようになる。例示 #_Common {$if ({$mode}==0)}当該ファイルのシンボル全てに論理式 {$if ({$mode}==0)} が付与される。 |
システムシンボル On で始まる一般イベントハンドリングシンボルは自動的にシステムシンボルになる。これは $id の形で定義され、全て SHIORI/3.0 の予約語がそのまま使用されるので、解説は省略する。 NOTIFY リクエストが来た際、美坂はまず Reference 引数から適切なシステム変数を作成する等、カーネルとしての最低限の処理を行い、その後、$OnNotify_id というシンボルを持つユーザコードを実行する。Reference 引数は NOTIFY を受けた状態のまま維持される。なお NOTIFY リクエストの性質上ここでスクリプトを返してもそのまま破棄される。 $_OnVariable は美坂起動直後/ユーザ変数自動復帰直前のタイミングでコールされ、主に全変数のデフォルト値設定処理を行う。グローバル変数宣言部と考えてよい。美坂の変数は全て宣言不要でバリアント型であるが、真にグローバルである変数はここで宣言しておいた方が可読性は向上すると考えられる(必須ではない)。 $_OnConstant は美坂起動直後/ユーザ変数自動復帰直後のタイミングでコールされ、自動復帰を無視したい変数の強制初期化処理を行う。グローバル定数宣言部と考えてよい。 $_OnGhostCommunicateReceive 他のゴーストから話し掛けられたときにコールされる。誰からどのようなセリフで話し掛けられたかはシステム変数 {$sender} とシステム関数 {$insentence} {$inlastsentence} を組み合わせることでチェックできる。 $_OnRandomTalk システム変数 $_talkinterval で指定された間隔の 0.5 倍から 1.5 倍程度でコールされる。いわゆる「ランダムトーク」を記述する。 |
システム変数(パッシブ) 以下の変数名はシステムレベルで定義済みであり、常に自動的に更新される。ユーザは環境変数と同名の変数を再定義してはならない。 現在年、月、日、時、分、秒、曜日。曜日は 0 が日曜で 6 が土曜。 ゴーストの連続起動時間。それぞれ、時、分、秒。 OSの連続起動時間。それぞれ、時、分、秒。 ゴーストの通算起動時間。それぞれ、時、分、秒。 OS のバージョンナンバ。「5.0.2195」等。 OS の一般的名称。「Windows 2000」等。 OS が管理する、物理メモリの総容量。単位バイト。 OS が管理する、物理メモリ空き容量。単位バイト。 OS が管理する、仮想メモリも含めた利用可能な総メモリ容量。単位バイト。 現在稼動している CPU のベンダの名前。「Intel」等。 現在稼動している CPU の一般的名称。「Athlon」「PentiumIII」等。 現在稼動している CPU のクロック。単位 Mhz。 最終ネットワーク更新日からの経過日数。単位 day。例示 $_OnBoot; {$if (7<={$daysfromlastupdate})}; \0\s0そろそろネットワーク更新して欲しい。\e上記の例では、ネットワーク更新せずに7日経過すると更新を催促する。 初回起動した日からの経過日数。単位 day。 直前の COMMUNICATE で受け取った相手方のスクリプト。$inlastsentence 関数が比較する対象と全く同一。 配列。現在同一デスクトップ上に存在する他のゴーストのリスト。自分しかいない場合は null。 それぞれの HWnd |
システム変数(アクティブ) 以下の変数名はシステムレベルで定義済みであり、特別な用途に使用される。ユーザは環境変数と同名の変数を再定義してはならない。 対ゴーストコミュニケートの宛て名。この変数に対象とするゴースト名をセットしてから発言することでその発言が相手に届く。例示 {$to=花ちゃん}\0\s0こんにちは。\e 変数 $to は喋るたびに毎回リセットされる。 システムシンボル $_OnRandomTalk がコールされる間隔。単位秒。 |
システム関数 以下の関数名はシステムレベルで定義済みであり、常に関数として評価される。ユーザは同名の変数を再定義してはならない。 評価関数 if 構文。論理式を判定し bool 値もしくは各ブレス内のスクリプトを返す。例示 \0\s0{$if (({$month}==12) && (({$day}==24) || ({$day}==25))) { クリスマス } else { ただの日 }}\e 現在時間が12月で24日もしくは25日ならこのスクリプトは「クリスマス」に、そうでないなら「ただの日」になる。 関係演算子は == <= >= < > != 論理演算子は && || 複雑性に限界はなく、書式を守る限り論理式はいくつ複合しても構わない。 論理式の先の処理部は省略することもできる。 else 以降が省略され、かつ論理式が false の場合、その $if 部分は空白になる(消滅する)。また、処理部を完全に省略した場合、$if は bool 値そのものを返す。従って以下の式は全て有効な式である。 {$if (({$hour}==9) || ({$minute}==59))}にょーん。\e {$if (({$hour}==9) || ({$minute}==59)) { 不細工{$hour} } else { 不細工じゃない }}にょーん。\e {$if (({$hour}==9) || ({$minute}==59)) { 不細工{$hour} }}にょーん。\e {$if (({$hour}==9) || ({$minute}==59)) { 不細工{$if ({$hour}==9)} }}にょーん。\e 以下に注意点を示す。 個々の式を完全に独立した括弧でくくる。 {$if ({$month}==12 && ({$day}==24 || {$day}==25))} は C 言語の書き方で、実際 C コンパイラはこのような書式を通すが、美坂の書式においては誤りである。正しくは {$if (({$month}==12) && (({$day}==24) || ({$day}==25)))} ただし、関係演算子が同一であれば、一つの括弧の中に複数の論理式を配置できる。従って以下のような式は通る。 {$if ({$month}==12 && {$day}==24 && {$hour}==0)} スペース類は省略できない。 多すぎるスペースは詰められるが、足りない場合は暴走が考えられる。誤りの例示 {$if(({$month}==12) && (({$day}==24) || ({$day}==25))) {クリスマス} else {ただの日}}基礎関数 現在の n 番目の reference ヘッダの内容を返す。 0〜n-1 の範囲の乱数(整数)を返す。 expression で示された四則演算式を計算し結果を返す。式は複数項記述/括弧による演算優先順位制御可。例示
{$calc(1+1)}
実際に使用できる演算子 + 加算 - 減算 * 乗算 / 除算 % 剰余 ^ べき乗 小数点数の概念はない。除算の結果小数点数が出た場合切り捨てられる。 文字列関数 文字列 s をファイル名と見なし、パスを除去してファイル名のみを返す。 C:\hoge\hoge.txt → hoge.txt 文字列 s 中から文字列 n を探し、その先頭位置を返す。単位バイト。例示
{$index("hum","human")}
文字列 s 中から文字列 n を探し、全てが存在するかどうかを bool 値で返す。引数の最大数は無限。 引数の順序が index と逆になっていることに注意。
{$insentence("human","hum")}
insentence のカプセリング関数。lastsentence(直前の COMMUNICATE で受け取った相手方のスクリプト)に対して insentence 判定を行う。 文字列 s の長さ(バイト数)を返す。 文字列 s の部分文字列を返す。substring は文字列 s の offset バイト目から count バイト、substringl は 文字列 s の左端から count バイト、substringr は文字列 s の右端から count バイト。 ワイド文字版 substring。バイト数ではなく見かけ上の文字数でカウントする。それ以外は substring と同じ。例示
{$temp="あaいbうcえdお"}{$substringl({$temp},3)}
上の結果は「あa」、下の結果は「あaい」 substringw のカプセリング関数。substringfirst は s の先頭1文字、substringlast は s の終端1文字を返す。この関数は MBCS を考慮する(バイトではなく文字単位で比較する)。 カタカナ交じりの文字列 s を全てひらがなにして返す。漢字等変換不能なものはそのまま残される。 s0 の終端1文字と s1 の先頭1文字が同一かどうかを判定し bool 値を返す。この関数は MBCS を考慮する(バイトではなく文字単位で比較する)。 n で渡された文字列をカンマでセパレートし、n 番目の要素を返す。
{$_ref="a,b,c,d,e,f"}{$getvalue("{$_ref}",3)}
この式の値は d n で渡された文字列をバイト値 1でセパレートし、n 番目の要素を返す。 配列関数 配列変数 a に要素 s を追加する。a が既に単純変数であった場合、単純変数時の値が a[0]、s が a[1] となり、以降 a は配列変数に変化する。 配列変数 a0 を a1 にコピーする。a0 には以下の条件で辞書変数も使用できる。 一、採用条件式が無視され、一番最初に見つかった辞書変数が使用される 配列 a の要素数を返す。添え字はこの関数で得られる値 -1 まで有効。a が単純変数だった場合は常に 1 が返る。a が配列変数でも単純変数でもなかった場合(NULL だった場合)は -1 が返る。 配列変数 a からランダムで1要素を返し、同時にその要素を配列から削除する。配列が空の場合は空文字列を返す。 配列変数 a の s と左方向一致する要素の中からランダムで1要素を返し、同時にその要素を配列から削除する。一致する要素が一つもない場合は空文字列を返す。 配列変数 a 内に文字列 s と完全一致する要素があるか否かを bool 値で返す。 SAORI 関数 filename で示された SAORI DLL をロード、ロックする。 filename で示された SAORI DLL をアンロード、アンロックする。 arg を argument ヘッダとしてセットして filename で示された SAORI を実行する。当該 SAORI が response を返すまでブロッキングする。指定された DLL がまだロードされていなかった場合は落ちる。SAORI 内部でエラーが起きた場合も落ちる。例示 {$loadsaori("substr.dll")} {$temp={$saori("substr.dll","あいうえお",2,3)}}{$temp} {$unloadsaori("substr.dll")}substr.dll が現在里々に同梱されている substr.dll である場合、$temp には「いうえ」がセットされる。 上記の例ではロードと同時に実行し実行終了と同時にアンロードしているが、別にこのように使わなくてはならない、という決まりはない。美坂起動と同時に(例えば $_Constant 等で)ロードし、そのままずっとメモリに置いて何度もコールしても問題はない。SAORI の寿命管理はユーザに任されている。 一般的な SAORI を使う限り、美坂起動と同時に使用する全 SAORI をロードし、あとは使いっぱなし、という手法で特に問題はない。細かく寿命管理するメリットやロード/アンロード時のオーバヘッドについてはここでは省略する。 なお、SAORI をロードしたまま(明示的にアンロードせずに)美坂が終了する際の動作については考慮しなくてよい。美坂は終了と同時にロードされている全 SAORI を自動的にアンロードする。 その他の関数 引数で渡された値のうちランダムに一つを返す。引数の最大数に制限はない。例示
{$choice("あいうえお",{$b},256)}
文字列 n で示されるゴーストが現在同一デスクトップ上に存在するか否かを bool 値で返す。 シンボル名に引数で渡された文字列全てが含まれているシンボルの中からランダムに一つのシンボルを選択し式を評価して戻り値を返す。引数の数に制限はない。例示
$_OnTest
$_OnTest には A ないし B が、$_OnTest2 には A ないし C が返る。 引数なし。美坂がオンメモリで持っている情報全てをディスクに書き込みバックアップする。処理内容的には終了時に自動で行われる変数保存処理と同じ。 サイド n の部位名 m で示される部位の OnMouseMove カウントを返す。このカウント数を判定することでいわゆる「撫で反応」の敏感さを制御できる。例示
$OnMouseMove,{$if (64<={$getmousemovecount(0,"Bust")})}
サイト n の部位名 m で示される部位の OnMouseMove カウントを 0 にリセットする。 |
エラー出力/デバッグ出力 エラー出力は misaka_error.txt、デバッグ出力は misaka_debug.txt の名前で美坂のホームディレクトリに書き出される(後者は debug スイッチ ON 時のみ)。 misaka_error.txt は構文エラー出力である。美坂は起動時にデータ全体に構文チェックをかけ、ミスが含まれている行をこのファイルに出力する。 misaka_debug.txt は実行時デバッグ出力である。美坂は動作中の全ての足取りをこのファイルに出力する。従って何らかの理由で美坂が稼動中に halt もしくは freeze した際、このファイルを見ると一体どこで問題が発生したのかを容易に特定できる。 |
コメント // で始まる行はコメントとして扱われる。コメントはファイル中のどこにあっても確実に無視される。 ただし現在のところ文中/文末コメントは使えない(文頭から // で始まっていなくてはならない)。 コメントは実動作時の動作速度やメモリ消費には影響を与えない。 |
暗号化 misakac.exe を実行すると同一ディレクトリの *.txt が全て暗号化され、*.__1 として出力される。__1 ファイルはプレーンテキストファイルではなくなっているが、misaka.ini でこれらのファイルをインクルードすると正常なデータファイルとして読み込まれる。 このファンクションは、主にゴースト作者が「読むな」という意思を外部に向かって表明するために用いられることを想定している。内容が絶対に誰にも読まれないとは断言できないし、保証もできない。 misakac.exe はとにかく拡張子が .txt であれば変換してしまうので、例えば readme.txt 等美坂とは関係ないファイルが同一ディレクトリにある場合それをどかしておく等の配慮が必要。 |
SAORI システム関数の SAORI 関数の項を参照。 SAORI がそもそも何であるのか、という解説については、本文書では省略する。 |
全体的な傾向、注意点、豆知識等 例えば $z という変数と $Z という変数は全く異なるものとして扱われる。美坂は小文字と大文字を同じものとは考えない。 いわゆる 2バイト文字を含むデータファイルはその 2バイト文字を Shift_JIS で記述すること。 多くの序数情報は 0 オリジンで数えられる。 {$_ref="a,b,c,d,e,f"} を {$_ref=a,b,c,d,e,f} と書いてはならない。 誤っていても(内部的に)面倒を見て動くようにする、ということはない。 例えば $hour という変数があったとしても、それをただ $hour と書くなら単に $hour という文字列でしかない。{$hour} と書いた場合のみ評価され戻り値を持つ。 {$lasthour="$hour"} {$lasthour={$hour}} とした場合、下は変数 lasthour に現在時刻がセットされるが、上では $hour という文字列そのものがセットされる。 変数を評価しないで渡さないと意味がないというケースもある。例えば $append は配列に要素を追加するが、このとき {$append($z,"あいうえお")} を {$append({$z},"あいうえお")} と書いてはならない。このときの $z は変数そのものであり、内容は必要とされていない。 例示
$_OnTest {
上記は誤り。正しくは
$_OnTest
|
戻る |