【Stormworks v1.9.19】 property の終わりにカンマをつけろ
投稿:,最終更新:
この記事は Stormworks 第 2 Advent Calendar 2023 第 18 日目の記事です。
動画にするアドオンの話をする予定でしたが、もうちょっと的を絞って、動画にするアドオンでハマった罠の話をします。
昨日(12 月 17 日)ハマってとりあえず解決したばかりのことですので、細かいことは未検証です。後で更新します。
default value を効かせるにはケツカンマ
Stormworks の Add-on Lua に property という機能がいつからか追加されています。
開発側では次のようにして利用することを想定しているようです。これをトップレベルに置いてよい理由は wikiwiki に解説がありました。 この書き方の場合、ケツカンマ(trailing comma)を入れないと default value がうまく効かないようです。
なんで?
-- 注:最後のカンマは省略できない
g_savedata = {
slider_value = property.slider("slider label", min, max, increment, default_value_number),
checkbox_checked = property.checkbox("checkbox_label", default_value_boolean),
}
property は文字列として検出しているっぽい挙動
今作ってるアドオンは、全コードの合計文字数が 12 万文字を超えており、上限の 131072 文字にかなり近づいているため、 VSCode の Stormworks Extension の機能を使っておよそ半分の文字数に圧縮しています。
しかし、圧縮してしまうと property の機能が使えなくなってしまいました。 この理由は Stormworks が property を(実際に Lua を実行するのではなく)文字列パターンで検出しているからと推測されます。
圧縮の際に消えることを回避するため、長い形式の文字列リテラルを使って Stormworks を騙します。
-- Stormworksを騙す。関数の後にコンマを入れないと認識してくれないようである。
fake_property = [[
g_savedata = {
slider_value = property.slider("slider label", min, max, increment, default_value_number),
checkbox_checked = property.checkbox("checkbox_label", default_value_boolean),
}
]]
-- この書き方が圧縮後も大丈夫かどうかは実は未検証……
g_savedata = {
slider_value = property.slider("slider label", min, max, increment, default_value_number),
checkbox_checked = property.checkbox("checkbox_label", default_value_boolean),
}
未検証の内容
default value が本当にケツカンマトリガなのかは確かめる必要があります。
g_savedata の間接参照を行っても大丈夫かどうかは未検証です。wikiwiki に書いてあった解説を読む限り、トップレベル実行後に参照先が変わる可能性があります。
近日中にリリースするアドオンがこれに耐えられるか不安なため、念のため丁寧に検証するつもりなので、その時の知見で記事を更新する予定です。