里々に最初から登録されている関数。
satori_conf.txtSAORI定義を全て削除しても使える物。

※「元ssu関数」と記述されたものは、かつてssu.dllというSAORIの機能でした。
 Mc157-1からssuの関数は里々本体に統合されたため内部関数となり、気にせず使えます。

サンプルに括弧内で改行やタブ文字を入れているものがありますが、
括弧内の改行は里々に無視され、タブ文字はSSPに無視されるため、見やすいように適宜挿入すると良いでしょう。

例として、以下は同じ結果となります。

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



単語の追加

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

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

@くだもの
りんご

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

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

追加単語の削除

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

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

追加単語の全削除

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

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

合成単語群

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

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

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

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

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

バイト値

バイト値とは、文字に対して数字を割り当てたものです。
1〜127まで使用可能。以下は使用例。

(バイト値、97)

と書くと、半角の「a」が表示されます。
これは半角「a」には97番が割り当てられているためです。
詳しくは「ASCIIコード」などで検索してみましょう。

(バイト値、9)

だとタブ文字になるが、SSPはタブを無視するのでこれで文字の並びを整えたりは出来ません。

このバイト値には、文字だけではなくて、特殊な命令のようなものも組み込まれています。
例えば、(バイト値、1)としても、何も表示されません。
当然SSPなどベースウェアでは無効であるため、単に「キーボードから入力不能な見えない文字」という認識でかまいません。
ユーザの入力とかゴースト名にはどんな文字がくるのか分からないため、これらによる分岐などの判断用に「キーボードから入力不能である」という点を生かして(バイト値、1)が使われています。

そもそも、(バイト値、97)と書くのであれば直接「a」を書いた方が早いので、上記の通り「引数区切り文字としてキーボードから入力不能な文字を出力する」という点にのみ絞って使われます。
こういった用例では、基本的に1〜8が使われています。バイト値1〜8は全て「入力不能な見えない文字」が出力されます。
なお、引数区切り文字には最初から「、」「,」「,」などと一緒に「バイト値1」(バイト値、1)も登録されているため、カンマ(さくらスクリプトを使う場合など)とか読点(トーク全体に処理をしたい場合など)を使いそうな部分であればバイト値1を使っておくとバグが出にくくなります。

例。
ユーザ名が前もって入力されるとして、これによって分岐して一言喋る処理を作ります。
以下はユーザ名が「ご主人様」や「お兄ちゃん」だと文句を言うスクリプト。

#本来はユーザ名はあらかじめインプットボックスから入力されて格納されているとする
$ユーザ名【タブ】入力で、何か分からない文字が,入ってる
(whenlist、(ユーザ名)==、
	ご主人様、それはちょっと困る。、
	お兄ちゃん、ええー……やだ。、
	わかった。
)

ユーザ名の中身を里々が見たとき、以下のようになってしまい、区切る位置がおかしくなって誤動作します。
「、」を区切りにしているため、「入力で」「何か分からない文字が,入ってる」と区切られてしまいます。

(whenlist、入力で、何か分からない文字が,入ってる==、
	ご主人様、それはちょっと困る。、
	お兄ちゃん、ええー……やだ。、
	わかった。
)

この場合、whenlistの書き方としておかしくなってしまい、エラーメッセージがバルーンに出てしまいます。
その防止としてバイト値1が使えます。
バイト値1は普通であれば入力出来ないため、ユーザ名に半角カンマや読点(、)が使われていても動きます。

(whenlist(バイト値、1)(ユーザ名)==(バイト値、1)
	ご主人様(バイト値、1)それはちょっと困る。(バイト値、1)
	お兄ちゃん(バイト値、1)ええー……やだ。(バイト値、1)
	わかった。
)


ただし、バイト値1は里々も使うことがあり、またSSPからの通知でも使われることがあるため、使う場所によってはバグになる可能性があります。
OnTranslateや、OnMouseGestureなど、バイト値1が使用される処理があることを覚えておいた方が良いでしょう。
この場合、(バイト値、2)などを引数区切り文字に追加して使用すると安全です。

