里々に最初から登録されている関数。
satori_conf.txtSAORI定義を全て削除しても使える物。
「元ssu関数」と記述されたものは、かつてssu.dllというSAORIの機能で、Mc157-1からssuの関数は里々本体に統合されたため内部関数となりました。

サンプルに括弧内で改行やタブ文字を入れているものがありますが、里々では以下のように括弧内の改行は無視され、タブ文字はSSPに無視されるため、各自環境に合わせて見やすいように使うことができます。

(when,(現在時)==12,お昼ごはんだ!,お昼ごはんまだかな……。)
(when,(現在時)==12
	,お昼ごはんだ!
	,お昼ごはんまだかな……。
)

関数を使用する際は、一度関数-「引数区切りについて」に目を通しておくことを推奨。
大雑把に言えば、引数に区切り文字がくる可能性のあるものに注意が必要です。




単語群操作

単語の追加

(単語の追加、くだもの、バナナ)

単語群@くだものに単語バナナが追加されます。

@くだもの
りんご

追加された単語の情報はsatori_savedata.txtに保存されます。
@くだものが無ければ新規に作成します。

参考→ユーザに単語を教えてもらうOnTeach

追加単語の削除

(追加単語の削除、単語群名、単語)

単語の追加で入れた単語のみ削除。

追加単語の全削除

(追加単語の全削除、単語群名)

単語の追加で入れた単語を全て削除。

合成単語群

(合成単語群、A、B、C)

のように書くと、例えば以下の単語群A・B・Cの単語が同じ確率(この場合10分の1)で選ばれます。
同名の単語群が複数あっても問題ありません。

@A
りんご
みかん
@B
じゃがいも
@B
ごぼう
れんこん
にんじん
@C
いか
たこ
かに
えび

採用条件を含む単語群も、ちゃんと採用条件を満たす場合のみ合成されます。
例えば以下の場合、各単語は現在月が1の場合は8分の1、そうでなければ6分の1の確率で等しく選ばれます。

@A
バレンタインデー
クリスマス
ホワイトデー
@B
大晦日
@B【タブ】(現在月)==1
正月
成人の日
@C
父の日
母の日

出力

バイト値

(バイト値、数字)

数字に対応したASCIIコードを出力します。里々では主に「区切り文字」の代わりとして使います。
詳しくはバイト値を参照してください。

sprintf

(sprintf,フォーマット[,引数1[,引数2[…,引数n]]])

元ssu関数。
引数1〜nをフォーマットに従って変換したものを返します。
詳しくはフォーマット出力を参照してください。

呼出

call

(call,トーク名または単語群名[,引数1[,引数2[…,引数n]]])

引数を付与してトークまたは単語群を呼びます。 自作関数として使います。詳しくはcall関数を参照のこと。

vncall

(vncall,トーク名または単語群名[,引数1[,引数2[…,引数n]]])

call関数に渡す文字を「名前」で与えるバージョンの関数。
こちらも同ページを参照のこと。

nop

(nop,引数)

引数に何を入れても表示しません。
主に関数SAORIの戻り値がいらない時に使います。
例えばsplit関数は分割した文字列とは別に戻り値として分割数が返ってくるので、これがいらない時にこの関数を使うというわけ。
詳しくは当該の関数の説明へ。

  • コメントの代用
    カッコ内の改行が無視される性質から、単語群などで強引にコメント代わりに使う事もできます。
@単語サンプル
ポスト
紺野ややめ
エミリ(nop,
↑本来はSHIORIサンプルキャラクターではないがついでに入れておく
)
狛犬
#複数行をまるごとコメントに
@単語サンプル2
(nop,
これは候補1
これが選ばれたら色々変数を操作する。
(set,変数1,あれ)
(set,変数2,これ)
(set,変数3,それ)
(set,変数4,どれ)
)候補1が選ばれた
(nop,
これは候補2
これが選ばれても特に何もしない。
)候補2が選ばれた
  • 一括の変数処理を行うときに
    あるセクションで「変数の処理だけすればいいんだけど、余計な\1などが入って邪魔になる」という時、nopを使って呼び出すという方法もあります。
*ミニゲーム
(nop,
	(変数の処理)
):ミニゲームのコーナー!

*変数の処理
$変数1【タブ】0
$変数2【タブ】0

remember

(remember,位置)

過去に話した内容の取得。zero origin(最初の項目を0番と数える)なので(remember,0)で直前。
ただし、全ての話した内容が対象のため、メニュー画面や触り反応なども含まれてしまいます。
実行したスクリプト単位なので、例えば多階層メニューの場合は制御がややこしいことになってしまうなどの難点もあります。
トークに限るならランダムトーク時のみ変数に格納する必要があるでしょう。

set

(set,変数名,値)

変数に値を代入します。

$変数名=値

と基本的には同じです。
(set,変数名,)と空を代入する事で変数の削除ができる点も同じ。
各種特殊変数への設定についても使用できます。

「$変数名=値」の記法との違いを列挙すると、

  • 一行として扱われる($変数名=値は行として数えられない)
  • 文中でも使える
    • 行頭に書く必要がない
    • 単語群中でも使える($変数名=値は不可)
  • 値の数値計算は引数の自動計算の仕様に準ずる
    • 値が式の場合計算結果が入る(「$変数名【タブ】値」でなく「$変数名=値」と同様)
    • 特殊変数「SAORI引数の計算」が無効だと引数が計算されない
    • 計算結果は必ず半角数値となる($変数名=値だと必ず全角数値)
  • 変数名や値に区切り文字に使っている文字が含まれていないか注意する必要が発生する

