もう少し踏み込んだ里々の解説です。
里々の仕様書ではないので注意。




里々の特徴

里々とは櫛ケ浜やぎ氏が開発したの一つで、シンプルかつ簡単にゴーストを作れることから、初心者に推奨される筆頭となっています。「簡単に」という売りは伊達ではなく、特筆すべきは

  • さくらスクリプトを使わずともトークの記述ができる
    • 辞書中の改行を自動的に\nに置換してくれる
    • 辞書中の句読点などから自動的にウェイトを追加してくれる
    • 日本語入力モードを「全角」のまま書きまくれる
  • トークに関する強力な機能
    • ランダムトークや撫で反応など、他の栞では別個記述が必要な機能を最初から搭載
    • 重複回避採用条件などによる補助

もちろん、さくらスクリプトを使うこともできますし、半角文字も記号など一部例外を除いて基本的に全て使う事ができます。里々は初心者向けという側面と共に、トークを主体とするゴースト開発に便利な栞なのです。これは他の栞には真似のできない強力な特徴です。
また、里々は一般に複雑な処理には向かないと言われますが、それでもある程度の関数や文字列操作を備えており、また、不得手であるファイル操作や変数管理も他の栞をSAORIとして使用する等でカバーする事が可能です。

開発環境の準備

里々ゴースト開発の常態

従来より、里々は本体と共に「ポストと狛犬」というテンプレートゴーストのパッケージで配布されており、これの改造によってゴースト制作を行うのが一般的でした。
現状では公式の里々の更新は停止し、有志による整備班カスタムを搭載したポストと狛犬がこれを引き継いでいます。
注意点としては、これらの開発は個別の有志の手によるものであり、必ずしもポストと狛犬が最新版の里々を搭載しているとは限りません。
バージョンアップにより新規追加されたssu関数(→外部関数/ssu)など、個別に改修しないと使用できない場合もある事を覚えておいて下さい。

ファイル構成

詳しくはファイル構成のページで解説されていますが、ゴーストとしての側面から見た場合、最低限必要なファイル*1は、里々本体であるsatori.dll、辞書ファイルのdic○○.txt、ライセンス上同梱を義務付けられているsatori_license.txtの3つです。
他のファイルは基本的には指定名称でテキストを用意し任意の記述を配することによって効果を発揮するため、メインとなる辞書構造の補助ファイルと捉えて差し支えありません。
要求頻度の高いものとしては、初期変数の設定と共にsaoriの登録も行うsatori_conf.txt、特定の文字にウェイトを加えたり【タブ】をタブ文字に変換するなど置換機能を設定するreplace.txt/replace_after.txt、基本的な関数を提供する里々標準搭載のsaoriことssu.dllなどが多くのゴーストで常用されており、相対的に必須だと言うことができます。

テキストエディタ

里々ではタブ文字を頻繁に使用します。
これは特定の記号に引数を与えるようなイメージで用いられ、半角スペース及び全角スペースでの代用は基本的にできません。可能ならばタブ文字・半角スペース・全角スペースを全て視覚化できるエディタを選ぶとよいでしょう。
本wikiではタブ文字を【タブ】と表記することで見た目の紛らわしさに対応し、同時にreplace.txtの置換機能の活用も推奨しています。

  • Vector - テキストエディタ
    現在では多くのフリーソフトがスペースなどを視覚化できます。
    近年はフリーの高機能なエディタが大量に公開されているため、操作感で選ぶのが良いでしょう。実際に触ってみて選ぶのがおすすめです。

開発環境

  • さとりすと
    里々の辞書を書くためのアプリケーションです。
    こだわりのテキストエディタがないのであれば、導入を推奨します。

栞としての里々

構造とイベントの流れ

里々に限らずほぼ全てのゴーストに共通します。

伺かベースウェア伺か本体。
materia、SSP、CROWなど。現行の主流ベースウェアはSSP。
プラグイン本体にインストールするプラグイン。
ゴースト辞書データと立ち絵から成るキャラクターデータ。
ghost辞書。文書や定義データ。
shiori栞。ベースウェアと辞書を繋ぐdll。
里々、YAYA、華和梨などがある。
saoriゴーストに機能を追加するプラグイン。
shell立ち絵。画像や当たり判定などの定義データ。
バルーンballoon台詞表示用ふきだしのデータ。