#ユーザ名にバイト値1が含まれることはないが、サンプル
$引数区切り追加【タブ】(バイト値、2)
(when,(equal(バイト値、2)(ユーザ名)(バイト値、2)ユーザ)||!(変数「ユーザ名」の存在),
	(名前を教えてもらってない)
)
$引数区切り削除【タブ】(バイト値、2)

*名前を教えてもらってない
:まだ名前を教えてもらってない気がする。

[注意]when,times,while,forについて
これらの関数は、引数内の括弧を展開するタイミングを遅らせる仕様の関係から、
(バイト値、1)などの関数が実行されるタイミングも遅れてしまうので、
(バイト値、1)で引数を区切ろうとしても、正しく認識されないようです。
whenはifと同じ処理になり、ループ系の関数は(C0)が常に空になります。
⇒対処法

call

call関数を参照のこと。
ちょっと特殊なので別ページに移してあります。

vncall

call関数に渡す文字を「名前」で与えるバージョンの関数。
例えば、以下の2つは両方とも同じ動作をします。

$v0【タブ】漆黒のユーザ
$v1【タブ】†
(vncall,自作関数,v0,v1)
(call,自作関数,(v0),(v1))
@自作関数
(A1)(A0)(A1)
#結果→†漆黒のユーザ†

大雑把に違いを述べると、vncall関数で渡す文字は、勝手に()が補われます。

(vncall,表示するだけ,3)
@表示するだけ
(A0)
#→(call,表示するだけ,(3))とほぼ同じ
#結果→\s[3]

これにより、変数だけでなく、文や単語群、情報取得変数も使うことが出来ます。

*
#単語群を使った例
(vncall、好き嫌い、好きな野菜、嫌いな野菜)

@好きな野菜
たまねぎ、かぼちゃ
さつまいも、じゃがいも

@嫌いな野菜
たまねぎ、かぼちゃ
にんじん、ピーマン

*好き嫌い
:(A0)は好き。(A1)は嫌い。
:そうか。
#A0など情報取得変数を使った例
>ツッコミ【タブ】(vncall、equal、A0、A1)

*ツッコミ
って、同じやないかい。

また、内部で括弧を補ってくれるという動作により、区切り文字問題を簡単に解消することが出来ます。
区切り文字を使い分けることなく、どれか1つのみに固定して使うことが可能となります。
例えば、上の例にあるequal関数の呼び出しを、以下のようにすると、
区切り文字と同じ文字が渡す文字に入っているためおかしくなります。

>ツッコミ【タブ】(equal、(A0)、(A1))

区切りに使っている「、」が、分割しようとしている文字の中にも含まれているため、区切る位置がおかしくなります。
equal関数に渡す文字は、2つでなければなりません。
(equal、(A0)、(A1))
→(equalたまねぎかぼちゃたまねぎかぼちゃ)

vncallは以下のような関数を呼び出した場合をサポートしておらず、よくわからない結果になることがあるので使わないように気をつけてください。

nop

(nop,引数)

何もしない。さおりの戻り値を捨てるときなどに使います。
例えばsplit関数を使う場合、分割数が必要ない場合は以下のように書きます。

(nop,(split,ポストと狛犬,と))

こうするとsplit関数の実行で出てくる「2」という結果を捨てる(バルーンに表示しない)ことが出来ます。
また、カッコ内の改行が無視されるということから、単語群でコメント代わりにしたりも出来ます。

@単語サンプル
ポスト
紺野ややめ
エミリ(nop,
↑本来はSHIORIサンプルキャラクターではないがついでに入れておく
)
狛犬

この単語群を呼んだ時の結果は、nopがカッコ含めて全て無視されるため、「ポスト」「紺野ややめ」「エミリ」「狛犬」の4つからランダムに選ばれたものが出力されます。
また、単語群の候補は1行で書かなければならないため、長い処理を書くには向きませんが、以下のようにnopで囲むことで見やすく書くことが出来ます。

@単語サンプル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,変数名,値)のほうがすっきりと処理を書けるでしょう。

