机械动力铁路

装了 Create(机械动力)之后,你铺的铁路会被自动识别、自动画在地图上,一格都不用重画。 它会立刻参与规划:公共交通里类型为「铁路」的线路就跑在它上面, 它的车站可以直接作为导航目的地,画路时还能把路的端点吸附到铁轨上。

装了机械动力,铁路自己就画出来

不需要任何开关去「开启识别」——装了就认。铁路图层是只读的机器图层: 它不属于道路网络,不会被存进你的路网文件,也不会跟你画的线冲突:问道手画的铁路与自动识别的铁路 在渲染与规划里是同一层,按位置自然接上。

谁能在它上面走:只有铁路。步行与驾车都不走铁轨(这正是「交通方式」的意义所在), 而是公共交通中一条类型为铁路的线路——你编排的线路决定在哪上车、在哪下车, 问道就在这张路网(你画的铁路 + 自动识别的铁轨)上把这一段算出来。所以铁轨自动画出来之后, 你要做的只是编排一条铁路线路,把车站按顺序填进去。

整个图层有一个总开关:配置项 create_train_tracks(默认 true)。 关掉它,图层在下一次客户端 tick 就空了,铁路、车站一起消失;你的手画路网一点不受影响, 重新打开也会立刻回来。

两个来源,同时只有一个生效

问道按固定的优先级取数据,两个来源不会重复计数,任何一个时刻图层只有一个来源:

来源 读到的是什么 画出来什么样
① Create 的轨道图
(优先)
Create 客户端自己的轨道网络(CreateClient.RAILWAYS):它的节点坐标、它自己的贝塞尔曲线,还有带名字的车站。 弯道是平滑曲线,而且位置就是 Create 认为的位置,不是方块中心:0.2.2 起保留它的贝塞尔原采样再平滑,不再先四舍五入到方块。
② 方块扫描
(回退)
扫描附近的 create:track 方块,按每个方块自己的 shape 属性判断它往哪个轴延伸。 一格一格连起来,斜向与弯道是阶梯状的;车站也读不到名字。

什么时候会回退到扫描:没装 Create、Create 改了类名或包名、或者它的轨道图还没同步到客户端。 当前用的是哪一种,日志里说得明明白白,前缀是 [HowToGo] Create track layer: from Create's graph 是轨道图,from the block scan 是方块扫描,后面还跟着节点数、边数、 其中曲线多少条、路段数与车站数。读不出任何东西时,图层只是空的——没有报错,也没有半张地图。

画出来的是平滑曲线,但只影响显示

0.2.2 起,地图上的路不再是一格一格的台阶:每条路段额外带一份显示用的平滑折线—— 先按 0.9 格容差抽稀(把一格一格的楼梯收成斜线), 再对折角按固定 1.25 格半径做圆弧倒角,首尾钉在道路两端。 Create 的贝塞尔曲线与 MTR 的小数坐标轨道保留原采样再平滑,不会先被四舍五入到方块中心, 所以弯道看起来就是 Create 自己认为的那条弧。

关键在于「只影响显示」:寻路、测距、选中、存档里的整数顶点一行没动。 画面上的线是顺的,但 Shift 选中后端点仍落在原来的格子坐标上, 铁轨的只读图层也还是在它原来那条线上——平滑的是画法,不是数据。 道路 JSON 里多出来的可选字段 curve 写了才出现,旧存档照常读,旧版本忽略它。

短轨道先拼成长段

机器读进来的轨道原先是碎的一小段一小段:Create 每条贝塞尔、MTR 每段轨道都是独立片段。 问道现在先把端点相接、类型相同的片段拼成一条「路口到路口」的长折线, 只有岔口(三条以上轨道交汇)和没接上的地方才断开。

拼完之后,Shift 选中与 N 命名都是整条线,不再是一小段一小段; 描边的接缝与寻路的边数也跟着变干净——同样的轨道,省掉的是那些没有意义的中间节点。

靠注册名识别,不引用任何 Create 类

方块是按注册名认的(默认 create:track、create:track_station), Create 的轨道图则是反射读的,每一个句柄只按名字查一次并做好保护。 所以问道的构建脚本里没有任何 Create 依赖:Create 换版本、改包名,问道最多是读不到并回退, 而不是编译不过或者直接崩。你甚至可以把轨道方块的名字换成附属模组的(见下方配置表)。

铁路只读,但可以命名

那段几何属于 Create,所以问道不提供在铁路上移动节点、拆分、删除、改等级: 下一次读取(最多一秒后)就会把它重新读一遍,你的改动会被无声地覆盖,那比不提供更糟。 唯一可以改的是名字,而且它存在一个单独的文件里: config/howtogo/<存档>/<维度>-rail-names.json,不写进道路网络。

