← 技術文件

追加劇本 MOD(自定義戰役)

把幾關自己編排的關卡串成一個戰役:開局入隊、關與關之間的場間、劇情中的選項分支和結局,打包成 .srw64mod 安裝,存檔與本篇分開。目前只能用原版的地圖、人物、機體和臺詞。

更新於 2026-10-31

追加劇本是一個獨立的小戰役:幾關按你定的順序連起來,關與關之間照常進場間(改造、換乘、存檔),可以用劇情中的選項分出不同結局。它裝在 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 檢查。

安裝與遊玩

  1. 把 .srw64mod 拖進遊戲視窗安裝(或放進 MOD 資料夾,見 MOD 包)。
  2. 在標題畫面開啟「MOD」,切到「追加劇本」頁,點戰役那一行的「進入」。
  3. 標題畫面中間出現「開始戰役」和戰役名,從這裡開始;之後在標題讀檔就是讀這個戰役的存檔。
  4. 回本篇:同一頁的「返回本篇」。切換隻能在標題畫面進行。

戰役的存檔在使用者目錄的 campaigns/<id>/saves/,和本篇互不影響。

分享

template、deployments_from、copy_from 會把你 ROM 裡的原版資料複製進包裡,這樣的包只適合自己玩。想公開分享,出擊記錄要逐個欄位自己寫(group、x、y、actor、unit、faction、level_offset、upgrade 等),事件也全部自己寫;文本號、地圖號、人物號、機體號只是編號,可以用。其餘照 MOD 包的版權要求。