イベントの流れのおおざっぱな簡易図。

kanikaisetsu.jpg

リクエストに対するレスポンスの記述

里々では特殊記号一覧にある*、@によってベースウェアのリクエストに対応します。
以下は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ヘッダの取得方法

前述したイベントのReference等を参照する方法です。参考→情報取得変数のシステム情報

  • (Sender)
  • (Charset)
  • (Reference)
  • (Status)※SSP専用

以上のような括弧を含めた記述がそれぞれヘッダ情報に置換されます。
ただし、Referenceに関してはこれをそのまま使うより、(R0)(R1)(R2)....という記述での参照を推奨します。
これは、里々はsaoriからの戻り値に(S○)、ループ関数のカウンタに(C○)、ユーザ関数の引数に(A○)…といった形で似たような記述による参照方法が存在するためです。

独自イベント

里々ではゴースト開発を補助する独自イベントがあります。
これらは里々内部の処理であるため、辞書側で制御できません。
例えば、「○△つつかれ」は里々で触り反応を制作しやすくしている機能の一つですが、これはベースウェアから通知される栞イベント「OnMouseDoubleClick」を利用して行われています。
従って、「○△つつかれ」「OnMouseDoubleClick」の両方を辞書に定義すると、基本的にOnMouseDoubleClickで定義したものが優先されて、○△つつかれの内容は実行されません。
里々の独自イベントにはこうした既存の栞イベントを使って実現しているものとそうでないものがあり、高度な処理を行う場合は優先順位や未定義時の反応などを各自調査する必要が出てきます。

ところで、独自イベントには書式として学ぶべき点も多くあります。
例えば「○△つつかれ」は、OnMouseDoubleClickに以下の定義したものと等価です。
該当するラベルのトークがあればそれを呼び出し、なければスルーする仕組みとなります。

*OnMouseDoubleClick
>(R3)(R4)つつかれ

ランダムトーク

独自イベントには記載されていませんが、これも独自の機能にあたります。
里々のランダムトークは、特殊変数の定義に従って、一定間隔で自動的にラベルのない(*のみの)トークを実行するものだと考えて下さい。
この機能はOnSecondChange*2で制御する事はできず、特殊変数によってのみ里々内部のランダムトーク設定で制御します。

記号の補足

詳しくは特殊記号一覧を参照して下さい。

    • この記号以下、複数行に渡って定義を記述できます。
    • トーク定義中の通常改行は自動的に\nに置換されます。ただし$や>など、行頭で宣言し一行占有する場合はこの限りではありません。
    • 同じラベルのついたものは呼び出される時に一つ一つが候補となり、ランダムで選択されます。ランダムの性質方法なども設定によって変更可。
    • ラベルを記述しない場合、ランダムトークの候補として定義されます。
    • この記号以下、一行ずつ定義を記述できます。性質上、改行は反映されません。
    • 複数行に渡って定義することで一行ずつランダムの候補となりますが、*と同様、同じラベルのついたものもランダム候補になります。

