charset,UTF-8
descript
{
version,1
}

//########################################################################################
// ★ pasta 正典マッピング（単一の真実の源 / single source of truth）★
//----------------------------------------------------------------------------------------
// surface1000 を唯一の着せ替えサーフェスとし、1つのベース（xyz.png）へ
// 口・目・眉・うでの4軸を bind オーバーレイで積層合成する。
//   - 重ね順（背→前）: base(xyz) < 口(x) < 目(y) < 眉(z) < うで(w)
//   - 各軸内は排他（mustselect）。各軸のノーマル（標準）状態はベース(xyz)が担うため
//     差分PNGを持たず、透明キャンバス pasta/null.png を重ねる。
//   - 軸カテゴリ名（bind 第1引数）= 口 / 目 / 眉。
// descript.txt の bindgroup 定義および本ファイルの animation / ヘルパーサーフェスは
// 本表とバイト単位で一致させること。
// （emo2 は方式の参照であり bindgroup 番号は流用しない。）
//
// 口軸（mustselect, default=ノーマル）:
//   | bindgroup | パーツ名   | overlay surface | PNG            |
//   | 1100      | ノーマル   | surface1100     | pasta/null.png | (default)
//   | 1101      | びっくり   | surface1101     | pasta/x1.png   |
//   | 1102      | 笑顔       | surface1102     | pasta/x2.png   |
//   | 1103      | 不機嫌     | surface1103     | pasta/x3.png   |
//   | 1104      | 開く       | surface1104     | pasta/x4.png   |
//   | 1105      | もっと開く | surface1105     | pasta/x5.png   |
//
// 目軸（mustselect, default=ノーマル）:
//   | 1200      | ノーマル   | surface1200     | pasta/null.png | (default)
//   | 1201      | そらす     | surface1201     | pasta/y1.png   |
//   | 1202      | 注目       | surface1202     | pasta/y2.png   |
//   | 1203      | 閉じる     | surface1203     | pasta/y3.png   |
//   | 1204      | うわの空   | surface1204     | pasta/y4.png   |
//   | 1205      | びっくり   | surface1205     | pasta/y5.png   |
//   | 1206      | 半目       | surface1206     | pasta/y6.png   |
//
// 眉軸（mustselect, default=ノーマル）:
//   | 1300      | ノーマル   | surface1300     | pasta/null.png | (default)
//   | 1301      | 閉じる     | surface1301     | pasta/z1.png   |
//   | 1302      | 不機嫌     | surface1302     | pasta/z2.png   |
//
// うで軸（mustselect, default=ノーマル, 最前面）:
//   ベース(xyz)には右腕が描かれていないため、ノーマル＝腕なし(null.png)。
//   w*.png は腕だけを描いた透過キャンバス。原則 xyz.png と同寸(320×420)で (136,150) に置く。
//   例外 w3（ボール）は手が xyz キャンバス左外へ出るため窓と同寸(516×656)で (0,0) に置く。
//   口を指で隠すポーズがあるため 口/目/眉/まばたき/赤× より前面（animation ID 最大）に置く。
//   セキュリティボール(element3〜5)は腕より背面になるため、腕はボールと重ならない位置に描く
//   （w3 はボール全フレームの不透明域と非重複を確認済み）。
//   w*.png には腕の落ち影（影 element1 への差分。体・ボールで事前マスク済み）を腕の下敷きとして焼き込む。
//   原画（影なし）は 窓際のぱすたさん/doc/assets/arms/w*_arm.png、再生成は同 gen_arm_shadow.py。
//   | 1600      | ノーマル   | surface1600     | pasta/null.png | (default)
//   | 1601      | しーっ     | surface1601     | pasta/w1.png   |
//   | 1602      | またね     | surface1602     | pasta/w2.png   |
//   | 1603      | ボール     | surface1603     | pasta/w3.png   | (窓座標 0,0)
//
// 赤×トグル（独立トグル, default=OFF, 窓chrome・kisekaeではない）:
//   | bindgroup | パーツ名 | overlay surface | PNG                   |
//   | 1500      | 赤       | surface1510     | window/part_close_red.png |  (category=閉じる)
//
// セキュリティボール（前面オーバーレイ・webp 3レイヤー自動アニメ）:
//   最新SSP(2.7.38〜)の埋め込みアニメwebpを surface1000 へ element 3行で重ねるだけ。
//   SERIKO の interval/pattern によるコマ送り定義は持たない（webp自身がアニメする）。
//   着せ替えトグル(bindgroup/bindoption)も持たない。設計原典:
//   doc/assets/securityball/SECURITYBALL_WEBP実装.md（旧90枚SERIKO方式は廃止）。
//   z順(背→前): eback.webp(電子後面) < base_rings.webp(氷白ガラス＋3リング) < efront.webp(電子前面)。
//   配置: スプライト140×140 を overlay (42,334)（窓キャンバス上のボール中心 112,404）。
//########################################################################################


