SAORI関連文書。

----
#contents
----
~

*さおりとは [#z4d753ee]
ゴーストに関数・機能追加を行うSIORIから利用するプラグインで、dllやexe形式で提供されます。~
なお[[ssu>外部関数/ssu]](ssu.dll)はゴースト「ポストと狛犬」に標準で組み込まれているさおりです。~
偽林檎で使用できるさおりはこのssuのみです。他のさおりは一切使用できません。~
解説サイト、SAORI集サイトのリンク~

-[[さおりちゃんと遊ぼう:http://www.geocities.jp/poskoma/tips/saori.html]]
-[[さおこれ:http://umeici.onjn.jp/etcetera/saoricollect.html]]
-[[さおりん:http://priest.so.land.to/nisesakura/saorin.html]]


*さおりを使う [#e97e5d17]
1.ghost\master\saoriフォルダに、使いたいさおりを置く~
2.satori_conf.txtの「@SAORI」以降の行に、次のように書く(例中の「[]」は不要)~
 [使うさおりの適当な短縮名],saori/[「.dll」込みの使うさおりのファイル名]
3.実際にさおりを使うときは、文中で次のように書く~
 引数を必要としないさおりならば、カンマ以降は省略可

 ([使うさおりの適当な短縮名],[引数1],[引数2],…)

MIYさんのmciaudio.dllを組み込む例。

2. 
  mciaudio,saori/mciaudio.dll

3. 
  (mciaudio,load,鳥の詩.mp3)(mciaudio,play)

さおりはsaoriフォルダに置く必要はない。~
里々と同じフォルダに置く場合、上の例の「saori/」が不要。~
短縮名は自分の好きな名前に設定できる。~
「、」「,」などの区切り文字は追加、削除できる。([[特殊変数]] > [[引数区切り追加・削除>特殊変数#f7ace755]])~

ちなみに「@SAORI」であらかじめ引数付きで設定しておくと、
 曲読み込み,saori/mciaudio.dll,load
 演奏,saori/mciaudio.dll,play
文中で下記のように呼び出しできるようになる。

 (曲読み込み,鳥の詩.mp3)(演奏)


**補足 [#v8804428]
配布されているさおり同梱の説明は里々以外の栞に向けて書かれている事が多いので、ちょっと説明。

-Argument0,Argument1,…(Arg0,Arg1,…)

これはさおりの引数です。(「第○パラメータ」と書かれてる事もあります)~
里々では上記の[引数1],[引数2]...にあたります。~

 ([使うさおりの適当な短縮名],[Argument0],[Argument1],…)

-Value0,Value1,…

これはさおりからの返り値です。~
里々ではこれらを(S0),(S1),…と書いて取得します。~
(例:日時取得時に時分秒を付ける)~

「相対パス」はそのSAORIの置いてある位置から辿ったパスです。(※違う場合もあるかもしれません)~
例えばさおりがghost\master\saoriフォルダに入っていて、指定したいimagel.pngファイルがghost\master\saori\skinsの中にある場合「skins\imagel.png」と書きます。~

引数にウィンドウハンドル(HWND)を入れるよう指示するさおりもあります。それは下記の「ウィンドウハンドルのつかいかた」を参考にして入れてください。大抵の場合(本体ハンドル0)を使えばOK。 


**SAORI-basicのタイムアウト [#i42ff11c]
里々ではSAORI-basicも標準でuniversalと区別無く使用できる様になっていますが、タイムアウトが設定されている為スグに値を返さない物はタイムアウトエラーになります。回避する方法としては[[ClearBrain Systemsさん>http://homepage3.nifty.com/khsoft/cbs/software/]]の、SAORI "Basic" Proxy DLLを使用して下さい。 


*さおりを意図したタイミングで使う(同期呼び出し) [#yfe6af59]
例えば1回のトーク中でfill_desktopを複数回呼んでも、期待するような動作はしないでしょう。~
これは何故かというと、「栞がmateriaからのリクエストを受け、辞書からさくらスクリプトを 組み上げて返す」というプロセスが、ゴーストの喋り始める前の段階で行われているからです(「れしば」へはリアルタイムに報告するので、眺めてると順序がわかるでしょう)~
で、喋り途中でダイナミックに演出を行う方法なんですが、一応用意されてます。さくらスクリプトの \![raise,……] というコマンドがそれ。~

以下サンプル。

 *
 :いくよー。\w9\w9\w9
 まず赤。\![raise,塗りつぶし,255,0,0]\w8\w8
 次は青。\![raise,塗りつぶし,0,0,255]\w8\w8
 でもって黄色。\![raise,塗りつぶし,255,255,0]\w8\w8
 おしまいっと。\![raise,塗りつぶし解除]
 
 *塗りつぶし
 (fill_desktop,(R0),(R1),(R2))
 
 *塗りつぶし解除
 (fill_desktop)

ちなみに「さとりて」経由だと\![raise]は効かない模様。多分セキュリティ上の理由なんでしょうけど、でもlocalだしな。想定された動作なのか微妙。

**新くて簡単な方法 [#edc2c44c]
 (sync,fill_desktop,255,255,0)
とすると「しゃべり途中に同期して」黄色く塗りつぶされます。~
返値は捨てられます。挿入されたりはしません。~

よく使うものであれば、replace.txtに 
 filldt【タブ】sync,fill_desktop
と書いた上で(filldt,255,255,0)とかすると楽。

使いどころは http://www10.plala.or.jp/sryu/nanika/tips/#saori_raise 辺りを読むとわかりやすいかと。~
栞は、実際にしゃべりだす直前に、辞書からトーク内容を作っているわけです。~

-○>これってSAORIでなくてもsetや他の関数でも同期呼び出しできるんでせぅか?~
-カッコで呼び出せるものであれば何でもいけるハズです。 


*ウィンドウハンドルのつかいかた [#y04ba362]
ウィンドウハンドルの通知時に *hwnd が呼ばれる。~
ここで変数に保存するか、さおりに直接渡す。~
(R0)には本体ウィンドウ、(R1)にはバルーンウィンドウのハンドルが入ってくる。~
それぞれ、\0,\1,\2...(\2以降はCROW/SSP限定)のハンドルがバイト値1で区切られたものである。~
これをsplitで分割して、目的のウィンドウハンドルを得る。~

 例)
 *hwnd
 (split,(R0),(sprintf,%c,1))
 $本体ハンドル0=(S0)
 $本体ハンドル1=(S1)
 (split,(R1),(sprintf,%c,1))
 $バルーンハンドル0=(S0)
 $バルーンハンドル1=(S1)
 
 #\0・\1の本体・バルーンのハンドルを変数に保存する。~
 #この変数をハンドルを必要とするさおり呼び出しに使用する。~
 #(S2)以降を参照することで\2以降のハンドルも取得できるが、~
 #ウィンドウが初期化されていない場合無効なハンドルが~
 #渡されてくるかもしれない。(未検証)~


*「カッコずらずら → \nずらずら」を回避する [#d3c0b9ae]
連続してSAORIを使うときなど、改行していくと\nが連なってしまう問題を回避する。 

 (nop,
 (あれ)
 (これ)
 (それ)
 (どれ)
 )
内部関数nopは「何もしない」。引数も無視される。

nop関数はset_wall_paper.exeなど使うと必ず返り値が返ってきてしまうさおりでトーク中に返り値を表示したくない時にも使います。 

 *
 :(nop、(set_wall_paper、img.bmp、1))壁紙貼りつけたよー。

ただし以下のように記述するとさおりが動作しなくなるので注意。 

 *
 :(nop、(sync、set_wall_paper、img.bmp、1))壁紙貼りつけたよー。

(そもそもsyncを使うと返り値が返らなくなるのでnopを使う必要はありません) 


*バイト値1のつくりかた [#k0b88523]
 (sprintf,%c,1)
でバイト値1が返る(satori_conf.txtにsprintf,saori/ssu.dll,sprintfの登録が必要)。
hwndの分割にはこれを使う。 

里々134-901以降次の書式で作れるようになりました。 
 (バイト値,1)



*ssu.dllを使おう [#h5c7d125]
里々で文字列操作を行う場合、必須となるSAORI。~
色んな関数が使える。~
ポストに同梱。~
satori_conf.txt に定義もされており、すぐにテストできる。~

参考:[[外部関数/ssu]]


以下里々の履歴より抜粋。
----

 条件分岐
 if,真偽,真結果[,偽結果]
 unless,真偽,偽結果[,真結果]

 条件並列分岐
 switch,左辺,右辺1,結果1,右辺2,結果2,...

 数値による分岐
 nswitch,数値,結果1,結果2,...

 部分文字列の抜き出し
 substr,文字列,位置,文字数

 文字列の分割(返値は個数、複数返値に分割結果を格納)
 split,文字列[,分割文字[,最大分割数]]

 文字列中の「前」を「後」に置換
 replace,文字列,前,後
 replace_first,文字列,前,後

 文字列中の「対象」を消去
 erase,文字列,対象
 erase_first,文字列,対象

 文字列中に「対象」がいくつあるか数えて個数を返す
 count,文字列,対象

 2つの文字列が等しければ1,さもなくば0を返す
 compare,文字列1,文字列2

 文字列の先頭が頭文字列であれば1,さもなくば0を返す
 compare_head,文字列,頭文字列

 文字列の末尾が尾文字列であれば1,さもなくば0を返す
 compare_tail,文字列,尾文字列

 文字数を返す
 length,文字列

 「数字、アルファベット、一部の記号」を半角全角変換。
 zen2han,文字列
 han2zen,文字列

 計算式を計算して結果を返す。ifやswitch等の引数は、暗黙のうちにこれを実行しています。
 calc,計算式

 計算式を計算して結果を返す。少数も扱える。
 calc_float,計算式

 引数が空文字列であれば 1 、さもなくば 0 を返す。
 is_empty

 引数が数値であれば 1 、さもなくば 0 を返す。
 is_digit

 引数が英字列であれば 1 、さもなくば 0 を返す。
 is_alpha

 一つの左辺に対し、複数の右辺を順番に比較していきます。
 iflist

 *OnBoot
 :(iflist、(現在時)、
 <6、こんばんは。、
 <11、おはようございます。、
 <18、こんにちは。、
 <24、こんばんは。)

 カタカナとひらがなの相互変換。文字列比較用かな。
 kata2hira
 hira2kata

 sprintf
 書式指定出力。printfとしてはかなりサブセットですが。
 具体的には(sprintf,d:d,(現在時),(現在分))で時刻の二桁出力ができます。
 詳しく知りたい場合は「printf 書式」とかで検索すると……出てはくるでしょうけど。



*引数がSAORIで処理する前に計算されてしまうのを防ぐ [#t7c441c9]
例えばこう記述して「1+1+1」内の「+」を消そうとすると 

 (erase、1+1+1、+)

「1+1+1」がerase処理前に計算され、「111」ではなく「3」という結果が出てしまう。
計算されなくても全角数字にが勝手に半角になってしまい困る場合もある。

**対処法・1 [#tf5b3d35]
 (erase、"1+1+1"、+)

このように「"」で囲めば「1+1+1」が計算されるのを防ぎ、「"111"」と出る
(ダブルクオーテーションに限らず、数字/算術記号でなければなんでも可)
ただしこの場合「"」が邪魔になってしまうので 

 (erase、(erase、"1+1+1"、+)、")

こうやって「"」も消しておく。


**対処法・2 [#kc1ca139]
上記の方法が面倒な場合はこちらを。 

 $SAORI引数の計算【タブ】無効

SAORIを使う前にこう記述すると引数の計算を防ぐ事ができる。

ただこの状態のままだとtime_check.dllなどのSAORIが正常に動かなくなるという弊害もあるので、用が済んだら「$SAORI引数の計算【タブ】自動」に戻しておいた方が良い。 

 $SAORI引数の計算【タブ】有効
 計算する。
 $SAORI引数の計算【タブ】無効
 計算しない。
 $SAORI引数の計算【タブ】自動
 各引数の先頭文字が数値または+、-記号のいずれかであれば計算する。
 何も指定しなければこれ。今までと同じ動作。

*easyballoonを使った、起動/終了/交代トーク [#m9df2d42]
もどきで質問があったeasyballoonを使った起動/終了/交代トーク。


-起動/他のゴーストから交代 
 *OnSatoriBoot
 (bln,change,読み込み中です。)

-終了 
 *OnClose
 :お疲れ様でした。
 (bln,change,終了処理中です。)

-他のゴーストへ交代 
 *OnGhostChanging
 :(R0)さんへ交代しますね。
 (bln,change,(R0)さんを呼んで来ます。)
 (bln,clear)



*栞をさおりとして使う [#u7dc7b4e]
栞の中には、さおりとしても使えるようになっているものもありますが、各栞の配布サイトでダウンロードしてきた初期状態ではさおりとして動作しないものもあります。



-華和梨8
華和梨をさおりとして使うためのサンプルスクリプトをさとー氏が日記にて公開されています。~
http://d.hatena.ne.jp/satos/20060617#1150555971 

-文
摂理氏による文をさおりとして使うためのパッケージを上氏がサイト上で公開されています。~
http://navy.nm.land.to/post/~
TIPS→[[外部関数/yaya]]

-里々
里々自体もさおりとして使うことができます。~
里々をさおりとして使用する際には特別必要なものはありません。~
satoriで登録したならば、(satori,起動)のようにして使えます。この時、引数の間にスペースが入ってはいけません。~
最初から使える関数以外の定義(例えば上記の"起動")は自分で里々形式のスクリプトを書き、さおりと同じフォルダに配置しなければなりません。~

-忍
忍をさおりとして使用する際には特別必要なものはありません。~
shinoで登録したならば、(shino, get, OnBoot?)のようにgetというコマンドを使います。~
OnBoot?等の定義は自分で忍形式のスクリプトを書き、さおりと同じフォルダに配置しなければなりませんが、サンプルとなるゴーストが既にダウンロードできない状態のようですので利用は難しいと思います。~

-里珠
里珠をさおりとして使うためには、別途さおりとして扱うためのスクリプトが必要ですが、現在のところ公開されているものはないようです。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS