plutonics72/supcom2-map-toolkit

GitHub: plutonics72/supcom2-map-toolkit

通过对《最高指挥官2》地图文件格式的逆向工程(含此前未破解的导航网格),使玩家能够制作可在多人模式中正常使用的自定义遭遇战地图。

Stars: 0 | Forks: 0

# Supreme Commander 2 地图工具包 为 **Supreme Commander 2** 制作自定义地图 —— 这是一款**没有内置地图编辑器**的游戏,且长期以来被认为无法进行地图 mod。 本工具包是对 SC2 地图文件格式进行逆向工程的成果,其中包括从未被破解过的一个:**导航网格**。借助它,你可以读取任何自带的场景地形,根据开阔空间为地形评分,布局遭遇战地图,而且最关键的是 —— **patch 导航网格,使得单位能够在游戏原未开启遭遇战的地形(例如战役地图)上实际移动**。导航网格 patch 已确认在游戏中有效,**包括多人游戏模式**(lockstep 安全:岛屿元数据被一致重建;所有玩家必须共享字节完全相同的 `.scd`)。 ![生成地图的剖析](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/01b53a0c99130947.svg) ## 快速开始 ``` # Python 3.9+(仅限标准库 — 无需 pip 安装) python make_map.py dune_rift_3v3 # build, verify, and install an example map ``` 然后启动 SC2 → 遭遇战 (Skirmish);该地图会出现在列表中。(SC2 在启动时读取地图归档,因此在构建后请重启游戏。) 该工具包会自动检测你的 Steam 安装路径。如果找不到,请设置一个环境变量: ``` # Windows (PowerShell) $env:SC2_GAMEDATA = "D:\SteamLibrary\steamapps\common\Supreme Commander 2\gamedata" ``` ## 制作你自己的地图 `make_map.py` 内置了五个现成的配置说明,你可以直接构建或从中复制: `dune_rift_3v3` (PATCH:战役沙漠,两个海岸 + 堤道)、`open_range_3v3`、`four_corners_ffa`、`duel_1v1` 和 `etched_desert_2v2` (均为 REMIX)。要制作你自己的地图,请在 `SPECS` 中复制一个并进行微调: ``` from make_map import build_map build_map(dict( terrain="SC2_MP_302", # base terrain (see sc2maps.TERRAINS) scenario_id="SC2_MYMAP", # new map id name="[4] My Map (2v2)", # lobby name out="_my_map.scd", anchors={1:(342,633), 2:(682,392), 3:(631,682), 4:(390,343)}, # spawn x,z teams=[[1,2],[3,4]], economy=dict(base_mass=4, sites=6, per_site=2), patch=None, # None = remix a navigable skirmish terrain )) ``` `build_map` **仅在可导航地面上**放置出生点和经济设施,然后在打包前**验证每个位置都是可导航的且所有出生点均可互相到达**。 如果验证失败,它将拒绝输出地图 —— 这样你就不会遇到经典的“单位无法移动”的失败情况。 ### 两种类型的地图 | 模式 | 何时使用 | 输出内容 | |------|------|-----------| | **REMIX** (`patch=None`) | 基础是原版**遭遇战**地形(各地已完全可导航) | 仅包含 Lua —— 体积微小,100% 安全 | | **PATCH** (`patch=dict(...)`) | 基础是**战役**地形(仅有一小块预烘焙的导航网格) | 新 ID 下的完整地形集,带有重写的导航网格,使你的游玩区域成为一个相连的可导航岛屿 | PATCH 模式是突破性的。示例(打开一个战役沙漠地图并连接其两个海岸): ``` patch=dict(max_slope=6, water_margin=4, seed=(160,500), causeways=[(360, 701, 470, 561)]) # carve a ford across the water ``` 战役地形带有环境风景道具(例如 Illuminate 沙漠中游荡的“Mine Crawler”)。PATCH 构建默认会中和移动道具 (`strip_props="moving"`),这样你的地图就不会继承游荡的车辆;设置 `strip_props=False` 可保留它们,设置为 `"all"` 可丢弃所有道具,或者使用名称子字符串的元组来针对特定道具。 ## 包含内容 | 文件 | 用途 | |------|---------| | [`sc2maps.py`](sc2maps.py) | 核心库:BDF 读写、`Terrain` 加载器(高度场 + 水域 + 导航网格)、导航网格 patcher、Lua/小地图生成器、`.scd` 打包器、安装程序和地形目录。具有完整文档。 | | [`make_map.py`](make_map.py) | 高级 `build_map(spec)` 驱动程序 + 示例配置说明。从这里开始。 | | [`FORMATS.md`](FORMATS.md) | 每种地图文件格式的字节级参考(逆向工程的成果)。 | 实用的库调用: ``` import sc2maps as sm t = sm.Terrain("SC2_CA_I01") # load a terrain t.openness() # largest connected navigable fraction (0..1) sm.TERRAINS # catalog: biome, water level, openness, navmesh type sm.list_installed() # installed custom maps sm.uninstall("_my_map.scd") # remove one ``` ## 导航网格破解原理(简述) `costs.win.bdf` 为每种移动类别保存了一个 1024×1024 的网格,其中 **1 = 可通行,255 = 阻塞**,外加一个相连区域(“岛屿”)网格。引擎在加载时读取此**预烘焙**的网格,并且*不会*重新计算它 —— 因此重写这些字节并重新打包文件会改变单位的可移动范围。战役地形仅烘焙一小块区域(任务区域);此工具将干燥、坡度平缓的地形泛洪填充为一个巨大的可导航岛屿,并(可选地)在水面上开辟堤道。详细的字节级说明请参阅 [`FORMATS.md`](FORMATS.md)。 ## 注意事项 - 构建时的检查保证*地图数据*是完好的(每个位置均可导航,所有出生点均可到达)。它**不**保证遭遇战 AI 在特定地形上能有良好表现 —— 在正式对战前,请先进行一场测试赛。 - 这编辑的是**可导航性**,而不是地形几何形状或纹理。雕刻全新的地貌(重写地形网格)是此处尚未破解的唯一个格式。 - 在 Windows 上测试过;路径自动检测包含 Linux/macOS Steam 位置,但游戏本身属于 Windows 时代 —— 在非 Windows 系统上的实际效果可能因人而异。 ## 许可证 MIT —— 详见 [LICENSE](LICENSE)。本许可证仅涵盖此工具包的原始代码和文档,不包含任何 Supreme Commander 2 资产(这些资产仍归其原始所有者 © 所有)。
标签:Python, rizin, 云资产清单, 地图编辑器, 导航网格, 无后门, 游戏模组, 逆向工具, 逆向工程