================================================================================
  ランダムテキストジェネレーター A-EGG  README
================================================================================

【概要】
  本ツールは、セリフライブラリに登録されたセリフを核としてランダムに組み合わせ、
  さまざまな変換・加工を施してテキストを生成するツールです。

  喘ぎ声ジェネレーターのカスタマイズ性とセリフ管理機能を融合させ、
  単調になりがちな文脈から、より抑揚のついたセリフ作りを支援することを目的としております。

【免責】
・本ソフトウェアの著作権は作者に帰属します。
・本ソフトウェアは現状のまま提供され、動作保証はありません。
・本ソフトウェアの利用または利用不能により生じた損害について、作者は責任を負いません。
・初回起動時にWindowsのSmartScreen警告が表示される場合があります。実行可否は内容を確認のうえ、ご自身の判断で行ってください。
・重要なデータは事前にバックアップしてください。


【起動方法】
  run.bat をダブルクリックしてください。インストールは不要です。

【アンインストール方法】
  A_EGGディレクトリを削除するだけです。userfile配下以外にファイル読み書きは行いません。

【動作確認】
  Windows 10 / 11
  日本語環境（セリフ・入力の仕様上意図的に全角を使用しているため、日本語環境以外の動作は保証しません）

【製作者】
  sato_Lab_vo
  https://x.com/sato_Lab_vo



【ウィンドウ構成】

  ┌─────────────────────────────────────────────┐
  │              メインウィンドウ                        │
  │   ランダムテキストジェネレーター A-EGG               │
  └──┬──┬──┬──┬──┬──┬────────────────────────┘
     │  │  │  │  │  │
     │  │  │  │  │  └─── [F] プリセット
     │  │  │  │  │          設定を名前付きで保存・呼び出し・削除
     │  │  │  │  │
     │  │  │  │  └────── [E] フロー図
     │  │  │  │             処理ステップを色分け差分表示で確認
     │  │  │  │
     │  │  │  └─────── [D] セリフボタン
     │  │  │                セリフをボタン1クリックで入力欄に追加
     │  │  │
     │  │  └──────── [C] セリフライブラリ
     │  │                 セリフの一覧・追加・編集・削除・類似チェック
     │  │
     │  └───────── [B] 文字置換設定
     │                  固定ルール・カスタムルールで置換文字を定義
     │
     └────────── [A] ランダマイザー設定
                     各設定のランダム適用範囲をスライダーで制御


================================================================================
  基本的な使い方
================================================================================

------------------------------------------------------------------------
  STEP 1  セリフを入力する
------------------------------------------------------------------------
  テキスト生成のもとになるセリフを入力欄に用意します。
  方法は2つあります。どちらも組み合わせて使えます。

  ▼ 直接入力
      メイン画面の入力欄にセリフを直接テキスト入力します。
      複数セリフを入力する場合は分割文字（半角スペース/全角スペース、読点「、」など）で区切ってください。
      入力したセリフはそのまま生成に使われます。
      空の場合はセリフライブラリ（後述）から、パラメータ「単語数」の数だけランダムに抽出します。

  ▼ セリフボタン [D] から追加
      「セリフボタン」ウィンドウを開くと、ライブラリのセリフがボタンで表示されます。
      ボタンをクリックすると入力欄にセリフが追加されます。
      行フィルターや☆フィルターで絞り込みも可能です。

  ▼ 入力モードの選択
      ・ランダム順  : 入力したセリフをランダムな順序で抽出（パラメータ「単語数」の数だけ抽出します）
      ・入力順に準拠: 入力した順序を優先して抽出

------------------------------------------------------------------------
  STEP 2  文章生成する
------------------------------------------------------------------------
  入力欄にセリフが揃ったら「文章生成」ボタンを押してください。
  出力欄にランダム加工済みのテキストが表示されます。

  生成結果はクリップボードにコピーして利用できます。

  「フロー図」[E] ボタンを開いておくと、生成の度に①〜⑬の各加工ステップで
  テキストがどのように変化したか色分きで確認できます。
  設定の効果を確認しながら調整する際に活用してください。

------------------------------------------------------------------------
  STEP 3  ルールを調整する
------------------------------------------------------------------------
  メイン画面のスライダーやチェックボックスで加工の種類・強さを変えられます。
  主な設定項目は以下のとおりです。各設定にマウスホバーすると簡単な説明が表示されます。
  （詳細は後述の各機能説明を参照）

  ■ セリフ数セクション
      生成に使うセリフの数（1〜20）と、1セリフあたりの文字数上限を指定します。

  ■ セリフ中割セクション
      セリフ内の各文字の後ろに母音・同音・っ・記号を確率的に挿入します。

  ■ 区切り文字セクション
      セリフ間に挿入する記号の種類・確率・連続数を指定します。

  ■ 頭文字復唱セクション
      各セリフの頭文字を確率的に本体の前に繰り返します（例: は、はる）。

  ■ 末尾母音セクション
      セリフ末尾に母音を付加し、小文字化・置換文字・っ追加なども設定できます。

  ■ 文字種セクション
      出力テキスト全体をひらがな・カタカナ・ランダムに変換します。

  ■ 濁点セクション
      セリフの濁点を事前除去したり、生成後に濁点を追加したりできます。

  ■ 置換セクション
      指定した文字を別の文字に置き換えます（[B] ウィンドウでルール管理）。

