@pasta_config
覗き窓をひとつ、ご紹介いたしますわ。pasta.toml に書いた設定を、Lua からも眺められる窓――それが @pasta_config ですの。
覗き見とは、あまり行儀のよろしいことではございませんね。
人聞きの悪いことをおっしゃらないで。キャラクターの名前でも自作のフラグでも、書いたとおりの形で受け取れますのよ。ただし読み込み方にひとつだけ作法がございますから、しっかり覚えてくださいまし。
@pasta_config は、pasta.toml の内容([loader] セクションを除く)を Lua の表として公開するモジュールである。
local ok, config = pcall(require, "@pasta_config")
読み込み方
pcall(require, "@pasta_config") で読み、ok を確かめてから使う。
- ゴーストとして読み込まれたランタイムでは、
@pasta_configは常に登録されている(pasta.tomlが無いとゴーストの読み込み自体が失敗するため、登録されない状態にはならない)。 - ランタイムの外(Lua だけの単体テストなど)でスクリプトを動かすと、
@pasta_configは登録されていない。素のrequire "@pasta_config"はエラーで止まる。 pcallで保護しておけば、どちらの環境でも同じスクリプトが動く。ランタイム同梱のスクリプトも、すべてこの形で読んでいる。
公開されるフィールド
pasta.toml の [loader] セクション以外のすべてのセクション・フィールドが公開される。セクション名とキー名が、そのまま表のキーになる。
# pasta.toml の例
[loader]
# loader セクションは @pasta_config に含まれない
pasta_patterns = ["dic/*/*.pasta"]
[character]
name = "まゆら"
age = 17
[character.appearance]
hair_color = "黒"
eye_color = "茶"
[system]
debug = true
version = "1.0.0"
pasta.toml に書いた値のほかに、ランタイムが次の値を補う。
[ghost]: 書かなくても必ず存在する。talk_interval_min・talk_interval_max・hour_margin・spot_newlines・choice_newlines・after_choice_newlinesのうち書かなかったキーには、実装の既定値が入る(書いたキーはそのまま)。[actor]:[actor."名前"]の各サブテーブルに、キー名と同じ値のnameフィールドが入る(config.actor["さくら"].nameは"さくら")。nameを書いていても、キー名で上書きされる。[actor]のfont:[actor."名前"]に書いたfont(装い(font))は、表ではなく、検査済みのタグ列の文字列として読める。font = { color = "90,110,140", bold = true }ならconfig.actor["おじさん"].fontは文字列\f[color,90,110,140]\f[bold,1]、font = {}なら空文字列である。書き間違いがあればゴーストの読み込みが失敗するため、読めた値はいつも検査済みである。fontを書かなかったアクターではnilになる。
[scene] には何も補われない。pasta.toml に書いたとおりに現れ、書かなければ config.scene は nil になる。[scene.alias] を書かなかったときに使われる既定の別名表(OnTalk = ["会話"] など 7 件)も補完されない。そのため config.scene からは、実際に使われている別名表を読み取れないことがある。実際に使われている別名表は SEARCH:scene_aliases() で読める([scene])。
[ghost]・[actor] に書けるキーと既定値は、pasta.toml リファレンス の [ghost]・[actor.“名前”] を参照する。
[loader] 以外のセクションを 1 つも書かなかった場合、表は ghost だけを持つ。
アクセス例
local ok, config = pcall(require, "@pasta_config")
if ok then
-- セクションのフィールド
print(config.character.name) -- "まゆら"
print(config.character.age) -- 17
-- ネストしたテーブル
print(config.character.appearance.hair_color) -- "黒"
-- 書かれていないかもしれない値は nil ガードする
local version = config.system and config.system.version or "unknown"
end
書かれていないセクションは nil になる。config.system.version のように 2 段以上たどるときは、途中のセクションが無い場合に備えて nil ガードを書く。
注意事項
-
TOML 構造の保持: ネストしたテーブル構造(
[character.appearance]など)は、そのまま入れ子の表になる。 -
型の対応: TOML の型は次のように Lua の値になる。
TOML の型 Lua の値 文字列 文字列 整数・浮動小数点数 数値(整数も Lua の数値。 17は17)真偽値 真偽値( true/false)日時( 2020-01-02など)文字列(TOML に書いた形。 "2020-01-02")配列 1 から始まる連番の表 テーブル 表 -
[loader]除外:[loader]はローダーの内部設定のため公開されない(config.loaderはnil)。 -
読み取り専用ではない: 公開される表は普通の Lua の表で、書き換えられる。書き換えた値は、同じランタイムで後から
requireした表にも見える(同じ表を返すため)が、pasta.tomlには書き戻されない。ランタイム同梱のスクリプトも同じ表から設定を読むため、書き換えるとエンジンの動作が変わることがある。設定の読み取りにだけ使う。
設定を読み取る窓口、これでばっちりですわね。pcall の作法さえ守れば、怖いものはございませんわ。
表を書き換えても、pasta.toml には書き戻されないのでございましたね。
フンッ、ですから設定は読むだけになさいまし。困ったときは、この章を読み返せばよろしくてよ。