https://emily.shillest.net/ayaya/index.php?StartUp/里々からの移行
主に里々しかSHIORIを使った事が無いけどYAYAも使ってみたい!という人向けの説明文です。
プログラミング的な事をするのに強いので、ゴーストのトーク以外の部分がごちゃごちゃしてきて書くのが面倒な場合楽になります。
でもそれは特にYAYAだけに限った特性ではなく、華和梨という選択肢もあります。
更新が停止していても良いならそれ以外のSHIORIも選択肢に入ります(ただし、それらはもし不具合が発見されても修正は望めません)
SHIORIの特性を把握し、自分で使いやすそうなSHIORIを選ぶのが良いでしょう。
「文系で今まで里々しか使ってなかったけどYAYAが肌に合ってて使いやすかった」と言っていた人も何人かいます。
つまりYAYAが向いてるかどうかは理系かどうかは関係なく、その人との相性によります。本人が実際使ってみないとなんとも言えません。
少なくともこれ書いてる人はプログラミングもC言語もやった事ないです。
どんなゴーストを作るかによります。
トーク中心のシンプルなゴーストなら里々のほうが楽ですが、複雑な動作をするゴーストの場合むしろ里々のほうがYAYAより難解なSHIORIになることもあります。
特にループや配列を多用しまくる場合、里々だと記述するのが辛くなる可能性が高いです。
特に重いという話は聞きません。少なくとも里々よりは軽いです。
もしシンプルなYAYA製ゴーストなのに重いと感じたら、「実行ログ出力設定」や「インストール済みゴーストリスト取得の制限なし取得」をオンにしている可能性が高いです。
参考になるかもしれないサイト。
他のSHIORIでもSAORIを使えばできます。
例えば、YAYA as SAORIでYAYAをSAORIとして使うとYAYAと同じようにファイル操作や正規表現ができます。
つまりそれだけを目当てにしてYAYAを選択する必要はありません。
上で書いたように大体の事は里々でもSAORIを使ったり記述を工夫したりする事により実現可能です。
ただし辞書が記述しやすいか、記述がどれだけ長くなるか、記述した辞書が後から見やすいかどうか等の違いは出てきます。
以下、「はろーYAYAわーるど(紺野ややめ)」や「SimpleYAYAテンプレート」以外のテンプレートでは通用しないかもしれません(特にタイトルに「☆」がついている項目)
起動イベントで例を出してみます。
*OnBoot :いっちばーん。
里々ではこう書いていました。
YAYAでは以下のように書きます。
OnBoot { "\0\s[0]いっちばーん。\e" }
なんかよくわからない記号が色々ありますが、一つづつ見ていきましょう。
ちなみに里々と違い自動でウェイトはつきません。入れたい場合はさくらスクリプトで入れてください。
さくらスクリプトはYAYA以外のSHIORIでも共通して使うものなので、このWikiでは詳しく説明しません。
これ以外も色々あるのでリファレンスサイトで、「実際に使ってみたいもの」を「ちょっとづつだけ」で良いのでYAYAといっしょに覚えてみてください。
(いきなり全部覚えようとすると頭がパンクします…)
最初にイベント名を書く、中身を「{}」でくくるなどの書き方のルールがちゃんと合ってればこんな風に書いても
OnBoot { "\0\s[0]いっちばーん。\e" }
こんな風に書いちゃっても構いません。
OnBoot { "\0\s[0]いっちばーん。\e" }
OnBootと{の間などにある空白・改行は、入れても入れなくても大丈夫。タブをいれてもOK。
自分の見やすい、書きやすい書き方を選んでください。
OnBoot{"\0\s[0]いっちばーん。\e"}
基本的に""の外にある空白やタブ、改行は無視されるので、
OnBoot { "\0\s[0]いっちばーん。\e" }
こんなんでもよし。
要するに
【ここ】OnBoot【ここ】{【ここ】"\0\s[0]いっちばーん。\e"【ここ】}【ここ】
上の【ここ】の所に空白(半角空白、全角空白、タブ)や改行をいくらでも入れられるっていう訳です。
YAYAはこの仕組みを使って辞書を自由に整える事ができます。
これが里々より辞書の見通しが良いと言われる理由の一つです。
*OnBoot :改行 します。
里々では辞書の中の改行がそのままトークの改行になりましたが、YAYAではさくらスクリプトを使って改行しないとバルーンに表示された時改行になりません。
改行したい部分に「\n」をいれてください。
OnBoot { "\0\s[0]改行\nします。\e" }
「これじゃあ辞書の中で改行になってなくてわかりづらい!」…と思う方は
OnBoot { "\0\s[0]改行\n/ します。\e" }
こうやって行末に「/」を入れれば改行できます。
好きな位置に入れてつかいましょう。
OnBoot { "\0\s[0]/ 改行\n/ します。/ \e" }
OnBoot { "\0\s[0]改行\n します。\e" }
" "や' 'でくくってあるところを末尾に「/」を入れないで改行してしまうとエラーになってしまうので気を付けてください。
里々では同じイベントをたくさん書くとその中からランダムで選ばれました。
*OnBoot :こんにちはー。 *OnBoot :おっすー。 *OnBoot :やっほー。
が、YAYAでこれをやるとエラーが出て起動しなくなります。
YAYAは同じイベント名のイベントを二つ以上書けません。
代わりにこんな風に、{ }の中で" "を改行区切りで並べましょう。
OnBoot { "\0\s[0]こんにちはー。\e" "\0\s[0]おっすー。\e" "\0\s[0]やっほー。\e" }
YAYAは{ }の中に" "や' 'でくくった文字列が複数あると、その中のどれか一コだけランダムで選びます。
改行の代わりに「;」区切りにすると一行にまとめることもできます。
OnBoot { "\0\s[0]こんにちはー。\e" ; "\0\s[0]おっすー。\e" ; "\0\s[0]やっほー。\e" }
\0\s[0]や\eを何度も書くのが面倒という人は
OnBoot { "\0\s[0]" -- "こんにちはー。" "おっすー。" "やっほー。" -- \e }
こう書いてしまう事もできます。
「--」で区切ると、その区切った中からそれぞれ" "や' 'でくくった文字列がランダムで1コ選ばれ、くっつけて表示されます。
ちょっとわかりづらいので例を出して説明。
てんき { "きょうは"//←<1>この2つのどっちかが選ばれる "明日は"//←<2> -- "晴れ"//←(1)この4つの中のどれかが選ばれる "雨"//←(2) "曇り"//←(3) "雷"//←(4) -- "です。"//←1コしかないので必ずコレが選ばれる }
こう書くと
「きょうは雨です。」
「明日は曇りです。」
「きょうは晴れです。」
「明日は雷です。」
「明日は晴れです。」
…といった文章が呼び出すたびランダムで作られるわけです。
ランダムなので同じ単語が連続して選ばれる事もあります。
ここで「あれ?里々みたいに重複回避ってできないの?」と疑問にお思いの方も出てくるかもしれませんが、できます。
OnBoot : nonoverlap { "\0\s[0]" -- "こんにちはー。" "おっすー。" "やっほー。" -- \e }
イベント名の後ろに「 : nonoverlap」をつけてください。同じ文が連続して選ばれなくなります。
上から順番に選ばせたい時は「 : sequential」です。
ちなみに、里々ではこんな風に書くことにより別な場所に書いてある単語群をトークに呼び出す事ができますが
* :(季節)はいいね~ :どの季節でも言ってるジャン
@季節 春 夏 秋 冬
同じ事をYAYAでやるとこんな感じです。
Talk { "\0\s[0]%(季節)はいいね~\w9\1\s[10]どの季節でも言ってるジャン\e" } 季節 { "春" "夏" "秋" "冬" }
トーク中で%(季節)または%季節と書くと、「季節」という名前の関数を呼び出すことができます。
里々だと単語のひとまとまりは「@季節」、改行が入るような文章は「*季節」と書くルールがありましたが
YAYAは単語と文章を区別しないので単語でも文章でも「季節{ }」です。
OnBootなどのSHIORIイベントも単語群もどちらも「関数」として書くので書き方も全く同じ。
もちろん上で書いた天気トークみたいに
Talk { "\0\s[0]" -- "春" "夏" "秋" "冬" -- "はいいね~\w9\1\s[10]どの季節でも言ってるジャン\e" }
こう書いてもよいです。
別なトークでも「季節」の単語群を使いたかったら最初に書いた方式の方が良いですね。
里々でもおなじみ変数。ユーザー名や起動回数・起動時間・好感度で使う人が多かったかも。
里々では1種類の変数しかありませんでしたが、YAYAはいろいろとあります。
まずはそのへんの説明。
YAYAの変数は文字列と数値の二種類があります。(正確には整数、実数、文字列の3種類)
変数 = 1
こう代入すると変数の中身は数値の「1」
変数 = "1"
こうやって" "か' 'でくくって代入すると変数の中身は文字列の「1」となります。
里々と違い全角の「1」「2」「3」…は数値になることはできません。文字列扱いです。
文字列変数だと数値として比較や計算ができません。
例えば数字の数値「1」と「2」で足し算すると結果は「3」になりますが、文字列の「1」と「2」を足すと1と2がくっついて「12」になってしまいます。
他にも色々違いがありますので注意してください。
ちなみに変数はいつでも好きな時に文字列←→数値に変更できるので安心。
用途によって変更してください。
変数 = TOSTR(変数)
変数 = TOINT(変数)
自動的に整数、実数、文字列どれなのか判断して変換してくれるManual/Function/TOAUTOなんてのもあります。
_変数名
名前の頭に「_」をつけるとローカル変数
変数名
つけないとグローバル変数になります。
おおざっぱに言うと「一時的に使うものですぐ消えてしまう」のがローカル変数、「削除しない限りずっと残る」のがグローバル変数です。
里々の変数は全部グローバル変数ですね。
YAYAではユーザー名や好感度などずっと残しておかないといけない変数以外はローカル変数を使うのをお勧めします。
で、ローカル変数がどれぐらいの期間使えるのかというと、
「現在の{ }内、およびそれより深い入れ子階層のみで使用できる。寿命は該当する{ }を抜けるところまで。」
です。(マニュアルより引用)
言葉では説明しづらいので一例をだしてみると
ローカル変数テスト { { _変数 = 1 } 結果 = _変数 }
こう書くと「_変数」が深い階層から浅い階層に移った時に消えてしまうので「結果」の中身も空になってしまいますが
ローカル変数テスト { _変数 = "" { _変数 = 1 } 結果 = _変数 }
こうすれば「_変数」は浅い階層→深い階層→浅い階層…と、最初に浅い階層にいた経験があるので深い階層から浅い階層に移動しても消えずに残り、「結果」の中身は1です。
最初に「_変数」が生まれたところが「結果=_変数」と同じ(またはもっと浅い)階層かどうかがポイント。
つまりローカル変数を長生きさせたい時は最初に一番浅い階層で「_○○=""」などの一行を書いておけばOK。
プレゼントをあげてフラグを立てた例。
プレゼントフラグを数値の1にします。
*プレゼントした $プレゼントフラグ=1 :わーいありがとう!
プレゼントした { プレゼントフラグ = 1 "\0\s[0]わーいありがとう!\e" }
里々との違いは
【ここ】プレゼントフラグ【ここ】=【ここ】1【ここ】
【ここ】の部分には空白やタブを入れても構いません。
見やすくするため演算記号の右と左に半角空白を入れる人が多いようです。
文字列を代入する場合はこんなかんじ。
「プレゼント」という変数に「花束」という文字を入れます。
*プレゼントした $プレゼント【タブ】花束 :わーいありがとう!
プレゼントした { プレゼント = "花束" "\0\s[0]わーいありがとう!\e" }
数値じゃない時は必ず" "か' 'でくくりましょう。
トークを書くときと同じですね。
里々みたいに「プレゼント【タブ】"花束"」とは書けません。必ず「=」で代入します。
プレゼントした { プレゼント = 花束 "\0\s[0]わーいありがとう!\e" }
うっかりこう書いてしまうと「プレゼント」の中身はからっぽになってしまいます。
なぜかというと、YAYAでは「"花束"」ではなく「花束」だけだと「『花束』という名前の変数」になってしまうからです。
そのため「『プレゼント』という変数に『花束』という変数の中身を入れましたよ~」、という意味に誤解され、
「花束」という変数は存在してないため中身は空っぽになってしまう、という訳です。
里々でいうとこんな風に書いちゃった、ということです。
*プレゼントした $プレゼント【タブ】(花束) :わーいありがとう!
このへん里々とは逆なので最初はちょっと混乱するかも。
*好感度アップ $好感度=(好感度)+1 :ユーザーさんだいすき!
プレゼントした { 好感度=好感度+1 "\0\s[0]ユーザーさんだいすき!\e" }
こっちもシンプル。
里々だと「好感度=(好感度)+1」のように右側の変数は()つきで書く必要がありましたが、YAYAは何もつけなくてOK。
これは前述したように" "や' 'でくくってない文字列は変数、関数名(半角数字だけの場合は数値)として見られるからです。
ちなみにYAYAはこう省略して書く事もできます。
プレゼントした { 好感度++ "\0\s[0]ユーザーさんだいすき!\e" }
「好感度++」は「好感度を1増やしますよ」という意味で「好感度=好感度+1」と意味は同じです。
「好感度--(半角マイナス2コ)」だと1減ります。
「好感度+=2」だと「好感度=好感度+2」と同じ、「好感度-=2」は「好感度=好感度-2」と同じです。
そのほかYAYAで使える計算用の記号の説明はこのあたりに書いてあります。(専門用語多くてちょっとわかりにくいですが)
里々と同じく、文字同士の足し算もできます。
プレゼント = "花" + "束"
と書くと変数「プレゼント」の中身は「"花束"」となります。
変数はもちろんトーク中でも使えます。
プレゼントした { プレゼント="花束" "\0\s[0]わーい\w6%(プレゼント)だー!\w9\w9ありがとう!\e" }
バルーンに「わーい花束だー!ありがとう!」と表示されます。
書き方は上で説明した単語群をトークに使う時と全く同じですね。
このあたりは里々もYAYAも変わりません。
変数がちゃんと保存されているかどうか確認したい時はゴーストを終了してセーブデータファイル(yaya_variable.cfg)をテキストエディタで開いてみてください。
上の例だったら
プレゼント,"花束",,
という一行があれば、保存成功です!
ちなみに数値型の変数の場合は
プレゼント,1,,
こんな風に変数の中身の数字が" "で囲まれてません。
つつかれ反応での例。
OnMouseDoubleClickイベントは、0番キャラ(さくら側)がつつかれるとReference3の中に「0」が入るという仕様。
そんな訳でReference3に0が入ってるのを確認したら「0番つつかれ反応」に飛ばす辞書を書いてみますね。
*OnMouseDoubleClick >0番さんがつつかれた【タブ】(R3)==0 *0番さんがつつかれた :(7)つつくなっ!
OnMouseDoubleClick { if reference[3] == 0 { 0番さんがつつかれた } } 0番さんがつつかれた { "\0\s[7]つつくなっ!\e" }
ここで新登場な「if」。
「if」はその後にある条件式(ここでは「reference[3] == 0」)が正しければ次の「{ }」の中身を実行するよ~、という意味。
OnMouseDoubleClick { if reference[3] == 0 { "\0\s[7]つつくなっ!\e" } }
もちろんこれもこんな風に「{ }」の中に直接トークを書くことも可能。
必要に応じて記述法を変えてください。
「if」とあわせて「else」を使うとこんなこともできます。
OnMouseDoubleClick { if reference[3] == 0 { "\0\s[7]つつくなっ!\e" } else { "\0\s[7]あたし以外の子もつつくなっ!\e" } }
「if 条件式 { }」にひっかからなかったらその次にある「else { }」の中身を実行。
この例だと0番以外のキャラがつつかれたら全部「else { }」の中身を実行。
「else」は「if」の後専用で、「else」単体で書いてもエラーになるので注意。
0番キャラの「頭が」つつかれた時だけトークさせたい!って時はこう。
OnMouseDoubleClick { if reference[3] == 0 && reference[3] == "Head" { "\0\s[7]頭を叩くなっ!\e" } }
二つ以上条件式を並べられます。
半角か全角かの違いだけで、「==」と「&&」の記号の使い方は里々と全く同じですね。
「if」と「reference[3] == 0」の間に空白かタブを入れるのを忘れずに。
ん?あれ?
でも里々でつつき反応って…
*0Headつつかれ :(7)頭を叩くなっ! *1つつかれ やめれ!
こうやって書いてたよね?
YAYAじゃ似たようなことできんの??
…と、言うあなたのためにこちらの記述法。
OnMouseDoubleClick { EVAL( "%(reference[3])%(reference[4])つつかれ" ) } 0Headつつかれ { "\0\s[7]頭を叩くなっ!\e" } 1つつかれ { "\1\s[10]やめれ!\e" }
普通なら "%(reference[3])%(reference[4])つつかれ" だけ書くと、0番の頭がつつかれた時「0Headつつかれ」としゃべるゴーストのトークになります。
それを「EVAL ( )」で包み込むと、なんと!「0Headつつかれ」が関数名になっちゃいます!
このEVALはこういった「いきなり独立した関数を書ける分岐」以外でも色んな場面で役立つ便利な関数です。
詳しくはManual/Function/EVALのページをどうぞ。
全て半角です。
R0 R1 R2 ...
reference[0] reference[1] reference[2] ...
古いテンプレートではreference0 reference1 reference2 ..~でした。 (新しいテンプレートでも設定次第でこう書けます)
S0 S1 S2 ...
valueex0 valueex1 valueex2 ...
SAORIの使い方はこのページの「SAORI」項目を参照。
A0 A1 A2 ...
_argv[0] _argv[1] _argv[2] ...
頭に「_」が付いてるのでわかる通り、ローカル変数です。
「条件分岐」「比較」と「計算」はまた違った方法でやりますが、
それ以外はほぼYAYAのシステム関数で同じ事ができます。
Manual/List of functions by purposeを覗いてみてください。
「これじゃ使いたいの見つけにくい!」って人にはYAYAシステム関数リファレンスなんかもあります。
(mciaudio,load,鳥の詩.mp3)(mciaudio,play)
FUNCTIONEX( 'mciaudio.dll' , 'load' , '鳥の詩.mp3' ) FUNCTIONEX( 'mciaudio.dll' , 'play' )
里々みたいに使うSAORIを事前に設定しておく必要はありません。
直接yaya.dllから見たSAORIの相対パスを指定します。
ちなみに「mciaudio.dll」と「鳥の詩.mp3」が「yaya.dll」と同じディレクトリにあるのではなく、そのひとつ下の「saori」ディレクトリにある場合
FUNCTIONEX( 'saori\mciaudio.dll' , 'load' , '鳥の詩.mp3' )
こう書きます。
SAORI( 'mciaudio.dll' , 'load' , '鳥の詩.mp3' ) SAORI( 'mciaudio.dll' , 'play' )
「FUNCTIONEX」ではなく「SAORI」でもOK。
どっちで書いても構わないのなら「FUNCTIONEX」で書きましょう。
SAORI実行関数を使うとそのまま返ってきます。
返り値をバルーンにそのまま表示するのならこうやってトーク中に埋めこんで使ってもいいですし
(ただしSAORI実行関数の引数を" "ではなく' 'で囲まなければいけないので注意。" "の中に" "は書けないからです)
"\0\s[0]クリップボードにある文字を取り出します。\n「%(FUNCTIONEX( 'saori\textcopy.dll' , 'コピーする文字' ))」\e"
一旦変数に保存して使ってもよいです。
変数 = FUNCTIONEX( 'saori\textpaste.dll' )
Resultがそのままバルーンに表示されると困る時も適当なローカル変数に代入しておきます。
上でも書きましたが里々で「S0 S1 S2 ..」と書いていたものは「valueex0 valueex1 valueex2 ...」と書きます。
詳しくはこのページを見てください。
System dictionary/yaya_shiori3.dic - Time variablesを参照。
メモリ量、センダーヘッダの変数もここで見れます。
時間をおしえる { "\0\s[0]ただいま%(hour)時%(minute)分%(second)秒で~す。\e" }
「里々みたいに日本語で書けないとやだー」って人はテンプレートを参考にして自分で書いてしまうのもアリです。
年 { GETTIME[0] } 月 { GETTIME[1] } 日 { GETTIME[2] } 分 { GETTIME[5] } 秒 { GETTIME[6] } 時間をおしえる { "\0\s[0]ただいま%(時)時%(分)分%(秒)秒で~す。\e" }
曜日を漢字表記にする方法はこちら。(SimpleYAYAテンプレートには掲載済み)
#defineで同じ事が出来ますが、SHIORIで計算等が実行される前の「辞書に書かれてる文字列そのまま全部」を変換してしまう強力なものなので、重要な文字列まで変換してしまう等の失敗をしないよう注意。
詳しい使い方はTips/Write functions, variables, and SakuraScripts in shortened formページを参照。
例えばこんな記述をしておくと、
#define @r reference
今まで「reference[0]」と書いてた所を「@r[0]」と短縮して書けるように。
OnTranslateかOnTranslateInternalイベントでできます。
自動ウェイトなどに使うのならOnTranslateInternalの方をおすすめ。
(OnTranslateだと、例えばヘッドラインの中身まで変換されてしまいます)
トークに自動でウェイトをつける例
OnTranslateInternal { _text = _argv[0] _text = REPLACE(_text, "…", "…\w3") _text = REPLACE(_text, "、", "、\w5") _text = REPLACE(_text, "。", "。\w9") _text }
里々と同様、YAYAでもそのままトークに書けない記号があります。
里々では記号の前に「Φ」を入れて無効化してました。
YAYAではCHRという関数を使って書きます。
こういったサイトを参考にし、書きたい記号の上位3ビット(上のサイトでいうと横の軸にある記号)と上位4ビット(縦の軸)を調べ
CHR(0x(上位3ビット)(上位4ビット))
と書きます。
例えば「1」でしたら
CHR(0x31)
です。
必ず半角で書きます。
記号表示テスト { "\0\s[0]記号「%(CHR(0x22))」をバルーンに表示\e" }
#を//にするだけです。
# 起動イベント *OnBoot :こんにちはー。
// 起動イベント OnBoot { "\0\s[0]こんにちはー。\e" }
こんな位置にも入れられます。
つまり「//」がついた所から右の部分が全てコメントアウトになります。
OnBoot { "\0\s[0]こんにちはー。\e"// 起動トーク }
「/*」と「*/」でくくってもコメントアウトになります。
複数行ごとくくれるので行数が多いならこっちの方が楽。どこからどこまでコメントアウトかちょっとわかりづらいのが難点?
/* 起動イベント 一番最初に起動した時呼ばれる */ OnBoot { "\0\s[0]こんにちはー。\e" }
YAYAは里々より注釈が入れやすく、気軽に使いやすいです。
後で見返した時どこが何なのかすぐ思い返せるようばんばん入れておきましょう。
YAYAでは里々と違って辞書の記述方式が一文字でも間違っているとゴーストが動作しなくなります。どこの記述が間違っていたのか確認しましょう。
グローバル変数は「yaya_variable.cfg」に保存されています。
(テンプレートによってファイル名が違うこともあります)
descript.txtがshiori,satori.dllのままではないでしょうか。
Troubleshootingも見ましょう。
Last modified on: 2024-01-29 (Monday) 15:54:22
|