コンテンツにスキップ

チュートリアル2: トークを書いてみる

辞書ファイルが入っているフォルダを開く

テンプレートゴーストを立たせている状態で、開発パレットの一番下にある「開く」というボタンをクリックする。そこから「GHOST」を選ぶと、yaya.dll やら何やら色々入ったフォルダが開く。そこにある拡張子が「.dic」のファイルが、YAYA の辞書ファイル。

この辞書ファイルの中に「ゴーストがどうしゃべってどう動くのか」が書いてある。これから、それを少しずつ編集してゴーストを作ってみる。

辞書を覗いてみる

まずはメイン辞書である dic_main.dic をテキストエディタで開く。その 150 行目ぐらいに、次のような記述があるはず。

//起動
OnBoot
{
    "\1\s[10]\0\s[0]こんにちは。\e"
}

ここが「ゴーストが起動したときにしゃべるセリフ」。初めて見ると「こんにちは。」の文字以外は何のことかわからないと思うので、謎の記号を 1 つずつ解明していく。

要素 説明
OnBoot 関数名。この例では「ゴーストが起動したときに呼ばれる」SHIORI Event の名前が入っている。つまり「この後にある { } に入っているものは、ゴーストが起動したときのイベントですよ」という意味。OnClose にすると「ゴーストが終了するときのイベント」という意味に変わる
{ } 関数の中身。関数名を書いた後、この二つの記号でくくって「関数名{関数の中身}」にする
" " トークやさくらスクリプトは必ずこの記号でくくる。" " や ' ' でくくっていない文字列は、トークではなく変数名や関数名だと思われてしまう(" " と ' ' の違い、変数名の意味の説明はあとで)
\0 「これから 0 番のメインキャラ(さくら側とも呼ぶ)がしゃべったり表情を変えたりする」という意味のさくらスクリプト。この後に書いたテキストは 0 番のキャラのバルーンに表示される。\1 の後に書いたテキストは、1 番の相方キャラ(うにゅう側とも呼ぶ)のバルーンに表示される
\s[0] 0 番サーフェスを表示するさくらスクリプト。サーフェスとは立ち絵の種類のこと。\s[1] や \s[2] のように番号を変えて書くと、悲しい顔になったり笑顔になったりする(ただしこのテンプレートのデフォルトシェルは、絵が 0 番と 10 番しか存在しないので、\s[1] や \s[2] と書いても何も変化しない)
\e トークの終了を表すさくらスクリプト。入れなくても特に問題はないようだが、念のためトークの最後に入れておく。ほぼおまじないのような存在

OnBoot のようなイベントの詳細は、CROW・SSPリファレンスを見る。基本的にこのリファレンスに書かれている SHIORI Event は、みんな OnBoot と同じような書き方でできる。

さくらスクリプトについて

さくらスクリプトは YAYA 以外の SHIORI でも共通して使うものなので、このマニュアルではこれ以上詳しく説明しない。これ以外にも色々なものがあるので、リファレンスサイトで「実際に使ってみたいと思っているもの」を少しずつ覚えていくこと(いきなり全部覚えようとすると頭がパンクする)。

開発パレットの「スクリプト入力」からトークを書いて送信すると、さくらスクリプトを書く練習ができる。

スクリプト入力で \0\s[0]やっほー!\e を送信したところ 送信して何も問題なさそうだったら、実際に辞書に書いて、ちゃんと話すかどうか確認してみる(OnBoot イベントにあるトークは、一度ゴーストを終了して、また起動すると確認できる)。

いろんなトークの書き方をしてみる

トークをランダムで選ばれるようにする

起動するたび毎回同じ挨拶ばかりではつまらないので、3 種類に増やしてみる。

OnBoot
{
    "\0\s[0]こんにちはー。\e"
    "\0\s[0]おっすー。\e"
    "\0\s[0]やっほー。\e"
}

YAYA は、{ } の中に " " や ' ' でくくった文字列が複数あると、その中のどれか 1 つだけをランダムで選ぶ。

一行にまとめたくなったら、改行の代わりに ; で区切る。

OnBoot
{
    "\0\s[0]こんにちはー。\e" ; "\0\s[0]おっすー。\e" ; "\0\s[0]やっほー。\e"
}

