⇒[[開発]]


#contents


*サーフェスで分岐 [#y44fa803]

 >平常時【タブ】(サーフェス0)==7
 >怒ってる【タブ】(サーフェス1)==17

トーク中で使うと判定が間に合わないことがある。~
なので、本来はOntalkに持ってきてサーフェス戻しトークなどで使うためのもののようだ。

*台詞で分岐 [#q1e087f6]

 *
 :今日のおやつは(お菓子)だよ!
 >和菓子【タブ】(H1)==ようかん
 :洋菓子!
 
 @お菓子
 ようかん
 ケーキ
 チョコレート
 クッキー

かっこの中身を捕らえて分岐させる。
いくつもの台詞に対応させたい場合は、

 >和菓子【タブ】(compare,(H1),(和菓子グループ))
 
 @和菓子グループ
 ようかん★せんべい★こんぺいとう★酒饅頭

や

 >和菓子【タブ】(H1)==ようかん||(H1)==おせんべ

のように書くことになる。~
(H1)が変動するような場合、使用は細心の注意が必要。


*つつき反応をもっと自然にする [#mc37612d]

つつき反応を二段階にわけ、かつ、~
しばらく放っておかないと反応が一段階目には戻らせない。

 *0つつかれ
 :つっつかれてるね。
 >連続つつかれ0【タブ】(連続つつかれカウント0)==3
 $連続つつかれカウント0=(連続つつかれカウント0)+1
 $連続つつかれカウント0初期化タイマ【タブ】30

 *連続つつかれ0
 :三回以上つつかれてます。
 $連続つつかれカウント0初期化タイマ=(連続つつかれカウント0初期化タイマ)+5

 *連続つつかれカウント0初期化
 $連続つつかれカウント0【タブ】0

ようするに、つつかれた回数を保存、一定以上になると分岐。~
連続でつつかれるたびに分岐先でタイマの秒数を付け足しているだけ。


*シェルチェンジ時に台詞をつける [#e9cb6218]
「特定シェルから特定シェル」への変更で台詞を変化させられます。~
また、「特定シェル」への変更もまとめて記述が可能です。

辞書にはこれを追加しておくこと。


>
*OnNotifySelfInfo~
$現在のシェル【タブ】(R3)

satori_conf.txtに変数として、
$現在のシェル【タブ】master
<

>
*OnShellChanging
$一つ前のシェル【タブ】(現在のシェル)
$現在のシェル【タブ】(R0)
>(一つ前のシェル)から(現在のシェル)へ変更
>(一つ前のシェル)から変更
>通常のシェルチェンジ開始
<

>
*OnShellChanged
>(現在のシェル)へ(一つ前のシェル)から変更
>(現在のシェル)に変更
>通常のシェルチェンジ完了
<

>
>(一つ前のシェル)から(現在のシェル)へ変更【タブ】(compare,(一つ前のシェル),(現在のシェル))
<

を使えば、同じシェルに変更も判定できそうだ。

**OnTranslateでのトランスレート [#h4df9bd0]

コピペして貼ればすぐに動くはず。
猫語モードの実例はゴースト「カレカノ」に突っ込んであります。((eを押すとトランスレート開始))

>
【トランスレート基本形】

 *eが押された
 $トランスレートモード【タブ】(if,(compare,(トランスレートモード),ON)==1,OFF,ON)
 :トランスレート(トランスレートモード).

 *OnTranslate
 >トランスレート【タブ】(compare,(トランスレートモード),ON)

 *トランスレート
 $voice【タブ】(R0)
 $voice【タブ】(replace(byte3)(voice)(byte3)。(byte3)にゃ。))
 (voice)


因数区切りとして、他に使っていないもの、誤爆しないものを使う。~
それにはバイト値1とかを使うが、1だと誤爆するのでここでは3にした。~
実際には、★や◆などの記号で区切ることも可能なので、自分の好みで使うとよい。

引数の追加は以下のような形で行う。(by里々Wiki


 *OnSatoriLoad
 $引数区切り追加	(sprintf,%c,3)
 $byte3	(sprintf,%c,3)
<

しかし、特定の場合には変換を回避しないと、不自然になるなあ。~
あるいは、さらに下に特定変換用のを追加するとか。

【参考文献】
http://emily.nanika.jp/specwiki/?%A5%EC%A5%B4%A5%AD%A5%C1%2F%CE%A4%A1%B9%A4%C7%A4%CEOnTranslate%A4%CE%BB%C8%A4%A4%CA%FD
~レゴキチさんの「里々でのOnTranslateの使い方」

『里々Wiki』~
http://www.mac.gn.to/satori/index.php?%5B%5Bssu%5D%5D#content_1_4


【猫語変換サンプル】
 $voice【タブ】(R0)
 $voice【タブ】(replace(byte3)(voice)(byte3)よー。(byte3)にゃー。)
 $voice【タブ】(replace(byte3)(voice)(byte3)てー。(byte3)てだにゃー。)
 $voice【タブ】(replace(byte3)(voice)(byte3)るー。(byte3)るにゃー。)
 $voice【タブ】(replace(byte3)(voice)(byte3)くー。(byte3)くにゃー。)
 $voice【タブ】(replace(byte3)(voice)(byte3)たー。(byte3)たにゃー。)
 $voice【タブ】(replace(byte3)(voice)(byte3)よね。(byte3)よにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)いる。(byte3)いるにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)なよ。(byte3)にゃよ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)ても。(byte3)てもにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)い。(byte3)いにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)だ。(byte3)にゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)よ。(byte3)にゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)が。(byte3)がにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)う。(byte3)うにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)た。(byte3)たにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)ね。(byte3)にゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)に。(byte3)ににゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)す。(byte3)すにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)る。(byte3)るにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)か。(byte3)かにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)つ。(byte3)つにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)です。(byte3)だにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)ます。(byte3)ますにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)ような。(byte3)ようにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)くらい。(byte3)くらいにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)だけど。(byte3)だけどにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)ところ。(byte3)ところだにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)ない。(byte3)ないにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)なん。(byte3)にゃん。)
 $voice【タブ】(replace(byte3)(voice)(byte3)すか。(byte3)すかにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)とけ。(byte3)とけにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)には。(byte3)にはにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)しく。(byte3)しくにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)かも。(byte3)かもにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)あり。(byte3)ありにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)みる。(byte3)みるにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)だな。(byte3)だにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)ながら。(byte3)にゃがら。)
 $voice【タブ】(replace(byte3)(voice)(byte3)ないか。(byte3)にゃいか。)
 $voice【タブ】(replace(byte3)(voice)(byte3)なんだって。(byte3)にゃんだって。)
 $voice【タブ】(replace(byte3)(voice)(byte3)なんだってー。(byte3)にゃんだってー。)
 $voice【タブ】(replace(byte3)(voice)(byte3)なんと。(byte3)にゃんと。)
 $voice【タブ】(replace(byte3)(voice)(byte3)なあ。(byte3)にゃあ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)っけ。(byte3)っけにゃ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)つっ。(byte3)つにゃっ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)るっ。(byte3)るにゃっ。)
 $voice【タブ】(replace(byte3)(voice)(byte3)ないかにゃ。(byte3)にゃいか。)
 (voice)

