# Top Speed 车辆创建与物理指南

## 目录

1. 简介 2. Top Speed 中的车辆物理是如何工作的 2.1 整体图景 2.2 游戏使用的单位 2.3 主要加速流程（通俗说明） 2.4 RPM、扭矩，以及为什么有些挡位会更有劲 2.4.1 RPM 2.4.2 扭矩 2.4.3 马力（Gross 与 Net） 2.4.4 为什么挡位倍率会改变车轮扭矩 2.4.5 不同驾驶状态下的引擎行为 2.5 扭矩曲线形状与换挡恢复 2.5.1 扭矩曲线预设速览 2.5.2 预设选择与覆盖工作流 2.6 挡位、主减速比与有效传动比 2.7 空气阻力与滚动阻力 2.8 刹车与滑行 2.9 转向、抓地力与稳定性 2.10 路面行为 2.11 手动与自动变速箱 2.12 动力总成状态与运行时行为 2.13 引擎运行时（详细逐步说明） 3. 创建自定义车辆包 3.1 文件夹布局与发现方式 3.2 严格文件格式规则（非常重要） 3.3 必需与可选部分 3.4 示例 `.tsv` 车辆文件（完整分区格式） 3.5 声音路径规则与安全规则 3.6 验证行为与错误消息 3.7 给新手的实用调校工作流 4. 参数参考（按部分分组） 4.1 `[meta]` 部分 4.2 `[sounds]` 部分 4.3 `[general]` 部分 4.4 `[engine]` 部分 4.4.1 `[torque]` 部分 4.4.2 `[torque_curve]` 部分 4.4.3 `[transmission]` 部分 4.4.4 `[transmission_atc]` 部分 4.4.5 `[transmission_dct]` 部分 4.4.6 `[transmission_cvt]` 部分 4.5 `[drivetrain]` 部分 4.6 `[gears]` 部分 4.7 `[steering]` 部分 4.8 `[tire_model]` 部分 4.9 `[dynamics]` 部分 4.10 `[dimensions]` 部分 4.11 `[tires]` 部分 4.12 `[policy]` 部分（可选，仅自动变速箱） 4.13 `[engine_rot]` 部分 4.14 `[resistance]` 部分 4.15 扭矩曲线预设配置 5. 类别基线预设（转向、轮胎模型、动态） 6. 旧格式中被移除的内容 7. 调校建议与常见问题 8. 给作者的最后说明

## 1. 简介

本指南说明了当前 Top Speed 重写版本中的车辆是如何工作的，以及如何使用新的严格 `.tsv` 车辆包格式（TopSpeedVehicle）来创建自定义车辆。它是写给新手的，尤其适合使用屏幕阅读器的盲人玩家和模组作者，并且默认你只具备关于加速、刹车和挡位的基础知识。

它的主要目标是帮助你形成实用理解。读完这份文档后，你应该能够理解游戏到底在模拟什么、创建一个合法的车辆文件，并把车辆调校到在实际游玩中手感良好，而不需要依赖高级数学或现实工程训练。

Top Speed 现在使用的是一种基于力的驾驶模型，并且把动力总成模块显式拆分开来。游戏会根据引擎扭矩、传动比、动力系统效率、轮胎周长、抓地力、空气阻力、滚动阻力以及制动力来计算加速度，然后再应用不同变速箱家族的耦合逻辑与换挡逻辑。有些参数名称继承自旧版本游戏，但自定义车辆格式本身已经被彻底重新设计，并且是严格格式。它对旧车辆文件没有任何向后兼容。

这意味着对作者来说，有三件很重要的事。第一，所有值现在都直接写真实数字，不再使用那种需要再除以 100 的旧式编码数字。第二，每个参数都必须写在受支持的部分中。第三，无效值或极端值会带着具体行号报错，而不会像以前那样被悄悄吞掉。

这份指南分成五个部分。它先介绍游戏使用的物理模型，然后说明如何创建自定义车辆包与文件，接着解释解析器与验证规则，再按部分给出一份详细参数参考，包括允许范围与调校建议，最后给出现代转向与轮胎动态模型的类别基线预设。

## 2. Top Speed 中的车辆物理是如何工作的

## 2.1 整体图景

在 Top Speed 中，车辆加速时，游戏并不是简单地给速度固定加上一个数值。它是从各种力推导出加速度的。引擎先产生扭矩，扭矩再被当前挡位和主减速比放大，然后这份扭矩会转换成车轮推力，而车轮推力又会受到抓地力上限的约束。在那之后，游戏会减去那些阻碍车辆前进的力，主要是滚动阻力和空气阻力。最终剩余的净力，再除以车辆质量，才变成加速度。

这也是为什么两辆拥有相似目标最高速度的车，开起来却可能完全不同。如果一辆车又重、齿比较长，而且换挡后落点 RPM 所处区域扭矩很低，那它即使 `max_speed` 很高，开起来也会发懒。另一辆车哪怕 `max_speed` 参考值更低，只要它齿比较短、中段扭矩更强、质量也更轻，就会显得很快。

游戏还会单独运行一套转向与横向运动模型。转向会受到 `steering_response`、`max_steer_deg`、`wheelbase` 以及高速窗口参数的影响，而实际的横向响应则由 `[tire_model]` 与 `[dynamics]` 的值来限制和塑形。现在在高速下，共享转向模型会先施加内置衰减，然后才把 `high_speed_steer_gain` 作为一个有界增益叠加到已经衰减后的基线上。这样做的目的是在保持高速转向稳定的同时，仍然保留按类别调校的空间。

变速箱行为现在被拆成两层。第一层是车辆定义（`[transmission]` 以及类型专属的 `[transmission_*]` 部分），它决定这台车支持哪种变速箱家族，以及该家族如何把引擎 RPM 与车轮 RPM 耦合起来。第二层是自动换挡策略（`[policy]`），它决定自动模式“何时”换挡。策略可以优化换挡决策，但它无法凭空创造原本就不存在的引擎动力。

手动与自动家族现在遵循不同的传动物理。手动模式使用离合状态，并且在低速、高负载、挂着不合适挡位时，如果离合仍然接合，就可能熄火。自动家族则使用各自的耦合模型（ATC、DCT、CVT），包括起步耦合行为、锁止阈值，以及在 ATC/CVT 中的低速 creep 行为。

整个格式还按职责做了拆分。核心引擎限制放在 `[engine]`，扭矩曲线形状放在 `[torque]` 与 `[torque_curve]`，引擎旋转行为放在 `[engine_rot]`，底盘与空气阻力放在 `[resistance]`。把这些部分分开之后，调校会更安全，也更容易推理。

## 2.2 游戏使用的单位

之所以专门有这一节，是因为很多调校错误并不是源于糟糕的物理想法，而是单位搞错了。理解单位最简单的方式，就是把它们看成模拟系统所使用的语言。如果一个值是按错误单位填进去的，游戏当然还是会运行，但结果会以一种很难定位的方式显得“不对劲”。

虽然游戏面对玩家显示速度时使用的是 km/h，但内部在力和运动的计算上，仍然使用标准物理单位。你在制作车辆时不需要会高数，但你必须知道这些单位在直觉上分别代表什么。

`kg`（千克）表示质量。在本指南中，`mass_kg=1500` 就表示这辆车质量为 1500 kg，而这会直接影响“相同的力”能给你带来多大的加速度。车越重，需要的力就越大，才能有同样的加速感。

`Nm`（牛·米）表示扭矩。你可以把它理解为“扭的劲有多大”。想象你拿扳手拧螺栓，扭矩就是你扭这个扳手时的力量大小。在游戏里，引擎扭矩表示引擎在某一 RPM 下、在传动比放大之前能够输出多少扭转力。

`N`（牛顿）表示力。车轮推力就是扭矩通过轮胎半径转换后，真正把车辆沿路面往前推的那股力。加速度来自于减去阻力之后剩下的净力。

`m`（米）表示距离，而 `m^2`（平方米）表示面积。`wheelbase` 用的是米，`frontal_area` 用的是平方米。迎风面积会和阻力系数一起，用来模拟空气在高速下对车辆施加多大的阻力。

`rpm` 表示每分钟转数。它代表的是引擎转得有多快，而不是引擎本身有多大动力。RPM 决定你当前位于扭矩曲线的哪个位置。

`m/s^2` 表示加速度或减速度。物理模型会用它来表达某股力随着时间如何让车辆加速或减速。

`kg*m^2`（在键名中写作 `kgm2`，例如 `inertia_kgm2`）表示转动惯量。这个单位对新手来说通常最难理解，所以你可以简单把它看成：它控制 RPM 变化有多快。惯量越高，RPM 上升和下降都会更慢；惯量越低，引擎升转和掉转都会更快。

你还可能在某些变速箱键中看到 `km/h/s`，例如 `creep_accel_kphps`。这个单位的意思是“每秒增加多少 km/h 速度”，用于 creep 行为。

新的自定义格式只使用直接值，不再有旧式“除以 100”的编码规则。如果你想让参考最高速度是 170 km/h，就直接写 `max_speed=170`；如果你想让抓地系数是 0.10，就写 `surface_traction_factor=0.10`；如果你想让转向响应为 1.8，就写 `steering_response=1.8`。

如果你不确定某个键的意思，先看它的单位，再开始调。实际经验表明，仅仅养成这个习惯，就能避免很多不现实的结果。

## 2.3 主要加速流程（通俗说明）

在踩下油门时，游戏每一帧都会按一定顺序进行计算。

第一步，是根据当前车速和当前挡位确定引擎 RPM。RPM 取决于车速、轮胎周长、当前挡位传动比、主减速比，以及传动耦合模式（锁定、混合或分离）。在低速加油时，一个起步 RPM 底线可以避免引擎掉得太低，导致起步显得发软。

第二步，是从引擎扭矩曲线中读取当前 RPM 对应的引擎扭矩。扭矩曲线可以由一个预设形状加上 `[torque_curve]` 中的覆盖项构成，也可以直接通过一组分 RPM 点来定义。它依然会和核心扭矩值（`idle_torque`、`peak_torque`、`peak_torque_rpm` 和 `redline_torque`）一起工作，并依附于 `idle_rpm` 到 `rev_limiter` 之间的 RPM 范围。

这份引擎扭矩会先乘上当前挡位传动比和 `final_drive`，然后再乘以 `drivetrain_efficiency` 之后得到车轮扭矩。接着，车轮扭矩会依据轮胎半径（由轮胎周长推导）转换成车轮推力。

车轮推力还会受到抓地力上限约束。即便理论上引擎还能推得更狠，轮胎也只能把有限的力真正传到地面。这时 `tire_grip`、路面行为以及相关操控值就会发挥作用。

最后，游戏会减去各种阻力。滚动阻力在所有速度下都存在，并且通常在低速时更明显；空气阻力则会随着速度快速上升，在接近最高速时占主导。剩余的净力再除以 `mass_kg`，就变成加速度。

在松油与滑行阶段，运行时会综合多个组成部分来计算总减速度：空气阻力、滚动阻力、车轮侧阻力、仍处于连接状态下的传动系阻力、通过传动比传递到车轮的引擎制动，以及可选的刹车输入。这就是为什么现在高挡松油、低挡松油和空挡滑行的表现可以不同，但又仍然保持物理一致性。

最终结果，就是一个能让低速加速、中速再加速以及高速再加速分别使用不同参数进行调校的系统。

## 2.4 RPM、扭矩，以及为什么有些挡位会更有劲

## 2.4.1 RPM

RPM 表示曲轴每分钟完成多少次完整旋转。如果引擎处于 3000 RPM，就说明曲轴每分钟转了 3000 圈。这个数字看日志时很直观，但更重要的是它对扭矩意味着什么。每一台引擎在不同 RPM 区间都有强弱差异，所以 RPM 实际上是在告诉你：这台引擎当前位于它那张“力量地图”的哪一段。

在游玩层面上，RPM 解释了为什么有些换挡之后感觉仍然很有力，而另一些换挡之后却像“死了一样”。升挡之后 RPM 一定会下降，这很正常。关键在于它落到哪里。如果它落在扭矩曲线中仍然有用的区域，车辆就会继续拉得动；如果它落得太低，车辆就会显得发懒，直到 RPM 再次爬起来。

这也是为什么单纯提高 `rev_limiter` 并不总能解决问题。更高的转速限制会让每个挡拉得更长，但如果扭矩在高转掉得很厉害，或者升挡后的落点太低，反而可能让可驾驶性更差。好的调校并不是“让 RPM 越高越好”，而是“让真实换挡之后的 RPM 总能落在曲线中可用的区域”。

## 2.4.2 扭矩

扭矩就是引擎的扭转力量。对新手来说，最容易理解的方式是：扭矩是试图带动整个传动系统旋转的那股劲，而传动系统再把这股旋转变成轮胎对地面的推力。在 Top Speed 中，扭矩并不直接等于加速度。它必须先经过传动比、效率、抓地上限以及阻力，最后才会变成加速度。

这里的顺序非常重要。引擎先根据当前 RPM 从扭矩曲线中产生扭矩；这份扭矩再被 `power_factor` 缩放，然后乘上挡位传动比和 `final_drive`，最后再由 `drivetrain_efficiency` 扣除损失。到这里为止，我们才得到车轮扭矩。接下来，车轮扭矩被转换为前向推力，然后游戏才能把这份力与抓地力上限和阻力进行比较。剩下的净力，再除以质量，才是加速度。

这就是为什么两辆峰值扭矩看起来差不多的车，开起来却可能完全不同。一辆拥有短齿比和良好中段扭矩的车，可能会显得非常灵活；另一辆齿比较长、换挡落点 RPM 又太差的车，即便峰值扭矩数字很好看，实际开起来也可能非常平。

一个简化例子：

1. 当前 RPM 下的引擎扭矩为 `300 Nm`。
2. `power_factor=0.80`，所以有效引擎扭矩变成 `240 Nm`。
3. 挡位比 `2.20` 加上 `final_drive=3.50`，得到损失前的车轮扭矩：`240 * 2.20 * 3.50 = 1848 Nm`。
4. 若 `drivetrain_efficiency=0.88`，则车轮扭矩变成 `1626.24 Nm`。
5. 若轮胎半径是 `0.34 m`，则车轮推力为 `1626.24 / 0.34 = 4783 N`。
6. 若此时阻力为 `1800 N`，净力就是 `2983 N`。
7. 若 `mass_kg=1500`，则加速度为 `2983 / 1500 = 1.99 m/s^2`。

