跳轉到

D-20260816-01|等待房文字與賽中圖示訊息分層

背景與驅動力

等待房實作已讓 participant 與 spectator 共用 host-star chat,但舊 canon 同時描述 participant race chat、spectator 唯讀 race chat 與獨立 spectator chat,發話資格、傳輸拓撲及 UI 因角色和 頁面而分歧。賽中自由文字又不適合觸控操作,並擴大分心、洗頻及自由文字仲裁面;只修補既有 多條 chat transport 會繼續保留重複協議。

玩家需要在比賽中快速表達固定語意,同一語意也需要容許不同視覺主題、細微語氣與流行梗。 因此裁決必須同時定義訊息語意、圖庫資產、玩家九格、進房快取、participant 傳輸、spectator 接收及 HUD,而不能只新增一個按鈕。

考慮過的選項

  • 全生命週期共用自由文字 chat:等待房直覺,但賽中輸入、洗頻及角色權限問題仍在,否決。
  • participant 與 spectator 各保留獨立自由文字 chat:可維持舊頁面語意,但形成兩套協議、限流、 去重與檢舉邊界,否決。
  • 等待房共用已簽文字,賽中改為 participant 發送受審查圖示、spectator 唯讀接收(採納)。

決定

  • 房間仍在 waiting 時,所有 admitted participant 與 spectator 共用同一個文字聊天室;原始已簽 envelope 經 host-star 驗證及中繼。角色由權威 room snapshot 推導,participant 名稱以粗體與 文字 badge 辨識,spectator 使用一般字重與 spectator badge。
  • RacePage 不提供自由文字 composer,也不保留 spectator-chat gossip。賽中只有 canonical participant 可發送圖示訊息,participant 與 spectator 都可接收;spectator 只驗證及顯示來源 participant 的原始簽章 relay,不得發話或信任 source 重包後自報的 sender。
  • 中央語意目錄採只新增、不改義的 96 個 messageKey。圖庫可只覆蓋其中一部分;同一 key 可有 不同視覺與語氣資產。玩家選擇的是 packId + assetId + revision + digest 精確組合,接收者顯示 發送者所選資產,不以自己的圖庫替換。
  • 圖庫與網站 ThemeService 完全分離。首批 default-inspiredmoon-rabbit 只沿用網站兩個 美術方向作靈感,不隨網站 themeId 切換。正式資產為 256×256、含 alpha、無字、無商標、每張 最多 64 KiB 的 WebP;只有具公開散布權及 provenance、通過 decode、digest、尺寸與容量檢查的 pack 可進 Git。既已隨 Git 正式出貨,所有玩家皆可選用、發送、下載及觀看,不設資格閘。
  • 玩家在設定頁選九個不同 key 的精確資產,可跨 pack 混用。participant 完成 room admission 時 凍結並簽署該次 RaceMessageLoadout,等待房即預載固定名單缺少的九格資產;修改必須先離房。 賽內 3、2、1、GO 不讀設定、不重新凍結,也不重新裁決圖庫。
  • Wire 只傳 match、sender、凍結 loadout digest、slot index、sequence、message ID 與 timestamp, 不傳自由文字、URL 或可被替換的 key。participant 走 RaceMesh ordered app-control;收送兩端均 執行平均每 2 秒一則、burst 2 的逐 sender 限流,並驗 roster、簽章、sequence 與去重狀態。
  • 固定 HUD 依 canonical participant roster 為每位 sender 最多保留一條。新接受訊息立即取代同 sender 舊訊息並重新取得完整 5 秒;較舊 sequence 晚到不得覆蓋。participant 以單一圖示展開 3×3 九宮格,選取後嘗試發送並立即收合。

後果與影響

等待房保留可交談性,賽中則只有有界、免打字且跨角色一致的快速溝通面;原本 participant race chat、spectator race chat 與 spectator-chat gossip 收斂成一套圖示協議。固定九格與 admission 快照讓 wire 只需傳 slot,接收者仍能還原發送者選定的視覺語氣;資產缺失可用中央 label 與 core fallback,不阻擋 match-start、race-ready 或倒數。

代價是每個 participant 的九格資產需在等待房預載,新增 pack 也必須維持 immutable identity、 授權證據及容量檢查。此決策部分修訂等待房 star 拓撲、共用 RacePage 舊 chat 分工及 spectator 資料面的既有決策;拓撲、角色 admission 與 deterministic replay 本身不變。