公共交通线路

公共交通在问道里不是「走到最近的车站去碰运气」,而是「按你编排的线路走」。 一条线路就是一份你说得清的清单:这条服务叫什么、属于哪种交通、按顺序停哪几站。 把站点的顺序写对,剩下的交给 Dijkstra。

打开线路配置

在世界地图上先按 R 进入编辑模式,再按 L,就会出现「线路配置」界面。 它是一整块居中的面板,世界地图仍在它背后照常渲染——你随时能看见正在编排的这条线走在哪儿。 L 是一个正式的按键绑定(在「选项 → 控制」的「HowToGo | 问道」分类里),可以自己改键。

面板从上到下是:标题行(右上角是线的名字输入框)、类型行、三列列表、底部按钮。 三列是同一个界面里的三件事,不是三个界面:

区域 里面是什么 怎么操作
左列 · 线路 你所有的线路,每行显示「名字(类型)」。从 MTR 读进来的线路会带 [MTR] 前缀。 点一行=选中它;右上角输入框改的是选中线路的名字。
中列 · 站点(按顺序) 这条线依次停靠的站点,编号就是你乘坐的顺序。 行尾四个小方块:N 改名、^ 上移、v 下移、x 移除。
右列 · 可添加站点 世上所有可以加的站点,来自三个来源(见下)。已经在这条线上的会变暗。 点一行=加到线路末尾。

底部四个按钮是「新建」「删除」「复制为我的」「完成」。每一列都可以用鼠标滚轮单独滚动, 列头右边会显示 已显示/总数——列表比一屏长的时候,那是唯一能告诉你「下面还有」的东西。

为什么不做成「一条线一个界面、一站一个对话框」:一条六站的线路会变成十几次界面切换, 而建线路这件事本身就是「把你记得的顺序敲进去」。所以一件事一屏做完。

线路类型决定它能跑在哪

每条线路有一个类型,用的是本模组道路等级的同一套名字:

线路类型 它在哪上面行驶
铁路 铁路等级的道路,以及自动识别的机械动力铁轨、MTR 线路标记出来的轨道。
水路 水路等级的道路;MTR 的船线标记出来的也是水路。
冰道 冰道等级的道路——冰上划船是地图上最快的线路,所以它单独算一种。
公路 公路与高速等级的道路。

类型里没有「小路」,因为小路和公路本来就是同一条路的不同宽窄,一条公交线就是一条公路线; 而一条跑在小路上的线路,只会被走到。类型不是装饰:它决定了规划时这条线能骑哪些道路。

线路的颜色可以自己定

