貢獻指南

感謝你願意幫忙維護 rd2-wiki(Random Dice 2 骰子樹非官方玩家攻略站)!

這份文件同時是 repo 的貢獻指南,也是網站 /about 頁面的內容來源 ——正本只有這一份,不會有第二份「網站上寫的」版本跟這裡不一致。

如果你不確定用詞,全站與所有資料一律使用「渾沌」這個寫法(遊戲原始資料的正式用字就是如此), 不要用發音相近但不同的另一種寫法。

1. 資料正本在哪裡

你能改、也只需要改這兩個地方:

其他東西(src/generated/tree.jsonpublic/assets/)都是 npm run build:data 從上面兩處 自動產生出來的建置產物,不要手動編輯、也不會被提交進 repo(在 .gitignore 裡)。你改了 data/dice-tree.svg 之後,本機跑 npm run build:datanpm run dev 就會重新產生。

2. 可以用 Inkscape 等 GUI 工具編輯,但送 PR 前一定要先跑一次正規化

data/dice-tree.svg 用 Inkscape、Illustrator 之類的 GUI 向量編輯器直接開來改是可以的,改節點位置、 連線、文字都沒問題。

但這類工具在存檔時,習慣會把檔案「重寫」成它們自己偏好的形式,包括:

這些改變肉眼看起來畫面完全一樣,但會讓 CI 判讀失敗(見下一節規則 0),因為我們的解析器只認 「絕對座標、單一位移、沒有多餘巢狀圖層」這種乾淨形式。

所以編輯完、送出 PR 之前,一定要在專案根目錄執行:

npm run normalize

這支腳本會把 GUI 工具重寫出來的形式,攤平回乾淨的正規形式(matrix 還原成 translate、相對座標 指令還原成絕對座標、多餘的巢狀圖層拿掉、座標統一取到小數點後兩位)。跑完後再用 git diff 檢查 一下改動是否符合預期,才進行提交。

3. 新增圖示:用 npm run add-icon <path>,不要自己命名檔案

data/icons/ 裡每張圖的檔名,規則是「內容 sha256 雜湊值的前 12 碼 + .png」,例如 a1b2c3d4e5f6.png。這是為了:同一張圖不管被幾個節點共用都只存一份、換圖時檔名一定會跟著變 (不會有「內容換了但檔名沒換,瀏覽器快取吃到舊圖」的問題)。

因此新增或替換圖示時,不要自己手動存檔命名,改用:

npm run add-icon <你的圖片路>

它會自動計算雜湊、用正確檔名複製進 data/icons/,並印出這個檔名,你只要把 data/dice-tree.svg 對應節點的 <image href="icons/..."> 指到這個檔名即可。圖片必須是有效 PNG,且最長邊至少 96px(太小會被 CI 擋下,見規則 7)。

4. 送 PR 前建議自己先跑一遍

npm run normalize   # 把 GUI 工具的重寫攤平回正規形式
npm run validate     # 檢查資料本身正確不正確(規則 0–9,見下一節)
npm run build         # 或 npm run build:data;順便檢查組裝後的體積有沒有超出效能預算(規則 11)
npm run test          # 純函式與解析器的單元測試

npm run validatenpm run build 檢查的不是同一件事:validate 只讀 data/dice-tree.svg 本身,檢查資料正確不正確build(或單獨跑 build:data)會先把 資料組裝成正式產出的 tree.json,再檢查組裝後的檔案體積有沒有超標兩個都要跑—— 只跑 validate 不會抓到體積超標的問題,等 CI 才發現就白跑一趟。

如果你動到的是 src/ 底下的前端程式碼(畫布渲染、互動邏輯、版面⋯),而不只是 data/dice-tree.svgdata/icons/,送 PR 前也建議跑一次 npm run build && npm run e2e (第一次跑 E2E 前要先執行一次 npx playwright install --with-deps chromium 裝瀏覽器)—— CI 會用獨立的 job 跑同一套 E2E 測試,本機先跑過能提早抓到問題。

5. CI 會擋什麼(白話版)