------------------------------------------------------------------------
  STEP 4  設定を保存する（プリセット）[F]
------------------------------------------------------------------------
  気に入った設定はプリセットとして名前を付けて保存できます。
  「プリセット」ボタン → 名前を入力 → 「保存」で登録完了です。
  次回以降はリストから選んで「プリセット読み込み」で即座に再現できます。

  ※ 設定はアプリを閉じると自動で保存され、次回起動時に復元されます。


================================================================================
  おすすめの使用方法
================================================================================

  ■ セリフライブラリのインポート
      重複セリフや類似セリフは後で自動検出できますので、まずは自作のセリフ文章の丸々インポートをお勧めします。
      インポートの際の「追加確認」ウインドウでは、Enterキーで分割・右クリックで無効等操作できます。
      インポート完了後に全件類似チェックを行い、類似セリフを大まかに削除します

  ■ セリフボタンで☆振り分け
      使いやすい・お気に入りのセリフがありましたら☆5～☆4に移動
      不要セリフは右クリックで☆0に移動、のちに削除を行います。

  ■ セリフボタンの☆5～☆4を適当にクリック
      ある程度洗練されたセリフ群が直接入力欄に入力されます

  ■ フロー図を確認しながら文章生成
      極端な処理を行っている部分を抑える方向でパラメータを調整します

  ■ ランダマイザーの「メイン設定変更」で微調整
      有効確率80%、変動率20%程度とすると、全体のパラメータがわずかに動きます。
      これで抑揚に僅かなランダム性を作ることが可能です。

  ■ プリセット保存
      使えるパラメータが完成次第、プリセット保存を行います。


================================================================================
  セリフライブラリ[C]の概要
================================================================================

  セリフライブラリは生成のもとになるセリフの保管庫です。
  「セリフライブラリ」ボタン [C] から管理できます。

  ■ セリフの登録
      セリフライブラリウィンドウの入力欄にセリフを入力して「保存」します。
      分割文字設定に基づき複数セリフを一括登録できます。
      登録時/登録後も重複チェック・類似チェックを自動で行えますので、
      ユーザ様作成のセリフ文章をインポートすることも可能です。

  ■ ☆評価
      各セリフに☆0〜☆5の優先度を設定できます。
      セリフボタン [D] では☆評価ごとにボタン色が変わり、
      ☆ランダム入力機能で特定の☆のセリフをランダム抽出できます。

  ■ メンテナンス機能
      ・全件類似チェック: 似たセリフのペアを検出して整理できます
      ・全件置換        : ライブラリ内のセリフを一括置換できます


================================================================================
  セリフボタン[D]の概要
================================================================================

  「セリフボタン」ボタンから開きます。ライブラリのセリフをボタン一覧で表示し、
  クリックするだけで入力欄にセリフを追加できます。

  ■ 行フィルター
      あ行〜わ行・ん・記号 のボタンで表示を絞り込みます。
      同じボタンを再クリックすると全表示に戻ります（排他トグル）。

  ■ ☆ランダム入力
      ☆0〜☆5 のボタンをクリックすると、フィルター内の該当☆のセリフから
      ランダムに1件を選んで入力欄に追加します。

  ■ ボタンの色と☆評価
      ☆5: オレンジ  ☆4: 黄緑  ☆3: 緑  ☆2: シアン  ☆1: 青  ☆0: グレー
      ドラッグ＆ドロップでボタンを☆セクションへ移動して☆評価を変更できます。
      右クリックで☆0に即移動できます。
      ☆0はランダム選択からも除外されるなど、優先度の低いセリフとなります。


────────────────────────────────────────────────────────────────────────────────
  ☆機能の概要
────────────────────────────────────────────────────────────────────────────────

  ■ ☆0はランダム選択から除外
      テキスト生成時、☆0 のセリフは選択対象から外れます。
      ☆0 は「当面使わないが削除はしたくない」セリフの一時保管場所として使えます。

  ■ ☆が高いほど選ばれやすい（テキスト生成時）
      テキスト生成でセリフを選ぶ際、☆の値がそのまま選択の重みになります。
      ☆5 は☆1 の5倍の確率で選ばれるため、よく使いたいセリフを高☆にすると
      生成結果に反映されやすくなります。

  ■ セリフボタンの [☆ランダム入力] について
      セリフボタン画面の [☆N] ボタンは、そのグループのセリフを均等ランダムで
      1件選んで入力欄に追加します（☆0 ボタンも押せますが候補がなければグレーアウト）。
      こちらは重みなしの均等選択で、テキスト生成時の重み付き選択とは別の仕組みです。

  ■ 運用のヒント：削除前に☆0へ
      「いずれ削除するかもしれないが、今すぐは消したくない」セリフは
      右クリックで☆0 に移動しておくと、生成結果に影響させずデータを残せます。
      整理の際に☆0 をまとめて確認・削除すると管理しやすくなります。

────────────────────────────────────────────────────────────────────────────────
  フロー図[E]の概要