ある程度書き方の好みはありますが、(set,変数名,値)のほうがすっきりと処理を書けるでしょう。参考→call関数

sync

(sync,物,引数1,引数2...引数n)

処理をしゃべりと同期させます。
SAORIを任意のタイミングで発動させる時などに使えます。
括弧ならなんでも動くため、リアルタイムでの処理が出来ます。

#早打ちゲーム
*
$早打ちカウンタ=3
:早打ちゲームをするよ。
3、2、1、ゼロ、って言うから、ゼロって言った瞬間に選択肢を選んでね。

_撃つ!

(sync,set,早打ちカウンタ,3)3\_w[1000]
(sync,set,早打ちカウンタ,2)2\_w[1000]
(sync,set,早打ちカウンタ,1)1\_w[1000]
(sync,set,早打ちカウンタ,0)ゼロ!\_w[300]\![raise,早打ちゲーム負け]

*早打ちゲーム勝ち
:う、ま、負けた……。

*早打ちゲーム負け
:やった、私の勝ちー!

*早打ちゲーム早すぎ
:まだゼロって言ってないよ!
ルール違反で私の勝ちだね。
 
*撃つ!
:(when,(早打ちカウンタ)==0
	,(早打ちゲーム勝ち)
	,(早打ちゲーム早すぎ)
)

これに関して、(sync,set,早打ちカウンタ,3)を(set,早打ちカウンタ,3)とするとうまくいきません。
これは、SSPでゴーストが喋り始める前に、里々での処理は全て終わっているためです。

参考→イベント

そのため、「バルーンに表示されるタイミングで実行される」という機能を持つsyncを使うことで、早打ちカウンタへのセットをトークと同期させています。

サンプル。ゴーストがトークで数を数えているとする。トーク途中に本体側をつつき、どこまで数えたかを表示させてみます。
以下のように書くと、うまくいきません

*
:数を数えるよ。
1・・・(set,カウンタ変数,1)
2・・・(set,カウンタ変数,2)
3・・・(set,カウンタ変数,3)
*0つつかれ
:今は(カウンタ変数)まで数えたよ。

この場合、必ず「今は3まで数えたよ。」と喋ります。

以下のように書いた場合、例えば「2・・・」まで表示された段階でつついた場合、「今は2まで数えたよ。」と表示されます。

*
:数を数えるよ。
1・・・(sync,set,カウンタ変数,1)
2・・・(sync,set,カウンタ変数,2)
3・・・(sync,set,カウンタ変数,3)
*0つつかれ
:今は(カウンタ変数)まで数えたよ。

里々で呼び出せるものならなんでも動くため、例えば以下のようにcall関数を使って自作の関数を同期実行させたり、様々な応用が出来ます。

(sync,call,自作関数,引数)

関連TIPS→SAORI さおりを意図したタイミングで使う(同期呼び出し)

計算

calc

calcは小数点以下を無視(切り捨て)して計算します。
whenやswitchなどの条件式の部分は、これと同様の処理が自動的に行われます。

(calc,計算式)

(calc,1+2)#→3
(calc,1+−3)#→1+(-3)→-2
(calc,2 * 3)#→6
(calc,5/3)#→1

結果は半角文字になりますが、里々のイコール記号の比較では全角半角を同一視するので特に問題はありません。

(when,123==123,同じ,違う)#→同じ

表示するときに困る場合は、Han2Zen関数を使いましょう。

(Han2Zen,(calc,1+2))#→3(全角)

calc_float

calc_floatは小数点以下も計算します。

(calc_float,計算式)

ただしこのままだと整数で計算した結果を渡してしまうため、自動計算は無効にしておく必要があります。

*
$SAORI引数の計算【タブ】無効
:計算するよー。5÷2は(calc_float,5÷2)っ!
$SAORI引数の計算【タブ】自動
 ↓ 
計算するよー。5÷2は2.5っ!

条件分岐関数

[注意]引数区切りについて
when/whenlist関数の区切りを(バイト値、1)のように括弧で呼び出すとif/iflistと同じ動作になってしまうようです。
⇒対処法

条件式も参照。

if

元ssu関数。
やや分かりづらい動作をするため、使うならwhen関数を使いましょう。

条件式を評価し、真(条件式が1以上の整数の場合)ならば真の結果を返します。
そうでないならば、偽の結果を返す(偽の結果が書かれている場合)か、空を返す(偽の結果を省略している場合)。

(if,条件式,真の結果[,偽の結果])

*
$たこ数【タブ】(乱数0〜3)
:たこが(たこ数)匹釣れました。今日は(if,(たこ数)>1,大漁,普通)です。
:(if,(たこ数)==0,普通ってお前、釣れてないだろそれ……。)

※if関数内で set関数を次の様に記述しても、条件式により真偽のいずれかの項が実行されると言う動作はしません
これは里々が内側の括弧から展開する為で、条件式が評価される前に真偽両方の項が処理されてしまう為です。
このため、whenを使うのが確実です。
括弧展開後に引数区切り文字が出現してバグが出る、という可能性も潰せます。