上記2種は定義の開始点を宣言するものであり、またその他の記号は全て*定義の中で使用します(単体で使用することはできず、また使おうとしても定義の終点が伸びるだけです)。辞書ファイル内において最初に*または@が来るまでの行は無視されます。

    • あらゆる変数の定義および設定の変更まで、$を行頭に記述し、一行占有して定義します。これに限らず、行頭に記述する記号はすべて*セクション内でのみ用いる記号となります。
    • 定義された変数は例外を除きその全てがセーブデータに自動的に保存されます。処理中において自動的に破棄される一時変数などは存在しないため、できるだけ明示的に変数の削除を行う必要があります。
    • 格納された変数はトークと似た扱いになり、()などによって参照できます。
  • ()
    • 括弧で括った文字列と同じラベルのついた*または@があればそれを呼び出します。
    • 括弧で括った文字列と同じ名前の変数があればその内容に置換します。
    • 括弧で括った文字列が数値であれば対応した\s[n]に置換します。
    • 括弧で括った文字列が関数であれば、関数として処理されます。この時、(関数名、引数、引数....)と記述して引数を与えることができます。区切りに使われる文字は設定により変更が可能です。
    • 何も文字列を括らず、()とだけ記述した場合はランダムトークを参照します。
    • 上記のいずれも満たさなかった場合、置換されずに文字列として出力されます。空文字になるわけではない事に注意して下さい。
    • 指定ラベルのトークを呼び出します。$と同様に一行占有して定義します。
    • 一行ごとに判定され、「条件が合致した」又は「条件が設定されていない」なら指定されたラベルのトークを呼び出して、行以降の処理をストップします(ジャンプと呼ばれる所以です)。
    • 指定ラベルのトークの有無をも確認するため、条件式だけでなくラベル名のトーク自体が存在しない場合も「偽」と判断し、次の行の処理を続行します。
    • トークを呼び出す性質は()と似ていますが、@へはジャンプできないこと、条件を指定できること、合致しない場合に文字列として出力しないこと、などを考慮して使い分けます。

さくらスクリプトの使用

参考:さくらスクリプト 里々は様々な独自仕様と記述方法を持っていますが、さくらスクリプトを使用する事もできます。
使用条件や前準備などは必要ありません。
但し、選択肢関連のさくらスクリプトとイベントには、独自の情報取得変数のために改変が施されます。

里々の内部処理

ここでは、里々がdll内部で行っている処理のうち、注意を要する場合があるものを取り上げています。
こうした処理は本来里々利用者の便宜を計るために行われているものですが、状況によっては思わぬ弊害となります。
また他のSHIORIの経験があるとかえってつまずきやすい部分でもあります。
里々を使っていて奇妙な不具合に遭遇した場合には、思い出してみてください。

前提:里々とさくらスクリプト

本題の前に、里々利用者が見落としがちな基本的な原理について強調しておきます。 里々ではさくらスクリプトも使用できる事は前述した通りですが、捉え方としては「里々で作成したトークは自動的にさくらスクリプト主体の(ベースウェアが使用できる形式の)トークへと変換される」とした方が正確です。 以降、辞書のトークは自動的にさくらスクリプトに変換される事を念頭に置いてお読みください。

里々の選択肢処理

下例は、あるトークと、それを里々が自動的に変換した結果のさくらスクリプトです*3

*
:(7)じゃんけんするよー!
:いくでー。(11)最初は……
_グー
_パー【タブ】アンブッシュ
\1\n[half]\0\_w[6]\s[7]じゃんけんするよー!\n\n[half]\1\_w[66]いくでー。\_w[30]\s[11]最初は
……\n\q[グー,グーグー1]\n\q[パー,アンブッシュパー2]\e

選択肢である \q[グー,グーグー1] と、 \q[パー,アンブッシュパー2] に注目して下さい。
明らかに記述した覚えの無い単語が、\qタグ内に勝手に記述されています。
これはどういう事でしょうか。


実は、里々は選択肢に関連した情報取得変数を実装するために、選択肢について他の栞にはない独特な処理を行っています。
まず、里々の選択肢の記法は、以下のようなさくらスクリプトで変換・実現しています。

_選択ラベル【タブ】選択ID
\q[選択ラベル,選択ID]

ここまでは基本的なさくらスクリプトですが、里々はさらに続く処理で、その\q[選択ラベル,選択ID]を含めた、トーク中の全ての\q[ラベル,ID]を、次のような独特な形式へと置換します(ベースウェア側でスクリプトログを確認してみて下さい*4)。

\q[選択ラベル,選択ID(バイト値、1)選択ラベル(バイト値、1)選択番号]

結果、選択肢が選ばれ、OnChoiceSelectイベントがベースウェアから通知されると、このreference0には
選択ID 選択ラベル 選択番号
が返却される事になります(半角スペースは1バイト文字)。
里々はこれをユーザーの目に触れる前に内部で分割し、それぞれの部分を選択肢に関連した情報取得変数にセットしてから、(R0)に改めてIDのみセットし直すといった手順を取ります。こうして里々の情報取得変数の(選択ID)(選択ラベル)(選択番号)が利用可能になっているというわけです。
※OnChoiceEnterでも選択IDの再変換が行われるようです。