//########################################################################################
// surface0 — ベース「ぱすた」（全身ベース xyz.png）
// task 2.1: 透過背景でベースを表示する最小サーフェス。
//########################################################################################
surface0
{
element0,overlay,pasta/xyz.png,0,0
}


//########################################################################################
// surface10 — ケロ(\1)＝「窓」（縦書き試作・案C・2026-10-18）
// 重なり（奥→手前）: 窓＝kero(s1) → 縦書きバルーン(b0) → ぱすた＝sakura(s0)。
// 窓の見た目（枠・白スクリーン・走査線・灰×・浮遊影）をこちらへ移した。
// ぱすたの影は sakura 側（surface1000 の element1）に残す＝スクリーンに映る文字の上にも影が落ちる
// （腕の影も w*.png に焼き込みで sakura 側にあるので、体の影と前後が揃う）。
// 位置は sakura と同じ 516×656 キャンバス・同じ原点で重ねる（dic/tategaki.pasta の
// ＊窓あわせ が \![move,--base=0] で揃え、shell descript の seriko.sticky-window で一緒に動かす）。
//########################################################################################
surface10
{
element0,overlay,window/part_window.png,0,0
}


//########################################################################################
// surface1000 — 単一ベースサーフェスへ全表情を埋め込む着せ替えサーフェス
// element0 = 静的ベース（全身＋ノーマルの口/目/眉を内包）。
// その上に 口→目→眉→うで の4軸を bind オーバーレイで積層（animation ID 昇順＝背面）。
// z-order: 口(1100s) < 目(1200s) < 眉(1300s) < まばたき(1400) < 赤×(1500) < うで(1600s)。
//########################################################################################
surface1000
{
// 縦書き試作（案C）: 窓は kero(surface10) へ移した。ここは透明キャンバスの上に影・ぱすた・ボールだけ。
// canvas.png = 516×656 の透明キャンバス（座標・collision を窓キャンバスのまま保つため）。
//   ×ボタン(collision20)の範囲だけ、窓(part_window)の絵をそのまま不透明に写してある（奥の窓と同じ絵＝見た目は不変）。
//   α=1 の当たり板では SSP がマウスを拾わずホバーで赤くならなかったため（実機 2026-10-18）。
//   赤×は従来どおりこの surface の animation1500。再生成: 窓際のぱすたさん/doc/assets/gen_balloon_bg.py。
// 影(element1)は文字（バルーン b0）より手前＝スクリーンに映る文字の上にも影が落ちる。
element0,overlay,window/canvas.png,0,0
element1,overlay,window/part_pasta_shadow.png,38,28
element2,overlay,pasta/xyz.png,136,150

// ---- セキュリティボール（前面オーバーレイ・webp 3レイヤー自動アニメ）----
// 最新SSP(2.7.38〜)の埋め込みアニメwebpを element 3行で重ねるだけ（SERIKO interval/pattern 不要）。
// z順(背→前): eback(電子後面) < base_rings(氷白ガラス＋3リング) < efront(電子前面)。
// 全レイヤー overlay (42,334)＝窓キャンバス上のボール中心(112,404)。立ち絵(element2)の前面。
// ボールは左脇(太もも高さ)に浮遊し、まばたき(顔)・赤×(右上)と空間的に非重複。
// 設計原典: doc/assets/securityball/SECURITYBALL_WEBP実装.md。
element3,overlay,window/ball/eback.webp,42,334
element4,overlay,window/ball/base_rings.webp,42,334
element5,overlay,window/ball/efront.webp,42,334

// ---- collision（research §11。left,top,W,H → left,top,left+W,top+H,ID へ変換）----
// 反応ハンドラは別仕様＝領域定義のみ。lo（広域）を先、hi（詳細）を後に置き、
// 詳細領域が高インデックスとなるようにする。
// -- lo --（xyz移動 +38,+28 を反映済み）
collision0,206,163,311,285,顔
collision1,239,282,344,420,胴
collision2,346,397,404,519,うで左
collision3,213,420,344,478,腰
collision4,212,479,332,515,絶対領域
collision5,136,451,212,515,足右
collision6,273,517,455,569,足左
// -- hi --（xyz移動 +38,+28 を反映済み）
collision7,206,163,311,208,頭
collision8,217,207,263,237,おでこ右
collision9,263,197,304,222,おでこ左
collision10,226,238,252,266,目右
collision11,265,222,295,253,目左
collision12,303,216,315,260,耳左
collision13,246,254,265,270,鼻
collision14,257,270,272,285,口
collision15,227,269,255,281,ほお右
collision16,271,256,291,280,ほお左
collision17,244,284,323,306,さこつ
collision18,247,314,286,363,胸右
collision19,285,314,325,363,胸左
// -- クローズボタン（窓chrome＝非シフト。中心(453,38)・約46×32）--
collision20,430,22,476,54,閉じる
// -- セキュリティボール（前面オーバーレイ。中心(112,404)・約90×90）--
//   ボールは身体ではなく依代。身体タッチ反応の誤発火を防ぐため touch.pasta の
//   OnMouseMove で「閉じる」と同様に明示除外している（身体フォールバック対象外）。
collision21,67,359,157,449,セキュリティボール

// ---- 口軸 [背面] ----
animation1100.interval,bind
animation1100.pattern0,overlay,1100,0,136,150
animation1101.interval,bind
animation1101.pattern0,overlay,1101,0,136,150
animation1102.interval,bind
animation1102.pattern0,overlay,1102,0,136,150
animation1103.interval,bind
animation1103.pattern0,overlay,1103,0,136,150
animation1104.interval,bind
animation1104.pattern0,overlay,1104,0,136,150
animation1105.interval,bind
animation1105.pattern0,overlay,1105,0,136,150

// ---- 目軸 ----
animation1200.interval,bind
animation1200.pattern0,overlay,1200,0,136,150
animation1201.interval,bind
animation1201.pattern0,overlay,1201,0,136,150
animation1202.interval,bind
animation1202.pattern0,overlay,1202,0,136,150
animation1203.interval,bind
animation1203.pattern0,overlay,1203,0,136,150
animation1204.interval,bind
animation1204.pattern0,overlay,1204,0,136,150
animation1205.interval,bind
animation1205.pattern0,overlay,1205,0,136,150
animation1206.interval,bind
animation1206.pattern0,overlay,1206,0,136,150

// ---- 眉軸 [前面] ----
animation1300.interval,bind
animation1300.pattern0,overlay,1300,0,136,150
animation1301.interval,bind
animation1301.pattern0,overlay,1301,0,136,150
animation1302.interval,bind
animation1302.pattern0,overlay,1302,0,136,150

// ---- まばたき（自動ランダム・最前面）----
// emo2 のまばたき方式を参照（animation ID 1400 は 眉 1302 より大きく＝最前面に描画）。
// パターン: ①目閉じ+眉閉じ → ②目半目+眉閉じ → ③overlay,-1 でクリア＝ベースの通常顔へ復帰。
// interval,random,4: emo2 と同じ頻度で自然に瞬きを繰り返す。
// 2026-10-18: 目の状態でまばたきを切り替える（emo2 と同じ bind+random。着せ替え「まばたき」が ON の間だけ動く）。
//   ふつう（1400）＝ノーマル・半目の目。閉じる → 半目 → 開く。
//   閉じるだけ（1401）＝注目・そらす・うわの空・びっくり。半目のコマは左寄りの目なので抜く（視線が飛ばない）。
//   閉じた目ではどちらも OFF（半目のコマで目が開いて見えるため）。切り替えは scripts/pasta_dress.lua。
animation1400.interval,bind+random,4
animation1400.pattern0,overlay,1410,0,136,150
animation1400.pattern1,overlay,1411,120,136,150
animation1400.pattern2,overlay,-1,50,0,0
animation1401.interval,bind+random,4
animation1401.pattern0,overlay,1410,0,136,150
animation1401.pattern1,overlay,-1,150,0,0

// ---- 赤×トグル（ホバー時・最前面・bind連動）----
// クローズボタンのホバー赤化。bindgroup1500（descript.txt・Task 3）連動の interval,bind アニメ。
// ID 1500 は まばたき1400 より大きく＝最前面に描画。part_close_red は全面画像のため x,y=(0,0)。
animation1500.interval,bind
animation1500.pattern0,overlay,1510,0,0,0

// ---- うで軸（w: 最前面）----
// ID 1600 番台は 赤×1500 より大きく＝最前面に描画（人差し指が口パーツを覆う）。
// 腕はボール(element3〜5)・赤×(右上)と空間的に非重複。
animation1600.interval,bind
animation1600.pattern0,overlay,1600,0,136,150
animation1601.interval,bind
animation1601.pattern0,overlay,1601,0,136,150
animation1602.interval,bind
animation1602.pattern0,overlay,1602,0,136,150
animation1603.interval,bind
animation1603.pattern0,overlay,1603,0,0,0

// ※ セキュリティボールは surface1000 冒頭の element3/4/5（webp 自動アニメ）で実装。
//   ボールそのものの SERIKO animation 定義は持たない（旧 animation1700〜1705 は webp 化に伴い撤去）。

// ---- ボールに映す相手役（2026-10-18）----
// 相手役（おじさん・男の子・ギャル・妹）が話している間、ボールの手前にその人のシルエットを半透明で重ねる。
// bindgroup1700〜1703（descript.txt「ボール」）に連動。辞書（scripts/pasta_layout.lua）が 1 人だけ ON にする。
// 絵はボールの webp と同じ 140×140 なので、ボールと同じ (42,334) に置く。腕（1600 番台）とは重ならない。
// 再生成: 窓際のぱすたさん/doc/assets/securityball/gen_ball_silhouettes.py。
animation1700.interval,bind
animation1700.pattern0,overlay,1700,0,42,334
animation1701.interval,bind
animation1701.pattern0,overlay,1701,0,42,334
animation1702.interval,bind
animation1702.pattern0,overlay,1702,0,42,334
animation1703.interval,bind
animation1703.pattern0,overlay,1703,0,42,334
}


