FilmForge Story
ストーリーが最優先です。何も描かれず、スコアも付けられず、購入もされません。映画が紙の上に存在し、秒単位で計時され、クレジットで価格設定されるまでは。このスキルは3つのファイルを書き出します。story-bible.md、screenplay.md、shotlist.yaml(テンプレートは templates/ 内)。ショットリストが検証に合格し、その計画がクレジットに収まったときにステージゲートが通過します。
パス: 以下の scripts/、templates/、config/ は、このスキル内のフォルダです(読み込み時に表示されるベースディレクトリにあり、./install.sh によって配置されます)。リポジトリのクローンから作業する場合、それらはルートにある tools/、templates/、config/ です。
ステップ 1. 前提とテーゼ
- 前提: 一文で。誰が何を望み、その代償は何か。
- テーゼ: 一文で。結末が証明すること。
どちらかが二文になった場合、ストーリーはまだ見つかっていません。ここで作業を続けてください。下流のすべてがこれを継承します。
ステップ 2. 核心: 6つのエンジン
優れた短編アニメーション映画は、同じいくつかのことを行います。すべての行を埋めてください。一つの行を埋められない映画は、一部が欠けています。
| エンジン | テスト |
|---|---|
| 一つの関係 | 映画の中心となる二人のキャラクター。他の全員は彼らに奉仕します。 |
| 一つの欠点とその代償 | 主人公の欠点が、画面上で誰かに現実の何かを犠牲にさせます。 |
| 一つの胸が痛む選択 | 主人公が自らの手で、望んでいたものを手放します。 |
| 一つのどんでん返し | 観客が信じていたことが真実ではなく、真実はあらかじめ植え付けられていました。 |
| 一つの鏡 | 初期に嘘をつき、後半で真実を語るイメージ。 |
| 一つのイメージ、二度 | 映画を開き、閉じる一つの構図。その間のすべてによって変化しています。 |
実例(The Lantern Moth、リポジトリのテキスト例、36秒): 一つの関係、灯台の少女と炭火の蛾。彼女が冬の間抱いた最初の温かいもの。一つの欠点と代償: 彼女はその暖かさを保ちたいと思い、手で包み込んでいる間にボートは岩場に流されます。一つの選択: 彼女は死んだランプに向かって手を開き、蛾を中に放ちます。一つのどんでん返し: 蛾は燃え尽きず、夜明けにランプのガラスは何百もの小さな炭火の蛾で覆われています。一つの鏡: ランプのレンズに映る彼女の姿。蛾に照らされて孤独だったのが、ビームの光に消えます。一つのイメージ、二度: 夜の死んだ灯台が映画を開き、夜明けの温かい灯台が閉じます。
ステップ 3. セットアップとペイオフ
何も一度だけ登場しない表。各行: 何が植え付けられたか(ショット)、それが何で報われるか(ショット)。イメージにペイオフがない場合は、それをカットするか、ペイオフを与えてください。The Lantern Moth の行: 最初のフレームの死んだランプ / 夜明けの同じフレーム、ランプが暖かい; 彼女がどこにでも持ち歩く空のランタン / 蛾がいなくなった後、床に置き去りにされる; 彼女の指先の一匹の蛾 / ガラスの上の百匹の蛾; 暖かい金色はどこにもない / ビームが金色に輝く。
ステップ 4. カラースクリプト
シーンごとに一行: 時間範囲、3~5色、感情。意味を持つルールを追加します(「ランプが灯るまでは暖かい金色なし」、「ランプが灯る前の唯一の暖色は蛾のオレンジ」、「夜明けまで空に青はなし」)。ルールは連続性台帳の forbid エントリになり、すべての絵で測定されます。
ステップ 5. 脚本、タイムド
- 時間範囲のあるシーン; 開始、長さ、フレーミング、そしてカメラが撮影できるもののみを現在形で記述したショット。撮影できないビートは映画に含まれません。
- 各シーンの下に、音楽が何をするか(楽器、エネルギー、名前付きヒット、書かれた無音)。The Lantern Moth の脚本は「闇」の下に「低いドローン、各小節にソフトキック。寒く、孤独。」を置き、「光」の下に「0:24のヒット、その後暖かく豊かなコード」。音楽が既に存在する場合(歌、ピアノ曲)、ストーリーはそのセクションを順に通り、各セクションの下に一行のムードを置き、ショットまたはページはそれに合わせて進みます。
- 言葉: 絵が伝えられないことだけを言う(誰が話しているか、なぜ去るか、誰が死ぬか、結末が何を意味するか)。無言は強みです。世界中の誰にでも通用します。ナレーションは画面上に手書きされるか、話されます。どちらにせよ、後でフィルムタイムで計時されます(forge-sound)。
ステップ 6. 映画をクレジットに合わせる
paint_credits = credits x 0.95 - sheets - plates - proofs - score
paintings = floor(paint_credits / (price x 1.3)) # 1.3 = 再描画バッファ
runtime = paintings x average hold # ペインテッドホールド: 4~6秒
実例: 70クレジット(66.5使用可能)、2枚のシートと1枚のプレート(8.25、バッファ込みで約11.8)、64秒のスコア(9.28): 絵画に約45.4残り、バッファ込みで1枚2.75で12枚の絵画: 1ホールド5秒で60秒の映画。The Lantern Moth は36秒で6ショット。budget.py は使用可能な66.50のうち39.08で計画し、既に使われた分を除いて27.42の余裕があります。リテイク込みでさらに7枚の絵画の余地があります。
サイズ調整中のルール:
- ヒーローフレームを最初に: 人に何かを感じさせなければならない2~4のショットを指名します。それらは他のすべてに先立って、プルーフとして描かれます。
- 実際の動きは他に方法がない場合のみ(飛行、クライマックスとなる変身)。それ以外の場所では、スナップするキーポーズ(
poses: 2)とポストでの動き。 - ストーリーが許す場合はプレートまたはペインティングを再利用します(
kind: reuse): イメージ2回のエンジンは無料です。
ステップ 7. ショットリスト
shotlist.yaml を書きます(スキーマ: references/shotlist-schema.md)。各ショット: id, scene, dur, kind, framing, beat, characters, refs(全キャラクターのシート), cut_on、そして音楽ブリーフがストーリーヒットを指定する場所には pin。その後:
python3 scripts/shotlist.py validate shotlist.yaml
python3 scripts/budget.py shotlist.yaml --production production.yaml
バリデートがエラーなしを示し、バジェットがFITSを示すまで繰り返します。対応すべき警告: ペインテッドホールドが1.5秒未満または10秒超、ナレーションが秒間2.4ワード超、シートが添付されていないキャラクターがフレーム内にいる。
出力形式
story-bible.md: 前提、テーゼ、6つのエンジン、世界、キャラクター(ハンドル、見た目、欲求、動き)、小道具と状態、セットアップとペイオフ、カラースクリプト、制作ルール。screenplay.md: 時間付きシーン、音楽メモ、開始、長さ、フレーミング、アクション、セリフ付きショット。shotlist.yaml: 検証可能、収まる。- 短いレポート: ランタイム、ショット数、計画されたクレジット対利用可能なクレジット、ヒーローフレーム、一つのリスク。
ゲートチェックリスト
- 前提とテーゼがそれぞれ一文であること
- 6つのエンジンすべてが埋められていること; すべてのセットアップにペイオフがあること
- ルール付きのカラースクリプト
- すべてのショットが撮影可能であること; すべてのビートがその音楽の下にあること
-
shotlist.py validate: エラーなし -
budget.py: FITS、予備は未使用 - ヒーローフレームが指定されていること
修復表
| 症状 | 修正 |
|---|---|
| 結末が決まらない | 選択が欠けているか、主人公に代わって行われている; またはどんでん返しが植え付けられていない。エンジン3と4を再確認 |
| スライドショーのように感じる | ビートが状態ではなくアクションを記述している; 各ビートをフレーム内で変化する何かとして書き直す |
| 予算超過 | より少なく、より長いホールド; プレートの再利用; ビデオの代わりにキーポーズ; その後、優先度3のショットをカット |
| ナレーション警告 | より少ない単語、または次のカットにまたがってラインを流す(ナレーションはフィルムタイムに存在する) |
| キャラクターが同じ人物として読めない | ストーリーの欠陥ではない: forge-style-lock(シート、アンカー、スケールロック) |
参考文献
references/story-engine.md: 6つのエンジンの詳細、The Lantern Moth の分解付きreferences/shotlist-schema.md: すべてのショットリストフィールド、その値、およびどのツールが読み取るか