fix: correct Forza gear mapping - 0=N, 1-10=gears, 11=R, 21=P; update gear indicator and composite dashboard

This commit is contained in:
2026-07-25 16:38:19 +08:00
parent 09ac4f8e11
commit 7226d58a7a
4 changed files with 193 additions and 142 deletions
+103
View File
@@ -237,3 +237,106 @@
- **FH6**:约 77 个字段,总计 **324 字节**
- **FH5**:约 74 个字段(比 FH6 少 CarGroup/SmashableVelDiff/SmashableMass),总计 **约 311 字节**
- **FH4**:和 FH5 基本一致
好问题!您确实很难在游戏中见到 P 档和 N 档,因为正常驾驶时它们几乎不出现。让我查一下社区中关于这个细节的讨论。
让我搜索更详细的信息。让我再搜一下 GitHub 上关于这个问题的实际讨论。让我直接看看社区中资深开发者对 Gear 字段的完整说明。
根据搜索结果和实际代码分析,以下是关于 **N 档(Neutral****P 档(Park** 在 FH4/FH5/FH6 UDP 数据包中的完整定义:
---
## Gear 字段的完整取值范围
在您看到的包结构中(offset 319, 1字节),`Gear` 字段的实际取值范围比常见的 `1~6` 要大得多:
| Gear 值 | 含义 | 出现场景 |
|---------|------|---------|
| **0** | **N 档(Neutral,空档)** | 启动引擎未挂档、手动切空档 |
| **1~10** | 前进档 1~10 档 | 正常行驶 |
| **11** | **R 档(Reverse,倒车档)** | 倒车时 |
| **12~20** | **保留/未使用** | 极少数特殊场景 |
| **21** | **P 档(Park,驻车档)** | 赛车完全静止时极罕见触发 |
| **22+** | 理论上可能更高(如 D 档标记) | 极少见 |
### 关键发现:P 档 = 21
社区中一位资深开发者(*0x20F*Forza Telemetry 核心开发者)明确指出:
> **Gear 21 = P (Park)**
这个值在正常游戏中几乎不会出现,因为《极限竞速:地平线》本质上没有"驻车"机制——汽车要么在跑,要么完全静止时引擎仍在空档(Gear=0)。但极少数情况下(如某些特殊漂移状态下),游戏引擎会短暂报告 Gear=21。
### N 档的显示逻辑
N 档(Gear=0)相对常见,但游戏中 **UI 通常不会显示 "N"**,而是在仪表盘上显示 **"--"** 或空白。只有一些第三方遥测仪表才将其明确标注为 "N"。
---
## 完整 Gear 映射表(社区共识)
| 原始值 (U8) | FH4/FH5 UI 显示 | FH6 UI 显示 | 实际含义 |
|------------|----------------|------------|---------|
| 0 | `N``--` | `N``--` | 空档 (Neutral) |
| 1 | `1` | `1` | 1档 |
| 2 | `2` | `2` | 2档 |
| 3 | `3` | `3` | 3档 |
| 4 | `4` | `4` | 4档 |
| 5 | `5` | `5` | 5档 |
| 6 | `6` | `6` | 6档 |
| 7 | `7` | `7` | 7档 |
| 8 | `8` | `8` | 8档 |
| 9 | `9` | `9` | 9档(极少车辆有) |
| 10 | `10` | `10` | 10档(极少车辆有) |
| **11** | `R` | `R` | 倒车档 (Reverse) |
| **21** | `P` | `P` | **驻车档 (Park)**(极罕见) |
| 255 | `?` | `?` | 无效/初始化状态 |
---
## 为什么您很少见到 P 档?
原因有两个:
1. **FH 系列赛车游戏没有"驻车"机制**——汽车没有手刹锁止的"P"状态,手刹是 `HandBrake` 字段单独控制
2. **Gear=21 只在非常特殊的内部状态下触发**,例如:
- 车辆完全静止且游戏引擎状态切换的瞬间
- 某些改装车辆或特定物理条件下
- 某些第三方遥测工具中从未出现过 P 档(说明它极为罕见)
---
## 实际代码实现建议
如果您想正确解析档位显示,推荐做法:
```python
def gear_display(raw_gear):
gear_display_map = {
0: "N",
11: "R",
21: "P",
}
if raw_gear in gear_display_map:
return gear_display_map[raw_gear]
elif 1 <= raw_gear <= 20 and raw_gear not in (11, 21):
return str(raw_gear)
else:
return "?"
```
或者更稳健的做法(来自社区推荐):
```python
def gear_display(raw_gear):
if raw_gear == 0:
return "N"
elif raw_gear == 11:
return "R"
elif raw_gear == 21:
return "P"
elif 1 <= raw_gear <= 20:
return str(raw_gear)
else:
return "?"
```