名字不绑在路段 id 上——铁路图层每秒重建,路段 id 每次都会重排。名字绑在那一段的两个端点坐标上, 所以重建、重载、甚至在两个数据来源之间来回切换,名字都不会丢。

命名与选中都按整条铁路线生效,和手画的道路一致:

  • Shift + 点击铁轨:选中整条线并高亮它(点在普通道路上时选中的是那一条路)。
  • N:给选中的整条铁路线起名;光标停在铁轨上时也能直接命名。
  • 名字随地图缩放显示,颜色是浅蓝色——道路名是白色系,一眼就能分清哪条是机器画的。

这些操作和其他编辑动作一样,需要先在世界地图上按 R 进入编辑模式。

画路时可以吸附到铁轨

编辑模式下,如果光标附近没有你手画的道路,吸附就会落到铁轨上——于是你可以把一条路的端点 正好接在铁轨上,让「走到车站」这一段路真的接得上。Alt 仍然可以自由放置,不吸附任何东西。

注意吸附只取位置:出现黄色吸附环,把点放在那个位置,不会拆分铁轨,也不会把铁轨接到你的路上。 铁轨不是编辑器拥有的几何,能改的只有它的名字。

另外,你给手画道路设的层(N 面板里的「道路:名称与层」, 或编辑模式下用 - / + 加减正在画的层)是那条路自己的属性: 它决定这条路是高架还是地下、地图从低层往高层画时谁压在谁上面,但不会写到 Create 的轨道上, 也不会让只读的铁轨变得可编辑。想让一条路从铁轨上方跨过去,就把那条路画成高架;铁轨那边始终由 Create 负责。

车站算作地点

create:track_station 的位置会成为目的地,出现在「选择目的地」界面里单独的一类 「机械动力车站」,也能作为公共交通线路的一站(只读,见 公共交通线路)。 在地图上它和你的地点一样是黄色方块,名字与地点同色。

车站名取自 Create——也就是玩家给车站起的那个名字。回退到方块扫描时拿不到名字(名字不在世界的方块里), 这时就按坐标显示成「车站 x, z」,宁可显示得笨一点,也不去猜一个不是它的名字。

配置项一览

键 默认 说明
create_train_tracks true 整个铁路图层的总开关。关掉后图层在下一个 tick 清空,只读,随时可以再打开。
create_track_block_ids ["create:track"] 当作「铁轨」的方块注册名,可以加附属模组的轨道方块。Create 隐形的 create:fake_track(地图用轨道标记)故意不含在内:它是标记而不是轨道面,包进来会在没有轨道的地方画出线。
create_station_block_ids ["create:track_station"] 位置会成为目的地的方块注册名,单独列在「机械动力车站」这一类里。
create_track_scan_radius 192(16~512) 回退扫描时以玩家为中心读多远的区块,单位是格。范围是方形而不是圆形,因为区块本来就是方的。一遍扫描的代价随半径的平方增长——但那只是「扫完一圈要更久」,每次真正做多少由下一项封顶。
create_track_chunks_per_second 20(1~512) 一秒一批,最多读几个区块,由近到远按环形推进。默认半径下,一批 20 个大约半分钟扫完一整圈,而你脚下的那个区块每秒必读,所以随手铺的轨道立刻就能看到。卡顿就调小;想更快扫完就调大。读出 Create 轨道图时这项不生效——那条路根本不扫方块。

扫描之所以便宜,是因为它先看区块里每个 section 的调色板:一个不含铁轨的 section 只花一次判断, 只有调色板里真的出现铁轨的 section 才会逐格走一遍。这也是为什么远处的铁路会「慢慢长出来」而不是一次性出现。

铁轨的颜色不在这张表里:它和手画的道路一样按等级取色, config/howtogo-client.toml 的 road_colors 一节里「铁路」那一项就是它。 世界地图、导航小地图、目的地选择界面、图例与网页地图读的是同一份设置; 写错的值会被忽略(日志说一次)并保留原色,改完不用重启。 公共交通线路本身的线与它的站点标记由 transit_line_colors 管, 线路下面那段轨道仍按 road_colors 画。

这些项——包括上面那几个 create_*——也能在模组列表里的「配置」按钮打开的界面里改: 那个界面读的是生成 howtogo-client.toml 的同一份声明,列出的项、默认值、范围与注释都和文件一致, 改完保存即时生效,中英文都有每项标题。