#ifを使っておかしくなる例
#条件式にかかわらず、変数hogeとmogeの両方に値が代入されてしまう
(if,(乱数0〜1),(set,hoge,0),(set,moge,1))
#括弧展開の結果、引数区切りが増えて正常に動作しなくなる
(if,(乱数0〜1),(太字),(下線))
@太字
\f[bold,1]
@下線
\f[underline,1]
#(if,1,\f[bold,1],\f[underline,1])→引数区切りエラー

#解決策
#条件式を満たした方だけ、括弧が展開されて変数に値が代入される
(when,(乱数0〜1),(set,hoge,0),(set,moge,1))
#条件式が決まるまで括弧が展開されないので不具合が起きない
(when,(乱数0〜1),(太字),(下線))
@太字
\f[bold,1]
@下線
\f[underline,1]
#(when,0,(太字),(下線))→(下線)→\f[underline,1]

when

(when,条件式,真の場合[,偽の場合])

条件式を評価し、真(条件式が1以上の整数の場合)ならば真の結果を返します。
そうでないならば、偽の結果を返す(偽の結果が書かれている場合)か、空を返します(偽の結果を省略している場合)。
トークの分岐に使ったり、一部の文章を変えたり、変数を入れたりと様々に使えます。
呼び出すトークの分岐処理

*
(when、(現在時)==15
	、(おやつの時間トーク)
	、(普通のトーク)
)

*おやつの時間トーク
:3時だ! おやつだ!

*普通のトーク
:お菓子食べたいなあ……。

トークの一部変更

*
:わたしたち、(when,(累計時)>3
	,だいぶ仲良くなったけど
	,まだ会ったばかりだし
)、もっとお互いをよく知る必要があると思うんだよね。
*
:ああもう、(when,(現在月)==7||(現在月)==8,あつい,だるい)!

whenの中にwhen(入れ子)

*
:(when,(現在時)<=6&&(現在時)>=23
	,ふああ……ねむ。
	(when,(現在時)==12||(現在時)==19
		,ご飯の時間だ!
		,まだ(現在時)時か……だる……。
	)
)

平たくいうとカッコ内を後で計算するif関数で、機能は引数が事前に評価されない点を除いて"if"と同じです。

ifとwhenの動作の違い

*さんぷる1
:ifの場合
(set、変数1、0)(set、変数2、0)
(if、1、(set、変数1、1)、(set、変数2、1))
変数1は(変数1)#=>1
変数2は(変数2)#=>1
:whenの場合
(set、変数1、0)(set、変数2、0)
(when、1、(set、変数1、1)、(set、変数2、1))
変数1は(変数1)#=>1
変数2は(変数2)#=>0

再帰呼出し(関数の中で自分自身を関数として呼び出す)

*さんぷる2
:10の階乗は(call、階乗、10)です。

@階乗
(when、(calc、1<(A0))、
	(calc、(A0)*(call、階乗、(calc、(A0)−1)))、
	1)

unless

元ssu関数。
条件式を評価し、偽(0 か 0)ならば偽の結果を返します。
そうでないならば、真の結果を返す(真の結果が書かれている場合)か、空を返します(真の結果を省略している場合)。
ifの判定が逆になったもの。分かりづらいためほとんど使われていません。
ifと同様、偽も真も条件を満たすか判別する前に括弧が展開される点に注意。

(unless,条件式,偽の結果[,真の結果])

iflist

元ssu関数。
やや分かりづらい動作をするため、使うならwhenlist関数を使いましょう。

ifと違う点は、条件式が左右に分かれたことと、複数の条件を順番に評価できることです。

(iflist,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]])
(iflist,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]],偽の結果)
  1. 左辺と右辺1を組み合わせた条件式を評価し、真ならば結果1を返します。
  2. そうでなければ左辺と右辺2と組み合わせ、真ならば結果2を返します。
  3. そうでなければ左辺と右辺3を…以下略。

偽の結果は、いずれの条件も満たさない場合に返します。
偽の結果が指定されていない場合は、空を返します。

(iflist,(現在時)==
	,6,朝飯
	,12,昼飯
	,15,おやつ
	,17,ディナー
)

ifと同様、偽も真も条件を満たすか判別する前に括弧が展開される点に注意。
whenと同様、条件が確定するまで中の括弧を展開しないwhenlistがあり、whenlistを使った方が安全

whenlist

(whenlist,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]][,偽の結果])

whenと違う点は、条件式が左右に分かれたことと、複数の条件を順番に評価できること。
ifに対するiflistのような立ち位置の関数で、
iflistとは違い、結果の引数は条件が決まるまで事前に評価されません。

  1. 左辺と右辺1を組み合わせた条件式を評価し、真ならば結果1を評価して返します。
  2. そうでなければ左辺と右辺2と組み合わせ、真ならば結果2を評価して返します。
  3. そうでなければ左辺と右辺3を…以下略。

偽の結果はいずれの条件も満たさない場合に返されます。
偽の結果が指定されていない場合は、空を返します。

さんぷる1、使い方

*さんぷる1
(whenlist、(現在時)==
	、6、朝飯
	、12、昼飯
	、15、おやつ
	、17、ディナー
	、間食)