在调校实践中，这也解释了为什么“只降低峰值扭矩”通常不是最好的第一反应。如果车辆只是高车速区域太强，请先调整高转段扭矩形状或阻力；如果起步弱但中高速拉力没问题，请优先调整低转扭矩带和传动比。扭矩调校最有效的方式，是针对“错误的速度区间”下手，而不是盲目地把整条曲线一起改平。

运行时还会跟踪总输出（gross）和净输出（net）两种引擎输出。总扭矩是燃烧侧根据曲线直接产生的扭矩；净扭矩则会扣除摩擦和 overrun 等内部损失。这也是为什么在接近怠速时，你依然能看到 RPM 行为稳定，但汇报出来的净马力却很低。

## 2.4.3 马力（Gross 与 Net）

马力是一个由扭矩和 RPM 推导出来的数值，它把二者组合成一个“做功速率”的指标。在本项目中，马力并不是一个主要输入键。它是通过 `horsepower = (torque_nm * rpm) / 7127` 这个公式，由扭矩和 RPM 计算出来的。

比较实用的理解方式是：扭矩告诉你“这股扭劲有多强”，而 RPM 告诉你“这股扭劲发生得有多快”。如果你想理解某一时刻的引擎输出，就必须同时看这两者。例如，同样是 `260 Nm`，在 `2000 RPM` 和在 `5000 RPM` 时，所对应的马力并不相同。

运行时会提供两个版本：总马力（gross horsepower）和净马力（net horsepower）。总马力来自扣除内部损失之前的总扭矩；净马力则是在扣除了摩擦和 overrun 损失之后得到的。这一点在排查日志时非常重要。如果引擎接近怠速，或者玩家在高 RPM 下松开油门，净输出可能会比你预期的小很多，甚至短暂变成负值；但总输出仍然会反映底层扭矩曲线本身的行为。

## 2.4.4 为什么挡位倍率会改变车轮扭矩

引擎扭矩是在曲轴处产生的。车轮扭矩等于：

- 引擎扭矩
- 乘上当前挡位传动比
- 再乘上 `final_drive`
- 再乘上 `drivetrain_efficiency`

所以在引擎扭矩相同的情况下，低挡（数值上更大的传动比）通常会产生比高挡更大的车轮扭矩。这也是为什么 1 挡和 2 挡通常会感觉很有力。

如果你比较的是相同车速下的日志，那么有时高挡也可能显示出不错的拉力，因为那个挡位可能让引擎落到了更强的扭矩区域，而低挡反而正处于扭矩衰减区或接近 limiter。所以正确的理解应该是：

- 低挡会更强地放大扭矩
- 真实加速度仍取决于 RPM 落在扭矩曲线的什么位置，以及在该速度下哪一类阻力更占主导

这也解释了一个常见困惑：

- “为什么高挡时扭矩反而更高？”
  通常变化的是新 RPM 落点下的引擎扭矩，而不是挡位倍率本身。高挡会降低倍率，但如果新 RPM 落点更接近峰值扭矩，那么引擎侧扭矩会变大；只是相比同样引擎状态下的低挡，最终车轮扭矩通常仍然会更小。

在调校时，请始终区分：

- 引擎扭矩（`[torque]` + `[torque_curve]`）
- 车轮扭矩（引擎扭矩经过传动比和效率之后的结果）
- 加速度（车轮推力在经过抓地限制并减去总阻力之后的结果）

## 2.4.5 不同驾驶状态下的引擎行为

引擎在不同驾驶状态下的行为并不相同，因为扭矩、耦合、过载和损失的参与方式都会发生变化。

在持续给油时，引擎会尝试根据当前 RPM 从扭矩曲线中输出可用扭矩，然后通过耦合状态把这份扭矩尽可能传到驱动轮上。此时你最关心的是扭矩曲线形状、挡位落点、主减速比和阻力。

在松油时，系统会转而强调摩擦、overrun 和引擎制动。也就是说，引擎不再主要表现为“推动车辆前进的源头”，而开始表现为“通过传动系统帮助车辆减速的源头”。这就是为什么松油减速和真正踩刹车是两回事。

在手动挡且离合踩下时，引擎可以在较大程度上脱离车轮速度而自由变化 RPM。此时引擎制动传递会消失，但这并不自动意味着整车就等同于空挡，因为选中的挡位路径本身仍可能存在，传动系被动阻力也可能仍然存在。

在空挡状态下，选中的挡位路径本身被移除了，因此动力总成和车轮之间的联系又比“踩离合但仍在挡内”更少。这就是为什么空挡滑行、踩离合滑行和完全耦合松油滑行应该有三种不同的手感。

对新手来说，最关键的一点是：不要把所有“减速感”都混为一谈。你需要先分清它到底是刹车太强、引擎制动太强、传动拖滞太大，还是滚阻与空气阻力本来就太高。

## 2.5 扭矩曲线形状与换挡恢复

一条“健康”的扭矩曲线，并不只是看峰值有多高，而是看它在真实驾驶中能否让车辆在换挡之后仍然保持足够的拉力。很多车的核心问题，不是峰值不够，而是换挡之后 RPM 落到了太弱的区域。

如果一辆车在某个挡位里拉得很猛，但一升挡就明显发软，那么你就该检查两件事：第一，下一挡的 RPM 落点是否离峰值扭矩区太远；第二，低中转区的扭矩是否根本不足以支撑恢复。

扭矩曲线调校最实用的思路，是先找出“哪一段速度体验不对”，再反推需要增强或削弱哪一个 RPM 区域。不要一开始就试图把整条曲线雕得非常复杂。

## 2.5.1 扭矩曲线预设速览

内置预设是用来快速生成基础曲线的。它们不是死板的类别，也不会把一台车锁定成某种唯一行为。它们的作用，是让你能更快得到一条“看起来像真的”起始曲线，而不必从零开始手写每一个 RPM 点。

在底层，运行时会从怠速到转速限制器之间采样扭矩点，使用 `rise_exponent` 来塑造通往峰值的上升形状，使用 `fall_exponent` 来塑造峰值之后的下降形状，并且只在没有显式设置 `idle_torque` 或 `redline_torque` 时，才使用后备的 idle/redline 因子。完成这一步之后，你再写的 `NNNNrpm` 键会覆盖对应的点。这样的设计，让你可以先从大轮廓开始，再只修正那些手感不对的具体 RPM 区域。

对新手来说，选择预设时，应该根据“扭矩最强的区域该落在哪里”来选，而不是根据车辆名头来选。家用轿车和紧凑型 SUV 完全可能用同一套预设，只要它们需要相似的低中段可驾驶性。跑车双门和高转摩托虽然类别不同，但也可能都需要更偏后段的扭矩爬升。

各预设的大致含义如下：

preset | 通俗理解
--- | ---
`city_compact` | 日常低中段响应轻松，顶端不激进
`family_sedan` | 常用车速范围内平衡、宽容
`sport_sedan` | 中段更强，高速延续更好
`sport_coupe` | 比轿车预设更偏向高转
`grand_tourer` | 宽广、平顺的大范围拉力
`hot_hatch` | 中段反应活泼，换挡恢复快
`muscle_v8` | 低中段推力更强，高转更早变软
`supercar_na` | 高转自然吸气风格
`supercar_turbo` | 增压式中段爆发，加上不错的上段延续
`rally_turbo` | 为快速恢复设计的强劲中段
`diesel_suv` | 低转扭矩来得早，高转区域更平静
`diesel_truck` | 更早爆发的扭矩，并且衰减清晰
`supersport_bike` | 很尖锐的高转型风格
`naked_bike` | 仍然偏运动，但可用带比 supersport 更宽

## 2.5.2 预设选择与覆盖工作流

最安全的工作流，是把预设视为第一遍轮廓，而把显式 RPM 点视为纠偏工具。先选一个整体行为最接近的预设，然后设定锚点值（`peak_torque`、`peak_torque_rpm`，以及显式或后备的 idle/redline torque）。接着用短时间实车测试去检查起步、换挡恢复以及高车速拉力。这样你就能先得到一张“行为地图”，然后再决定要不要动细节点。

一旦你确定了出问题的区域，就只在那个区域添加显式 RPM 点。如果换挡恢复弱，就增强换挡落点附近；如果高转太强，就削弱转速限制器附近的点；如果起步弱而传动比没错，就增强低转区域。与其把整条曲线一起拉平，这种定点修正会稳定得多。

在一开始时，请让手写 RPM 点保持稀疏。通常 4 到 8 个真正有意义的点，就比一整串密密麻麻的小修小补更有效，因为后者很容易引入噪声，并让以后排查变得困难。只有当你明确要塑造某种特殊个性时，才值得再增加点密度。

每次修改传动比之后，都要重新验证。某条在修改 `final_drive` 之前手感完美的扭矩曲线，改完之后可能就会失真，因为换挡落点 RPM 和各挡运行 RPM 都变了。换句话说，曲线调校和齿比调校是捆绑的，它们必须一起验证。

## 2.6 挡位、主减速比与有效传动比

每个前进挡都有自己的挡位比。游戏会把这个挡位比再乘上 `final_drive`，从而得到用于车轮扭矩与 RPM 映射的有效传动比。

有效传动比越高，扭矩放大越强，但同样车速下的 RPM 也会更高。有效传动比越低，同样车速下 RPM 越低，车轮扭矩也越小。

修改 `final_drive` 会同时影响所有前进挡。这使它成为游戏里最有力的调校控制之一。小幅提高 `final_drive` 可能就足以修复高挡发软，但也可能让低挡变得过于暴躁、并更早撞到 limiter。降低 `final_drive` 可以平缓整体加速，但如果引擎在新落点 RPM 下扭矩不够，就会让高挡彻底拉不动。

正因如此，高挡调校通常是主减速比、扭矩曲线、空气阻力以及变速箱策略共同作用的结果。

## 2.7 空气阻力与滚动阻力

滚动阻力是一种始终存在、不断抵抗车辆前进的力。它受 `rolling_resistance` 的影响，并在低速、中速和高速下都存在，只不过通常在空气阻力还不够大之前会显得更明显。

对新手来说，理解滚动阻力最简单的方式是：它就是轮胎与路面接触所带来的那种“始终都在”的拖拽感。哪怕车速只是中等，车辆也必须花掉一部分引擎推力，才能只是维持前进。如果你提高 `rolling_resistance`，车辆在几乎所有挡位都会显得更重、更不愿意提速，而不只是高车速时；如果你把它调得太低，车辆可能会滑行过久，显得过于自由。

空气阻力由 `drag_coefficient` 和 `frontal_area` 决定，并且会随着速度迅速增长。这也是为什么有些车在某个速度以前加得很快，但之后就会慢慢爬向最高速。

当前模型比“空气阻力加轮胎阻力”更细。纵向阻力现在由四层被动损失共同组成，而且每一层职责都不同。空气阻力负责空气载荷，主要由 `drag_coefficient`、`frontal_area` 和在需要考虑横风时的 `side_area` 来塑形。滚动阻力负责轮胎与路面的基础负载，由 `rolling_resistance` 和 `rolling_speed_factor` 控制。车轮侧阻力是一层独立的、始终存在的底盘/车轮路径损失，由 `wheel_side_drag_n` 与 `wheel_side_drag_linear_n_per_mps` 控制，即使引擎与车轮断开，它依然会存在。耦合传动阻力则是传动系统一侧的损失，只有在真实挡位路径仍然接合时才存在，由 `driveline_drag_nm` 和 `driveline_viscous_drag_nm_per_krpm` 控制。

这种拆分之所以重要，是因为游戏现在不再把所有滑行状态都当成同一件事。空挡滑行、本田动挡踩离合滑行，以及完全耦合松油滑行，本来就不应该手感一样。空挡会移除选中的挡位路径，所以只剩下空气阻力、滚动阻力和车轮侧阻力；踩离合但仍挂挡时，挡位路径依旧存在，所以车轮侧阻力和传动侧阻力仍可能存在，但由于离合已经断开，引擎制动传递会消失；完全耦合松油时，则会同时叠加空气阻力、滚动阻力、车轮侧阻力、耦合传动阻力，以及通过当前传动比传递到车轮上的引擎制动。

这也是为什么现在更容易理解“和挡位有关的滑行手感”。如果一辆车在所有状态下都减速过猛，通常应该先看滚动阻力和车轮侧阻力；如果它只有在挂挡耦合状态下才减速过猛，那通常更该看引擎制动传递和传动阻力；如果空挡感觉刚好，但踩离合后仍然太自由，那问题更可能在传动阻力设置或挡位路径状态，而不是空气阻力。

这在调校时尤其重要。如果一辆车从起步、中段到高车速都显得偏弱，问题通常并不只在空气阻力，更常见的是 `power_factor`、扭矩曲线、`mass_kg`、齿比，以及可能过大的滚阻共同导致。如果一辆车低挡都很正常，只有高车速区域没劲，那么优先查看 `drag_coefficient`、`frontal_area` 以及高转区域扭矩（如 `redline_torque`）才更有效。

换句话说，滚动阻力主要塑造的是“整体运动显得多重”，而空气阻力主要塑造的是“接近最高速时撞上一堵墙”的感觉。先判断到底是这两种感觉中的哪一种不对，再去动参数，效果通常会更好。

从平衡角度来看，这套行为往往正是你想要的。如果某辆车在接近最高速时太强，那么增加空气阻力或降低 `redline_torque` 通常是很干净的修复方式；如果它在所有速度下都太弱，那就应先检查 `power_factor`、`mass_kg` 和齿比，而不是先怪空气阻力。

几个实际解读例子：

1. 如果一辆车在空挡滑行和踩离合滑行时都显得太自由，请先提高 `wheel_side_drag_n`、`wheel_side_drag_linear_n_per_mps` 或 `rolling_resistance`，再去考虑引擎制动。
2. 如果空挡手感正常，但踩离合挂挡滑行仍然太自由，请重点看 `driveline_drag_nm` 与 `driveline_viscous_drag_nm_per_krpm`。
3. 如果踩离合手感正常，但一旦松开离合就变得过于粗暴，请优先检查 `engine_braking`、`engine_braking_torque` 和 `brake_transfer_efficiency`。
4. 如果低挡都拉得不错，但接近最高速时像撞墙一样，请先检查 `drag_coefficient`、`frontal_area`、`side_area` 和高 RPM 区域扭矩形状，再决定是否要动整个变速箱。

## 2.8 刹车与滑行

Top Speed 会把主动刹车和松油减速明确区分开来。

主动刹车发生在玩家按下刹车键时。它的结果主要取决于 `brake_strength`、抓地力和当前路面。