*
:2d6するよ。(call,さいころをふる,2)
(さいころの目1)と(さいころの目2)か……。

*
:3d6してみようかな。(call,さいころをふる,3)
(さいころの目1)、(さいころの目2)、(さいころの目3)。

@さいころをふる
(nop,
	(set,さいころの目1,(乱数1〜6))
	(when,(A0)>1
		,(set,さいころの目2,(乱数1〜6))
		,(set,さいころの目2,)
	)
	(when,(A0)>2
		,(set,さいころの目3,(乱数1〜6))
		,(set,さいころの目3,)
	)
)

自作関数でさいころをふる処理を作り、ふる個数を指定できるようにしています。
when関数を使わずに処理を作ると、ジャンプを多用した処理を作る必要があります。

#上記と同じ結果になる処理
*
:2d6するよ。
$さいころをふる数=2
$さいころをふった後のジャンプ先=さいころ2個ふったトーク
>さいころをふる

*
:3d6してみようかな。
$さいころをふる数=3
$さいころをふった後のジャンプ先=さいころ3個ふったトーク
>さいころをふる

*さいころをふる
$さいころの目1=(乱数1〜6)
$さいころの目2=
$さいころの目3=
>さいころをふる2個目【タブ】(さいころをふる数)>1
>(さいころをふった後のジャンプ先)

*さいころをふる2個目
$さいころの目2=(乱数1〜6)
>さいころをふる3個目【タブ】(さいころをふる数)>2
>(さいころをふった後のジャンプ先)

*さいころをふる3個目
$さいころの目3=(乱数1〜6)
>(さいころをふった後のジャンプ先)

*さいころ2個ふったトーク
:(さいころの目1)と(さいころの目2)か……。

*さいころ3個ふったトーク
:(さいころの目1)、(さいころの目2)、(さいころの目3)。

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,開始値,終了値[,増分],ループ本体)

カウンタが「開始値」から「終了値」に向かって「増分」ずつ進み、その度に「ループ本体」を繰り返し、結果を連結して返します。
カウンタは(C0)で表示します。

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

loopと構文が入れ替わった感じ。when同様、カッコは事前に評価されません。

必ず半角文字になっているので、変数やトークを呼び出したい場合は注意してください。
han2zen関数を使うと良いでしょう。

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

「開始値」が「終了値」より大きい場合は、(C0)が「増分」ずつ減ります。

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

「増分」はマイナスの値を指定してもエラーとはならず、絶対値(マイナスの符号を無視してプラスとみなす)が使用されます。
ただし、0を指定するとエラーとなり、処理が実行されません。
「増分」が省略された場合、「1」を指定したことになります。

(for,1,5,(C0))
#12345

when同様、カッコは事前に評価されません。
サンプル

$変数1=あ
$変数2=い
$変数3=う
$変数4=え
$変数5=お
(for,1,5,2,「(変数(C0))」、)とこんな使い方もある。

出力結果

「あ」、「う」、「お」、とこんな使い方もある。

通知される数が不定な場合などに、ループは有効です。
使用例
(バルーン名を全て変数に格納する)

*installedballoonname
(for,1,(Rの数)
	,(set、バルーン名(C0)、(R(calc,(C0)−1)))
)
「$バルーン名1」には「[[(R0)>リファレンス]]」の内容、「$バルーン名2」には「(R1)」の内容・・・と~

現在インストールされている全てのバルーンが変数に格納されます。
(Rの数)は、例えば通知されたのが3個なら「3」が入るのですが、実際に通知されている変数名は「R0」「R1」「R2」です。
そのため、格納する値が正しくなるよう、(calc,(C0)−1)として1減らしています。
この結果、カウンタが2のとき、(R(calc,(C0)−1))→(R(calc,2−1))→(R1)となり、$バルーン名2に(R1)が入ります。
これだと大量に変数が作られてしまい、セーブデータに無駄な変数が残ってしまいます。
そこで、1個の変数に入れてしまうことにしましょう。

*installedballoonname
(set,インストール済みバルーン,(for,0,(Rの数)−1,_(R(C0)))_)

