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 / else | if / 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 がつながる |
| 増減 | $好感度=(好感度)-1 | favor-- | 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 "…"(または配列) |
| 呼び出し | (果物) | %(果物) | ${果物()} |
| 時間による分岐 | iflist | GETTIME() の配列と if | now.時 と if(関数に切り出し) |
| 重複回避 | 設定で選ぶ | : nonoverlap を付ける | 同名トークなら自動で一巡(配列なら自前) |
| 話者の指定 | 行頭の : | 文字列の中に \0 を書く | 行頭の 湊: |
全体を通して見えること
- 里々は「文章を書く」言語、YAYAは「関数を書く」言語、湊はその中間です。セリフを書く感覚は里々に近く、変数・条件・関数の書き方はYAYAに近い作りです。
- 保存のルールが一番違います。 里々もYAYAも、変数は基本的に自動で保存されますが、湊は
saveの下だけです。 - 里々に比べて、湊は暗黙にやってくれることが少ないです。ウェイト、話者の交代、サーフェスの復帰、重複回避の設定など、里々が自動で行っていたことの多くを、自分で書きます。その代わり、何が起きるかは書いてあるコードから読み取りやすくなっています(ただし、この節の各所で述べたように、湊にも暗黙の処理は残っています)。
付録として、YAYAから来た方へがあります。