追加劇本是一個獨立的小戰役:幾關按你定的順序連起來,關與關之間照常進場間(改造、換乘、存檔),可以用劇情中的選項分出不同結局。它裝在 MOD 包裡,從標題畫面的「MOD → 追加劇本」進入,存檔與本篇完全分開。
每一關就是一個迷你關卡:選一張原版地圖,擺上單位,寫開場、勝利和結束的事件指令碼。戰役只是在外面加一份關卡表,把它們連起來。
需要遊戲 0.5.1 或更新。
現在能做什麼
| 能做 | 還不能做 |
|---|---|
| 多關串聯、選項分支、多個結局 | 新臺詞(對白只能引用原版已有的句子) |
| 每關的地圖、我方加入、敵人配置、增援、勝敗條件 | 新地圖(只能用原版的地圖) |
| 戰役名、簡介、每關標題三語分別寫 | 新人物、新頭像、新戰鬥臺詞 |
| 資金、劇情變數、關與關之間保留的部隊 |
對白和選項都是引用原版臺詞的編號:遊戲顯示那句臺詞原本的說話人和頭像,按玩家選的語言顯示對應的譯文。所以寫劇情時要從原版臺詞裡挑意思合適的句子來拼。
需要什麼
- 原始碼倉庫和 Python 3:編譯關卡、打包。
- 你自己的 ROM:放進倉庫命名為
rom.z64,執行一次make recomp-data。查人物、機體、地圖編號,以及用原版的出擊記錄或事件做底板時都要用。 - 想讓 AI 邊寫邊在遊戲裡試:按用 AI 智慧體操作遊戲(MCP)連上游戲。
交給 AI 做
能上網、能讀寫檔案的 AI 智慧體(Claude Code、Codex 等)可以照著說明做出整個戰役。在倉庫目錄裡開啟它,複製下面這段話,把「劇情」那一段換成你的大綱:
請幫我給 Marchwind 64(《超級機器人大戰64》的 PC 重編譯版)做一個追加劇本 MOD(自定義戰役),最後打包成可以直接安裝的 .srw64mod 檔案。
先讀這些,嚴格按裡面的格式、規則和編號做:
- https://srw64.dreamquest.club/zh/docs/mod-campaign.md(戰役的格式、規則、找臺詞和打包)
- https://srw64.dreamquest.club/docs/mini-stage/llms.txt(每一關的格式和全部指令碼指令)
- 倉庫裡的示例戰役 config/recomp/campaigns/sample,照它的結構寫
限制:
- 只用原版的地圖、人物和機體;對白和選項只引用原版已有的文本號,不要編新臺詞
- 先在 content/dialogue/zh-Hans/story/ 裡找意思合適的句子,把文本號、說話人和譯文列給我確認,再寫進關卡
- 每個事件以 3DD0 開頭,不用主角路線標記;避開帶 {HeroName}、{PartnerName} 的臺詞
- 戰役自己的旗標只用變數 55–99 或 140–199
劇情:
(幾關;每關用原版哪一話的地圖、誰加入我方、敵人是誰、勝利和失敗條件;哪裡出選項、分幾個結局)
做法:
1. 先給我關卡表和每關的設計,我確認後再寫檔案
2. 寫完先編譯整個戰役檢查,有錯就改
3. 如果能用 MCP 連上我的遊戲,每關單獨載入試一遍,打到勝利再截圖
4. 用 tools/mods/pack.py 打包,告訴我生成的檔案在哪、怎麼安裝
幾點經驗:
- **大綱越具體越好。**寫到「第 2 關用原版第 5 話的地圖,アムロ 和 カミーユ 出擊,敵人 6 臺,第 3 回合增援,全滅敵人勝利」這種程度。讓 AI 自己挑地圖和單位,編號很容易出錯。
- **一定要過目它挑的臺詞。**拼臺詞最容易出問題:借來的句子前後接不上,或者提到了你的劇情裡沒有的人和事。
- **一關一關驗證。**單關能進、能打贏、結束事件能接到下一關,再串起來玩一遍。
下面是給人看的完整說明,也是 AI 讀的那份。
檔案結構
my-campaign/
mod.json 包的資訊
campaign.json 關卡表、開局、標題
stages/<關>.json 每一關,迷你關卡格式
stages/<關>.meta.json 可選:本關情報頁的內容
status.json 可選:本關情報頁的完成狀態規則
mod.json 的寫法見 MOD 包;game 寫 ">=0.5.1"。打包時 campaign.json 和 stages/ 會被編譯成包裡的 campaign/campaign.json,原始檔不進包。本關情報頁的兩個可選檔案照示例戰役裡的抄。
campaign.json
{
"schema": "srw64.campaign.v1",
"id": "yourname.my-campaign",
"name": {"zh-Hans": "我的戰役", "en": "My Campaign", "ja": "マイキャンペーン"},
"description": {"zh-Hans": "一句話簡介。", "en": "One line about it.", "ja": "ひとことで紹介。"},
"start": "first",
"stages": {
"first": {"scene": 1, "file": "stages/first.json",
"title": {"zh-Hans": "啟程", "en": "Setting Out", "ja": "旅立ち"}},
"second": {"scene": 2, "file": "stages/second.json",
"title": {"zh-Hans": "岔路", "en": "Crossroads", "ja": "分かれ道"}}
}
}
| 欄位 | 說明 |
|---|---|
id |
必須和 mod.json 的 id 一樣。它也是戰役存檔資料夾的名字,發布後不要再改 |
name、description |
追加劇本頁上顯示的名字和簡介,可以是一個字串,也可以按語言分別寫(zh-Hans、zh-Hant、en、ja,以及語言包的語言) |
start |
第一關是 stages 裡的哪一個 |
stages |
每一關:scene 借用的場景號(見下),file 關卡檔案,title 標題,顯示在標題卡、場間和存檔列表上。標題裡不要寫「第幾話」:場間和存檔列表會按已通關的關數自己在前面加上「第N話」 |
借場景號
遊戲按「場景號」記錄進度,戰役的每一關都要借一個原版的場景號,遊戲載入那個場景時換成你的關卡。存檔裡記的就是這個號,所以:
- 每關借不同的號,範圍 0–142;
- 不能借 109–122(リンク 關卡)和 38、48、68、73、79、81、83、86、88、93、95、96、104、132(這些場景的場間菜單隻有兩項);
- 關卡檔案裡自己寫的
slot不起作用,以scene為準。
借哪個號和用哪張地圖無關,地圖由關卡檔案的 map 決定。
關與關怎麼連
和原版一樣,寫在每一關的結束事件(型別 14)裡:3D4B <下一關借的場景號>。分支就是在條件塊裡放不同的 3D4B:
{"name": "ending", "type": 14, "header": [0, 0, 0, 0], "commands": [
{"op": "3DD0"},
{"op": "3D3E", "args": [18401]},
{"op": "3D44", "args": [0, 2, 18402]},
{"op": "3E10"}, {"op": "3D47"}, {"op": "3D4B", "args": [3]}, {"op": "3E1D"},
{"op": "3E11"}, {"op": "3D47"}, {"op": "3D4B", "args": [4]}, {"op": "3E1D"}
]}
3D44 0, 項數, 文本號 顯示選項,3E10/3E11/3E12 分別是選了第 1/2/3 項,3E1D 結束條件塊。也可以先用 3E13 變數, 值 記下選擇,到後面的關裡再用 3E03 判斷。
最後一關的結束事件用 3D71 進入結局,結局播完回到標題。3D71 只能放在結束事件裡,不要在戰場上執行。
編譯器會檢查:每個 3D4B 都要指向本戰役裡某一關借的場景號(500 除外),start 要存在,場景號不能重複也不能借不允許的號。
每一關要有什麼
- 開場事件(型別 12):可以先在世界地圖上演對白,然後
3D4D切到戰場,3D65設定顯示的勝敗條件,3D45 組號讓單位登場,最後3D48關掉對白視窗,交給玩家。 - 勝利:例如型別 7(某一方剩餘單位 ≤ 某數)的事件裡執行
3D4A。 - 失敗:
3D4C是 GAME OVER,玩家可以重試這一關。不要在開場事件中途執行,那時還沒有重試用的快照。 - 結束事件(型別 14):
3D4A勝利結算之後執行,在這裡寫過關對白和3D4B。
每條指令、事件型別和出擊記錄欄位見關卡指令碼指令參考;倉庫 config/recomp/mini-stages/ 有六十多個關卡可以參考。
開局與要避開的
- 開局什麼都沒有:名冊是空的,主角和搭檔沒有名字,也沒有路線。我方用
3D5A 人物, 0, 機體, 500登記(機體寫 999 表示只登記駕駛員),或者在關卡里放我方的出擊記錄、用3D45登場,登場的我方單位會永久入隊。資金用3D5B n加 n×1000。 - 部隊、資金、改造和變數會帶到下一關,存檔裡也有。
- 不用主角路線:每個事件以
3DD0開頭,不用 3DD1–3DD8;不要選帶{HeroName}、{PartnerName}的臺詞,也不要用原創主角自己說的臺詞。 - 劇情變數只有 0–3 四個值。每關開始時 100–114、128–139 會被置 3、54 置 1,0–54 原版劇本一直在讀,戰役自己的旗標放在 55–99 和 140–199。
- 已知會崩潰的寫法:
3D49時角色不在地圖上;對還在地圖上的單位執行3D5A …, 4000(先3D46讓它退場)。 - 戰役裡的 リンク 選單是停用的。
找臺詞、地圖和單位
臺詞在倉庫的 content/dialogue/<語言>/story/scene-NNNN.txt(語言是 zh-Hans、zh-Hant、en,NNNN 是場景號):
@17464 萬丈 · 萬丈
> 「世のため人のため、ムゲゾルバドス
> 帝国の野望を打ち砕く
「為了世間,為了人們,粉碎穆格·佐爾巴多斯帝國野心的
---
……
@ 後面的數字就是文本號,填進對白指令 3D3E(3D3F–3D43 是其他顯示方式),一條記錄可以有好幾頁(--- 分頁),整條一起顯示。> 開頭的是日文原文,下面是譯文,# 開頭的是註釋。選項也是一條記錄,每項一行 *,3D44 的項數要和行數一樣。用全文搜尋找意思合適的句子最快,比如在 zh-Hans/story 裡搜「撤退」。
地圖和單位在 make recomp-data 生成的 assets/original-data/records/ 裡,每行一條 JSON:
| 檔案 | 用途 |
|---|---|
scenarios.jsonl |
每個場景(每一話)的標題 |
stage_maps.jsonl |
場景號 → 地圖號 |
stage_auxiliary.jsonl |
某一話完整的出擊記錄,填進 deployments_from |
stage_deployments.jsonl |
單條出擊記錄,做 template 底板 |
actors.jsonl、units.jsonl |
人物號、機體號 |
想用「原版第幾話的那張圖和那批敵人」,先在 scenarios 找到那一話的場景號,再從 stage_maps 和 stage_auxiliary 取地圖號和出擊記錄。
編譯、試玩、打包
檢查整個戰役(會列出每關借的場景號和它的 3D4B 通往哪裡):
python3 tools/recomp/script_lab/mini_stage.py campaign my-campaign/campaign.json --out /tmp/check.json
單獨試一關:在關卡檔案裡臨時寫上 "slot": <它借的場景號>,按迷你關卡的做法編譯、用 srw64_mini_stage_load 載入。單關試玩是在本篇裡進的,結束事件的 3D4B 會接到原版劇情,打到過關就停。關卡可能會存檔,最好用 --user-dir 另開一套使用者目錄。
打包:
python3 tools/mods/pack.py my-campaign -o build/mods
生成 build/mods/<id>-<版本>.srw64mod,並自動用 tools/mods/validate.py 檢查。
安裝與遊玩
- 把
.srw64mod拖進遊戲視窗安裝(或放進 MOD 資料夾,見 MOD 包)。 - 在標題畫面開啟「MOD」,切到「追加劇本」頁,點戰役那一行的「進入」。
- 標題畫面中間出現「開始戰役」和戰役名,從這裡開始;之後在標題讀檔就是讀這個戰役的存檔。
- 回本篇:同一頁的「返回本篇」。切換隻能在標題畫面進行。
戰役的存檔在使用者目錄的 campaigns/<id>/saves/,和本篇互不影響。
分享
template、deployments_from、copy_from 會把你 ROM 裡的原版資料複製進包裡,這樣的包只適合自己玩。想公開分享,出擊記錄要逐個欄位自己寫(group、x、y、actor、unit、faction、level_offset、upgrade 等),事件也全部自己寫;文本號、地圖號、人物號、機體號只是編號,可以用。其餘照 MOD 包的版權要求。