15. 三方式の比較

同じゴーストを、里々・YAYA・湊で書き比べます。全体の雰囲気と、どこが違うのかをつかむための節です。

  • 湊のコードは、実際に動かして出力を確認しています(検証済み)。
  • 里々・YAYAのコードは参考コードです。里々Wiki・YAYA Wikiの記載に基づいて書いていますが、里々やYAYAの実機では動かしていません。
  • 里々のコードの → は、タブ文字を表します(里々ではタブが区切りです)。
  • YAYAのコードは、SSPのYAYA用テンプレート(\0\s[0]…\e を自分で書く形)を前提にしています。ランダムトークを呼び出す仕組みはテンプレートによって違うため、関数名(RandomTalk)は仮のものです。

パターン1: 起動あいさつ(訪問回数)とランダムトーク

初回は「はじめまして」、2回目以降は「◯回目」と言う。ランダムトークは2種類。

里々

satori_conf.txt(変数の初期値):

*初期化
$訪問回数→0

辞書:

*OnBoot
$訪問回数=(訪問回数)+1
>初回→(訪問回数)==1
>再訪

*初回
:はじめまして。

*再訪
:また来てくれたんですね。(訪問回数)回目です。

*
:今日もいい天気ですね。

*
:何か用ですか?

YAYA

OnBoot
{
	if ISINTEGER(visits) == 0 {
		visits = 0
	}
	visits++
	if visits == 1 {
		"\0\s[0]はじめまして。\e"
	}
	else {
		"\0\s[0]また来てくれたんですね。%(visits)回目です。\e"
	}
}

RandomTalk
{
	"\0\s[0]今日もいい天気ですね。\e"
	"\0\s[0]何か用ですか?\e"
}

湊

config.toml:

[characters]
"湊" = "\\0"

talks/main.mnt:

OnBoot => {
    global save.訪問回数 += 1
    if (save.訪問回数 == 1) {
        湊: はじめまして。
    } else {
        湊: また来てくれたんですね。${save.訪問回数}回目です。
    }
}

OnRandomTalk => {
    湊: 今日もいい天気ですね。
}

OnRandomTalk => {
    湊: 何か用ですか?
}
\0はじめまして。\e
\0また来てくれたんですね。2回目です。\e

違うところ

里々YAYA湊
初期値satori_conf.txt に書くISINTEGER で確認して代入書かなくてよい(null に += すると1になる)。初期値が要るなら ?=
保存自動自動(グローバル変数)global save. を付けたものだけ
分岐>(ジャンプ)if / elseif / else
ランダムトーク名前のない *関数 RandomTalk(呼び出しはテンプレート次第)OnRandomTalk の同名多重定義
話者・サーフェス: が話者、サーフェスは自動\0\s[0] を毎回書く湊: を毎回書く。[0]湊: でサーフェス

パターン2: 好感度と選択肢

「今日の気分は?」と聞き、選択肢で好感度が増減する。

里々

satori_conf.txt:

*初期化
$好感度→0

辞書:

*OnBoot
:こんにちは。今日の気分は?
_いい→気分良い
_わるい→気分悪い

*気分良い
$好感度=(好感度)+1
:よかった。好感度は(好感度)です。

*気分悪い
$好感度=(好感度)-1
:そっか……。好感度は(好感度)です。

YAYA

OnBoot
{
	"\0\s[0]こんにちは。今日の気分は?\n\q[いい,OnMoodGood]\n\q[わるい,OnMoodBad]\e"
}

OnMoodGood
{
	if ISINTEGER(favor) == 0 {
		favor = 0
	}
	favor++
	"\0\s[0]よかった。好感度は%(favor)です。\e"
}

OnMoodBad
{
	if ISINTEGER(favor) == 0 {
		favor = 0
	}
	favor--
	"\0\s[0]そっか……。好感度は%(favor)です。\e"
}

湊

global save.好感度 ?= 0

OnBoot => {
    湊: こんにちは。今日の気分は?
    \q[いい,OnMoodGood]
    \q[わるい,OnMoodBad]
}

OnMoodGood => {
    global save.好感度 += 1
    湊: よかった。好感度は${save.好感度}です。
}

OnMoodBad => {
    global save.好感度 -= 1
    湊: そっか……。好感度は${save.好感度}です。
}
\0こんにちは。今日の気分は?\n\q[いい,OnMoodGood]\n\q[わるい,OnMoodBad]\e
\0よかった。好感度は1です。\e
\0そっか……。好感度は0です。\e

違うところ

里々YAYA湊
選択肢_ラベル→ID の行。飛び先は同名のトーク\q[…] を書く。飛び先は On… のイベント\q[…] を書く。飛び先は On… のイベント
選択肢の改行自動\n を自分で書く行を分けて書けば、自動で \n がつながる
増減$好感度=(好感度)-1favor--global save.好感度 -= 1
表示(好感度)%(favor)${save.好感度}

パターン3: 単語群と時間帯

「◯◯ですね。△△は好きですか?」と言う。◯◯は時間帯、△△は単語群から選ぶ。

里々

@果物
りんご
みかん
ぶどう

@時間帯
(iflist,(現在時)<,6,深夜,12,朝,18,昼,夜)

*
:(時間帯)ですね。(果物)は好きですか?

YAYA

果物
{
	"りんご"
	"みかん"
	"ぶどう"
}

時間帯
{
	_t = GETTIME()
	if _t[4] < 6 {
		"深夜"
	}
	elseif _t[4] < 12 {
		"朝"
	}
	elseif _t[4] < 18 {
		"昼"
	}
	else {
		"夜"
	}
}

RandomTalk
{
	"\0\s[0]%(時間帯)ですね。%(果物)は好きですか?\e"
}

湊

果物 => {
    return "りんご"
}

果物 => {
    return "みかん"
}

果物 => {
    return "ぶどう"
}

func 時間帯(h) {
    if (h < 6) {
        return "深夜"
    } else if (h < 12) {
        return "朝"
    } else if (h < 18) {
        return "昼"
    }
    return "夜"
}

OnBoot => {
    湊: ${時間帯(now.時)}ですね。${果物()}は好きですか?
}
\0深夜ですね。*は好きですか?\e
\0朝ですね。*は好きですか?\e
\0昼ですね。*は好きですか?\e
\0夜ですね。*は好きですか?\e

* は、りんご・みかん・ぶどうのどれか1つを表します。

違うところ

里々YAYA湊
単語群@果物(1行1単語)関数 果物 { "…" "…" }(複数の文字列から1つ)同名のトークを複数書き、return "…"(または配列)
呼び出し(果物)%(果物)${果物()}
時間による分岐iflistGETTIME() の配列と ifnow.時 と if(関数に切り出し)
重複回避設定で選ぶ: nonoverlap を付ける同名トークなら自動で一巡(配列なら自前)
話者の指定行頭の :文字列の中に \0 を書く行頭の 湊:

全体を通して見えること

  • 里々は「文章を書く」言語、YAYAは「関数を書く」言語、湊はその中間です。セリフを書く感覚は里々に近く、変数・条件・関数の書き方はYAYAに近い作りです。
  • 保存のルールが一番違います。 里々もYAYAも、変数は基本的に自動で保存されますが、湊は save の下だけです。
  • 里々に比べて、湊は暗黙にやってくれることが少ないです。ウェイト、話者の交代、サーフェスの復帰、重複回避の設定など、里々が自動で行っていたことの多くを、自分で書きます。その代わり、何が起きるかは書いてあるコードから読み取りやすくなっています(ただし、この節の各所で述べたように、湊にも暗黙の処理は残っています)。

付録として、YAYAから来た方へがあります。