//########################################################################################
// surface1000 用ヘルパーサーフェス（animation ID と同番号 / 正典マッピング表どおり）
//########################################################################################

// ---- 口軸（x） ----
surface1100
{
element0,overlay,pasta/null.png,0,0
}
surface1101
{
element0,overlay,pasta/x1.png,0,0
}
surface1102
{
element0,overlay,pasta/x2.png,0,0
}
surface1103
{
element0,overlay,pasta/x3.png,0,0
}
surface1104
{
element0,overlay,pasta/x4.png,0,0
}
surface1105
{
element0,overlay,pasta/x5.png,0,0
}

// ---- 目軸（y） ----
surface1200
{
element0,overlay,pasta/null.png,0,0
}
surface1201
{
element0,overlay,pasta/y1.png,0,0
}
surface1202
{
element0,overlay,pasta/y2.png,0,0
}
surface1203
{
element0,overlay,pasta/y3.png,0,0
}
surface1204
{
element0,overlay,pasta/y4.png,0,0
}
surface1205
{
element0,overlay,pasta/y5.png,0,0
}
surface1206
{
element0,overlay,pasta/y6.png,0,0
}

// ---- 眉軸（z） ----
surface1300
{
element0,overlay,pasta/null.png,0,0
}
surface1301
{
element0,overlay,pasta/z1.png,0,0
}
surface1302
{
element0,overlay,pasta/z2.png,0,0
}

