Liminalia

TyranoScript のタグの取り込み

lim import(packages/ks-import)が、立ち絵と見た目の演出以外の一般的なタグをどう扱うかの一覧。 TyranoScript の実際の挙動は tyrano-semantics.md に記録してある。

取り込みは、書き出した .lim の各行が .ks のどこから来たかを対応表(import-sourcemap.json)に残す。 .lim を正本にしたあとの変更を .ks に戻す書き戻しは tyrano-backport.md。

タグを一対一で命令に写すのではなく、.lim の既存の書き方で表せるものはそれにする。分類は次の三つ。

  • (a) 既存の書き方に変換する
  • (b) 新しい命令、書き方を足した(仕様は commands.md と format.md)
  • (c) このエンジンでは扱わない。書き出さずに理由付きの診断を出す。意味が欠けるものは手作業(unsupported-tag の error、 取り込みの報告の「手作業が必要な箇所」)、見た目の設定など書き出さなくても流れが変わらないものは警告にする。 報告の「このエンジンでは扱わないタグ」に件数と理由が出る。

本文

タグ分類.lim
[emb exp=…]a{= 式}
[ruby text=…]a次の一文字の {r 字|よみ}
[er] [ct]a@clear([font] の装飾も戻す)
[font] [resetfont]a、b太字、斜体、色は {b …} {i …} {c 色 …}、大きさは新しい {size px …}。行をまたいで続く装飾は、行ごとに開き直す(一行で意味が閉じる)。face、edge、shadow、gradient、effect は変換しない(警告)
[mark] [endmark]b{mark 色 …}
[nowait] [endnowait]a同じ行で閉じれば {speed 0ms …}、行をまたげば @text-speed 0ms と元の速さ(@text-speed … / @text-speed-reset)
[lr](TyranoBuilder)a{click}{br}
[hidemessage]b@peek
[deffont]c既定の文字の見た目は本文の見た目(TextTheme)か CSS(警告)
[position] [message_config]c[position vertical=true/false] は @vertical on/off。メッセージ枠の位置、見た目は liminalia.json の ui.message(警告)
[glyph] [glyph_auto] [glyph_skip]cクリック待ちの記号は TextTheme.glyph、オート、スキップ中の記号はシステム画面(警告)
[graph]c本文の中に画像は置かない(手作業)

待ち

タグ分類.lim
[wbgm] [wse]b@wait-bgm @wait-se
[wt] [wa]—見た目の演出として標準の命令の変換表(packages/ks-import/src/std-tags)が @liminalia/std の命令に変換する([trans] と組で @transition、[wa] は動きの終わりを待つ)。標準の変換表を使わないとき(取り込み設定に STD_IMPORT を重ねないとき)は、その命令の wait=true で待つように理由付きの警告
[wb] [wait_cancel]cイベントを待つ仕組み、@wait を外から止める仕組みは持たない(警告)

マクロ、条件

タグ分類.lim
[macro] 〜 [endmacro]a@define(下の「マクロ」)
[erasemacro]c@define は消せない(手作業)
[ignore exp=…] 〜 [endignore]a@if !(式) 〜 @end
[plugin name=…]a書き出さない。init.ks のマクロは @define に集める。プラグインの JS は手作業として報告(plugin-js)
[loadjs] [loadcss] [html]〜[endhtml]cJS、CSS、HTML はそのまま使わない。プラグイン(@liminalia/sdk の命令と @liminalia/web の描画)で作る(手作業)
[trace]c開発用の出力。流れは lim trace で見る(警告)

選択肢と入力

