# 脱げ方の型辞書(2026-07-27)
#
# ■ なぜ要るか
#   衣装をチップ(タグ)で選べるようにするには、「見た目」だけでは足りない。
#   キャラは文字列1つを作れば済むが、衣装は場面別に4〜5個の文字列(状態)が要る。
#   チップを連結するだけでは「着衣」1つしか作れず、それは wildcards/sfw/outfit.txt の
#   カタログ40着とまったく同じ = 全場面で同じ服のまま(衣装パックにならない)。
#   → チップに「どう脱げるか」を持たせ、状態を自動生成する。それがこの辞書。
#
# ■ なぜ売れ筋データを待たなくていいか(2026-07-26 ユーザー指摘の切り分け)
#   「ニットはめくり上げる・着物はほどく」は物理で決まる話で、売れ筋が変わっても変わらない。
#   データ依存なのは「どの衣装をチップに載せるか(品揃え)」で、この辞書(機構)は非依存。
#   → 品揃えは docs/decisions/decision-log.md 2026-07-26 のとおりデータ着弾後に決める。
#
# ■ 状態は5段(現行パックは4段)
#   intro(着衣) / approach(着崩れ) / foreplay(前戯) / main(挿入) / climax(絶頂) / afterglow(余韻)
#   ★段の分け方は「露出量」ではなく「どこが動いたか」(外部レビュー 2026-07-27):
#     前戯=上を出す・下はまだ着ている / 挿入=下をずらす / 絶頂=下が落ちる・留め具が解ける
#   ★climax を足した理由: story preset の foreplay/main/climax の3フェーズが
#     pipeline/recipe.py の _PHASE_TO_STATE で main 1本に潰れており、
#     350枚の作品で 210枚(60%)が一字一句同じ衣装記述になっている。
#   ★後方互換: climax を持たない型/衣装は main を使う(既存6着は4段のまま動く)。
#
# ■ 差し込み口(slot)
#   {worn} = 着ている状態の完全な記述(例 "turtleneck sweater")。色・素材はここに乗る
#   {name} = 短い呼び名(例 "sweater")。脱げた状態を指すときに使う
#   空文字("")= その状態ではその部位を書かない(例: 上着は中盤以降は消える)

version: 1

