TropicBeltSpacing
模组作者:妙妙在路上 抖音@妙妙在路上 —— 按戴森球计划「回归线分带」自动放大传送带节点间距(省料),每节硬性 ≤ √5.3(2.302 m) 保证原版合法。默认按F9开关功能。自动接管其它类型经纬度长带模组。
| Date uploaded | a day ago |
| Version | 1.5.5 |
| Download link | miaomiaodouyin-TropicBeltSpacing-1.5.5.zip |
| Downloads | 3 |
| Dependency string | miaomiaodouyin-TropicBeltSpacing-1.5.5 |
README
回归线传送带间距 / Tropic Belt Spacing
模组作者:妙妙在路上 抖音@妙妙在路上 —— 按戴森球计划「回归线分带」自动放大传送带节点间距(省料), 每节硬性 ≤ √5.3(2.302 m) 保证原版合法。默认按 F9 开关功能。自动接管其它类型经纬度长带模组。
戴森球计划(Dyson Sphere Program)BepInEx 5 插件。
本模组完全独立:不需要、也不依赖任何其它模组(包括 LongerBelts)。 单独把 dll 丢进
BepInEx\plugins即可使用;它自己实现节点的抽稀与拆节, 而且对“别人生成的节点表”也会做双向校正(过密抽稀、过稀/超限拆短),所以不挑搭档。
- 按游戏的“回归线”分带自动放大传送带节点间距:赤道侧第一带 1.8 格 → 极区带 1.6 格(可在 cfg 里改),中间各带线性插值, 并且始终把每节传送带的长度钳制在原版合法范围内(≤ √5.3 = 2.302172 m),所以在原版(无 mod)里也能正常重建蓝图。
- 游戏内只有一个开关快捷键 F9(可在 cfg 里改):本模组没有任何游戏内 UI 面板,
所有可调项都在
BepInEx\config\TropicBeltSpacing.cfg里改。
1. 原理
1.1 回归线分带(游戏真实网格)
所有岩质行星的表面网格完全一样,网格疏密变化的界线(游戏内部就叫 tropic / 回归线)在以下纬度(度):
0(赤道) | 28.8 | 46.8 | 55.8 | 64.8 | 70.2 | 75.6 | 79.2 | 82.8 | 84.6 | 86.4 | 88.2 | 90(极点)
相邻两条界线之间是一个“带”,南北半球镜像,共 24 个带。相邻带之间的格数比正是官方开发日志里说的那六种: 1:2、2:3、3:4、4:5、5:6、5:8。本模组按带给出间距,赤道侧最大、越靠近极点越小:
| 带 | 纬度范围 | 默认间距(格) |
|---|---|---|
| 0 | 0° ~ 28.8° | 1.800 |
| 1 | 28.8° ~ 46.8° | 1.782 |
| 2 | 46.8° ~ 55.8° | 1.764 |
| … | … | …(线性插值) |
| 11 | 88.2° ~ 90° | 1.600 |
1 格 = 当地网格格子的边长(赤道 2π × 200 m / 1000 = 1.256637 m),因此赤道带 1.8 格 ≈ 2.262 m, 极区带 1.6 格 ≈ 2.011 m(当地格更小时按当地格换算)。
1.2 原版是怎么判定“最远间距”的
反编译游戏本体 Assembly-CSharp.dll 得到的结论:
| 判定 | 出处 | 条件 | 结果 |
|---|---|---|---|
| 太远 | BuildTool_BlueprintPaste::CheckBuildConditions |
`desc.isBelt && | output.lpos - lpos |
| 太近 | BuildTool_Path::CheckBuildConditions |
与连接点距离 < 0.4 |
EBuildCondition.TooClose(13) |
即:单节传送带的直线长度上限 = √5.3 = 2.302172 m,连接类下限 = 0.4 m。
所以 1.6 ~ 1.8 格(2.011 ~ 2.262 m)天然落在原版合法区间内;本模组还会用
min(配置值, 2.302172) − 0.001 作为硬上限,保证任何星球、任何纬度都不会越界。
1.3 本模组的做法(按目标间距沿原版折线重采样)
先说两个从本体反编译 + 数据表核对得到的事实(v1.0.2 之前我把第 2 条搞错了,导致间距被放大 5 倍):
PlanetGrid.segment = 200(绕赤道 200 个大格 × 1.8° = 360°,来自PlanetAuxData..ctor里的((int)(radius / 4 + 0.1)) * 4);1 小格 = 2π / (segment × 5) = 0.36° = 1.256637 m(赤道)。 本体PlanetGrid.segmentTable(512 项,已解出数据)给出的也是 200 / 400 / 500 这类大格列数: 赤道 = 200 大格 = 1000 小格,与 wiki 的网格表一致。PlanetGrid.CalcLocalGridSize()返回的就是一个当地小格的长度(赤道 1.2566 m),不是 1/5 格。
原版 PlanetGrid.SnapLineNonAlloc 生成的节点间距就是 1 小格 ≈ 1.2566 m(纬度方向每步 0.99 小格、
经度方向每步 0.6 小格,再吸附到小格)。因此:
- “只抽稀”做不到 1.6~1.8 格:跳过 1 个节点就是 2 格 = 2.513 m > 原版上限 2.302172 m(非法);
- 必须沿原版折线按目标弧长重新采样,节点可以不在网格点上 ——
LongerBelts放大间距用的也是这个思路。
本模组的流程:
- 先让原版算出网格折线(同尺寸缓冲,路径形状与可达长度与原版一致);
- 目标间距 = 该回归线分带的格数(1.6~1.8) × 当地小格长度,钳制在
[0.4, √5.3 − 0.001]m; - 沿折线按目标弧长重采样:球面 Slerp + 高度线性过渡,保留原版拐点(swerve)与首尾节点;
- 末节过短会与前一节合并,任何一节都不会超过
√5.3(原版 TooFar 上限)。
1.4 数值验证
用 C# 复现“原版 1 格节点折线 → 本模组重采样”(segment = 200,1 小格 = 1.256637 m,上限 1.832 格;间距随纬度递减):
band lat 0~12° 目标 1.800 格 = 2.262 m
原版折线(1格节点) : nodes=38 avg=1.271m (1.011格) max=1.280m 非法节=0
本模组重采样 : 每节 = 2.262m (1.800格),max=1.800格 非法节=0
band lat 30~40° 目标 1.782 格 = 2.239 m
本模组重采样 : avg=2.162m (1.721格) max=2.239m (1.782格) 非法节=0
band lat 60~68° 目标 1.745 格 = 2.193 m
本模组重采样 : avg=2.135m (1.699格) max=2.193m (1.745格) 非法节=0
band lat 80~86° 目标 1.655 格 = 2.079 m
本模组重采样 : avg=2.098m (1.669格) max=1.803格 非法节=0
- 每节典型长度 ≈ 目标(1.6~1.75 格),最大 1.79 格 < 1.832 格上限,没有非法节;
- 平均值略低于目标,是因为“接到鼠标端点的最后一节”和拐点处必然有一节稍短(原版同样如此);
- 节点数比原版少约 1/3~2/3 —— 这就是“同样长度、更少的带子”。
1.5 后置补丁兜底(仍然不依赖任何其它模组)
如果前置补丁没跑到(例如别的模组接管了节点生成),PlanetAuxData.SnapLineNonAlloc 的后置补丁
会对现有节点表做同样的重采样:过密就抽稀、过稀就加密、超上限就拆短,最终间距都会被拉回分带目标。
1.6 斜拉走线:原版折弯 + R 键切换
- 本模组不自己发明走线:它拿原版
PlanetGrid.SnapLineNonAlloc生成的网格折线(先经后纬 / 先纬后经两种变体, R 键切换的path参数原样透传),只是沿这条折线按目标弧长重新采样,并强制保留拐点(swerve)节点 —— 所以斜拉时的折弯位置、R 键切换后的走线都与原版一致。 - 如果同时装了会自己生成节点的模组(典型是 LongerBelts 的「更改经纬线模式默认跨度」),
它会绕过原版折线,导致折弯变了、R 键没反应。本模组默认会把这些函数接管回原版网格折线
(
Spacing/UseVanillaGridPath = true,启动日志里会打印“已接管 LongerBelts”), 所以只装本模组就能得到完整功能,不受其它模组影响。
2. 安装
- 游戏已装 BepInEx 5(x64,r2modman 里装 BepInExPack 即可)。
- 把编译产物
TropicBeltSpacing.dll放到:- 游戏本体:
<Dyson Sphere Program>\BepInEx\plugins\TropicBeltSpacing\TropicBeltSpacing.dll - 或 r2modman:
%APPDATA%\r2modmanPlus-local\DysonSphereProgram\profiles\<配置名>\BepInEx\plugins\TropicBeltSpacing\
- 游戏本体:
- 进游戏后按 F9 开关本模组功能(本模组没有游戏内 UI,全部设置改 cfg 文件)。
配置文件:BepInEx\config\TropicBeltSpacing.cfg(cfg 格式,BepInEx 自动生成/保存;
改完保存即可,游戏里按 F9 或重进生效)。
3. 编译
cd TropicBeltSpacing
powershell -ExecutionPolicy Bypass -File .\build.ps1 # 自动找游戏目录和 BepInEx
powershell -ExecutionPolicy Bypass -File .\build.ps1 -Zip # 额外打包 zip
- 不需要联网、不需要 .NET Framework 目标包:脚本用 .NET SDK 自带的 Roslyn
csc, 直接引用游戏DSPGAME_Data\Managed里的 Mono 程序集和 BepInEx 的0Harmony.dll/BepInEx.dll。 - 可用
-GameDir "X:\...\Dyson Sphere Program"和-BepInExCore "X:\...\BepInEx\core"手动指定路径。 - 有 Visual Studio / dotnet + Framework 目标包时,也可以直接用
TropicBeltSpacing.csproj构建。
4. 配置(cfg)说明
| 段 / 键 | 默认 | 说明 |
|---|---|---|
| General / ToggleHotKey | F9 |
游戏内唯一的按键:开关本模组功能。BepInEx 的写法是"最后按下的键写在前面":F9 = 直接按 F9;Alpha4 + LeftAlt = 按住 Alt 再按 4。本模组两种顺序都能识别,但不建议写反。 |
| General / ConfigVersion | 自动 | 配置版本号,程序自动迁移用,不需要手动改 |
| Spacing / Enable | true | 关掉即完全恢复原版间距 |
| Spacing / EquatorBandCells | 1.8 | 赤道带(0°~28.8°)间距,单位:当地格(最大的一档) |
| Spacing / PolarBandCells | 1.6 | 极区带(88.2°~90°)间距,单位:当地格(最小的一档) |
| Spacing / SpacingPerBand | 空 | 可逐带指定,例如 1.8,1.78,1.76,...(赤道带在前,数量需等于带数 12) |
| Spacing / BandLatitudes | 0,28.8,...,90 |
回归线纬度表,一般不用改 |
| Spacing / MaxSegmentMeters | 2.302172 | 单节长度上限,不要改大(超过原版 TooFar,蓝图无法在原版重建) |
| Spacing / MinSegmentMeters | 0.4 | 单节长度下限 |
| Spacing / LogSpacing | false | 验证日志(每秒最多一条,输出带号/目标间距/实测均长)。默认关闭,需要验证模组是否生效时再打开 |
| Spacing / UseVanillaGridPath | true | 斜拉时强制走原版网格折线(折弯 + R 键切换),并接管 LongerBelts 等模组的节点生成 |
| Spacing / BlueprintSafe | false | 默认开启 = 蓝图安全(间距取当地整数格:能 2 格就 2 格,否则 1 格;拐点严格 90°,蓝图可存可复现);关闭 = 自由间距(1.6~1.8 当地格,两条腿等分,但蓝图存不了) |
| Spacing / VerticalThin | true | 垂直抽稀传送带:斜坡带和垂直带都生效。<斜坡带>:沿原版路径按弧长均分抽稀(每节 1.5~1.8 格,等长等爬升、带面不扭曲)。<纯竖直>(X/Y 相同只有 Z 不同):利用游戏「≤1.5 格高度差直接连接」的机制,在后置补丁把高度差均分成 ≤ VerticalThinMaxCells(默认 1.45)格的节,X/Y 完全不变、只有 Z 变化,每一段都被游戏直接连接 → Z 轴抽稀生效 |
| Spacing / VerticalThinMinCells | 1.5 | 垂直抽稀的每节最小长度(当地格) |
| Spacing / VerticalThinMaxCells | 1.45 | 垂直抽稀(Z 轴)的每节最大高度(格)。游戏对 ≤1.5 格的高度差直接连接,不要改到 1.5 及以上 |
| Spacing / SkipClimb | true | 爬坡整条交给原版。只在 VerticalThin=false 时生效 |
| Flatten / Enable | false | 自动拉平总开关(默认关闭:改 tilt/朝向会把竖直带弄歪,垂直抽稀已覆盖爬坡场景) |
| Flatten / ClearTilt | true | 清除 tilt(带面水平,不翻转) |
| Flatten / StraightenVertical | true | 竖直连接时拉直到同一列 + 统一朝向 |
| Flatten / EvenAltitude | false | 竖直带高度按 1.3333 m 层均分(会改变中间高度层,默认关) |
| Flatten / VerticalAngleTolerance | 1.0 | 判定“垂直连接”的角度容差(度) |
| Flatten / VerticalMinHeightCells | 0.5 | 判定“垂直连接”的最小高度差(层,1 层 = 1.3333 m) |
判断标准:路径两端 同一根网格列(经纬度一致、只差高度)且高度差 ≥ 设定层数时,视为“两端垂直连接”, 此时才会做“拉直 + 统一朝向”;否则只清 tilt。拉直时保留各节点自身的高度层(默认),不用手工调高度。
5. 调整方式:只改 cfg 文件
本模组没有游戏内 UI 面板(这样最省性能、也最不容易和别的模组抢输入)。 游戏内只需要按 F9 开关功能;其它任何调整都改这个文件:
BepInEx\config\TropicBeltSpacing.cfg
常用项(完整说明见上一节的表):
| 想做什么 | 改哪个键 |
|---|---|
| 换开关快捷键(默认 F9) | [General 通用] ToggleHotKey |
| 改赤道带 / 极区带间距 | [Spacing 间距] EquatorBandCells / PolarBandCells |
| 逐带精确指定间距 | [Spacing 间距] SpacingPerBand(12 个值,赤道带在前) |
| 需要验证时打开日志(默认关) | [Spacing 间距] LogSpacing = true |
| 爬坡也想省料(可能带面扭曲) | [Spacing 间距] SkipClimb = false(仅当 VerticalThin=false 时有效) |
| 竖直方向交回原版 | [Spacing 间距] SkipVertical = true |
| 垂直抽稀传送带开关(默认开) | [Spacing 间距] VerticalThin = true |
| 垂直抽稀每节最大高度(格,Z 轴) | [Spacing 间距] VerticalThinMaxCells = 1.45(不要 ≥1.5) |
| 蓝图安全整数格模式 | [Spacing 间距] BlueprintSafe = true |
| 自动拉平(默认关,开了可能扭) | [Flatten 自动拉平] Enable = true |
改完保存即可;被 F9 开关的那个值会立刻反映在日志里(
间距已开启/关闭)。
6. 怎么确认模组真的生效(v1.0.1 之后的验证流程)
- 看 BepInEx 日志开头:应出现
[Info : BepInEx] Loading [Tropic Belt Spacing 1.5.5] [Info :Tropic Belt Spacing] 开关快捷键 / toggle hotkey = F9 (默认 F9;本模组没有游戏内 UI,全部设置都在 BepInEx\config\TropicBeltSpacing.cfg) [Info :Tropic Belt Spacing] 当前状态 / spacing = 开启(省料间距) - 看 BepInEx 日志(
BepInEx\LogOutput.log)应该出现三行补丁结果:
任何一行是[Info :Tropic Belt Spacing] 补丁成功 / patch OK: PlanetGrid.SnapLineNonAlloc (间距核心) [Info :Tropic Belt Spacing] 补丁成功 / patch OK: PlanetAuxData.SnapLineNonAlloc (兜底抽稀) [Info :Tropic Belt Spacing] 补丁成功 / patch OK: BuildTool_Path.DeterminePreviews (自动拉平)补丁失败 / patch FAILED就说明该补丁没挂上(把日志发我)。 - 拖一条传送带:日志里每秒最多一条
日志里[Info :Tropic Belt Spacing] [TropicBeltSpacing] lat=32.1° band=1 cells=1.618 target=2.033m nodes 238->31节点 238->31就是“同样长度、带子数量少了约 8 倍”。 - 如果日志里没有那三行:
- 先确认本模组自己有没有报错(
[Error :Tropic Belt Spacing])。本模组不依赖其它模组, 只要patch OK三行都在,拖传送带就应该看到nodes N->M变化。 - 如果同时装了别的会改传送带节点间距的模组(例如 LongerBelts 的「更改经纬线模式默认跨度」), 两者会同时作用在同一条带子上。本模组已经加了双向校正兜底: 对方生成得比目标密→会被抽稀;比目标**明显稀疏或超过 sqrt(5.3)**→会被拆短; 但如果对方输出的是 1.8 格这种"刚好比赤道带目标 1.6 格稀一点点"的间距, 数学上没法只靠删/插把每一节都变成 1.6 格(会造出更短的碎节),这时本模组会保持它的间距。 想要严格按回归线分带(赤道 1.6 格 → 极区 1.8 格),建议只保留本模组,把另一个关掉。
- 确认游戏版本与 mod 是否匹配(本模组基于 0.10.35 的
Assembly-CSharp.dll核对过签名)。
- 先确认本模组自己有没有报错(
7. 已知限制
- 只影响普通(经纬线)模式的传送带节点间距;按 R 切换的“测地线模式”保持原版行为。
- 抽稀只减少节点,不增加:一笔拖拽能覆盖的路径长度与原版一致(原版
BuildTool_Path.pathPoints是 256 个元素)。 - 竖直拉平只处理“整条路径都是传送带”的情况,避免影响其它建筑的建造判定。
- 本产物:已用本机游戏(0.10.35,
Assembly-CSharp.dll)反编译核对过补丁目标签名与关键机制, 并完成编译与算法数值验证,且已在游戏内实机验证(分带省料、斜坡/垂直抽稀、F9 开关)。
8. 更新日志
1.5.5 —— 发布版:验证日志默认关闭 + 文档/文案订正
Spacing/LogSpacing默认改为 false(验证日志默认不输出;需要确认模组生效时再打开)。VerticalThin说明文本改为 <斜坡带> / <纯竖直> 分条描述,与实际行为一致。VerticalThinMaxCells默认 1.45(游戏对 ≤1.5 格高度差直接连接,1.45 留安全余量)。- README 全面核对:配置表与实际默认值一致、验证流程日志样例更新、移除“尚未实机验证”的旧说明。
1.5.4 —— 修正 Z 轴抽稀不触发:同列爬升的任意节点数结果都强制改写
- 你的日志显示竖直连接时游戏输出的不是 2 个节点,而是 5/11 个节点的逐层楼梯,
被旧条件(
节点数 ≤ 2)挡住,Z 轴抽稀从未触发。 - 修正:前置补丁对纯竖直/近竖直(弧长 <25cm)一律放行原版(不再自己输出同方向节点——
那会被游戏内部按层重算覆盖);后置补丁对**同列爬升、任意节点数(≥2)**的结果统一改写为
「X/Y 不变、Z 均分 ≤
VerticalThinMaxCells(1.45) 格」的等分点 → 每段都走直接连接。 - 日志:
垂直抽稀传送带生效(Z轴):爬升X层 → N节 每节约Y米(Z格)(原节点数也会打印)。
1.5.3 —— 按游戏「≤1.5 格直接连接」机制实现 Z 轴抽稀(后置补丁、X/Y 不变)
- 你提供了关键机制:原版对 ≤1.5 格的 Z 轴高度差会「直接连接」(不均分、不插中间层)。
- 实现改为后置补丁:纯竖直(X/Y 相同只有 Z 不同)时,前置补丁不再自己构造节点
(1.5.1/1.5.2 的输出会被游戏 count==1 分支丢弃),而是放行原版;
原版走专门分支输出 [begin,end] 两个世界节点后,后置补丁把它们重写为 n+1 个等分点:
- X/Y 线性插值 —— 同列 → 完全不变;
- 只有 Z(半径)线性分布,每节高度 = 高度差/n ≤
VerticalThinMaxCells(默认 1.45 格, 略低于 1.5 格直接连接阈值)→ 每一段都被游戏直接连接 → Z 轴抽稀生效。
- 斜坡带仍由前置补丁按弧长均分抽稀(不变)。
- cfg:
VerticalThinMaxCells默认 1.8 → 1.45(不要改到 1.5 及以上)。
1.5.2 —— 纯竖直抽稀去掉横向偏移(X/Y 绝对不变),改用游戏「直接连接」机制
- 1.5.1 的 ±6cm 蛇形偏移会导致 X/Y 坐标变动,已撤销。
- 按游戏本体机制:Z 轴连接是「直接连接」—— 高度差在范围内时两端节点直接相连, 不插中间层、不网格行走。因此纯竖直抽稀 = X/Y 绝对不变,只按 i/n 均分节点数, 节距 = 高度差/n(等距),游戏把相邻节点直接连成竖直段。
- 斜坡带仍沿原版路径按弧长均分抽稀(1.4.2 起已验证生效)。
1.5.1 —— 纯竖直连接也强制抽稀(绕过游戏的节点表丢弃分支)
- 反编译确认:游戏对「网格路径只有 1 个点」的纯竖直连接会丢弃整个节点表、 只保留 begin/end 两个节点 —— 这就是之前纯竖直无法抽稀的原因。
- 绕过方案:给路径加入一个半径 6cm 的切向小圆——内部节点均匀分布在圆上、 走一整圈回到原列(首末节点偏移恰为 0,端点精确落在原列), 相邻节点距离全部相等 → 弧长分数精确 = i/n → 高度精确均分 → 强制抽稀生效。
- 模拟验证(目标 1.8 格):垂直 4 层 → 3 节每节 1.42 格;6 层 → 4 节 1.59 格; 10 层 → 6 节 1.77 格;同一条带每节完全等长,最大横向偏移仅 12cm(视觉不可见), 每节 ≤ √5.3−3cm 蓝图合法。
- 日志:
垂直抽稀传送带生效:爬升X层 → N节 每节约Y米(Z格)(纯竖直同样输出)。
1.5.0 —— 功能更名「垂直抽稀传送带」+ 修正纯竖直连接(反编译定位根因)
- 更名:「垂直等距分割」→ 「垂直抽稀传送带」,所有文本(日志、cfg 说明、文档)同步修改;
cfg 键同步更名并自动迁移旧值:
VerticalEvenSpacing→VerticalThin、VerticalMinCells→VerticalThinMinCells、VerticalMaxCells→VerticalThinMaxCells。 - 反编译
PlanetAuxData.SnapLineNonAlloc(929 条指令)定位纯竖直失效的根因: 游戏对「网格路径只有 1 个点(即 X/Y 相同的纯竖直)」有专门分支 —— 直接丢弃节点表、 只输出 begin/end 两个世界节点(返回 2)。也就是说模组输出的任何纯竖直节点表都会被游戏覆盖, 无法从模组侧抽稀;且物理上纯竖直每节 2 层 = 2.67m 已超 √5.3,每节 1 层就是纯竖直的上限。 - 处理:纯竖直(原版只给 1 个点)原样交回原版(走游戏专门分支,保证可用),
并打印日志
垂直抽稀:纯竖直连接(X/Y相同)受 √5.3 限制保持原版每节1层; 斜坡带(有水平分量的爬升)照常垂直抽稀 —— 你日志里 7 层 → 11 节 1.48 格(省35%)就是它生效的证据。 - 成功日志更名为:
垂直抽稀传送带生效:爬升X层 → N节 每节约Y米(Z格)。
1.4.2 —— 等距分割同时覆盖斜坡带与垂直带(并修正未生效问题)
- 按要求:斜坡带(X/Y 也有偏移的爬坡)和垂直带(X/Y 相同只有 Z 不同)都执行等距分割, 不再把斜爬交回原版(1.4.1 曾把斜爬排除在外,已撤销)。
- 统一算法:取原版细路径(网格行走形状),沿它按弧长均分取点; 游戏按「节点序号/弧长比例」在两端高度间线性插值,弧长均分 ⇒ 高度同比例均分 ⇒ 每一节的 3D 长度(水平弧 + 爬升)完全相等 —— 这正是“等距分割”且带面不扭曲的原因。 纯竖直时细路径退化为同一方向,算法自动退化为“按高度均分”,与 1.4.0 行为一致。
- 每节长度仍钳制在
VerticalMinCells ~ VerticalMaxCells当地格(默认 1.5~1.8 格)、≤ √5.3−3cm。 - 模拟验证(赤道带、目标 1.8 格):垂直 4/6/10 层 → 每节 1.41/1.75/1.62 格; 斜坡 4层×4格 / 6层×6格 / 8层×8格 → 每节 1.46/1.75/1.67 格,同一条带内每节完全等长。
- 分支前移到「调用原版之前自取细路径」,纯竖直时原版给不出路径也会退化为 2 点继续分割,
不会再被「节点过少→回退原版」截走;日志(每秒一条):
等距分割生效:爬升X层 → N节 每节约Y米(Z格)。
1.4.1 —— 修正垂直等距分割的判定与生效位置(按「X/Y 相同、Z 不同」判定)
- 判定改为与需求一致:两个传送带节点 X/Y 相同(同一根网格列)、只有 Z(高度)不同 → 垂直带; 两端水平偏移超过 ~0.8m(δ>0.004)视为斜爬,不按垂直带处理(斜爬仍由 SkipClimb 交给原版)。
- 生效位置前移:原来放在「调用原版取节点之后」,纯竖直时原版节点在单位球上是同一个点, 可能先被「节点过少→回退原版」的分支截走,导致功能没机会执行;现在在调用原版之前就完成判定与分割。
- 新增独立日志(每秒最多一条):
垂直等距分割生效:爬升X层 → N节 每节约Y米(Z格) δ=...; 斜爬被跳过时也会提示爬升X层但水平偏移δ=... 较大,不按垂直带处理,方便在日志里确认判定结果。 - 构造方式:输出按序号均分的单位方向节点(游戏按序号在两端高度间线性插值 → 每节爬升一致)。
1.4.0 —— 新增「垂直等距分割」:两端垂直相连时自动拉长垂直带间距
- 新功能(默认开启,
Spacing/VerticalEvenSpacing):当两端垂直传送带相连(有明显爬升)时, 不再把路径交给原版,而是按高度等距分割 —— 输出按序号均分的节点, 游戏按节点序号在两端高度间线性插值,所以每一节的爬升量完全一致:- 每节长度钳制在
VerticalMinCells ~ VerticalMaxCells当地格(默认 1.5 ~ 1.8 格), 即自动把垂直带间距从原版 1 格拉长(3 层以上爬升实测 1.4~1.8 格); - 每节等长等爬升 → 带面倾角一致 → 不会出现“带面轮廓扭曲”(这正是当初爬坡交回原版的原因, 等距分割从根上解决了不一致);
- 每节仍硬性 ≤ √5.3−3cm,蓝图在原版可重建;1~2 层的矮爬升受 √5.3 限制保持每节 1 层。
- 每节长度钳制在
Spacing/SkipClimb改为只在 VerticalEvenSpacing = false 时生效(让位给等距分割)。- 自动拉平(Flatten/Enable)保持默认关闭(1.2.6 起已关闭,本版再次确认),两者互不依赖。
- cfg 新增:
VerticalEvenSpacing = true、VerticalMinCells = 1.5、VerticalMaxCells = 1.8。
1.3.0 —— 删除游戏内 UI,只保留 F9 开关(其余全部改 cfg)
- 删除整个 ALT+4 设置面板:不再有任何
OnGUI绘制、不再改全局GUI.skin、不再抢输入。 游戏内只剩一个快捷键:F9 开关本模组功能([General 通用] ToggleHotKey可改)。 - 所有可调项本来就在
BepInEx\config\TropicBeltSpacing.cfg里,现在只能通过这个文件调整; 面板相关的配置项(HotKey、ShowWindowOnStart、UI/WindowScale)已删除。 - 代码上:
UiWindow.cs整文件移除(备份在removed/UiWindow.cs.bak), 快捷键检测独立成Hotkeys.cs(零每帧分配)。 - 性能说明:旧面板在关闭状态下几乎不耗 CPU(
Draw()第一行就return), 真正有开销的是「面板打开时每个 OnGUI 事件重建状态/分带表字符串」—— 那部分在 1.2.11 已节流,本次直接连面板一起去掉,开销归零。
1.2.11 —— 性能优化(降低占用、长时间稳定运行)
- 去掉每帧堆分配(最主要的一项):
Update()检查两个快捷键时,旧实现每帧都要new List<KeyCode>+ToArray()各两次(合计 4 次分配/帧);现在改为解析结果缓存 (KeyboardShortcut是 struct,因此按“主键是否变化”+“距上次解析是否超过 1 秒”失效), 稳态下零分配。 - 日志字符串按需拼接:
NoteApplied以前无条件string.Format(拖带子时每帧一条垃圾); 现在只在“真的到了输出时刻”或“面板开着”时才拼,面板关闭时连平均/最长统计都跳过。 - 异常日志节流:
几何异常已回退原版节点、后置重采样异常已跳过改为每秒最多一条。 - 面板重绘节流:状态与分带表字符串(12 行)缓存为 4 次/秒重建一次,不再每个 OnGUI 事件重拼; GUI 皮肤字号只在缩放变化时写入。
- 拆节循环上限收紧:
EnforceMaxSegment每次插点都要搬移数组尾部(O(n)),上限从 512 收到 64, 避免病态情况下卡顿;真出界时由“回退原版节点”的安全网兜住。 - 补丁只在“计算传送带路径时”执行;爬坡/竖直路径默认直接放行(
SkipClimb), 所以空闲帧开销 ≈ 0,拖动时也只有一次线性遍历。
1.2.10 —— 换缩略图 + 精简说明
- 缩略图换成新版 256×256
icon.png;manifest.json描述里删去“斜拉走原版网格折线…”那几句。
1.2.9 —— 作者信息 + 打包规范化
- 说明开头与面板顶部加上「模组作者:妙妙在路上 抖音@妙妙在路上」;
- 打包补齐
manifest.json/icon.png/ 根README.md,符合 r2modman / Thunderstore 本地模组结构。
1.2.8 —— 修掉“带面轮廓扭曲”:爬坡路径整条交回原版
- 你确认了是带面轮廓扭曲(位置是直的,带面在扭)。原因找到了: 带面的 pitch/tilt 是游戏按每一节各自爬升的高度算出来的;本模组把间距拉大之后, 各节爬升量不再一致(例如原来每节爬 1 层,现在隔一节爬 2 层),于是各节倾角不一致 → 接起来看就是带面扭曲。原版间距下各节爬升一致,所以原版是平顺的。
- 修正:新增
Spacing/SkipClimb = true(默认开启)——只要这条路径有明显爬坡 (高度差 ≥ClimbSkipLevels,默认 0.25 层 = 0.33 m),就整条交给原版, 间距/位置/带面全部保持原版 → 不再扭曲。 - 纯水平(无爬坡)的路径仍然按回归线分带省料放大,不受影响。
- 需要爬坡也省料时把
SkipClimb改成 false(代价就是带面可能扭曲)。
1.2.7 —— 竖直方向改回本模组的 L 形(不要原版那条斜线)
- 1.2.5/1.2.6 把竖直方向“交给原版”,结果原版是把两端直接连成一条斜线 —— 就是你看到的“依然是歪斜的”。(原版只有 Z 字那种带水平偏移的走法才会有一段真正竖直的带。)
- 现在
Spacing/SkipVertical默认 false:竖直/近竖直方向也由本模组重排成 严格 90° 的 L 形折线(先沿经线竖直走,再一小段水平接上目标)→ 竖的那一段是真竖直, 和你说“左边的 Z 字”效果一致。 Flatten/Enable仍为 false(不再清 tilt、不改朝向、不改位置),避免再出现扭曲。- 注意:1.2.6 时我在 cfg 里改的
Flatten/Enable = false被正在运行的游戏退出时写回 true 覆盖了; 这次请在游戏关闭状态下重启一次,让 cfg 生效(或直接用我更新好的 cfg)。
1.2.6 —— 找到竖带歪扭的真正原因:自动拉平清 tilt(默认改回关闭)
- 现象:两端各放 2 格传送带后相连,
- 走“Z 字”(带一段水平偏移)时竖起的部分是平直的;
- 走“I 字”(纯竖直)时是歪歪斜斜的。
- 日志显示
节点 2->2(模组基本没参与间距),所以问题不在间距,而在自动拉平: 它把竖直带的tilt归零了。原版爬坡带的 tilt 是用来让带面顺着坡度贴合的正确值, 清成 0 之后带面就翻了,看起来就是歪扭的(Z 字因为两端水平偏角超容差、没被清 tilt,所以反而正常)。 - 修正:
Flatten/Enable默认 false(自动拉平整体关闭);竖直方向另有Spacing/SkipVertical = true完全交回原版。两条加起来,竖带的 tilt / 朝向 / 位置全部保持原版 → 与左边一样平直。 - 想恢复“自动拉平”老行为可在 cfg 里把
Flatten/Enable改成 true(不推荐)。
1.2.5 —— 撤销 1.2.4 的竖直拉直(它把本来笔直的带子弄歪了)
- 1.2.4 让“竖直拉直”在更多情况生效,结果原版本来笔直的竖直带也被改歪了, 原因是两处:① 强行把每个带子的朝向(lrot)统一成同一个,而朝向必须与各自那一段的几何一致; ② 用球面插值重排节点位置,和游戏自己算的高度层/网格点混在一起就歪了。
- 现在改为最保守的做法:
Spacing/SkipVertical = true(默认):判定为竖直(两端水平偏角 ≤VerticalAngleTolerance=15°、 高度差 ≥VerticalMinHeightCells=0.5 层)时,本模组完全不插手,直接交给原版 —— 原版竖直带本来就是笔直的一条;同时也通知后置补丁不要动它。- 自动拉平只保留清除 tilt(避免带面翻转),不再改位置、不再改朝向。
- 效果:竖直方向与纯原版一致(笔直);水平/斜拉方向仍然按回归线分带省料放大。
1.2.4 —— 竖直拉带拉成笔直一条(不再歪歪扭扭)—— 已撤销,见 1.2.5
- 以前只有“两端正好在同一根网格列上”才做拉直(判据
radialDelta <= 0.0005太严), 只要水平偏一点点就放弃拉直 → 保留原版那种一左一右的网格行走,看起来就是扭曲的。 - 现在改成:只要整体接近竖直(两端水平偏角 ≤
VerticalAngleTolerance,默认由 1° 放宽到 15°, 且高度差 ≥VerticalMinHeightCells),就把整条带子的水平走向拉成一条直线 (在起点方向与终点方向之间做球面插值),并统一朝向、清除 tilt。 - 高度层沿用游戏算好的值(
EvenAltitude关闭时不动高度), 且 t=0 / t=1 仍分别等于原来的首末节点位置,所以两端连接不会被破坏。 - 效果:竖直方向拉出来的传送带像你截图左边那样笔直;水平/斜拉的省料逻辑不变。
1.2.3 —— 修掉“竖直/跨高度相连时出现碰撞、拉不出带”的真正元凶
- 日志证据:
节点 5->246(省0%)—— 原版只给 5 个节点,却被兜底重采样灌到容量上限 246, 于是一条本该几十米的带子被铺成了绕星球半圈的红线 → 游戏报 与其他物体碰撞。 - 原因:竖直/跨高度的连接里,本模组的前置补丁会走“退回原版节点”的分支(因为这种连接的 L 形折线退化、没有拐点),但退回时没有通知后置补丁,后置补丁又把那 5 个节点当成 “太稀”去加密,结果灌满数组。
- 修正:
- 前置补丁的所有出口(含退回原版)都标记
_prefixAppliedThisPath, 后置补丁一律不再重复处理同一条路径; - 后置补丁新增安全网:重采样结果比输入暴涨(
> 输入×2+8或顶到容量)就保持原样不动, 并打印后置重采样异常已跳过:节点 5->246 ...。
- 前置补丁的所有出口(含退回原版)都标记
- 效果:竖直/跨高度相连会按原版节点直通(一定能连上、不会碰撞),水平方向照旧省料放大。
1.2.2 —— 修掉“往 Z 轴(上)方向、两端先各放一格传送带再相连时拉不出带”
- 现象日志:
节点 5->246(省0%)—— 原版只算 5 个节点,本模组却把数组写满(246 = 容量上限), 结果是腿末端(连接点)根本写不进数组,所以连不上、拉不出带。 - 三个修正:
- 自由间距分节数改为先给端点留一个位置(
parts = room - 1),并无条件补写腿末端, 保证拐点/终点一定在数组里 → 一定能连上目标; - 整数格分支同样加了“腿末端必写”;
- 分节下限
Mathf.Max(0.02f, target)的 0.02 在单位球尺度下等于 4 米(把目标间距顶掉了), 改为1e-5f。
- 自由间距分节数改为先给端点留一个位置(
- 新增安全网:本模组间距永远 ≥ 原版(1 小格),所以输出节点数正常情况下必然 ≤ 原版节点数;
一旦明显超出(
> 原版×2+4或顶到容量),说明这次几何算出了界,直接回退成原版节点 (原版一定能连上),并在日志里打印几何异常已回退原版节点:latB/lonB/latE/lonE/腿序/目标/节点数, 方便定位。
1.2.1 —— 撤销 R 键三段循环,改为“开关快捷键”(回到 1.1.3 行为)
- R 键三段循环没有生效,已撤销,行为恢复为 1.1.3(自由间距省料 + 严格 90° 拐点)。
- 新增开关快捷键:默认 F9,按一下在「模组间距(省料)/ 原版间距」之间切换;
日志会打印
[TropicBeltSpacing] 间距已开启/关闭。 - 快捷键可改:游戏内没有 UI,直接改 cfg 里的
[General 通用] ToggleHotKey(默认F9) (BepInEx 格式:主键在前、修饰键在后,例如F9或Alpha4 + LeftAlt)。 - 游戏内按 F9 就是
[Spacing 间距] Enable的开关,改 cfg 也等效。
1.2.0 —— 新增 R 键三段循环(已撤销,见 1.2.1)
- 本版本尝试给 R 键加三段循环,未生效,1.2.1 已撤销并改用独立开关快捷键。
1.1.3 —— 修掉“省料没生效”的根因(我对蓝图格式的理解错了)
- 关键事实(从本体
BlueprintUtils.GenerateBlueprintDataIL 确认):蓝图里 belt 的位置用localOffset_x/y/z和localOffset_x2/y2/z2(第二端)保存,都是 float, 计算式是(位置 − 包围盒角) / 包围盒宽高—— 也就是小数归一化坐标,不会取整。 所以“节点必须落在整数格”是我之前的错误结论,其实半格间距的带子也能保存/粘贴蓝图, 只要每节 ≤ √5.3 = 2.302 m(TooFar 上限)即可。 - 因此默认改回自由间距(
Spacing/BlueprintSafe = false):按回归线分带做 1.6~1.8 当地格, 每节硬性 ≤ 2.2722 m → 蓝图合法,且真正省料(赤道约省 44%)。 - “整数格”模式保留为可选项(几乎不省料,只用于需要与原版逐格一致的特殊情况)。
1.1.2 —— 明确“省料”的物理上限,并把日志改成可核对的形式
- 日志新增“省 X%”:
节点 14->8(省43%) 实测均长=2.174m(1.80格) 最长=2.174m(上限2.302m), 一眼就能看出这一笔省了多少传送带、有没有贴着上限。 - 默认回到
BlueprintSafe = true(保证蓝图合法优先): 所有节点都在原版整数格上,保存/粘贴蓝图不会出现任何非法节。 - 省料的物理上限(原版规则决定,改不了):
- 每节 ≤ √5.3 = 2.302172 m(TooFar 上限);
- 蓝图只接受整数个当地格的节点:1 格 = 当地格长(赤道 1.2566 m),2 格 = 2×当地格长;
- 于是当地格 ≤ 1.136 m 的纬度可以取 2 格(省 50%),否则只能 1 格(省 0%)—— 赤道附近当地格最大(1.26 m),2 格 = 2.51 m 必然超限。
- 想突破这个上限(每节 ≈1.8 当地格 ≈ 2.26 m,省 44%)必须让节点落在半格上,
那就不能保证蓝图合法:把
Spacing/BlueprintSafe改成 false 即是这种“省料优先”模式。
1.1.1 —— 修掉“沿经线间隔太长(7.5 m)”的元凶
PlanetGrid.DetermineLongitudeSegmentCount(idx, segment)的idx是大格行号(lat / (2π/segment), segment/4 = 每半球 50 行),1.1.0 里我误用了小格行号(lat / (2π/(segment·5)))→ 16° 处把经线列数算成 32(实际 200)→ 纬线方向的“一格”被算成 7.54 m,日志里节点 14->4 实测均长=5.234m 最长=7.549m就是这个 bug。InsertMidpoint的最小长度判据从 0.05 改成 1e-6:节点表是单位球坐标(半径 1), 0.05 相当于 10 m,导致“超上限劈开”这道保险在单位球下完全失效。- 修正后经线方向 = 1.2566 m(1 小格),纬线方向 = 当地格(16° 处 1.207 m), 自由模式下两条腿都按分带目标 1.6~1.8 当地格等分,且每节 ≤ √5.3−3cm。
- 因此默认又切回自由间距(能看到“自动判定最长间距”的效果);
需要蓝图可存取时把
Spacing/BlueprintSafe设为 true(那时间距只能取整数个当地格)。
1.1.0 —— 严格 90° 拐点(L 形走线)+ 两种模式都真正生效
- 之前是拿原版那条“网格行走”节点表去抽稀,它本身会带斜向过渡 → 你红框里那个斜拉节; 现在改成自己构造 L 形折线:先沿一条腿(只动纬度或只动经度)走到拐点,再沿另一条腿到终点, 拐点必是节点 → 永远不会出现斜拉的节,R 键仍然切换“先经后纬 / 先纬后经”。
- 两条腿各自把间距等分(自由模式)或按整数个当地格步进(蓝图安全模式),首尾节点间距与中间一致。
- 数值验证(拐点为节点、无斜拉节、无越界节):
free start(20,10) end(26,14) target=2.126m nodes= 17 avg=2.093m (1.77 cell) max=2.094m diagonalSegs=0 overLimit=0
free start(45,10) end(49,16) target=1.599m nodes= 19 avg=1.539m (1.73 cell) max=1.551m diagonalSegs=0 overLimit=0
free start(70,10) end(74,20) target=0.731m nodes= 33 avg=0.737m (1.71 cell) max=0.740m diagonalSegs=0 overLimit=0
lattice start(20,10) end(26,14) target=2.126m nodes= 24 avg=1.456m (1.23 cell) max=2.259m diagonalSegs=0 overLimit=0
lattice start(45,10) end(49,16) target=1.599m nodes= 23 avg=1.259m (1.42 cell) max=1.374m diagonalSegs=0 overLimit=0
lattice start(70,10) end(74,20) target=0.731m nodes= 22 avg=1.123m (2.61 cell) max=1.257m diagonalSegs=0 overLimit=0
- 因为拐点/两条腿分开了,蓝图安全模式(默认)现在也能真正放大: 纬线方向当地格 1.13 m 时 2 格 = 2.26 m ≤ √5.3 ✓ 会取 2 格;经线方向 2×1.2566 = 2.513 m ✗ 自动退回 1 格。 这样既有放大效果,又能保存蓝图并在原版复现。
1.0.9 —— 默认改回“自由间距”,让放大效果真正可见
- 1.0.8 把蓝图安全模式设成默认,但它的数学结论是:赤道到中纬度根本无法放大
(当地格 1.15~1.26 m,2 格 = 2.30~2.51 m > √5.3 → 只能保持 1 格 = 原版间距),
所以你的日志里全是
节点 36->36(一点没抽稀),看起来就是“功能没生效”。 - 现在默认
Spacing/BlueprintSafe = false(自由间距):按回归线分带做 1.6~1.8 当地格, 日志会变成[自由] … 节点 36->20 实测均长≈2.09m(1.80格)。 - 蓝图仍然只接受整数格(见 1.0.7 的 IL 证据),所以自由间距保存蓝图时会报“距离太远”,
这是二选一:想要蓝色放大效果就用默认;需要存蓝图就把
BlueprintSafe改成 true。 - 日志会标明当前模式(
[自由]/[整数格])。
1.0.8 —— 修掉蓝图安全模式自己的错误(1.0.7 会漏出 2.34 m 的越界节)
- 1.0.7 的抽稀判据写错了:写成了
dNext > maxSeg(只看“下一小步”会不会超上限), 而正确判据是dCur + dNext > maxSeg(“再合并下一个节点之后”会不会超上限)。 结果在 20°~30°(当地格 1.15~1.17 m)把两个节点并成一个 ≈2.34 m 的节, 又超过了 √5.3 = 2.302172 m —— 你的日志里最长=2.339m就是这个 bug。 - 现在保证:每一节 ≤ √5.3 − 3 cm,并且间距 = 最接近分带目标的“整数个当地格” (该纬度 2 格合法就用 2 格,不合法就 1 格),全部落在原版整数格上 → 蓝图可存可粘贴。
- 日志会显示当前实际是 1 格还是 2 格。
- 追加爬坡修正:原版判定用的是三维距离,一层高度 = 1.3333 m,所以
sqrt(水平² + 1.3333²) ≤ √5.3→ 爬坡时水平间距上限降到 ≈1.84 m, 即爬坡的带子只能 1 当地格(2 格 + 一层高度 = 2.66 m 必然 TooFar)。
1.0.7 —— 蓝图安全模式(解决“保存蓝图后距离太远”)
- 从本体 IL 查清根因:
BlueprintUtils.GetLatitudeRadPerGrid(int) = 2π/(segment×5)(= 1 小格 = 赤道 1.2566 m), 而BlueprintUtils.RefreshBuildPreview会用Mathf.Repeat(格索引 × 每格弧度, 2π)+RoundToInt把每个建筑位置四舍五入回整数格。所以 1.6~1.8 格这种“半格”间距在蓝图里无法表示: 舍入后部分节会变成 2 格(2.19~2.9 m),一旦超过 √5.3 就报“距离太远”,蓝图存不下来。 - 新增
Spacing/BlueprintSafe(默认 true):间距只用当地整数格 —— 能取 2 格(2×当地格长 ≤ √5.3−3cm)就取 2 格,否则取 1 格(= 原版间距); 并且直接抽稀原版网格节点,不再生成任何新位置,所以游戏再四舍五入也不会改变间距。 日志会显示当前是 1 格还是 2 格。- 赤道(当地格 1.2566 m):2 格 = 2.513 m 超上限 → 1 格(原版)
- 45.6°(当地格 1.094 m):2 格 = 2.188 m ✓ → 2 格(≈1.74 个赤道格,最接近 1.6~1.8 的目标)
- 47.8°(当地格 1.396 m):2 格 = 2.79 m 超上限 → 1 格
- 想要“1.6~1.8 格”的外观(只用于建造、不存蓝图)就把
Spacing/BlueprintSafe设为 false。 - 另外 1.0.6 的余量修正也在这个版本里:兜底上限 √5.3−3cm,自由模式目标再取 98%。
1.0.6
- 留出安全余量,避免“距离太远”:日志显示 ~47° 处当地格被量化放大到 1.40 m,
目标间距因此被钳到 2.301 m —— 正好贴着原版 TooFar 上限(√5.3 = 2.302172 m),
游戏在端点/连接处再调整几个毫米就会判“距离太远 / 无法铺设”。现在:
兜底上限改为
√5.3 − 0.01 m,目标间距再取 98%(≈ ≤2.256 m), 赤道带仍有 1.79 格、47° 处约 1.61 格,全部落在 1.6~1.8 格内且远离上限。 - 日志新增“最长=x.xxx m”,可直接确认没有任何一节贴到上限。
- 兜底提示文案改正:那不是别的模组,而是原版测地线模式(R 变体)没有走前置补丁,属正常兜底。
1.0.5
- 修掉“间距没有等距分割”的根因(由你的日志定位):日志里出现的
节点 24->3 实测均长=0.048说明PlanetGrid.SnapLineNonAlloc的输出是单位球坐标(半径 1), 而我把米制目标直接拿去和它比较 —— 尺度差约 200 倍 → 重采样永远不落点,只剩首/拐/尾 3 个节点, 被上层按半径放大后就变成了几节又长又不等距的带子(并且 R 键两条变体各自被弄坏成不同样子)。 现在按begin.magnitude把 目标/上下限 全部换算到同一尺度再采样;兜底补丁也会自动识别尺度。 - 日志里的“实测均长”统一换算成米,方便核对。
1.0.4
- 间距方向改正:按要求改成「赤道带 1.8 格 → 极区带 1.6 格」(1.0.3 及以前是反的)。老配置会自动迁移。
- 斜拉走线回归原版:
path参数原样透传,折弯与 R 键切换保持原版行为;并新增兼容处理, 默认把 LongerBelts 的节点生成函数接管回原版网格折线(cfg:Spacing/UseVanillaGridPath), 启动日志会打印“已接管 LongerBelts …”。因此只装本模组即可,不受其它模组影响。 - 新增上限兜底:重采样后逐节检查,任何超过 √5.3 的节都用球面中点劈开,保证每节都能在原版重建; 另对首尾节做保护(游戏随后会把首尾路径点替换成精确的鼠标端点)。
- 日志里新增两行:当前路径生成来源 / 是否被别的模组接管。
1.0.3
- 修掉间距被放大 5 倍的 bug(截图里每节 7~8 格的那个问题):
PlanetGrid.CalcLocalGridSize()返回的本来就是“一个当地小格”(赤道 1.2566 m), 之前又乘了 5,导致目标间距变成 5 倍。 - 同时把“抽稀”改成沿原版折线按目标弧长重采样:因为原版节点本身就是 1 小格(1.2566 m)间距, 只抽稀最多只能到 1 格(2 格 = 2.513 m 会超过原版上限 2.302172 m),根本到不了 1.6~1.8 格。 现在每节典型长度 ≈ 目标(1.5~1.79 格),且始终 ≤ √5.3。
- 后置补丁同样改成重采样,因此不依赖任何其它模组也成立(别的模组生成过密/过稀节点都会被拉回分带目标)。
- 日志行现在会直接显示
实测均长=xx m(xx 格),方便核对。
1.0.2
- 彻底独立:
PlanetAuxData.SnapLineNonAlloc后置补丁改成双向校正 —— 节点比目标密就抽稀,节点比目标明显稀疏、或单节超过原版sqrt(5.3)时拆节。 (1.0.3 起改为统一用重采样实现。) - 前置补丁与后置补丁之间加了状态标记,避免同一条路径被处理两遍。
- 面板/文档改写:明确“独立工作、不依赖 LongerBelts”。
1.0.1
- 修掉“按 ALT+4 打不开面板”的 bug:原来写成
KeyboardShortcut(LeftAlt, Alpha4),而 BepInEx 的语义是 “主键在前、修饰键在后”,IsDown()要求“主键被按下 + 修饰键按住”,所以那个写法等于“按住 4 再敲一下 Alt”, 正常按 Alt+4 永远不会触发。现在默认值是KeyboardShortcut(Alpha4, LeftAlt),并且自己解析快捷键,两种书写顺序都认。 - 面板新增“恢复 ALT+4”按钮;改键逻辑同样改成主键在前。
ShowWindowOnStart默认改为true(进游戏直接看到面板,便于验证)。LogSpacing默认改为true,每秒最多一条日志,直接给出lat/band/cells/target/nodes。- 新增
PlanetAuxData.SnapLineNonAlloc后置补丁兜底(当时只做抽稀)。 - 三个补丁分开挂载并逐条打日志(
patch OK/patch FAILED),便于排查。
1.0.0 首个版本:回归线分带间距(1.6→1.8 格)+ 自动拉平 + ALT+4 面板 + cfg 配置。
9. 目录结构
TropicBeltSpacing/
├─ src/
│ ├─ Plugin.cs BepInEx 插件入口(配置、快捷键、OnGUI)
│ ├─ ModConfig.cs cfg 配置项
│ ├─ TropicBands.cs 回归线分带表与间距换算
│ ├─ BeltSpacingCore.cs 核心:抽稀算法(PlanetGrid.SnapLineNonAlloc 前置补丁)
│ ├─ Flatten.cs 自动拉平 / 竖直带拉直
│ ├─ Patches.cs Harmony 补丁声明
│ ├─ Hotkeys.cs F9 开关快捷键(无 UI)
├─ TropicBeltSpacing.csproj
├─ build.ps1
└─ dist/ 编译输出(BepInEx/plugins/... 结构)