0.2.2 新增配置 transit_line_colors,铁路、水路、公路、冰道四个类型各一项颜色。 它改的是线路本身的线与这条线名下的每一个站点标记; 线路底下那条轨道仍按 road_colors 画,两者互不影响。不写这一节就用模组一直使用的那套配色, 和以前一模一样;从 MTR 读进来的线路同样按类型取色。写法(#RRGGBB 或带透明度的 #AARRGGBB)与其余配置见 配置与数据文件。

红色站点:真的断了才标红

中列里的站点如果接不上它的上一站,名字会画成红色, 面板顶部同时出现一句「红色站点与上一站之间是断的:两站不在这条线路该走的同一段道路上」。 这句话很短,说的却是一件很具体的事:以这条线当前的类型, 两站分别落在该等级道路的两个连通片段上,中间没有路。

红色只表示真的不连通,不再表示「这一段规划不出车程」。早先的判定把两件事混在了一起: 站台离轨道超过 64 格接驳上限、单行方向与站序相反、路由器兜底路径自己的取舍, 都会让站名变红——线路明明是通的(游戏里车照跑),看起来却像断了。 现在判定问的是「这两站通不通」,与「愿不愿意走这一段去上车」无关, 所以不再受 64 格接驳上限约束;它另有一条 256 格的判定距离 (一个车站的多个站台被合并成一个地点时,代表点离轨道上百格是常事)。 超过 256 格就不判断:标题旁改给一句橙色提示 「有些站点附近找不到这条线路该走的道路,连通性无法判断(不标红)」—— 把「不知道」和「断了」分开说,是这一版最重要的改动。

单行仍然照旧判定,因为这是有向的可达性:单行方向与站序相反时,那一站照样标红。

判定本身也换了做法:不再为每一对相邻站点规划一条完整路线,只在同一张图上问一次可达性—— 不计代价、不计接驳时间,只问走不走得到。编辑界面和真正的规划器走同一个入口 (RideRoads.forLine),所以 MTR 的线路按它自己的轨道判定, 界面上的红 / 橙和实际规划时得到的是同一个答案。

判定结果按各来源自己的版本记账:手画路网的修订号、单行与楼层的改动计数、 Create 轨道层与 MTR 轨道的版本号。于是拖动节点把两段接上、把一条路改成铁路、 改掉一条街的单行方向,甚至 MTR 那边重新读了一遍轨道,红字都会自己刷新。 (早先取的是合并出来那份路网的计数,而副本的修订号与来源无关,所以修好之后红字会一直挂着。)

标红只说明相邻两站之间不通,不代表线路的其它部分有问题。把类型改对, 或者把中间缺的那段路补上(见 画路、命名与地点),红字就会自己消失。 橙色提示是另一回事:它说的是判断不了,不是断了——通常意味着这两站附近 压根没有这条线该走的等级的道路(例如一条水路线开在一片没有水路的世界里)。

站点的三个来源

来源 能不能改 说明
① 你标记为「站点」的地点 可以 它属于你:名字与类型都能随时改,改的是那个地点本身,地图、读数与地点编辑器用的是同一个名字。
② 机械动力车站 只读 位置与名字来自机械动力,见 机械动力铁路。
③ MTR 车站 只读 位置与名字来自 MTR,见 MTR 集成。同名的多个车站会先按 mtr_station_merge_blocks(默认 256 格)合并成一个地点再出现在这里: 列表一条、地图一个标记,所以不会出现同一个站被列成好几条。

后面两种在右列会标上「只读」。理由不是偷懒:它们的名字与类型属于那个模组, 在那里改只会得到一条「描述着某个并不存在的车站」的线路——线的数据与世界的实况从此对不上。 (把它们加进线路之后,你仍然可以用 N 给这一站起一个你自己的名字: 它记在线路上、按位置保存,绝不会写回那个模组,只是这条线这么叫它而已。) 右列的候选不按线路类型过滤:某个站点该不该被这条线停靠,是你对自己这条服务的决定, 不是模组替你收窄的范围。(早先的版本会替非铁路线藏起自动识别的车站,结果只是让人以为「我的车站不见了」。)

另外,一个地点只有在道路上(或道路的端点)、或者紧贴着自动识别的铁轨(8 格以内) 时才能被设成「站点」。后一条是必需的:你铺完铁轨在旁边建站台,站台本来就不在铁轨正上方。 这不是格式要求,而是常识——一个没有任何路线经过的上车点,是任何行程都到不了的上车点。 设错时面板会留在原地并告诉你原因,让你换个类型或换个位置,而不是默默丢掉这次编辑。

只读线路与「复制为我的」

从 MTR 读进来的线路会列在左列并带 [MTR] 前缀,可以选中、可以看它的站点顺序, 但它身上没有任何一个能改动它的控件:站点没有 N/^/v/x, 类型点不动,名字输入框也不接受修改。它的几何与站位属于 MTR,问道下一次读到时一切都会被覆盖。

这类线路的行尾有一个小方块,管的是「要不要沿着这条线标记它实际走的轨道」: 点亮时方块里是一个字——轨 表示它会标记成只读的铁路,水 表示水路;熄灭时方块是空的。 两种状态一眼可分(一个只差颜色的点,读起来就像「点了没反应」)。默认值来自配置项 mtr_auto_route_marks,每条线给过的答案单独记住。细节在 MTR 集成。

想让一条只读线路变成自己的,就按「复制为我的」:它复制出一份名字带「(副本)」后缀、 完全可编辑的线路,并立刻选中副本。原始的 MTR 线路一字未动——这就是「只有懂得编辑的界面,永远不会写到别人的数据上」的做法。 这个按钮对自己画的线路同样好用,等于一份可以随手改的副本。

规划、换乘与等车

规划时,站点是图的节点,同一条线上相邻两站之间是边,边有自己的代价; 在这张图上跑 Dijkstra,得到的就是最省时间(或最短距离)的走法。边是双向的——线路是一项服务而不是单行道, 往回坐也是在坐这条线。首末两端则是从你所在位置走到上车点、从下车点走到目的地的小段步行, 两端各取最近的 12 个站点试算;走到站点的这段路超过 256 格就会被拒绝——一段四百格的步行不该被叫做公共交通, 而一段实在走不通的接驳,宁可如实说没有路线,也不画一条横穿地图的直线。

换乘是图上的另一种边:不同线路的站点相距 24 格以内就算同一个换乘点。 不是 0 格,因为玩家搭出来的换乘站很少正好一格:月台和旁边的公交站,对出行来说是同一个地方、对数据来说是两个点; 但也不会更大,否则「换乘」会悄悄变成「穿过半个城区」。两条线路停在同一格时,它们本来就是同一个节点,换乘不花代价。

MTR 那边同名的多个车站现在是一个站点(合并规则见 MTR 集成), 所以换乘也算得干净了:早先「一个站台一个框」建出来的车站会被列成好几个同名站, 于是同一个站里换线被当成两个相隔上百格的车站之间的换乘;合并后线路只停一次、地图只有一个标记, 同一个站换线就是同一个节点,不再额外来一段步行接驳。 不过名字一样不等于同一个站:两个同名车站相距超过 mtr_station_merge_blocks(默认 256 格)时, 它们仍是两个地点、两次停靠——距离与名字两条都要满足。

地图上,被两条及以上线路共用的站点画成橙色方块,尺寸与普通站点标记相同。 只有两个标记在屏幕上真的重叠时才会融合成一个,拉近看就会分开——融合是屏幕上的重叠,不是数据里的合并。

等车时间 transit_wait_seconds(默认 60 秒)在每次上车时计一次——首次乘车也算, 换乘再计一次。它同时参与搜索和预计时间:因为线路没有时刻表可读,这是「平均等多久」而不是某班车的发车时间。 省 40 秒走路却要多等 2 分钟的车,没有人会坐,所以它必须进代价里。

如果没有任何一条线路能走完这段行程,结果就是「没有公共交通路线」, 然后由上层按你设置的 fall_back_to_walking_when_slower 决定要不要提出步行方案。 这里刻意没有兜底:早先的版本会退化成「在最近的一段轨道上车」,那等于无视你编排的每一条线, 把人送上一个到不了目的地的地方——那不是一个更差的答案,而是一个错的答案。

线路存在 config/howtogo/<存档>/<维度>-lines.json,是单独一个文件, 不写进道路网络里:线路出问题也碰不到你画的路。文件不存在就是「还没有线路」,删掉它等于清空线路表。 其余数据文件见 配置与数据文件。