車輛組裝¶
本檔角色:玩家用正式零件或本機測試零件組成一台車(loadout)的規範。 上傳 / 編輯 / 送出(本機測試 / 上鏈)見 UGC機制.md;Mount 結構見 零件與共用介面.md §6。
1. 組裝定位¶
「組裝」≠「賽前」:
- 組裝:玩家依車位用途用正式 / 測試零件組一台車,存玩家本地,不影響 CID
- 賽前:從車位選已組好的車(無編輯);一場比賽含
MATCH_ROUND_COUNT回合,每位玩家選 N 台(一台 / 回合、可重複用同台、carRotation),見 流程/配對.md / 賽內機制.md §1.5
組裝可發生在玩家車庫(/garage 頁),隨時可改。
1.1 車位用途(權威)¶
| 車位 | 可用零件 | 本機測試 | 正式賽 |
|---|---|---|---|
| 正式車位 | 公版與已發布鏈上零件 | ✅ | ✅ online-ready 時重驗後可用 |
| 本機測試車位 | 正式零件+local: 測試零件 |
✅ | ❌ 永遠禁止 |
- 車位種類持久化為
slotKind: 'formal' | 'local-test',不可由零件 ref 反推。 - 本機測試車位固定為一個;付費擴充只增加正式車位。
- 正式車位也可跑本機測試,但正式車位的 picker 與儲存守門都必須拒絕
local:。 - 所有 loadout 都只在本機;「正式車位」不表示車輛已上鏈或成為公開作品。
2. Loadout 結構¶
{
"car_name": "speed-build-01",
"chassis": "<cidv1>", // CIDv1 或 "builtin:chassis-01"
// body:4 個 Mount_Body 與 chassis canonical 嚴格相符
"body": "builtin:body-01",
// 必填 part
"motor": "<cidv1>", // 對應 chassis 自訂位置 Mount_Motor
"battery": "builtin:battery-01", // 對應 canonical Mount_Battery
// 可選 part
"chip": "<cidv1>", // 對應 Mount_Chip;null = 不裝晶片
"weapon": "<cidv1>", // 對應 Mount_Weapon;null = 不裝武器
"passive_weight_split_pct": 77, // 僅 weapon.passive = true 時存在(0–100、預設 50):被動加持分配(減重 vs 損壞抗性,§3.5)
// tires:4 顆位置固定,可分別不同 part
"tires": {
"FL": "<cidv1>",
"FR": "<cidv1>",
"RL": "<cidv1>",
"RR": "<cidv1>",
},
// rollers:0–6 個自訂位置,每位置獨立可選
"rollers": {
"FL": "<cidv1>",
"FR": "<cidv1>",
"CL": null,
"CR": null,
"RL": "<cidv1>",
"RR": "<cidv1>",
},
}
組裝階段不設定零件參數。所有零件參數(chip skill_slots / allocation_pct、weapon mechanism、motor torque_ratio、battery configured_output_w 等)皆在 Stage 2 上鏈前 bake 進 GLB extras,上鏈後 immutable。Loadout 是「哪顆零件裝哪個 mount」的對應表——唯一組裝層調校值 =
passive_weight_split_pct(§3.5;不覆蓋任何零件本體參數、只決定本車對被動加持的分配)。
3. 組裝規則¶
3.1 Mount 配對¶
依 零件與共用介面.md §6.3 配對演算法:
規則 1:嚴格相符(body / battery / motor / chip / weapon)
規則 2:前綴匹配(tire / roller — part 用通用名)
範例:part Mount_Tire 可裝到 chassis Mount_Tire_FL / Mount_Tire_FR / 等任一位置。
3.2 部件數量¶
| 部件 | 必要 | 數量 |
|---|---|---|
| chassis | ✅ | 1 |
| body | ✅ | 1 |
| motor | ✅ | 1 |
| battery | ✅ | 1 |
| tire | ✅ | 4(不放寬) |
| roller | ❌ | 0–6 |
| chip(晶片) | ❌ | 0–1 |
| weapon | ❌ | 0–1 |
3.3 武器需晶片¶
裝任何武器都需晶片(含 passive):
| 配置 | 結果 |
|---|---|
| 無晶片 + 無武器 | ✅ 純物理車(裝甲耐撞風格) |
| 無晶片 + 有武器 | ❌ 拒收:禁晶片 = 禁武器 |
| 有晶片 + 無武器 | ✅ 純技能車 |
| 有晶片 + 有武器 | ✅ 完整配置;passive / active 武器皆占 chip weapon 槽(active 觸發、passive 常駐) |
設計意圖:runtime 無須額外判斷邏輯,禁晶片自動禁武器。
3.4 整車約束¶
整車質量、AABB、質量比、輪胎數與軟性 envelope 的數值、拒收語意及設計依據只由 零件與共用介面.md §7.1 定義。組裝器依 §3.5 先算被動加持後有效質量,再以同一次求和送入權威約束檢核。
3.5 被動武器加持分配(passive_weight_split_pct)¶
裝載 passive 武器(passive: true)時,loadout 可設唯一組裝層調校值——加持效果在「重量減輕 vs 損壞抗性(含耐熱)」間的分配:
- 值域整數 0–100(預設 50):
weightSplit= 壓給減重的比例、其餘100 − weightSplit壓給抗性。 - 最終效果 = 三因子(公式權威 算式表.md §3):chip
weapon槽allocation_pct(上鏈鎖死 = 總量)× 本值 ×K_PASSIVE_EFFECT_MAX_PCT(30、初估)——例:allocation_pct=100、split 77 → 減重 23.1%+ 抗性 6.9%。 - 僅及武器零件自身;靜態係數(組裝 / 實例化時套用、非 runtime 變動)。
- 驗證:值域 0–100 整數;
weapon為 null 或 active 武器時此欄位必須省略(帶值 → 拒絕儲存;賽前LoadoutSubmission同規則驗證、值在loadoutHash簽章涵蓋內——程式架構/matchmaking.md §5)。 - UI:組裝面板僅在掛 passive 武器時顯示分配滑桿,即時預覽有效質量與抗性 %。
晶片的 skill_slots[](含每個 slot 的 skill 與 allocation_pct)在 Stage 2 設定、Stage 3 上鏈時 bake 進 chip extras 後完全 immutable。組裝階段選哪顆晶片 = 直接套用該晶片所有設定,無覆蓋值。
設計概念詳見 零件與共用介面.md §3.6 與 零件與場景.md §8。觸發能量公式見 算式表.md §3:skill_power_budget_mw = floor(battery.available_output_mw × allocation_pct / 100),再依 Event/Hold 的效果與成本幀數結算。
想要不同 allocation_pct 配置 = 上傳一顆新晶片(產新 CID)。
4. 多顆晶片?¶
全車最多 1 個 chip Mount(chassis 自訂位置)。 玩家不裝 chip = 純物理車(不能用技能 / 武器)。
5. 多武器 / 多臂武器?¶
全車最多 1 個 Weapon Mount(chassis 自訂位置)。多部位 / 多臂武器在 weapon 零件內部解決、不需多 mount:
- 獨立運動(雙鎚 / 多轉子等、各自旋轉或揮擊)→ 多 actuator(
weapon_actuators[],每項一個驅動 pivot + 剛體 / 鏈條 payload、共用單一 chipweapon觸發;見 零件與共用介面.md §3.7) - 靜態複合造型(三叉戟 / 固定多刃等 passive)→ 單純複合 mesh
單一 Mount_Weapon 對接,組裝層不變。
6. Loadout 儲存位置¶
| 項目 | 位置 |
|---|---|
| Loadout JSON | 當前 profile 的 open4wd-keys sealed identity container(garage domain) |
| 帳號範圍 | 可保存多 profile;執行中一次只解鎖/啟用一個 identity,資料依 profile 隔離 |
| 上鏈 | ❌ Loadout 不上鏈(CID 不變) |
loadout 只存在目前 profile 的 sealed garage-loadouts identity domain;unified IndexedDB 不另存副本。pre-launch 期間遇到不相容的本機 schema 時明示重設,不匯入舊資料。
賽前選車:從本地 loadout 列表選 MATCH_ROUND_COUNT 台(一台 / 回合、可重複用同台 = carRotation,見 §1)。preloading 一次選定後鎖死——簽章提交、防偷換、reconnect 比對 loadoutHash,不可逐回合換車(賽前承諾策略 + loadout-lock 防作弊,見 程式架構/matchmaking.md §5)。
逐回合 disallowChip 不改變 loadout 合法性:已安裝晶片與武器的車仍可選,選擇器只提示該回合
主動技能將停用。Runtime 不拆零件、不改車體幾何;僅拒絕晶片主動技能與主動武器觸發,
被動零件的純物理效果保留。
7. Loadout 編輯流程(/garage UI)¶
1. 玩家進入車庫頁
2. 選現有 loadout 或新建
3. 對每個 mount slot:點選 → 依 `slotKind` 從可用零件清單篩選相容 part
- 正式車位:公版+目前身份資產庫中的鏈上零件;只有已取回且通過 canonical 驗證者可裝
- 本機測試車位:上述來源+本機 `local:` 測試零件
- 已過濾:依 mount 配對演算法 + canonical 介面逐特徵絕對公差
4. 掛 passive 武器時:加持分配滑桿(§3.5、預設 50/50)
5. 即時顯示:總質量(加持後有效值)/ AABB / 整車約束狀態
6. 若超出約束 → UI 阻擋儲存
7. 儲存
資產庫待取回項可列在 picker 作為取回入口,但不是可裝集合。候選不得由歷史 loadout 或偶然瀏覽 快取推測;缺 bytes 的既有引用保留名稱快照與不可用狀態。每類 10 項以下不顯示搜尋,第 11 項起 顯示;名稱/質量/評分/最近使用排序始終可用,並顯示來源、縮圖與關鍵 stat chips。
tire 四個位置與 roller 六個位置各自獨立選件;點 viewport mount 時 picker 同步到該類別與位置, 不得再把單次選擇廣播到整組輪胎或滾輪。
無「調零件參數」步驟(chip allocation_pct / motor torque_ratio / weapon 設定等皆在 Stage 2 零件上鏈前完成);唯一組裝層調校值 =§3.5 加持分配。
8. Canonical 介面檢核¶
組裝只重驗 canonical finalizer 已確認的 mount 身分與介面結果;part AABB 與零件外形百分比不屬組裝門檻。介面種類、逐 feature expected/tolerance authority、單位與拒收碼統一由 零件與共用介面.md §7.3 定義;本節只描述組裝端消費規則:
- mount 名稱/前綴與 slot kind 必須匹配;
- mount center、hinge axis/radius/width、mating normal 等介面特徵,必須已有合格 canonical receipt;
- 輪胎外徑、馬達總長、滾輪外徑、外殼比例與純視覺輪廓不屬相容性門檻;
- 任一介面超限或量測契約無效 → 拒絕裝載;已通過且 receipt 有效 → 允許。
理由:裝配是否成立取決於 Mount frame 與真正配合面,不取決於公版半成品的整體外形比例。詳見 零件與共用介面.md §7.3。
8.1 視覺與物理共用組裝位姿¶
每個非 chassis slot 的 attachment rigid transform 固定為
chassisMount × inverse(partMount);chassis 使用 identity。矩陣採 glTF / Three
column-major、平移單位為公尺,禁止縮放與鏡射。viewport 顯示與 race physics 必須消費
同一語意,不得各自以版面預設位置或把零件疊在車體原點。
物理 compound body 對每件零件以 auto_aabb_min_m / auto_aabb_max_m 建 local box,
再套用該 slot attachment 的平移與旋轉。缺少 Mount、矩陣非有限、非 rigid、或 AABB
任一軸無正厚度時 fail closed,不得回退成 identity 或 [0,0,0] → auto_bbox_m。
9. 車輛回合初始狀態¶
每回合載入新車與新場地世界;初始欄位、值與回合獨立語意只由 算式表.md §11 定義,本檔不維護第二份狀態表。
10. 信譽相關¶
組裝不影響信譽。零件 / 場景的信譽 / rating 顯示在組裝 UI 給玩家參考(信譽系統.md)。
11. 與 Fork 機制的關係¶
正式用途的 Loadout 零件可以是任何可用的已發布資產:
- 原作
- Fork 衍生
裝載 fork 零件,使用統計會回流給 fork 與原作 → 三層分潤生效(經濟系統.md)。
local: 測試零件只可裝入本機測試車位、只可本機測試,不產生使用統計或分潤。
12. 組裝的版本相依¶
Loadout 釘的是具體零件 CID(immutable)。資產 schema 版本(open4wd_version)模型見 版本規範.md B 軸。
- 進房時對動態最低支援版重驗(以房間 pinned 帳本檢查點為準,賽內機制.md);多回合下
carRotation全 N 台車的資產一併驗: - 任一台車釘住 CID 版本 < 動態 min(unusable)→ 整人進房擋下(非單回合 DNF);需換件 / 遷移後零件重組、湊齊 N 台全可用才能上場。組裝 picker 本就不顯示 unusable 零件。
- 釘住 CID 為棄用(仍可降版)→ 照常進房;比賽時該 type 全場走降版本運算(版本規範.md §18)。
- 窄路相容(比賽進行.md §1.3):多回合下每台車對其回合場地各驗
車 AABB.x + NARROWEST_PATH_MARGIN_M ≤ auto_narrowest_path_m(警告、不阻擋)。 - 組裝記錄格式版本歸 A 軸(client 版本),非 B 軸資產 schema 版本。