松油减速则发生在玩家松开油门时。那属于引擎制动，它由 `engine_braking` 与 `engine_braking_torque` 共同控制，并且还要叠加 RPM、传动比和传动效率的影响。

如果一辆车在玩家松油之后减速太狠，就应该先降低引擎制动相关值，而不是动刹车强度；如果真正按刹车键时感觉刹不住，那才应该调整 `brake_strength`。

这只是高层区分，而当前运行时实际上又更进一步。踩刹车带来的减速是一条明确的制动力路径；不踩刹车时的自然减速则是一条被动阻力路径。它们不再共用一个笼统的“deceleration”数值。被动减速由空气阻力、滚动阻力、车轮侧阻力、当前状态下仍存在的耦合传动阻力，以及在引擎仍连接车轮时才出现的引擎制动传递共同组成。而主动刹车会在这些被动损失之上额外叠加制动力。

这意味着，当你在判断“滑行和刹车哪里不对”时，应该根据状态来分析，而不是只用“太慢”或“太重”这种笼统感受。一辆车如果只有在按下刹车键时减速过猛，那问题更可能在 `brake_strength`、路面对刹车的影响，或者轮胎抓地力；如果它在挂挡松油时减速过猛，那问题更可能是引擎制动传递或耦合传动阻力；如果它在空挡或踩离合时还滑得太自由，那更可能是车轮侧阻力或滚阻不足。

手动离合行为在这里尤其值得特别说明，因为它很容易被误读。在当前模型中，踩下离合，并不意味着车辆在所有意义上都等同于空挡。空挡是彻底移除了选中的挡位路径；而手动车辆在挡内踩住离合时，仍然保留了选中的挡位路径，只是引擎与这条路径分离了。这意味着：踩离合滑行时，引擎制动传递应当消失，但传动系一侧的被动阻力仍可能存在。因此，踩离合滑行通常应当比完全耦合松油更自由，但又比纯空挡滑行更“拖”一些。

几个例子：

1. 一辆手动车挂 3 挡、时速 70 km/h，踩住离合滑行时，应当比完全耦合松油更自由，但不应像纯空挡那样彻底放飞。
2. 一辆手动车在 1 挡松油时，通常应比它在 5 挡松油时减速更强，因为引擎制动通过短齿比被放大了。
3. 一辆自动 ATC 车即使只有很轻微的油门变化，也可能在低速下表现出一定阻力和 creep 行为，因为那是它家族模型的一部分，而不是假的刹车效果。
4. 处于停车保持状态的车辆，应该由显式刹车行为来保持，而不是靠某个隐藏的旧式速度泄放机制。

## 2.9 转向、抓地力与稳定性

Top Speed 中的转向响应，是由多个参数协同构成的。`steering_response` 相当于转向强度；`max_steer_deg` 限制绝对转向角；`wheelbase` 决定转向角如何映射成路径曲率；高速窗口参数（`high_speed_steer_gain`、`high_speed_steer_start_kph`、`high_speed_steer_full_kph`）则塑造随着速度上升而施加多少衰减。之后，抓地力和动态参数才决定这些转向请求中，实际有多少能真正转化为横向运动。

这意味着，操控平衡不应该只靠一个值来调。如果一辆车在高速下灵活得不现实，通常第一步应是降低 `high_speed_steer_gain`、降低 `max_steer_deg`，或者提高 `high_speed_stability`。如果这样还不够，那再去降低 `lateral_grip`，或同时降低 `corner_stiffness_front` 与 `corner_stiffness_rear`。如果它在加速或刹车时很容易丢抓地，再去检查 `tire_grip` 与 `combined_grip_penalty`。

## 2.10 路面行为

游戏会针对柏油、碎石、积水、沙地和雪地应用不同的路面修正，而这些修正会和车辆的基础参数一起作用。

`surface_traction_factor` 这个参数依然保留在格式里，但在现代模型下，它通常并不是你调整整车操控品质时最有用的主旋钮。在大多数情况下，要真正改变抓地与过弯手感，更重要的是 `tire_grip`、`lateral_grip`、`brake_strength`、`engine_braking` 以及引擎/传动系统本身的设定。

对新手来说，这是一个很容易踩的坑：如果车辆在柏油路上太容易打滑，不要第一时间就去改 `surface_traction_factor`。这个键听起来像是最直接的修复方式，但在当前模型中，它更像是一种基线参考，而不是一个简单的“多点抓地”滑杆。应优先用 `tire_grip` 处理前向抓地与制动抓地，再用 `lateral_grip` 处理过弯手感。

还要记住，路面往往只是放大或暴露原本调校中的弱点。一辆扭矩过大、抓地又不足的车，在柏油路上可能勉强还算可控，但一到碎石或湿滑路面就会彻底失控。一辆引擎制动很强的车，在柏油路上可能显得很利落，但在低抓地路面上就会显得过于生硬。所以，在完成基础柏油调校后，再做路面测试是非常有必要的。

## 2.11 手动与自动变速箱

变速箱类型现在被明确分成几个家族：

- `manual`：玩家控制离合与换挡。
- `atc`：自动液力变矩器风格家族。
- `dct`：自动双离合风格家族。
- `cvt`：自动无级变速比风格家族。

每辆车会在 `[transmission]` 中声明一个 `primary_type` 和一组 `supported_types`。解析器允许两种情况：要么只支持一种类型；要么支持两种类型，其中一种必须是 `manual`，另一种则必须是且只能是一个自动家族（`atc`、`dct` 或 `cvt` 之一）。

手动模式允许玩家按自己的意愿换挡，但现在离合和熄火逻辑是真正重要的。如果离合处于接合状态（高耦合），引擎就会被机械地绑到车轮速度上；如果踩下离合，耦合就会降低，引擎 RPM 就能更自由地变化。在低速高负载、油门不足的手动状态下，引擎可能会熄火。

自动模式则使用选定家族的耦合模型和策略系统。家族模型控制耦合如何表现（起步打滑、锁止行为、creep、CVT 比率逻辑等）；策略则控制换挡时机、冷却、过渡元数据、最高速挡意图以及防 hunting 行为。

ATC 更强调平顺起步与 creep。它会在很低车速下使用起步耦合边界，可以在换挡时释放耦合，并且只有在满足锁止条件（车速、油门以及足够低的 RPM 滑差）时才会进入硬锁。DCT 则表现得更直接，采用快速耦合，并且没有 creep；同时，它在换挡时会使用重叠耦合。CVT 会把比率保持在允许窗口内，并根据油门需求让引擎尽量停留在目标 RPM 带（`target_rpm_low` 到 `target_rpm_high`）。

这些家族之间最关键的差异，并不只是“怎么换挡”，更在于它们在不同状态下是如何携带损失与耦合的。手动是最显式的模型：玩家离合决定引擎制动传递是否存在，而选中的挡位则决定传动路径本身是否存在。如果玩家挂在真实挡位上且离合已经接合，那么引擎、变速箱和车轮之间的联系会非常强；如果玩家仍然挂挡、但把离合踩开了，那引擎虽然与传动路径断开了，但选中的挡位路径本身依然存在；如果玩家拨到空挡，则连选中的挡位路径也被移除了。这三种状态在物理上是不同的，不应被当成同一种滑行状态来调。

ATC 的目标，是让它低速时比手动更平顺。起步会通过类似变矩器的耦合来进行，因此引擎可以先建立起有用的 RPM，再逐步让传动系统变得更硬。低速 creep 存在，是因为这一家族在极小油门下也允许施加低速驱动支撑。换挡时还会故意放松耦合，而最终是否硬锁，则取决于它是否达到了家族规定的锁止条件，而不是像手动离合那样一一对应。

DCT 在当前模型中是最直接的自动家族。它没有变矩器式 creep，而是依赖快速的离合式耦合和换挡重叠行为。这意味着，一旦车速上来，DCT 车辆通常会比 ATC 车辆更有“被传动系统牢牢拽住”的感觉；同时，换挡时也更容易保留更多传动延续感。实际体验上，DCT 应当更接近一种“很快的自动化手动”，而不是“很平顺的变矩器自动”。

CVT 则把“有效传动比控制”和“耦合状态”分成了两件事。比率可以在允许范围内调整，而耦合则仍按起步与保持规则独立工作。因此，一台 CVT 可以在车速继续上升的同时，把引擎 RPM 尽量维持在目标带内，而不是像固定挡那样通过一挡一挡地变化。它在比率变化上应当比 ATC 或 DCT 更平顺，但耦合状态仍然会影响起步柔和度、creep 和滑行感。

策略系统可以优化换挡决策，但它无法修复物理本身。如果某个挡位因为扭矩、阻力或齿比问题而根本拉不动，那么策略最多只能避免进入它，或者延后进入它。

在实际调校中，手动模式依然是最好的诊断工具，因为它能最直接地暴露底层动力总成行为。如果手动模式下手感健康，但自动模式却升挡太早、来回 hunting，或者太早进入 overdrive，那就应该调 `[policy]` 以及对应自动家族的 `[transmission_*]` 部分，而不是回头重做引擎和齿比。

几个有用对比：

1. 手动挂挡且离合接合：引擎制动传递最强，同时最能体现“不同挡位松油手感不同”。
2. 手动挂挡但离合踩下：引擎制动传递消失，但挡位路径阻力可能仍然存在。
3. 手动空挡：最接近纯自由滑行状态，不再有选中挡位路径。
4. ATC 低速：柔和起步和一定的 creep 行为是正常的。
5. DCT 换挡中：在重叠阶段保留一定的传动延续感是正常的，不应按 ATC 的变矩器打滑方式去调。
6. CVT 稳定油门下：引擎 RPM 可能维持在目标带内，而车速则通过比率变化继续上升，而不是通过阶梯式换挡上升。

## 2.12 动力总成状态与运行时行为

当前运行时会把引擎与车辆运动拆成三层相互协作的系统，这样一来，问题就能更容易地被正确归因。引擎状态层负责解析耦合状态、自动低速 RPM 支撑以及手动熄火条件。自动换挡层负责解析换挡时机、冷却、过渡元数据，以及 CVT 强制逻辑等家族特有行为。纵向运动层则负责根据驱动力、阻力、滑行和刹车来解析实际速度变化。

这种拆分很重要，因为看起来相似的症状，可能来自不同层。一个糟糕的换挡决策，摸起来很像引擎扭矩偏弱；耦合问题可能看起来像扭矩曲线中间有个坑；阻力失衡也可能被误认为是变速箱问题。只要你先识别出“症状归谁管”，排错速度就会快很多。

最近的稳定性工作也改变了空挡、离合和起步行为，而这些变化是作者必须知道的。自动起步支撑现在会根据车速和耦合程度逐步爬升，而不再是一刀切地突然跳上去，因此 RPM 在接合后不该再像以前那样断崖式下坠。手动状态下，只要离合已经断开，就不会再运行传动熄火逻辑，因此自由离合的行为会更干净。空挡自由轰油后松油时，现在会在高转应用 overrun 损失，同时仍会保护接近怠速时的行为，因此衰减会更真实，但又不会直接掉穿怠速。

在运行时里，最值得记住的核心区别是：引擎状态、挡位路径状态和车轮速度状态是有关联的，但它们并不相同。引擎完全可以和车轮断开连接，但变速箱内部仍然保留了一个已选中的挡位路径。手动车辆在玩家踩住离合但不摘挡时，正是这种状态。在这种状态下，由于引擎不再驱动这条路径，引擎制动传递理应消失；但因为从旋转着的车轮到变速箱内部被选中的那部分路径仍然存在，所以车轮侧和传动侧的被动损失仍可能保留。

这也是为什么本指南现在会在描述行为时使用三种不同的滑行标签：

1. 空挡滑行：没有选中的挡位路径，没有引擎制动传递，也没有耦合传动阻力。
2. 挂挡但离合断开：选中的挡位路径仍在，引擎制动传递消失，但传动阻力仍可能存在。
3. 耦合状态下的松油滑行：选中的挡位路径仍在，而且引擎和车轮的耦合足够强，所以引擎制动力也会传到车轮。

当一辆车在某个挡位里“减速得不对劲”时，这个区分尤其重要。如果空挡和踩离合滑行都显得太自由，那问题大概率在车轮侧阻力或滚阻；如果空挡感觉正常，但踩离合滑行依然太自由，那就更像是传动阻力设置或挡位路径状态处理问题；如果踩离合滑行正常，但完全耦合松油时太暴躁，那更可能是引擎制动传递，而不是空气阻力或车轮侧阻力。

## 2.13 引擎运行时（详细逐步说明）

本节说明当前运行时每一帧实际上是如何更新引擎 RPM 和马力的。

1. 根据速度与传动比计算耦合 RPM
   模型会把车速、轮胎周长和传动比转换成一个传动系耦合 RPM。

2. 在自动模式下应用最小耦合 RPM 底线（若启用）
   在自动家族的驾驶状态下，起步支撑逻辑可能会请求一个最小耦合 RPM。
   这个底线会受到 `min_coupled_rise_idle_rpm_per_s` 和 `min_coupled_rise_full_rpm_per_s` 的爬升速率限制。

3. 根据当前耦合模式选出基础 RPM
   - 锁定：直接使用耦合 RPM
   - 混合/分离：使用前一帧或自由引擎 RPM 状态作为基线

4. 根据曲线评估可用引擎扭矩
   基础 RPM 下的扭矩来自 `[torque_curve]` 以及核心 `[torque]` 锚点，然后再由 `power_factor` 缩放。

5. 在需要时加入怠速控制扭矩
   在接近怠速且油门较小时，怠速控制会使用下面这些值补偿扭矩：
   - `idle_control_window_rpm`
   - `idle_control_gain_nm_per_rpm`

6. 计算损失（摩擦 + overrun）
   损失扭矩包括基础/线性/二次摩擦，以及可选的闭油门 overrun 塑形：
   - `friction_base_nm`
   - `friction_linear_nm_per_krpm`
   - `friction_quadratic_nm_per_krpm2`
   - `overrun_idle_fraction`
   - `overrun_curve_exponent`

7. 通过惯量积分净扭矩
   净扭矩会通过 `inertia_kgm2` 转换成 RPM 变化。
   惯量高会让 RPM 变化更平顺；惯量低则会让 RPM 更敏感。

8. 向传动系混合或锁定
   在混合状态下，引擎 RPM 会通过 `coupling_rate` 和当前耦合因子逐步逼近耦合 RPM。

9. 钳制并发布输出
   RPM 会被钳制到熄火/限制边界内，然后更新 gross 与 net 马力。

这对调校意味着：

