跳轉到

車輛組裝

本檔角色:玩家用正式零件或本機測試零件組成一台車(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 weaponallocation_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 的 skillallocation_pct)在 Stage 2 設定、Stage 3 上鏈時 bake 進 chip extras 後完全 immutable。組裝階段選哪顆晶片 = 直接套用該晶片所有設定,無覆蓋值。

設計概念詳見 零件與共用介面.md §3.6零件與場景.md §8。觸發能量公式見 算式表.md §3skill_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、共用單一 chip weapon 觸發;見 零件與共用介面.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 expectedtolerance 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 版本。