Don/里々の小技

ナビゲーション >> Top(FrontPage) > Don > 里々の小技

内容

前書き

おすすめリンク

注意事項

  • これを書いた人間は無限ループの常習犯です。
  • これを使ったことで何かあっても責任は負えません。
  • 動作チェックをしていないものも含まれます。
    • 基本的には自作のゴーストに搭載しているスクリプトです。でも信用してはいけません。
  • 最新版のSSPおよび里々の使用を想定しています。
  • 他所からパクってきたものも多々あります。

コミュニケート関連

  • マルチキャラクタの場合の名前の表記に関しては諦めていただくしかない

同時起動しているゴースト名を箇条書きにする

*同時起動しているゴースト名列挙
:\_q(loop、同時起動しているゴースト名取得ループ、1、(calc,(起動しているゴースト数)-1))\_q

@同時起動しているゴースト名取得ループ
\![*](FMO(同時起動しているゴースト名取得ループカウンタ)name)\n

同時起動しているゴーストから選択したゴーストに話しかける

*同時起動しているゴーストの誰かに挨拶
:\_q(loop、同時起動しているゴーストと会話ループ、1、(calc,(起動しているゴースト数)-1))\_q

@同時起動しているゴーストと会話ループ
\![*]\__q[OnSendOnCommunicate,"(FMO(同時起動しているゴースト名と会話ループカウンタ)name)"]φ
(FMO(同時起動しているゴーストと会話ループカウンタ)name)に話しかける\__q\n

*OnSendOnCommunicate
$Value0【タブ】(R0)
:(R0)さん、やっほー。

複数のゴーストに同時に話しかける

*AとBとCに話しかける
$Value0【タブ】A(sprintf,%c,1)B(sprintf,%c,1)C
:4人でマージャンしよー!

同時起動中のゴースト全員に話しかける

*全員に話しかける
$Value0【タブ】__SYSTEM_ALL_GHOST__
:みんなでじゃんけんしよー!

同時起動しているゴーストからランダムに1体選択する

@ランダムコミュ相手
(FMO(zen2han、(乱数1~(calc,(起動しているゴースト数)-1)))name)

OnOtherGhostTalkイベントでフックするイベントを調整する

*OnOtherGhostTalk
>トークフック処理【タブ】(count(b1)‡(call、単語配列化、‡、フックイベント)(b1)‡(R3)‡)
>トークフック処理【タブ】(count(b1)(R2)(b1)(フックトーク状態))

*トークフック処理
#フックしたトークを好きなように処理する

#フックしたいイベントを列挙する
@フックイベント
OnSecondChange
OnCommunicate
OnBoot
OnClose
OnGhostCallComplete
OnOtherGhostBooted
OnOtherGhostClosed
OnGhostCalled
OnOtherGhostChanged

#フックしたいトーク状態(今回はひとつだけ)
#複数の情報で判別する場合はもっとややこしくなります
@フックトーク状態
communicate

@b1
(sprintf,%c,1)

#Thanks To Legokichi
@単語配列化
(
	set,単語群「(A1)」の重複回避,降順、トーク中
)(
	loop,単語配列化2,(単語群「(A1)」の数)
)
@単語配列化2
((A1))(A0)

OnOtherGhostTalkイベントを単純にコミュニケートとして解釈する

*OnOtherGhostTalk
>えんいー【タブ】(弾くための条件)
\![raise,OnCommunicate,(R1),(R4)]

*えんいー

@弾くための条件
#全てフックすると悲惨なことになるので必要ないものは弾いた方が無難です

ゴースト交代関連

#あらかじめ以下のような記述がなされているものとします。

*OnGhostChanging
>他のゴーストへ変更

*他のゴーストへ変更
>(R0)へ変更
:(R0)さんに交代します。

*OnGhostCalling
>他のゴーストを呼び出し

*他のゴーストを呼び出し
>(R0)を呼び出し
:(R0)さんを呼び出します。

#ゴーストリスト生成
#postic/インストールされているゴーストのリストを使う
#http://navy.nm.land.to/post/dic_installedghost.txt