────────────────────────────────────────────────────────────────────────────────

  ■ 何ができるか
      「フロー図」[E] は、テキスト生成の処理順と各ステップの変化を確認する画面です。
      設定調整時の確認や、意図しない変換が起きたときの切り分けに使えます。

  ■ 差分表示の見方（処理後メッセージ）
      緑背景は「追加・変更された差分」、赤背景＋取り消し線は「削除された差分」を示します。
      どの処理で何が増減したかを、ステップごとに追えます。

  ■ グレーアウト表示の意味
      確率0%やOFFなどで実行されなかった処理は、フロー上でグレーアウト表示されます。
      その生成では「スキップされた処理」であることを示します。

────────────────────────────────────────────────────────────────────────────────
  文字置換設定[B]の概要
────────────────────────────────────────────────────────────────────────────────

  ■ 何ができるか
      「文字置換設定」[B] は、生成時に適用する置換ルールを管理する画面です。
      表記ゆれの統一や、作品ごとの語彙への置換に使えます。

  ■ 固定ルールとカスタムルールの違い
      固定ルールは、用意済みのプレースホルダー（例: 主A〜精B）の置換先を決める方式です。
      カスタムルールは、任意の「元文字 → 置換文字」を自由に追加する方式です。

  ■ 固定ルールの入力元
      固定ルール用のプレースホルダーは、メイン画面の「主A」～「精B」ボタンなどから入力できます。
      そのため、本文側にプレースホルダーを入れておき、生成時に一括置換する運用が可能です。

  ■ セリフライブラリとの連携
      セリフライブラリの「全件置換」を使うと、ライブラリ内のセリフを固定ルール用の表記に
      まとめて置き換えられます。事前に整備しておくと運用が安定します。

────────────────────────────────────────────────────────────────────────────────
  ランダマイザー設定[A]の概要
────────────────────────────────────────────────────────────────────────────────

  ■ 何ができるか
      「ランダマイザー設定」[A] は、各設定をどの範囲でランダム変更するかを決める画面です。
      生成結果の幅を広げつつ、崩したくない条件は残す運用ができます。

  ■ スライダーの意味（概要）
      各項目のスライダーは「ランダムで選ばれる範囲」を決めるためのものです。
      操作記号や挙動の詳細は、この後の「【スライダーの操作方法（共通）】」で説明しています。

  ■ ランダム実行ボタンの使い方
      1) 各項目の有効/無効と範囲を決める
      2) 「ランダム実行」ボタン（緑）を押す
      これで、指定範囲内で設定が一括ランダム適用されます。

  ■ メイン設定変更ボタンの使い方
      「メイン設定変更」を押すと、有効確率・変動率・記号固定の条件を使って、
      メイン画面側の各設定値を直接ランダム変動できます。

────────────────────────────────────────────────────────────────────────────────
  プリセット[F]の概要
────────────────────────────────────────────────────────────────────────────────

  ■ 何ができるか
      「プリセット」[F] は、現在の設定一式を名前付きで保存し、後から同じ状態を再読み込みできます。

  ■ プリセット保存/読み込みで反映される主な項目
      ・メイン画面の各設定値
        （セリフ数、セリフ文字数制限、セリフ中割、区切り文字、頭文字復唱、
         末尾母音、文字種、濁点、置換ON/OFF、直接入力モード など）
      ・メイン画面スライダーの制御範囲
        （□■の現在値だけでなく、△▲の制御ハンドル範囲）
      ・ランダマイザー設定[A]の各項目
        （有効/無効、最小〜最大、選択候補、制御ハンドル範囲 など）
      ・文字置換設定[B]のルール一式
        （固定ルール＋カスタムルール、有効/無効、置換確率を含む）

  ■ 補足
      変更中の状態は「last_current」として自動保存され、同名プリセットから復元できます。


================================================================================
  各機能の詳細説明
================================================================================

------------------------------------------------------------------------
【スライダーの操作方法（共通）】
------------------------------------------------------------------------
  メイン画面・各設定ウィンドウには2種類のスライダーが使われています。

  ■ 1) スライダーの種類
      ・レンジスライダー:
        最小値〜最大値の「範囲」を決めるスライダーです。
        例: 10〜30 のように、2点を同時に指定します。
      ・シングルスライダー:
        値リスト（0% / 5% / 10% ... など）から「1つ」を選ぶスライダーです。
        ハンドルをドラッグ、またはトラック上クリックで値を切り替えます。

  ■ 2) ハンドル記号の意味（共通）
      ・□ 最小ハンドル（メイン）:
        現在の最小値です。右に動かすと最小値が上がります。
      ・■ 最大ハンドル（メイン）:
        現在の最大値です。左に動かすと最大値が下がります。
      ・△ 下限の制御ハンドル:
        メインハンドルが動ける「左端（下限）」を決めます。
      ・▲ 上限の制御ハンドル:
        メインハンドルが動ける「右端（上限）」を決めます。

  ■ 3) 使い分けのイメージ
      ・□■ は「今回使う値（現在値）」を決めるハンドル
      ・△▲ は「□■ が動ける範囲（許可範囲）」を決めるハンドル
      先に △▲ で許可範囲を絞っておくと、ランダム化しても意図しない極端な値になりにくくなります。

  ■ 4) 制御ハンドルを動かしたときの挙動
      ・△ を右へ動かして現在値より大きくした場合:
        □ や ■ が下限未満なら、自動で△の位置まで引き上げられます。
      ・▲ を左へ動かして現在値より小さくした場合:
        □ や ■ が上限超過なら、自動で▲の位置まで引き下げられます。
      つまり、常に「メインハンドルは △〜▲ の内側」に保たれます。

------------------------------------------------------------------------
【1】単語数
------------------------------------------------------------------------
  ■ 単語数（レンジスライダー）
      生成に使うセリフの最小数〜最大数を指定します（範囲: 1〜20）。
      毎回この範囲内でランダムにセリフ数が決まります。
      直接入力セクションの「入力順に準拠」が選択されている場合は、このパラメータは無視されます。

  ■ 単語文字数制限（シングルスライダー）
      各セリフを指定の文字数に切り詰めます（1〜9字 / 無制限）。
      「無制限」を選ぶと元のセリフがそのまま使用されます。

------------------------------------------------------------------------
【2】単語中割
------------------------------------------------------------------------
  セリフの各文字（最終文字を除く）の後ろに文字を挿入する機能です。
  処理順: 同音 → 母音 → 記号 → っ（独立判定）

  ■ 中割母音追加確率
      各文字の後ろに「その文字の母音」を挿入します。
      例: 「はる」→「はある」
      ー・っ/ッ・非仮名はスキップされます。

  ■ 中割同音追加確率
      各文字の後ろに「同じ文字」を挿入します。
      例: 「はる」→「ははる」
      ー・っ/ッ・非仮名はスキップされます。

  ■ 中割っ追加確率
      各文字の後ろに「っ」を挿入します。
      「っ」が連続する場合は追加されません。
      例: 「はる」→「はっる」

  ■ 中割記号追加確率 / 中割記号
      各文字の後ろに指定した記号を挿入します。
      記号は入力欄で自由に設定できます。

  ■ 追加後小文字確率
      中割で挿入した文字を小文字（拗音・促音）に変換する確率です。

  ■ 追加後カタカナ確率
      中割で挿入した文字をカタカナに変換する確率です。

  ■ 中割制限数（レンジスライダー）
      1文章全体の中割挿入回数の上限（最小〜最大）を設定します。
      内部処理は「候補を先に全収集→制限数で抽選→挿入順で反映」です。
      0〜0 のときのみ制限なし、0〜N の設定で抽選が0になった場合は 1 扱いになります。

------------------------------------------------------------------------
【3】区切り文字
------------------------------------------------------------------------
  セリフとセリフの間に挿入する区切り文字の設定です。

  ■ 区切り文字追加確率
      各セリフ間に区切り文字を挿入する確率です（0〜100%）。

  ■ なし時半SP
      区切り文字が挿入されなかった場合に、代わりに半角スペースを入れます。

  ■ 区切り後半SP
      区切り文字の後ろに半角スペースを追加します。

  ■ 区切り文字
      使用する区切り文字を選択します
      （空、「、」「。」「♡」「★」「～」「！」「♪」「・」「ー」など）。

  ■ 区切り 連続数（レンジスライダー）
      区切り文字を連続して挿入する回数の範囲（最小〜最大）です。

------------------------------------------------------------------------
【4】頭文字復唱
------------------------------------------------------------------------
  ■ 頭文字復唱 確率
      各セリフの頭文字をセリフの前に繰り返す（復唱する）確率です。
      例: 「はる」→「は、はる」

  ■ 復唱区切り文字
      復唱した頭文字と本体のセリフの間に挿入する区切り文字です。
      例: 「、」→「は、はる」

------------------------------------------------------------------------
【5】末尾母音
------------------------------------------------------------------------
  最後（または各）セリフの末尾に母音を付加する機能です。

  ■ 末尾母音 連続数（レンジスライダー）
      付加する母音の最小〜最大の個数です（0〜10）。
      例: 「おはよう」→「おはようう」

  ■ 小文字確率
      付加した母音を小文字（例: ぁぃぅぇぉ）にする確率です。
      例: 「おはよう」→「おはようぅ」

  ■ 最終セリフ強化係数
      最後のセリフに対して末尾母音が付きやすくなる倍率です（100〜1000%）。
      内部的には最終セリフだけ、連続数の最小/最大に倍率を掛けた値で再計算します。

  ■ 仮名以外スキップ（チェックボックス）
      末尾文字が仮名でない場合は末尾母音を付加せず、1文字繰り上がって末尾母音の処理を行います。
      実装上は「末尾から仮名を探索して、その位置へ母音を追加する」動きです。
      例: 「おはよう！」→「おはようぅ！」

  ■ 末尾「っ」スキップ（チェックボックス）
      ON の場合、末尾が「っ/ッ」のときは1文字繰り上がって末尾母音の処理を行います。
      元の「っ/ッ」は末尾に残します。
      例: 「おはようっ」→「おはようぅっ」　末尾「っ」ではなく、1文字繰り上がった「う」に対して処理

  ■ 末尾母音 置換文字 / 置換確率
      付加した母音を別の文字（記号など）に置き換える機能です。
      母音1文字ごとに確率判定され、置換文字は先頭1文字のみ使用されます。

  ■ 末尾っ追加確率
      末尾母音の後ろに「っ」を追加する確率です。

  ■ 末尾母音の文字種
      メイン画面では「オリジナル / ランダム」を選択します。
      ・オリジナル: 元単語末尾の仮名の文字種（ひらがな/カタカナ）に合わせる
      ・ランダム  : 「ランダム時カタカナ確率(末尾母音)」で文字種を決定
      （0%の場合はひらがな固定、100%の場合はカタカナ固定となります）

------------------------------------------------------------------------
【6】文字種
------------------------------------------------------------------------
  生成テキスト全体の文字種を変換する機能です。

  ■ 全体の文字種
      ・オリジナル    : 変換なし
      ・完全ランダム  : 1文字ずつランダムにひらがな/カタカナを選択
      ・単語毎ランダム: 単語単位でランダムにひらがな/カタカナを選択

  ■ ランダム時カタカナ確率
      「完全ランダム」「単語毎ランダム」を選んだときのカタカナ出現率です。
      （0%の場合はひらがな固定、100%の場合はカタカナ固定となります）

------------------------------------------------------------------------
【7】濁点
------------------------------------------------------------------------
  ■ 事前濁点除去確率
      生成前にセリフから濁点を除去する確率です。

  ■ 除去判定
      ・セリフ判定  : セリフ全体に対して1回判定
      ・1文字ずつ判定: 各文字ごとに判定
      例: 「お゛お゛ほぉつぐっ」
      　セリフ判定 → 「おおほぉつくっ」1回判定適合でセリフ全体を除去処理
      　1文字ずつ判定：「おお゛ほぉつぐっ」1文字ずつ判定～除去処理


  ■ 除去種別
      正濁点（゛）・偽濁点（゛を模した記号）・両方 から選択します。
      例: 「お゛お゛ほぉつぐっ」偽濁点除去 →「おおほぉつぐっ」

  ■ 濁点種別
      追加する濁点の種類を選択します（正濁点 / 偽濁点を含む）。

  ■ 濁点追加確率
      生成後のテキストに濁点を追加する確率です。

  ■ 濁点追加モード
      ・セリフのみ: セリフ部分にのみ濁点を追加　処理フローの⑥で処理されます。
      ・全体      : 区切り文字なども含む全体に追加　処理フローの⑫で処理されます。

------------------------------------------------------------------------
【8】置換
------------------------------------------------------------------------
  「文字置換設定」[B] ウィンドウで設定したルールに基づき文字を置換します。

  ■ 置換ON/OFF
      置換機能全体を有効/無効にします。

  ■ 事前置換
      中割・末尾母音などの処理前に置換します（セリフ段階で置換）。
      処理フローの③で処理されます。

  ■ 全体置換
      すべての処理が完了した後で置換します（最終出力に対して置換）。
      処理フローの⑫で処理されます。

  ■ 置換の両実行
      「事前置換」「全体置換」は両方ONにでき、その場合は両方実行されます。
      置換確率を設定している場合は2回判定が発生する点ご注意ください。

------------------------------------------------------------------------
【9】直接入力モード
------------------------------------------------------------------------
　テキストボックスに入力されたセリフを元に、テキストが生成されます。
  セリフライブラリ・セリフボタンからの入力、
  入力欄にセリフを直接テキスト入力、プレースホルダー記法による入力を行うこともできます。

  ■ セリフライブラリ・セリフボタンからの入力
      ・「セリフライブラリを開く」: セリフ管理画面を開き、登録・編集した内容を直接入力に活用できます。
      ・「セリフボタンを開く」    : ボタンをクリックして入力欄へセリフを追記できます。

  ■ 入力モード
      ・ランダム順  : 入力したセリフをランダムな順序で使用
      ・入力順に準拠: 入力した順序を優先して使用

  ■ 入力欄が空の場合
      保存済みセリフから、単語数（最小〜最大）に従って自動抽出します。
      抽出の際は☆の影響を受け、☆が高いほど選ばれやすく、☆0は除外されます。

  ■ 直接入力の内部仕様（プレースホルダー記法）
      直接入力では以下の記法が使用できます（保存済みセリフ参照）。
      ・＄あ      : 頭文字一致で抽出
      ・＄＄あ    : 母音一致で抽出
      ・＄？文字列: 部分一致で抽出（記号除去・小文字かな正規化あり）
      ・＄？？    : 全件から抽出（☆重みあり）
      ・◇N       : 最低☆値指定（例: ◇3）

      繰り返し構文　上記プレースホルダーの後ろに組み合わせて使用します
      ・｛N｝   　：直前の同一単語をN回繰り返す　繰り返す際は区切り有
      ・｛｛N｝｝　：直前の同一単語をN回繰り返す　繰り返す際は連結
      ・〔N〕   　：直前の単語をN回選出して出力　単語間は区切り有
      ・〔〔N〕〕 : 直前の単語をN回選出して出力　単語間は連結

      区切った場合は、区切り毎で1セリフ扱い、連結した場合は全てまとめて1セリフ扱いとなります。
      抽出の際は☆の影響を受け、☆が高いほど選ばれやすく、☆0は除外されます。

  ■ プレースホルダー用ボタン
      直接入力欄の上に、記法を挿入する専用ボタンがあります。
      ・繰-分 / 繰-結 / 独-分 / 独-結（繰り返し記法）
      ・頭文字R / 母音R / 含むR / 全R / ☆R（検索・抽出記法）
      ・主A / 主B / 副主 / 精A / 精B（置換-固定ルール）

  ■ N値指定ボックスの仕様
      ボタン列右側の数字ボックスが N値です（初期値2、範囲0〜9）。
      この値は「繰-分 / 繰-結 / 独-分 / 独-結 / ☆R」ボタンで使用されます。
      ☆R（◇N）は 6〜9 を指定しても 5 として挿入されます。
      マウスホイールによる増減に対応しています。

  ■ SPボタンの仕様
      SP は「ボタン挿入時に末尾へ半角スペースを付けるか」のON/OFFトグルです。
      ただし、頭文字R / 母音R / 含むR / 全R / ☆R は SP がONでも末尾スペースを付けません。

  ■ 入力欄内のN値をマウスホイールで変更
      入力欄では、記法中の数値にマウスカーソルを合わせてホイール操作するとN値を増減できます。
      対象: ｛N｝ / ｛｛N｝｝ / 〔N〕 / 〔〔N〕〕 / ◇N
      範囲: 繰り返し系は 1〜9、◇N は 0〜5 でクランプされます。

------------------------------------------------------------------------
【10】設定の保存・読み込み
------------------------------------------------------------------------
  ■ 設定の自動保存
      設定は主に「文章生成」「ランダマイザー実行/設定変更」時に
      userfile/settings.json へ保存されます。
      次回起動時はこの設定が復元されます。

  ■ プリセット [F]
      現在の設定に名前を付けて保存し、いつでも呼び出せます。
      「last_current」には、直近の保存タイミングの設定が自動保存されます。

------------------------------------------------------------------------
【11】ランダマイザー [A]
------------------------------------------------------------------------
  各設定パラメータの「ランダム適用範囲」を細かく設定できる機能です。

  ■ 有効/無効チェック
      ランダム適用から除外したい項目のチェックを外せます。

  ■ レンジスライダー（各項目）
      ランダム適用時の値の範囲（最小〜最大）を指定します。
      さらに △▲ 制御ハンドルで、範囲自体の可動域も制限できます。
      （詳細は【スライダーの操作方法（共通）】）

  ■ ランダム実行ボタン（緑）
      設定した範囲内でランダムにすべての設定を変更します。
      内部的には、割合系は 10% 刻み、強化係数は 100% 刻みで抽選されます。

  ■ ランダマイザー設定変更ボタン
      有効確率スライダー・変動率スライダーを使って、
      ランダマイザー設定自体をさらにランダムに変更できます。

  ■ メイン設定変更ボタン
      有効確率スライダー・変動率スライダーを使って、
      メイン設定（実際の各パラメータ値）を直接ランダムに変更できます。

  ■ 記号は固定（チェックボックス）
      記号系の選択肢（区切り文字・中割記号など）を変更しないようにします。

  ■ 有効確率
      ランダマイザー設定変更では、各項目の enabled を「ONになる確率」として使用されます。
      メイン設定変更では、各項目を「今回の変更対象にする確率」として使用されます。
      0%は例外処理で「変更なし・現状のまま」。100%では全項目が対象となります。

  ■ 変動率
      各項目の範囲値をどれだけ動かすかを決めます。
      0%では範囲値を変更しません。100%では許可範囲全体から再抽選します。
      1-99%は現在値を基準に行うランダムウォーク方式で変動します。
      丸め処理は四捨五入ベースで、低値側への偏りを抑えています。

------------------------------------------------------------------------
【12】フロー図 [E]
------------------------------------------------------------------------
  テキスト生成の各処理ステップを視覚的に表示するウィンドウです。
  生成を実行するたびに、各ステップでのテキスト変化を確認できます。
  変化した箇所は色付き（緑: 追加/変更、赤: 削除）でハイライトされます。
  （赤は取り消し線付きで表示）

  実装上、グレーアウト判定があるのは主に
  ③事前置換 / ⑤セリフ中割 / ⑥濁点追加(セリフのみ) / ⑪全体置換 / ⑫濁点追加(全体)
  のステップです。

  処理ステップ（全13段階）:
    ① セリフ抽出         ② 事前濁点除去       ③ 事前置換
    ④ セリフ文字数制限   ⑤ セリフ中割         ⑥ 濁点追加（セリフのみ）
    ⑦ 文字種変換         ⑧ 末尾母音追加       ⑨ 頭文字復唱
    ⑩ 区切り文字         ⑪ 全体置換           ⑫ 濁点追加（全体）
    ⑬ 最終出力


================================================================================
  サブウィンドウの詳細
================================================================================