上記のサンプルが動作するとき、以下のように動作します。例として、(現在時)は「12」としましょう。

  1. 左辺の「(現在時)==」と右辺1の「6」を連結して評価します。
    「(現在時)==6」は、現在時が12なので、偽(成立しない)となり、結果1の「朝飯」は実行されません。
  2. 次に、左辺の「(現在時)==」と右辺2の「12」を連結して評価します。
    「(現在時)==12」は、現在時が12なので、真(成立する)となり、結果2の「昼飯」が実行されません。
  3. 成立するものがあったので、それ以降の右辺と結果は実行されません。
    結果、上記のwhenlist関数は「昼飯」を返します。

さんぷる2、iflistとwhenlistの動作の違い

*さんぷる2
:iflistの場合
(set、変数1、0)(set、変数2、0)(set、変数3、0)
(iflist、1==
	、1、(set、変数1、1)
	、0、(set、変数2、1)
	、(set、変数3、1))

変数1は(変数1)#=>1
変数2は(変数2)#=>1
変数3は(変数3)#=>1

:whenlistの場合
(set、変数1、0)(set、変数2、0)(set、変数3、0)
(whenlist、1==
	、1、(set、変数1、1)
	、0、(set、変数2、1)
	、(set、変数3、1))

変数1は(変数1)#=>1
変数2は(変数2)#=>0
変数3は(変数3)#=>0

さんぷる3、左辺と右辺の組み合わせ
例では演算子を左辺に使っていますが、単純に合わせて式として認識できれば動きます。

(whenlist、(変数)
	、==0、変数は0です。
	、==1、変数は1です。
	、変数は0でも1でもないです。
)

さんぷる4、複数の分岐に使う 左辺を使わず、分岐構造にしてしまう方法もあります。

(whenlist、(nop,)
	、(変数1)==1
	、(処理その1)
	、(変数「変数2」の存在)
	、(処理その2)
	、(変数3)>(変数4)
	、(処理その3)
	、(処理その4)
)
*処理その1
:なんらかのトークとか処理とか
*処理その2
:(略)
*処理その3
*処理その4

これをwhenで書くと以下のようになります。好みで使い分けると良いでしょう。

(when、(変数1)==1
	、(処理その1)
	、(when、(変数「変数2」の存在)
		、(処理その2)
		、(when、(変数3)>(変数4)
			、(処理その3)
			、(処理その4)
		)
	)
)

以下のようにジャンプを使った場合との違いは、分岐の後の処理も実行されることです。

*
>処理その1【タブ】(処理その1)
>処理その2【タブ】(変数「変数2」の存在)
>処理その3【タブ】(変数3)>(変数4)
>処理その4
:この部分の処理は実行されないよ。

長い処理の場合など、修正時にはいちいちジャンプ先を見に行かなければならず、バグを出しやすい・修正が面倒などの点がありますが、一箇所にまとめておけば比較的修正が楽になります。

switch

元ssu関数。
条件並列分岐。左辺も右辺も数値でないとエラーになります。
iflistと同じで、全ての括弧は分岐前に展開されることに注意。

まず、左辺と右辺1が等しいか比較し、等しければ結果1を返します。
そうでなければ次の右辺2と比較し、等しければ結果2を返します。
そうでなければ…(以下略)。
いずれの右辺とも等しくなければ、空を返します。

(switch,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]])

どれにも当てはまらない場合の結果も書けます。どの右辺とも等しくなかった場合に、それ以外の場合を返します。

(switch,左辺,右辺1,結果1[,右辺2,結果2[…,右辺n,結果n]],それ以外の場合)
*
:今月は(switch、
(現在月)、
1、お正月ですね、
2、バレンタインデーがあります、
3、ひなまつりがあります、
5、こどもの日があります、
8、夏休みですね、
12、クリスマスがあります、
特に何もありません)。

whenlistと違って内部の括弧が全て先に展開されてしまうことから、この例のように一言セリフ集として使うのに適しています。
なお、whenlistでも同様の処理を書けます。

*
:今月は(whenlist、
(現在月)==
1、お正月ですね、
2、バレンタインデーがあります、
3、ひなまつりがあります、
5、こどもの日があります、
8、夏休みですね、
12、クリスマスがあります、
特に何もありません
)

nswitch

元ssu関数。
数値による分岐。switchをシンプルにしたようなものです。
iflistと同じで、全ての括弧は分岐前に展開されることに注意。

数値が1なら結果1を返します。
数値が2なら結果2を返します。
数値が…(以下略)。

数値の部分に文字列が入っていたり、数値が0以下だったり、数値が結果の数より大きい値だったりした場合は、空を返します。

(nswitch,数値,結果1[,結果2[…,結果n]])
*
:サイコロを振りました。
(nswitch、(乱数1〜6)、一、ニ、三、四、五、六)がでました。

中の括弧が先に展開されるという性質を逆手に取り、配列のように使うことも出来ます。
ひとまとめにした情報から、必要なものを取ってくるものとして使うと良いでしょう。

$キャラ1データ【タブ】ポスト、120センチ、100キロ
$キャラ2データ【タブ】狛犬、60センチ、50キロ
#1を入れると名前、2を入れると身長、3を入れると体重が出て来る
(nswitch、1、(キャラ1データ))#ポスト
(nswitch、3、(キャラ2データ))#50キロ

「(nswitch、1、(キャラ1データ))」は、括弧が先に展開され、nswitchで実行されるのは以下になります。

(nswitch、1、ポスト、120センチ、100キロ)

choice

