shorts-ball-battle-v5 新規20シナリオ生成バッチの実装と出力

この記事はCodex製です。

##依頼内容と課題

  • 既存の shorts-ball-battle-v2 のシード違いではなく、テーマのニュアンスを維持したまま「未知の新規シナリオ」で20本生成したい。
  • 過去バッチの流用のみでは、見た目・展開が既視感に寄りやすい。
  • manifest.json / YouTube メタデータの出力規約(タイトル=本文+絵文字+ハッシュタグ、100文字以内)も満たす必要がある。

##アプローチ

  • 新規ジェネレータ scripts/shorts-ball-battle-v5-batch.ts を追加。
  • シナリオを20本新規定義(mirror-mazecrown-heist)。
  • 共通物理エンジン(球体衝突 + 壁反発)に対して、シナリオごとに以下ハザードを組み合わせる設計にした。
    • 収縮セーフゾーン
    • 中央ホール吸引
    • パルス衝撃
    • ガスト(突風)
    • 回転重力
    • 可動ウォール
  • 1シナリオごとに buildParams で乱数パラメータを与え、同シナリオ内でも挙動差分を出す構成にした。
  • YouTube メタデータは buildYouTubeMeta で正規化し、タイトルルールを強制。
  • package.jsonshorts:ball:battle:v5 を追加。
  • フィードバックを受けて、以下を追加実装した。
    • 音声トラック再導入(AAC, 48kHz, 2ch)
    • 動画終盤の「FINAL RESULT」パネル(勝者と上位チーム数)
    • 実行ログに最終順位の出力([result] ...
    • 背景・球体描画のスタイル分岐(画一感を下げる)
    • 運用ルールを「まず1本生成→フィードバック待ち」に変更
  • 再フィードバックを受けて、さらに以下へ修正した。
    • 表示をV2寄りに簡素化(背景は単純グラデーション+境界線)
    • 球体描画のエフェクトを最小化(単色+ハイライト)
    • ホール表現を暗転塗りつぶしから輪郭線に変更
    • 終盤結果表示を小型化して過剰演出を抑制
    • ハザード強度を全体的に減衰(hazardMul を縮小)
    • さらに v5 をいったん保留し、v2 ベースへ回帰して新規ピースを追加する方針へ切り替えた
      • 追加ピース: center-claim
      • 目的: 表示/演出はV2のシンプルさを維持しつつ、内容は未知シナリオにする

##アウトプット

  • 追加ファイル:
    • scripts/shorts-ball-battle-v5-batch.ts
  • 変更ファイル:
    • package.jsonshorts:ball:battle:v5 スクリプト追加)
  • 生成実行:
    • コマンド:
      • bun run shorts:ball:battle:v5 -- --piece all --concurrency 2 --seed 2026022508 --output ./output/shorts-ball-battle-v5-batch-20260225-004750
    • 結果:
      • output/shorts-ball-battle-v5-batch-20260225-004750 に mp4 を20本生成
      • manifest.json, youtube-metadata.json, youtube-metadata.csv を出力
      • 実行ログ上の完了値: 20/20 videos, 104.30MB, 1200.81s
  • フィードバック反映後のサンプル1本:
    • コマンド:
      • bun run shorts:ball:battle:v5 -- --piece reactor-core --concurrency 1 --seed 2026022512 --output ./output/shorts-ball-battle-v5-feedback-20260225-0108
    • 出力:
      • output/shorts-ball-battle-v5-feedback-20260225-0108/01-reactor-core-seed1399395227.mp4
    • 確認:
      • ffprobecodec_name=aac, sample_rate=48000, channels=2 を確認
  • シンプル化再調整後のサンプル1本:
    • コマンド:
      • bun run shorts:ball:battle:v5 -- --piece mirror-maze --concurrency 1 --seed 2026022513 --output ./output/shorts-ball-battle-v5-feedback2-20260225-0122
    • 出力:
      • output/shorts-ball-battle-v5-feedback2-20260225-0122/01-mirror-maze-seed1399395228.mp4
    • 実行ログ:
      • [result] mirror-maze T1:60 T2:60
    • 確認:
      • ffprobecodec_name=aac, sample_rate=48000, channels=2 を確認
  • V2回帰版の新規サンプル1本:
    • 実装:
      • scripts/shorts-ball-battle-v2-batch.ts に新規シミュレーション simCenterClaim を追加
      • PieceId / PIECE_IDS / PIECEScenter-claim を追加
    • コマンド:
      • bun run shorts:ball:battle:v2 -- --piece center-claim --concurrency 1 --seed 2026022514 --output ./output/shorts-ball-battle-v2-center-claim-20260225-0135
    • 出力:
      • output/shorts-ball-battle-v2-center-claim-20260225-0135/01-center-claim-seed1399395229.mp4
    • 確認:
      • ffprobecodec_name=aac, sample_rate=48000, channels=2 を確認
  • V2回帰版の新規20本(ユーザOK後の本生成):
    • コマンド:
      • bun run shorts:ball:battle:v2 -- --piece center-claim --repeat 20 --concurrency 4 --seed 2026022515 --output ./output/shorts-ball-battle-v2-center-claim-batch20-20260225-0148
    • 出力:
      • output/shorts-ball-battle-v2-center-claim-batch20-20260225-0148 に mp4 を20本生成
      • manifest.json, youtube-metadata.json, youtube-metadata.csv を出力
    • 実行ログ:
      • Batch completed. 20/20 videos | 95.22MB | 938.86s
    • 確認:
      • 全20本で音声ストリームあり(ffprobe 集計: 20 aac,48000,2
      • ファイル名は 01-center-claim-r01-...mp4 から 20-center-claim-r20-...mp4 まで連番で生成

##参照した一次情報

##一次情報・一次ソース