*入れ子 [#c2ebf6ce]

 *
 ((AB)の話題)
 
 @AB
 A
 B

 *Aの話題
 :A!A!A!
 
 *Bの話題
 :B!B!B!

パターンは全部で(Aの話題)か(Bの話題)の二種となる。

((アルファベット)−(数字))

 @アルファベット
 A
 B
 
 @数字
 1
 2

四パターンに分岐する。~
 ((A)−(1)) ((A)−(2)) ((B)−(1)) ((B)−(2))

【実際の例】

 *
 :今日、(本日の話題)は((本日の話題)の感想)
 
 @本日の話題
 学食
 天気
 
 @学食の感想
 混んでたね。
いいにおいがしてたね。
 思わぬヒットメニューがあったね。
 
 @天気の感想
 悪かったね。
 いい割には寒かったね。
 なんか変だったね。

*無視、コミュでトークを中断させない [#mc40705b]
$今回は喋らない=有効~
を使うことで強制的に402にすることができる。~
無視するだけで実際には受けているので、格納は可能らしい。

*何もしない・何も表示させない [#l4d87b19]

(nop,☆)が重宝する。
「何もしない・何も表示しない」という働きをする。


たとえば、ifを使って、台詞を言わせたいときなどに便利。


*単語群をグループわけ扱いにして、グループで検索にひっかける [#d6dc58c2]
見通しがよければメンテナンスしやすい。
かざまさまのところの記事を参考にして、単語群をグループ扱いしてみた。


----
*【タブ】(count,(シェルリスト),(現在のシェル))!=1
:ごーすとじてんでの模擬戦が不可能。


*【タブ】(count,(シェルリスト),(現在のシェル))==1
:ごーすとじてんでの模擬戦が可能。


@実体のあるっぽいシェルグループ
月はピアノに誘われて☆k-mode☆sss-mode☆m-mode☆くろゆり
----

(実体のあるっぽいシェルグループ)を定義しておくことで、
グループ内・外をすっきり判別できる。


これでヒットできるのは、グループとして定義した文字列「月はピアノに誘われて☆k-mode☆sss-mode☆m-mode☆くろゆり」の中に、それぞれのシェル名が含まれているかどうかを検索するものだから。

*シェルによってアイコンを変更 [#e540a86b]
「(hogehoge)」と「@」を使って、
「>」の使用を減らせば、辞書の見通しがよくなる。

以下は自分用の覚書。
「月はピアノに誘われて」用アイコンのために加えた操作のメモ。
*OnShellChangedと*OnBoot、下準備としては*Onshellchangingに細工をする。

----
【*OnBoot周辺の細工】

*OnBoot
(アイコン変更)
:ようこそ。
$喋り間隔	180秒
$現在のシェル	(R0)
$手動セーブ	実行


@アイコン変更	(現在のシェル)==月はピアノに誘われて
\![set,trayicon,kotyou.ico]


@アイコン変更	(現在のシェル)!=月はピアノに誘われて
(nop,☆)
----

(nop,☆)が重宝する。
「何もしない・何も表示しない」という働きをする。

----
*OnShellChanging
$現在のシェル【タブ】(R0)
$手動セーブ【タブ】実行
:…服などどうでもいいのだけど。


*OnShellChanged【タブ】(現在のシェル)!=月はピアノに誘われて
$現在のシェル【タブ】(R0)
\![set,trayicon,デフォルト.ico]
$手動セーブ【タブ】実行
:どれでも同じだわ。


*OnShellChanged	(現在のシェル)==月はピアノに誘われて
$現在のシェル	(R0)
\![set,trayicon,A.ico]
$手動セーブ	実行
:どれでも同じだわ。
----

結局、シェルによって変わるというなら、変えるタイミングは二つ。

1.該当シェルを切り替えたとき:*OnShellChanged
2.起動したときに該当シェルだったとき:*OnBoot

いくつもの条件をいっぺんに判定させたいときには、
「>」を使うのではなく「@」を使わないと辞書が長くなる。

----
*
:ようこそ。
>アイコン変更【タブ】(現在のシェル)==月はピアノに誘われて
----

と同じ役割を、

----
*
:ようこそ。
(アイコン変更)
----

@アイコン変更【タブ】(現在のシェル)==月はピアノに誘われて
\![set,trayicon,A.ico]


@アイコン変更【タブ】(現在のシェル)!=月はピアノに誘われて
(nop,☆)
----

「()」は、別のラベルに飛ばさずに複数の条件の適用が可能である。
また、結果が同じなら一つの「()」に対する「@」を複数使い、
単語群に条件をつけると、ひとつの「()」で代替可能である。


----
【別のラベルに飛ばさず複数の条件を適用】


*
:ようこそ。
(アイコン変更)(デフォルトシェル変更)


@アイコン変更【タブ】(現在のシェル)==月はピアノに誘われて
\![set,trayicon,A.ico]


@アイコン変更【タブ】(現在のシェル)!=月はピアノに誘われて
(nop,☆)


@(デフォルトシェル変更)【タブ】(現在のシェル)==k-mode
$デフォルトサーフェス0	5


@(デフォルトシェル変更)【タブ】(現在のシェル)!=k-mode
(nop,☆)
----


ひとつの()で>を代替するパターン。


----
【ひとつの()で>を代替】


*
:ようこそ。
(アイコン変更)


@アイコン変更【タブ】(現在のシェル)==月はピアノに誘われて
\![set,trayicon,A.ico]


@アイコン変更【タブ】(現在のシェル)==k-mode
\![set,trayicon,B.ico]


@アイコン変更【タブ】(現在のシェル)!=月はピアノに誘われて||(現在のシェル)!=k-mode
(nop,☆)
----


*オーナードローメニューやその項目名を特定条件で変更 [#h6e50809]


時間とシェルによるオーナードロー切り替えの一例。
ここではもう一セット画像を用意した場合を考えた。
モードやフェイズをつんでいる場合、それに合わせて変えるのもまた楽しい。


ちなみに、そうしたものとは関係なく、
単に表示されるオーナードローを二種、三種と増やしたい場合、
menu_foreground.png2、menu_background.png2、menu_sidebar.png2と、
単純に番号を増やしたセットをもう一組み入れておけばランダムで表示されるようになる。
さらにちなむとサイドバーだけが足りなかったりすると足りない部分だけ別の組から表示される。


以下の例では特定のシェル、~
18時から6時までの二種の条件がそろうと切り替わる。


実際に見てみたいという方は、ゴースト「Un Known」を、
追加シェル「flip-flop」を導入して立たせてみてください。


 @menu.foreground.bitmap.filename【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 menu_foreground.png2
 
 @menu.background.bitmap.filename【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 menu_background.png2
 
 @menu.sidebar.bitmap.filename【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 menu_sidebar.png2
 
 
 ※以下はセパレーターやフォントの色指定
 
 
 @menu.background.font.color.r【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 255
 
 @menu.background.font.color.g【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 255
 
 @menu.background.font.color.b【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 255
 
 @menu.foreground.font.color.r【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 0
 
 @menu.foreground.font.color.g【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 0
 
 @menu.foreground.font.color.b【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 0
 
 @menu.separator.color.r【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 255
 
 @menu.separator.color.g【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 255
 
 @menu.separator.color.b【タブ】(現在のシェル)==flip-flop&& 17<(現在時)||(現在のシェル)==flip-flop&& 6>(現在時)
 255

(現在のシェル)はシェルチェンジ時に(R0)で帰ってくるものを保存する。~
また、起動時に、*OnNotifySelfInfoでシェル名を保存して、判定する必要がある。

 
 *OnShellChanging
 $現在のシェル【タブ】(R0)
 $手動セーブ【タブ】実行
 :…服などどうでもいいのだけど。
 
 *OnNotifySelfInfo
 $現在のシェル【タブ】(R3)

また、SHIORI Resourceは単語群として設定されたものから読み出しているものなので、
括弧を入れ子にして間に処理をかませたり、直接に条件式をつけたりすることができる。


 @sakura.portalbuttoncaption【タブ】17<(現在時)||6>(現在時)
 夜の森
 
 @sakura.portalbuttoncaption【タブ】17>(現在時)||6<(現在時)
 昼の森


モードによってオーナードローのメニュー名を変えたい場合などに使う。
単純に単語を複数用意してランダムにしたい場合には、
単語群の扱いなので下に書き加えればよい。


 @sakura.portalbuttoncaption
 遊び先(&P)
 知ってるところ(&P)



割とよく知られていることのようだけれど、
まとまってのっている場所を見かけなかったのでまとめてみた。


*FizzBuzz問題私的回答 [#t241f851]

ループの練習として解いてみた。
iはループを数えるための変数。


 *ループ準備
 $i	0
 $FizzBuzz数	0
 >ループ処理
  
 *ループ処理
 $FizzBuzz数	(calc,(FizzBuzz数)+1)
 >FizzBuzz終了	(i)>29
 :(if,(Fizz)==0,Fizz)(if,(Buzz)==0,Buzz)(FizzBuzz該当外調査)
 $i	(calc,(i)+1)
 >ループ処理
 
 *FizzBuzz終了
 :\C終了!
 
 @FizzBuzz該当外調査	(Fizz)!=0&&(Buzz)!=0
 (FizzBuzz数)
 
 @FizzBuzz該当外調査	(Fizz)==0||(Buzz)==0
 (nop,☆)
 
 @Fizz
 (calc,(FizzBuzz数)%3)
 
 @Buzz
 (calc,(FizzBuzz数)%5)

*ファイルの種別判別 [#ia31a483]

 *OnFileDrop2
 $ドロップ数【タブ】(split,(R0),(sprintf,%c,1))
 $ループカウンタ【タブ】0
 :\_q(ドロップ数)個のアイテムがドロップされました。
 (ループ)
 
 *ループ
 $値保存(ループカウンタ)【タブ】(replace,(S(ループカウンタ)),\,/)
 :ループ【(ループカウンタ)】回目
 ファイルパス取得【(値保存(ループカウンタ))】
 
 $ドロップ数【タブ】(han2zen,(split,(値保存(ループカウンタ)),/))
 (ドロップ数)に切り分けると
 $ファイル名保存(ループカウンタ)【タブ】(replace,(S(ドロップ数)),\,/)
 ファイル名取得【(ファイル名保存(ループカウンタ))】
 $ループカウンタ=(ループカウンタ)+1
 
 ループ【(ループカウンタ)】回目に入ります。
 >ループ	(変数「S(ループカウンタ)」の存在)==1
 ループ【(ループカウンタ)】回目で終了しました。
 $ループカウンタ=(ループカウンタ)−1
 
 (loop,ファイル識別,0,(ループカウンタ))
 
 *ファイル識別
 :【(ファイル識別カウンタ)】つ目のファイル【(値保存(han2zen,(ファイル識別 カウンタ)))】は(if,( 
 compare_tail,(値保存(han2zen、(ファイル識別カウンタ))),mp3)==1,音楽ファイルです。,音楽ファイルではありません。)

*リファレンス個数を確かめる [#h59328cf]

ループの使い方の練習。


>
*kが押された
\![open,inputbox,Onループ開始,0,リファレンス個数を確かめる]

*Onループ開始
$カウントアップ【タブ】0
$値保存(カウントアップ)【タブ】(R(カウントアップ))
>判定ループ【タブ】(変数「値保存(カウントアップ)」の存在)==1

*判定ループ
$カウントアップ=(カウントアップ)+1
$値保存(カウントアップ)【タブ】(R(カウントアップ))
>判定ループ【タブ】(変数「値保存(カウントアップ)」の存在)==1
>個数発表

*個数発表
:(カウントアップ)個のリファレンスが帰ってきました。
<


(R0)が存在するか、とやったら、
(R0)が代入されてヒットしなくなるため、一度「$値保存*」に保存した。


リファレンスとして戻ってきている数が足りなくなれば、
そこで「$値保存*」がクリアされるため、ヒットしなくなってループから抜ける。


以下れしばのログ。


>
 --- Request ---
GET SHIORI/3.0
ID: Onループ開始
Reference0: じゃん
 --- Operation ---
*Onループ開始
  $カウントアップ=0/overwritten.
  (カウントアップ)→0
  (R0)→じゃん
  (カウントアップ)→0
  $値保存0=じゃん/overwritten.
  (カウントアップ)→0
  (変数「値保存0」の存在)→1
  >判定ループ


  *判定ループ
    (カウントアップ)→0
    $カウントアップ=1/overwritten.
    (カウントアップ)→1
    (R1)→
    (カウントアップ)→1
    $値保存1/cleared.
    (カウントアップ)→1
    (変数「値保存1」の存在)→0
    *計算結果が0だったため、続行します。
    >個数発表


    *個数発表
      (カウントアップ)→1
      return: \1\01個のリファレンスが帰ってきました。\_w[102]\n
    return: \1\1\01個のリファレンスが帰ってきました。\_w[102]\n
  return: \1\1\1\01個のリファレンスが帰ってきました。\_w[102]\n
status code : 200
 --- Response ---
Value=\0\s[0]\1\s[10]\01個のリファレンスが帰ってきました。\_w[102]\e
<


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS