九、战役地图制作
MOD 可以附带战役地图。战役由 campaigns.ini 清单 + map/ 文件夹内的地图 JSON 组成。
9.1 campaigns.ini 清单
格式与游戏本体 data/map_ini.js 的战役地图节一致。每个 [地图ID] 节定义一个战役:
[mdTest1] file=mdTest1.json name=MOD测试关 mission=测试用战役,保护军旗不被摧毁。 difficulty=normal recommendedPlayers=2[MapId]>file= (file) — 地图 JSON 文件名(必填)。
文件必须位于包内
[MapId]>name= (string) — 战役名称。
map/ 文件夹。战役选择界面显示。
[MapId]>mission= (string) — 任务说明。
进入对局前的简报。
[MapId]>difficulty= (enum: simple|normal|hard) — 难度。
决定 AI 强度与触发条件。
[MapId]>recommendedPlayers= (int) — 推荐人数(可选)。
与地图出生点数量匹配。
9.2 地图 JSON 结构
地图 JSON 与游戏编辑器导出的格式一致,核心字段:
{
"w": 48, "h": 48,
"seed": 123456,
"terrain": [0,0,1,...], // 地形数组,长度 w*h,0草/1沙/2岩/3水/4滩
"variant": [0,0,0,...], // 变体
"ore": [0,0,0,...], // 矿脉
"starts": [ {"cx":3,"cy":3}, {"cx":40,"cy":40} ], // 出生点
"buildings": [ {"x":5,"y":6,"id":"conyard","owner":0}, ... ],
"units": [ {"x":8,"y":9,"id":"rifleman","owner":0}, ... ],
"decorations": [ {"x":72,"y":48,"type":"tree"}, ... ], // 装饰物(像素坐标)
"flags": [], "waypoints": []
}
| 字段 | 说明 |
|---|---|
w / h | 地图尺寸(格数) |
seed | 随机种子(编辑器生成时写入) |
terrain | 地形,0=草地 1=沙土 2=岩石 3=水面 4=浅滩 |
ore | 矿脉,>0 表示有矿 |
starts | 出生点数组,数量 = 玩家槽位 |
buildings[].owner | 所属玩家索引(0 开始) |
buildings[].id | 建筑 ID(对应 buildings.ini 节名) |
units[].id | 单位 ID(对应 units.ini 节名) |
decorations[].type | 装饰物:tree 树 / rock 岩石 / crate 木箱 / road 路面。坐标 x/y 为像素(与编辑器导出一致),纯视觉、不影响碰撞寻路 |
flags / waypoints | 坐标旗与路径点(触发器引用,见 9.4;编辑器导出时自动包含) |
9.3 用地图编辑器制作
- 进入游戏 → 主菜单 → 地图编辑器;
- 绘制地形、放置建筑/单位/出生点;
- 导出 JSON(菜单 → 导出 JSON);
- 把导出的 JSON 放入 MOD 包内
map/文件夹,改名与campaigns.ini的file=一致; - 在
campaigns.ini注册该地图 ID。
加载链路:启用 MOD 后,
campaigns.ini 的条目注册进 R.MapINI,并记录 base = 包内 map/ 目录。进入战役模式时,游戏从该 base 读取地图 JSON(普通地图从 data/map/ 读)。注意:地图 JSON 的
w/h 必须与 terrain 数组长度一致(w×h),否则加载失败。9.4 附加任务目标(可选)
高级战役可通过地图内的触发器(编辑器「触发器」功能)定义胜负条件,如保护某建筑、限时防守等。触发器由 js/trigger_system.js 在运行时解析。