机车换挂(decouple)
来源:pulsexlb/OpenTTD-patches 的
jgrpp-decouple特性分支(152 提交中的核心),经 git merge 并入 jrpm。
功能简介
「机车换挂」让列车能够在站内/调度中解挂与挂载车厢或机车,实现:
- 解挂:列车按「解挂订单」在指定站点甩下部分车厢(或车厢+机车组),剩余部分继续行驶;
- 挂载:列车在站点等待,与另一列(或停泊的车厢组)自动对接耦合;
- 解挂后两列车各自独立执行调度:通过「条件性命令跳过」等机制,解挂后的两列车执行不同的调度计划;
- 路签转移:解挂/挂载时路签(追踪限制标签)随列车正确转移或去重。
核心能力
| 能力 | 说明 |
|---|---|
| 解挂/挂载订单 | 新增订单类型,支持「加载/不加载」「等待挂载」「解挂」等约束 |
| 耦合长度与车速限制 | 根据列车长度限制耦合操作;耦合操作有速度限制 |
| 双车头支持 | 前后双车头(含 NewGRF 双头机车)正确耦合/解挂 |
| 耦合寻路 | YAPF/NPF 均支持耦合路径规划;只在站内耦合 |
| 反向行驶 | 耦合后可反向,支持「解挂后反向」等调度技巧 |
| NewGRF 耦合 | 支持 NewGRF 定义的耦合属性(0xC6/0xF2 属性等) |
| 存档 | SLV_ORDER_DECOUPLE 存档版本;num_decouple 计数持久化 |
使用方式
- 在车站用「解挂」订单(
decouple)拆分列车; - 设置挂载订单让列车等待对接;
- 配合「条件性命令跳过」(conditional order skip)让解挂后的两列车走不同路线;
- 站内拖拽调整车厢顺序,或使用「按长度筛选」等辅助工具。
相关代码
- 订单:
src/order_cmd.cpp、src/order_gui.cpp、src/order_type.h - 列车:
src/train_cmd.cpp、src/train.h - 寻路:
src/pathfinder/yapf、src/pathfinder/npf - 存档:
src/sl/saveload_common.h(SLV_ORDER_DECOUPLE)
注意
- 该特性涉及列车物理顺序/信号预留逻辑的深度改动,建议真机编译后重点回归:解挂、挂载、反向、撞车修复、自动替换(autoreplace)等场景;
- 解挂相关字符串与 GUI 已并入(
STR_DECOUPLE*等)。
2026-09-28 上游合并更新(px-patch 2609.x)
本次并入 pulsexlb 后续 113 提交中的换挂/对接相关改动:
| 改动 | 说明 |
|---|---|
| 对接认领状态持久化 | 列车前往对接/等待对接的瞬时状态(couple claim)写入存档(CPLM 数据块 + XSLFI_COUPLE_CLAIM_STATE),读档后对接不再错乱 |
| 对接方向判定放宽 | 前往对接时,目标列车区间内其它车辆不在对接方向上时可继续对接 |
| 站内掉头安全 | 列车在车站掉头前确保区间内无车辆 |
| 解挂后推进修复 | 修复解挂后推动(propulsion)错误、primary != first 时编号不显示、站内自动改装无效等问题 |
| 路签(追踪限制)修复 | 修复解挂后使用等待对接调度计划时错误返回路签、对接后返还路签不返还的问题 |
| 站台命令复制 | 解挂时装卸并使用调度计划的站台命令完全复制原站台命令 |
| 对接前条件检查 | 修复对接前列车条件只检查一次导致条件变动时对接崩溃 |
| 家调度表保护 | 修复列车家调度表被错误删除、存档后正在执行玩家自定义调度计划的列车状态异常 |
| 无引擎列车信息面板 | 列车窗口支持无动力编组的信息展示 |
| 订单窗口拖拽 | (jgrpp 0.73.3)订单支持拖拽排序;修改停靠位置/汽车行驶方向改为双击触发 |