元ssu関数。
結果1〜nの中からランダムに1つを選んで返す。
iflistと同じで、全ての括弧は分岐前に展開されることに注意。
ランダムに選ぶため、単語群にあるような、同じ単語を連続で選ばないという機能はありません。
単語群を新たに作る必要がないため、その場で使い捨てる内容を出すのに適しています。

(choice,結果1[,結果2[…,結果n]])
*
:何が釣れた?
:(choice,鯛,イワシ,鮫,くじら,長靴)が釣れたよ。

以下のように単語群でも同じことが出来ます。

*
:何が釣れた?
:(釣れたもの)が釣れたよ。

@釣れたもの
鯛
イワシ
鮫
くじら
長靴

ループ関数

里々ではループは構文でサポートされていない為、関数またはジャンプ文で実現します。
loop関数のみ昔からある関数で、times,for,while関数は、整備班verで追加された関数です。
この二つにはループ本文やループカウンタの扱いで下記の差があります。

  • ループ本文
    • loop関数
      ループ本文を関数外に用意する必要があります、引数として呼出先のまたは名を渡します。
    • times,for,while関数
      ループ本文を引数として記述出来ます、関数外にループ本文を置く場合は明示的に呼び出す必要があります。
  • ループカウンタ名 (ループ中にループ回数を数えている変数)
    • loop関数
      ("呼出先のまたは名"カウンタ)
    • times,for,while関数
      (C0)、多重ループの場合は上位のループカウンタを(C1)、(C2)…と参照出来ます。

ループブレイクは loop,for,times関数では出来ません、while関数かジャンプ文によるループを使って下さい。

[注意]引数区切りについて
times,while,for関数は、括弧の展開を遅らせる仕組みの関係上、
(バイト値、1)のように引数区切りを括弧で呼び出すと
(C0)の中身が常に空となり、正しく動作しないようです。
⇒対処法

loop

ある文または単語群を指定回数ぶんループさせる関数。
この関数のみループ本文を関数外で(トークや単語群で)書かないといけません。使用例

(loop,文または単語群名,回数)
(loop,文または単語群名,開始値,終了値)
(loop,文または単語群名,開始値,終了値,増分)

*文または単語群名
ループさせたい本文

ループ中は本文に([文または単語群名]カウンタ)という名前の変数が使用できるようになります。

  • 回数 ... [文または単語群名]をループさせる回数です。
  • 開始値、終了値、増分 ... カウンタの開始値〜終了値を制御します。
    • 増分は1ループ時に増加するカウンタ量。当然、デフォルトは1です。
    • 開始値〜終了値を設定すると、ループ回数は ( [終了値]−[開始値] )÷[増分] 回となります。

単語群での使用例

*
:好きな食べ物は (loop,好きな食べ物,3)だよ

@好きな食べ物
すきやき、
焼肉、
フライドチキン、
焼き鳥、
シャブシャブ、
手羽先、

カウンタとトークでの使用例(ヘッドラインを変数に落とす)

*installedheadlinename
(loop,HL格納,0,(Rの数))

*HL格納
$HL(HL格納カウンタ)【タブ】(R(HL格納カウンタ))

プログラミング的な記述の仕方に慣れている人はloopよりtimesの方が使いやすいかも。

times

指定回数ループを繰り返す。

(times,回数[,カウンタ初期値],ループ本体)

「ループ本体」を「回数」回繰り返し、戻り値を連結して返す。
loopとはちょっと違う。プログラムに慣れてる人はこちらの方が分かりやすいかも。

#----loopとtimesの指定方法の違い。どちらも同じものを出力する。
*サンプル
(loop,神は私を見放した,3)
(times,3,(神は私を見放した))

@神は私を見放した
唯一王

while

「式」を計算した値が真(0以外)である間、ループ本体を繰り返し結果を連結して返します。
ループ方法をちょっとミスっただけで容易く無限ループに陥るので注意。

(while,条件式[,カウンタ初期値],ループ本体)

使用例

*異なる乱数を二つ得る
$ランダム1【タブ】(乱数0〜9)
$ランダム2【タブ】(乱数0〜9)
(while,(ランダム1)==(ランダム2),(set,ランダム2,(乱数0〜9)))

for

指定開始値から増分づつカウンタを増加させ終了値までループを繰り返します。

(for,開始値,終了値[,増分],ループ本体)

カウンタが「開始値」から「終了値」に向かって「増分」ずつ進み、その度に「ループ本体」を繰り返し、結果を連結して返します。
when同様、カッコは事前に評価されません。
カウンタは(C0)で表示します。必ず半角文字になっているので、カウンタを使って変数やトークを呼び出したい場合は注意してください。全角文字にしたい場合はhan2zen関数を使いましょう。
また、「開始値」が「終了値」より大きい場合は、(C0)が「増分」ずつ減ります。
「増分」はマイナスの値を指定してもエラーとはならず、絶対値(マイナスの符号を無視してプラスとみなす)が使用されます。
ただし、0を指定するとエラーとなり、処理が実行されません。
「増分」が省略された場合、「1」を指定したことになります。

(for,1,11,3,カウンタ(C0)だよ。)
#結果→カウンタ1だよ。カウンタ4だよ。カウンタ7だよ。カウンタ10だよ。

(for,1,3,1,カウンタ(han2zen,(C0))だよ。)
#結果→カウンタ1だよ。カウンタ2だよ。カウンタ3だよ。

