12 段目:もっと凝ったことをしたい
奥の手をお見せする頃合いですわ。ここまでの書き方では物足りなくなってきた、欲張りなあなたのために。
お嬢様、奥の手とは、最後まで取っておくものではございませんか。
もう 12 段目ですもの、出し惜しみはいたしませんわ。辞書の中に、Lua をほんの数行だけ書きますのよ。
叶えたいこと
この章で叶えるのは「Lua の関数を呼ぶ」ですわ。辞書の中に Lua で関数を書いて、話の行き先を、その関数に決めさせますの。足す辞書は、これが最後の 1 枚ですわ。
- この章で足すファイル:
ghost/master/dic/12-lua.pasta - 叶うこと: 暇なときのおしゃべりで、Lua の関数が返した名前のシーンへ、話が続く
新しく覚える表現
Lua のブロックで関数を作る
Lua は、プログラミング言語の名前ですわ。シーンの中に Lua のブロックを書くと、そのシーンで使う関数を作れますの。ブロックの始まりと終わりは、バッククォートを 3 つ並べた行で示しますのよ。
*会話
```lua
function SCENE.次の話(act)
return "とっておき"
end
```
- Lua — プログラミング言語の名前である。辞書の中に Lua のブロックを書くと、Lua で関数を作れる
- 関数 — 名前を付けた、ひとまとまりの処理である。呼ぶと、値を返す
- Lua のブロックは、バッククォート(
`)を 3 つ並べた行で始まり、同じくバッククォートを 3 つ並べた行で終わる。この 2 つの行を、フェンスと呼ぶ - この章の辞書は、始まりのフェンスのバッククォートのすぐ後ろに、
luaと書いている。バッククォートとluaのあいだにも、luaの後ろにも、空白は置けない - フェンスの行は字下げしない。字下げすると、辞書の読み込みがエラーになる
- この章の辞書は、
*会話の行のすぐ下、台詞の行より前に、Lua のブロックを書いている - 2 つのフェンスのあいだは、Lua で書く
function SCENE.名前(act)からendまでが、1 つの関数である。名前のところが、関数の名前になるfunction SCENE.次の話(act)—次の話という名前の関数を作る(act)— 関数は、pasta からactを受け取る。この章の関数は、actを使わないreturn "とっておき"— 関数が返す値を決める。この関数は、とっておきという文字列を返す- シーンの中の Lua のブロックで作った関数は、そのシーンで使う関数である
関数を呼んで行き先を決めさせる
では、作った関数は、どうやって呼ぶのでしょう。11 段目の >シーン名 を思い出してくださいまし。シーンの名前の代わりに @次の話() と書くと、関数を呼んで、関数が返した名前のシーンへ話が続きますの。
女の子:@キラキラ ねえ、とっておきの話があるんだ。
>@次の話()
・とっておき
女の子:@照れ ……やっぱり、まだ内緒!
男の子:@困惑 そこで止めるの!?
>@名前()— 関数を呼び、関数が返した名前のシーンへ話を続ける。行の頭を字下げして書く- 11 段目 の
>シーン名は、呼び先の名前をそのまま書く。>@名前()は、呼び先の名前を関数に決めさせる >@次の話()— 関数次の話を呼ぶ。この関数はとっておきを返すので、とっておきという名前のシーンへ話が続く()は省けない。省くと、辞書の読み込みがエラーになる・とっておき— 11 段目 で覚えたローカルシーンである。名前は、関数が返す名前と同じにしてある- 上の行は、女の子の台詞を話してから関数
次の話を呼び、ローカルシーン・とっておきの 2 行の台詞を話して終わる
お嬢様、決まった名前を返すだけでしたら、>とっておき と書けば済むのではございませんか。
よいところを突きますわね。この章の関数は、決まった名前を返すだけの稽古台ですの。関数の中で if を使って返す名前を変えれば、条件で話を分けられますわ。そこから先の込み入ったことは、Lua の章がお相手しますのよ。
- この章の関数は、決まった名前を返すだけである
- 行き先が決まっているときは、11 段目の
>シーン名(この章なら>とっておき)で足りる - 関数の中で
ifを使って返す名前を変えると、条件で話を分けられる。書き方は、文法リファレンスの 条件分岐の実現 にある - Lua で書く、もっと込み入ったことは、Lua マニュアル概要 から始まる Lua の章で扱う
辞書ファイルを足す
ghost/master/dic/12-lua.pasta を作り、次の内容を UTF-8 で保存する。
# 12 段目:もっと凝ったことをしたい
# シーンの中に ```lua と ``` で囲んだ Lua のブロックを書くと、そのシーンで使う関数を作れる。フェンスの行(```lua と ```)は字下げしない。
# function SCENE.名前(act) で作った関数は、>@名前() で呼べる。関数が返した名前のシーンへ話が続く。
# ここでは決まった名前を返すだけ。関数の中で if を使って返す名前を変えると、条件で話を分けられる。
*会話
```lua
function SCENE.次の話(act)
return "とっておき"
end
```
女の子:@キラキラ ねえ、とっておきの話があるんだ。
>@次の話()
・とっておき
女の子:@照れ ……やっぱり、まだ内緒!
男の子:@困惑 そこで止めるの!?
- 1〜11 段目のファイルは書き換えない。新しいファイルを
dic/に足すだけで、この段になる - 辞書ファイルを足すのは、この段が最後である。
dic/には、01-boot.pastaから12-lua.pastaまでの 12 個の辞書ファイルが並ぶ - このシーンの名前は
会話である。2 段目からのおしゃべりの 1 つとして、暇なときに出る - 台詞の頭の
@キラキラ・@照れ・@困惑は、3 段目で付けた表情名である
起動して確かめる
確かめ方は、いつものとおりですわ。起動し直して、この章の掛け合いが出るのを待ちますのよ。
- SSP を終了し、もう一度起動する。
- 自分のゴーストが出ていなければ、メニューから切り替える。
- そのまま待ち、この章の掛け合いが出るのを見る。
- 成功の目印: 女の子の吹き出しに「ねえ、とっておきの話があるんだ。」と出て、続けて「……やっぱり、まだ内緒!」と出る。その後に、男の子の吹き出しに「そこで止めるの!?」と出る

- 「……やっぱり、まだ内緒!」と「そこで止めるの!?」は、ローカルシーン
・とっておきの台詞である。この 2 つが出ていれば、関数次の話が呼ばれて、関数が返した名前のシーンへ話が続いている 会話という名前のシーンは、この章の 1 つを足して 12 個になった。11 段目の寄り道の続きがおしゃべりを 1 回使うので、12 個の掛け合いがひととおり出るまでに、おしゃべりは 13 回になる。出る順は決まっていない- おしゃべりの間隔は、2 段目で
pasta.tomlに書き足した 45〜75 秒である。13 回見るには 10〜16 分ほどかかる - 待つ時間を縮めたいときは、
[ghost]の 2 つの値を小さくして、SSP を終了し、もう一度起動する
もっと詳しく
- Lua ブロックの配置(シーンの中の Lua のブロックと、フェンスの書き方)
- 条件分岐の実現(
function SCENE.名前(act)と>@名前()で、条件によって話を分ける書き方) - Lua マニュアル概要(もっと込み入ったことを Lua で書くときの入口)
まあ! とうとう Lua にまで手が届きましたのね。これで 12 枚の辞書が、すべてそろいましたわ。
ところでお嬢様の「とっておきの話」は、いつお聞かせいただけるのでございましょう。
それは、まだ内緒ですわ。次は、育て上げたあの子を、世に送り出す支度をいたしますわよ。