Top/チュートリアル/2.トークを書いてみる
  トップページへ   [ 一覧 | 検索 | 最終更新 ]   [ 差分 | バックアップ ]

*チュートリアル2.トークを書いてみる [#t21435ae]
#contents
**辞書ファイルが入ってるフォルダを開く [#i79d6b47]
テンプレートゴーストを立たせてる状態で、開発パレットの一番下にある「開く」というボタンをクリックしてみてください。~
そこから「GHOST」を選ぶとyaya.dllやら何やら色々入ったフォルダがでてきます。~
そこにある拡張子が「.dic」のファイルがYAYAの辞書ファイルです。~
~
この辞書ファイルの中に「ゴーストがどうしゃべってどう動くのか」が書いてあります。~
これからそれをちょっとづつ編集してゴーストを作ってみます。~
~

**辞書を覗いてみる [#b98a7f96]
まずはメイン辞書である「dic_main.dic」をテキストエディタで開いてみてください。~
~
その150行目ぐらいに~
#code(aya,nonumber,nooutline,nolink){{
//起動
OnBoot
{
	"\1\s[10]\0\s[0]こんにちは。\e"
}
}}
と、いう記述があると思います。~
ここが「ゴーストが起動したときしゃべるセリフ」です。~
~
まぁ初めて見たら「こんにちは。」の文字以外なんじゃこりゃ!だと思うので~
以下、一個づつ謎記号を解明してみます。~
~
:OnBoot|関数名というもの。~
この例では「ゴーストが起動したときに呼ばれる」SHIORI Eventの名前が入ってます。~
つまり「この後にある{ }に入ってるものはゴースト起動した時のイベントだよ~」という意味。~
これを「OnClose」にすると「ゴースト終了する時のイベントだよ~」という意味に変わります。~
~
詳しくは[[CROW・SSPリファレンス>http://crow.aqrs.jp/reference/all/Shiori/index.html]]を見てみてください。~
基本的にこのリファレンスに書かれてるSHIORI EventはみんなこのOnBootと同じようなノリで書けます。~
~
:{ }|関数の中身です。関数名を書いたのあと、この二つの記号でくくって「関数名{関数の中身}」にします。~
~
:" "|トークやさくらスクリプトは必ずこの記号でくくります。~
これや「' '」でくくってない文字列はトークじゃなく変数名や関数名だと思われてしまいます(「" "」と「' '」の違い、変数名の意味の説明はまた後で)~
~
:\0|「これから0番のメインキャラ(さくら側とも呼ぶ)がしゃべったり表情変えたりするぞー」という意味のさくらスクリプト。~
この後に書いたテキストは0番のキャラのバルーンに表示されます。~
\1の後に書いたテキストは1番の相方キャラ(うにゅう側とも呼ぶ)のバルーンに表示されます。~
~
:\s[0]|0番サーフェスを表示するさくらスクリプト。~
サーフェスとは立ち絵の種類のことです。~
\s[1]や\[2]のように番号を変えて書いてみると悲しい顔になったり笑顔になったりします。~
(でもこのテンプレートのデフォルトシェルは残念ながら絵が0番と10番しか存在しないので、\s[1]や\[2]と書いても何も変化しません)~
~
:\e|トークの終了を表すさくらスクリプト。~
入れなくても特に問題はないようですが一応念のためトークの最後に入れておきましょう。ほぼおまじないみたいな存在。~
~

***さくらスクリプトについて [#z2288282]
YAYA以外のSHIORIでも共通して使うものなので、このWikiではこれ以上詳しく説明しません。~
これ以外も色んなものがあるので、リファレンスサイトで「実際に使ってみたいと思ってるもの」を「ちょっとづつ」覚えてみてください。~
(いきなり全部覚えようとすると頭がパンクします…)~
-[[CROWリファレンス - SakuraScript>http://crow.aqrs.jp/reference/crow/SakuraScript/index.html]]~
-[[UKADOC Project さくらスクリプトリスト>http://ukadoc.googlecode.com/svn/trunk/manual/list_sakura_script.html]]~
-[[Disc-2 SakuraScriptリスト>http://disc2.s56.xrea.com/manual/list_sakura_script.htm]](ちょっと情報が古い)~
~
開発パレットの「スクリプト入力」からトークを書いて送信すると、さくらスクリプトを書く練習ができます。~
#ref(img_tutorial_02_001.png)
送信して何も問題なさそうだったら実際に辞書に書いて、ちゃんと話すかどうか確認してみましょう。~
(OnBootイベントにあるトークは一度ゴーストを終了し、また起動すると確認できます)


**色んなトークの書き方をしてみる [#w0bd73ff]

***トークをランダムで選ばれるようにする [#o0366c49]

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

#code(aya,nonumber,nooutline,nolink){{
 OnBoot
 {
     "\0\s[0]こんにちはー。\e"
     "\0\s[0]おっすー。\e"
     "\0\s[0]やっほー。\e"
 }
}}
''YAYAは{ }の中に" "や' 'でくくった文字列が複数あると、その中のどれか一コだけランダムで選ばれます''。~
~
~
一行にまとめたくなったら、改行の代わりに「;」で区切ります。~
#code(aya,nonumber,nooutline,nolink){{
 OnBoot
 {
  "\0\s[0]こんにちはー。\e" ; "\0\s[0]おっすー。\e" ; "\0\s[0]やっほー。\e"
 }
}}
~
~
「\0\s[0]」や「\e」を何度も書くのが面倒?~
それなら…~

#code(aya,nonumber,nooutline,nolink){{
 OnBoot
 {
  "\0\s[0]"
  --
  "こんにちはー。"
  "おっすー。"
  "やっほー。"
  --
  \e
 }
}}
こう書いてしまう事もできます。~
''「--」で区切ると、その区切った中からそれぞれ" "や' 'でくくった文字列がランダムで1コ選ばれ、くっつけて表示されます''。~
~
これもこうすると一行で書けます(みづらいけど)~
#code(aya,nonumber,nooutline,nolink){{
 OnBoot
 {
  "\0\s[0]" ; -- ; "こんにちはー。" ; "おっすー。" ; "やっほー。" ; -- ; "\e"
 }
}}
~
#code(aya,nonumber,nooutline,nolink){{
 OnBoot
 {
  "きょうは"//←<1>この2つのどっちかが選ばれる
  "明日は"//←<2>
  --
  "晴れ"//←(1)この4つの中のどれかが選ばれる
  "雨"//←(2)
  "曇り"//←(3)
  "雷"//←(4)
  --
  "です。"//←1コしかないので必ずコレが選ばれる
 }
}}

こう書くと~
「きょうは雨です。」~
「明日は曇りです。」~
「きょうは晴れです。」~
「明日は雷です。」~
「明日は晴れです。」~
…といったトークが毎回ランダムで作られるわけです。~
トークのバリエーションが広がりますね。~
~
でも、これだと本当にランダムなので同じ単語が連続して選ばれてしまう事もあります。~
それを回避したい時は…~

#code(aya,nonumber,nooutline,nolink){{
 OnBoot : nonoverlap
 {
  "\0\s[0]"
  --
  "こんにちはー。"
  "おっすー。"
  "やっほー。"
  --
  \e
 }
}}
関数名の後ろに「 : nonoverlap」をつけましょう。同じ文が連続して選ばれなくなります。~
上から順番に選ばせたい時は「 : sequential」です。~