(for,7,2,2,カウンタ(C0)だよ。)
#結果→カウンタ7だよ。カウンタ5だよ。カウンタ3だよ。

(for,1,5,(C0))
#結果→12345

通知される数が不定な場合などに、ループは有効です。
使用例→インストールされているバルーンを全て変数に格納するOnTeachで教わった単語を履歴からチェックする

 

forの中にforを入れるなど、繰り返しを入れ子にした場合、カウンタの取得は以下のようになります。
参照C○
\nは改行を意味するさくらスクリプト。

サンプル

(for,0,2,
	(for,3,5,内側(C0)外側(C1)\n)
)

出力結果

内側3外側0
内側4外側0
内側5外側0
内側3外側1
内側4外側1
内側5外側1
内側3外側2
内側4外側2
内側5外側2

forにとって自分が(C0)であり、それより外側にあるものが(C1)、(C2)...となります。
以下の例では、1行目のforの中にある「外側(C0)」と、入れ子のforの中にある「外側(C1)」はそれぞれ同じ内容(1行目のforのカウンタ)を表示しています。

サンプル

(for,0,2,
	外側(C0)\n
	(for,3,5,内側(C0)外側(C1)\n)
)

出力結果

外側0
内側3外側0
内側4外側0
内側5外側0
外側1
内側3外側1
内側4外側1
内側5外側1
外側2
内側3外側2
内側4外側2
内側5外側2

文字列操作

比較

equal

(equal,文字列1,文字列2)

文字列1と文字列2が等しければ1(真)、そうでないなら0(偽)を返します。

ssuにある比較関数compareや、compare_caseと違う点は、
これらが大文字・小文字、半角・全角を同じ文字と見なして
同一の文字列かを判定するのに対して、
equalは文字を全て区別して判定するところです。

各関数と入力された文字、そしてその判定をそれぞれ表にすると以下のようになります。

入力文字列ABC,ABCABC,ABCABC,abcABCダ,AbCダ0,0(半角)0,0(全角)0,0(混在)
compare1111111
compare_case1100111
equal1000110

等号演算子を使った文字列の比較の代替としても使えます。
文字列の中に例えば「!」や「=」といった記号が入っていた場合、
等号演算子ではきちんと文字列が等しいかどうか、
判断することが出来ませんでした。

(when,"A=="=="A==",1,0)#0が返ってしまって上手く比較できない
(when,(equal,A==,A==),1,0)#1が返ってくる
(when,(equal,A==,A==),1,0)#0が返ってくる

文字列が文字の種類含めて、本当に同じ物なのかを判定する時に使うといいかもしれません。

compare

元ssu関数。
文字列1と文字列2が等しければ1(真)、そうでないなら0(偽)を返します。

(compare,文字列1,文字列2)

この関数による比較は、大文字・小文字、半角・全角を同一と見なします。

(compare,ABC,ABC)
(compare,ABC,ABC)
(compare,ABC,abc)
(compare,ABCダ,AbCダ)

上記の実行結果はいずれも1となります。

厳密に区別したい場合、equal関数を使いましょう。

compare_head

元ssu関数。
文字列1の先頭に文字列2が含まれていれば1(真)、そうでないなら0(偽)を返します。
文字の扱いはcompareと同じです。

(compare_head,文字列1,文字列2)

compare_tail

元ssu関数。
文字列1の末尾に文字列2が含まれていれば1(真)、そうでないなら0(偽)を返します。
文字の扱いはcompareと同じです。

(compare_tail,文字列1,文字列2)

compare_case

元ssu関数。
半角全角を同一視し、大文字小文字を同一視しないcompare関数。

(compare_case,文字列1,文字列2)

compare_head_case

元ssu関数。
半角全角を同一視し、大文字小文字を同一視しないcompare_head関数。

(compare_head_case,文字列1,文字列2)

compare_tail_case

元ssu関数。
半角全角を同一視し、大文字小文字を同一視しないcompare_tail関数。

(compare_tail_case,文字列1,文字列2)

切り出し

substr

元ssu関数。
文字列の一部(開始位置から取り出す長さの分)を取り出します。
開始位置は、0から数えるため注意。3文字目から取り出したい場合、開始位置は2を指定する必要があります。

(substr,文字列,開始位置[,取り出す長さ])
(substr,うにゅう,1,2)
にゅ

取り出す長さを省略すると、残りの文字列全てを取り出します。

(substr,うにゅう,1)
にゅう

開始位置、長さ共にマイナス値も指定できます。

開始位置の場合
0 1 2 3 4 5
あいうえおかきくけこ
          -5-4-3-2-1
長さの場合(開始位置が「か」の場合)
          1 2 3 4 5
あいうえおかきくけこ
-5-4-3-2-1
(substr,あいうえおかきくけこ,5,3)
(substr,あいうえおかきくけこ,5,-3)
 ↓
かきく
うえお

at

元ssu関数。
0から始まる指定文字数目の文字を抜き出します。

(at,文字列,引数1)
(at,お酒に逃げた,3)→逃
#慌ててユーザ名を呼ぶなどの演出に使う例
(at(バイト値、1)(ユーザ名)(バイト値、1)0)、(ユーザ名)!?
#ユーザ名が「ユーザ」なら、「ユ、ユーザ!?」
#セリフに自動的に「…」をランダムに挿入する例
#トークをそのまま入れるとおかしくなるため、一言セリフのみ
#(\nなどのさくらスクリプトまでバラバラにしてしまう)
@三点リーダ挿入
(for,0,(calc,(length(バイト値、1)(A0)) - 1),1
	,(at(バイト値、1)(A0)(バイト値、1)(C0))
	(choice,(nop,),…,……)
)