こうすると、$インストール済みバルーンには「_SSPデフォルト+_バルーンA_..._」と「_」で区切られたバルーン名が入ります。
存在判定をしたいときは以下のように行うと判定が出来ます。

*
:(when,(count,(インストール済みバルーン),_SSPデフォルト+_)>0
	,SSPデフォルト+入ってるね!
	,SSPデフォルト+ないの!?
)

ただ、入力時にカンマや読点(、)も入力出来るため、バイト値を使った方が良いです。

*installedballoonname
(set(バイト値、1)インストール済みバルーン(バイト値、1)(for,0,(Rの数)−1,_(R(C0)))_)
*
:(when,(count(バイト値、1)(インストール済みバルーン)(バイト値、1)_SSPデフォルト+_)>0
	,SSPデフォルト+入ってるね!
	,SSPデフォルト+ないの!?
)

同様の処理を作ると、OnTeachで単語を教わったときに、履歴から同じ単語を教えられているかなども調べられます。

*OnTeach
$教わった単語【タブ】(R0)
>教わった内容が空っぽ【タブ】(変数「教わった単語」の存在)==0
>教わった内容は前も聞いた【タブ】(count(バイト値、1)(for,0,(Rの数)−1,_(R(C0)))_(バイト値、1)_(R0)_)>0
(教わった単語)って始めて聞いたなあ。

*教わった内容が空っぽ
:教えてくれないの?
*教わった内容は前も聞いた
:(教わった単語)は前も聞いたよ!

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(全角と半角)
compare1111   1       1        1   
compare_case1100   1       1        1   
equal1000    1       1        0   

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

