幻日幻月環

作成した伺かの更新情報などをつぶやくところ

存在しないサーフェスは、別のサーフェスを表示

里々のちょっとしたロジックを提供するコーナー。
全て、里々wikiukadocの情報の組み合わせで作ります。
里々のサンプルゴースト「Rポストと狛犬」を書き換えて自ゴーストを作るくらいの知識が必要です。

今回は、「存在しないサーフェスが指定されたら、別サーフェスで代替する方法」を示します。
追加シェルなどを別の方に作ってもらった後で、新たなサーフェスを追加したいということがありえると思います。

例として、masterシェルに新規サーフェスを追加し、トークで使用する場合を考えます。
するとmasterシェルではちゃんと表示されますが、追加シェルではそのサーフェスが存在しないため、サーフェスが消える、変化しないなどの影響が出てしまいます。

そこで、追加したサーフェスが存在するかを判定し、なければ代替用サーフェスを表示する方法を紹介します。
利点は、SSPから送られてくる情報を用いるため、後々追加シェルが新規サーフェスに対応した場合でも、ゴースト側の更新が不要である点です。

今回のものはSSPでしか動作しません。
この方法を使う場合は、配布ページやreadmeに明記しておきましょう。
----
今回使うもの
----
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)こんにちは。
PageTop

コメント


管理者にだけ表示を許可する