추가 시나리오는 그 자체로 하나의 작은 캠페인입니다. 정한 순서대로 스테이지를 플레이하고, 그 사이에 평소와 같은 인터미션 (개조, 갈아타기, 저장)이 있으며, 스토리 선택지에 따라 엔딩이 달라질 수 있습니다. 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/ko/docs/mod-campaign.md (캠페인 형식, 규칙, 대사 찾기, 패키지 묶기)
- https://srw64.dreamquest.club/docs/mini-stage/llms.txt (각 스테이지의 형식과 모든 스크립트 명령)
- 저장소의 예제 캠페인 config/recomp/campaigns/sample. 그 구조를 따라 주세요
제한:
- 원작의 맵, 캐릭터, 기체만 사용하고, 대사와 선택지는 게임에 이미 있는 텍스트 번호만 사용하며 새 대사는 쓰지 않기
- 먼저 content/dialogue/en/story/에서 알맞은 대사를 찾아, 스테이지에 넣기 전에 텍스트 번호, 화자, 내용을 목록으로 보여 주고 제 승인을 받기
- 모든 이벤트는 3DD0으로 시작하고 주인공 루트 마커는 쓰지 않기. {HeroName}이나 {PartnerName}이 들어간 대사는 피하기
- 캠페인 자체의 플래그는 변수 55–99 또는 140–199에 두기
스토리:
(스테이지 수. 스테이지마다 어느 원작 스테이지의 맵을 쓰는지, 누가 합류하는지, 적, 승리·패배 방법. 선택지는 어디에 있고 엔딩은 몇 개인지)
순서:
1. 먼저 스테이지 목록과 각 스테이지의 설계를 보여 주고, 제가 승인하면 파일을 쓰기
2. 캠페인 전체를 컴파일해 확인하고, 실패하는 부분을 고치기
3. MCP로 제 게임에 접근할 수 있다면 각 스테이지를 따로 불러와 승리할 때까지 플레이하고 스크린샷 찍기
4. tools/mods/pack.py로 묶고, 파일이 어디 있는지와 설치 방법을 알려 주기
몇 가지 요령:
- 줄거리는 구체적일수록 좋습니다. “2번째 스테이지는 원작 제5화의 맵을 쓰고, 아무로와 카미유가 출격하며, 적은 6기, 3턴에 증원, 적 전멸로 승리” 정도까지 적으세요. 맵과 기체를 AI가 알아서 고르게 하면 번호를 틀리기 쉽습니다.
- AI가 고른 대사를 읽어 보세요. 대사를 이어 붙이는 부분에서 가장 문제가 많이 생깁니다. 빌려 온 대사가 앞뒤로 이어지지 않거나, 여러분의 스토리에 없는 인물과 사건을 언급하는 경우입니다.
- 스테이지를 하나씩 확인하세요. 스테이지가 불러와지고, 이길 수 있고, 종료 이벤트가 다음 스테이지로 이어지는지 확인한 다음, 전체를 이어서 플레이하세요.
이 페이지의 나머지는 사람과 AI 모두를 위한 전체 안내입니다.
파일
my-campaign/
mod.json 패키지 정보
campaign.json 스테이지 목록, 시작, 제목
stages/<stage>.json 스테이지 하나에 하나씩, 미니 스테이지 형식
stages/<stage>.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가 첫째, 둘째, 셋째 선택지이며, 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/에는 참고할 스테이지가 60개 넘게 있습니다.
시작 상태와 피해야 할 것
- 캠페인은 아무것도 없는 상태로 시작합니다. 부대 명단은 비어 있고, 주인공과 파트너는 이름이 없으며, 루트도 없습니다.
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/<language>/story/scene-NNNN.txt에 있습니다 (언어는 ko, en, zh-Hans, zh-Hant. NNNN은 장면 번호).
@17464 Banjo · 万丈
> 「世のため人のため、ムゲゾルバドス
> 帝国の野望を打ち砕く
「세상을 위해, 사람들을 위해. 무게 졸바도스 제국의 야망을 쳐부수는
---
…
@ 뒤의 숫자가 대사 명령 3D3E에 넣는 텍스트 번호입니다 (3D3F–3D43은 다른 방식으로 표시합니다). 한 항목은 여러 페이지 (---로 구분)로 이루어질 수 있으며 전체가 표시됩니다. >로 시작하는 줄은 일본어 원문이고, 그 뒤에 번역이 오며, #로 시작하는 줄은 주석입니다. 선택지도 하나의 항목이며 선택지마다 * 줄이 하나씩 있습니다. 3D44의 선택지 수는 이와 일치해야 합니다. 알맞은 대사를 찾는 가장 빠른 방법은 전문 검색입니다. 예를 들어 ko/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 |
캐릭터와 기체 번호 |
“원작 제N화의 맵과 적”을 쓰려면 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>-<version>.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 패키지 저작권 규칙을 따릅니다.