M4:兩層成長——局內升級三選一與局外永久進度
Roguelite 之所以讓人「再一把」,是因為兩層成長交織:局內爆發成長,局外緩慢積累。這一篇談怎麼把這個迴圈做出來。
局內成長:XP 寶石與升級三選一
殺怪掉藍色 XP 寶石。寶石的生命週期是個小小的手感設計:
- 彈出:死亡點向上拋物線噴出
- 落地漂浮:落到地面後上下浮動、自轉
- 磁吸:玩家靠近到一定距離,寶石加速飛向玩家(越近吸越快)
- 收集:碰到玩家 → 發
xpGained
磁吸這步是純視覺距離判定,不進物理世界——幾百顆寶石也不卡。
集滿一級 → timeScale = 0 暫停整個遊戲 → 跳出三選一升級卡。暫停讓玩家從容選擇,也是個天然的喘息點。
稀有度權重抽卡
升級池有十幾種詞綴,分 common / rare / epic 三個稀有度。抽三張用「加權不重複抽取」:
// 每張卡按稀有度權重,抽出後從池中移除,避免重複
const choices = weightedDrawWithoutReplacement(pool, 3);
詞綴例子:攻擊力、攻速、移速、吸血、翻滾冷卻、處決傷害、技能強化…。它們乘進一個 PlayerStats 的倍率系統,戰鬥與技能計算時讀取。組合不同詞綴 = 不同流派(吸血肉盾、暴擊爆發、技能流…)。
三個主動技能
除了普攻,三個帶冷卻的主動技能(對應 HUD 圖示):
| 鍵 | 技能 | 效果 |
|---|---|---|
| 右鍵 | 旋風斬 | 全周 360° AOE |
| Q | 衝刺斬 | 朝面向位移 + 路徑傷害 + 無敵幀 |
| E | 震地擊 | 大範圍重擊 |
技能傷害吃 skillPowerMult、冷卻吃 skillCdMult,所以升級詞綴也能強化技能。每幀回報冷卻給 HUD 畫冷卻遮罩。
局外成長:靈魂貨幣與永久升級
死亡結算時,依「擊殺數 + 爬到第幾層 + 深度」換算成靈魂貨幣,存進 localStorage。回到基地(Hub)後,靈魂可以買永久升級:
- 基礎 HP(+12 / 級)
- 基礎攻擊(+6% / 級)
- 移動速度
- 貪婪(靈魂獲得加成,越買賺越快)
// localStorage key: fable5game.meta
{ souls: 240, levels: { hp: 3, dmg: 2, swift: 1, greed: 1 } }
永久升級在開新局時套用到 PlayerStats 與最大 HP 上。這層成長讓「失敗」也有產出——就算這把死了,靈魂留著,下把更強。這正是 Roguelite 比純 Roguelike 更黏的關鍵。
場景流
基地 Hub(永久升級商店) → 爬塔 Run → 死亡結算(發靈魂) → 回基地
HUD、Hub、升級卡都是 DOM overlay。這裡踩過一個坑:HUD 用 innerHTML 重設根節點,會把後來 append 的 Hub/升級卡洗掉——所以建構順序很重要,HUD 必須最先建。
到這裡,完整的上癮迴圈成形了。下一篇進入最戲劇化的部分:BOSS 戰。