*installedghostname
$ゴーストリスト【タブ】(R0)
$loop=1
$n【タブ】(R1)
>installedghostname2【タブ】(変数「n」の存在)
$n【タブ】
$loop【タブ】

*installedghostname2
$ゴーストリスト【タブ】(ゴーストリスト)(sprintf,%c,1)(R(loop))
$loop=(loop)+1
$n【タブ】(R(loop))
>installedghostname2【タブ】(変数「n」の存在)
$n【タブ】
$loop【タブ】

@InstalledGhostFunction
(set、引数区切り追加、(b5))φ
(count(b5)(b1)(ゴーストリスト)(b1)(b5)(b1)(A0)(b1))
@b1
(sprintf,%c,1)
@b3
(sprintf,%c,3)
@b5
(sprintf,%c,5)

切り替え反応のあるゴーストを列挙する

*お友達と交代メニュー
\0\b[2]\_q(お友達と交代メニュー表示)\_q

@お友達と交代メニュー表示
(set、引数区切り追加、(b3))(set、引数区切り追加、(b5))φ
(set,単語群「相互切り替えさくら名†ゴースト名」の重複回避,降順、トーク中)φ
(loop(b5)相互切り替えゴースト名列挙(b5)(単語群「相互切り替えさくら名†ゴースト名」の数))

@相互切り替えゴースト名列挙
(nop(b3)(split(b5)(相互切り替えさくら名†ゴースト名)(b5)†))φ
(if(b3)!((S0)の存在)&&(call(b5)InstalledGhostFunction(b5)(S1))(b3)(切り替え友達表示)(b3))

@切り替え友達表示
\![*]\__q[OnChangeGhostByMyselfWithTalk,"(S0)",manual,"(S1)",](S1)\__q\n

*OnChangeGhostByMyselfWithTalk
(他のゴーストへ変更)\![change,ghost,"(R2)"]

#切り替え反応のあるゴーストをここに書いておきます。
@相互切り替えさくら名†ゴースト名
さくら†さくら
Emily†Emily/Phase4
双葉†双葉&ただきちさん

コミュニケート・特殊反応のあるゴーストを列挙する

*お友達を呼び出しメニュー
\0\b[2]\_q(お友達を呼び出しメニュー表示)\_q

@お友達を呼び出しメニュー表示
(set、引数区切り追加、(b3))(set、引数区切り追加、(b5))φ
(set,単語群「相互コミュさくら名†ゴースト名」の重複回避,降順、トーク中)φ
(loop(b5)相互コミュゴースト名列挙(b5)(単語群「相互コミュさくら名†ゴースト名」の数))

@相互コミュゴースト名列挙
(nop(b3)(split(b5)(相互コミュさくら名†ゴースト名)(b5)†))φ
(if(b3)!((S0)の存在)&&(call(b5)InstalledGhostFunction(b5)(S1))(b3)(コミュ友達表示)(b3))

@コミュ友達表示
\![*]\__q[OnCallGhostByMyselfWithTalk,"(S0)",manual,"(S1)",](S1)\__q\n

*OnCallGhostByMyselfWithTalk
(他のゴーストを呼び出し)\![call,ghost,"(R2)"]

#コミュニケート・特殊反応のあるゴーストをここに書いておきます。
@相互コミュさくら名†ゴースト名
美耳†美耳&ダミアン様
陽子†陽子&飯綱&千早

インストールイベント関連

#あらかじめ以下のような記述がなされているものとします。

*OnInstallComplete
>(R1)をインストール
>(R0)のインストール
:『(R1)』をインストールしたよー。
:種別は『(R0)』やね。

*えんいー

@b5
(sprintf,%c,5)

ゴーストインストール後の交代/呼び出し

  • 名前に特殊文字が含まれていると交代できないことがある
#(R1)はゴースト名
*ghostのインストール
:ゴースト『(R1)』をインストールしたよ。\n
(set、引数区切り追加、(b5))φ
(call(b5)GhostChangeMenu(b5)(Sender)(b5)(R1))

*GhostChangeMenu
>ghost交代メニュー(A0)

