付録A. YAYAから来た方へ
YAYAでゴーストを作ってきた人が、湊に移るときの差分をまとめます。本文は里々の利用者を主な読者としているので、YAYAの人は、この付録と、各節の末尾にある「YAYAから来た方へ」を合わせて読んでください。
- YAYA側の記述は、YAYA Wikiに基づいています。YAYAの実機では確認していません。
- 湊側の挙動は、実装を確認したものです。
考え方の違い
| YAYA | 湊 | |
|---|---|---|
| 基本単位 | 関数(イベントも単語群も、すべて関数) | トーク(名前 => { })と関数(func) |
| 文字列を出す | 関数の中に文字列を置くと、その文字列が出力(複数あれば1つを選ぶ) | セリフの行(湊: …)を書く。文字列だけ返すなら return "…" |
| 同名の定義 | 書けない(エラー) | 書ける(ランダムに1つ選ばれる。里々と同じ) |
| 話者・サーフェス | 文字列の中に \0\s[0] を書く | 湊:、[0]湊: と書く(キャラ名は config.toml に登録) |
構文の対応
| YAYA | 湊 |
|---|---|
名前 { … }(イベント・トーク) | 名前 => { … } |
名前 { … }(引数を取る関数) | func 名前(引数) { … } |
| 複数の文字列から1つを選ぶ | 同名トークを複数書く、または配列と rand() |
-- で区切って、各区間から1つずつ選んで連結 | ${…} を並べて書く(6.) |
: nonoverlap | 不要(同名トークは常に一巡) |
: sequential | なし。順番に出すなら自作(6.) |
%(x)、%x | ${x} |
_x = 1(ローカル変数) | let x = 1 |
x = 1(グローバル変数。自動保存) | global save.x = 1(保存されるのは save の下だけ) |
if … {} elseif … {} else {} | if (…) {} else if (…) {} else {}(条件は ( ) で囲む) |
while、for、foreach | while、for、foreach(5.) |
switch と case | match |
reference[0] | reference["0"](キーは文字列。値も文字列) |
_argv[0](引数) | 関数の引数名(func f(a, b)) |
valueex0(SAORIの戻り値) | saori() の戻り配列の [0](8.) |
FUNCTIONEX('saori\x.dll', …) | saori("saori/x.dll", …)(8.) |
TOINT(x)、TOSTR(x) | to_num(x)、to_str(x) |
STRLEN、SUBSTR、REPLACE、SPLIT | len、substr、replace、split |
STRSTR(s, 検索語, 位置) | index_of(s, 検索語)(見つからなければ -1) |
ARRAYSIZE(配列) | len(配列) |
RAND(n) | rand() % n |
GETTIME() の配列 | now.年 now.月 now.日 now.時 now.分 now.秒 now.曜日 |
CALLBYNAME("名前") | call 名前を入れた変数 |
ISFUNC("名前") | talk_exists("名前") |
RE_SEARCH など正規表現関数 | regex_match、regex_find、regex_captures、regex_replace、regex_split |
LOGGING など | log("…")(debug_log が有効なときだけ書き出す) |
ERASEVAR("x") | global save = delete(save, "x") |
対応する関数でも、引数の順序や境界の扱いが細かく違うことがあります。置き換えたあと、実際に動かして確認してください。
YAYAにあって湊にない機能
EVAL(文字列をコードとして実行)- 名前空間(
A.Bのような関数名) - 関数のオプション(
: sequentialなど。: nonoverlapに当たる動きは、同名トークで常に働く) - 型の判定関数(
GETTYPEなど) - 1行ずつ読むファイル操作、ファイルの削除、フォルダの列挙(
FOPEN、FREAD、FDEL、FENUMなど) SAVEVAR、RESTOREVAR(湊の保存は自動で、saveの下だけ)- システム辞書(
yaya_shiori3.dic)が提供している定型の関数
詳しくは11. 里々/YAYAにあるが湊にない機能を参照してください。
YAYAの暗黙の処理と、湊の違い
| YAYA | 湊 | |
|---|---|---|
| 変数の初期値 | 空文字列(YAYA Wikiに「0または空文字ではない」と明記) | null(表示は空文字列)。+= は数値として働く |
| 数値の型 | 整数・実数・文字列の3種類 | 数値(整数と実数の区別なし)・文字列・真偽値・配列・マップ・null |
| 文字列と数値の足し算 | 加算なら文字列の連結(YAYA Wiki) | 同じく連結 |
| 全角の数字 | 数値になれず、文字列 | 同じく文字列(0として計算される) |
| グローバル変数 | 自動で保存 | save の下だけ保存。ほかは終了で消える |
| ローカル変数のスコープ | 現在とそれより深い { } | 現在とそれより深い { }(let)。外側の変数に = すると更新される |
| 曜日の数字 | GETTIME の [3]。0が日曜日 | now.曜日。0が月曜日 |
| 複数の文字列を並べた関数 | 1つがランダムに選ばれる | 同名トークが複数あるとき、1つがランダムに選ばれる(一巡固定) |
セーブデータ
YAYAのグローバル変数は yaya_variable.cfg に保存されています。このファイルを湊の save.json に変換するツールは、このガイドにはありません。
移行するときは、
- YAYA側で、移行したい変数を
ghost/masterにテキストファイル(名前<タブ>値の行など)として書き出す処理を用意する。 - 湊の台本で、
file_readしてsaveに取り込む(9. A. 湊の台本で読み込むの台本と同じ形)。
という手順が確実です。
文字コード
YAYAは、UTF-8で書いた辞書も読めます(YAYA Wikiの文字コードの項を参照)。UTF-8で書いてあれば、文章そのものはコピーして使えます。構文は書き換えが必要です。湊の台本は、UTF-8のBOMなしです(10.)。
SAORI
YAYAは、FUNCTIONEX の戻り値が Result、valueex0… が Value0… と分かれています。湊は両方を1つの配列にまとめ、Value0 があると Result を取り出せません(8.)。YAYAで Result を使っている呼び出しは、そのままでは移せません。
コードの書き換え例
YAYAの、訪問回数と選択肢のコード:
OnBoot
{
if ISINTEGER(visits) == 0 {
visits = 0
}
visits++
"\0\s[0]%(visits)回目です。\n\q[はい,OnYes]\n\q[いいえ,OnNo]\e"
}
OnYes
{
"\0\s[0]はいが選ばれました。\e"
}
湊に書き換えたもの:
OnBoot => {
global save.visits += 1
湊: ${save.visits}回目です。
\q[はい,OnYes]
\q[いいえ,OnNo]
}
OnYes => {
湊: はいが選ばれました。
}
\01回目です。\n\q[はい,OnYes]\n\q[いいえ,OnNo]\e
\02回目です。\n\q[はい,OnYes]\n\q[いいえ,OnNo]\e
\0はいが選ばれました。\e
- 変数の初期化(
ISINTEGERの確認)は、nullに+=できるので不要です。 visits++はglobal save.visits += 1です。saveを付けないと、保存されません。\0\s[0]…\eは書きません(湊:と[0]湊:が代わりをします。\eは湊が付けます)。- セリフの途中の
\nは、行を分けて書けば自動でつながります。
次は、本文に戻って1. 非互換一覧を確認してください。