地图标记

创作者: s0xxx
已更新:2026-04-25 21:58:23
36KB

关于此 MOD

在地图上用不同颜色标记和绘制。支持单人模式与多人模式(包括混合房间)。
特性
  • 用不同颜色标记地图节点。
  • 在地图上用不同颜色绘制标记。
  • 自动标记节点并按预设颜色高亮(开关)
  • 隐藏节点顶部的图纸(切换开关)。
  • 访问后取消地图标记(开关)。
  • 支持单人模式。
  • 多人模式支持,无地图标记的玩家可回退处理。
多人游戏支持包含已安装与本模组的玩家和未安装的玩家的房间。据我所知,本模组是首个能在混合玩家房间中发送自定义数据包的模组。若你对此实现方式感兴趣,请查阅 技术宅 全体集合!

欢迎随时分享你的想法、意见或疑问 :)
深受启发于 地图标记. 


使用方法
  • (拖动)右键点击 ———> 标记/换色
  • (拖动)双击右键 -----> 取消标记
  • 左键点击调色板 ----> 选择颜色
  • 按 C 键 —— 循环切换颜色
调色板在地图图例中“图例”二字下方。
各项设置的开关位于ModConfig设置中。


安装方法

模组设置可选依赖: 模组配置

下载MapMarker.zip
提取内容并将MapMarker文件夹移至 —
    `C:\Program Files (x86)\Steam\steamapps\common\Slay the Spire 2\mods`
    [若没有“mods”文件夹,请新建一个]

现在你的目录应该长这样:
杀戮尖塔2
| - 模组
``` | | - 地图标记 ```
地图标记.dll
| | | - 地图标记.json
| | - ...
| - ...



待办事项

  • 如果混合大厅功能过于不稳定,或大多数用户用不上,则移除该功能支持。
  • 删除或重做颜色绘制功能(若多数用户用不到)。


技术宅 

STS2的多人在线序列化通过枚举49个硬编码的INetMessageSubtype子类型来构建类型ID表,随后利用ReflectionHelper.GetSubtypesInMods<INetMessage>()添加模组新增的INetMessage类。两端必须持有相同的类型表,否则反序列化会出错——因此,注册自定义消息类型会导致仅部分玩家安装模组的房间出现崩溃或不同步。为解决此问题,我们在现有MapDrawingMessage中嵌入隐写数据:将标记信息打包到NetMapDrawingEvent结构体的量化X/Y坐标字段中,并在屏幕外位置追加一条BeginLine指令。接收端通过NMapDrawings.HandleDrawingMessage的Harmony前缀判断首个事件是否匹配该屏幕外坐标;若匹配,则解码有效数据并路由至RemoteMarkCoordinator,同时返回false以避免生成Line2D。未安装模组的原版客户端仅会在屏幕外渲染一条不可见的线段。由此,我们建立了一条可靠的模组间数据通道,用于存在握手、标记绘制/擦除增量等操作,全程无需触碰消息注册表。

我故意没有把地图绘制消息的字节打包功能抽象成可复用的库。目前,地图标记的网络占用非常小;只有在标记/取消标记节点、改变颜色或打开地图时,才会发送几个同步帧。一个典型操作大概会产生50个数据包。但多个模组产生数量级更多的数据包可能会引发问题,尤其是对原版客户端而言——他们无法选择从模组接收哪些内容。如果MegaCrit能增加官方支持的模组间通信功能就好了。

使用 Xmod 解锁 杀戮尖塔2 的全部潜力 — 今天就探索这些顶级 MOD!