- 起步弱但中段正常：先检查起步 RPM 支撑和低转扭矩曲线形状
- 自由轰油后引擎掉转太慢：通常是高转损失与惯量组合太弱
- 接近怠速时掉到怠速以下：通常是怠速控制窗口/增益或 overrun 低转平衡出了问题
- 挂挡松油过于粗暴：优先检查 overrun 项与 `brake_transfer_efficiency`

## 3. 创建自定义车辆包

## 3.1 文件夹布局与发现方式

自定义车辆和赛道一样，会从 `Vehicles` 文件夹下的子文件夹中被发现。游戏会递归搜索，并在每个车辆文件夹中选取找到的第一个 `.tsv` 文件（按文件名排序）。这个文件并不一定非得叫 `vehicle.tsv`；任何 `.tsv` 文件名都可以。

一个简单的目录结构示例如下：

    Vehicles/
      TouringSedan/
        touring_sedan.tsv
        engine.wav
        start.wav
        horn.wav
        crash1.wav
        crash2.wav
        brake.wav
        backfire1.wav
        backfire2.wav

车辆选择菜单会使用文件中的自定义车辆元数据名称（`[meta] name`）作为显示名称。`version` 和 `description` 也会被读取和存储，但菜单项目本身显示的仍然是名称。

## 3.2 严格文件格式规则（非常重要）

新的自定义车辆格式从设计上就是严格格式。它没有针对旧车辆文件的向后兼容模式。

每一个参数都必须写在受支持的部分中。顶层参数会被拒绝；未知部分会被拒绝；未知键会被拒绝；重复部分会被拒绝；同一部分中的重复键也会被拒绝。

错误会携带具体行号并说明问题所在，因此对使用屏幕阅读器的用户来说，它比那种“默默回退”的旧行为更容易调试得多。

格式本身采用“部分内 `key=value`”的写法，注释则以 `;` 或 `#` 开头。

## 3.3 必需与可选部分

解析器支持以下部分：

`[meta]`、`[sounds]`、`[general]`、`[engine]`、`[torque]`、`[engine_rot]`、`[resistance]`、`[torque_curve]`、`[transmission]`、`[drivetrain]`、`[gears]`、`[steering]`、`[tire_model]`、`[dynamics]`、`[dimensions]` 和 `[tires]` 始终都是必需的。`[policy]` 是可选的。

解析器对“键应该属于哪个部分”这件事非常严格。比如 `drag_coefficient` 和 `rolling_resistance` 必须写在 `[resistance]` 中；像 `inertia_kgm2` 这种转动行为相关键，则必须写在 `[engine_rot]` 中。即便键名本身合法，只要放错部分，也同样算错误。

`[transmission_atc]`、`[transmission_dct]` 和 `[transmission_cvt]` 是否必需，则取决于 `supported_types`：

- 如果 `supported_types` 包含 `atc`，那么 `[transmission_atc]` 就是必需的。
- 如果 `supported_types` 包含 `dct`，那么 `[transmission_dct]` 就是必需的。
- 如果 `supported_types` 包含 `cvt`，那么 `[transmission_cvt]` 就是必需的。

如果这些部分存在，但匹配的类型并不在 `supported_types` 中，解析器就会发出一条“该部分未被使用”的警告。

如果某个必需部分缺失，文件将加载失败，并且这台车会被从自定义车辆发现结果中跳过。

## 3.4 示例 `.tsv` 车辆文件（完整分区格式）

下面这个例子使用的是直接值、分组部分，以及一个可选策略部分。它还演示了 `crash` 与 `backfire` 支持的多声音列表。

    ; Example custom vehicle package file for Top Speed
    ; File extension: .tsv (TopSpeedVehicle)

    [meta]
    name=Example Touring Sedan
    version=1.0
    description=Balanced front-engine touring sedan with usable 8-speed overdrive gears.

    [sounds]
    engine=builtin6
    start=builtin1
    stop=stop.wav
    horn=builtin4
    throttle=
    crash=builtin3,crash1.wav,crash2.wav
    brake=brake.wav
    backfire=backfire1.wav,backfire2.wav
    idle_freq=9000
    top_freq=42000
    shift_freq=30000
    pitch_curve_exponent=0.85

    [general]
    surface_traction_factor=0.10
    max_speed=170
    has_wipers=1

    [engine]
    idle_rpm=700
    max_rpm=5600
    rev_limiter=5000
    auto_shift_rpm=4600
    engine_braking=0.35
    mass_kg=1500
    drivetrain_efficiency=0.88
    launch_rpm=1800

    [torque]
    engine_braking_torque=220
    peak_torque=260
    peak_torque_rpm=3800
    idle_torque=110
    redline_torque=220
    power_factor=0.64

    [engine_rot]
    inertia_kgm2=0.24
    coupling_rate=12
    friction_base_nm=20
    friction_linear_nm_per_krpm=0
    friction_quadratic_nm_per_krpm2=0
    idle_control_window_rpm=150
    idle_control_gain_nm_per_rpm=0.08
    min_coupled_rise_idle_rpm_per_s=2200
    min_coupled_rise_full_rpm_per_s=6200
    overrun_idle_fraction=0.35
    overrun_curve_exponent=1.0
    brake_transfer_efficiency=0.68

    [resistance]
    drag_coefficient=0.27
    frontal_area=2.20
    rolling_resistance=0.014
    wheel_side_drag_n=120
    wheel_side_drag_linear_n_per_mps=3.8

    [torque_curve]
    preset=diesel_suv
    1800rpm=240
    3800rpm=260
    5000rpm=220

    [transmission]
    primary_type=atc
    supported_types=atc,manual
    shift_on_demand=1

    [transmission_atc]
    creep_accel_kphps=0.70
    launch_coupling_min=0.22
    launch_coupling_max=0.80
    lock_speed_kph=38
    lock_throttle_min=0.30
    shift_release_coupling=0.38
    engage_rate=3.5
    disengage_rate=6.0

    [drivetrain]
    final_drive=3.20
    reverse_max_speed=35
    reverse_power_factor=0.55
    reverse_gear_ratio=3.20
    brake_strength=1.00

    [gears]
    number_of_gears=8
    gear_ratios=5.20,3.00,1.95,1.45,1.20,1.00,0.95,0.90

    [steering]
    steering_response=1.80
    wheelbase=2.80
    max_steer_deg=32
    high_speed_stability=0.28
    high_speed_steer_gain=0.92
    high_speed_steer_start_kph=150
    high_speed_steer_full_kph=240

    [tire_model]
    tire_grip=0.92
    lateral_grip=1.00
    combined_grip_penalty=0.72
    slip_angle_peak_deg=8.0
    slip_angle_falloff=1.25
    turn_response=1.05
    mass_sensitivity=0.75
    downforce_grip_gain=0.10

    [dynamics]
    corner_stiffness_front=1.05
    corner_stiffness_rear=0.98
    yaw_inertia_scale=1.05
    steering_curve=1.00
    transient_damping=1.10

    [dimensions]
    vehicle_width=1.84
    vehicle_length=4.85

    [tires]
    tire_width=215
    tire_aspect=55
    tire_rim=17
    ; Or provide tire_circumference directly instead of width/aspect/rim.

    [policy]
    top_speed_gear=6
    allow_overdrive_above_game_top_speed=true
    auto_upshift_rpm_fraction=0.88
    auto_downshift_rpm_fraction=0.35
    base_auto_shift_cooldown=0.15
    upshift_delay_default=0.15
    upshift_delay_5_6=0.18
    upshift_delay_6_7=0.24
    upshift_delay_7_8=0.30
    upshift_hysteresis=0.05
    min_upshift_net_accel_mps2=-0.15
    top_speed_pursuit_speed_fraction=0.97
    prefer_intended_top_speed_gear_near_limit=true

在这个例子里，`stop` 是可选的，它指向一个“引擎完全停下后”的关机完成提示音。游戏只会在引擎关闭流程真正结束、RPM 已经降到零时播放它。

## 3.5 声音路径规则与安全规则

自定义车辆的声音路径会被沙箱限制在该自定义车辆文件夹内部。也就是说，普通声音文件路径必须是相对于 `.tsv` 文件所在文件夹（或其子文件夹）的路径。任何试图跳出文件夹的路径，例如 `..\\outside.wav`，都会被拒绝。绝对路径同样会被拒绝。

这条规则之所以重要，是出于安全性和可移植性双重考虑。一个车辆包应当是自包含的，才能被分享给其他玩家之后仍然工作。如果声音路径指向的是你电脑里某个随机文件，那么这台车可能只在你的机器上可用，换到别人那里就会失败。文件夹沙箱正是为了杜绝这类问题。

唯一的例外，是 `builtinN` 这样的内置声音引用，比如 `builtin1`、`builtin6` 等。内置引用之所以被允许，是因为它们不会绕过沙箱，也不会访问用户机器上的路径。对于想先专注于物理调校的作者来说，它们特别适合快速原型开发。

在实践中，一个对新手非常友好的流程是：先完全使用 `builtinN` 声音把车辆搭起来，先把物理调到手感正确，再逐步换成自定义声音文件。这样你就不会在同一时间调试太多系统。

`crash` 和 `backfire` 支持逗号分隔列表。车辆加载时，列表中的所有声音都会被初始化；在运行时触发撞击或回火事件时，游戏会在这些声音之间随机选择。这样可以在不改变任何物理行为的前提下，获得更丰富的变化感。

`stop` 是一个可选的单一声音引用（不是列表）。如果你希望在 RPM 完全衰减结束后听到一个明确的“关机完成”提示，可以使用它。

## 3.6 验证行为与错误消息

自定义车辆解析器之所以被设计得严格，是因为游戏早期版本曾允许很多不现实甚至极端的值进入系统，最终导致车辆极难平衡。新的解析器会同时验证结构和数值范围。

如果文件里有错误，解析器会产出带行号的错误。例如，它可以报告某个键未知、`gear_ratios` 数量与 `number_of_gears` 不匹配，或者 `max_speed` 超出了允许范围。这样一来，你就不必靠猜来定位配置问题。

所谓“带行号”，是指错误会直接指向发现问题的那一行，而不是只给一个非常笼统的失败消息。这一点对大文件尤其有帮助，也让使用屏幕阅读器的用户可以直接跳到问题位置，一次只修一个值。

解析器还会验证参数之间的关系。例如，`rev_limiter` 必须位于 `idle_rpm` 和 `max_rpm` 之间，而 `peak_torque_rpm` 也必须位于 `idle_rpm` 与 `rev_limiter` 之间。`shift_freq` 必须位于 `idle_freq` 和 `top_freq` 之间。`gear_ratios` 必须从 1 挡到最后一挡保持非递增。

变速箱关系也会被验证。`primary_type` 必须存在于 `supported_types` 中；`supported_types` 要么只包含一种类型，要么只包含两种类型，且其中一种必须是 manual，另一种必须是自动家族；一台车只允许出现一种自动家族。对支持的自动类型来说，相应的类型专属部分必须存在；而对未支持的类型来说，多余的专属部分则只会触发警告。

在类型专属部分内部，还会强制做更多一致性检查。例如，`launch_coupling_max` 必须大于或等于 `launch_coupling_min`；而在 CVT 中，`ratio_max` 必须大于或等于 `ratio_min`，`target_rpm_high` 也必须大于或等于 `target_rpm_low`。

对于 `[torque_curve]` 来说，解析器还会执行它自己的规则。你总共至少必须提供两个 RPM 点，无论这些点是直接写出来的，还是通过预设加覆盖得到的。RPM 键必须使用 `NNNNrpm` 格式（例如 `2500rpm=210`），并且 RPM 和扭矩值都会经过范围检查。

这一点很重要，因为许多配置错误本身并不是“坏数字”，而是“数字之间关系不对”。某个值单独看可能完全合法，但和另一个值放在一起就会变成非法。例如，`peak_torque_rpm` 设成 `7000` 本身并不奇怪，但如果 `rev_limiter` 只有 `6500`，它就一定是错的。

这种严格行为并不是为了限制作者，而是为了保护作者不至于构建出无效配置，也为了让游戏物理始终停留在合理、可测试的范围内。

## 3.7 给新手的实用调校工作流

制作一台好用的自定义车辆，最简单的方式，就是先为它明确一个玩法定位。先决定这辆车是慢速新手车、平衡型轿车、速度快但转向困难的超级跑车、厢式车，还是类似摩托那样的高转风格。这个决定能帮助你避免做出一台“意外地所有方面都太强”的车。

第一步，是让车辆先能成功加载并且可以驾驶。必要时直接用内置声音。确认它能启动、能动、能刹车、能换挡。然后，再用 `power_factor`、扭矩、质量、空气阻力、齿比和 `max_speed` 作为参考目标，去调整体加速和最高速区域行为。接着，再针对扭矩曲线去微调“换挡前后手感如何”。在那之后，再分三轮调操控：用 `[steering]` 调指令和速度窗口，用 `[tire_model]` 调抓地预算和打滑形状，用 `[dynamics]` 调瞬态旋转行为。等物理手感都对了，再用 `[policy]` 优化自动换挡。

一定要把手动和自动模式分开测试。手动测试会告诉你：这套动力系统物理上到底能不能拉得动这些挡位。自动测试则会告诉你：策略到底有没有做出正确决策。

当你觉得哪里不对时，一次只动一个大参数。如果你同时改了动力、扭矩、齿比、阻力和转向，那你之后几乎不可能知道究竟是哪一个改动真正修好了问题。

## 4. 参数参考（按部分分组）

## 4.1 `[meta]` 部分

`[meta]` 部分用于描述车辆包本身，以便发现与显示。三个键都是必需的，并且必须是非空文本。

### `name`

这是自定义车辆在车辆菜单中显示的名称。请使用清晰、便于人理解的名字，因为玩家通过菜单系统真正听到的就是它。

由于这是文本，所以没有数值范围，但它不能为空。

### `version`

这是车辆包版本字符串。它当前不会显示在车辆菜单项目文本中，但会被存储，未来可供显示或工具使用。对于管理你车辆包的更新来说，它很有用。

由于这是文本，所以没有数值范围，但它不能为空。

### `description`

这是车辆包的长描述。它目前不会作为菜单标签显示，但会被存储，并对文档记录、未来 UI 改进以及多人协作很有帮助。

由于这是文本，所以没有数值范围，但它不能为空。

## 4.2 `[sounds]` 部分

这个部分控制车辆音频资源以及音高行为。它不会直接改变加速、刹车或操控。不过，Top Speed 是一款高度依赖声音反馈的游戏，所以良好的声音设置对玩法清晰度非常重要。

### `engine`