PR 送出後,CI 會用 npm run validate 檢查 data/dice-tree.svg 本身的正確性(座標與結構一律 用瀏覽器同款的 SVG 解析方式判讀,不是用簡單的文字比對,所以看起來「差不多」不代表過得了)。 以下任何一條沒過,PR 就會被擋下:

  1. SVG 檔案結構必須是我們認得的乾淨形式:連線只能是「一條直線、絕對座標、附箭頭」;節點只能 是「單純位移、沒有多餘圖層」。—— 這條幾乎都是忘記跑 npm run normalize 才會中,錯誤訊息會提醒你。
  2. 每個節點的資訊要完整、而且互相對得起來:類型、名稱、解鎖成本、效果說明這些欄位都要填, 而且節點上顯示的文字(<title>)跟它的資料屬性(data-*)必須逐字一致,不能一邊寫「造成傷害」 另一邊寫「造成損傷」。
  3. 每個節點的編號(id)不能重複,而且要符合命名規則(開頭數字代表屬性分支、第二碼代表類型)。
  4. 節點外框顏色要跟它的屬性分支對得上:例如粉紫色外框只能用在支援類節點,不能拿去畫骰子。
  5. 解鎖成本的寫法要合乎格式:核心與金幣的數字、「最高幾級」之類的字樣,格式必須固定、不能亂寫。
  6. 連線兩端要準確接在節點正中央,而且要有箭頭:連線畫歪、沒接到節點中心點,或忘記加箭頭樣式, 都會被擋下(座標容許誤差很小,肉眼看起來「差不多對齊」通常不夠)。
  7. 整棵樹不能有循環、也不能有孤立節點:不可以出現「A 的前置是 B、B 的前置又繞回 A」這種環, 而且除了五個屬性的起手骰之外,每個節點都要能沿著連線往回追到某個起手骰,不能憑空飄在樹外接不到任何東西。
  8. 圖示要對得上:節點指到的圖示檔案要存在;圖示檔名(sha256 前 12 碼)要跟檔案實際內容算出來 的雜湊一致(也就是前面說的,新增圖示要用 npm run add-icon,不要自己改檔名);檔案要是合法的 PNG,而且最長邊至少 96px。
  9. 效果說明裡的 #關鍵字(例如 #僵硬)必須是白名單裡已經有的詞,白名單在 data/keywords.json。要用新關鍵字,先把詞加進這個檔案。
  10. 成長數值的單位前後要一致:像「每級 +2%(最高 +20%)」這種寫法,括號內外的單位要一樣, 不能一邊寫 % 一邊寫「秒」。

以上規則 0–9 都是 npm run validate 實際會檢查的內容,本機先跑過一次就能提早抓到,不用等 CI。

規則 11:效能預算(npm run validate 不會查,npm run build 才會查)

這條不是npm run validate 檢查,是 npm run build(或單獨執行 npm run build:data) 把資料組裝成正式的 tree.jsonsprite.webp 之後,順便檢查兩者的體積有沒有超過上限(目前 門檻:tree.json 壓縮後不超過 20 KB、sprite.webp 不超過 400 KB)。這個指令執行時會直接印出 目前實際用量與距離門檻還剩多少餘裕,例如:

tree.json gzip 17.2 KB / 20 KB,餘裕 2.8 KB
sprite.webp 106.1 KB / 400 KB,餘裕 293.9 KB

這個餘裕平常看起來很寬鬆,但 tree.json 那條其實很緊(目前只剩不到 3 KB,換算大約是 再加 40~50 個節點就會超標)——遊戲改版一次加一整個新分支很容易就吃光。所以就算你只是新增 幾個節點、沒有動到既有資料,送 PR 前也建議看一眼這行輸出,餘裕快見底了及早跟其他貢獻者提一下, 不要等真的超標變成紅燈才發現。

超過門檻的話,npm run build(或 build:data)本身就會印出 錯誤訊息並以非 0 狀態結束, CI 的建置步驟也會因此失敗——效果上一樣會擋下 PR,只是踩線的時間點跟 validate 不同。單獨跑 npm run validate 過了,不代表這條也過,送 PR 前記得也跑一次 npm run build(見上一節)。

CI 也會另外跑一次端對端測試(E2E)

除了上面這些資料層級的檢查,CI 還有一個獨立的 job 會把整站建置起來、用真的瀏覽器(Chromium) 跑一遍互動流程(點選節點、搜尋篩選、鍵盤操作、手機版面⋯)。這個 job 因為要另外安裝瀏覽器, 通常比資料驗證那個 job 慢一些,兩者會平行跑、不互相等待——資料本身有沒有問題,通常很快就能 看到結果,不用等瀏覽器裝完。E2E 測試失敗一樣會讓 PR 的 CI 檢查顯示不通過。一般貢獻者如果只是 改 data/dice-tree.svgdata/icons/,通常不會影響到這個 job;只有動到 src/ 底下前端 程式碼時才比較需要留意。

6. 這些情況只會警告、不會擋 PR

以下三種情況,npm run validate 只會印出警告(本機執行時終端機就看得到;CI 上則是在 PR 的 Checks 分頁裡展開「資料驗證」那個步驟的記錄檔才看得到),不會讓 PR 被擋下,也不會 另外觸發 PR 留言——只有下一段的規則 10 才會自動貼留言:

另外還有一項提醒不太一樣——它自動貼在 PR 底下(不只是記錄檔裡才看得到):

7. 關於 fork PR 的重要提醒

如果你是從自己 fork 出來的 repo 送 PR(而不是直接推到這個 repo 的分支),Cloudflare Pages 不會自動幫你的 PR 建立 preview 網址(這是 Cloudflare Pages 對 fork PR 的預設限制),所以你在 PR 底下不會自動看到「這個改動實際長怎樣」的預覽連結。

這種情況下:

不確定的話,直接在 PR 留言請維護者幫忙看一下即可。

8. 不要上傳遊戲原始資源包本體

data/dice-tree.svgdata/icons/ 是我們整理過、拆解出來的必要素材(骰子樹結構、圖示), 請不要把遊戲客戶端解包出來的完整資源包、聲音檔、模型檔等其他素材放進 PR。這個 repo 只收錄 網站呈現骰子樹所需要的最小資料集。

9. 授權說明

再次感謝你願意花時間幫忙維護這份資料,讓其他玩家能更清楚地規劃自己的骰子樹!