------------------------------------------------------------------------
【A】ランダマイザー設定ウィンドウ
------------------------------------------------------------------------
  メイン画面の「ランダマイザー設定」ボタンから開きます。
  各設定をランダム適用するときの「値の範囲」を細かく制御するウィンドウです。

  ■ 設定グループ（スクロール可）
      セリフ数・セリフ中割・区切り文字・頭文字復唱・末尾母音・
      文字種・濁点・置換 の各項目が並んでいます。

  ■ 有効チェックボックス（各行左端）
      チェックを外すとランダム適用の対象外になります。
      チェックを外すとラベルとスライダーがグレーアウトします。

  ■ レンジスライダー（各行）
      ランダム適用時に選ばれる値の「最小〜最大」の範囲を指定します。
      ・int/int_pair型: 整数範囲
      ・percent型    : 0〜100% 範囲
      ・boost型      : 100〜1000% 範囲
      ・str_pair型   : 文字列リストのインデックス範囲
      ・choice型     : 対象とする選択肢のチェック（チェックした値の中からランダム選択）
      ・bool型       : 有効チェックのみ（True/False をランダム選択）
      ※ percent型のUIは5%刻み表示ですが、ランダム実行時の抽選は10%刻みです。

  ■ ランダマイザー設定変更（セクション）
      ランダマイザー設定自体をさらにランダムに変動させる機能です。
      ・有効確率スライダー    : 対象項目の enabled を再設定する確率
      0%: enabled を変更しない / 100%: 全項目を有効化
      ・変動率スライダー      : スライダー範囲・選択候補をどれだけ変動させるか
      0%: 範囲値を変更しない / 100%: 許可範囲全体から再抽選
      ・記号は固定チェック    : 区切り文字・中割記号などのchoice項目は変更しない
      ・「ランダマイザー設定変更」ボタン: 上記設定を適用してランダマイザー設定を変動させる
      ・「メイン設定変更」ボタン      : 上記設定を適用してメイン設定を直接変動させる
      メイン設定変更時の有効確率は「enabled再設定」ではなく「今回変更するか」の判定として使われます。

  ■ ランダム実行ボタン（緑）
      現在のランダマイザー設定の範囲内でメイン画面の全設定を即座にランダム変更します。
      実行後「ランダム適用しました」と表示されます。

  ※ ウィンドウを閉じると設定が自動保存されます。

------------------------------------------------------------------------
【B】文字置換設定ウィンドウ
------------------------------------------------------------------------
  メイン画面の「文字置換設定」ボタンから開きます。
  テキスト生成時に適用する文字置換ルールを設定するウィンドウです。

  ■ 固定ルール
      以下のプレースホルダーへの置換先を設定します（元文字は変更不可）。
        ＃主人公A＃ / ＃主人公B＃ / ＃副主人公＃ / ＃性器名A＃ / ＃性器名B＃
      各行に置換先文字を入力し、「有効」チェックで個別にON/OFFできます。
      固定ルールは確率指定なし（有効時は100%適用）です。

  ■ カスタムルール
      ・元文字 → 置換文字 の形式で任意のルールを追加できます。
      ・確率欄: その置換が適用される確率（0〜100%、5%刻みプルダウン）
      ・マウスホイールで確率を10%刻みで調整できます。
      ・「有効」チェックでルールを個別にON/OFFできます。
      ・「削除」ボタンでそのルール行を削除します。
      ・「ルールを追加」ボタンで新しい行を追加します。

  ※ ウィンドウを閉じると置換ルールが自動保存されます。
  ※ 生成実行時にも自動保存されます。
  ※ 置換を実際に適用するには、メイン画面の「置換ON/OFF」を有効にし、
     「事前置換」または「全体置換」を選択してください。

------------------------------------------------------------------------
【C】セリフライブラリウィンドウ
------------------------------------------------------------------------
  メイン画面の「セリフライブラリ」ボタンから開きます。
  texts.json に保存されたセリフの一覧を表示・編集するウィンドウです。
  仮想スクロールを使用しているため、大量のセリフでも高速に表示されます。

  ■ フィルター
      ・行選択（複数選択可）: あ行〜わ行・ん・記号 の各ボタンで絞り込み
      ・☆フィルター（複数選択可）: ☆0〜☆5 の優先度で絞り込み
      選択を解除すると全件表示に戻ります。

  ■ 表示列
      各行に 番号・セリフテキスト・☆評価 が表示されます。

  ■ 削除モード
      削除モードをONにすると、クリックでセリフを選択・選択解除でき、
      選択したセリフをまとめて削除できます。

  ■ 編集モード
      編集モードをONにすると、セリフテキストを直接クリックして編集できます。

  ■ メンテナンスセクション
      ・セリフ追加  : テキスト入力欄から新しいセリフを追加します。
                      分割文字設定に基づき複数セリフを一括登録できます。
                      追加前に重複チェック・類似チェックが行われます。
      ・全件類似チェック: ライブラリ全体を対象に類似するセリフを検出します。
                      しきい値や最小文字数を設定してから実行します。
                      検出されたグループごとに「残す/削除/スキップ」を選択できます。
      ・全件置換    : ライブラリ内のセリフを一括置換できます。
                      固定ルール（プレースホルダー）と手動置換の両方に対応しています。

