FilmForge 故事
故事為先:在影片被繪製、配樂或購買之前,它必須以紙本形式存在,並精確計時到秒,且根據點數定價。此技能會撰寫三個檔案:story-bible.md、screenplay.md、shotlist.yaml(模板位於 templates/)。階段關卡通過的條件是:鏡頭列表通過驗證,且其計劃符合點數預算。
路徑:scripts/、templates/ 和 config/ 資料夾位於此技能內部(即它載入時顯示的基礎目錄),由 ./install.sh 放置。如果從倉庫的克隆中工作,它們位於其根目錄的 tools/、templates/ 和 config/ 資料夾中。
步驟 1. 前提與主題
- 前提: 一句話,說明誰想要什麼以及需要付出什麼代價。
- 主題: 一句話,故事結局將證明這一點。
如果其中任何一個需要兩句話,表示故事尚未找到。請在此處繼續努力;下游的一切都繼承於此。
步驟 2. 核心:六大引擎
優秀的短片動畫都做相同幾件事。填滿每一行;無法填滿任何一行的電影就是缺少了某個部分。
| 引擎 | 測試 |
|---|---|
| 一個關係 | 電影圍繞的兩個角色。其他所有人都為他們服務。 |
| 一個缺陷,附帶代價 | 主角的缺陷在螢幕上讓某人付出了真實的代價。 |
| 一個讓人心碎的選擇 | 主角親手放棄了他們想要的東西。 |
| 一個轉折 | 觀眾所相信的並非事實,而真相早已埋下伏筆。 |
| 一個鏡像 | 一個在早期說謊、在晚期說出真相的影像。 |
| 一個影像,出現兩次 | 一個構圖作為電影的開場和結尾,被兩者之間的一切所改變。 |
工作範例(《燈籠蛾》,倉庫中的文字範例,36 秒):一個關係:燈塔女孩和餘燼蛾,這是她整個冬天握住的第一個溫暖東西。一個缺陷附帶代價:她想留住溫暖,而當她捧著它時,船正漂向岩石。一個選擇:她張開雙手伸向熄滅的燈,讓蛾飛了進去。一個轉折:蛾並沒有燒盡;黎明時,燈罩上佈滿了上百隻小餘燼蛾。一個鏡像:她在燈罩上的倒影,孤獨地被蛾照亮,然後消失在光束的光芒中。一個影像出現兩次:夜晚熄滅的燈塔作為電影開場,黎明溫暖的燈塔作為電影結尾。
步驟 3. 鋪陳與回報
一個表格,其中沒有任何事物只出現一次。每一行:種下了什麼(鏡頭),回報了什麼(鏡頭)。如果一個影像沒有回報,刪除它或給它一個。《燈籠蛾》中的行項目:第一個畫面的熄滅燈塔 / 黎明時同一個畫面,燈溫暖;她隨身攜帶的空燈籠 / 蛾離開後它留在地板上;她指尖上的一隻蛾 / 玻璃上的上百隻蛾;沒有溫暖的金色 / 光束閃耀著金色。
步驟 4. 色彩劇本
每場戲一行:時間範圍,3 到 5 種顏色,感受。加入承載意義的規則(「燈點亮前沒有溫暖金色」、「燈點亮前唯一的溫暖顏色是蛾的橙色」、「黎明前天空中沒有藍色」)。規則成為連續性總帳中的 forbid 條目,在每幅畫作上進行測量。
步驟 5. 計時劇本
- 附有時間範圍的場景;附有開始時間、長度、取景的鏡頭,並且只包含相機能拍攝到的內容,使用現在式。無法被拍攝的節拍不在電影中。
- 在每個場景下,描述音樂的作用(樂器、能量、指定的重音、書面標示的靜默)。《燈籠蛾》的劇本在「黑暗」場景下放「低沉的嗡鳴聲,每小節一個輕柔的踢踏鼓聲。寒冷而孤獨。」在「光明」場景下放「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 可花費),兩張紙和一個底版(8.25,加上緩衝約 11.8),64 秒配樂(9.28):剩約 45.4 可用於繪畫,所以是 12 幅畫,每幅 2.75 加上緩衝:一部 60 秒的影片,每停留 5 秒。《燈籠蛾》6 個鏡頭跑了 36 秒;budget.py 計劃使用 66.50 可花費點數中的 39.08,已花費部分之外還剩 27.42:足夠在考慮重拍的情況下再進行 7 幅繪畫。
規模調整時的規則:
- 英雄畫面優先:指定 2 到 4 個必須讓人感受深刻的鏡頭。它們將作為樣張,在其他一切之前被繪製。
- 僅在無其他方法時才使用真實動作(飛行、作為高潮的轉變)。其他地方使用快照的關鍵姿勢(
poses: 2),並在後製中賦予生命。 - 在故事允許的情況下重複使用底版或繪畫(
kind: reuse):雙重影像引擎是免費的。
步驟 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
迭代執行,直到 validate 顯示無錯誤且 budget 顯示 FITS。需要注意的警告:繪製停留時間低於 1.5 秒或超過 10 秒、旁白速度快於每秒 2.4 個單詞、角色在畫面中但未附加其工作表。
輸出格式
story-bible.md:前提、主題、六大引擎、世界、角色(代號、外貌、慾望、動作)、道具與狀態、鋪陳與回報、色彩劇本、製作規則。screenplay.md:附有時間的場景、音樂註記、附有開始時間、長度、取景、動作、台詞的鏡頭。shotlist.yaml:通過驗證、符合預算。- 一份簡短報告:總長度、鏡頭數、已計劃與可用點數、英雄畫面、一個風險。
階段關卡檢查表
- 前提和主題各為一句話
- 所有六大引擎已填滿;每個鋪陳都已回報
- 色彩劇本及其規則
- 每個鏡頭都可拍攝;每個節拍都在其音樂之下
-
shotlist.py validate:無錯誤 -
budget.py:顯示 FITS,保留資金未被觸動 - 英雄畫面已指定
修復表
| 症狀 | 修正方法 |
|---|---|
| 結局無力 | 缺少選擇,或選擇是為角色做的;或者轉折沒有鋪陳。重新檢查引擎 3 和 4 |
| 感覺像幻燈片 | 節拍描述的是狀態而非動作;將每個節拍重寫為畫面中正在變化的東西 |
| 超出預算 | 更少、更長的停留時間;重複使用底版;使用關鍵姿勢代替影片;然後剪掉優先級 3 的鏡頭 |
| 旁白警告 | 減少文字,或讓台詞跨越到下一個剪輯(旁白存在於電影時間中) |
| 角色看起來不像同一人 | 非故事問題:請使用 forge-style-lock(工作表、錨點、比例鎖) |
參考資料
references/story-engine.md:深入探討六大引擎,並分解《燈籠蛾》references/shotlist-schema.md:每個鏡頭列表欄位、其值以及哪個工具讀取它