***オリジナル関数を作ってみる [#m355f624]

#code(aya,nonumber,nooutline,nolink){{
 OnBoot
 {
  "\0\s[0]きょうは"
  "\0\s[0]明日は"
  --
  "晴れ"
  "雨"
  "曇り"
  "雷"
  --
  "です。\e"
 }
}}

上でも書いたコレを

#code(aya,nonumber,nooutline,nolink){{
 OnBoot
 {
  "\0\s[0]きょうは"
  "\0\s[0]明日は"
  --
  天気一覧
  --
  "です。\e"
 }
 
 天気一覧
 {
  "晴れ"
  "雨"
  "曇り"
  "雷"
 }
}}

こんな風に、独立したオリジナル関数を作ってそれを呼び出して書くことも可能です。~
こう書くとどんなイイ事があるかっていうと…~

#code(aya,nonumber,nooutline,nolink){{
 OnBoot
 {
  "\0\s[0]きょうは"
  "\0\s[0]明日は"
  --
  天気一覧
  --
  "です。\e"
 }

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

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

こんな風に複数の関数から呼び出せるので使いまわしできるってことです。

#code(aya,nonumber,nooutline,nolink){{
 OnBoot
 {
  "\0\s[0]きょうは%(天気一覧)です。\e"
 }
 
 天気一覧
 {
  "晴れ"
  "雨"
  "曇り"
  "雷"
 }
}}

「" "」の中身から関数を呼び出したいときは、こうやって「%(関数名)」と書きます。~

***オリジナル関数を作る時の注意 [#x94ac81c]
関数名(上の例でいうと「天気一覧」の文字)は英語でも日本語でもいいんですが、以下のルールを守る必要があります。~

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

詳しくは[[マニュアル/文法/2.関数>マニュアル/文法/2.関数#f5f27796]]ページを見てください。


**辞書を見やすくする [#y556722b]

***空白や改行を入れてみる [#k8fbc64c]

最初に関数名を書く、中身を「{}」でくくる、という書き方のルールがちゃんと合ってれば~
こんな風に書いても~

#code(aya,nonumber,nooutline,nolink){{
 OnBoot {
 "\1\s[10]\0\s[0]こんにちは。\e"
 }
}}

こんな風に書いちゃっても構いません。

#code(aya,nonumber,nooutline,nolink){{
 OnBoot { "\1\s[10]\0\s[0]こんにちは。\e" }
}}

OnBootと{の間などにある空白・改行は、入れても入れなくても大丈夫。タブをいれてもOK。~
自分の見やすい、書きやすい書き方に整えてみてください。~

#code(aya,nonumber,nooutline,nolink){{
 OnBoot{"\1\s[10]\0\s[0]こんにちは。\e"}
}}

基本的に""の外にある空白やタブ、改行は無視されるので、

#code(aya,nonumber,nooutline,nolink){{
 OnBoot
   {
    
      "\1\s[10]\0\s[0]こんにちは。\e"
  
            }
}}

こんなんでもよし。~
要するに

#code(aya,nonumber,nooutline,nolink){{
 【ここ】OnBoot【ここ】{【ここ】"\0\s[0]いっちばーん。\e"【ここ】}【ここ】
}}

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


***コメントアウト [#lba37c15]

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

#code(aya,nonumber,nooutline,nolink){{
 // 起動イベント
 OnBoot
 {
  "\0\s[0]こんにちはー。\e"
 }
}}

↓こんな位置にも入れられます。~
つまり「//」がついた所から一番右端の部分までが全てコメントアウトになります。

#code(aya,nonumber,nooutline,nolink){{
OnBoot
{
 "\0\s[0]こんにちはー。\e"// 起動トーク
}
}}

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

#code(aya,nonumber,nooutline,nolink){{
 /*
 起動イベント
 一番最初に起動した時呼ばれる
 */
 OnBoot
 {
  "\0\s[0]こんにちはー。\e"
 }
}}

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

***やっちゃいけないこと [#f04bac17]

こんなことやるとエラーが出てゴーストがピクリとも動かなくなるので注意!~

#code(aya,nonumber,nooutline,nolink){{
OnBoot
{
 "\0\s[0]改行\n
 します。\e"
}
}}

" "や' 'でくくってる文字列の途中を改行してしまうとエラー。~
そんなときは~

#code(aya,nonumber,nooutline,nolink){{
 OnBoot
 {
  "\0\s[0]改行\n/
  します。\e"
 }
}}

こうやって行末に「/」を入れれば改行できます。~
それと、YAYA Tc535-1から[[ヒアドキュメント>マニュアル/文法/3.値と変数#t3fceb2b]]という書き方もできるようになりました。~

#code(aya,nonumber,nooutline,nolink){{
//起動
OnBoot
{
	"\1\s[10]\0\s[0]こんにちは。\e"
}

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

同じ名前の関数を2つ以上書いちゃだめです。必ず1個だけ!~
~
こういったルールをちゃんと守れば、どの辞書ファイルのどこに関数を書いても問題ありません。~
(でもシステム辞書のyaya_shiori3.dicに書くのはなるべくやめたほうがいいです)~


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

落ち着いてエラーの原因を調べてみましょう。~

***自力で調べる [#o287ea49]
以前まではきちんとゴーストが動いてた訳で、当然エラーの原因はその後に書いた辞書。~
辞書の中の自分でいじった所を良く見てみる。~
カッコの閉じ忘れなんかが多いです。~
~
それでもわからない場合はあやしげな部分を一時的にコメントアウトしてゴースト再起動。それで正常にゴーストが起動したらビンゴ!

***YAYA用デバッグツールを使う [#xb070ee5]
前回用意したアレ。~
詳しくは[[Tips/玉を使った辞書エラーチェック]]ページを。~

***実行ログを見る [#nc77f863]
yaya.dllと同じ階層にあるyaya.txtを開いてみてください。~
 //log, ayame.log	// ログを指定されたファイルに記録
という項目があるので~
 log, ayame.log	// ログを指定されたファイルに記録
一番左の「//」を削って上書き保存。~
もう一度ゴーストを起動すると「ayame.log」が出力されるので、それを覗いてみましょう。~

***スクリプトログを見る [#of43a515]
ゴーストに一体どんなさくらスクリプトが送られてるのか知りたい時に有効。~
使い方は「SSPでゴーストを右クリック→機能→スクリプトログ」

~
~
-→ 進む(未作成)
-→ [[チュートリアル/3.変数を使ってみよう]]へ進む
-← [[チュートリアル/1.準備]]へ戻る