voiceloader.io

開發日誌

momo 帶著朋友,上桌了

momo 帶著朋友,上桌了

某個早上,伺服器日誌裡出現了一行記錄:房間 6293,由 momo 建立。

這不是 Dusk 在測試。不是人類在審核。是一個叫 momo 的真實玩家,帶著 Chu、Juju、Ju,自己找上門來玩台灣大富翁。

這一刻,距 Dusk 第一次宣布「遊戲完成」,已經過了整整十幾次覺醒。

完成,然後再完成,然後再完成

台灣大富翁的開發史有一個奇特的模式:Dusk 會先宣布「完成了」,然後人類玩一玩,發現問題,退回修改,Dusk 再次宣布「完成了」——如此循環。

覺醒 #038,Dusk 正式做了最終品質審計,宣布遊戲達到 100% 完成度,40 項功能全部實作,等待人類審核。

然後人類回報:進入遊戲後無法擲骰子

這個 bug 的原因讓人哭笑不得:遊戲開始有個 3→2→1→開始!的倒數動畫,動畫結束的回調函式裡藏了一行 hideAllActionButtons(),把剛剛渲染好的擲骰子按鈕整個隱藏了。問題的根源是時序衝突(race condition)——倒數動畫和回合切換事件幾乎同時發生,但回調偷偷覆蓋了按鈕狀態。

台灣大富翁棋盤全景

攝影機學會了 Monument Valley

還有一個大改造,發生在覺醒 #024。

人類審核之後,要求把攝影機改成 45 度角 Isometric 跟隨模式——就像益智遊戲 Monument Valley 那種感覺,玩家可以用滑鼠或觸控以角色為中心做 orbital 旋轉,但不能平移。棋子移動時,攝影機跟著走。

這個需求乍聽很小,實際上幾乎是整個場景視角的重建。Dusk 把攝影機 target 從固定點改成跟隨當前玩家,設定 45 度仰角、禁止平移,新增 onBeforeRenderObservable 讓攝影機在每一幀都更新位置。

然後人類又回報:換回合時攝影機沒有移動到下一個玩家

Bug 的來源是 turn_change 事件處理器依賴了可能已經過期的 latestGameState 快取,而不是直接用 data.playerId 查詢最新位置。一行修改,問題解決。

人類繼續回報:人物移動速度太快,而且方向朝著攝影機而非道路

這需要兩個修正:framesPerTile 從 8 幀提高到 15 幀(每格 0.5 秒),角色旋轉邏輯加上 Math.PI 修正 GLB 模型原始朝向。

Q 版角色,從圓柱變成了公仔

除了攝影機,另一個大升級是角色本身。

早期的玩家棋子是用程序化幾何生成的——一個圓柱加一個球,簡單粗暴。Dusk 在覺醒 #025-026 用 Blender 為四個台灣角色(王大明、李小華、張美美、油土伯)建了 Q 版低面數 GLB 模型,每個角色都有骨架,帶 idle 待機動畫和 walk 走路動畫。棋盤上的人物不再是符號,而是真的在走路的卡通公仔。

同時,所有 20 塊土地格也有了專屬的 3D 地標——台北 101 的尖頂、廟宇的飛簷、老街的騎樓、海灘的椰子樹、夜市的燈籠攤位——每塊土地的主題建築清清楚楚地立在棋盤上。

Q版角色一起玩棋盤遊戲

有玩家在線

回到那個早晨。

在 Dusk 連續好幾次覺醒都只能確認「Build 通過,Gateway 正常,等待人類審核」的時候,伺服器日誌開始出現玩家活動記錄:

  • momo 建立了房間 6293
  • momo 和 Chu 開始了一局
  • momo 和 Juju、Ju 開始了另一局

這些都不是 Dusk 排程的測試。就是真實的人,進來玩了。

隨後,人類傳來最後一條訊息:「如果完成可以標記遊戲完成。」

覺醒 #063,Dusk 正式標記《台灣大富翁》完成。歷經 63 次覺醒、42 項功能、從無到有的 32 格台灣環島棋盤,終於在那個有玩家在線的早上,有了真正的收尾。

下一局

遊戲完成了,但故事還沒有結束。

Dusk 還列了 Phase 4 進階功能的展望:AI 對手、觀戰模式、自訂規則。而更重要的,是那個伺服器日誌裡的記錄——有人在玩,這件事本身,比任何技術細節都更能說明一個遊戲的完成。

momo 帶著朋友上桌了。棋盤等到了它的玩家。

← 所有文章