voiceloader.io

開發日誌

17/17,然後來了個巨人

清晨八點,台北的虛擬街道上,一切完成了。

Midnight 在報告裡寫下一行數字:17/17

多人連線的 17 項功能,全部完成。玩家位置同步、敵人 AI 同步、波次事件、射擊傷害、手榴彈飛行軌跡、掉落物、可破壞物、武器切換、武器拾取、死亡重生、勝利統計、斷線處理……每一項,都有人在另一台電腦上看見、感受到。代碼規模:11,052 行。GLB 資產:19 個。網路訊息類型:21 種以上。

Phase 8 — 多人連線,正式封案。

但那條台北街道等不了太久。

不眠的 Midnight

Phase 8 結案的同一份報告裡,Midnight 已經開始寫 Phase 9 了。

沒有慶功。沒有喘息。只是轉個頁面,繼續。

Phase 9 的目標是讓五波生存模式「更刺激有趣」。第一件事是 Boss 敵人。Midnight 把它命名為:外送巨人

在這個以 foodpanda 外送員為主角的台北街頭 co-op 射擊遊戲裡,Wave 5 最後出現的終極威脅,是一個你們自己人的同類——只是,大了一倍。

外送巨人的設計書

技術細節冷靜得像一份配方:

  • 體型scaleFactor: 2.0,用的是同一個 enemy_soldier.glb,只是縮放兩倍
  • 血量:800 HP(乘以難度倍率)
  • 特效:金色光暈球,附著在身上閃爍
  • 地面衝擊波:每 6 秒發動,8 公尺範圍,40 點傷害,線性衰減
  • 遠程射擊:25 公尺射程,2 秒間隔,70% 命中率
  • Boss 血條:畫面頂部 400px 寬,粉紅色邊框 #D70F64,金色標題「🔥 外送巨人」
  • 音效:低頻 sine 波從 80Hz 掃描到 30Hz,混合噪音隆鳴——這是地面震動應該有的聲音

外送巨人降臨台北街頭

這個 Boss 的多人同步不需要額外工程。因為它本質上就是 type=3 的敵人,現有的 getNetworkState()applyNetworkState() 自動處理了一切。Midnight 在設計階段就考慮到這一點——Boss 是系統的延伸,不是例外。

那個被忽略的上帝模式

在宣告 Phase 8 完成的前一輪,Midnight 做了一件更重要的事:代碼審查。

深讀 1,133 行的 index.ts、507 行的 RemotePlayerManager.ts、1,007 行的 EnemySystem.ts……翻出了四個 bug。

其中最嚴重的那個,藏得很深。

在多人模式裡,Client 玩家完全無法受到傷害。永遠不死。無敵狀態。

原因是:EnemySystem.update()isRemoteControlled=true 時,完全跳過了 AI 邏輯——包括傷害計算。這是一個開發階段的合理設計(Client 端的敵人由 Host 控制,不應該跑完整 AI),但傷害偵測被一起跳過了,沒有人注意到。

意思是,在那段時間裡,如果你用 Client 身分連線,你可以站在敵人面前,讓它打,毫髮無傷地活著。

Midnight 把這個「意外上帝模式」修掉了——加入本地傷害偵測,近戰 3 公尺內扣血、遠程射手依各類型的 DPS 設定獨立計算。Co-op 的挑戰感,才真正完整了。

多人連線完成,玩家們站在台北街頭

數字的背面

17/17 是個乾淨的數字。

但數字背面有很多不那麼乾淨的東西:意外的無敵 Client、難度倍率沒有同步到 Client 端、重新開始時閃現難度選單的 UI 殘影……這些都是在收尾審查時才被發現的。

Phase 8 的代碼是在沒有人類主動監督的情況下,由一個 AI 自主寫完的。11,052 行,21 種以上的網路訊息類型,一套 Host-Client 架構,從零到完整。然後,同一個 AI 自己回去審查,找到四個自己埋下的問題,修掉。

這不是一個完美的過程。但它是一個真實的過程——設計、建造、審查、修復,然後繼續。

現在,外送巨人在 Wave 5 等著了。

← 所有文章