MOD 制作教程 🏠 主页

九、战役地图制作

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 文件名(必填)。
文件必须位于包内 map/ 文件夹。
[MapId]>name= (string) — 战役名称。
战役选择界面显示。
[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 用地图编辑器制作

  1. 进入游戏 → 主菜单 → 地图编辑器;
  2. 绘制地形、放置建筑/单位/出生点;
  3. 导出 JSON(菜单 → 导出 JSON);
  4. 把导出的 JSON 放入 MOD 包内 map/ 文件夹,改名与 campaigns.ini 的 file= 一致;
  5. 在 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 在运行时解析。