主引擎声音。必需。它的值可以是车辆文件夹中的相对路径，也可以是 `builtin6` 这样的内置引用。

由于这是声音引用，因此没有数值范围。除非它是 `builtinN` 引用，否则路径必须能在车辆文件夹内安全解析。

对盲人玩家来说，这个声音通常承载了绝大多数车辆个性，因此值得仔细选择。很多时候，一辆车物理已经调对了，但实际玩起来仍觉得“不像那台车”，缺的往往就是引擎声音的音高行为（`idle_freq`、`top_freq`、`shift_freq`）。

### `start`

引擎启动声音。必需。用于车辆启动时。

由于这是声音引用，因此没有数值范围。它的路径安全规则与 `engine` 相同。

### `stop`

可选的引擎停止声音。如果提供，它会在关机真正完成且 RPM 已经降到 `0` 时播放一次。这样作者就能拥有一个明确的“引擎彻底关闭”提示，而不是在玩家下达停止命令那一瞬间就响。

由于这是声音引用，因此没有数值范围。如果省略，就不会播放 stop 声音；如果提供，它同样必须遵循与 `engine` 一样的路径安全规则。

### `horn`

喇叭声音。必需。用于触发喇叭时。

由于这是声音引用，因此没有数值范围。它的路径安全规则与 `engine` 相同。

### `throttle`

可选的额外油门层声音。这个值可以留空。存在时，它能让音色更丰富，但不会改变任何物理行为。

由于这是声音引用，因此没有数值范围。如果你提供了非空值，它就必须成功解析。

对于那些想要更清晰油门感、增压质感，或者进气风格声音的车辆来说，它通常很有用。如果你的车辆本身已经够热闹，那留空也完全没问题。

### `crash`

撞击声音，或撞击声音列表。这个键是必需的。你可以提供一个声音，也可以提供一个逗号分隔的列表。如果提供多个声音，车辆加载时会全部初始化，而在运行时每次发生撞击事件时，游戏会随机选一个播放。

由于这是声音引用或引用列表，因此没有数值范围。每一个条目都必须合法，并遵循与 `engine` 相同的路径安全规则。`builtinN` 条目同样允许。

### `brake`

刹车声音。必需。用于刹车反馈以及相关轮胎/制动音效提示。

由于这是声音引用，因此没有数值范围。它的路径安全规则与 `engine` 相同。

### `backfire`

可选的回火声音，或回火声音列表。如果你提供的是逗号分隔列表，游戏会在回火事件发生时随机从中选取一个声音播放。

由于这是声音引用或引用列表，因此没有数值范围。如果你提供了条目，则每个条目都必须能成功解析，并遵循路径安全规则。

### `idle_freq`

低引擎音高频率锚点。它决定引擎声音在低速和怠速附近条件下会被如何升降调。

允许范围是 100 到 200000。

它不会改变物理，但会强烈影响车辆在低速时听起来是“悠闲”还是“很忙”。如果它设得太高，车辆在低速时可能会显得不自然地一直很亢奋；如果设得太低，引擎则可能显得沉闷、过深。

### `top_freq`

高引擎音高频率锚点。它决定引擎声音在 RPM/速度范围上段会被如何升调。

允许范围是 100 到 200000，并且它必须大于或等于 `idle_freq`。

它不会改变物理，但会强烈影响引擎给人的性格印象。很高的 `top_freq` 会让车辆听起来更尖锐、高转、更激进；较低的 `top_freq` 则会让它显得更重、更不运动。

### `shift_freq`

中间音频频率锚点，用于引擎音高映射与换挡相关的声音行为。

允许范围是 100 到 200000，并且它必须位于 `idle_freq` 与 `top_freq` 之间。

它不会改变加速或最高速，但如果设得不好，会让车辆听起来不一致或很假。对新手来说，一个简单规则是：先把它放在前两个值之间，并且让它符合这台车的角色，再在真实换挡过程中用耳朵慢慢调整。

### `pitch_curve_exponent`

用于把 RPM 映射成引擎音高的曲线指数。

允许范围是 0.5 到 1.5。省略时，默认值为 `0.85`。

`1.0` 表示在归一化 RPM 上使用线性映射。小于 `1.0` 时，会让音高在较低 RPM 就更早升起来（显得前段更激进）；大于 `1.0` 时，则会让音高的明显上升推迟到更后面的 RPM。

## 4.3 `[general]` 部分

`[general]` 部分包含那些更偏向整体玩法、但又不适合归入引擎或操控组的通用参数。

### `surface_traction_factor`

这是表面交互逻辑中使用的基础路面抓地系数。

允许范围是 0.0 到 5.0。

这个值必须直接填写，不要再乘以 100。例如，应写 `0.10`，而不是 `10`。

在当前物理模型下，它通常不是日常抓地手感最有力的主调节项。真正想显著改变抓地与操控手感时，`tire_grip` 和 `lateral_grip` 往往更重要。

### `max_speed`

这是以 km/h 表示的前进参考速度，用于玩法层和自动最高速策略行为。

允许范围是 10 到 500。

在当前模型中，它并不是绝对的硬上限。它主要作为最高速行为与变速箱策略的参考值，而前进速度安全则由另一个独立的内部上限控制（`min(max_speed * 1.5, 550)` km/h）。

对新手来说，你应把它理解为“玩法目标速度”，而不是“现实承诺”。现实中的某辆车也许能跑得更快，但你完全可以为了游戏平衡有意把 `max_speed` 设低一些，同时仍然通过扭矩、齿比、声音和操控把它的个性保留下来。

### `has_wipers`

这是一个类布尔标志，用于控制雨刷行为以及相关天气音效行为。

这个键会被当成布尔整数（`0` 或 `1`）来解析。

除这点之外，它没有别的数值调校范围，也不会影响物理。

但它仍然值得认真设置，因为在这种以音频为核心的游戏里，天气反馈非常重要。普通轿车或厢式车通常会用 `1`；很多摩托车、敞开式车辆或者根本没有雨刷的载具，则可能更适合 `0`。

## 4.4 `[engine]` 部分

`[engine]` 部分包含核心 RPM 范围，以及质量/效率等核心值。扭矩形状定义在 `[torque]` 和 `[torque_curve]` 中。旋转运行时控制在 `[engine_rot]` 中，而阻力/滑行控制在 `[resistance]` 中。

运行时交互概要：

- `[engine]` 设定 RPM 边界和整车的能量语境（`mass_kg`、`drivetrain_efficiency`）
- `[torque]` 与 `[torque_curve]` 定义各 RPM 下可用的 gross 引擎扭矩
- `[engine_rot]` 控制 RPM 朝目标状态变化的速度，以及松油/怠速损失如何施加
- `[resistance]` 控制对车辆运动形成对抗的外部道路/空气负载

如果行为看起来前后不一致，请按这个顺序调：

1. 先在 `[engine]` 中修正 RPM 范围是否正确（`idle_rpm`、`rev_limiter`）
2. 再在 `[torque]` 与 `[torque_curve]` 中修正扭矩形状
3. 再在 `[engine_rot]` 中修正 RPM 过渡与衰减行为
4. 最后才在 `[resistance]` 中为不同速度域做平衡

这样做可以避免你用阻力类“补丁”去掩盖真正的引擎曲线问题。

### `idle_rpm`

引擎怠速 RPM 基线。

允许范围是 300 到 3000。

这个值会影响 RPM 范围下限、扭矩曲线计算，以及某些按比例写法的策略阈值如何换算成绝对 RPM。提高它，会改变某些策略阈值的实际含义，也会改变低速手感。

### `max_rpm`

用于引擎模型 RPM 处理与报告的最大 RPM 上限。

允许范围是 1000 到 20000，并且它必须大于或等于 `idle_rpm`。

它并不等同于 `rev_limiter`。`max_rpm` 是整体天花板，而 `rev_limiter` 才是决定动力与换挡行为的主要可用上限。

### `rev_limiter`

这是引擎可用高转上限，用于动力输出与挡位拉伸行为。

允许范围是 800 到 18000，并且必须位于 `idle_rpm` 和 `max_rpm` 之间。

较低的值会让每个挡更短，可能更容易把高挡拉到可用区，但也会减少灵活性。较高的值会让每个挡更长，但前提是你的扭矩曲线在高 RPM 区域仍然够强。

### `auto_shift_rpm`

自动换挡偏好的 RPM 锚点。

允许范围是 0 到 18000。它必须为 `0`，或者位于 `idle_rpm` 和 `rev_limiter` 之间。

值为 `0` 时，代表策略/默认逻辑会从其他值中自行推导行为。填写真实值，则会给自动换挡一个直接目标，同时也会在策略推导默认行为时作为参考。

### `engine_braking`

引擎制动强度乘数。

允许范围是 0.0 到 1.5。

它影响的是松油减速，而不是主动按下刹车按钮时的制动效果。设得太高，会让车辆在玩家松油时显得不自然地拖拽。

### `mass_kg`

车辆质量，单位千克。

允许范围是 20 到 10000。

质量越高，在同样净力下加速度越低，车辆通常也会显得更稳、更重；质量越低，则响应与加速都会更积极。质量还会间接影响部分操控手感。

### `drivetrain_efficiency`

表示动力总成内部传输损耗的效率乘数。

允许范围是 0.1 到 1.0。

值越高，能传到车轮的扭矩越多；值越低，则加速和引擎制动传递都会减弱。这是一个有用参数，但通常不是平衡玩法时最优先动的那个旋钮。

### `launch_rpm`

低速加油时的起步 RPM 支撑底线。

允许范围是 0 到 18000，并且不得超过 `rev_limiter`。

较高的值可以让起步更有劲、减少闷车；较低的值则能让起步显得更克制。

## 4.4.1 `[torque]` 部分

`[torque]` 部分包含引擎扭矩形状与整体动力缩放控制。旋转动态相关键请参见 `[engine_rot]`。

### `engine_braking_torque`

基础引擎制动扭矩，单位牛·米。

允许范围是 0 到 3000。

它会与 `engine_braking` 一起决定松油减速行为。如果松油减速不对，这两个值通常需要一起看。

### `peak_torque`

峰值引擎扭矩，单位牛·米。

允许范围是 10 到 3000。

它是最主要的加速参数之一。值越大，通常越会增强车辆在大部分速度范围内的加速，尤其是引擎经常待在 `peak_torque_rpm` 附近时。

### `peak_torque_rpm`

峰值扭矩出现时的 RPM。

允许范围是 500 到 18000，并且它必须位于 `idle_rpm` 和 `rev_limiter` 之间。

较低的值会改善中段和升挡恢复；较高的值则会塑造更高转的性格，并且如果升挡落点太低，还会让长齿比挡位更难拉动。

### `idle_torque`

接近怠速时的扭矩。

允许范围是 0 到 3000。

较高的值会改善起步与低 RPM 响应；但若设得太高，则可能让车辆在高挡低转时显得不现实地有力。

### `redline_torque`

接近转速限制器时的扭矩。

允许范围是 0 到 3000。

这是控制高挡拉力最精准的手段之一。降低它，可以在不明显影响低速起步的前提下抑制高挡加速；提高它，则会让引擎在高 RPM 下仍然继续拉。

### `power_factor`

用于油门驱动加速计算的全局动力缩放乘数。

允许范围是 0.05 到 2.0。

这是整个格式里最适合做玩法平衡控制的参数之一。它能让你在不完全重做扭矩曲线的情况下，直接调整整体加速。如果一辆车太强，降低 `power_factor` 往往是最干净的第一步。

## 4.4.2 `[torque_curve]` 部分

`[torque_curve]` 部分按 RPM 定义显式扭矩点，并且可以选择一个基础预设。这个部分是必需的。

### `preset`

这是一个可选的命名基础形状，会在任何显式 RPM 点之前先被加载。

允许的值有：

- `city_compact`
- `family_sedan`
- `sport_sedan`
- `sport_coupe`
- `grand_tourer`
- `hot_hatch`
- `muscle_v8`
- `supercar_na`
- `supercar_turbo`
- `rally_turbo`
- `diesel_suv`
- `diesel_truck`
- `supersport_bike`
- `naked_bike`

当你想快速获得一个稳定基线，然后只在少量 RPM 点上做车辆特征修正时，它非常有用。

### `NNNNrpm`

使用类似 `2000rpm=220` 这样的键，为特定 RPM 定义扭矩点。

RPM 键的范围是 300 到 25000；扭矩值范围是 0 到 5000 Nm。

你最终必须在 `[torque_curve]` 中拥有至少两个总点。如果你只用了 `preset`，这个要求由预设内部点自动满足；如果你没用预设，那么你就必须至少手写两条 RPM 行。

当预设和显式点同时存在时，显式点会覆盖相同 RPM 的预设点；如果该 RPM 预设原本没有点，则显式点会被新增进去。

## 4.4.3 `[transmission]` 部分

`[transmission]` 部分定义这台车可用的变速箱家族，以及默认启动时使用哪一种。

### `primary_type`

车辆默认激活的变速箱类型。

允许值为 `atc`、`cvt`、`dct`、`manual`。

这个值也必须同时出现在 `supported_types` 中。

### `supported_types`

支持的变速箱类型列表，使用逗号分隔。

允许的标记是 `atc`、`cvt`、`dct`、`manual`。

验证规则如下：

- 至少需要一种类型。
- 最多允许两种类型。
- 如果提供两种类型，那就必须恰好是一种 manual 加上一种自动家族类型。
- 一台车只允许出现一个自动家族。
- 重复类型会被拒绝。

如果 `supported_types` 中包含某种自动家族，那么对应的类型专属部分就会变成必需项：

- `atc` 需要 `[transmission_atc]`
- `dct` 需要 `[transmission_dct]`
- `cvt` 需要 `[transmission_cvt]`

### `shift_on_demand`

这是一个可选的类布尔键（`true`/`false` 或 `0`/`1`），用于在自动家族激活时允许玩家手动上/下挡。

省略时默认值为 `false`。

当这个功能在游戏中开启并处于激活状态时，自动升挡/降挡策略会被绕过，直到玩家关闭按需换挡为止。如果 `supported_types` 中根本没有自动家族，那么这个键虽然会被接受，但会被忽略，同时解析器还会发出警告。

## 4.4.4 `[transmission_atc]` 部分

ATC（自动液力变矩器风格）传动耦合参数。当 `supported_types` 包含 `atc` 时，这个部分是必需的。

### `creep_accel_kphps`

低速 creep 加速度，单位 km/h 每秒。它在油门接近零且未踩刹车时生效。

允许范围是 0.0 到 12.0。

