OpenTTD 货物收益计算器
看清 OpenTTD 每一次运输到底赚多少。选择货物,设定距离格数与运输天数,计算器立刻给出单次 £ 收益、每格 £、每日 £,以及该路线最赚钱的货物。
计算一次交付的收益。
决定货物下拉列表中显示哪些货物类型。请与你正在玩的 OpenTTD 存档气候保持一致。
你的火车、船舶、飞机或卡车正在运输的货物。每种货物都有自己的单位运价和保鲜曲线。
人
格
天
此数值的计算过程
- 时间因子
- 255 − 24 − 2·0 → 231
- 距离折半
- 100 ÷ 2 → 50
- 第一步 (>> 7)
- 50 × 231 × 100 ÷ 128 → 9,023
- 乘以单位运价
- × 3,185
- 除以 8192 (>> 13)
- ÷ 8192
- 收益
- £3,508
| 货物 | 单位运价 | 最佳距离 | 陈旧临界点 |
|---|---|---|---|
| 贵重品 | 7,509 | ≤ 75 格 | 33 周期 |
| 货物 | 6,144 | ≤ 375 格 | 33 周期 |
| 煤炭 | 5,916 | ≤ 525 格 | — |
| 钢材 | 5,688 | ≤ 525 格 | — |
| 铁矿石 | 5,120 | ≤ 675 格 | — |
| 木材 | 5,005 | ≤ 1,125 格 | — |
| 谷物 | 4,778 | ≤ 300 格 | 44 周期 |
| 邮件 | 4,550 | ≤ 1,500 格 | 110 周期 |
| 原油 | 4,437 | ≤ 1,875 格 | — |
| 牲畜 | 4,322 | ≤ 300 格 | 22 周期 |
| 旅客 | 3,185 | 任意距离 | 24 周期 |
原版 OpenTTD 14.x 与 JGRPP。NewGRF 货物模组会覆盖默认费率,目前暂不支持。通胀以基准年(1950 年)数值显示;存档会按年份比例缩放。
OpenTTD 货物收益计算器。从货物、距离与运输天数算出单次运输 £。
什么是 OpenTTD 货物收益计算器?
如何计算 OpenTTD 货物收益(以及计算器的内部流程)
货物收益——economy.cpp 中的整数公式
- = 单次交付的游戏内 £ 收益(计算器返回的整数)
- = 起讫站之间的曼哈顿格距离 —— $|x_{src} - x_{dst}| + |y_{src} - y_{dst}|$
- = 时间因子 (0–255),255 表示完全新鲜,下限 MIN_TIME_FACTOR = 31
- = 交付货物的数量(旅客、吨、袋、升或件)
- = 货物的基础单位运价,来自 economy.cpp 中的 _default_cargo 表 —— 旅客 3185、煤炭 5916、亚热带木材 7964(最高)、贵重品 7509(除木材外最高)
- = 运输周期 —— 日历天数除以 2.5 后向下取整。一个运输周期 = 2.5 个游戏日
- = 货物的 days1 阈值 —— 早期保鲜边界(运输周期)。旅客与食品为 0,贵重品 1,煤炭 7,原油 25,塑料与汽水 30
- = 货物的 days2 阈值 —— 晚期保鲜边界。旅客 24,贵重品 32,谷物 40,煤炭 255(实际无上限)
完整推导的实例
wiki 对照例 —— 27 名旅客、100 格、60 天、温带
煤炭长途运输 —— 200 吨、300 格、200 天、亚寒带
贵重品超短途 —— 50 件贵重品、50 格、5 天、温带
亚热带木材 —— 100 吨、200 格、80 天
对比两次运输 —— 同一条 100 格路线上的煤炭对贵重品
面向 tt-forums 老玩家与 B 站新手的货物收益规划技巧
- 煤炭 £5,916 基础运价并非全表最高,但 days1/days2 这对 7/255 意味着即使在 2,000 格的全图铁路网上,它也几乎保持满价。煤炭是「就算把铁路修得歪七扭八也能盈利」的那种货物。贵重品 £7,509 基础更高,但 days1 = 1、days2 = 32,运输超过 80 日历天(32 个运输周期)后时间因子就会被压到下限 31 附近。50 格以内用贵重品,其余路线用煤炭。
- 距离指的是曼哈顿格距离,不是铁路长度。收益公式只读取两站之间的 $|xsrc - xdst| + |ysrc - ydst|$,无论你的铁路转了多少弯。绕山的「之」字形铁路与一条直线在站点坐标相同的前提下收益完全相同。这是百度贴吧 openttd 吧最常见的误解:玩家以为在曼哈顿距离 100 格的两站之间铺 200 格铁路就能赚 200 格的钱。不会。把站点放在产业建筑的最远两端,最大化曼哈顿距离才有意义。
- wiki 货物收入页面里的一个「天」其实是你存档里的 2.5 个日历天。OpenTTD 在一字节(0–255)计数器里存储货物在途时间,所以采用 2.5 天为一个单位才能涵盖最长的海运。上方计算器接受的是日历天数(也就是车辆窗口里显示的那个数字),内部自动除以 2.5;但如果你直接照着 wiki 的文字版公式算,记得手动乘除 2.5。
- 时间因子下限是 31,不是零。src/economy.cpp 中的 MIN_TIME_FACTOR = 31 意味着即使货物在车里待了几个游戏年,仍至少能拿回新鲜价的 31/255 ≈ 12%。玩家偶尔会抱怨「我的旧货物什么都赚不到」——通常只是 £ 数字偏小(一名旅客在 2,000 格、4,000 天的船上为 floor(2000 × 31 × 1 × 3185 / 2,097,152) = £94),但只要距离与数量都不为零,结果绝不会是字面意义上的 £0。
- 亚热带木材 £7,964 基础运价是全部原版货物的最高值,超过贵重品(£7,509),仅在短途上能与玩具大陆汽水(£6,250)比较单格收益。中文名同样叫「木材」,但比温带的 £5,005 贵 59%。如果你是亚热带存档,每一条「林场→锯木厂」的可行路线上,木材的优先级都应排在货物之前。OpenTTD 中文 wiki 也直接把它列为亚热带气候下最有价值的货物之一。
- JGR 的 Patch Pack 用同一条公式。JGRPP 中的货物收益代码与原版逐字节相同——经济方面唯一的差别是货物老化速率设置(两边默认都是 100%,JGRPP 把它做成可配置百分比)。只要没改 economy.cargo_aging_rate,本计算器的数字可以 1 比 1 搬到 JGRPP 存档。FIRS、ECS、YETI 等 NewGRF 货物模组会覆盖运价表,本工具不支持;NewGRF 存档可以把计算器输出当作原版基线,再按模组 README 公布的比率缩放。
- 通胀按比例缩放结果。计算器显示的 £ 是基准年(1950)数值,与游戏内运价图的标尺一致。OpenTTD 默认通胀倍率约每年 1.5%,会同时缩放支出与收入,所以「相对于运营成本的相对收益」并不变——计算器的 £ 不是你 2050 年银行账户里的真实数字,但两次运输之间的比例完全保留。
- 动手铺路前先看计算器下方的速查表。它把全部 33 行原版数据(31 种唯一货物名加上亚热带木材与原油各一行)按单位运价排序,并用启发式 days1 × 75(30 km/h × 2.5 天/周期 ≈ 1950 年代典型列车每周期 75 格)标注「最佳距离 ≤ N 格」。days2 = 255 的货物会被打上「实际无上限」标签——在陆地路线上它们几乎永远不会进入严重老化区。
OpenTTD 货物收益计算器——常见问题
OpenTTD 中货物收益的公式是什么?
收益 = floor(距离 × 时间因子 × 数量 × 单位运价 / 2,097,152),其中时间因子 = max(255 − max(tp − days1, 0) − max(max(tp − days1, 0) − days2, 0), 31),tp = floor(运输天数 / 2.5)。常量 2,097,152 = 2^21、255 = MAX_TIME_FACTOR、31 = MIN_TIME_FACTOR 全部来自 src/economy.cpp 中的 GetTransportedGoodsIncome() 函数。原版 14.x、JGRPP 与经典 Transport Tycoon Deluxe 共用这条公式——它自 1995 年起从未改动。
货物收益里的距离是怎么算的?
距离指起讫站之间的曼哈顿格距离:$|xsrc - xdst| + |ysrc - ydst|$。它不是铁路长度。只要两站坐标不变,200 格直线轨道与绕路 350 格弯曲轨道获得的收益完全相同。把站点放在产业建筑的最远两端来最大化曼哈顿距离,是社区里广为人知的小技巧——不需要把铁路修得更长。
为什么 wiki 上的一个「天」其实是游戏里的 2.5 天?
OpenTTD 用一字节(0–255)计数器记录货物年龄,每 2.5 个日历天才递增一次。wiki 的文字版公式直接采用这种「运输周期」单位;本计算器接受的是车辆窗口里看到的日历天数,自动替你除以 2.5。
OpenTTD 里哪种货物最赚钱?
按基础运价排:亚热带木材(£7,964)→ 贵重品(£7,509)→ 汽水(£6,250)→ 货物/糖果(£6,144)→ 煤炭(£5,916)。长途路线最优是煤炭:days2 = 255 让时间因子在 1,500 格距离上仍接近最大值。按月度收益(考虑产业产能)通常仍是煤炭:煤矿每月产 100+ 吨,银行每月只产 1 至 8 件贵重品。可以在「对比两次运输」模式里看到贵重品在你这张地图上具体多长才会反超煤炭。
本计算器对 JGR 的 Patch Pack 存档有效吗?
有效——原版 OpenTTD 14.x 与 JGR 的 Patch Pack 之间,货物收益代码逐字节相同。经济方面的唯一差别是货物老化速率设置(两边默认都是 100%,JGRPP 把它暴露为 economy.cargo_aging_rate)。33 行运价表(31 种唯一货物名加上亚热带木材与原油两行)与整数公式都没动过。只要没改老化速率,计算器数字可以 1 比 1 搬到 JGRPP 存档。
对 FIRS、ECS、YETI 这类 NewGRF 货物模组有效吗?
无效。NewGRF 货物模组会用自己的 paymentRate、days1 与 days2 覆盖原版 _default_cargo 表。本计算器只内置原版货物定义(31 种唯一名称、33 行——亚热带木材与原油各占独立行),在 FIRS 存档上跑公式会正确,但常量是错的。NewGRF 存档可以把计算器输出当作原版基线,再按模组 README 公布的比率缩放(多数 NewGRF 都会列出这个比例)。
为什么我的长途船运货物显示「£0」?
MIN_TIME_FACTOR = 31 的下限决定了陈旧货物至少也能拿到新鲜价的 31/255 ≈ 12%——结果不可能字面为零,除非距离或数量为零。如果看到 £0,请检查:(a) 距离不为零(同站交付不付钱),(b) 数量不为零,(c) 单位运价不为零(部分 NewGRF 会把不希望被运输的货物运价归零)。在 2,000 格、4,000 天的旅客船上,单名旅客的收益会很小(£94 = floor(2000 × 31 × 1 × 3185 / 2,097,152)),但绝不会是零。
为什么 CityMania 与游戏内运价图给出的数字略有出入?
CityMania 工具(citymania.org/tools/profit)在自己页面上明说「numbers may not be exactly accurate (they should be pretty close though)」——它使用近似算法并对中间值做四舍五入。游戏内运价图采用的是与本计算器相同的整数公式,但 Y 轴量化粒度低,目测可能有 ±5% 误差。本计算器与引擎逐位精确匹配,因为我们逐字节复刻了移位运算。如果游戏内 £ 的差距大于几个单位,请检查输入的「运输天数」是否真等于车辆当前显示的货物在途天数(货物在站台等待时这个数字会持续上升)。
通胀会改变结果吗?
计算器返回的是基准年(1950)数值的 £,与游戏内运价图的标尺完全相同。OpenTTD 默认通胀倍率约每年 1.5%,会同时缩放支出与收入,所以你 2050 年银行账户里的真实收入大约是计算器输出的 4.4 倍——但「相对收益」(这趟对那趟、这种货物对那种、这段距离对那段)丝毫不变。计算器刻意不显示按年通胀调整后的 £,因为 wiki、运价图与 economy.cpp 都以 1950 年为基准。
本计算器与游戏实际运算相比精度如何?
对原版 14.x 与 JGRPP 而言逐位精确——40 项 QA 测试套件会把每一个输出与 src/economy.cpp 中的 C++ 数学交叉比对。计算器不模拟 NewGRF 回调(部分 NewGRF 通过 cargo callback 添加倍率)、负收益的中转链以及超过 4,000 天输入上限的货物老化。在这些限制内,£ 结果与车辆卸货时引擎写入账户的金额完全一致。
days1 与 days2 有什么区别?
days1 是早期保鲜阈值:货物在车辆里能停留多少个运输周期,时间因子才开始下降。days2 是叠加在 days1 之上的晚期阈值;超过 days1 + days2 后,时间因子下降速率翻倍(公式同时减去 periodsOverDays1 与 periodsOverDays2)。days2 = 255 的货物(煤炭、原油、铁矿石、钢材、木材、铜矿石、蔗糖、玩具、塑料)实际上不会在任何合理路线上进入陡降区。旅客(0, 24)几乎瞬时开始衰减;贵重品(1, 32)几乎同样快,且是全游戏综合下降最陡的货物。
本计算器免费吗?
明细面板与货物速查表默认全部展开——无需账号、无需注册、无速率限制,计算页面本身也没有广告。运输周期、时间因子、分子等中间值从首次渲染起就一直可见。
如何并排对比两条路线?
用计算器顶部的「对比两次运输」标签页。气候在两次运输间共用(跨气候比较没有意义),而货物、数量、距离与运输天数对运输 A 与运输 B 各自独立。计算器会同时打印两侧 £ 与差额(B − A),并配以绿色或红色横幅。默认值是同一条 100 格、60 天路线上的煤炭对旅客——也是社区里最经典的「这条路应该跑什么货物」对比。
速度会影响收益,还是只看在途天数?
直接影响的是在途天数。货物收益公式不读取车辆速度,只读取货物在车内度过的日历天数。速度的作用是间接的:更快的车辆把同一段曼哈顿距离跑完用的天数更少,运输周期更少,时间因子更高。同一条线上 100 km/h 的火车与 200 km/h 的火车收益不同,正是因为后者用一半的天数完成交付。wiki 也指出:速度的影响在 50 km/h 以下最显著,越往上越平缓——把 200 km/h 提高到 400 km/h 的增益远不如把 25 提到 50。
OpenTTD 货物与经济术语表
曼哈顿距离
两站之间按格子网格计算的直线距离,$|xsrc - xdst| + |ysrc - ydst|$。OpenTTD 货物收益公式使用此距离;它不是车辆实际行驶的铁路长度。
运输周期
OpenTTD 用来记录货物年龄的内部时间单位。一个运输周期 = 2.5 个日历天。存放在一字节计数器中,最大值 255 个周期(约 637 个日历天),之后时间因子会触及下限 MIN_TIME_FACTOR = 31。
时间因子
收益公式里的新鲜度乘数,范围 0–255(下限 31)。255 = 完全新鲜,31 = 陈旧地板。每超过 days1 一个周期下降 1;每超过 days1 + days2 一个周期再额外下降 1(即慢衰区每周期 −2)。
days1
货物的早期保鲜阈值(运输周期数)。在 days1 以内,货物按最大时间因子 255 计费。例:旅客与食品 0,贵重品 1,煤炭 7,原油与玩具 25。
days2
叠加在 days1 之上的晚期保鲜阈值。超过 days1 + days2 后,时间因子衰减速率翻倍。煤炭、原油、铁矿石、钢材、木材、铜矿石、蔗糖、玩具、塑料的 days2 都是 255(实际无上限)。
单位运价 (paymentRate)
src/economy.cpp 中 _default_cargo 表里每种货物的基础费率。最高为亚热带木材(7964),其次贵重品(7509)、汽水(6250)、货物与糖果(6144)、煤炭(5916)。最低为水果(4209)。在引擎中以 Q11.4 定点整数存储。
GetTransportedGoodsIncome()
src/economy.cpp 中的 C++ 函数,负责在车辆卸货时计算 £ 报酬。本计算器逐字节复刻了它的整数公式,包括最终的 BigMulS 移位 21 位除法。
JGR 的 Patch Pack (JGRPP)
由 Jonathan Rennison 维护、长期活跃的 OpenTTD 社区分支,加入了大量额外功能(真实制动、可编程信号、城市分区等)。货物收益代码与原版逐字节相同——本计算器数字 1 比 1 适用。
NewGRF
OpenTTD 的用户内容格式,用于增加车辆、产业、城镇建筑与货物模组。NewGRF 货物模组(FIRS、ECS、YETI)会覆盖原版运价表(33 行:31 种唯一货物,加上亚热带木材与原油两行);本计算器仅使用原版费率。
气候
OpenTTD 四种剧本设定之一:温带(默认)、亚寒带、亚热带、玩具大陆。决定可用的货物种类——煤炭仅温带/亚寒带,钻石仅亚热带,玩具/糖果/可乐仅玩具大陆。
货物老化速率
经济设置项 economy.cargo_aging_rate,控制货物累积运输周期的速度。原版与 JGRPP 默认均为 100%。JGRPP 允许按百分比配置;原版则硬编码为 100。
通胀
OpenTTD 每年应用于支出与收入的倍率(默认约每年 1.5%)。计算器返回基准年(1950)£,与游戏内运价图的标尺一致;相对比较结果不受通胀影响。
由 Smart Calculators 团队审核