コンテンツにスキップ

チートシート

里々の書き方を 1 ページにまとめた早見表です。くわしい説明は、各項目のリンク先を見てください。

里々の考え方

  • 辞書は行頭の 1 文字で意味が決まります。* は文、@ は単語群、$ は代入です。
  • 関数も変数も単語群も、呼び出しはすべて () です。() の中は、内側から順に展開されます。
  • 記号は全角で書きます。半角の $ や ( は里々の記法としては働きません。
  • ただし、式の中の計算用のカッコだけは半角の ( ) です。
  • 変数の中身は、数値も含めてすべて文字列です。
  • 関数の引数の区切りは、全角の 、 で書きます((calc、1+2))。

行頭の記号

書き方 意味 詳細
*名前 文(トーク)の始まり。*OnBoot のようにイベント名にすると、イベントの応答になる 文と単語群
*(名前なし) ランダムトーク ランダムトークとタイマ
@名前 単語群の始まり。1 行が 1 単語 文と単語群
*名前【タブ】式 @名前【タブ】式 採用条件式。式が真のときだけ候補になる 採用条件式
$名前【タブ】値 変数に文字列をそのまま代入 変数
$名前=式 式を計算して代入(整数は全角数字になる) 式
>名前 別の文へジャンプ(戻ってこない) 制御構造
>名前【タブ】式 式が真のときだけジャンプ 同上
_ラベル【タブ】ID 選択肢(\q[ラベル,ID] になる)。後ろにタブで引数を足すと、ID の文で (A0)〜になる 選択肢
: 喋るキャラクターの切り替え(0 と 1 が交互) スコープとサーフェス
# 以降はコメント 前処理
φ 次の 1 文字をそのまま表示(φ( φ) φ#) 前処理
行末の φ 改行を打ち消して次の行と連結 同上
(数字) サーフェスの切り替え((0) (-1)) スコープとサーフェス
\ % で始まるもの さくらスクリプトと置換タグ。そのまま出力 さくらスクリプトの扱い

辞書の最小例

*OnBoot
$好感度=(好感度)+1
:(0)こんにちは。今日は(現在曜日)曜日ですね。
:(5)(好きな色)が好きです。
>親密なあいさつ【タブ】(好感度)>=3

@好きな色
赤
青

*親密なあいさつ
:また会えましたね。
  • 文は、次の * か @ の行の手前までです。
  • 同じ名前の文や単語群を複数書くと、ランダムに 1 つが選ばれます(重複回避で偏りを調整できます)。
  • 各行の終わりには、自動で \n が付きます(自動挿入)。

()の中身

(名前) は、次の順に調べて最初に見つかったものになります(名前の解決順序)。

順 種類 例
1 関数((名前、引数…)) (calc、1+2)
2 単語群 (好きな色)
3 文 (初回のあいさつ)
4 変数・R0 などの参照値 (好感度)
5 数字 (10)(サーフェス切り替え)
6 組み込み名 (現在年) (乱数1~6)
7 見つからない (名前) のまま残り、ログに not found
  • 入れ子は内側から展開されます。((今日のおやつ)の説明) は (ケーキの説明) になります。
  • 引数の区切りは 、 , 、 , のどれか。最初に見つかった 1 種類だけが使われます。
  • 引数の中の () は、先にすべて展開されます。ただし特殊形式(when など)は、必要な引数だけを展開します。

変数と式

代入の違い

書き方 X の値
$X=1+1 2(全角)
(set、Y、1+1) 2(半角。(set) は式を計算しないが、数字で始まる引数は先に計算される)
$X【タブ】1+1 1+1(そのまま)
$X=(値が空) 変数を削除
  • 変数がないとき、(X) は (X) のまま残ります。式の中では 0 になります。
  • 存在確認は (変数「X」の存在)(1 か 0)。値がなければ 0 にするなら (変数「X」か0)。
  • 数字だけの名前の変数は作れません。
  • 変数は終了時にセーブデータへ保存されます。今回は… で始まる変数と S0 は保存されません。

式で使える演算子

種類 演算子
算術 + - * / % ^
比較 < > <= >= == !=
論理 && || !
計算順序のカッコ 半角の ( )(全角の ( ) は展開に使われる)
  • 整数は 64 ビットです。小数は calc_float を使います。
  • 0 が偽、0 以外が真です。
  • 全角の + < = なども半角として扱われます。
  • == != は文字列の比較なので、01==1 は偽です。

式を使える場所は、$名前=式、採用条件式、>名前【タブ】式、when whenlist times while for の引数、calc などです(式)。

制御構造

やりたいこと 書き方
文の候補を条件で絞る *名前【タブ】式(採用条件式)
別の文へ移る(戻らない) >名前 >名前【タブ】式
別の文を呼ぶ(戻る) (名前) (call、名前、引数…)
2 分岐 (when、式、真、偽)
多分岐 (whenlist、値、<30、冷たい、<70、ふつう、親しい)
n 回繰り返す (times、3、(C0)) → 012
範囲で繰り返す (for、1、3、(C0)) → 123
条件で繰り返す (while、(C0)<3、(C0)) → 012
名前を呼びながら繰り返す (loop、名前、3)(カウンタは (名前カウンタ))

when と if の違い

when(里々の特殊形式)は、選ばれた枝だけを展開します。ssu の if は、両方の枝を展開してから選びます。(set) などの副作用がある枝には when を使ってください。

while の無限ループ

while の条件が偽にならないと、繰り返しが止まりません。結果が $括弧展開サイズ制限 を超えたとき(Mc201-7以降)、または呼び出しと繰り返しの合計が $呼び出し総数制限(既定 100000)を超えたとき(Mc201-8以降)に打ち切ります。

引数・参照値

名前 意味
(R0) (R1)… イベントの Reference0, 1…
(A0) (A1) (Aの数) call / vncall で渡された引数
(S0) (S1) (Sの数) 直前の SAORI(ssu を含む)の戻り値
(H1) (H2)… このトークで展開した () の結果の履歴
(C0) (C1) ループカウンタ(内側が C0)

詳細は引数・参照値の名前。

よく使う組み込み名

名前 値
(現在年) (現在月) (現在日) (現在曜日) (現在時) (現在分) (現在秒) 現在の日時(曜日は 日 月…)
(乱数1~6) 下限以上、上限以下の整数。区切りは ~。半角で書くと半角で返る
(起動回数) 起動のたびに 1 増える
(文「名前」の存在) (単語群「名前」の存在) (変数「名前」の存在) 1 か 0
(文「名前」の数) (単語群「名前」の数) 定義の数
(最終トークからの経過秒) 最後に喋ってからの秒数
(イベント名) いま処理しているリクエストの ID
(里々のバージョン) phase Mc201-1 のような文字列

時刻・状態の名前の全部は、時刻・経過時間と状態・存在確認にあります。

内蔵関数

里々本体に入っている関数です(一覧)。

関数 書式 用途
set (set、名前、値) 変数へ代入(() の中から使う)
call (call、名前、引数…) 引数付きで呼び出す。受け側は (A0)
vncall (vncall、呼び出し先、名前…) 名前を評価した結果を引数にして呼ぶ
when (when、式、真、偽) 条件分岐(特殊形式)
whenlist (whenlist、値、条件1、結果1、…、それ以外) 比較の連続(特殊形式)
times (times、回数、本体) 繰り返し
for (for、開始、終了、本体) 範囲で繰り返し
while (while、条件、本体) 条件で繰り返し
loop (loop、名前、最大) 名前を繰り返し呼ぶ
合成単語群 (合成単語群、名前1、名前2) 複数の単語群から 1 つ選ぶ
文の数 (文の数、名前) 文の数
単語の追加 (単語の追加、単語群、単語) 実行時に単語を追加(セーブされる)
split_to (split_to、接頭辞、文字列、区切り) 分割して、接頭辞0 接頭辞1… の変数に入れる

ローカルのみの関数

set call loop などは、SecurityLevel: local でないリクエスト(外部からのイベント)では実行されず、空になります。一覧は内蔵関数にあります。

ssu の関数

同梱の ssu の関数です(一覧)。引数の先頭が数字・+・- のとき、里々が先に整数として計算します。

種類 書式 例 → 結果
計算 (calc、式) (calc、1+2) → 3
小数の計算 (calc_float、式) 引数の計算を止めないと整数になる(下の注意)
条件 (if、式、真、偽) (unless、…) 両方の枝が展開される
番号で選ぶ (nswitch、n、候補1、候補2、…) (nswitch、2、a、b、c) → b(1 から数える)
値で選ぶ (switch、値、比較値1、結果1、…、それ以外)
条件で選ぶ (iflist、値、条件1、結果1、…、それ以外)
切り出し (substr、文字列、開始、長さ) (substr、あいうえお、1、2) → いう(開始は 0 から)
n 文字目 (at、文字列、位置)
分割・結合 (split、文字列、区切り) (join、区切り、文字列…) 分割結果は (S0) (S1)…(上書きしたくないときは内蔵の (split_to、接頭辞、文字列、区切り))
置換 (replace、文字列、前、後) (replace、abc、b、X) → aXc
削除・数える (erase、文字列、削除する文字列) (count、対象、探す文字列)
正規表現(Mc203-1以降) (regex_match、対象、パターン、オプション) (regex_find、…) (regex_findall、…) (regex_count、…) (regex_replace、対象、パターン、置換後、オプション) (regex_replace_first、…) (regex_erase、…) (regex_erase_first、…) (regex_split、…) (regex_escape、文字列) オプションは i(大小無視)s m x。(regex_match、abc123、(\d+))(S1) → 123(書き方)
比較 (compare、A、B) (compare_head、…) (compare_tail、…) _case 付きは大文字小文字を区別する
判定 (length、文字列) (is_empty、…) (is_digit、…) (is_alpha、…)
変換 (zen2han、…) (han2zen、…) (hira2kata、…) (kata2hira、…)
書式 (sprintf、書式、値…) (sprintf、%05d、42) → 00042
ランダム (choice、候補1、候補2、…)

calc_float の落とし穴

(calc_float、5/3) は、5/3 が先に整数で計算されて 1 になります。小数で計算するときは $SAORI引数の計算=無効 にします(ssu の引数の計算)。

里々が決まったタイミングで実行する文

名前 実行されるとき
*初期化 satori_conf.txt の読み込み直後。システム変数の設定を書く
*OnSatoriLoad 辞書の読み込み後。重複回避の設定などをここに書く
*OnSatoriBoot 辞書の読み込み後。結果が最初の OnBoot の応答になる
*OnSatoriClose 終了時。空でなければ終了の応答になる
*OnSatoriUnload アンロード直前
*OnSatoriSecondChange 秒ごと。ほかに何も喋らなかったとき
*OnSatoriTimer *名前 のないタイマが発動したとき。(A0) が名前
*COMMUNICATE該当なし 話しかけられたが、該当する文がなかったとき

イベント(OnBoot OnClose OnMouseDoubleClick など)は、同じ名前の文があれば実行されます(イベントの処理)。マウスは *0Headつつかれ のような名前の文が使われます(デフォルトの動作)。

よく使うシステム変数

$名前=値 で設定します。有効 と書いたときだけ真で、無効 などは偽です(システム変数)。

変数 内容
$喋り間隔=120 ランダムトークの間隔(秒)。0 で喋らない
$名前タイマ=秒数 その秒数のあとに *名前(なければ *OnSatoriTimer)を実行する
$次のトーク=名前 次のランダムトークを予約する
$自動改行挿入=無効 行末の \n を付けない
$自動挿入ウェイトタイプ=無効 自動ウェイトを入れない(里々 一般 無効)
$今回は喋らない=有効 この応答では何も返さない
$単語群「名前」の重複回避=有効、トーク中 同じ単語が続かないようにする
$SAORI引数の計算=無効 SAORI の引数を里々が先に計算しない
$デバッグ=有効 ShioriEcho などのデバッグ機能を使えるようにする

ハマりやすいところ

  • satori_conf.txt には *初期化 と @SAORI しか書けません。 ほかの文や単語群は、読み込み後に捨てられます。辞書があることが前提の設定(重複回避など)は、*OnSatoriLoad に書きます。
  • $X=1+1 は全角の 2、(set、X、1+1) や (calc、1+2) は半角です。 全角と半角は計算では区別されませんが、== は文字列の比較です。
  • 式の中のカッコは半角です。 全角の () は展開されます。
  • > のジャンプは戻りません。 戻りたいときは (名前) で呼びます。
  • () の展開結果に区切り文字が入ると、引数が余分に分かれます。 通常の関数は、先に展開してから引数に分けるためです。
  • 同じ名前の文・単語群・変数を作らないでください。 単語群、文、変数の順に見つかります。
  • タブで区切る場所があります。 $名前【タブ】値、*名前【タブ】条件、_ラベル【タブ】ID は、タブが区切りです(半角スペースは不可)。【タブ】 はタブ文字 1 文字の意味です(【タブ】について)。
  • () が閉じていないと、辞書の読み込みでエラーになります。 カッコの中は改行できますが、閉じ忘れに注意します。
  • while の無限ループは止まりません。 条件を必ず偽にします。

動作確認

$デバッグ=有効 にして、ShioriEcho でその場で試せます(ShioriEcho とデバッグ)。エラーはエラーメッセージ・警告にあります。