#author("2023-11-10T18:27:42+09:00","default:post","post") #author("2023-11-25T09:09:25+09:00","default:post","post") もう少し踏み込んだ里々の解説です。~ 里々の仕様書ではないので注意。~ ---- #contents ---- ~ *里々の特徴 [#ide66452] 里々とは[[櫛ケ浜やぎ氏>https://yagi.hateblo.jp/about]]が開発した栞の一つで、シンプルかつ簡単にゴーストを作れることから、初心者に推奨される筆頭となっています。「簡単に」という売りは伊達ではなく、特筆すべきは 里々とは[[櫛ケ浜やぎ氏>https://yagi.hateblo.jp/about]]が開発した栞で、シンプルかつ簡単にゴーストを作れることから、初心者に推奨される筆頭となっています。「簡単に」という売りは伊達ではなく、特筆すべきは -さくらスクリプトを使わずともトークの記述ができる --辞書中の改行を自動的に\nに置換してくれる --辞書中の句読点などから自動的にウェイトを追加してくれる --日本語入力モードを「全角」のまま書ける -トークに関する強力な機能 --ランダムトークや撫で反応など、他の栞では別個記述が必要な機能を最初から搭載 --[[重複回避>特殊変数#o772b719]]、[[採用条件>特殊記号一覧#q1c400bd]]などによる補助 さくらスクリプトを使うこともできますし、半角文字も記号など一部例外を除いて基本的に全て使う事ができます。里々は初心者向けという側面と共に、''トークを主体とするゴースト開発に便利''な栞なのです。これは他の栞には真似のできない強力な特徴です。~ また、里々は一般に複雑な処理には向かないと言われますが、それでもある程度の関数や文字列操作を備えており、また、不得手であるファイル操作や変数管理も他の栞をSAORIとして使用する等でカバーする事が可能です。~ *里々ゴースト開発の常態 [#w1716581] 従来より、里々は本体と共に「ポストと狛犬」というテンプレートゴーストのパッケージで配布されており、これの改造によってゴースト制作を行うのが一般的でした。~ 現状では[[公式>http://ukgk.s34.xrea.com/poskoma/]]の里々の更新は停止し、有志による[[里々改修用プロジェクト>https://github.com/ukatech/satoriya-shiori/wiki]]を搭載した[[ポストと狛犬]]がこれを引き継いでいます。~ 注意点としては、これらの開発は個別の有志の手によるものであり、必ずしも[[ポストと狛犬]]が最新版の里々を搭載しているとは限りません。~ バージョンアップにより新規追加された関数などもあります。~ *栞としての里々 [#h179e054] **ファイル構成 [#dcbbef84] 詳しくは[[ファイル構成]]のページで解説されていますが、里々における構成ファイルはおおまかに3種類に分けられます。~ まず、里々本体satori.dllと、ライセンス上同梱を義務付けられているsatori_license.txt。(※Mc163-5以降では不要)~ 次に、ゴーストを構成する辞書(ファイル名がdicから始まるテキストファイル)。~ 最後に、指定された名前のテキストファイルを用意することによって効果を発揮する補助ファイル。~ 補助ファイルの中で要求頻度の高いものは、初期変数の設定とsaoriの登録を行うsatori_conf.txt、特定の文字にウェイトを加えたり【タブ】をタブ文字に変換するなど置換機能を設定するreplace.txt/replace_after.txtなどが多くのゴーストで常用されており、相対的に必須だと言うことができます。~ **基本記法 [#q1efe2d2] 里々の辞書はごく普通のtxtファイルで、全角記号の「*」「@」を行頭で使用した行が定義の開始宣言となります。定義の終端は次に「*」か「@」が来るまで、もしくはテキストの終端までです。この時、終端までの改行は自動排除されます。~ その他の記号は全て*定義の中で使用します(単体で使用することはできず、また使おうとしても定義の終点が伸びるだけです)。辞書ファイル内において最初に*または@が来るまでの行は無視されます。~ 詳しくは[[特殊記号一覧]]を参照して下さい。~ *トーク名 定義行 ~ 定義行 @単語群名 単語定義 単語定義 単語定義 *によるトーク定義中の通常改行は自動的に\nに置換されます。ただし$や>など、行頭で宣言し一行占有する場合はこの限りではありません。~ 同じトーク名がつけられた場合は、()や>で評価される時の候補となり、ランダムで一つ選択されます。~ トーク名を記述しなかった場合、ランダムトークの候補として定義されます。~ @による単語定義は、以降の行が常に一行が一候補として定義されます。~ つまり、複数行に渡って定義することで、一行ごとに評価時の選出候補となります。*と同様、同じ名前をつけた場合も全て候補になります。~ ***丸括弧による評価 [#h72fc125] 里々では全角の丸括弧()を使い、トーク、単語群、変数、関数(SAORI含む)を呼び出し、評価します。~ これは以下の動作をします。 -括弧で括った文字列と同じ名前のついた*または@があれば、それを評価 -括弧で括った文字列が数値であれば、数字に対応したさくらスクリプト\s[n]に置換 -括弧で括った文字列と同じ名前の変数があれば、その内容に置換 -括弧で括った文字列と同じ名前の関数があれば、その関数を実行~ この時、(関数名,引数,引数,....)と記述する事で引数を与えることができる -何も文字列を括らず、()とだけ記述した場合はランダムトークに置換 -上記のいずれも満たさなかった場合、文字列として出力(空文字にはならない) ***変数への代入 [#b0d91ab6] $を行頭に記述し、一行占有して定義します。これに限らず、行頭に記述する記号はすべて*セクション内でのみ用いる記号となります。 $変数名【タブ】値 以上のような行を追加する事で、変数に値を格納できます。~ この変数の定義は、一部のシステム設定を司る変数の変更にも使用します。~ 定義された変数は、例外を除き全てがセーブデータに自動的に保存されます。処理中において自動的に破棄される一時変数などは存在しないため、できるだけ明示的に変数の削除を行う必要があります。~ 格納された変数はトークと似た扱いになり、()によって参照できます。~ **リクエストに対するレスポンスの記述 [#oe83bc01] 里々では[[特殊記号一覧]]にある*、@によってベースウェアのリクエストに対応します。~ 以下はSSPが通知するイベントの例。 GET SHIORI/3.0 Charset: Shift_JIS Sender: SSP SecurityLevel: local ID: OnSecondChange Reference0: 0 Reference1: 0 Reference2: 0 Reference3: 1 Reference4: 0 これに辞書が対応する(レスポンスを定義する)には、 *OnSecondChange 定義 とするだけで、非常に簡単に記述できます。~ この内、Charset、Sender、Referenceは後述する方法で参照できます。 -注意点 --里々ではイベントのGet/Notifyの判別はできません。~ リソースも含めた全てのリクエストを「リソース/イベントID」そのままで定義します。 --*と@は後者の定義が常に一行で完結する程度の違いしかありません。~ 従って、スクリプトを返すようなレスポンスは*を、基本的に一行で済むようなリソース情報は@を使うのが一般的といえます(無論、トークを一行に収めてしまっても構いません)。~ *OnBoot 定義 @homeurl http:// 作成した定義は、他の栞と同じように、里々内部で自動的にさくらスクリプトによるトークへと変換されてからベースウェアに渡されます。~ **SHIORIヘッダの取得方法 [#h05922a0] 前述したイベントのReference等を参照する方法です。参考→[[情報取得変数のシステム情報>情報取得変数#ad1d03ec]]~ -(Sender) -(Charset) -(Reference) -(Status)※SSP専用 以上のような括弧を含めた記述がそれぞれヘッダ情報に置換されます。~ ただし、Referenceに関してはこれをそのまま使うより、(R0)(R1)(R2)....という記述での参照を推奨します。~ これは、里々はsaoriからの戻り値に(S○)、ループ関数のカウンタに(C○)、ユーザ関数の引数に(A○)…といった形で似たような記述による参照方法が存在するためです。~ **独自イベント [#w77feaa4] 里々ではゴースト開発を補助する[[独自イベント]]があります。~ これらは里々内部の処理であるため、辞書側で制御できません。~ 例えば、「○△つつかれ」は里々で触り反応を制作しやすくしている機能の一つですが、これはベースウェアから通知される栞イベント「OnMouseDoubleClick」を利用して行われています。~ 従って、「○△つつかれ」「OnMouseDoubleClick」の両方を辞書に定義すると、基本的にOnMouseDoubleClickで定義したものが優先されて、○△つつかれの内容は実行されません。~ 里々の独自イベントにはこうした既存の栞イベントを使って実現しているものとそうでないものがあり、高度な処理を行う場合は優先順位や未定義時の反応などを各自調査する必要が出てきます。~ ところで、独自イベントには書式として学ぶべき点も多くあります。~ 例えば「○△つつかれ」は、OnMouseDoubleClickに以下の定義したものと等価です。~ 該当するラベルのトークがあればそれを呼び出し、なければスルーする仕組みとなります。~ *OnMouseDoubleClick >(R3)(R4)つつかれ **ランダムトーク [#hc8e4d91] [[独自イベント]]には記載されていませんが、これも独自の機能にあたります。~ 里々のランダムトークは、[[特殊変数]]の定義に従って、一定間隔で自動的にラベルのない(*のみの)トークを実行するものだと考えて下さい。~ この機能はOnSecondChange((一秒ごとに通知されるイベント。里々以外の栞ではランダムトークの挙動をここに記述する事が多いです。))で制御する事はできず、[[特殊変数]]によってのみ里々内部のランダムトーク設定で制御します。~ **さくらスクリプトの使用 [#q0d0d6ed] 参考:[[さくらスクリプト>https://ssp.shillest.net/ukadoc/manual/list_sakura_script.html]] 里々は様々な独自仕様と記述方法を持っていますが、さくらスクリプトを使用する事もできます。~ 使用条件や前準備などは必要ありません。~ 但し、選択肢関連のさくらスクリプトとイベントには、独自の[[情報取得変数]]のために改変が施されます。~ *里々の内部処理について [#w90cbf55] [[里々の内部処理]]を参照して下さい。