document

phase 101


  • 100 をリリースした時点で 100 相当のコードは消えていた。原因は知らない。全く同じものをもう一度書き直し

  • phase 100


  • ×hwnd 系システム変数が異常

  • $OnNotify_*

    NOTIFY リクエストが来た際、美坂はまず Reference 引数から適切なシステム変数を作成する等、カーネルとしての最低限の処理を行い、その後、$OnNotify_id というシンボルを持つユーザコードを実行する。Reference 引数は NOTIFY を受けた状態のまま維持される。なお NOTIFY リクエストの性質上ここでスクリプトを返してもそのまま破棄される。

  • ×欠落したスペースを追加して整形し直す際にスクリプトを分断する

    #0

    {
    {$z=""}
    {$if (2==1) {
     {$z=1}{$z++}b
    }}
    {$z}
    }

    #1

    {$z=""}{$if (2==1) { {$z=1}{$z++}b }}{$z}

    #2

    {
    あいう
    えお
    }

    #3

    あいうえお

    #0 は #1 に整形するが #2 は #3 のようにするという人間にとってだけ都合のよい処理

  • phase 99


  • ×関数引数内のいずれかの引数が ) というバイト値を持っているとそこで引数終了と見なされる

  • ×SAORI デバッグ出力が materia のホームディレクトリに出る

  • ×OnDisplayChange ユーザハンドラがコールされない

  • ×popmatchl 関数が最後の要素を取り出す時だけ文字列比較を行わず常に取り出している

  • ×#0 のような記述をした際最終コードが #1 となる

    #0

    {
    {$z=""}
    {$if (2==1) {
     {$z=1}{$z++}b
    }}
    {$z}
    }

    #1

    {$z=""}{$if (2==1) { {$z=1}{$z++}b}}{$z}

    だが、決して間違っているわけではない

  • phase 97


  • $hwnd.sakura / $hwnd.kero / $hwnd.sakuraballoon / $hwnd.keroballoon

    それぞれの HWnd

  • phase 96


  • ×高レベル処理系が全滅

    SHIORI/3.0 に変更した際高レベル処理部の移植をミス。重大なところでは例えば $_OnRandomTalk も含むので致命的

  • debugsaori スイッチが入っているとリクエストヘッダをファイルに記録

  • phase 95


  • SHIORI/3.0

  • getvalueex 追加

  • extractfilename 追加

    テンプレートに filedrop2 受け取りの例を追加

  • phase 94


  • 用途が二通りあり分かりづらかった $length 関数を $count と分化。


  • {$length(s)}

    文字列 s の長さ(バイト数)を返す。


  • {$count(a)}

    配列 a の要素数を返す。添え字はこの関数で得られる値 -1 まで有効。a が単純変数だった場合は常に 1 が返る。a が配列変数でも単純変数でもなかった場合(NULL だった場合)は -1 が返る。

  • phase 93


  • ×変数に 04 のような文字列をセットしようとすると calc を掛けて勝手に 4 になる

  • phase 92


  • ×SAORI のロード後の識別子が必ず小文字になっている

    今後はロードの際のファイル名と完全同一なものだけが正しい識別子となる。

  • phase 90


  • ×現在採用条件式はセミコロンでセパレートするのが正しいが、カンマも通している。この過去互換動作のために起動時に古い形式を新しい形式に整形し直す処理を行っているが、この処理にミスがあり、本来正しい記述であるセミコロンのときに式が破壊され、間違った記述であるカンマのときのみ正常動作する式が「存在する」

    事実がややこしいのでその説明文もややこしい

  • ×昔セミコロンに直したはずのテンプレートがいつの間にかカンマに戻っている

  • phase 89


  • ×変数に空文字列をを代入しようとするとなぜか calc を始めて parse error

  • phase 88


  • ×loadlibrary の基準位置が呼び出し元プロセス(つまり MATERIA)のホームディレクトリ

  • phase 87


  • ×ユーザコードで存在しない SAORI をロードした際に無出力で halt

    一応エラーメッセージが出るのが正しい

  • phase 86


  • ×誤った if 構文により無限ループに陥ったとき、該当式(誤った式)を表示して自ら落ちる

    これくらいはやってもバチは当たらない。

  • phase 85


  • {$calc(expression)}

    expression で示された四則演算式を計算し結果を返す。式は複数項記述/括弧による演算優先順位制御可。例示

    {$calc(1+1)}
    {$calc(1+1*2)}
    {$calc((1+1)*2)}
    {$a=1}{$b=2}{$c={$calc({$a}*5+{$b}*10)}}{$c}点。

    使用できる演算子

    + 加算
    - 減算
    * 乗算
    / 除算
    % 剰余
    ^ べき乗

    小数点数の概念はない。除算の結果小数点数が出た場合それは切り捨てられる。


  • 全く同じエンジンを基本構造拡張にも使用

    説明が面倒なので仕様書の「単純変数」の項を参照

  • phase 84


  • 新しいテンプレート


    旧美坂テンプレートの代表的な問題点

    ランダムトークの間隔が分単位の精度しか持っておらず、質が低い
    起動した後最初の OnMinuteChange で必ず「時」変化イベント(n時になった)が起きる
    起動した後最初の OnMinuteChange で必ず「起動時間」変化イベント(n時経過)が起きる
    \q の書式が一部古い
    \![*] 等の MATERIA B 以降の要素がない


    美坂テンプレートを元に作ったゴーストはほぼ全て上記の傾向があります。

    全てユーザコードの問題なので、OnMinuteChange 付近を見て、必要な部分をコピペして直してください…

  • phase 83


  • $_talkinterval

    システムシンボル $_OnRandomTalk がコールされる間隔。単位秒。

  • $_OnRandomTalk

    システム変数 $_talkinterval で指定された間隔の 0.5 倍から 1.5 倍程度でコールされる。いわゆる「ランダムトーク」を記述する。


    ランダムトークカプセリング構造。

    システム変数 $_talkinterval に値をセットすると、その値の 0.5 倍から 1.5 倍程度の間隔でシステムシンボル $_OnRandomTalk がコールされる。$_talkinterval に 0 をセットすると $_OnRandomTalk はコールされない。

    同じ事はユーザコードでも実現できる。

    従来のユーザコードを用いた分間隔のランダムトークスクリプトとは干渉しない(そのまま動く)。

  • phase 82


    まともな SAORI


  • $loadsaori(filename)

    filename で示された SAORI DLL をロード、ロックする。


  • $unloadsaori(filename)

    filename で示された SAORI DLL をアンロード、アンロックする。


  • $saori(filename,arg0,arg1,arg2....)

    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 をロードし、あとは使いっぱなし、という手法で特に問題はないと思われる。つまり細かく寿命管理したいと思わない限り $unloadsaori は使わなくてよい。細かく寿命管理するメリットについてはここでは省略する。

    なお、SAORI をロードしたまま(明示的にアンロードせずに)美坂が終了する際の動作については何ら考慮しなくてよい。美坂は終了と同時にロードされている全 SAORI を自動的にアンロードする。

  • phase 81


  • ×配列変数の添え字付き参照に失敗

    79 での修正の副作用


  • プロパティハンドラを OFF にできる

    misaka.ini で propertyhandler,0 とすると動かなくなる。

    プロパティハンドラは制御経路を非常に複雑にする。これが開発環境でのデバッグや misaka_debug.txt によるトレースにとってかなりマイナス。また、プロパティハンドラは変数が変化するたびにコールされるので(別に目に見えて重いというわけではないが)冗談で ON にしておくには少々もったいない。

  • phase 80


  • ×elapsedtimetotal 系の起動時復帰に失敗(保存はしている)

  • phase 79


  • ×さくらスクリプトのスクエアブラケットを美坂の配列セパレータと誤認

  • phase 78


  • ×SAORI ロード時の基準ディレクトリが美坂のホームディレクトリでなく MATERIA のホームディレクトリ

  • phase 77


  • {$saori(filename,arg0,arg1,ag2....)}

    filename で示された saori DLL をロードし、arg を argument ヘッダとしてセットして request をかける。saori が response を返すまでブロッキングする。filename は美坂が位置するディレクトリからの相対パスで指定する。指定された DLL が存在しない、もしくはリクエスト中に SAORI 内部でエラーが起きた場合、落ちる。例示

    {$temp={$saori("substr.dll","あいうえお",2,3)}}{$temp}
    
    substr.dll が現在里々に同梱されている substr.dll である場合、$temp には「いうえ」がセットされる。

  • phase 76


  • {$substringw(s,m,n)}
  • {$substringwl(s,n)}
  • {$substringwr(s,n)}

    ワイド文字 substring。バイト数ではなく見かけ上の文字数でカウントする。それ以外は substring と同じ。例示

    {$temp="あaいbうcえdお"}{$substringl({$temp},3)}
    {$temp="あaいbうcえdお"}{$substringlw({$temp},3)}
    
    上の結果は「あa」、下の結果は「あaい」


  • ×75 の変更によってテンプレートの名前入力部が誤った文法になっていた

  • phase 75


  • 同名のユーザ変数と辞書変数が同時に宣言された場合、常に辞書変数を優先(辞書変数と同名のユーザ変数は使用できない)

    従来はユーザ変数優先だった。

  • phase 74


    書式の追加

  • {$da[z]}

    辞書変数もしくは配列変数 da の z 番目の文字列を返す。

  • phase 73


  • {$length(sa)}

    sa が単純変数だった場合、文字列 sa の長さ(バイト数)を返す。sa が配列だった場合、配列の要素数を返す。

  • phase 72


  • 暗号化アルゴリズム変更

    __0 破棄、__1 へ。アルゴリズムはさらに退化。

  • phase 71


  • 暗号化

    misakac.exe を実行すると同一ディレクトリの *.txt が全て暗号化され、*.__0 として出力される。__0 ファイルはプレーンテキストファイルではなくなっているが、misaka.ini でこれらのファイルをインクルードすると正常なデータファイルとして読み込まれる。

    このファンクションは、主にゴースト作者が「読むな」という意思を外部に向かって表明するために用いられることを想定している。そのため内容が絶対に誰にも読まれない、とは断言できないし、保証もしない。


    misakac.exe はとにかく拡張子が .txt であれば変換してしまうので、例えば readme.txt 等美坂とは関係ないファイルが同一ディレクトリにある場合それをどかしておく等の配慮が必要となる。


    暗号化アルゴリズムは非常にぬるいです。

  • phase 70


  • ×NOTIFY OtherGhostNames を受けた瞬間に halt

  • phase 69


  • ×$otherghostlist が GhostEx ヘッダの生データをそのまま返している

  • phase 68


  • ×$otherghostlist が常に何も返さない

  • phase 67


  • {$index(substr,s)}

    文字列 s 中から文字列 substr を探し、その先頭位置を返す。単位バイト。

  • {$insentence$(s,substr,substr,substr....)}

    文字列 s 中から文字列 substr を探し、全てが存在するかどうかを bool 値で返す。引数の最大数は無限。
    
    {$insentence("human","hum")} == true
    {$insentence("human","hux")} == false
    {$insentence("human","hum","uma","u")} == true
    {$insentence("human","hum","hua")} == false
    
    
    index が最下位関数、次が insentence、カプセリングしすぎなのが inlastsentence

  • phase 66


  • ×isequallastandfirst 関数に空文字列を渡すと halt

  • phase 65


  • ×検索結果が null になる search(検索しても一件もヒットしない条件による search)を行うと halt

  • phase 64


  • {$otherghostlist}

    配列。現在同一デスクトップ上に存在する他のゴーストのリスト。自分しかいない場合は null。

  • phase 63


  • {$copy(a0,a1)}
  • {$pop(a0)}
  • {$popmatchl(a,s)}

    以上の配列制御関数追加。

  • {$substringfirst(s)}
  • {$substringlast(s)}

    以上の文字列制御関数を追加。


    テンプレートに「しりとり」サンプル追加。


    仕様書

  • phase 62


  • ×複数行記述のために開かれた {} エリア内で // によるコメントが使用できない

  • phase 61


  • 配列変数の概念追加。

  • {$append(a,s)}
  • {$stringexists(a,s)}

    以上の配列制御関数追加。

    仕様書
    仕様書

  • phase 60


  • {$hiraganacase(s)}

    カタカナ交じりの文字列 s を全てひらがなにして返す。漢字等変換不能なものはそのまま残される。


  • {$isequallastandfirst(s0,s1)}

    s0 の終端1文字と s1 の先頭1文字が同一かどうかを判定し bool 値を返す。この関数は MBCS を考慮する(バイトではなく文字単位で比較する)。

  • phase 59


  • システム変数 $lastsentence 追加

  • テンプレートにユーザに名前を入力させるサンプル追加
  • テンプレートの \q を新しいものに変更

  • phase 58


  • ×2バイト目にバイト値 0x7b を含む文字が if 論理式部に出現するとパースに失敗

    初歩的

  • phase 57


  • null が代入された変数は内部的に消す

    主に misaka_vars.txt の肥大化対策。例えば {$temp=""} として終了すれば $temp が misaka_vars.txt に保存されることはない。

  • phase 56


  • misaka.ini の error エントリで misaka_error.txt 出力可否選択、デフォルト OFF

  • phase 55


  • 文頭/文末の文字でないコードを除去してしまう

    recommendsite 等ではこれらがセパレータであるため勝手に除去すると問題が出る

  • phase 54


  • getmousemovecount(n,m)

    サイド n の部位名 m で示される部位の OnMouseMove カウントを返す。このカウント数を判定することでいわゆる「撫で反応」の敏感さを制御できる。例示
    
    $OnMouseMove,{$if (64<={$getmousemovecount(0,"Bust")})}
    {$resetmovecount(0,"Bust")}\0\s0胸撫で反応。\e
    
    $OnMouseMove,{$if (32<={$getmousemovecount(0,"Bust")})}
    \0\s0胸撫でられ疑惑反応。\e
    
    
  • resetmousemovecount(n,m)

    サイト n の部位名 m で示される部位の OnMouseMove カウントを 0 にリセットする。


    これも低レベルにやろうと思えばできる‥‥というより、今までずっとそうだった。

  • phase 53


  • $backup()

    引数なし。美坂がオンメモリで持っている情報全てをディスクに書き込みバックアップする。処理内容的には終了時に自動で行われる変数保存処理と同じ。

  • phase 52


  • $daysfromfirstboot

    初回起動した日からの経過日数。単位 day。

    一見して隠蔽アプローチに見えるが、違う。どうしても低レベル処理でやりたければ書き方次第でやれる。

  • phase 51


  • 通算起動時間の記録限界を無限に

    従来は longint の範囲でオーバーフロー(約50日程度)

  • phase 50


  • elapsed 系システム変数の仕様変更

    従来、経過時間が例えば 4000 秒だった場合、

    $elapsedsecond 4000
    $elapsedminute 66
    $elapsedhour 1

    であった。これはこれで正しいが、システムの性質上おそらくこのような値が真っ先に期待されるケースは非常に少ない。よって今後は

    $elapsedsecond 40
    $elapsedminute 6
    $elapsedhour 1

    とする。合計秒なり合計分が欲しい場合だけ再計算が必要になる。

    この変更は、プリフィクスに elapsed が付いている時間系変数全てに適用される。

  • phase 49


  • ×文中 if の true ないし false 節に複数の代入文を書いた際、2つ目以降の代入文が正しく評価されない

    例えば
    {$esecond={$elapsedsecond}}
    {$if ({$esecond}>=3600) { {$ehour={$esecond}}{$ehour/=3600}{$etemp={$ehour}}{$etemp*=3600}
    {$esecond-={$etemp}} }}
    {$if ({$esecond}>=60) { {$eminute={$esecond}}{$eminute/=60}{$etemp={$eminute}}{$etemp*=60}
    {$esecond-={$etemp}} }}
    

  • phase 48


  • ×コミュニケート受信部が全死

  • phase 47


  • ×OnUpdateComplete を受けると落ちる

  • ×$daysfromlastupdate の返す値が異常

  • phase 46


  • #_Common

    #_Common シンボルで宣言された論理式は、当該ファイル内の全てのシンボルに関係演算子 && で付与される。この構造は主に多モードを持つゴーストで有効である。つまり、#_Common でモード判定式を記述すれば、以降そのファイル内で一切モード判定式を書く必要がなくなり、単にファイルを分けるだけで多モードを実現できるようになる。例示

    #_Common
    {$if ({$mode}==0)}
    
    当該ファイルのシンボル全てに論理式 {$if ({$mode}==0)} が付与される。

  • phase 45


  • ×文中 if で、条件分岐の前に代入文が実行される

    phase 24 で一度修正されていたが、phase 36 で可変シンボル名による疑似 if を実現した時から別の問題を抱えていた。

  • phase 44


  • sequential


    sequential パラメータが指定された辞書変数は、必ず要素 0 から順に読まれ、全要素が一巡すると再び 0 に戻る動作を繰り返す。この性質は主にある程度の間隔を置きつつ連続して話させたい一連のセンテンスを制御するために用いる。例示

    $_alphabet; sequential;
    A
    B
    C
    D
    E
    F
    
    $_alphabet はコールされるたび ABCDEFABCDEF... の順で文字列を返す。

  • phase 43


  • $daysfromlastupdate


    最終ネットワーク更新日からの経過日数を返す。単位 day。例示

    $_OnBoot; {$if (7<={$daysfromlastupdate})};
    \0\s0そろそろネットワーク更新して欲しい。\e
    
    $_OnBoot \0\s0通常。\e
    上記の例では、ネットワーク更新せずに7日経過すると更新を催促する。


    これをローレベルにやるためには、OnUpdateComplete で日付を何らかの変数に保持し、チェックする際に読み出して現在日付との差を計算すればよい。例は省略。

  • phase 42


  • nonoverlap


    nonoverlap パラメータが指定された辞書変数は、全要素が一巡するまで絶対に取得要素が重複しない。ただし全要素からランダム取得されることに変わりはない。この性質は主にランダムトークの重複をブロックするために用いる。例示

    $_OnTalkCore; nonoverlap;
    A
    B
    C
    D
    E
    F
    
    $_OnTalkCore は通常の辞書変数同様コールされるたびリストからランダムに文字列を返すが、連続で呼び出しても例えば「ADBFEC」「CFADEB」のように全要素出現まで絶対に重複した要素が出ない。

  • phase 41


  • シンボル名のパラメータセパレータをカンマからセミコロンに変更


    旧美坂

    $_OnTalk,{$if ({$random({$talkinterval})}==0)}

    新美坂

    $_OnTalk; {$if ({$random({$talkinterval})}==0)}; nonoverlap;


    セミコロン前後には自由な個数ホワイトスペースを入れてよい。入れなくてもよい。

    現在は旧互換コードがあり両形式を同じように読む

  • phase 41


  • ×完全に同一な識別子を持った式が複数あった場合、それらが全く同じ評価結果を得る

    同じにならないようにデザインしたはずがそうなっていなかった。例示
    $_OnTest
    {$msvo} - {$msvo} - {$msvo}
    
    旧美坂では3つが必ず同じものになってしまう。それはデザインに反する。

  • phase 40


  • $os.version
  • $os.name
  • $os.freememorysize
  • $os.phisicalmemorysize
  • $os.totalmemorysize
  • $cpu.vendorname
  • $cpu.name
  • $cpu.clockcycle


    以上のシステム変数を追加。詳しくは仕様書参照。

  • x2misaka


    他の SHIORI サブシステムのデータファイルを美坂にとって意味のある形に変換/再編集する。


  • 里々のデータを変換するには


    里々のゴーストデータが存在するディレクトリに x2misaka.exe を配置し、実行。

    misaka_from_satori.txt が出力される。


  • 偽栞のデータを変換するには


    偽栞のゴーストデータが存在するディレクトリに x2misaka.exe を配置し、実行。

    misaka_from_niseshiori.txt が出力される。


    出力されたファイルは美坂形式に変換されたデータファイルで、そのまま美坂で使用できる。ただし現状全くの手作業なしでそのまま実行できるようなレベルまでは変換してくれない。感覚的には、全くの手作業で作業を行った場合の作業量を 100 とした場合、大体これを 30 程度まで軽減してくれる。

  • phase 39


  • search(n,n,n,n....)

    シンボル名に引数で渡された文字列全てが含まれているシンボルの中からランダムに一つのシンボルを選択し式を評価して戻り値を返す。引数の数に制限はない。例示
    $_OnTest
    {$search("human","japan")}
    
    $_OnTest2
    {$search("male")}
    
    $human-male-japan
    A
    
    $human-female-japan
    B
    
    $human-male-korea
    C
    
    $human-female-korea
    D
    
    $_OnTest には A ないし B が、$_OnTest2 には A ないし C が返る。

    ※対偽栞


  • dll から自動コンバート機能を削除

    x2misaka として独立

  • phase 37


  • imitationif(n,n,n,n....)

    擬似 if を再現する。式を第一引数から順に評価し、値が返ったところでそれを戻り値にして抜ける。

    ※対里々

  • phase 36


  • 変数識別子名の一部に変数名が使える

    例示

    {$temp=1}{$OnBoot{$temp}}

    これは {$OnBoot0} と同じ意味を持つ。

    ※対里々

  • phase 35


  • $choice(n,n,n,n,n,n....)

    引数で渡された式のうちランダムに一つを返す。引数の最大数に制限はない。例示

    $b
    this is test.

    $_OnTest
    {$choice("あいうえお",{$b},256)}

  • phase 34


  • 演算子 *= /= 追加

    割り算は小数点以下切り捨て。例示

    {$temp=3}{$temp*=2}{$temp}
    {$temp=3}{$temp/=2}{$temp}

    結果はそれぞれ、6、1。

  • phase 33


  • システム変数 $elapsedhour $elapsedminute $elapsedsecond 追加

    ゴーストの連続起動時間。それぞれ、時、分、秒。

  • システム変数 $elapsedhouros $elapsedminuteos $elapsedsecondos 追加

    OSの連続起動時間。それぞれ、時、分、秒。

  • システム変数 $elapsedhourtotal $elapsedminutetotal $elapsedsecondtotal 追加

    ゴーストの累計起動時間。それぞれ、時、分、秒。

  • phase 32


  • システムシンボル $_BalloonOffset 廃止

    プロパティハンドラと appendheader を用いて自力で構築すること。

  • 起動毎に misaka_debug.txt をいったんクリア

  • phase 31


  • ×$year、$month、$day が全く動いていない

  • $appendheader(s) 関数

    直後のレスポンスに s で示されるヘッダを挿入。例示

    {$appendheader("Extra: 芋")}

    見たままのヘッダが追加される。連続で呼べば読んだ数だけヘッダが増える。ただしそのヘッダが付くのは直後のレスポンス1回のみ。

    これによりコミュニケートの相手を指定する手法は {$to} への代入と {$appendheader("To: ....")} の呼び出しによる高/低レベルの 2方向に分化。例示

    {$appendheader("To: 陽子")}
    {$to}

  • phase 30


  • $_(n) 関数廃止

    こんな特例は認められない。

    もっともこの特例が消滅しても依然として関数を複数行で書くことはできる。例示


    $isxmaseve
    {
      {$
        if (({$month}==12)
        &&  ({$day}==24))
      }
    }
    
    $OnBoot,{$isxmaseve}
    \0\s0\1\s0\0クリスマスイブ。\e
    
    $OnBoot
    \0\s0\1\s0\0それ以外。\e
    

  • phase 29


  • $dayofweek

    現在の曜日を整数値で返す。0 が日曜で 6 が土曜。


  • phase 28


  • adjustprefix 関数

    敬称を制御する。下記の低レベルな文字列制御関数を使っても全く同じ事ができる。adjustprefix のアプローチはいわば偽栞的な隠蔽アプローチ、下記の低レベルな文字列制御関数のみを作って後は面倒を見ないのが華和梨的なアプローチと言える。美坂はその両方を提示してその差自体を認識させる。例示

    {$adjustprefix("がおちゃん","さん")}

  • phase 27


  • システム関数の引数にダブルクォートした文字列リテラルを渡すとクォートまで使用される

    旧栞は例えば以下の関数の処理を誤る。

    {$adjustprefix("がおちゃん","さん")}

  • phase 26


  • 低レベル文字列制御関数の追加

  • {$substring(s,offset,count)}
  • {$substringl(s,count)}
  • {$substringr(s,count)}
  • {$length(s)}

    substring は文字列 s の offset バイト目から count バイトを返す。
    substringl は 文字列 s の左端から count バイトを返す。
    substringr は文字列 s の右端から count バイトを返す。
    length 関数は文字列 s の長さ(バイト数)を返す。

    全てバイト指定であり文字数指定ではないことに注意。

  • phase 25


  • ×関係演算子 != を用いた文字列比較が正常動作していない

    常に false が返っていた。数値の比較は正常だった。

  • phase 24


  • ×文中 if で、条件分岐の前に代入文が実行される

    {$temp="not ready"}{$if (true) { {$temp="istrue"} } else { {$temp="isfalse"} }}{$temp}

    致命的なバグ。例えば上の式で、旧美坂は処理順を誤り、$if の分岐結果に関わらず $temp が常に isfalse になる。

  • phase 23


  • ×代入文でダブルクォートを使うとクォート部分も代入される

  • プロパティハンドラ

    ユーザ変数全てをプロパティと見なし、変数が変化した際に同時に行う処理を記述できる。プロパティハンドラはシステムシンボル $_OnPropertyChanged で定義され、変化した変数名はシステム変数 $name にセットされる。

    もちろんプロパティハンドラは無くてもよい(その場合は旧来通り名実ともに単純変数となる)。そもそもプロパティハンドラを要する変数の方が特殊である。プロパティハンドラは例えばモードが変化した際に特定の値を初期化する等の用途に使う。例示


    $OnChoiceSelect,{$if ({$reference(0)}=="changemode")}
    {$mode=0}

    $_OnPropertyChanged,{$if (({$name}=="$mode") && ({$mode}==0))}
    {$modestring="モード0"}

    $_OnPropertyChanged,{$if (({$name}=="$mode") && ({$mode}==1))}
    {$modestring="モード1"}

    $_OnPropertyChanged,{$if (({$name}=="$mode") && ({$mode}==2))}
    {$modestring="モード2"}


    プロパティハンドラは完全な構文イベントであり、例えスクリプトを返しても捨てられる。

  • phase 22


  • テンプレートゴーストがインストールされていたディレクトリ名 templete はスペルミスで正しくは template

  • 加減演算子 ++ -- 追加

    なぜか無かった。例示

    {$z++}
    {$z--}

    それぞれ $z に 1 を加算、もしくは $z から 1 を減算。

  • phase 21


  • mai.dll をインポートしない

  • phase 20


  • ローカルスコープで絶対行を参照する {$_(n)} 関数追加(現在の実装ではコマンド部でのみ有効で中途半端)

  • 汎用ブロック構造と {$_(n)} の組み合わせによるコマンドブロック生成


    以下の記述は等価。


    $_OnTest,{$if (({$test2}=="2") && ({$test3}=="3") && ({$test0}=="0") && ({$test1}=="1"))}
    \0\s0テスト0\e
    \0\s0テスト1\e


    $_OnTest,{$_(0)}
    {
    $if (({$test2}=="2")
    && ({$test3}=="3")
    && ({$test0}=="0")
    && ({$test1}=="1"))
    }
    \0\s0テスト0\e
    \0\s0テスト1\e


    開き忘れや閉じ忘れの責任は記述者が負う。

  • phase 19


  • 汎用ブロック構造


    以下の記述は等価。


    $_OnTest
    \0\s0\1\s0\0ねえ。\w8\w8\1\s0ん?\w8\w8\0\n\nどうしてあんなに寒いの?\w8\w8\1\n\n‥‥\w8\w8いや、意味がよく。\e
    \0\s0\1\s0\0ねえ。\w8\w8\1\s0ん?\w8\w8\0\n\n‥‥\w8\w8いや、いい。\w8\w8\1\n\n‥‥\w8\w8何だよ。\e
    \0\s0\1\s0\0テスト。\e


    $_OnTest
    {
    \0\s0\1\s0
    \0ねえ。\w8\w8
    \1\s0ん?\w8\w8
    \0\n\nどうしてあんなに寒いの?\w8\w8
    \1\n\n‥‥\w8\w8いや、意味がよく。
    \e
    }
    {
    \0\s0\1\s0
    \0ねえ。\w8\w8
    \1\s0ん?\w8\w8
    \0\n\n‥‥\w8\w8いや、いい。\w8\w8
    \1\n\n‥‥\w8\w8何だよ。
    \e
    }
    \0\s0\1\s0\0テスト。\e


    開き忘れや閉じ忘れの責任は記述者が負う。


    注意

    パーサがぬるいので現在のところブロック開始と終了を示すブレスは必ず独立した行で置かなくてはならない。例示

    { \0\s0\1\s0
    \0ねえ。\w8\w8
    \1\s0ん?\w8\w8
    \0\n\n‥‥\w8\w8いや、いい。\w8\w8
    \1\n\n‥‥\w8\w8何だよ。
    \e
    }

    上記は誤り。

  • phase 18


  • リテラルのダブルクォート

    今後文字列リテラルのクォートは必須とする。なくても動きますが。


    以下の式は全て等価。


    {$if (({$test2}==2) && ({$test3}==3) && ({$test0}==0) && ({$test1}==1))}

    {$if (({$test2}=="2") && ({$test3}=="3") && ({$test0}=="0") && ({$test1}=="1"))}

  • phase 17


  • 曖昧なスペース管理

    無駄なスペースを入れてもパースに失敗しない。


    以下の式は全て等価。


    {$if (({$test2}==2) && ({$test3}==3))}

    {$if ( ({$test2}==2) && ({$test3}==3) )}

    {$if (({$test2}==          2) &&   ({$test3}==3))        }

  • phase 16


    システムシンボル $_BalloonOffset 追加

    バルーンオフセットを SHIORI から制御。

    phase 15


    if の論理式内に バイト値 } を持つ文字列(「日本赤十字狂会」等)が存在すると誤評価

    phase 14 beta


    引数なしで isghostexists() をコールすると他ゴーストが一人でも存在していれば true

    無差別爆撃用。

    phase 13 beta


    GET String 系に対する返答が仕様通りでない

    phase 12 beta


    inlastsentence 拡張。inlastsentence 関数はその性質上一つの if エレメント中に複数連続する可能性が高く、それによって可読性が低下することが懸念される。そのため、ヒットチェックする単語を引数で連続して与えることを可能とした。例示


    「話し掛けてきた相手が「花ちゃん」で、かつ「さかな」と「川」がヒット」の表現

    旧美坂

    {$if (({$sender}==花ちゃん) && ({$inlastsentence(さかな)}) && ({$inlastsentence(川)}))}

    新美坂

    {$if (({$sender}==花ちゃん) && ({$inlastsentence(さかな,川)}))}

    phase 11 beta


    3項以上無限数の連続論理式関係演算

    従来、3項以上の比較は関係一つ一つを適切に括弧でくくる必要があった。しかし、本 phase より 3項以上の比較を同一の括弧の中に複数記述できる。例示


    C

    if (a==0 && b==0 && c==0)

    旧美坂

    {$if ({$a==0} && ({$b==0} && {$c==0}))}

    新美坂

    {$if ({$a==0} && {$b==0} && {$c==0})}

    phase 10 beta


    ×{$if (0<{$facemovecount}) { {$facemovecount-=1} }} のような構文を用いると処理部省略と見なされて true or false が返る

    phase 9 beta


    テンプレートゴーストに撫で判定追加

    $_OnInitialize 廃止。起動時に読まれるシンボルは $_Variable と $_Constant に変化。両者の違いは読まれるタイミング。$_Variable は起動と同時に呼ばれ、変数の自動復帰が行われ、その後 $_Constant が呼ばれる。過去互換維持のため $_OnInitialize もコール中。

    ×テンプレートゴーストにおいて、OnMouseDoubleClick のデフォルトハンドラ(メニュー表示部)が突き判定部より前にあるため論理的に絶対に突き判定が発生しない

    phase 8 beta


    自分で変えた仕様にテンプレートゴーストが付いていってなかった

    phase 7 beta


    シンボル内データ定義中に空行とコメントが使用可能。例示


    $_OnTalk,{$if (({$mode}==0) && ({$random({$talkinterval})}==0))}

    // 貧乏ネタ

    \0\s0{$ms}の家計、2ヶ月前から火の車らしいよ。\w8\w8\1\s0むう。

    // 火事ネタ

    \0\s0{$ms}の家が燃えたらしいよ。\w8\w8\1\s0むう。


    人にとって見やすい上記の記述は機械にとって無駄がない下記の記述と等価。


    $_OnTalk,{$if (({$mode}==0) && ({$random({$talkinterval})}==0))}
    \0\s0{$ms}の家計、2ヶ月前から火の車らしいよ。\w8\w8\1\s0むう。
    \0\s0{$ms}の家が燃えたらしいよ。\w8\w8\1\s0むう。

    phase 6 beta


    ロード時に構文をチェックし、誤りがあれば misaka_error.txt に誤っている行を書き出し、異常を伝えるダイアログを出し、起動取りやめ

    phase 5 beta


    $to に宛名を設定しても Communicate Send にならない

    Communicate を受けても $_OnGhostCommunicateReceive がコールされない


    要するに Communicate 周り全死でした。切腹。

    phase 4 beta


    全ユーザ変数の自動保存/自動復帰

    phase 3 beta


    辞書の任意ファイル分割

    phase 2 beta


    $getvalue
    および時計合わせ機能時の時刻読みサンプル

    ×コミュニケートが実は全く動作していなかった

    phase 1 beta


    付いていたが書き忘れていた構文や仕様を仕様書に追記

    ×テンプレートゴーストの見切れ判定と重なり判定が全く動いてないわけではないがどうしようもなく異常

    phase 0 beta


  • December 30, 2001 (Sun)


    メールチェック
    時計合わせ
    ヘッドラインセンス
    その他、現在まで残留した全てのイベントハンドリング

    beta release


  • December 29, 2001 (Sat)


    トーク間隔設定
    突き判定
    見切れ判定
    重なり判定
    Get String
    対ゴーストコミュニケート


  • December 28, 2001 (Fri)


    適宜変数追加
    ダブルクリックメニュー
    ランダムトークテンプレート
    シェル変化
    ゴースト変化


  • December 27, 2001 (Thu)


    論理式評価パーサ
    基礎構造策定

  • 戻る