*
(call,三点リーダ挿入,俺を置いて先に行け)
#「俺…を置……い…て先に…行……け」などになる

分割

split

元ssu関数。
文字列を分割します。
関数の返り値は文字列の分割数を返します。分割された文字列は変数S0,[S1,S2...Sn]に格納されます。

(split,分割する文字列[,区切文字列[,最大分割数[,空要素分割]]])
  • 区切文字列以降を省略した場合は1文字づつに分割します。
  • 最大分割数に1以上を指定すると分割数が最大分割数以上になる場合、最後の変数Snに残り文字列が全て格納されます。最大分割数に0を指定すると無制限に分割します。省略時は0です。
  • 空要素分割に1を指定すると文字列内に区切文字列が連続していている場合は空の要素として分割します。空要素分割に0を指定すると空要素は無視されます。省略時は0です。

例文戻り値S0S1S2S3S4S5
(split,あ◯◯い◯う)
一文字ずつ分割
6
(split,あ◯◯い◯う,◯)
指定した1文字(◯)で分割する
3
(split,あ◯◯い◯う,◯,2)
◯で分割し、分割数は最大2個
2◯い◯う
(split,あ◯◯い◯う,◯,0,1)
◯で分割し、分割数無制限、空要素も含める
4
(split,あ◯◯い◯う,◯,3,1)
◯で分割し、分割数最大3、空要素も含める
3い◯う

単語群のひとつの単語から2語以上拾ったり、日時取得時に時分秒を付けたりするのに便利です。

*OnSNTPCompare
$時計【タブ】(split、(R1)、,)
:あちらは、(S0)年(S1)月(S2)日(S3)時(S4)分(S5)秒
$時計【タブ】(split、(R2)、,)
こちらが、(S0)年(S1)月(S2)日(S3)時(S4)分(S5)秒

関数の返り値の分割数をそのままトークに利用するのでなければ、変数に代入するかnop関数を使用して値を捨てます。

$分割数【タブ】(split,文字列[,分割文字列[,最大分割数][,空要素分割]]])
(nop,(split,文字列[,分割文字列[,最大分割数[,空要素分割]]]))
$ダミー【タブ】(nop,(split,文字列[,分割文字列[,最大分割数][,空要素分割]]]))

と書くと、変数ダミーにはnopの結果(空っぽ)が代入されるため、変数ダミーの削除となります。
余計な変数でセーブデータを汚さず、$を使うため改行が発生しないのでおすすめです。

よくイベントの引数(R0など)で使用されているバイト値1区切りのデータを分割するには、内部関数のバイト値と組み合わせます

(split,(R0),(バイト値、1))

分割文字列にカンマ","が良く使われますのでこれで文字列を分割する場合は下記のようにします。

(split、(R0)、,)

また文字列に","や"、"が両方とも含まれる可能性がある場合は、引数区切り文字を新たに定義する事で対応します。
使用する文字は文字列中に含まれないと断定可能な文字ならなんでも良いですが通常はバイト値を使用しましょう。

$B3【タブ】(バイト値、3)
$引数区切り追加【タブ】(B3)
(split(B3)(R0)(B3)(バイト値、1))
$引数区切り削除【タブ】(B3)

特殊変数の引数区切り参考

置換

replace

元ssu関数。
文字列の中の特定の文字を別な文字に置き換えます。

(replace,文字列,検索語,置換する語)
(replace,なまむぎなまごめなまたまご,なま,生)
 ↓ 
生むぎ生ごめ生たまご

replace_first

元ssu関数。
replaceの一番最初の該当文字だけ置き換える版。

(replace_first,文字列,検索語,置換する語)
(replace_first,なまむぎなまごめなまたまご,なま,生)
 ↓ 
生むぎなまごめなまたまご

replace_last
replace_lastは存在しないが、自作関数として作ることが出来ます。
reverse関数のサンプル参照。

消去

erase

元ssu関数。
文字列の中の特定の文字を消します。

(erase,文字列,消去する語)
(erase,なまむぎなまごめなまたまご,なま)
 ↓ 
むぎごめたまご

erase_first

元ssu関数。
eraseの一番最初の該当文字だけ消す版。

(erase_first,文字列,消去する語)
(erase_first,なまむぎなまごめなまたまご,なま)
 ↓ 
むぎなまごめなまたまご

erase_last
erase_lastは存在しませんが、自作関数として作ることが出来ます。
reverse関数のサンプル参照。

検索

count

元ssu関数。
文字列の中に、特定の検索語がいくつ含まれているかを数えます。
条件式に使うなら、単純に文字列検索として使えます。

(count,文字列,検索語)
「なまむぎなまごめなまたまご」の中に
「なま」は(count,なまむぎなまごめなまたまご,なま)個入っています。
 ↓ 
「なまむぎなまごめなまたまご」の中に
「なま」は3個入っています。
#特定のランダムトークで、条件を満たしていなければ別のトークに飛ばす
*
>ポ入り【タブ】(count(バイト値、1)(ユーザ名)(バイト値、1)ポ)
()