*ghost交代メニューSSP
:\_qφ
\![*]\__q[OnChangeGhostByMyself,"(A1)"](A1)と交代する \__q
\![*]\__q[OnCallGhostByMyself,"(A1)"](A1)を呼んでみる\__q\n
\![*]\__q[えんいー]また後で  \__q\_q

*ghost交代メニューcrow
:φ
★\q[(A1)と交代する,OnChangeGhostByMyself,"(A1)"]\n
★\q[また後で  ,えんいー]

#SSPとCROWはゴースト名でも\0名でも大丈夫らしい。
#materiaはゴースト名のみ可。使用の際は要注意。
*OnChangeGhostByMyself
\![change,ghost,"(R0)"]

#SSPのみ使用可能。
*OnCallGhostByMyself
\![call,ghost,"(R0)"]

シェルインストール後の着替え

*shellのインストール
:シェル『(R1)』をインストールしたよ。\n
(set、引数区切り追加、(b5))φ
(call(b5)ShellChangeMenu(b5)(Sender)(b5)(R1))

*ShellChangeMenu
>shell変更メニュー(A0)

*shell変更メニューSSP
:\_qφ
\![*]\__q[OnChangeShellByMyself,"(A1)"](A1)に着替える\__q\n
\![*]\__q[えんいー]また後で  \__q\_q

*shell変更メニューcrow
:φ
★\q[(A1)に着替える,OnChangeShellByMyself,"(A1)"]\n
★\q[また後で  ,えんいー]

#SSPとCROWは\![change,shell,シェル名]使用可能
*OnChangeShellByMyself
\![change,shell,"(R0)"]

他のゴースト専用だったので交代/呼び出し

#(R0)は\0名
*OnInstallRefuse
:『(R0)』さん専用だよー。\n
(set、引数区切り追加、(b5))φ
(call(b5)GhostChangeMenu(b5)(Sender)(b5)(R0))

#『ゴーストインストール後の交代/呼び出し』内のGhostChangeMenuへ
#\0名で交代できるのはSSPおよびCROWのみ

音楽再生関連

#あらかじめ以下のような記述がなされているものとします。

*えんいー

#入力:ファイルの絶対パス→出力:ファイル名
@OutputFiletNameFunction
(set、引数区切り追加、(b5))φ
(S(calc(b5)(split(b1)(A0)(b1)\)-1))

@b1
(sprintf,%c,1)
@b3
(sprintf,%c,3)
@b5
(sprintf,%c,5)

複数ファイルドロップ時に音楽ファイルの絶対パスのみを抽出して配列化する

*OnFileDrop2
(set、引数区切り追加、(b3))φ
(set、引数区切り追加、(b5))φ
(loop(b3)ドロップループ(b3)0(b3)(count(b5)(R0)(b5)(b1)))φ
(音楽用変数初期化)

@ドロップループ
(nop(b3)(split(b5)(R0)(b5)(b1)))φ
(set(b5)FilePath(b5)(S(ドロップループカウンタ)))φ
(set(b3)FileName(b3)(call(b5)OutputFiletNameFunction(b5)"(FilePath)"))φ
(曲目リスト追加判定)

@曲目リスト追加判定
((if(b3)(call(b5)音楽ファイルである(b5)(FileName))(b3)曲目リスト追加(b3)nop(b5)))

@曲目リスト追加
((if(b5)!(変数「MusicPlayList」の存在)(b5)曲目リスト追加処理初(b5)曲目リスト追加処理))

@曲目リスト追加処理初
(set(b5)MusicPlayList(b5)(FilePath))

#同名のファイルがあった場合は弾く
@曲目リスト追加処理
((if(b3)!(count(b5)(MusicPlayList)(b5)(FileName))(b3)set(b5)MusicPlayList(b5)(MusicPlayList)(b1)(FilePath)(b3)nop(b5)))

@音楽用変数初期化
(set(b5)FilePath(b5))(set(b5)FileName(b5))