------------------------------------------------------------------------
【D】セリフボタンウィンドウ
------------------------------------------------------------------------
  メイン画面の「セリフボタン」ボタンから開きます。
  セリフライブラリをボタン形式で表示し、クリックでメイン画面の入力欄に追加するウィンドウです。

  ■ フィルター（行選択）
      あ行〜わ行・ん・記号 のボタンで表示を絞り込みます。
      同じボタンを再クリックすると全表示に戻ります（排他トグル）。

  ■ ☆ランダム入力
      ☆0〜☆5 の各ボタンをクリックすると、現在のフィルター内の
      該当☆のセリフからランダムに1件選んで入力欄に追加します。
      候補がない☆のボタンはグレーアウトして無効になります。

  ■ ボタンの色（☆評価に連動）
      ☆5: オレンジ（最高優先）  ☆4: 黄緑  ☆3: 緑
      ☆2: シアン  ☆1: 青  ☆0: グレー（最低優先）

  ■ ボタンのクリック
      ボタンをクリックすると、そのセリフが入力欄の末尾に追加されます。

  ■ ドラッグ＆ドロップで☆変更
      ボタンをドラッグして、☆0〜☆5 のセクションヘッダーまたは
      ☆ランダム入力の☆Nボタンにドロップすると、そのセリフの☆評価を変更できます。
      変更先のヘッダーは水色にハイライトされます。

  ■ 右クリックで☆0へ移動
      ボタンを右クリックすると、そのセリフの☆評価を☆0に変更します。

------------------------------------------------------------------------
【E】フロー図確認ウィンドウ
------------------------------------------------------------------------
  メイン画面の「フロー図」ボタンから開きます。
  テキスト生成処理の各ステップを視覚的に確認するウィンドウです。
  生成を実行するたびに内容が更新されます。

  ■ 左側: 処理フロー図
      各ステップをカラーボックスで表示します。
      現在の設定で有効なステップは通常表示、
      無効（確率0%やOFFなど）のステップはグレーアウトします。

  ■ 右側: 各ステップのテキスト表示
      各ステップでの入力テキストと出力テキストを並べて表示します。
      変化した箇所が色付きでハイライトされます。
        緑背景: 追加・変更された文字
        赤背景（取り消し線）: 削除された文字

  ■ 処理ステップ（全13段階）
      ①  セリフ抽出
      ②  事前濁点除去
      ③  置換（事前置換）          ※置換ON・事前置換ONのとき有効
      ④  セリフ文字数制限
      ⑤  セリフ中割
      ⑥  濁点追加（セリフのみモード）
      ⑦  文字種変換
      ⑧  末尾母音追加
      ⑨  頭文字復唱
      ⑩  区切り文字（セリフ間結合）
      ⑪  置換（全体置換）          ※置換ON・全体置換ONのとき有効
      ⑫  濁点追加（全体モード）
      ⑬  最終出力（色分け表示）

------------------------------------------------------------------------
【F】プリセットウィンドウ
------------------------------------------------------------------------
  メイン画面の「プリセット」ボタンから開きます。
  現在の設定を名前を付けて保存・呼び出しするウィンドウです。

  ■ プリセット名入力欄（上部）
      保存時に使用する名前を入力します。
      空のまま保存すると「YYYYMMDD_HHMMSS」形式の日時で自動命名されます。

  ■ 保存済みプリセット一覧（左）
      保存されているプリセットがアルファベット順で一覧表示されます。
      クリックで選択状態になります。

  ■ 操作ボタン（右）
      ・プリセット読み込み: 選択したプリセットの設定をメイン画面に反映します。
                            読み込み後、プリセット名入力欄に名前が入ります。
      ・保存             : 現在の全設定（置換ルール含む）をプリセットとして保存します。
                            同名のプリセットが存在する場合は上書きされます。
      ・削除             : 選択したプリセットを即座に削除します（確認ダイアログなし）。
      ・デフォルト化     : すべての設定をアプリのデフォルト値にリセットします。

  ■ last_current（自動保存プリセット）
      設定保存のタイミングで「last_current」という名前に自動保存されます。
      このプリセットを読み込むと、直近の保存状態を復元できます。

  ※ ウィンドウを閉じると現在の画面サイズが保存されます。


================================================================================
  データファイル・注意事項
================================================================================

  userfile/
    texts.json         … セリフライブラリ（メインデータ）
    split_chars.txt    … 分割文字設定（セリフの区切り文字を定義）
    replacements.txt   … 置換ルール設定
    settings.json      … アプリ設定（自動保存）
    presets.json       … プリセット設定

  【split_chars.txt の編集】
    セリフを分割する文字を1行1文字で記載します。
    推奨: 「、」「。」「半角スペース」「全角スペース」「,」のみ使用。
    それ以外の文字種を追加するとプレースホルダー等でトラブルになる可能性があります。
    # で始まる行はコメントとして無視されます。

  【replacements.txt の編集】
    書式: 元文字,置換文字,有効(1/0),確率(0-100)
    例1: ＃主人公A＃,太郎,1
    例2: い,#,1,40   （40%の確率で「い」を「#」に置換）
    ※ 旧形式（元文字,置換文字）も読み込み時は有効扱いで解釈されます。
    # で始まる行はコメントとして無視されます。
    ※ 「文字置換設定」[B] ウィンドウからGUIで編集することを推奨します。

  【注意事項】
  ・userfile/ フォルダ内のファイルはアプリ起動時に自動生成されます。
  ・settings.json と presets.json は自動で読み書きされます。
    手動で編集する場合は JSON の形式を崩さないようご注意ください。
  ・セリフライブラリ（texts.json）のバックアップは定期的に行うことをお勧めします。

================================================================================
