付録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、foreachwhile、for、foreach(5.)
switch と casematch
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、SPLITlen、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 に変換するツールは、このガイドにはありません。

移行するときは、

  1. YAYA側で、移行したい変数を ghost/master にテキストファイル(名前<タブ>値 の行など)として書き出す処理を用意する。
  2. 湊の台本で、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. 非互換一覧を確認してください。