Liminalia

立ち絵の位置調整画面

lim dev の開発サーバーの中にある、cast.json の立ち絵の枠を画面で直すページ。 立ち絵プラグイン Tyrano Tatie(tatie)の TyranoBuilder 用の調整画面と同じ操作、同じ計算で動く。 開発サーバーだけのもので、lim build の書き出しには入らない。

lim dev [プロジェクト]
# プレイヤー:       http://localhost:5180/
# 立ち絵の位置調整: http://localhost:5180/__liminalia/cast

プレイヤーの右上(位置表示の下)の「立ち絵の位置調整」から開くと、そのとき表示している最初の立ち絵を選んだ状態で開く。 URL の ?who=キャスト&appearance=立ち絵セット&variant=差分&position=位置&bg=背景 でも選べる。

画面

  • 舞台は作品の画面サイズ(liminalia.json の screen)の領域を縮小して出す。縮小率は上の帯に出し、座標は常に作品の座標 (画面の外にはみ出した部分は暗くして見せ、取っ手もつかめる)
  • 背景: 作品の背景画像(assets/bgimage/)を一枚選んで敷ける(ブラウザに覚える)
  • 編集対象: キャラ → 立ち絵セット → 差分 → 位置。位置は差分の枠にある名前(left / center / right は必ずある)で、+で足せる
  • 枠のない差分(画像の実寸で画面下の中央に出るもの。TyranoScript の [chara_new] 由来)は、動かしたときに今の見え方と同じ枠を作る

操作

操作内容
ドラッグ今の位置の left / top を動かす
四隅、四辺の取っ手大きさを変える(反対側は動かさない)。「縦横比を固定」が既定
ホイール中心を保って拡大縮小。固定を外すと横だけ、Shift を押すと縦だけ
矢印キー1px(Shift で 10px)動かす
数値入力left / top / width / height。固定していれば幅と高さは連動
透過率編集中の立ち絵の不透明度(表示だけ)
全位置を表示同じ差分のほかの位置の枠を薄く重ねる
比較対象キャラ、セット、位置(「表示位置と同じ」か名前)、差分(一つか「全差分」)を半透明で重ねる。色フィルター(なし、赤、青、緑、マゼンタ、シアン、黄、モノクロ)と透過率
サイズ/Y を全差分へ同期今の差分の大きさの倍率と Y 位置を、同じ立ち絵セットの全差分へ写す(確認あり)
center 保存時にサイズ/Y をほかの位置へ同期center を選んで保存するとき、その差分のほかの位置の Y をそろえ、X は各位置の中心を保つ
差分の+画像をドロップ(またはファイルを選ぶ)→ 保存先、保存名、差分キーを決めて assets/fgimage/ 以下に保存し、差分を足す
立ち絵セットの+ / -立ち絵セットを足す、消す(最後の一つは消せない。画像のファイルは消さない)
キャラの+キャラを足す(話者に無い名前でもよい)
リセット今の差分の枠を、開いた時点/最後に保存した時点へ戻す
元に戻す、やり直すCtrl / ⌘ + Z、Ctrl / ⌘ + Shift + Z(100 手まで)
保存Ctrl / ⌘ + S

未保存の変更があるあいだは上の帯に出し、ページを離れるときに確かめる。

計算(tatie と同じ)

  • 全差分へ同期: 倍率は「今の差分の今の大きさ ÷ 基準の大きさ」(基準は開いた時点/最後に保存した時点の枠、 あとから足した差分は足したときの枠)。各差分の基準の大きさにこの倍率を掛け、どの位置も中心の X を保って top を今の位置の top にそろえる。今の差分の今の位置だけは今の left のまま。 比較表示で同じ立ち絵セットの差分を一つ重ねているときは、その差分は書き換えない(「全差分」の比較では除外しない)。 枠のない差分も書き換えない
  • center 保存時の同期: 今の差分のほかの位置の top を center の top にそろえ、left は基準の枠から中心の X を保つ
  • 差分を足すときの初めの枠: 基準の立ち絵(上書きならその差分、足すなら同じ立ち絵セットの normal → default → 最初の差分)と 新しい画像の、透明でない部分の外接矩形を比べる。倍率は「基準の体の高さ ÷ 新しい体の高さ」× 0.75 + 「幅の比」× 0.25。各位置で、外接矩形の中心 X と下端を基準に合わせる。基準が無いときは画面の高さに収め、 left / center / right を画面の幅の 1/4、1/2、3/4 に置く

保存

保存は開発サーバーが行う(POST /__liminalia/api/cast)。

  • 書く前に castProblems(@liminalia/lang)で検査し、誤りがあれば書かない
  • cast.json の cast(制作画面のキャラクターのタブが speakers も送ったときは speakers も)を置き換え、ほかの項目はそのまま残す。キャストの中の、 この画面が扱わない項目(立ち絵セットの label、差分の cacheKey、lip、blink、キャストの color など)も保つ
  • 前の版をプロジェクトの .liminalia/backups/cast-<日時>.json に写す(最新 20 件まで残す)。 ひな形の .gitignore は .liminalia/ を除く
  • 一時ファイルに書いてから rename する
  • 画面を開いた後に cast.json がほかで書き換えられていたら(lim import など)、上書きするかを確かめる
  • 差分を足すときの画像は、その場で assets/fgimage/ 以下に書く(同じ名前があれば確かめる)。同じ名前で上書きしたときだけ cacheKey を付け替えて、開いているプレイヤーが古い画像を出さないようにする(書き出しは素材の中身の鍵を自分で付ける)

保存すると、開いているプレイヤーに Vite の WebSocket のカスタムイベント liminalia:cast が届き、プレイヤーは cast.json を読み直して、今の状態から立ち絵を描き直す(ページは進めない)。

取り込みで作る cast.json

liminalia.json に import.tyrano がある作品の cast.json は lim import が作り直すので、そのままでは次の取り込みで調整が消える。 そこで保存のとき、取り込み元にも書き戻す。

  1. 取り込み設定(import.tyrano.profile の "./import")が writeCast を持てば、それを呼ぶ

    import type { TyranoImportProfile } from "@liminalia/ks-import";
    
    const profile: TyranoImportProfile = {
      // 保存したキャストを取り込み元へ書き、書き換えたファイルを返す(画面に出す)
      writeCast({ source, cast }) {
        return [];
      },
    };
    export default profile;
  2. 持たなければ、取り込み元に Tyrano Tatie の設定(data/others/plugin/tatie/settings.js)があればそれに書き戻す (writeTatieSettings、@liminalia/ks-import/node)

    • settings.js は実行せず、右辺のリテラル(文字列、数、真偽、null、配列、オブジェクト)として読み、整形した JSON を同じ形の代入文(window.TYRANO_TATIE_SETTINGS = {…};)にして書く。関数の呼び出しなどリテラルでないものがあれば読めないとしてエラーにする
    • 書くのは差分の storage(= image)と frame だけ。無いキャスト、立ち絵セット、差分は足す
    • 設定の知らない項目、defaultCharacter、frameReference、label、cacheKey は保つ
    • 枠のない差分は tatie では書けないので書かない(画面に知らせる)。消した立ち絵セット、差分は設定からは消さない
    • 旧形式(立ち絵セットのない、差分だけ)のキャストは、その一つの立ち絵セットだけなら旧形式のまま書き、 ほかの立ち絵セットを足すときは tatie の保存と同じく appearances の形に移す
    • 前の版はプロジェクトの .liminalia/backups/tatie-settings-<日時>.js に写す(最新 20 件まで)
  3. どちらも無ければ、画面の上に「次の取り込みで上書きされます」と出す