### `launch_coupling_min`

在起步速度区域、零油门条件下使用的最小耦合因子。

允许范围是 0.0 到 1.0。

### `launch_coupling_max`

在起步速度区域、全油门条件下使用的最大耦合因子。

允许范围是 0.0 到 1.0，并且它必须大于或等于 `launch_coupling_min`。

### `lock_speed_kph`

ATC 允许请求完全锁止耦合的速度阈值。

允许范围是 2.0 到 300.0。

### `lock_throttle_min`

在达到锁止速度之后，ATC 请求完全锁止所需的最小油门。

允许范围是 0.0 到 1.0。

### `shift_release_coupling`

换挡进行中时所使用的耦合目标。

允许范围是 0.0 到 1.0。

### `engage_rate`

耦合朝目标增加时的速率限制。

允许范围是 0.1 到 80.0。

### `disengage_rate`

耦合朝目标降低时的速率限制。

允许范围是 0.1 到 80.0。

ATC 说明：ATC 可以 creep，并且在达到硬锁条件前，会先经过一段受控的预锁耦合阶段。在运行时中，硬锁依然要满足车速/油门/耦合/滑差条件，以避免 RPM 行为太突兀。

## 4.4.5 `[transmission_dct]` 部分

DCT（双离合自动）传动耦合参数。当 `supported_types` 包含 `dct` 时，这个部分是必需的。

### `launch_coupling_min`

在起步速度区域、零油门条件下使用的最小耦合因子。

允许范围是 0.0 到 1.0。

### `launch_coupling_max`

在起步速度区域、全油门条件下使用的最大耦合因子。

允许范围是 0.0 到 1.0，并且它必须大于或等于 `launch_coupling_min`。

### `lock_speed_kph`

DCT 允许请求完全锁止耦合的速度阈值。

允许范围是 2.0 到 300.0。

### `lock_throttle_min`

在达到锁止速度之后，DCT 请求完全锁止所需的最小油门。

允许范围是 0.0 到 1.0。

### `shift_overlap_coupling`

换挡过程中用于模拟重叠行为的耦合目标。

允许范围是 0.0 到 1.0。

### `engage_rate`

耦合朝目标增加时的速率限制。

允许范围是 0.1 到 80.0。

### `disengage_rate`

耦合朝目标降低时的速率限制。

允许范围是 0.1 到 80.0。

DCT 说明：在当前模型中，DCT 没有自动 creep，并且它在低速下通常会比 ATC 更直接。

## 4.4.6 `[transmission_cvt]` 部分

CVT 的传动系与比率控制参数。当 `supported_types` 包含 `cvt` 时，这个部分是必需的。

### `ratio_min`

CVT 的最小有效传动比。

允许范围是 0.1 到 8.0。

### `ratio_max`

CVT 的最大有效传动比。

允许范围是 0.2 到 10.0，并且它必须大于或等于 `ratio_min`。

### `target_rpm_low`

CVT 目标 RPM 带的下限。

允许范围是 `idle_rpm` 到 `rev_limiter`。

### `target_rpm_high`

CVT 目标 RPM 带的上限。

允许范围是 `idle_rpm` 到 `rev_limiter`，并且它必须大于或等于 `target_rpm_low`。

### `ratio_change_rate`

CVT 比率朝目标比率变化的速度。

允许范围是 0.1 到 20.0。

### `launch_coupling_min`

在起步速度区域、零油门条件下使用的最小耦合因子。

允许范围是 0.0 到 1.0。

### `launch_coupling_max`

在起步速度区域、全油门条件下使用的最大耦合因子。

允许范围是 0.0 到 1.0，并且它必须大于或等于 `launch_coupling_min`。

### `lock_speed_kph`

CVT 允许请求完全锁止耦合的速度阈值。

允许范围是 2.0 到 300.0。

### `lock_throttle_min`

在达到锁止速度之后，CVT 请求完全锁止所需的最小油门。

允许范围是 0.0 到 1.0。

### `creep_accel_kphps`

低速 creep 加速度，单位 km/h 每秒，在油门接近零且未踩刹车时生效。

允许范围是 0.0 到 12.0。

### `shift_hold_coupling`

在换挡/过渡期间使用的耦合目标。

允许范围是 0.0 到 1.0。

### `engage_rate`

耦合朝目标增加时的速率限制。

允许范围是 0.1 到 80.0。

### `disengage_rate`

耦合朝目标降低时的速率限制。

允许范围是 0.1 到 80.0。

CVT 说明：CVT 会在 `[ratio_min, ratio_max]` 窗口内动态选择比率，以便在给定油门需求下尽量把引擎 RPM 保持在目标带内。

## 4.5 `[drivetrain]` 部分

`[drivetrain]` 部分包含那些不属于引擎扭矩曲线本身的齿比和制动控制。

### `final_drive`

作用于所有前进挡的主减速比。

允许范围是 0.5 到 8.0。

它是最强大的调校控制之一，因为它会改变每个前进挡的有效传动比。提高它会让所有挡都更短，通常会增强拉力；降低它会让所有挡都更长，并可能削弱加速，或让高挡变得更难用。

正因为它会影响所有挡位，所以 `final_drive` 往往是让车辆整体朝正确方向移动的最快手段，但它也很容易顺手引入副作用。一个能修复 7 挡发软的问题的改动，也可能让 1 挡和 2 挡过于激进；一个能平缓起步的改动，也可能让最高速挡根本拉不动。

对新手来说，一个实用规则是：用 `final_drive` 做大方向调整，用 `gear_ratios` 做精修。如果整辆车都感觉太短或太长，就改 `final_drive`；如果只是某一两个挡位不对，那就改齿比列表。

### `reverse_max_speed`

倒车最高速度，单位 km/h。

允许范围是 1 到 100。

游戏会把倒车速度和前进速度分开钳制，所以你能直接控制车辆倒车能有多快。

### `reverse_power_factor`

倒车加速缩放乘数。

允许范围是 0.05 到 2.0。

这是一个偏玩法调校值。大多数车辆在倒车时都应该使用低于前进动力的数值，这样倒车行为会更易控制。

### `reverse_gear_ratio`

倒挡传动比。

允许范围是 0.5 到 8.0。

它会和 `final_drive` 以及 `reverse_power_factor` 一起，共同影响倒车时的 RPM 和扭矩放大。

### `brake_strength`

在按下刹车输入时使用的主动制动强度乘数。

允许范围是 0.1 到 5.0。

它会与抓地力和路面行为一起工作。如果按下刹车时显得刹不住，就提高它；如果刹车太暴躁、很难控制，就降低它。

## 4.6 `[gears]` 部分

这个部分定义前进挡数量以及精确的齿比列表。两个键都是必需的。

### `number_of_gears`

前进挡数量。

允许范围是 1 到 10。

这个值必须与 `gear_ratios` 中的条目数量完全一致。如果不一致，解析器会直接硬失败。

### `gear_ratios`

一个使用逗号分隔的前进挡传动比列表，按从 1 挡到最后一挡的顺序填写。

这个键是必需的。自定义车辆格式中没有后备值，也没有自动生成。

每一个单独的传动比都必须位于 0.20 到 8.00 之间。整个列表必须是非递增的，也就是说，越往后的挡位比率必须与前一个相同或更低。

值越高，挡位越短、扭矩放大越强；值越低，挡位越长、相同车速下 RPM 越低，拉力也越弱。齿比永远会与 `final_drive` 一起作用，因此这两者应当共同调。

对新手来说，你可以把齿比列表理解为“加速体验的形状”。前几个挡控制起步和低速反应；中间挡控制正常驾驶和比赛中最常见的再加速手感；后几个挡则控制高车速拉力以及 overdrive 行为。

如果某次升挡导致引擎掉进了一个很弱的 RPM 区域，那么问题可能是：下一挡太长、上一挡太短、主减速比太低，或者扭矩曲线根本不支撑这个 RPM。修复方法并不总是“只改那一个挡位的齿比”。记得始终连同它前后相邻的挡位一起测试。

## 4.7 `[steering]` 部分

`[steering]` 部分控制的是“转向指令如何生成”以及“它在不同速度下如何被处理”，这些都发生在真正施加轮胎力和偏航动态之前。

### `steering_response`

转向强度乘数。

允许范围是 0.1 到 5.0。

它是最重要的一阶操控调节项之一。提高它，会在整个速度范围内增加转向权重；降低它，则会让转向显得更平和、不那么立刻。

如果你觉得车辆在低速和中速下都转不过去，这通常是你最先该提高的值；如果你觉得它在所有速度下都太神经，也应该先从降低它开始，而不是一上来就动更复杂的参数。

### `high_speed_stability`

高速下的稳定性阻尼因子，用于约束横向响应。

允许范围是 0.0 到 1.0。

值越高，车辆在高速下越稳定、越不容易神经质，尤其是当抓地高、轴距短时更明显。设得过高，则会让车辆在高速弯中显得不愿意转进去。

这个值不应该被当成“万能修车方向盘”的替代品。它最适合被用作“速度域稳定器”，而不是一个用来总修一切转向问题的旋钮。

### `high_speed_steer_gain`

叠加在内置高速衰减之上的高速转向增益。

允许范围是 0.7 到 1.6。

在当前共享模型中，速度升高时，转向会先被衰减。`high_speed_steer_gain` 并不会取消这层衰减，它只是在衰减后的结果上做一个有限的增减。

实操上，这意味着即使你把它设得相对高，结果也仍然是受控的。大多数更真实的调校，通常会落在 `0.85` 到 `0.98` 之间，而更多高速控制应交给 `high_speed_stability`、轮胎抓地和动态参数去完成。

### `high_speed_steer_start_kph`

高速转向衰减和增益混合开始生效的速度。

允许范围是 60 到 260。

低于这个速度时，高速衰减不会生效。这个起始值越低，高速行为就会更早在日常驾驶中出现。

### `high_speed_steer_full_kph`

高速衰减和增益混合完全生效的速度。

允许范围是 100 到 350，并且它必须大于 `high_speed_steer_start_kph`。

在起始速度和完全速度之间，游戏会把基础转向平滑过渡到高速转向缩放结果。窗口越窄，变化越快；窗口越宽，变化越渐进。

### `wheelbase`

轴距，单位米。

允许范围是 0.3 到 8.0。

较短的轴距通常会显得更灵活、更愿意转；较长的轴距通常会显得更平稳、不那么敏捷。它会和 `steering_response`、`max_steer_deg` 以及前后轮侧偏刚度平衡强烈联动。

对新手来说，轴距最容易被误解，因为它看起来不像一个直接的“多转一点/少转一点”旋钮。它真正改变的是：同样的转向角会如何弯出不同的路径。所以它改变的是转向性格，而不仅仅是转向量。

### `max_steer_deg`

最大转向角，单位度。

允许范围是 5 到 60。

这是最直接的操控控制之一。较低的值适合限制高速车辆的灵活度；较高的值能提升低速可操控性，但如果抓地和稳定性也很高，就容易让车辆过于敏感。

## 4.8 `[tire_model]` 部分

`[tire_model]` 部分控制抓地预算如何分配、侧偏角形状，以及质量/空气动力对抓地的影响。这些值定义的是稳定状态下的过弯行为，以及在转向时还能剩下多少纵向抓地力。

### `tire_grip`

基础轮胎抓地系数，用于牵引和刹车，也会影响整体抓地行为。

允许范围是 0.1 到 3.0。

它主要影响加速抓地和制动抓地，同时也会参与整体的组合抓地行为。如果车辆容易空转，或者刹车时抓不住地，它就是一个首要参数。

### `lateral_grip`

用于转弯行为的额外横向抓地调校值。

允许范围是 0.1 到 3.0。

这是最主要的过弯抓地标量。提高它，会让车辆更能“挂住”弯；降低它，则会让车辆更偏滑、更偏漂。如果转向手感太弱，但直线抓地却没问题，那么你应先调它，而不是先动扭矩。

### `combined_grip_penalty`

横向需求对纵向抓地削减得有多强。

允许范围是 0.0 到 1.0。

值越高，转弯与加速/刹车之间的取舍越明显；值越低，则允许车辆在转弯时仍然保留更多加速能力。这是一个很关键的“真实感 vs 偏街机感”平衡控制。

### `slip_angle_peak_deg`

简化轮胎响应中，侧偏角峰值所对应的角度（度）。

允许范围是 0.5 到 20.0。

较低的值会更早达到峰值，手感会更尖锐，但也更不宽容；较高的值则会让滑移建立得更渐进，通常更容易控制。

### `slip_angle_falloff`

在超过峰值侧偏角之后，力的衰减尺度。

允许范围是 0.01 到 5.0。

值越高，超过峰值之后轮胎力掉得越快，也就意味着过度转向输入会被惩罚得更狠；值越低，则会在过峰之后保留更多力，手感也更宽容。

### `turn_response`

横向响应时间缩放。

允许范围是 0.2 到 2.5。

它会缩放横向输出跟随转向/横向状态的速度。值低时，手感会显得迟滞或发重；值高时，手感会显得非常直接，但如果阻尼太低，也会变得过于神经质。

### `mass_sensitivity`

车辆质量对转向灵活度的影响程度。

允许范围是 0.0 到 1.0。

值越高，重车失去灵活性的程度就越明显，而轻车则更能保留响应性；值越低，不同质量类别之间的灵活度差异就会被缩小。

### `downforce_grip_gain`

随速度提升而增加抓地的系数。

允许范围是 0.0 到 1.0。

较高的值会在高速下带来更多抓地，这对高性能类别很有帮助；但如果再叠加很高的 `high_speed_steer_gain`，就可能让高速表现过于强势。

如果高速过弯太强，通常应该先降低这个值，或降低高速转向增益，而不是先去动低速转向。

## 4.9 `[dynamics]` 部分

`[dynamics]` 部分控制的是瞬态行为：偏航是如何建立的、转向输入如何被塑形，以及前后轴的侧向权重如何平衡。这些值都是必需的。

### `corner_stiffness_front`

前轴侧偏刚度缩放值。

允许范围是 0.2 到 3.0。

值越高，前轴横向力建立得越快，通常也越能强化入弯响应。设得过高，则可能让前端 bite 过头，显得突兀。

这里相对平衡比绝对值更重要。前轴略高于后轴，通常意味着更稳定的入弯，以及在极限处更偏轻微转向不足。

### `corner_stiffness_rear`

后轴侧偏刚度缩放值。

允许范围是 0.2 到 3.0。

值越高，后轴横向权重越强，也就越容易帮助车辆旋转。若相对前轴过高，则会制造出更难挽回的过度转向倾向。