@音楽ファイルである
(set、引数区切り追加、(b3))φ
(set、引数区切り追加、(b5))φ
(calc(b3)
(compare_tail(b5)(A0)(b5).mp3)+
(compare_tail(b5)(A0)(b5).MP3)+
(compare_tail(b5)(A0)(b5).mid)+
(compare_tail(b5)(A0)(b5).MID)+
(compare_tail(b5)(A0)(b5).wma)+
(compare_tail(b5)(A0)(b5).WMA)+
(compare_tail(b5)(A0)(b5).wav)+
(compare_tail(b5)(A0)(b5).WAV)+
(compare_tail(b5)(A0)(b5).au)+
(compare_tail(b5)(A0)(b5).AU)
)

配列化された音楽ファイルの絶対パスリストを出力する

*音楽再生リスト出力
>えんいー【タブ】!(変数「MusicPlayList」の存在)
\0(set、引数区切り追加、(b3)) (set、引数区切り追加、(b5))φ
\_q(loop(b3)音楽再生リストループ(b3)0(b3)(count(b5)(MusicPlayList)(b5)(b1)))\_q

@音楽再生リストループ
(nop(b3)(split(b5)(MusicPlayList)(b5)(b1)))φ
\![*]\__q[OnChoiceMusicList,"(S(音楽再生リストループカウンタ))"]φ
(call(b5)OutputFiletNameFunction(b5)(S(音楽再生リストループカウンタ)))φ
\__q\n

#バルーンにはファイル名を表示
#選択肢クリックでOnChoiceMusicListのReference0にファイルの絶対パスを格納

選択された音楽ファイルを再生する/リストから削除する

  • mciaudior.dllの使用を想定します。
    • dsaudio.dllの場合はver1.1以降は仕様に互換性が無いのでご注意ください。
*OnChoiceMusicList
\0(set、引数区切り追加、(b5))φ
\_qFileName\_l[60,]: (call(b5)OutputFiletNameFunction(b5)(R0))\n
\![*]\__q[OnOperatemciaudior,play,"(R0)"]通常再生 \__q
\![*]\__q[OnOperatemciaudior,loop,"(R0)"]ループ再生\__q
\![*]\__q[OnDeleteFromMusicList,"(R0)"]削除   \__q\_q

*OnOperatemciaudior
(set、引数区切り追加、(b5))
(mciaudior(b5)load(b5)(R1))(mciaudior(b5)(R0))

*OnDeleteFromMusicList
(set、引数区切り追加、(b5))
$MusicPlayList【タブ】(erase(b5)(b1)(MusicPlayList)(b5)(b1)(R0))
>えんいー【タブ】!(変数「MusicPlayList」の存在)
$MusicPlayList【タブ】(erase_first(b5)(MusicPlayList)(b5)(b1))

リストの曲をランダムにループ再生する

#mciaudior.dllは(mciaudior,stop)で演奏を停止した場合でも
#OnMAAPlayFinishが通知されるので、
#手動で停止させた場合はフラグを立てておきます。
#dsaudio.dllの場合はver1.1以降はOnDSAPlayFinishが通知されないので、
#同様の処理が不要となります。
*音楽停止
$えんいータイマ=2
(mciaudior,stop)

#手動で停止させた場合は普通に終了
#直前に演奏した曲R0の繰り返しを弾く(1曲しかない場合は仕方ない)
*OnMAAPlayFinish
>えんいー【タブ】(変数「えんいータイマ」の存在)
$引数区切り追加【タブ】(b5)
$作業域【タブ】(erase(b5)(b1)(MusicPlayList)(b5)(b1)(R0))
>えんいー【タブ】!(変数「作業域」の存在)
$作業域【タブ】(erase_first(b5)(作業域)(b5)(b1))
$作業域=(split(b5)(作業域)(b5)(b1))-1
$作業域【タブ】(S(乱数0~(作業域)))
$次の曲再生タイマ=5

*次の曲再生
\![raise,OnOperatemciaudior,play,"(作業域)"]

フィードバック関連

ゴーストからのWeb拍手

こちらの記事をパk...参考に。

*作者に物申す
:こちらに内容をお願いします。
\![open,inputbox,ぱっちん]

*OnUserInput
$(R0)【タブ】(R1)
>(R0)を教えてもらった