留意すべき点

しかしながら、上記の選択肢の仕様はさくらスクリプト構成のトークとしては特殊な使い方です。選択肢が記述者の思いがけない変形を受けていることが、思わぬトラブルの種になる場合もあるのです。

例えば、スクリプトログで確認できるように、MAKOTOやreplace_after.txt、OnTranslateで処理するトークの状態は
上記の変形を受けた段階のものという事になります。
OnTranslateを活用するケースでは、このイベントの性質からトーク全文を引数とする事が大半ですから、この時、関数の引数の区切り字に「バイト値1」を使用していた場合、引数の指定位置が狂ってしまい、思わぬ引数エラーが発生する可能性があるという事です。

SSPがいくつか独自に実装している、選択肢関係のSHIORI Eventにも注意が必要です。
例えば、SSPはOnChoiceSelectと同時にOnChoiceSelectExというイベントも通知します。
しかし、里々の上記処理はこれらSSP独自のイベントには対応していません。
従って、上記の戻し処理が行われないので、ID部分には上記のバイト値1区切りの文字列がそのまま入ってしまいます。

  • \q → OnChoiceSelect
    加工処理が行われ、正しく分割される
  • \q → OnChoiceSelectEx
    加工処理が行われるが、分割されないので本来IDが入っているはずの(R1)がひどい事に

結論として、里々では\q選択肢タグでOnChoiceSelectExイベントを利用しない方が無難です。
(この動作仕様が把握できれば、処理を組んで稼動させる事はもちろん可能です)
ちなみに、SSPでは選択肢系のさくらスクリプトとして、

\__q[選択ID]選択ラベル\__q

というタグも用意されていますが、こちらは選択IDが未加工である代わりに選択肢関係の情報取得変数も更新されません。

OnUpdateReadyのファイル数

SHIORI Event(参照:構造とイベントの流れのReference(イベントの関連情報)は、里々では情報取得変数の(R*)で取得出来ます。

どのイベントでどのようなReferenceが取得できるかは、通常SSPの公式リファレンスでもあるUKADOCなどで確認する事ができます。

ただしネットワーク更新において更新すべきファイルが見つかった場合に発生するイベント「OnUpdateReady」で(R0)を使う場合には少し注意が必要です。

UKADOCにもあるように、OnUpdateReadyのReference0には本来「更新を行うファイルの総数から1引かれたもの」が入っています。つまりreference0が「0」のとき、更新のあったファイル数は1個である事を意味します。

しかし里々の(R0)ではこの値は補正され、更新を行うファイル数が1個の場合には(R0)にも1が入っています。

これは例えば

*OnUpdateReady
:ネットワーク更新を開始するよ。
:ファイルは全部で(R0)個あるみたいや。

といったトークを書く場合に(R0)を素直な序数として扱うのに役立ちます。

しかし一方で、同様に更新ファイル総数や現在更新中のファイルの番号をReferenceにもつOnUpdate.OnDownloadBeginなどでは、この補正がされない事に注意する必要があります。
もし

#思ったように動かない例
*OnUpdate.OnDownloadBegin
:今(R1)個目のファイルをダウンロード中だよ〜。

などといったトークを実現したい場合は、ssu.dllの関数calcなどを用いて

#思ったように動く例
*OnUpdate.OnDownloadBegin
:今(calc,(R1)+1)個目のファイルをダウンロード中だよ〜。

のようにする必要があります。


*1 伺かベースウェア仕様の必須ファイルを除く
*2 一秒ごとに通知されるイベント。里々以外の栞ではランダムトークの挙動をここに記述する事が多いです。
*3 この例では見やすいように改行していますが、実際には変換後は一行です。また、里々の特殊変数等の設定で、ウェイトコマンドや改行コマンドが変化します。
*4 SSPではCtrl+Lで開けます。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-03 (土) 15:22:30 (20d)