types:

  # ── 上半身(かぶり)──────────────────────────────────────────
  lift:
    label_ja: めくり上げる
    note: かぶりの上半身(セーター・Tシャツ・カットソー)。脱がずに胸の上までめくる
    states:
      intro:     "{worn}, worn normally"
      approach:  "{worn}, hem lifted"
      foreplay:  "{name} pushed up above breasts, breasts exposed"
      main:      "{name} pushed up above breasts, breasts exposed"
      climax:    "{name} bunched up under her arms, breasts exposed"
      # ★2026-08-05: 「tossed aside」だけでは弱く、**余韻でTシャツを着たまま**だった(実測)。
      #   同じ回で短パンは「left on the floor」で確実に脱げていたので、その書き方に揃える。
      afterglow: "{name} taken off and left on the floor, bare shoulders, upper body bare"

  # ── 前開き(ボタン)──────────────────────────────────────────
  open:
    label_ja: 前を開く
    note: 前開き(シャツ・ブラウス・シャツワンピ・白衣)。ボタンを外して開く
    states:
      intro:     "{worn}, all buttons fastened, closed collar, opaque fabric, neatly and fully worn"
      approach:  "{worn}, a couple of top buttons undone, slightly off one shoulder, still wearing it"
      foreplay:  "{name} opened, buttons undone, breasts exposed"
      main:      "{name} opened, buttons undone, breasts exposed"
      climax:    "{name} fully open, hanging off her shoulders, breasts exposed"
      afterglow: "{name} slipped off and hanging from one arm, all buttons undone"

  # ── 下衣(ずらせないもの)── 2026-08-05 追加 ─────────────────────
  lower_down:
    label_ja: 下を脱ぎ下ろす
    note: |
      ズボン・短パン・ブルマなど「横にずらせない下衣」。前を開けて脚から下ろす。
      ★なぜ要るか(2026-08-05 実測): これが無く shorts を aside(ずらす)にしていたため、
        挿入の場面でも「gray shorts pulled aside」= **穿いたまま**で描かれていた。
        パンティなら横にずらせるが、ショートパンツやジーンズは物理的にずらせない。
        スカートは hike(たくし上げる)のままでよい(そちらは物理的に正しい)。
    states:
      intro:     "{worn}"
      approach:  "{worn}"
      # ★2026-08-06 修正(ユーザー実測「Tシャツのはずがブラウスが出てくる」の原因)。
      #   旧: "{name} unbuttoned and pulled down to her thighs"
      #   `unbuttoned` は短パンのボタンのつもりで書いたが、Danbooru で `unbuttoned` が
      #   付くのは**圧倒的にシャツ**。同じ1文の "white t-shirt" と重なって
      #   `open shirt`(148,733枚)へ引っ張られ、**上半身にボタンが生えていた**。
      #   ★裏取り: `collared shirt` 741,977枚 は `t-shirt` 97,360枚 の **7.6倍**。
      #     少しでも曖昧だと襟付きシャツに落ちる。曖昧にする語を置かないこと。
      #   ★実測: `unbuttoned` の無い導入13枚は正しくTシャツで描かれていた。
      foreplay:  "{name} pulled down to her thighs"
      main:      "{name} pulled down around one ankle, bottomless, lower body bare"
      climax:    "{name} off, bottomless, lower body bare"
      afterglow: "{name} left on the floor"

  # ── 巻き物 ─────────────────────────────────────────────────
  unwrap:
    label_ja: はだける
    note: 巻いて着るもの(着物・浴衣・バスローブ・作務衣)。帯(sash)と組で使う
    states:
      intro:     "{worn}, fully dressed"
      approach:  "{worn}, off one shoulder, open collar"
      foreplay:  "open {name}, pulled aside, breasts exposed"
      main:      "open {name}, pulled aside, breasts exposed, disheveled {name}"
      climax:    "{name} completely open, sleeves fallen off her arms, breasts exposed"
      afterglow: "{name} fallen open and pooled around her hips"

  sash:
    label_ja: 帯・紐(ほどける)
    note: 帯・腰紐。unwrap と組で使う。ほどける過程そのものが見せ場
    states:
      intro:     "{worn} tied neatly"
      approach:  "loosened {name}"
      foreplay:  "{name} undone"
      main:      "{name} undone"
      climax:    "{name} undone"
      afterglow: "{name} undone on the floor"

  # ── 体に沿うもの ───────────────────────────────────────────
  slide:
    label_ja: 引き下ろす
    note: 体に密着した一体もの(レオタード・ボディコン・チューブトップ)。下へずらす
    states:
      intro:     "{worn}, worn properly"
      approach:  "{name} strap slipping, one shoulder bare"
      foreplay:  "{name} pulled down, breasts exposed"
      main:      "{name} pulled down, breasts exposed, {name} crotch pulled aside"
      climax:    "{name} pulled down to her waist, breasts exposed"
      afterglow: "{name} pulled down around her hips"

  untie:
    label_ja: 紐をほどく(上)
    note: 紐で留める上半身(ビキニトップ・ホルターネック)。ほどけば落ちる
    states:
      intro:     "{worn}, fully worn"
      approach:  "{name} strap undone, one shoulder bare"
      foreplay:  "{name} pulled aside, breasts exposed"
      main:      "{name} pulled aside, breasts exposed"
      climax:    "{name} strings undone, falling off, breasts exposed"
      afterglow: "{name} untied and lying loose on her body, strings undone"

  untie_bottom:
    label_ja: 紐をほどく(下)
    note: |
      紐で留める下半身(ビキニボトム・紐パン)。
      ★untie と分けた理由(検証 2026-07-27): 上下に同じ型を使うと、ビキニのボトムに
        "one shoulder bare"(肩がむき出し)と "breasts exposed"(胸が露出)が付いた。
        上半身の文言を下半身に流用すると、絵と食い違う指示が混ざる。
    states:
      intro:     "{worn}, fully worn"
      approach:  "{name} strings loosened"
      foreplay:  "{worn}, still on"
      main:      "{name} pulled aside"
      climax:    "{name} untied and slipping off"
      afterglow: "{name} untied and lying loose"

  # ── 下半身 ─────────────────────────────────────────────────
  hike:
    label_ja: たくし上げる
    note: 裾のあるもの(スカート・ワンピの裾)。脱がずにまくる
    states:
      intro:     "{worn}"
      approach:  "{worn}"
      foreplay:  "{worn}"
      main:      "{name} hiked up"
      climax:    "{name} hiked up to her waist"
      afterglow: "{name} fallen around one ankle"

  aside:
    label_ja: ずらす
    note: 短い下衣・下着(ショートパンツ・パンティ)。ずらして使う
    states:
      intro:     "{worn}"
      approach:  "{worn}"
      foreplay:  "{worn}"
      main:      "{name} pulled aside"
      climax:    "{name} pulled off one leg"
      afterglow: "{name} caught around one ankle"

  # ── 下着 ───────────────────────────────────────────────────
  under_top:
    label_ja: ブラ(覗く)
    note: |
      ブラ。着衣では書かない → 着崩れで肩紐が覗く → 中盤は上を脱いでいるので書かない。
      ★under と分けた理由(検証 2026-07-27): ブラとパンティを1チップにすると呼び名が片方しか
        使えず、部屋着の着崩れの "bra strap showing" が "panties strap showing" になった。
    states:
      intro:     ""
      approach:  "{name} strap showing"
      foreplay:  ""
      main:      ""
      climax:    ""
      afterglow: ""

  under:
    label_ja: 下着(ずらす)
    note: |
      パンティ。着衣・着崩れでは書かない(上から見えない)→ 中盤でずらす。
      ★approach を空にした理由(検証 2026-07-27): "{name} strap showing" を使うと
        "panties strap showing"(パンティの肩紐)という絵にならない指示が出た。
        肩紐が覗くのはブラ = under_top の役割。
    states:
      intro:     ""
      approach:  ""
      foreplay:  ""
      main:      "{name} pulled aside"
      climax:    "{name} pulled off one leg"
      afterglow: "{name} caught around one ankle"

  # ── 見えない下着 ───────────────────────────────────────────
  hidden:
    label_ja: 見えない(最後まで書かない)
    note: |
      和装の白襦袢のように、上に着るものが厚く「絵に出ない」下着。全状態で何も書かない。
      ★書くと綱引きになる(検証 2026-07-27: 襦袢に approach/main を持たせたら、手書きに無い
        "undergarment strap showing" が振袖の着崩れに混ざった)。見えないものは書かないのが正しい。
      ★ずらして使う下着(ブラ・パンティ)は hidden ではなく under を使う。
    states:
      intro:     ""
      approach:  ""
      foreplay:  ""
      main:      ""
      climax:    ""
      afterglow: ""

  # ── 上着・小物 ─────────────────────────────────────────────
  shed:
    label_ja: 先に脱げる
    note: 羽織り物(カーディガン・パレオ・上着)。早い段階で落ちて中盤には無い
    states:
      intro:     "{worn}"
      approach:  "{name} off shoulders"
      foreplay:  ""
      main:      ""
      climax:    ""
      afterglow: ""

  keep:
    label_ja: 最後まで残る
    note: |
      小物(耳・カフス・網タイツ・ニーソ・眼鏡・アクセサリ)。残ることで衣装の個性が最後まで効く。
      ★中盤・絶頂に出すかは、チップ側の `keep_in_act` で決める(既定=出さない)。
        理由(検証 2026-07-27): バニーは小物5個あり、全状態に全部並べると中盤のプロンプトが
        "…breasts exposed, fishnet stockings, bunny ears, bow tie, cuffs, fluffy tail" と
        小物で埋まって露出語と綱引きになる([[prompt-is-a-tug-of-war]])。
        絵として衣装を定義する小物(耳・網タイツ)だけ keep_in_act: true にする。
      ★余韻には全部戻す(2026-07-23 決定「余韻=ほぼ全裸+衣装の個性1句」の individuality がここ)。
    states:
      intro:     "{worn}"
      approach:  "{worn}"
      foreplay:  "{worn}"
      main:      "{worn}"
      climax:    "{worn}"
      afterglow: "{name} still on"

# ── 余韻の共通接頭辞 ────────────────────────────────────────────
#   2026-07-23 の決定「余韻=ほぼ全裸 + 衣装の個性を1句」の実装。
#   全裸統一にすると6衣装が同じ絵になり衣装パックの意味が消えるため、
#   completely nude を先頭に置き、そのあとへ各部位の afterglow 記述を足す。
#   ★2つある理由(2026-07-27): 小物が残る衣装で "completely nude" を使うと
#     「全裸」と「まだ着ている」を同時に指示することになり、状態として矛盾する
#     (例: completely nude, bunny ears still on, cuffs still on)。
#     何も残らないときだけ completely nude、何かが残るときは nearly nude を使う。
afterglow_prefix: "completely nude"
afterglow_prefix_retained: "nearly nude"