タグ分類.lim
[link] 〜 [endlink] と [s]a@choice。前の本文(問いかけ)は一行になる(選択肢の前にクリック待ちが一つ増える。警告 link-text-line)
[button](fix=false、role なし)と [s]b@choice の画像の選択肢(- -> 飛び先 image=… hover=… x=… y=…)
[button fix=true] / [button role=…]c常に出ているボタン、システムのボタンはシステム画面で作る(手作業)
[clickable] と [s]b@choice の押せる範囲(- -> 飛び先 x=… y=… width=… height=…)
[locate]a次の [button] [clickable] の座標に使う(書き出さない)
[glink] [link] [button] [clickable] の cond=bその選択肢の行の if=(式)(偽なら出さない。@if では囲まない)。式は [if] と同じく変換し、変換できなければ条件なしで出して手作業(manual-cond)
[glink_config]c選択肢のボタンの並べ方と出方は CSS(警告)
[edit] [commit]b@text-input 変数(決定まで待つ)。入力欄と決定のボタン一つの組は @text-input と @jump になり、[commit] は要らない
[dialog]b@dialog "文" type=alert|confirm|input target=… cancel-target=… variable=…
[cursor]cマウスカーソルの見た目は CSS(警告)

システム画面への要求

シナリオから、システム画面に頼む命令。実行器は描画側に知らせるだけで、システム画面(SystemController.request)が扱う。 扱わなければ描画側の最小の既定の動きになる(packages/web/src/play.ts)。

タグ分類.lim
[autostart] [autostop]b@auto start / @auto stop
[skipstart] [skipstop] [cancelskip]b@skip start / @skip stop
[showsave] [showload] [showlog] [showmenu]b@open-screen save|load|log|menu(閉じるまで待つ)
[showmenubutton] [hidemenubutton]b@menu-button show|hide
[start_keyconfig] [stop_keyconfig] [tb_keyconfig]b@shortcuts on|off
[autosave] [autoload]b@autosave @autoload
[nolog] [endnolog] [pushlog]b@backlog off|on @backlog-add "文" join=…
[configdelay] [autoconfig]b@config text-speed=… auto-wait=… auto-click-stop=…
[screen_full] [close] [title] [web]b@fullscreen @quit ask=… @window-title "…" @open-url "…"
[speak_on] [speak_off]c本文の読み上げは持たない(警告)

音

タグ分類.lim
[fadeoutbgm]a@stop-bgm fade=…(100ms より短い時間は 100ms)
[fadeinse]a@se … fade=…
[xchgbgm]a@bgm … fade=…(@bgm の fade は前の BGM も同じ時間で消す)
[pausebgm] [resumebgm] [pausese] [resumese]b@pause-bgm @resume-bgm @pause-se channel=… @resume-se channel=…
[changevol]b@bgm-volume 音量 fade=… / @se-volume 音量 channel=… fade=…(音量は 0〜100)
[bgmopt] [seopt]bvolume は設定画面の音量 @config bgm-volume=…、tag_volume は鳴っている音の音量 @bgm-volume …
[voconfig] [vostart] [vostop]b@voice-auto 名前欄の名前 pattern=… next=… folder=sound start=false / @voice-auto / @voice-auto-off({number} は {n}。sebuf は変換しない)

変数と実行の状態

タグ分類.lim
[clearvar]b@clear-vars all
[clearvar exp=f.x]a@set game.x = null
[clearsysvar]b@clear-vars system
[clearstack]b@clear-stack(stack=if、anim は意味がないので書き出さない)
[sleepgame] [awakegame] [breakgame]b@sleep-game 行き先 @awake-game keep-variables=… keep-bgm=… @break-game
[checkpoint] [rollback] [clear_checkpoint]b@checkpoint 名前 @rollback 名前 keep-variables=… keep-bgm=… @clear-checkpoint

[sleepgame] は実行器の状態で表せる。@sleep-game は今の状態(実行位置、局所変数、@call の戻り先、game.、画面)を セーブデータの sleep に取っておいて行き先へ飛び、@awake-game はそれに戻して画面を組み立て直す。呼び出しのスタックに 積むのではなく別に取っておくのは、TyranoScript と同じく、寄り道の先で何があっても(@call を重ねても)取っておいた時点へ丸ごと戻るため。 @checkpoint も同じ仕組みで、名前ごとに checkpoints に取っておく。どちらもセーブに入るので、寄り道の途中でセーブ、ロードしても戻れる。