对安全基线来说，后轴通常应略低于前轴；如果你想让车辆更愿意转，则可以很小心地缩小这两者之间的差距。

### `yaw_inertia_scale`

作用于旋转响应的偏航惯性乘数。

允许范围是 0.5 到 2.0。

值越高，偏航建立和变化都会更慢，因此手感更重、更稳；值越低，偏航变化会更快，因此手感更敏捷，但也更容易变得神经质。

这个参数对类别身份尤其重要。摩托和轻量车辆通常应该低于重型卡车和大型厢车。

### `steering_curve`

用于塑造转向输入的指数。

允许范围是 0.5 到 2.0。

小于 `1.0` 时，小幅输入就会显得更强，轻点一下就很有反应；大于 `1.0` 时，小幅输入会显得更柔和，把更多权重留给大角度转向。

如果玩家抱怨“轻轻一碰方向就太夸张”，那就略微提高它；如果玩家抱怨“小动作完全没反应”，那就略微降低它。

### `transient_damping`

横向/偏航瞬态阻尼因子。

允许范围是 0.0 到 6.0。

值越高，越能抑制振荡，也越能减少转向变化后的过冲；值越低，车辆就会更自由、更容易立刻转起来。

如果车辆在你回正方向之后还持续在转，就应提高它；如果车辆显得转不进去、或者“黏住了”，就小心地降低它，并且和 `turn_response` 一起复测。

## 4.10 `[dimensions]` 部分

`[dimensions]` 部分定义的是影响空间表现和表征的物理尺寸。

### `vehicle_width`

车辆宽度，单位米。

允许范围是 0.2 到 5.0。

它影响的是空间/音频定位和车辆体型感，而不会直接影响引擎动力或最高速。

虽然它不是动力参数，但在音频游戏中依然很重要。宽度会影响空间存在感，以及车辆相对于车道、周围交通和障碍物听起来到底有多宽。

### `vehicle_length`

车辆长度，单位米。

允许范围是 0.3 到 20.0。

它同样主要影响空间表现与存在感，而不是直接影响加速物理。

对新手来说，即便你并不打算追求完美写实，也最好让它大致符合你所创作车辆类型的真实体型。如果长度设得离谱地太短或太长，那么就算引擎和操控都调对了，这辆车在空间上也会显得“听起来不对”。

## 4.11 `[tires]` 部分

`[tires]` 部分要么直接定义轮胎周长，要么提供用于推算轮胎周长的三元尺寸组合。

你必须提供以下两种方案之一：

- 一个合法的 `tire_circumference`
- 或者同时提供 `tire_width`、`tire_aspect` 和 `tire_rim`

如果这两种形式都不完整，或者无效，解析器会直接硬失败。

### `tire_circumference`

轮胎周长，单位米。

如果提供，并且大于零，就会被直接使用。允许范围是 0.2 到 5.0 米。

这个值会影响速度与 RPM 之间的映射关系。轮胎周长错了，即使其他参数都没问题，齿比和 RPM 行为看起来也会完全不对。

它其实是最容易制造“隐形调校问题”的元凶之一。如果轮胎周长太小，那么在同样车速下，引擎 RPM 就会比预期高，看起来就像齿比比实际更短；如果它太大，则 RPM 会显得偏低，挡位就会像被拉长了一样。

### `tire_width`

轮胎宽度，单位毫米。当未直接提供周长时，用于参与周长推算。

允许范围是 20 到 450。

它只在“用轮胎尺寸三元组推算周长”时才会被使用。在当前自定义格式中，它并不是直接的抓地参数。真正影响操控的，应使用 `tire_grip` 和 `lateral_grip`。

### `tire_aspect`

轮胎扁平比（胎壁高度占胎宽的百分比），当未直接提供周长时，用于参与周长推算。

允许范围是 5 到 150。

它同样只用于周长推算，并不是一个直接的操控抓地旋钮。

### `tire_rim`

轮辋直径，单位英寸。当未直接提供周长时，用于参与周长推算。

允许范围是 4 到 30。

它同样只用于周长推算。如果你已经知道轮胎周长，那么直接填写 `tire_circumference` 通常更简单，也更不容易出错。

如果你提供的是三元尺寸组合，游戏会在验证通过后自动计算轮胎周长。

## 4.12 `[policy]` 部分（可选，仅自动变速箱）

`[policy]` 部分控制自动换挡行为。它不会直接改变引擎动力、抓地或空气阻力。你应该在车辆“物理上已经能拉动你希望使用的挡位”之后，再来调整策略。

解析器既支持普通策略键，也支持通配型的延迟键，比如 `upshift_delay_6_7` 和 `upshift_delay_g6`。

### `top_speed_gear`

这表示“车辆应当在哪个前进挡中到达游戏世界里的最高速”。

允许范围是 1 到 `number_of_gears`。

对于 7 挡或 8 挡、并且带 overdrive 的车辆来说，这个值尤其重要。它会告诉自动模式：哪一个挡位才应该被视为主要的“最高速挡”。

例如，一台 8 挡车可能被设计成在 6 挡达到游戏内最高速，而 7 挡和 8 挡只是更平静的巡航/超速挡。在策略中明确声明这一意图，能帮助自动模式避免过早进入这些高挡。

### `allow_overdrive_above_game_top_speed`

这是一个布尔策略标志，用于决定在接近或超过最高速区域时，是否允许使用 `top_speed_gear` 以上的挡位。

由于它是布尔值，所以没有数值范围。请使用 `true` 或 `false`。

如果它为 `true`，自动模式在合适时可以把更高挡当作 overdrive 来使用；如果为 `false`，自动模式在追求最高速时会尽量避开这些挡位。

它本身并不会让 overdrive 挡位在物理上就“变得可用”。它只是改变自动模式是否被允许去选它。如果这些 overdrive 挡在手动模式下仍然完全拉不动，那就应先修扭矩、阻力或齿比。

### `base_auto_shift_cooldown`

基础自动换挡冷却时间，单位秒。

允许范围是 0.0 到 2.0。

值越高，自动模式会越冷静，不容易频繁换挡；设得太高，则会让变速箱显得反应迟钝。

这是一个很好的第一手自动行为调节项，因为它能改善稳定性，却不会改变底层动力总成本身。如果自动模式表现得神经兮兮、来回抖挡，那么你可以先略微提高它，再去碰其他更复杂的策略参数。

### `upshift_delay_default`

默认自动升挡延迟，单位秒。

允许范围是 0.0 到 2.0。

如果你想先让所有升挡整体变慢，而不是立刻对高挡单独指定延迟，那么它会很有用。

### `upshift_delay_X_Y`

针对特定“相邻升挡”的单独升挡延迟，单位秒。

允许范围是 0.0 到 2.0。

比如 `upshift_delay_5_6=0.18` 或 `upshift_delay_6_7=0.24`。这是让高挡升挡更慢、而又不影响低挡的最佳方式。

### `upshift_delay_gX`

按“源挡位”简写的升挡延迟，单位秒。

允许范围是 0.0 到 2.0。

例如，`upshift_delay_g6=0.24` 表示所有从 6 挡升出去的换挡都会使用这条延迟。若你需要完全精确的行为，请优先使用更具体的 `upshift_delay_X_Y` 形式。

### `auto_upshift_rpm_fraction`

自动升挡阈值，写成“从怠速到 limiter 这段 RPM 跨度中的比例”。

允许范围是 0.05 到 1.0。

它的好处是：即便你以后又修改了 `idle_rpm` 或 `rev_limiter`，它仍然能保持一个相对稳定的语义。

### `auto_upshift_rpm`

自动升挡阈值，直接使用绝对 RPM。

允许范围是 0 到验证所允许的车辆 RPM 极限。实践上，它要么是 `0`，要么必须位于 `idle_rpm` 和 `rev_limiter` 之间。

只要它存在，它就会覆盖按比例写法的升挡阈值。

### `auto_downshift_rpm_fraction`

自动降挡阈值，写成“从怠速到 limiter 这段 RPM 跨度中的比例”。

允许范围是 0.05 到 0.95。

较高的值会让变速箱更积极地降挡；较低的值则会让它更久地停留在高挡。

### `auto_downshift_rpm`

自动降挡阈值，直接使用绝对 RPM。

允许范围是 0，或者一个位于 `idle_rpm` 与 `rev_limiter` 之间的合法 RPM。

只要它存在，它就会覆盖按比例写法的降挡阈值。

### `top_speed_pursuit_speed_fraction`

自动逻辑判断“车辆已经接近最高速区域”的阈值，写成相对于游戏 `max_speed` 参考速度的比例。

允许范围是 0.50 到 1.20。

小于 `1.0` 的值会让策略在车辆真正达到 `max_speed` 参考目标之前，就开始进入最高速行为。这对于接近极限车速时维持高挡稳定性很有帮助。

### `upshift_hysteresis`

自动升挡决策额外使用的迟滞量。

允许范围是 0.0 到 2.0。

较高的值会减少 hunting，但也可能让好的升挡变慢；较低的值则会让换挡更灵敏，但也更容易来回振荡。

### `min_upshift_net_accel_mps2`

只有当下一挡的净加速度不低于这个值时，升挡才被允许；除非最高速追逐逻辑另有决定。

允许范围是 -20.0 到 20.0。

这是一个对高挡非常重要的“防闷车”保护项。它可以防止自动模式把车升进一个会立刻减速、或几乎完全没劲的挡位。

对新手来说，精确单位（`m/s²`）并不是最重要的。更值得记住的是它的效果：这就是一条“如果下一挡太弱，就不要升进去”的规则。如果你的自动模式总是太早进高挡，然后整台车就像没劲了一样，这个值通常是最值得优先复查的策略参数之一。

### `prefer_intended_top_speed_gear_near_limit`

一个布尔策略标志，表示在接近速度极限区域时，是否优先使用预期的最高速挡。

由于它是布尔值，所以没有数值范围。请使用 `true` 或 `false`。

启用后，自动模式会尽量停留在或低于预期最高速挡，直到使用 overdrive 挡位真正变得合适为止。

## 4.13 `[engine_rot]` 部分

`[engine_rot]` 部分定义引擎旋转行为、RPM 耦合行为以及 overrun/损失塑形。这个部分是必需的。

### `inertia_kgm2`

引擎转动惯量，单位 kg*m^2。

允许范围是 0.01 到 5.0。

较高的值会让 RPM 上升/下降更慢、更平顺；较低的值则会让 RPM 对油门/松油的反应更快。

### `coupling_rate`

自由引擎 RPM 积分结果与车轮耦合 RPM 之间的混合速率。

允许范围是 0.1 到 80.0。

值越高，混合状态下的 RPM 就会越快锁向传动需求；值越低，则会在锁定前保留更多“打滑/过渡”行为。

### `friction_base_nm`

基础寄生摩擦扭矩，单位牛·米。

允许范围是 0 到 1000。

它会在所有状态下提高内部损失。设得太高，会让自由升转和松油表现都显得很重。

### `friction_linear_nm_per_krpm`

每 1000 RPM 的线性摩擦增长量。

允许范围是 0 到 1000。

如果你希望高转损失随着 RPM 按比例上升，可以用它。

### `friction_quadratic_nm_per_krpm2`

每 (1000 RPM)^2 的二次摩擦增长量。

允许范围是 0 到 1000。

如果你希望在高转区域、接近最高转时出现更强的损失塑形，就可以用它。

### `idle_control_window_rpm`

怠速控制在怠速以上生效的 RPM 窗口。

允许范围是 0 到 1000。

在这个窗口内（并且油门较低时），怠速控制扭矩可以把 RPM 保持稳定，而不会掉得太低。

### `idle_control_gain_nm_per_rpm`

怠速控制的比例增益，以“每少 1 RPM，补多少 Nm”来表示。

允许范围是 0 到 2。

值越高，怠速恢复越快；但如果设得太高，松油接近怠速时会显得很假。

### `min_coupled_rise_idle_rpm_per_s`

零油门条件下，自动耦合 RPM 至少允许以多快的速率上升。

允许范围是 0 到 20000。

它会限制起步支撑 RPM 底线在低油门下跳升得有多突兀。

### `min_coupled_rise_full_rpm_per_s`

全油门条件下，自动耦合 RPM 至少允许以多快的速率上升。

允许范围是 0 到 20000，并且它必须大于或等于 `min_coupled_rise_idle_rpm_per_s`。

值越高，高油门下起步 RPM 建立得就越快。

### `overrun_idle_fraction`

闭油门 overrun 损失在怠速端所占的比例。

允许范围是 0 到 1。

值越高，低转 overrun 损失越大；值越低，低转松油手感越温和。

### `overrun_curve_exponent`

从怠速到 limiter 这段范围里，overrun 损失增长所使用的形状指数。

允许范围是 0.2 到 5.0。

值越高，overrun 影响越集中到高 RPM 区域；值越低，则会更平均地铺开。

### `brake_transfer_efficiency`

引擎制动扭矩传递到车轮上的效率。

允许范围是 0.1 到 1.0。

值越高，松油减速通过传动比传到车轮上的程度越强；值越低，则会让车轮感受到的引擎制动更柔和。

## 4.14 `[resistance]` 部分

`[resistance]` 部分定义的是那些被动对抗车辆运动的道路与空气负载。这个部分是必需的。

你可以把它理解成“所有非刹车、非燃烧动力的纵向损失归宿”。它不定义引擎动力，也不定义玩家按刹车按钮时的主动制动力。它定义的是：车辆在前进时必须克服哪些东西。当前模型把这些键拆成空气动力负载、轮胎与路面滚动负载、车轮侧被动损失，以及选中挡位路径下的传动损失。这样拆是有意为之，因为空挡滑行、踩离合滑行和完全耦合松油滑行，如今不该再共享同一个假的“通用减速度”。

在实践上，这个部分的行为可以这样理解。`drag_coefficient`、`frontal_area` 和 `side_area` 塑造空气负载；`rolling_resistance` 和 `rolling_speed_factor` 塑造轮胎-路面负载；`wheel_side_drag_n` 与 `wheel_side_drag_linear_n_per_mps` 塑造始终存在的车轮/底盘被动损失，即便引擎已经与车轮断开，它们也还在；`driveline_drag_nm` 与 `driveline_viscous_drag_nm_per_krpm` 则塑造只有在真实挡位路径仍接合时才存在的传动侧损失。

### `drag_coefficient`

空气阻力系数。

允许范围是 0.01 到 1.5。

这是调整高车速阻力的主旋钮。

### `frontal_area`

迎风面积，单位平方米。

