
里々のちょっとしたロジックを提供するコーナー。
全て、里々wikiとukadocの情報の組み合わせで作ります。
里々のサンプルゴースト「Rポストと狛犬」を書き換えて自ゴーストを作るくらいの知識が必要です。
今回は、「存在しないサーフェスが指定されたら、別サーフェスで代替する方法」を示します。
追加シェルなどを別の方に作ってもらった後で、新たなサーフェスを追加したいということがありえると思います。
例として、masterシェルに新規サーフェスを追加し、トークで使用する場合を考えます。
するとmasterシェルではちゃんと表示されますが、追加シェルではそのサーフェスが存在しないため、サーフェスが消える、変化しないなどの影響が出てしまいます。
そこで、追加したサーフェスが存在するかを判定し、なければ代替用サーフェスを表示する方法を紹介します。
利点は、SSPから送られてくる情報を用いるため、後々追加シェルが新規サーフェスに対応した場合でも、ゴースト側の更新が不要である点です。
今回のものはSSPでしか動作しません。
この方法を使う場合は、配布ページやreadmeに明記しておきましょう。
全て、里々wikiとukadocの情報の組み合わせで作ります。
里々のサンプルゴースト「Rポストと狛犬」を書き換えて自ゴーストを作るくらいの知識が必要です。
今回は、「存在しないサーフェスが指定されたら、別サーフェスで代替する方法」を示します。
追加シェルなどを別の方に作ってもらった後で、新たなサーフェスを追加したいということがありえると思います。
例として、masterシェルに新規サーフェスを追加し、トークで使用する場合を考えます。
するとmasterシェルではちゃんと表示されますが、追加シェルではそのサーフェスが存在しないため、サーフェスが消える、変化しないなどの影響が出てしまいます。
そこで、追加したサーフェスが存在するかを判定し、なければ代替用サーフェスを表示する方法を紹介します。
利点は、SSPから送られてくる情報を用いるため、後々追加シェルが新規サーフェスに対応した場合でも、ゴースト側の更新が不要である点です。
今回のものはSSPでしか動作しません。
この方法を使う場合は、配布ページやreadmeに明記しておきましょう。
----
今回使うもの
----
SHIORIイベント
・OnNotifyShellInfo
里々
・count
----
スクリプト
----
##ここから##
##ここまで##
----
解説
----
OnNotifyShellInfoは、ゴーストの起動時と、シェルが変わるたびに呼び出されます。
ただし、このイベントはトークを書けない(トークを書いても無視されます)ので、上記のように変数に値を入れたりする操作のみを行っています。
(R0)には現在のシェル名が入っているので、ここで変数に入れておくと取り逃しがないため色々と便利です。
(R2)には使用可能なサーフェスがカンマ区切りで入っています。
例:0,1,2,10,110
この(R2)を保存しておき、必要な時に欲しいサーフェス番号を検索して判断しています。
ただし、この例で言えば、「11」を検索すると110に引っかかり、誤検知してしまいます。
そこで、以下の手法を用いて誤検知を防いでいます。
1.(R2)の前後をカンマで囲む
例:
0,1,2,10,110 → ,0,1,2,10,110,
2.その後、「,欲しい番号,」で検索する
例:
「0,1,2,10,110」を「11」で検索すると1件検知されてしまう
「,0,1,2,10,110,」を「,11,」で検索すると誤検知がなくなる
countは、文字列を検索し、見つかった数を返す関数です。
見つからない場合に0になるということを、条件式では「0」のみが不成立とされることに利用しています。
里々では、0 > 1 や a == b などの条件式は、成り立てば「1」、成り立たなければ「0」に置き換わります。
これにより、条件式の判断基準である「0かそうでないか」を満たすようになっています。
ちょっとごちゃごちゃしていますが、以下が該当します。
例えば、(20)の例ならこの処理は以下のようになります。
↓「,0,1,2,10,110,」の中に「,20,」は存在しないため、以下になります。
これは条件式が0、つまり不成立なので、「3」となります。
さらに、サーフェス加算値0が計算され、\s[3]というサーフェス指定のさくらスクリプトが出力されます。
全角括弧内のタブと改行は無視されるため、このような書き方が出来ますが、さくらスクリプトには改行を挟んではいけません。
例えば、以下は正常に動作し、\1がサーフェス10番で「こんにちは。」とトークします。
今回使うもの
----
SHIORIイベント
・OnNotifyShellInfo
里々
・count
----
スクリプト
----
##ここから##
#以下を里々の辞書に記述してください。
#どの辞書に書いても大丈夫ですので、分かりやすい場所に書いておくと良いでしょう。
#行内の空白部分は【タブ】です。うまく表示されない場合、手動で直してください。
#*20や*20などや、代替するサーフェス番号は、実際に使うものに置き換えてください。
#この処理を書いておくと、トークに(20)と書いた時、
#現在のシェルにサーフェス20番が有ればサーフェス20番を、無ければサーフェス3番を表示します。
#サーフェス加算値も加味しています。
#トーク内で使うぶんには、里々の書き方と全く同じように使え、処理を意識する必要はありません。
#(11)の例は\1側用です。
*OnNotifyShellInfo
$現在のシェル名 (R0)
$サーフェス一覧 ,(R2),
#\0用、追加サーフェス判定
#使い方
#(call,特殊サーフェス0,追加サーフェス番号,代替サーフェス番号)
@20
(20)
#書き方に応じて、必要ならこのように追加してください。
#@0020
#(20)
@20
(call,特殊サーフェス0,20,3)
@21
(21)
@21
(call,特殊サーフェス0,21,5)
@特殊サーフェス0
\s[(calc,
(when,(count(バイト値,1)(サーフェス一覧)(バイト値,1),(zen2han,(A0)),),
(zen2han,(A0)),
(zen2han,(A1))
)
+ (when,(変数「サーフェス加算値0」の存在),(サーフェス加算値0),0)
)]
#\1用、追加サーフェス判定
#使い方
#(call,特殊サーフェス1,追加サーフェス番号,代替サーフェス番号)
@11
(11)
@11
(call,特殊サーフェス1,11,10)
@特殊サーフェス1
\s[(calc,
(when,(count(バイト値,1)(サーフェス一覧)(バイト値,1),(zen2han,(A0)),),
(zen2han,(A0)),
(zen2han,(A1))
)
+ (when,(変数「サーフェス加算値1」の存在),(サーフェス加算値1),0)
)]
##ここまで##
----
解説
----
OnNotifyShellInfoは、ゴーストの起動時と、シェルが変わるたびに呼び出されます。
ただし、このイベントはトークを書けない(トークを書いても無視されます)ので、上記のように変数に値を入れたりする操作のみを行っています。
(R0)には現在のシェル名が入っているので、ここで変数に入れておくと取り逃しがないため色々と便利です。
(R2)には使用可能なサーフェスがカンマ区切りで入っています。
例:0,1,2,10,110
この(R2)を保存しておき、必要な時に欲しいサーフェス番号を検索して判断しています。
ただし、この例で言えば、「11」を検索すると110に引っかかり、誤検知してしまいます。
そこで、以下の手法を用いて誤検知を防いでいます。
1.(R2)の前後をカンマで囲む
例:
0,1,2,10,110 → ,0,1,2,10,110,
2.その後、「,欲しい番号,」で検索する
例:
「0,1,2,10,110」を「11」で検索すると1件検知されてしまう
「,0,1,2,10,110,」を「,11,」で検索すると誤検知がなくなる
countは、文字列を検索し、見つかった数を返す関数です。
見つからない場合に0になるということを、条件式では「0」のみが不成立とされることに利用しています。
里々では、0 > 1 や a == b などの条件式は、成り立てば「1」、成り立たなければ「0」に置き換わります。
これにより、条件式の判断基準である「0かそうでないか」を満たすようになっています。
ちょっとごちゃごちゃしていますが、以下が該当します。
(when,(count(バイト値,1)(サーフェス一覧)(バイト値,1),(zen2han,(A0)),),
(zen2han,(A0)),
(zen2han,(A1))
)
例えば、(20)の例ならこの処理は以下のようになります。
(when,(count(バイト値,1),0,1,2,10,110,(バイト値,1),20,),
20,
3
)
↓「,0,1,2,10,110,」の中に「,20,」は存在しないため、以下になります。
(when,0,
20,
3
)
これは条件式が0、つまり不成立なので、「3」となります。
さらに、サーフェス加算値0が計算され、\s[3]というサーフェス指定のさくらスクリプトが出力されます。
全角括弧内のタブと改行は無視されるため、このような書き方が出来ますが、さくらスクリプトには改行を挟んではいけません。
例えば、以下は正常に動作し、\1がサーフェス10番で「こんにちは。」とトークします。
*
(1
0)こんにちは。