// ---- うで軸（w） ----
surface1600
{
element0,overlay,pasta/null.png,0,0
}
surface1601
{
element0,overlay,pasta/w1.png,0,0
}
surface1602
{
element0,overlay,pasta/w2.png,0,0
}
// 窓同寸キャンバス（animation1603 は 0,0 に配置）
surface1603
{
element0,overlay,pasta/w3.png,0,0
}

// ---- ボールに映す相手役（animation1700〜1703 が (42,334) に配置）----
surface1700
{
element0,overlay,window/ball/sil_ojisan.png,0,0
}
surface1701
{
element0,overlay,window/ball/sil_boy.png,0,0
}
surface1702
{
element0,overlay,window/ball/sil_gal.png,0,0
}
surface1703
{
element0,overlay,window/ball/sil_imouto.png,0,0
}

// ---- まばたきアニメ用 合成サーフェス（emo2 まばたき helper 1410 番台に倣う）----
// 目と眉を1枚に合成: element0=目[背面] / element1=眉[前面]（z-order 目<眉 に整合）。
// まばたき①: 目閉じ(y3) + 眉閉じ(z1)
surface1410
{
element0,overlay,pasta/y3.png,0,0
element1,overlay,pasta/z1.png,0,0
}
// まばたき②: 目半目(y6) + 眉閉じ(z1)
surface1411
{
element0,overlay,pasta/y6.png,0,0
element1,overlay,pasta/z1.png,0,0
}