允许范围是 0.05 到 10.0。

它与 `drag_coefficient` 一起工作；面积越大，高速阻力越强。

### `side_area`

侧面积，单位平方米。

允许范围是 0.05 到 20.0。

它用于对横风敏感的空气动力负载。通常它不会是你调最高速时的第一选择，但当环境风和车身暴露面积应当产生额外阻力时，它就会变得重要。

### `rolling_resistance`

滚动阻力系数。

允许范围是 0.001 到 0.1。

它主要影响低速和中速下那种“始终存在”的阻力感。

### `rolling_speed_factor`

叠加在基础滚动阻力之上的速度相关乘数。

允许范围是 0 到 1.0。

它会让滚动阻力随着速度增长，而不是始终保持完全平直。这样你就能在不把所有问题都丢给空气阻力的情况下，为车辆增加一种“越快越显得重”的轮胎与接地感。

### `wheel_side_drag_n`

基础车轮侧阻力，单位牛顿。

允许范围是 0 到 5000。

这是始终存在的被动滚动损失，因此哪怕是在空挡滑行，或离合完全断开的情况下，它仍然会生效。

### `wheel_side_drag_linear_n_per_mps`

与车速相关的车轮侧阻力斜率，单位是“每米每秒增加多少牛顿”。

允许范围是 0 到 200。

值越高，就越能在不依赖引擎制动或耦合传动阻力的前提下，增加高速下自由滑行时的减速感。

### `driveline_drag_nm`

基础耦合传动阻力扭矩，单位牛·米。

允许范围是 0 到 2000。

这是只会在真实挡位路径仍然接合时才存在的传动侧阻力。它非常适合用来调空挡滑行与手动踩离合挂挡滑行之间的差异，而不用通过引擎制动去硬凑。

### `driveline_viscous_drag_nm_per_krpm`

与速度相关的耦合传动阻力斜率，单位为“每 1000 RPM 增加多少牛·米”。

允许范围是 0 到 500。

值越高，耦合传动损失就会随着传动速度更明显地增长。当空挡手感已经正确，但踩离合挂挡滑行或自动家族耦合滑行在高速下仍然太自由时，它尤其有用。

## 4.15 扭矩曲线预设配置

本节记录的是 `[torque_curve] preset` 各预设的目标行为。它们应当被用作起步模板，必要时再通过显式 `NNNNrpm` 键做覆盖。

运行时使用的预设系数如下：

preset | rise_exponent | fall_exponent | idle_factor | redline_factor | 实用特征
--- | --- | --- | --- | --- | ---
`city_compact` | 1.00 | 1.55 | 0.42 | 0.58 | 峰值克制，偏实用低中段
`family_sedan` | 1.05 | 1.35 | 0.38 | 0.64 | 平衡且宽容
`sport_sedan` | 1.15 | 1.25 | 0.34 | 0.70 | 更宽的中高段拉力
`sport_coupe` | 1.24 | 1.18 | 0.32 | 0.74 | 比轿车更偏高转
`grand_tourer` | 1.08 | 1.16 | 0.36 | 0.73 | 高速拉力宽广而平顺
`hot_hatch` | 1.10 | 1.28 | 0.35 | 0.68 | 中段反应灵动
`muscle_v8` | 0.90 | 1.22 | 0.44 | 0.66 | 低中段更强，个性更明显
`supercar_na` | 1.34 | 1.10 | 0.28 | 0.77 | 高转自然吸气风格
`supercar_turbo` | 0.88 | 1.40 | 0.34 | 0.66 | 增压中段 + 上段延续
`rally_turbo` | 0.86 | 1.38 | 0.36 | 0.64 | 为恢复而设计的强中段
`diesel_suv` | 0.80 | 1.90 | 0.50 | 0.56 | 低转扭矩厚，高转更平静
`diesel_truck` | 0.66 | 2.05 | 0.58 | 0.52 | 更早爆发，更明显衰减
`supersport_bike` | 1.62 | 1.14 | 0.26 | 0.69 | 很尖锐的高转风格
`naked_bike` | 1.45 | 1.20 | 0.30 | 0.67 | 运动，但比 supersport 更宽

实用预设选择矩阵：

如果你的目标手感是…… | 第一候选预设 | 最常见的第一修正区间
--- | --- | ---
起步温和、日常响应平顺 | `family_sedan` | 提高/修剪 1500 到 2800 RPM
城市加速活泼，但又不想要超跑顶端 | `hot_hatch` | 平滑 1800 到 3500 RPM
低中段推力更强，高转不想太突出 | `muscle_v8` | 修剪 4500 RPM 到 limiter
高转自然吸气式拉力 | `supercar_na` | 支撑 3500 到 5500 RPM 的换挡落点
像增压车那样的中段鼓包 | `supercar_turbo` 或 `rally_turbo` | 平滑 2200 到 4200 RPM 的 boost 带
像柴油那样低转早爆发、高转早衰减 | `diesel_suv` 或 `diesel_truck` | 压掉 1500 RPM 以下过于尖锐的低转峰
很尖锐的摩托高转感 | `supersport_bike` | 确保 5000 RPM 以下仍有足够可驾驶性

如何理解这些列：

- 更高的 `rise_exponent`：前段扭矩爬升更慢，越靠近峰值爬升越快（更尖）
- 更低的 `rise_exponent`：低中段扭矩更早建立（低转更有劲）
- 更高的 `fall_exponent`：靠近峰值时保持更久，直到接近 limiter 才掉
- 更低的 `fall_exponent`：过了峰值后更早开始衰减
- 更高的 `idle_factor`：若未显式设置 `idle_torque`，则低转保底更强
- 更高的 `redline_factor`：若未显式设置 `redline_torque`，则高转保底更强

重要说明：`idle_factor` 和 `redline_factor` 只是后备乘数。只要你显式设置了 `idle_torque` 和 `redline_torque`，这些显式值就会优先生效。

一轮式预设调校工作流：

1. 先只选一个预设
2. 设定锚点（`peak_torque`、`peak_torque_rpm`、`idle_torque`、`redline_torque`）
3. 只在起步 RPM、常见换挡落点 RPM，以及上段拉力/衰减 RPM 附近增加少量显式点
4. 用起步、中段和最高速拉力测试来验证
5. 如果整体行为仍然差得很远，先换预设家族，而不是立刻堆大量手写点

## 5. 类别基线预设（转向、轮胎模型、动态）

本节按车辆类别提供现代操控模型的实用起始预设。它们不是硬性规则，而是一组基线值，目标是让车辆第一次开起来时就相对稳定，然后再根据具体车辆做进一步微调。

下面这些值有意只使用 `[steering]`、`[tire_model]` 和 `[dynamics]` 三组字段。

本指南推荐的类别包括：

- 跑车：快、响应强，但高速转向权重仍受控。
- 轿车/掀背车：平衡的日常驾驶风格。
- SUV/卡车/厢式车：更重、更稳、更平静的方向行为。
- 摩托车：敏捷，但宽容度更低，尤其在高速下。

### 转向基线（`[steering]`）

类别 | steering_response | high_speed_stability | high_speed_steer_gain | high_speed_steer_start_kph | high_speed_steer_full_kph | wheelbase | max_steer_deg
--- | --- | --- | --- | --- | --- | --- | ---
跑车 | 1.08 到 1.30 | 0.22 到 0.30 | 0.92 到 0.98 | 145 到 165 | 235 到 260 | 2.50 到 2.90 | 30 到 35
轿车/掀背车 | 0.98 到 1.20 | 0.25 到 0.34 | 0.88 到 0.95 | 125 到 150 | 210 到 240 | 2.55 到 2.95 | 30 到 36
SUV/卡车/厢式车 | 0.84 到 1.08 | 0.34 到 0.50 | 0.84 到 0.91 | 85 到 120 | 150 到 200 | 2.80 到 3.50 | 28 到 36
摩托车 | 0.92 到 1.08 | 0.42 到 0.50 | 0.88 到 0.93 | 140 到 160 | 225 到 245 | 1.35 到 1.55 | 34 到 42

### 轮胎模型基线（`[tire_model]`）

类别 | tire_grip | lateral_grip | combined_grip_penalty | slip_angle_peak_deg | slip_angle_falloff | turn_response | mass_sensitivity | downforce_grip_gain
--- | --- | --- | --- | --- | --- | --- | --- | ---
跑车 | 0.95 到 1.15 | 0.98 到 1.12 | 0.64 到 0.72 | 7.5 到 8.8 | 1.12 到 1.28 | 0.95 到 1.15 | 0.60 到 0.75 | 0.06 到 0.12
轿车/掀背车 | 0.88 到 1.02 | 0.92 到 1.02 | 0.66 到 0.74 | 8.3 到 9.6 | 1.22 到 1.40 | 0.90 到 1.08 | 0.68 到 0.82 | 0.03 到 0.08
SUV/卡车/厢式车 | 0.75 到 0.92 | 0.78 到 0.92 | 0.50 到 0.65 | 9.5 到 11.5 | 1.40 到 1.70 | 0.80 到 0.98 | 0.80 到 0.95 | 0.00 到 0.05
摩托车 | 1.04 到 1.20 | 0.76 到 0.90 | 0.74 到 0.84 | 6.0 到 7.2 | 0.90 到 1.08 | 1.05 到 1.28 | 0.40 到 0.62 | 0.05 到 0.11

### 动态基线（`[dynamics]`）

类别 | corner_stiffness_front | corner_stiffness_rear | yaw_inertia_scale | steering_curve | transient_damping
--- | --- | --- | --- | --- | ---
跑车 | 1.08 到 1.25 | 1.00 到 1.15 | 0.90 到 1.08 | 0.90 到 1.00 | 0.85 到 1.15
轿车/掀背车 | 0.94 到 1.08 | 0.90 到 1.02 | 1.05 到 1.25 | 1.02 到 1.18 | 1.30 到 1.90
SUV/卡车/厢式车 | 0.72 到 0.92 | 0.65 到 0.85 | 1.35 到 1.70 | 1.12 到 1.30 | 2.00 到 2.90
摩托车 | 1.30 到 1.55 | 0.90 到 1.05 | 0.52 到 0.70 | 0.72 到 0.88 | 0.80 到 1.05

### 如何安全应用这些基线

1. 先选一个类别基线，并把三组值（`[steering]`、`[tire_model]`、`[dynamics]`）一起套上。
2. 先做低速测试（30 到 80 km/h），确认方向感、入弯感以及回正后的行为。
3. 再做高速测试（160 到 240 km/h），并优先调整 `high_speed_steer_gain`、`high_speed_stability` 和 `downforce_grip_gain`。
4. 如果响应太弱，先略微提高 `steering_response` 或 `turn_response`，而不是立刻提高抓地。
5. 如果响应太激进，先略微提高 `transient_damping` 或 `steering_curve`，再考虑降低抓地。

### 各类别的快速纠偏指南

- 跑车在高速弯中过于凶猛：降低 `high_speed_steer_gain`、降低 `downforce_grip_gain`，或者略微提高 `high_speed_stability`。
- 轿车在普通弯里显得发死：先小幅提高 `steering_response`，如果还不够，再提高 `turn_response`。
- SUV 旋转得太快：提高 `yaw_inertia_scale` 和 `transient_damping`，然后降低 `corner_stiffness_rear`。
- 摩托车显得太安全、太贴地：略微降低 `high_speed_stability`，并把 `yaw_inertia_scale` 往该类别基线下限靠一点。

## 6. 旧格式中被移除的内容

新的自定义格式有意移除了若干旧式行为。

`mono_crash` 声音支持已被移除，它不再是合法参数。`steering_factor` 也同样被移除，不再受支持。如果它们出现在自定义 `.tsv` 文件里，解析器会把它们当成未知键，并拒绝整个文件。

旧式的滑行与减速键也已经从自定义格式中移除，不应再出现在新文件中。`deceleration` 已不再是合法的物理创作键。`coast_base_mps2` 和 `coast_linear_per_mps` 也同样不是当前格式的一部分。当前模型用显式的 `[resistance]` 创作方式（滚动阻力、车轮侧阻力和耦合传动阻力）取代了旧的那种泛化减速控制。如果某个旧车辆文件仍然在使用这些已移除键，正确修法是重新调校新的阻力键，而不是试图强行保留旧的那种统一衰减行为。

旧式“除以 100”的编码习惯也已移除。不要再写类似 `17000` 表示 170 km/h，或 `180` 表示 `steering_response=1.8` 这样的编码值。现在所有地方都必须写直接值。

顶层参数也不再被支持。每一个键都必须写在一个合法部分中。

## 7. 调校建议与常见问题

如果一辆车在所有挡位里都过快，那么只降低 `max_speed` 并不能真正解决问题。它仍然会加速过猛，只是会更早撞进最高速区域。在这种情况下，你应根据“究竟哪一段速度太强”来选择：降低 `power_factor`、降低扭矩值、提高质量、调整齿比，或者增加阻力。

如果一辆车起步感觉不错，但升挡之后变得很弱，请去检查新挡位落在了扭矩曲线的什么位置。降低 `peak_torque_rpm`、提高 `idle_torque`、缩短齿比、提高 `final_drive` 或降低阻力，都可能改善换挡恢复。策略可以帮助避免糟糕的自动升挡，但它不可能让一个物理上发弱的挡位凭空变强。

如果一辆车在同类别里过弯能力太强，请先降低 `high_speed_steer_gain`、`max_steer_deg` 或 `steering_response`。如果这样还不够，再降低 `lateral_grip`、降低前后侧偏刚度，或提高 `high_speed_stability`。如果它在刹车或加速时变得很难控制，那就回头检查 `tire_grip`、`combined_grip_penalty` 和制动相关值。

如果自动模式反而比手动模式更糟，那么物理本身很可能已经没问题了。此时，你应该去调 `[policy]`，而不是重做引擎和齿比。用 `top_speed_gear`、`upshift_delay_*` 以及防止升进废挡的策略值，来稳定自动行为。

## 8. 给作者的最后说明

新的 `.tsv` 格式之所以严格，是因为严格能带来更高的质量、更好的调试体验以及更公平的玩法环境。它能防止错误值混进系统、尽早抓出失误，并让自定义车辆更容易维护。

最好的结果来自清晰目标和有条理的调校。先决定这辆车的角色，再确保动力总成在物理上确实能拉动你打算使用的挡位，之后再用 `power_factor`、阻力、操控极限以及自动变速箱策略去微调平衡。手动和自动模式都要测试，并且特别注意每次换挡之后立刻发生了什么。那个瞬间，通常最能暴露出你的调校到底健不健康。