*ポ入り
:(ユーザ名)さんの名前には、
「ポスト」の「ポ」の字が入ってるんだね!
:だからどうしたというんだ。

文字数取得

length

元ssu関数。
文字列の文字数(バイト数ではありません)を返します。

(length,文字列)
(length,ABCあいう)
6
#バイト数の9ではないことに注意

引数判定

is_empty

元ssu関数。
is_emptyは引数が空文字列であるかを判定。空文字列なら1(真)、そうでないなら0(偽)を返します。

(is_empty,引数)

(Status)(R0)に対しては正しく動作しないので気をつけてください。
自分で用意した変数や、call関数の(A◯)などに限定して使うようにした方が良いでしょう。

is_digit

元ssu関数。
is_digitは引数が数値であるかを判定。数値なら1(真)、そうでないなら0(偽)を返します。

(is_digit,引数)
(is_digit,3)
1
(is_digit,3.141592)
1
(is_digit,ABC)
0

下記のどちらかの記述で、引数が整数の場合のみ1(真)を返します。

(is_digit,引数,整数)(is_digit,引数,integer)
(is_digit,3,整数)
1
(is_digit,3.141592,整数)
0

is_alpha

元ssu関数。
is_alphaは引数がアルファベットの文字列であるかを判定。アルファベットの文字列なら1(真)、そうでないなら0(偽)を返します。

(is_alpha,引数)
(is_alpha,ABC)
1
(is_alpha,ABC)
1
(is_alpha,123)
0

文字列変換

zen2han

元ssu関数。
文字列中の全角である「数字、アルファベット、カナ、一部の記号」を半角に変換します。

「変換タイプ」は 「数字」「アルファベット」「カナ」「記号」 が指定可能で、複数指定・任意の組み合わせが可能。 指定したタイプのもののみ変換される。省略時は全指定。

(zen2han,文字列[,変換タイプ])
(zen2han,アルファベットABC)
アルファベットABC
(zen2han,アルファベットABC123!?,数字記号)
アルファベットABC123!?

han2zen

元ssu関数。
文字列中の半角である「数字、アルファベット、カナ、一部の記号」を全角に変換します。

「変換タイプ」は 「数字」「アルファベット」「カナ」「記号」 が指定可能で、複数指定・任意の組み合わせが可能。 指定は空白等適当な文字で区切って行い、指定したタイプのもののみ変換される。省略時は全指定。

(han2zen,文字列[,変換タイプ])
(han2zen,アルファベットABC)
アルファベットABC
(han2zen,アルファベットABC123!?,アルファベット数字)
アルファベットABC123!?

kata2hira

元ssu関数。
文字列中のカタカナをひらがなに変換します。

(kata2hira,文字列)
(kata2hira,アルファベット)
あるふぁべっと
#半角文字は変換されない
(kata2hira,アルファベット)
アルファベット

hira2kata

元ssu関数。
文字列中のひらがなをカタカナに変換します。

(hira2kata,文字列)
(hira2kata,あるふぁべっと)
アルファベット

接続

join

元ssu関数。
対象1〜nを連結文字列で繋いだものを返します。

(join,連結文字列,対象1[,対象2[…,対象n]])
(join,と,グー,チョキ,パー)
 ↓
グーとチョキとパー
(calc,(join,+,1,2,3,4,5))
 ↓
(calc,1+2+3+4+5)
 ↓
15

反転

reverse

「文字列」を「列字文」にします。

(reverse,文字列)
*
:「(reverse,ねないこだれだ)!」
:「だれだこいなね」って、ねぇ…。

これ単体だと意味がなさそうに見えますが、組み合わせると便利な処理が作れます。

#replace_firstを改造して、最後の1つだけ置き換える「replace_last」を作る
#区切り文字がバイト値1で分かりづらいが、
#(replace_first,(reverse,文字列),(reverse,検索語),(reverse,置換する語))を
#最後にさらにreverseで反転している形
@replace_last
(reverse
	(バイト値,1)(replace_first
		(バイト値,1)(reverse(バイト値,1)(A0))
		(バイト値,1)(reverse(バイト値,1)(A1))
		(バイト値,1)(reverse(バイト値,1)(A2))
	)
)

*
:(call,replace_last,トゲアリトゲナシトゲトゲ,トゲ,デマル)
#結果→トゲアリトゲナシトゲデマル

処理についてはreplace_firstcall関数バイト値の説明を参照。

上記サンプルを改造してerase_lastも作れます。

@erase_last
(reverse
	(バイト値,1)(erase_first
		(バイト値,1)(reverse(バイト値,1)(A0))
		(バイト値,1)(reverse(バイト値,1)(A1))
	)
)

フォルダ操作

lsimg

元ssu関数。
指定フォルダ内の画像ファイルの数を調べます。

(lsimg,絶対パス)
*
:(lsimg,D:\アレな画像)個もの画像ファイルが見つかったんだけどー。

mkdir

元ssu関数。
フォルダを作ります。
成功したら1、失敗したら0を返します。
Mc159-4現在、ファイルをコピーしたり読み込んだりする機能はないのでほぼ無意味。

(mkdir,絶対パスorベースウェアからの相対パス)
*フォルダ作成
>成功【タブ】(mkdir,ghost\satori\ghost\master\新規フォルダ)==1
:失敗したみたい…。

*成功
:新規フォルダをつくったよ。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-10-30 (月) 14:39:29 (25d)