遊戲機制¶
本檔角色:除 賽內 / UGC / 車輛組裝 之外的所有遊玩機制。 涵蓋:技能 enum / 機制庫 / 破壞模型 / 過熱模型 / 設定。 物理算式見 算式表.md;零件特殊規則見 零件與場景.md。
1. 晶片技能(Skill)8 種 enum¶
詳細效果分發見 算式表.md §3。
| Skill | 類型 | 效果 |
|---|---|---|
boost |
Event 單發 | 前向衝量(+VEHICLE_X) |
brake |
Event 單發 | 後向衝量(-VEHICLE_X) |
swerve_left |
Hold 持續 | 左向衝量(+VEHICLE_Y) |
swerve_right |
Hold 持續 | 右向衝量(-VEHICLE_Y) |
jump |
Event 單發 | 上向衝量(+VEHICLE_Z) |
slam |
Event 單發 | 下向衝量(-VEHICLE_Z) |
stabilize |
Hold 持續 | 角阻尼 += applied_energy × K_STABILIZE |
weapon |
Hold 持續 | 分發給武器機制(active 觸發;passive 占槽常駐);launch 依 LAUNCH_FIRE_INTERVAL_MS(250ms)連發、彈藥打完即空、下一回合新車即滿彈(零件與共用介面.md §3.7.3) |
2. 技能能量公式¶
技能能量不過 motor:motor 僅供駕駛動力;駕駛先結帳,技能再依已簽事件順序從剩餘電量取得 grant,餘量不足時效果與成本同比例縮放,禁止透支。功率 budget、Event/Hold frames、效果能量、 成本 quantum 與結算順序只由 算式表.md §3 定義;配置邊界見 車輛組裝.md §3。
3. Event vs Hold 行為¶
| 類型 | 觸發方式 | dt |
|---|---|---|
| Event 單發 | 按下瞬間觸發一次,鬆開不影響 | effective_dt = 1.0 |
| Hold 持續 | 按住期間每 dt 觸發一次 | effective_dt = 當幀 dt |
4. 過熱 / 破壞模型¶
4.1 Per-part 溫度¶
每個 part 有獨立 temperature;過熱破壞無 graceful degradation:
if part.thermalLimitC !== null and part.T_next > part.thermalLimitC:
part.broken = true
詳見 算式表.md §6。
4.2 各 part 的 heat 來源¶
| Part | heat_in |
|---|---|
| chassis / body / weapon | 無自身發熱;仍接收環境、burn/freeze 與外部接觸來源 |
| tire / roller | 同上,另接收 solid surface 導熱與切向 slip heat |
| motor | K_MOTOR_HEAT × actual_power_w |
| battery | K_BATTERY_PASSIVE × actual_supply_power_w + battery_cost_j × K_BATTERY_SKILL_WASTE_HEAT |
| 晶片 | per-skill-trigger spike:battery_cost_j × K_CHIP_SKILL_WASTE_HEAT |
4.3 晶片殺手鐧¶
battery_cost_j × K_CHIP_SKILL_WASTE_HEAT 先進 per-part heat ledger,與所有熱源只做一次
算式表.md §6.2 backward-Euler 積分;若積分後 T_next > thermalLimitC 才令 chip
broken。該次 skill effect 已完整執行且維持正常強度,不可在積分前以 heat J 直接加到 °C 預判。
broken 後所有技能立即失效但能基本駕駛。技能可用性不得只在物理層靜默拒絕:每幀由權威
零件/賽事狀態推導 ordered skillDisableReasons,HUD、RacePage 輸入與音效共用該投影。投影由
enabled 轉為 disabled 的當幀釋放全部 hold、清除 active 回饋並拒絕新 press;原因消失後才可由
同一投影恢復。原因至少區分回合 disallow-chip、chip broken、battery/motor 功能失能、chassis
物理退役/淘汰、退出與車況缺席;多個原因可同時存在,房規不得冒充車輛損壞。
4.4 散熱¶
散熱不另寫未定義的 k_eff 公式;Stage 3 烘焙的 ambientConductanceWPerC 與場地
weather.temperature 一起進 算式表.md §6.1–§6.2 的單次 backward-Euler 積分。
burn/freeze deploy 的 temperature_delta_per_sec 先乘 part heat capacity 轉為 W 後進同一 ledger,
不直接寫溫度,也不修改 T_air(算式表.md §6.4)。
4.5 Fatigue 累積破壞¶
Fatigue 對 attacker/target 對稱套用,車輛與可破壞場地 entity 共用相同接觸、剪切、累積與 一擊重傷公式;缺少 current PhysicsManifest 接觸資料即拒載,不以整顆 part/entity AABB 代替。 鈍器、尖端、刀刃、揮動刀刃與旋轉鋸沒有名稱倍率。完整公式、法線/面積來源與門檻只由 算式表.md §7 定義。
可破壞性決策與跳過條件:見 材質表.md §10(建模屬性決定,材質僅提供強度數值)。
4.6 broken 後果¶
part broken 後該 part 功能與物理貢獻失效;所有傷害、熱與磨耗先完成,幀末才依穩定 partIndex 一次提交 collider/body 停用與剩餘質量/COM/慣量重算。只有 chassis broken 會令整車 physicsRetired 並自動切觀戰;battery/motor broken 是功能失能,不阻止慣性或撞擊帶動的合法完賽。同幀 swept finish 先於 chassis retirement 承認。碎片只屬呈現,無碰撞、傷害、sensor、磁力或 checkpoint 能力。
5. 8 Stats 系統¶
| Stat | 來源 |
|---|---|
| Mass | Σ part mass_g |
| Drag | body 前向有效迎風面積/阻力等級 |
| Lift | body aero lift_factor |
| Stability | chassis / 重心高度 / 軸距(顯示式=軸距 ÷ 重心高 ×100 整數) |
| Accel | motor torque_ratio × actual_power |
| TopSpeed | motor (100 - torque_ratio) × actual_power |
| Grip | 標準柏油下 Average(tire friction, 0.85) 的輪組均值;同欄另顯示低/中/高滾阻 |
| Endurance | battery auto_energy_capacity_mj(資訊卡換算為 kJ) |
8 Stats 為顯示層、非共識值(不進物理 / 經濟;車輛資訊卡用,美術資源/頁面線框.md)——actual_power_w = min(auto_input_mw, configured_output_w × 1000) / 1000(同 算式表.md §2);aero/幾何資料不可得時,對應項顯示「—」(null 不硬湊)。對應 src/mechanics-catalog/。
6. 機制庫(Mechanics Catalog)¶
公開機制目錄分成三組;本節只提供分類摘要,實作讀取各分類的 canon 定義:
- 晶片:8 個
SkillId,由 車輛組裝.md 定義。 - 武器:被動、近戰、發射三類,由 零件與場景.md 與 算式表.md 定義。
- 場地:
decoration、kinematic_move、destructible三類 entity,由 零件與場景.md 定義。
新機制提案判斷標準(社群提案沿用):① 與 8 skill enum/ 武器三分支(magnet/launch/general)重疊?② 違反 deterministic 物理(runtime 改 mass/friction 等基底參數)?③ 可由部件 archetype 表達(如 motor torque_ratio 高扭型)?——任一命中即不收。
7. 車輛狀態生命週期(每回合新車)¶
詳見 算式表.md §11:
| 時機 | 動作 |
|---|---|
| 每回合載入 | 新車 + 新場地 = 全新世界,以回合初始狀態開始(fatigue 0 / temp ambient / broken false / battery 滿 / 彈藥滿) |
| 回合內 | 狀態累積(無中途修理機制) |
| 回合間 | 換新車 + 新世界、獨立不共享狀態(非 reset 流程) |
8. 環境影響¶
8.1 場地材質地面¶
rolling_resistance影響車輛行駛阻力friction影響抓地restitution影響反彈
8.2 Deploy zone(fluid)¶
| 材質 | 效果 |
|---|---|
水 (water) |
路面打滑(grip × 0.5) |
油 (oil) |
打滑 + 拖慢 |
結凍液 (freezing_fluid) |
凍冷(part.temperature 降) |
熔岩 (lava) |
加熱(part.temperature 升) |
酸液 (acid) |
腐蝕 fatigue |
詳見 材質表.md §3。
8.3 三天氣(normal / rain / snow + 環境溫度)¶
完整 schema 見 場地.md §8.3。
| weather.type | 溫度範圍 | 動態 patch |
|---|---|---|
normal |
-20°C ~ +40°C | 無 |
rain |
+2°C ~ +35°C | 雨 patch(半透明積水 trigger zone) |
snow |
-30°C ~ +2°C | 雪 patch(白色積雪 trigger zone) |
重疊 +2°C 給雨夾雪情境。
風力 / 雨雪 patch 公式:見 算式表.md §10.2–§10.3;環境溫度 → 零件散熱:見 算式表.md §6.1–§6.2(烘焙熱導+單次 backward-Euler 積分)。
設計理由摘要:
- 散熱(溫度):冷天溫差大散熱快、熱天溫差小散熱慢(算式表.md §6.1–§6.2 的熱導與積分自然涵蓋)。高溫場(如沙漠 50°C)→ part 過熱閾值更易達到 → 戰術重要性 ↑
- 風力:獨立於 weather.type,三天氣皆可設 0–10 N + 方向
- 雨/雪 patch:採 multiplier 而非 override,物理直覺(dirt + rain 自動產出「比 mud 還滑」)+ 湧現玩法
9. Settings(客戶端設定)¶
設定分為八大正式分類(另有可關閉的「開發者」項,為第 9 項、不計入正式八大)。/settings/:section? 未登入即可進入;同一頁依是否已有 / 已解鎖身分決定單項能力,不建立另一套訪客設定頁:
| 分類 | 項目 |
|---|---|
| 顯示 | 語言(4 種起步)、主題藝廊(主題系統.md)、特效品質(高 / 中 / 低)、色盲模式、UI 字級、減少動態效果、3D 算圖解析度(50%–100% 任意整數;50/75/100 只作快捷值)、反鋸齒(開/關);全數未登入可設定 |
| 音訊 | 主音量、音效音量、背景音樂音量;未登入可設定(槽位/轉場機制見 程式架構/audio-system.md;不提供玩家自訂 BGM) |
| 遊戲行為 | 鍵盤/手把 binding、遊戲時長提醒(預設關,可選 1 / 2 / 3 小時)、跟車距離(0.3–2.0 m,預設 0.5 m);屬裝置偏好,未登入可設定 |
| 網路 | 未登入可預先設定非敏感 Bootstrap/Pinning 節點與 UGC 本機分享保留,但不啟動 P2P;signaling session 與 TURN credentials 仍需身分/PIN 能力。UGC 保留是 ugcContribution.level 三值 off、standard、generous 的裝置偏好,後兩者需要 persistent storage |
| 隱私 | UGC 貢獻偏好與遊戲時長提醒資料的裝置儲存/無集中式遙測說明、IPFS 黑名單 CID 顯示、聊天顯示過濾開關與本機詞表;PeerId 顯示與身分分域收藏清單管理登入後才啟用 |
| 維護 | PWA/離線快取、已下載主題、儲存空間、清除 UGC 快取、重設裝置偏好與本機安全事件 JSON 匯出;私鑰/身分/玩家資料刪除需登入與 PIN |
| 帳號 | 未登入顯示建立/匯入身分;登入後提供 PIN 修改、登出、刪除本地資料(不影響鏈上)。助記詞只在建檔時一次性顯示並要求抄寫驗證;系統不保存助記詞本身,事後不可檢視或找回,但可由玩家主動在網路靜默守衛中輸入紙本並只驗證是否相符 |
| 關於 | 版本資訊(6 欄位,見 版本規範.md)、開源 license、social links、查看治理事件;公開唯讀 |
| 開發者(可關閉,第 9 項、不計入正式八大) | debug overlay、確定性檢查器、log 等級、snapshot checksum 顯示 |
3D 算圖解析度只縮放 renderer drawing buffer;CSS layout、HUD、文字、輸入 hit target 與無障礙 介面維持原生解析度。反鋸齒是獨立設定,不得以提高解析度代替。兩者只屬本機 presentation, 不得進入物理、共識、SavedState、replay hash 或輸入語意。GPU 上限造成安全截斷時,設定頁顯示 最近正式 viewport 回報的實際生效百分比。
設定值 persist 在裝置本地(localStorage / IndexedDB),不上鏈。裝置級偏好跨登入 / 登出保留;身分 secret 仍受 PIN 加密邊界保護。UGC 本機分享保留不要求身分,公開設定保存是純 action,不建立或重試 service。正常 AppShell lifecycle 可在未登入/離線建立唯一 networkless 本機 Helia storage authority,讓 LRU/pin/local CID 能力跨 online generation 存續;這不啟動 P2P。只有 authenticated online generation 新增 libp2p/Bitswap 並以 non-owning adapter 借用同一 storage identity。off 只取消額外 LRU 保留,並不保證 online app 不供應已持有 block。實作(AppSettings 資料模型 / 預設值 / 公開路由 / 能力式解鎖 / 即時生效規則)見 程式架構/settings.md。
9.1 遊戲時長提醒(可選功能)¶
- 預設關閉
- 玩家可在設定頁開啟,自訂提醒間隔(如每 1 / 2 / 3 小時)
- 提醒內容簡短(「您已遊玩 X 小時,建議休息」),不強制中斷
- 提醒設定與計時只存於目前裝置;本功能不新增集中式遙測
9.2 隱私聲明(顯示在「隱私」)¶
- UGC 貢獻偏好與遊戲時長提醒的設定/計時資料只存於目前裝置;Open4WD 不為這兩項功能新增集中式遙測
- 此聲明不涵蓋 authenticated online play、peer serving 與 signaling/TURN/peer 基礎設施;它們仍依既有邊界處理網路識別碼與傳輸中繼資料
- 所有資料由玩家自主決定上鏈
- IPFS 內容無法真正刪除,但本平台拒絕展示黑名單 CID
- 助記詞遺失 = 資產全失,不存在「找回」管道
- 日後紙本驗證只比較目前/指定 profile 的 PeerId,不保存輸入或驗證時間、不指出錯誤字位,也不在首次上鏈時強制執行。刪除本機身分前提供相同驗證,但玩家確認不可復原警告後仍可覆寫。
10. 視覺反饋(無 HUD 數值預警)¶
設計選擇:用視覺而非用 UI 數字呈現損耗:
| 狀態 | 視覺 |
|---|---|
過熱接近 thermalLimitC |
漸變色 mask(紅 / 黃) |
| fatigue 接近 1.0 | 弱層暈染 / 變形貼花 |
| broken | 立即破裂 / 失效 / 動畫 |
| 電量低 → 耗盡 | 電池色變(低電警示);耗盡 → 馬達停轉、失去動力(滑行,算式表.md §2) |
無 cooldown timer / 無「即將過熱」彈窗。HUD 僅顯示必要狀態(名次 / 圈數 / 電量等——欄位權威 賽內機制.md §2.4,無時速欄)。
11. 確定性(Determinism)¶
所有遊戲機制必須跨 peer / 跨 platform 一致:
- 物理運算 f32 fixed timestep 60Hz
- material lookup hash table O(1) 純函數
- Rapier collider handle → sub-mesh 固定索引(建構順序)
- 浮點累積 f32 跨 wasm build 一致
詳見 程式架構.md § 確定性 與 算式表.md 散見的 determinism 註記。
12. 場地系統¶
場地 GLB schema 見 場地.md §8;場地 Entity 見 零件與場景.md §10。本節規範 runtime 玩法行為。
12.1 跑道兩種模式¶
track.type |
結構 | 玩法行為 |
|---|---|---|
open(全場地跑道) |
route 恰 2 點(走廊關),無寬度約束 | 撞 mesh 純物理彈回(無懲罰);強制 lap_mode: linear、無圈數。無 Checkpoint = 自由跑、抵達 RPn 即勝(捷徑 / 繞遠 / 打轉皆不阻止);有 Checkpoint = 須依序通過全部才算抵達 RPn,checkpoint 間可走最短直線(無走廊約束)。 |
fixed(固定跑道) |
RoutePoint 序列(每點 width_m 全寬;RP1 = 起點、RPn = 終點,走廊開) |
車在表面時偏離 spline 中心線 > width_m / 2 → 觸發 §12.2 b-soft 處罰流程;空中段(無物理 contact)b-soft 關閉,重力自然兜底,落地後恢復。lap_mode: linear(RP1 ≠ RPn,到 RPn 結束)或 loop(RP1 = RPn,圈數由房間設定 1–10) |
loop 計圈:chassis COM previous→current 線段由 RPn.forward 平面後方掃掠到前方、交點落在 RPn 左右寬度內,且全部 Checkpoint 已依序點亮,才計 1 圈並重置 checkpoint;不設世界高度上限,也不使用步末速度。無 Checkpoint 的場地正向 swept crossing 即計圈;反向、側邊、共面與 teleport 通過不算(既不增不減)。詳見 建模參數 §5.4與§8.2。
12.2 脫離 / 掉出統一處罰流程(減速 + fade)¶
兩種「離開正軌」共用同一套懲罰流程,只在 fade in 落點分歧(依觸發嚴重度):
觸發(脫離 / 掉出,見下表)
↓
[減速階段 1.0s] 線性減速到 0
├─ 中途回到合法範圍 → 取消減速、恢復正常物理(保留當下速度)※ 僅「脫離」可能發生
└─ 完全停止 ↓
[Fade 階段 0.6s] fade out 0.3s → fade in 0.3s(落點見下表)
玩家恢復控制(總懲罰 1.6s)
| 觸發 | 適用 | 條件 | fade in 落點 |
|---|---|---|---|
| 脫離跑道(b-soft) | 僅 fixed,且車在表面 |
與 spline 中心線距離 > width_m / 2(沿弧長線性插值寬度,查 auto_route_polyline_3d 最近點) |
最後合法位置 + 該位置 spline 切線方向(就地放回、幾乎不退步) |
| 掉出場地 | open / fixed |
見 §12.3 三層判定 | 最近 RespawnPoint_<n>(無則 RP1 中心) |
「車在表面」判定:物理 contact(車身 / 輪子任一觸地)+ 100ms hysteresis(短暫跳起的小顛簸不切換狀態)。空中段(飛越坑洞 / 跳台凌空)b-soft 完全不檢核——重力會把車拉回地面,落地恢復 contact 後再恢復 b-soft;若落地偏離過大 → b-soft 立刻觸發。
為何落點分兩種:「脫離」你還在場內、可就地恢復,放回最後合法處最公平且不擾流;「掉出」你已離場不可恢復(且 open 無走廊,放回原地會被重力 / 慣性無限重摔),必須傳送到創作者指定安全點。共用的 1.6s 減速 + fade 不變。
「最後合法位置」(脫離用):玩家最後一次在跑道合法範圍內(在表面 + 距 spline ≤ width/2)的 (位置, 該位置 spline 切線方向)。多跑道合一個 BVH 查最近合法位置,不分跑道。多跑道刻意重疊合法範圍 → 全交叉區都合法,系統不阻止(設計者責任)。
12.3 掉出場地三層判定¶
「掉出」觸發(衝離場地有效範圍:懸崖、虛空、開放邊界)的判定,open / fixed 共用:
| 優先序 | 觸發 | 範圍 |
|---|---|---|
| 1. 創作者 KillZone | chassis COM previous→current 線段進入 KillZone_<n> box trigger;多區取最早 entry,teleport 不形成 sweep |
必須在場地 AABB 內(Stage 3 嚴格檢核) |
| 2. 重力方向 fallback | 玩家位置跨「沿重力方向投影 AABB + 5m buffer」 | 僅檢核重力方向(反方向不檢核) |
| 3. 橫向 | 不檢核 | 場地 mesh 自然處理(撞 mesh 反彈 / 飛出後第 2 層接手) |
判定成立 → 走 §12.2 統一流程,fade in = 最近的 RespawnPoint_<n>(無則 fallback:RP1 中心)。
設計理由:
- 重力方向必須兜底(玩家自然往這方向掉,沒兜底 = 無限墜落)
- 反重力方向不檢核(玩家跳起、被武器擊飛是正常物理,重力會自己拉回)
- 橫向不檢核(交給物理;要實牆 = 自己畫 mesh,要無邊際 = 不畫)
12.4 重力環境¶
場地 GLB 帶 physics.gravity_direction + physics.gravity_strength_m_s2(schema 見 場地.md §8.4,套用公式見 算式表.md §10.4)。
| 用途 | gravity_direction | gravity_strength |
|---|---|---|
| 月球感低重力 | [0, -1, 0] |
1.6 |
| 地球標準(預設) | [0, -1, 0] |
9.81 |
| 高重力場地 | [0, -1, 0] |
15 |
| 反重力 | [0, 1, 0] |
9.81 |
| 橫向重力(電梯間挑戰) | [1, 0, 0] |
9.81 |
| 斜向重力(永久側風感) | [0.3, -0.95, 0] normalized |
9.81 |
耦合:
- §12.3 三層 fall-out fallback 沿重力方向投影
- 車輛物理直接餵 Rapier gravity setting
- 雨/雪 patch 沿重力反向「貼地」生成
- 武器 launch 投射物受場地重力影響