你的等級終於有意義了
現在牌桌上的每個座位都能獲得經驗,第一次升級只需 60 點經驗而不是兩週的遊戲時間,等級還會授予段位和可收集卡片。

通俗版
經驗值曾經是一個什麼都不做的數字。遊戲裡沒有任何東西以等級為門檻,而且只有對局的獲勝者能拿到經驗——這意味著每張牌桌上大約三分之二的人打完整局、輸掉、看到「本局經驗 +0」,然後沒有任何理由認為這個數字與自己有關。
現在每個座位都有收穫。名次給經驗,遊戲結束時手上握有的壟斷給經驗,撐到最後沒被淘汰也給經驗。獲勝依然佔絕對優勢——一場勝利的價值超過最好的失敗結果的兩倍——但輸得漂亮不再一文不值。
| 你做到了什麼 | 經驗 |
|---|---|
| 贏得對局 | +200 |
| 第二名 | +50 |
| 第三名 | +30 |
| 第四名及以下 | +15 |
| 結束時持有的每組壟斷(最多 3 組) | +10 |
| 撐到最後沒有被淘汰 | +20 |
等級曲線圍繞這一點重做了。第一次升級現在需要 60 點經驗,一局像樣的對局就能達到——哪怕是輸掉的那種——而以前大約需要十天的遊戲量。之後的等級是逐步變貴,而不是一次性變貴。
等級現在還會授予兩樣東西。你的等級帶有一個段位——共 7 級,從「資格賽」到「大師」——顯示在個人資料和排行榜上你的名字旁邊。而跨過里程碑等級會掉落一張可收集的地產卡:等級 3, 5, 7, 10, 13, 16, 20,此後每 5 級一次。

技術細節
這件事有意思的一半是刪掉副本。舊規則——每 500 點經驗一級——被手寫進了五個資料庫遷移和三個 TypeScript 檔案,而且它們之間早已產生偏差:測試資料播下的等級,任何一個版本的規則都產生不出來。現在只有一條曲線、一個檔案,並在資料庫裡被精確鏡像:
// packages/game-engine/src/progression.ts — one curve, mirrored exactly in SQL
step(L → L+1) = min(60 + 100·(L−1), 1500)
level 2 3 4 5 10 16 17+
xp 60 220 480 840 4,140 11,400 +1,500 each算術刻意只用整數——不開平方根、不用浮點——這樣 SQL 與 TypeScript 在每一個邊界上都是完全一致而不是近似一致,並且有一個跑在真實資料庫上的測試逐值比對二者。兩條曲線都是單調遞增的,所以重算時沒有任何人在排行榜上超過別人。
做這件事的過程中翻出了三個已經上線一段時間、卻沒有任何測試抓到的缺陷:結算畫面的等級條讀的是本局獎勵而不是你的總量,於是每個等級的每個玩家看到的都是同一條凍在 40% 的進度條;贏下一局短局會被記成失敗,因此那些勝利從未推進過任何勝利任務;而在團隊模式裡,獲勝的隊友一分也拿不到並被記為落敗,因為兩名勝者中有一位按行號並不處在第一名。三個都已修復,且每一個都有一個不修就會失敗的測試。
