2. 最小ゴーストの移植

里々で一番シンプルなゴーストを、湊で動かすところまでやってみます。ここで基本の流れと、最初につまずく3か所(config.toml、文字コード、エラーの見え方)を押さえます。

里々でいちばん短い辞書

*OnBoot
:こんにちは。

これを湊で書くと次のようになります。

OnBoot => {
    湊: こんにちは。
}
\0こんにちは。\e

対応関係は次のとおりです。

里々湊
*OnBootOnBoot => { … }
:こんにちは。湊: こんにちは。
行頭の : で話者を交代湊: 助手: とキャラ名を書く

フォルダ構成

ghost/master/
├── shiori.dll      ← 湊 (minato.dll) をこの名前にして置く
├── config.toml     ← キャラクター名の登録など(必須)
└── talks/
    └── main.mnt    ← 台本(必須)

里々からの変更点は次のとおりです。

里々湊
satori.dllshiori.dll(minato.dll をリネーム)
dic*.txt(自動で全部読み込まれる)talks/main.mnt だけ。他のファイルは include "xxx.mnt" で明示的に読み込む
satori_conf.txtconfig.toml(設定の中身は別物)
satori_savedata.txtsave.json(9. セーブデータの移行)
replace.txt / replace_after.txtなし(7. ウェイト)

descript.txt の shiori, の行は shiori,shiori.dll にします。

config.toml: キャラ名は必ず引用符で囲む

[characters]
"湊" = "\\0"
"助手" = "\\1"

キャラクター名は " で囲みます。 囲まないと config.toml の読み込みに失敗し、DLLのロードそのものが失敗します(湊の loadu が 0 を返すので、SSPはSHIORIの読み込み失敗として扱います)。TOMLの仕様で、日本語のキーは引用符が必要なためです。

値の \\0 の \\ は、TOMLの文字列の中で \ 1文字を表す書き方です。結果として、キャラ名 湊 は \0 に対応します。

キャラ名は、台本の 湊: の部分と完全に一致させます。登録していない名前を書いても、エラーにはなりません。 \0 として扱われます。たとえば みなと: こんにちは と書くと、\0こんにちは になります。話者を間違えても気づきにくいので、注意してください。

OnBoot => {
    みなと: 未登録の名前
    助手: 登録した名前
}
\0未登録の名前\1登録した名前\e

文字コードは UTF-8

main.mnt は UTF-8 で保存します。里々の辞書は Shift_JIS が既定なので、そのままコピーすると読み込めません。

Shift_JISのまま置くと、loadu は成功しますが、OnBoot で次のエラーが出ます。

パースエラー:
ファイルが読み込めません: stream did not contain valid UTF-8

BOM(バイトオーダーマーク)付きのUTF-8は使わないでください。 湊はエラーを出さずに、ファイル先頭のトークだけを読み違えます(OnBoot が <BOM>OnBoot という別名になり、呼ばれなくなります)。エディタの保存設定で「UTF-8(BOMなし)」を選んでください。

config.toml のBOMは問題ありません。

詳しくは10. 文字コード・改行・エスケープを参照してください。

話者が複数いるとき

OnBoot => {
    湊: こんにちは。
    今日もよろしくお願いします。
    助手: よろしくお願いします。
}
\0こんにちは。\n今日もよろしくお願いします。\1よろしくお願いします。\e
  • 同じ話者が続く行は、\n(改行)でつながります。里々の「: の行ごとに自動で改行」に近い動きです。ただし、改行が入るのはセリフの行が連続しているときだけです。詳細は10. 改行を参照してください。
  • 話者が変わると \1 などのスコープタグが入ります。里々のように話者が自動で交代することはなく、キャラ名は毎回書きます。

エラーが出たとき

湊は、台本に構文エラーが1つでもあるとゴースト全体が読み込みに失敗します。エラーのある行だけを飛ばして動くことはありません。

OnBoot が呼ばれたときに、エラーの内容が吹き出しに出ます。それ以降のイベントは何も返さなくなります(このとき save.json は上書きされないので、セーブデータは壊れません)。

OnBoot => {
    湊: 閉じ括弧を忘れた

OnClose => {
    湊: またね
}
\b[2]\0パースエラー:\nmain.mntの1行目: 1行目の「{」が閉じられていません\nヒント: 対応する「}」を書いてください\e
(204)

{ の閉じ忘れは、閉じられていない { を開いた行で指摘されます。上の例では、} を忘れた OnBoot の1行目です。 それ以外のエラーで指摘される行は、湊が間違いに気づいた位置です。指摘された行で原因が見つからないときは、その少し前も確認してください。

SSPを起動せずに確認したいときは、湊に付属の構文チェッカー minato_check を使います。

minato_check.exe "ghost/masterのフォルダ"

talks/main.mnt を含むフォルダ(ゴーストの ghost/master)を指定します。

構文エラーだけでなく、未定義の call 先やループ外の break も検出します。

つまずいたときのチェックリスト

  1. 何も喋らない。 config.toml の書式(キャラ名を引用符で囲んだか)、shiori.dll の名前、talks/main.mnt の位置を確認してください。
  2. OnBoot でパースエラーが出る。 上のメッセージに従って直します。エラーが複数あるときは、上から順に直すと効率的です。
  3. 喋るが文字が化ける。 湊の出力は Shift_JIS に変換されます。Shift_JISで表せない文字は化けます(10. 文字コード)。
  4. ある文だけ出ない。 行の内容が変数参照や続き行として読まれている可能性があります(14. FAQ)。

次は3. イベントに進んでください。