// ---- 赤×（ホバー時に最前面へ重ねる）----
surface1510
{
element0,overlay,window/part_close_red.png,0,0
}


//########################################################################################
// マウスカーソル定義（SSP/ukadoc 準拠: sakura.cursor ブロック）
// collision 領域上にカーソルが乗ったとき（mouseup＝ホバー）の形状を指定する。
// 立ち絵の全身領域（collision0〜19）に system:hand（手）を割り当て、
// 「触れられる」ことを直感的に示す。窓×（閉じる）はカーソル変更しない（OS標準のまま）。
// 領域名は surface1000 の collision 名と一致させること（正典）。
//########################################################################################
sakura.cursor
{
mouseup0,顔,system:hand
mouseup1,胴,system:hand
mouseup2,うで左,system:hand
mouseup3,腰,system:hand
mouseup4,絶対領域,system:hand
mouseup5,足右,system:hand
mouseup6,足左,system:hand
mouseup7,頭,system:hand
mouseup8,おでこ右,system:hand
mouseup9,おでこ左,system:hand
mouseup10,目右,system:hand
mouseup11,目左,system:hand
mouseup12,耳左,system:hand
mouseup13,鼻,system:hand
mouseup14,口,system:hand
mouseup15,ほお右,system:hand
mouseup16,ほお左,system:hand
mouseup17,さこつ,system:hand
mouseup18,胸右,system:hand
mouseup19,胸左,system:hand
}