\0\s[0] や \e を何度も書くのが面倒なら、次のように書ける。

OnBoot
{
    "\0\s[0]"
    --
    "こんにちはー。"
    "おっすー。"
    "やっほー。"
    --
    "\e"
}

-- で区切ると、区切った中からそれぞれ " " や ' ' でくくった文字列が 1 つずつランダムで選ばれ、くっつけて表示される。

これも、; で区切れば一行で書ける(見づらいが)。

OnBoot
{
    "\0\s[0]" ; -- ; "こんにちはー。" ; "おっすー。" ; "やっほー。" ; -- ; "\e"
}

-- を使う書き方

-- は、単独の行に書くか、前後を ; で区切って書く。"こんにちは。" -- "おっすー。" のように ; も改行もなしで並べるとエラーになる。

もう少し例を示す。

OnBoot
{
    "きょうは"  //←<1>この2つのどっちかが選ばれる
    "明日は"    //←<2>
    --
    "晴れ"      //←(1)この4つの中のどれかが選ばれる
    "雨"        //←(2)
    "曇り"      //←(3)
    "雷"        //←(4)
    --
    "です。"    //←1コしかないので必ずコレが選ばれる
}

こう書くと、

  • 「きょうは雨です。」
  • 「明日は曇りです。」
  • 「きょうは晴れです。」
  • 「明日は雷です。」
  • 「明日は晴れです。」

といったトークが毎回ランダムで作られる。トークのバリエーションが広がる。

ただし、これだと本当にランダムなので、同じ単語が連続して選ばれることもある。それを避けたいときは、関数名の後ろに : nonoverlap をつける。同じ文が連続して選ばれなくなる。

OnBoot : nonoverlap
{
    "\0\s[0]"
    --
    "こんにちはー。"
    "おっすー。"
    "やっほー。"
    --
    "\e"
}

上から順番に選ばせたいときは : sequential をつける。詳しくは関数の選択方式を参照。

オリジナル関数を作ってみる

上で書いた、

OnBoot
{
    "\0\s[0]きょうは"
    "\0\s[0]明日は"
    --
    "晴れ"
    "雨"
    "曇り"
    "雷"
    --
    "です。\e"
}

を、次のように書き直せる。

OnBoot
{
    "\0\s[0]きょうは"
    "\0\s[0]明日は"
    --
    天気一覧
    --
    "です。\e"
}

天気一覧
{
    "晴れ"
    "雨"
    "曇り"
    "雷"
}

このように、独立したオリジナル関数を作って、それを呼び出して書くこともできる。こう書くとどんないいことがあるかというと、

OnBoot
{
    "\0\s[0]きょうは"
    "\0\s[0]明日は"
    --
    天気一覧
    --
    "です。\e"
}

OnGhostChanged
{
    "\0\s[0]昨日は"
    --
    天気一覧
    --
    "だったよ。\e"
}

天気一覧
{
    "晴れ"
    "雨"
    "曇り"
    "雷"
}

のように、複数の関数から呼び出せるので使いまわしができる。

OnBoot
{
    "\0\s[0]きょうは%(天気一覧)です。\e"
}

天気一覧
{
    "晴れ"
    "雨"
    "曇り"
    "雷"
}

" " の中身から関数を呼び出したいときは、こうやって %(関数名) と書く(文字列内埋め込み要素の展開)。

オリジナル関数を作るときの注意

関数名(上の例でいうと「天気一覧」の文字)は英語でも日本語でもよいが、次のルールを守る必要がある。

  • 半角数字から始まる関数名はだめ(5test はだめ、test5 や te5st はよい)
  • 頭に _ を付けてはだめ(ローカル変数と間違われる)
  • 空白 ! " # $ % & ( ) * + , - / : ; < = > ? @ [ ] ` { | } のどれかの文字を入れてはだめ
  • など

詳しくは関数のユーザー関数の定義と実行を見る。

辞書を見やすくする

空白や改行を入れてみる

最初に関数名を書く、中身を { } でくくる、という書き方のルールが守られていれば、

OnBoot {
    "\1\s[10]\0\s[0]こんにちは。\e"
}

