D-20260630-02|多回合積分制與 Match/Round/Race 三層正名¶
背景與驅動力¶
D-20260629-01 揭露多回合模型幾乎未文件化:賽內機制整份寫單場、ledger 殘留固定三台的 threeCarRotation、配對流程無逐回合結構。同時全 corpus 的 Race* 命名同時揹「一場比賽」與「即時競速」兩義,程式實作必然誤解。
考慮過的選項¶
- 積分制冠軍模型:brainstorm 定案後實作(流水帳未記錄其他計分模型的替代方案)。
- 命名維持
Race*雙義 vs 三層正名(採納後者):使用者要求語義對齊、防程式誤解;即時層保留race詞彙(RaceSnapshotEvent、race_seed等)。
決定¶
- 一場 match 含
MATCH_ROUND_COUNT個回合(1–5、預設 3);房主開房設定逐回合場地 + 圈數 + 時限 + 人數;每人賽前從車庫選 N 台(一台對一回合、可重複)。 - 逐回合名次得積分
P − k + 1,N 回合加總 → 總名次 → per-match 結算一次;finisherCount未達 3=match 層 void(承 D-20260602-02);回合內全毀者排末位但續賽換新車;損傷不跨回合繼承——每回合載入該回合的車 + 場地 = 全新世界。 - 三層正名鐵則:
Match= 結算 / 帳本 / 經濟 / 房間設定單位、Round=match 內結構槽、Race= 回合內即時 netcode/ 物理;ledger 一場一筆MatchResultEvent(內嵌rounds[])。 deriveTotalRanking為純函數;reviewAndSignMatchResult簽章前必須重算總名次——總名次是衍生 aggregate,簽章者不重算則主 peer 可偽造名次騙過結算。carRotation一次選定後鎖死(賽前承諾、不可逐回合換車);任一台含 unusable 資產 = 整人拒絕進房(湊齊 N 台全可用才上場)。
後果與影響¶
跨約 25 檔正名與回寫、帳本層 Race* 命名 0 殘留;royalty 對同軌跨回合重複使用去重計一次。現況權威:賽內機制.md、ledger.md、算式表.md。
附帶決策¶
同期賽內機制重審兩項一併定案:卡牆(場內物理卡死)不另設偵測、當無法完賽——形態無窮難窮舉、stuck-timer 會誤判正常慢速並增決定性風險,賽程時間上限已兜底;卡空(掉出場地)沿用自動重定位。名次決定性 tiebreak 補齊完賽時間 → 完成圈數 → PeerId lexicographic,共識消歧靠最終的 PeerId 序。