*ぱっちんを教えてもらった
>ぱっちんが空だった【タブ】!(変数「ぱっちん」の存在)
:\_q「(ぱっちん)」\_q
でよろしいですか?\n\_q
\![*]\__q[OnSendWebClap,"(ぱっちん)"]よろしい  \__q
\![*]\__q[拍手NG]よろしくない\__q\_q
$ぱっちん【タブ】

*ぱっちんが空だった
:……何か書いてください。

*拍手NG
:キャンセルします。

*OnSendWebClap
¥![execute,http-post,(拍手URL),--param-charset=Shift_JIS,--param=hitokoto="(R0)",--async=WebClap]

@拍手URL
#ここに送信先URLを表記

*OnExecuteHTTPComplete
>(R1)Complete

*WebClapComplete
:送りました。

*OnExecuteHTTPFailure
:……何か無理みたいです。

ネットワーク更新時MD5照合不一致を作者に報告

#不一致となるファイル名を記憶しておきます
*OnUpdate.OnMD5CompareFailure
$更新ファイル【タブ】(R0)
:\_q(R1)\n(R2)\n不一致です。\_q

*OnUpdateFailure
>ネットワーク更新(R0)
:ネットワーク更新失敗です……。

*ネットワーク更新md5 miss
:ファイルのMD5が一致しません。
$バグ内容【タブ】(更新ファイル)_md5_miss
$更新ファイル【タブ】
(call、作者にバグ報告メニュー、(バグ内容))(set、バグ内容、)

*作者にバグ報告メニュー
:念のため、作者に報告して頂けますか?\n\_q
\![*]\__q[OnSendMessageWithWebClap,"(A0)"]いいですよ\__q
\![*]\__q[報告拒否]いやですよ\__q\_q

#デフォルトで報告内容を入力しておきます
*OnSendMessageWithWebClap
:こちらに内容をお願いします。
\![open,inputbox,ぱっちん,0,"(R0)"]

*報告拒否
:……。

選択肢のジャンプ先未実装を作者に報告

*OnChoiceSelect
>(R0)
:選択肢のジャンプ先「(R0)」は存在しません……。
:あの作者のやりそうなことやね。
$バグ内容【タブ】選択肢「(R0)」無し
(call、作者にバグ報告メニュー、(バグ内容))(set、バグ内容、)

#「ネットワーク更新時MD5照合不一致を作者に報告」内のメニューへ

ssu補完的関数

華和梨でいうところのentry

  • 第一引数が()で展開されない場合、第二引数を出力する。
  • 「(犬)」と書いて「犬」が無い場合に「(犬)」と出力されれるのを防ぐ。(空白にしたり)
*
:(call、entry、犬、わん)☆(call、entry、ネコ、にゃー)
 ↓
わん☆ぐつぐつにゃーにゃー
@entry
(if、(文「(A0)」の存在)||(単語群「(A0)」の存在)||(変数「(A0)」の存在)、((A0))、(A1))

@ネコ
ぐつぐつにゃーにゃー

文字挿入

  • 文字列中の指定した位置に文字を挿入する。
(call,insert,挿入される文字列,挿入する文字列,挿入位置)
*
:(call(b1)insert(b1)(てすと文字列)(b1)‡(b1)5)
 ↓
あいうえお‡かきくけこ

@てすと文字列
あいうえおかきくけこ

@insert
(set、引数区切り追加、(b3))(set、引数区切り追加、(b5))φ
(
	replace_first
	(b3)(A0)
	(b3)(substr(b5)(A0)(b5)0(b5)(A2))
	(b3)(substr(b5)(A0)(b5)0(b5)(A2))(A1)
)

@b1
(sprintf,%c,1)
@b3
(sprintf,%c,3)
@b5
(sprintf,%c,5)

仮名検索

  • 区切り文字が含まれる文字列は注意。
    • 文字列中に平仮名が含まれていたら1を返す。そうでない場合0を返す。
@かな判定
(if、(compare,(hira2kata,(A0)),(A0))、0、1)
  • 文字列中に片仮名が含まれていたら1を返す。そうでない場合0を返す。
@カナ判定
(if、(compare,(kata2hira,(A0)),(A0))、0、1)

限定出力

  • 複数行にわたる文章を指定した行数のみ出力する。
(call,limitout,出力する文,出力する行数)
*
:(call(b1)limitout(b1)(てすと文)(b1)3)
 ↓
