跳轉到

遊戲機制

本檔角色:除 賽內 / 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_wbattery_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 並自動切觀戰;batterymotor 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 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 三值 offstandardgenerous 的裝置偏好,後兩者需要 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 投射物受場地重力影響