Skip to content

第三批规划:高亮系统 + 蓝图系统 ​

来自 cmclient 的两个高价值功能已深入研究,本页记录移植方案与工作量评估。

一、对象级高亮系统(cm_highlight,2888 行) ​

功能:建造工具激活时,实时高亮将要建造的对象——铁轨整段、车站全区、道路/停车场、信号、桥梁、隧道、码头、机场、工业等 15 种对象的精确预览。

移植依赖(vanilla API → jrpm API):

cmclient 依赖jrpm 对应
DrawSelectionSprite / SetSelectionTilesDirty / DrawTileSelectionRect / DrawAutorailSelection(viewport.cpp 内部)存在但签名不同(jgrpp 重构过),需逐一对齐
TileZoning(城镇分区着色)jrpm 无 → 需新建
_fn_mod 等全局状态cmclient 专属 → 需重设计
ObjectTileHighlight::make_rail/road_stop/... 各对象构造器依赖 NewGRF 车站/道路 API,jrpm 与 vanilla 有差异

工作量:约 2–3 轮(每轮 4–6 小时),核心难点在 viewport 绘制管线的对齐。

二、蓝图系统(cm_blueprint,660 行) ​

功能:圈选区域 → 记录建造命令序列(铁轨/车站/隧道/桥梁/信号)→ 16 槽位存储 → 一键重放构建 + 旋转。

移植依赖:

cmclient 依赖jrpm 对应
cm_commands.hpp 命令对象层(as_company / with_callback / set_auto / no_estimate + 100+ 生成命令类,2251 行)jrpm 无此抽象 → 必须先移植/重写
cm_station_gui.hpp 的 _station_gui 状态jrpm 车站 GUI 状态结构不同
sp<Blueprint> 智能指针jrpm 可用 std::shared_ptr
BlueprintCopyArea 的 tile 遍历依赖 TileIndexDiffC 等通用 API(jrpm 有)

工作量:约 2–3 轮(含命令对象层)。

三、推荐实施顺序 ​

第 1 步:命令对象层(cm_command_type 设计,用 jrpm 的 Command<T>::Do/Post 重新实现)
         —— 蓝图与命令回放(load_commands)的共同地基
第 2 步:对象级高亮(viewport 管线对齐,逐个对象移植)
第 3 步:蓝图(复制/旋转/槽位/重放)
第 4 步(可选):命令回放(lzma 整局回放)+ 城镇分区(growth_tiles,需存档扩展)

前提说明 ​

这三个功能合计约 5000+ 行、跨越命令系统/存档/视口绘制三层核心,且依赖一批 jrpm 没有的中间层(命令对象、事件总线、位流序列化)。作为独立专项推进更稳妥——建议分批执行,每批编译 + 联机验证后提交,避免一次性大改导致难以定位回归。