TyranoBuilder のマクロ

タグ分類.lim
[tb_ptext_show] [tb_ptext_hide]—見た目の演出として標準の命令の変換表(packages/ks-import/src/std-tags)が @liminalia/std の命令に変換する。標準の変換表を使わないときは layer=2 の [ptext](anim=true なら [mtext])、[freeimage] に展開する
[tb_keyconfig]b@shortcuts on|off
[tb_replay id=…]b@replay-unlock id と @awake-game(回想として寄り道しているときだけ戻る)
[tb_replay_start]c回想の始めの片付けはシステム画面が回想を始めるときに行う(警告)
[tb_replay_image_button] [tb_cg_image_button]c鑑賞のボタンはシステム画面で作る(手作業)
[tb_fuki_start] [tb_fuki_stop]c吹き出しの表示は TextTheme で作る(手作業)
[lr]a{click}{br}

マクロ

[macro] 〜 [endmacro] は @define にする。取り込みでは、本文のファイル、data/scenario/system/ 下、[plugin] と [call] で読む プラグインの init.ks からマクロを集めて一つのファイル(既定は macros.lim)に置き、マクロを呼ぶファイルの先頭に @use macros を書く。 TyranoScript のマクロは定義したあとどこからでも呼べるので、.lim でも一か所にまとめる。convert を一つのファイルだけに使うときは、 そのファイルのマクロをそのファイルの @define にする。

  • 引数は、中身で使われている %名前、mp.名前 と、* を使うマクロでは呼び出し側が渡している名前。
  • 引数の型は、その引数を渡している命令の引数の型から決める([wait time=%t] なら時間、[chara_hide wait=%w] なら真偽)。 マクロからマクロへ渡すものがあるので、型が変わらなくなるまで繰り返して決める。決まらなければ文字列。
  • .ks のマクロの引数はどれも省略できる(省くと空の文字列になる)ので、@define の引数にもすべて既定値を付ける。 %名前|既定値 の既定値、なければ渡している命令の引数の既定値、それもなければ型ごとの空の値("" 0 false 0ms #000000)。
  • 引数名の _ は - にする(first_name → first-name)。中の式では - を _ に戻した名前で参照する({= first_name})。
  • %名前 は (名前)、mp.名前 は 名前、[emb exp=mp.名前] は {= 名前} になる。* はマクロの引数をすべてそのタグに渡す。
  • 中身の飛び先でファイルを省いたもの([jump target=*x])は、マクロを書いたファイルのラベル(TyranoScript はマクロをそのファイルで実行する)。
  • 呼び出し [greet who=レン] は @greet who=レン。引数の値は @define の型で書く(時間なら 300ms)。
  • &式、%名前 はマクロの外でも、どのタグの引数でも (式) になる。マクロの外の %名前|既定値 は既定値になる(引数がないため)。

変換しない(理由付きで報告する)もの:

診断内容
macro-direct(info)変換が直接扱うタグと同じ名前のマクロ(TyranoBuilder の tb_* など)。@define にせず、呼び出しは直接の変換を使う
macro-shadowed(info)TyranoScript のタグと同じ名前のマクロ。TyranoScript でも呼ばれない
macro-redefined同じ名前で中身の違うマクロが複数ある。先に見つけたもの(system/、プラグインを先に見る)を使う
macro-name macro-param-name.lim の名前にできないマクロ名、引数名
macro-labelマクロの中のラベル(@define の中にはラベルを置けないので、飛べない)
manual-scriptマクロの中の [iscript](mp を使う JS)
manual-entity&式、%名前 を、式として書き出せない位置(飛び先など)で使っている
entity-dropped(警告)&式、%名前 の値が変換で使われなかった(変換が値を比べるだけに使ったなど)