のように書いても、

OnBoot { "\1\s[10]\0\s[0]こんにちは。\e" }

のように書いても、

OnBoot{"\1\s[10]\0\s[0]こんにちは。\e"}

のように書いてもかまわない。OnBoot と { の間などにある空白・改行は、入れても入れなくてもよい。タブを入れてもよい。自分の見やすい、書きやすい書き方に整えること。

基本的に " " の外にある空白やタブ、改行は無視されるので、次のような書き方でもよい。

OnBoot
    {

        "\1\s[10]\0\s[0]こんにちは。\e"

                            }

要するに、

【ここ】OnBoot【ここ】{【ここ】"\0\s[0]いっちばーん。\e"【ここ】}【ここ】

の【ここ】の所に、空白(半角空白、全角空白、タブ)や改行をいくらでも入れられるということ。YAYA の辞書は、この仕組みを使って、きれいに見やすく整えられる。

コメントアウト

コメントアウトを使うと、その部分だけ辞書として読み込まれなくなる。「メモや注釈を入れたい」「書いた辞書の一部を一時的に隔離しておきたい」ときに便利。やり方は、コメントアウトしたい行の左端に // を入れるだけ。

// 起動イベント
OnBoot
{
    "\0\s[0]こんにちはー。\e"
}

次のような位置にも入れられる。つまり // がついた所から右端までが、すべてコメントアウトになる。

OnBoot
{
    "\0\s[0]こんにちはー。\e"// 起動トーク
}

/* と */ でくくってもコメントアウトになる。複数行を一気にコメントアウトできるので、行数が多いならこちらのほうが楽。どこからどこまでがコメントアウト部分かわかりづらいのが難点。

/*
起動イベント
一番最初に起動したとき呼ばれる
*/
OnBoot
{
    "\0\s[0]こんにちはー。\e"
}

後で辞書を見返したときに、どこが何なのかすぐ思い返せるよう、注釈をたくさん入れておくこと。

やってはいけないこと

次のようなことをすると、エラーが出てゴーストがまったく動かなくなるので注意。

OnBoot
{
    "\0\s[0]改行\n
    します。\e"
}

" " や ' ' でくくっている文字列の途中を改行してしまうと、エラーになる。そのときは、行末に / を入れれば改行できる。

OnBoot
{
    "\0\s[0]改行\n/
    します。\e"
}

また、YAYA Tc535-1 からヒアドキュメントという書き方もできるようになった。

次のように、同じ名前の関数を 2 つ以上書いてもだめ。必ず 1 個だけにすること。

//起動
OnBoot
{
    "\1\s[10]\0\s[0]こんにちは。\e"
}

OnBoot
{
    "\1\s[10]\0\s[0]やっほー!\e"
}

こういったルールをきちんと守れば、どの辞書ファイルのどこに関数を書いても問題ない(ただし、システム辞書の yaya_shiori3.dic に書くのはなるべくやめたほうがよい)。

ゴーストが全然動かない! これってエラー? どうしよう!

落ち着いて、エラーの原因を調べてみる。

自力で調べる

以前まではきちんとゴーストが動いていたのだから、当然エラーの原因はその後に書いた辞書にある。辞書の中の、自分でいじった所をよく見てみる。カッコの閉じ忘れなどが多い。

それでもわからない場合は、あやしげな部分を一時的にコメントアウトして、ゴーストを再起動する。それで正常にゴーストが起動したら、そこが原因。

YAYA用デバッグツールを使う

前回用意した「玉」。詳しくは玉を使った辞書エラーチェックを見る。

実行ログを見る

yaya.dll と同じ階層にある yaya.txt を開く。次のような項目がある。

//log, ayame.log    // ログを指定されたファイルに記録

これを、

log, ayame.log  // ログを指定されたファイルに記録

のように、一番左の // を削って上書き保存する。もう一度ゴーストを起動すると ayame.log が出力されるので、それを見てみる。

スクリプトログを見る

ゴーストにどんなさくらスクリプトが送られているのか知りたいときに有効。使い方は「SSP でゴーストを右クリック → 機能 → スクリプトログ」。

次のステップ

前のステップ