雨ニモマケズ
風ニモマケズ
雪ニモ夏ノ暑サニモマケヌ

*てすと文
:雨ニモマケズ
風ニモマケズ
雪ニモ夏ノ暑サニモマケヌ
丈夫ナカラダヲモチ
慾ハナク
決シテ瞋ラズ
イツモシヅカニワラッテヰル

@limitout
(set、引数区切り追加、(b3))(set、引数区切り追加、(b5))φ
(nop(b1)(split(b3)(replace(b5)(A0)(b5)\n(b5)(b7))(b3)(b7)))φ
(S0)(loop、limitout2、(calc,(A1)-1))
@limitout2
\n(S(limitout2カウンタ))
@b1
(sprintf,%c,1)
@b3
(sprintf,%c,3)
@b5
(sprintf,%c,5)
@b7
(sprintf,%c,7)

その他

マーカーの使用をベースウェアによって切り替える

*メニュー
:メニューだよ。
(★)\q[メニュー1,メニュー1]
(★)\q[メニュー2,メニュー2]
(★)\q[メニュー3,メニュー3]

@★
(if,(compare、(Sender)、SSP)||(compare、(Sender)、embryo),\![*],★)

選択肢のタグをベースウェアによって切り替える

*メニュー
:メニューだよ。
(★)(call、選択肢、メニュー1、メニュー1)
(★)(call、選択肢、メニュー2、メニュー2)
(★)(call、選択肢、メニュー3、メニュー3)

@選択肢
((if、(compare,(Sender),SSP)、選択肢SSP、選択肢通常))

@選択肢SSP
\__q["(A1)"(loop、選択肢引数追加、2、(Aの数))](A0)\__q

@選択肢通常
\q["(A0)"(loop、選択肢引数追加、1、(Aの数))]

@選択肢引数追加
,"(A(選択肢引数追加カウンタ))"

プラグイン「SwissArmyKnife」のデフォルトメニューカスタマイズ

  • 以下のスクリプトでおおよそデフォルトのメニュー表示を再現しています。
  • デフォルトの表示が気に入らない場合、ゴースト毎にカスタマイズします。
*OnSwissArmyKnifeMenu
:\_q(十徳メニュー表示)\_q

@十徳メニュー表示
\f[bold,true][機能選択]\f[bold,default]\n\n[half]φ
(loop,AddArmyArg,0,(calc,(Rの数)-1))

@AddArmyArg
\![*]\q[(R(AddArmyArgカウンタ))]\n

ソロゴーストのトークを\0\1交互に振り分ける

*
(set,引数区切り追加,(b3))φ
(call(b3)話者切り替え(b3)(ほげ))

@話者切り替え
(set,引数区切り追加,(b3))φ
(set,引数区切り追加,(b5))φ
(nop,
	(split(b3)
		(replace(b5)
			(A0)(b5)
			?(b5)
			‡。
		)(b3)
		。
	)
)(replace(b3)
	(loop,話者切り替え2,0,(calc,(Sの数)-2),2)(b3)
	‡。(b3)
	?
)

@話者切り替え2
\0(S(話者切り替え2カウンタ))。\n[half]φ
(if(b3)(Sの数)-1!=(話者切り替え2カウンタ)+1(b3)
\1(S(calc,(話者切り替え2カウンタ)+1))。\n[half])

*ほげ
:ほげ。
へも?
もけ。

@b3
(バイト値,3)
@b5
(バイト値,5)

コメント

  • 音楽再生関連でファイル名もカンマ含めることが出来るので引数区切りはバイト値でないと死ぬ場合が…いっきに可読性が… -- HiLa? 2008-01-19 (土) 14:15:04
  • 引数区切りを全部バイト値に置き換えてみました。可読性に関しては…仕様です…orz -- Don 2008-01-19 (土) 14:54:40

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

Reload   New Edit Freeze Diff ファイルUp Copy Rename   Front page List of pages Search Recent changes Backup   Help
feed rss feed rdf feed rss20 feed lirs emily4 inside marble note
Last-modified: Fri, 02 May 2008 16:57:22 HADT