(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です。

#1文字ずつに分割する
(split,あ◯◯い◯う)
#6
#(S0)→あ、(S1)→◯、(S2)→◯、(S3)→い、(S4)→◯、(S5)→う

#指定した1文字(サンプルは◯)で分割する
(split,あ◯◯い◯う,◯)
#3
#(S0)→あ、(S1)→い、(S2)→う

#指定した1文字(サンプルは◯)で分割し、分割は最大2個までにする
(split,あ◯◯い◯う,◯,2)
#2
#(S0)→あ、(S1)→◯い◯う

#指定した1文字(サンプルは◯)で分割し、分割は無制限、空っぽの要素も分割結果に含める
(split,あ◯◯い◯う,◯,0,1)
#4
#(S0)→あ、(S1)→(空白)、(S2)→い、(S3)→う

#指定した1文字(サンプルは◯)で分割し、分割は最大3個まで、空っぽの要素も分割結果に含める
(split,あ◯◯い◯う,◯,3,1)
#3
#(S0)→あ、(S1)→(空白)、(S2)→い◯う

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

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

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

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

分割文字列は、全て一文字ごとに判定される事に注意して下さい。すなわち、

(split,焼きイカ風味カルビ味ソイソース,イカ)

としたとき『焼き』『風味カルビ味ソイソース』に分割されるのではなく『焼き』『』『風味』『ルビ味ソ』『ソース』と、イとカそれぞれ一文字で分割されます。
つまり

  • ×『焼きイカ風味カルビ味ソイソース』
  • ○『焼き風味ルビ味ソソース』

ということ。

二文字以上からなる文字列で分割したい場合は、予めreplaceを使って適当な(一文字の)記号に置換してから、splitをすると良いでしょう。

$対象文字列【タブ】(replace,焼きイカ風味カルビ味ソイソース,イカ,★)
$ダミー【タブ】(nop,(split,(対象文字列),★))
(S0)
(S1)

焼き
風味カルビ味ソイソース

よくイベントの引数(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ではないことに注意

フォーマット出力

sprintf

元ssu関数。
引数1〜nをフォーマットに従って変換したものを返します。

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

フォーマットは、

(sprintf,%02d月%02d日,12,3)
12月03日

のように、「%」から始まる「フォーマット指定子」を含む文字列。
フォーマット指定子とは、出力時のルール。
上の例では、02d→桁が足りない時に左側を0で埋める、2桁の、整数。
フォーマット指定子の出現順と対応する順序の引数が、フォーマット指定子の出力の元となります。

(sprintf,%04dと%-3dと% 2d,1,2,3)
0001と2  と 3

フォーマット指定子

基本の書きかた

%[フラグ指定][最小幅指定][.精度指定][出力指定]

出力指定以外は省略可能

フラグ指定

指定説明
+常に正負符号を表示する
-最小幅に足りない分だけ末尾を半角スペースで埋める(左詰)
 *1最小幅に足りない分だけ先頭を半角スペースで埋める
0最小幅に足りない分だけ先頭を0で埋める
#代替形式。後述

複数続けて指定できます(競合する場合は後に書いた方優先)。
「0」「 」の「先頭」は、正負符号がある場合はその後ろになります。
全角文字は2幅分と数えます。

#出力結果:ユーザ    様
(sprintf,%-10s様,ユーザ)
#出力結果:    ユーザ様
(sprintf,% 10s様,ユーザ)
#出力結果:1234年05月06日
(sprintf,%04d年%02d月%02d日,1234,5,6)
#出力結果:-1+3は?
(sprintf,%+d%+dは?,−1,+3)
#出力結果:-  12
(sprintf,% 5d,-12)

最小幅指定
文字列の最小幅(最小文字数)を指定できます。
数字を入れる場合、正負符号や小数点「.」も数えることに注意してください。
フラグ指定と合わせて用います。

#出力結果:   -12
#フラグ「 」を指定した場合と異なり空白は符合よりも前
(sprintf,%6d,−12)
#出力結果:-012
(sprintf,%04d,−12)

精度指定
「.」に続けて実数の有効桁数が指定できます。

#出力結果:3.142
(sprintf,%1.3f,3.141529)

出力指定

指定対応する引数説明引数「63」の出力例
s,S全て文字列をそのまま表示(sもSも同じ)63
c,C整数指定した10進整数に対応する文字を表示(cもCも同じ)?
d,u実数10進整数で表示(dは符号なし、uは符号付き)63
o,i実数8進整数で表示(oもiも同じ)77
x,X実数16進符号なし整数で表示(xは小文字表記、Xは大文字表記)3f
f実数実数を少数形式(固定小数点による標準記法)で表示63.000000
e,E実数実数を指数形式(科学的記法)で表示(eは小文字表記、Eは大文字表記)6.300000+e001
g,G実数f,eのうち適した方の形式で表示(gは小文字表記、Gは大文字表記)63.000000

フラグ「#」の代替形式について
変換指定に応じて意味が変わります。
o,x,Xの場合:基数を明確にする
f,e,E,g,Gの場合:常に小数点を表示
:無視される

#出力結果:0XA
(sprintf,%#X,10)

補足
引数の番号指定はできません。

サンプル
選択肢をデフォルト環境で右端まで表示します。
(SSPデフォルト+バルーン、文字サイズ初期値)

_(sprintf,%-48s,◯選択肢)【タブ】右端までの選択肢を選んだ
*右端までの選択肢を選んだ
:選択されたよ。

この場合、選択肢の文字列は半角で埋められています。
タブ後のジャンプ先を指定しない場合、以下のようになります。

*◯選択肢                                        #半角スペースが詰められている
:選択されたよ

となり、ややこしいのでジャンプ先を指定するようにしましょう。

ステータスなどを1行で表示するとき、幅を揃えます。

*ステータス表示
:  HP 物攻 物防 魔攻 魔防 速度
(sprintf、% 6d% 6d% 6d% 6d% 6d% 6d、(キャラ1HP)、(キャラ1物攻)、(キャラ1物防)、(キャラ1魔攻)、(キャラ1魔防)、(キャラ1速度))
(sprintf、% 6d% 6d% 6d% 6d% 6d% 6d、(キャラ2HP)、(キャラ2物攻)、(キャラ2物防)、(キャラ2魔攻)、(キャラ2魔防)、(キャラ2速度))

(キャラ1HP)などは変数で設定してあるものとします。

引数判定

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
:失敗したみたい…。

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

*1 半角スペース。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-26 (土) 13:04:37 (28d)