Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 段目で付けた表情名である

起動して確かめる

クローディア(素)

確かめ方は、いつものとおりですわ。起動し直して、この章の掛け合いが出るのを待ちますのよ。

  1. SSP を終了し、もう一度起動する。
  2. 自分のゴーストが出ていなければ、メニューから切り替える。
  3. そのまま待ち、この章の掛け合いが出るのを見る。
  • 成功の目印: 女の子の吹き出しに「ねえ、とっておきの話があるんだ。」と出て、続けて「……やっぱり、まだ内緒!」と出る。その後に、男の子の吹き出しに「そこで止めるの!?」と出る

女の子が照れた顔で「ねえ、とっておきの話があるんだ。……やっぱり、まだ内緒!」、男の子が困った顔で「そこで止めるの!?」と吹き出しに出ている画面

  • 「……やっぱり、まだ内緒!」と「そこで止めるの!?」は、ローカルシーン ・とっておき の台詞である。この 2 つが出ていれば、関数 次の話 が呼ばれて、関数が返した名前のシーンへ話が続いている
  • 会話 という名前のシーンは、この章の 1 つを足して 12 個になった。11 段目の寄り道の続きがおしゃべりを 1 回使うので、12 個の掛け合いがひととおり出るまでに、おしゃべりは 13 回になる。出る順は決まっていない
  • おしゃべりの間隔は、2 段目で pasta.toml に書き足した 45〜75 秒である。13 回見るには 10〜16 分ほどかかる
  • 待つ時間を縮めたいときは、[ghost] の 2 つの値を小さくして、SSP を終了し、もう一度起動する

もっと詳しく


クローディア(驚き)

まあ! とうとう Lua にまで手が届きましたのね。これで 12 枚の辞書が、すべてそろいましたわ。

アンソニー(素)

ところでお嬢様の「とっておきの話」は、いつお聞かせいただけるのでございましょう。

クローディア(目閉じ)

それは、まだ内緒ですわ。次は、育て上げたあの子を、世に送り出す支度をいたしますわよ。