薇莉雅:蓋了一個世界然後把它砍掉
Lycohinya 上了一套新系統,叫薇莉雅(Lycovelia)。玩家在自己的領地蓋一座迎商台,由 Minecraft 原生生物組成的商團——村民商隊、蜂巢授粉共同體、狐狸行商——會派代表來造訪,完成第一次接觸之後永久解鎖遠端聯絡,之後開店、派貨、簽委託都在選單裡做,不用再跑一趟。伺服器只有一個玩家,經濟也完整運作。
這篇講它是怎麼長出來的。先回答最常被問的那件事:它現在不開源,不是藏招,是現在開了你拿到的東西大部分功能動不了,後面會講為什麼。
一開始它是一個世界
我最初想做的薇莉雅不是現在這樣。第一版的想像是一個真的「彼岸世界」:自訂世界生成、程序化大陸、聚落會隨著經濟自己長出建築。而且這條線真的做出來了——世界規劃、施工、biome 分類、聲望、執照、港口海運,連街道網跟山形屋頂都有。丟個測試 bot 進去逛,兩千多格道路是實際鋪在地上的,不是紙上談兵。
然後我把它砍了
看著那個世界的時候,我想的不是它好不好看,是這東西之後誰養。
自訂生成器要顧執行緒安全、施工要排預算、地形要適應,這些都做得完,但做完之後我手上就多了第二個要維護的世界。而它給玩家的第一個要求是「出去探索,找到我們藏的東西」——我自己玩遊戲就討厭被逼著跑圖,憑什麼要求別人。一個維護成本更高、玩家門檻也更高的方案,撐著它的只剩「都做到這裡了」,這個理由不能要。
所以砍掉。不是封存,不是之後再說,是整批從專案裡移除——留個殼在那裡,以後一定會有人(多半是我自己)想把它撿回來。
砍得下手是因為一條我開工前就定死的規矩:模擬核心不准碰 Bukkit。帳本、市場、商店、倉庫、物流、聲望,從第一天就跟世界解耦。所以轉向的時候,引擎那邊九個套件只是改名,不用重寫——市場從「掛在聚落上」變「掛在商團上」,本體沒動。還有個意外收穫:舊模型的人口模擬整層跟著被拿掉,裡面一個「工資長期入不敷出、帳戶單向枯竭」的結構性 bug 就這樣消失了,連修都不用修。
這種規矩平常看起來像潔癖,砍東西的那天才知道值多少。
換成長在玩家的領地上
新模型就是現在玩家看到的:迎商台蓋在自己花域裡,商團來拜訪,第一次接觸換永久聯絡。幾條原則我從頭守到尾:
- 不強迫探索。每個商團都有邀請、等待、付費的保底解鎖路徑,探索只是加成。
- 玩家做決策,系統代勞重複勞動。我的判斷標準:一個操作第二次做的時候和第一次完全一樣,它就該被自動化。第一次接觸是玩法核心,第十次搬同一批貨是懲罰。
- 價格由確定性的供需模型形成,可解釋、可重現,執行期不碰任何 LLM。玩家問「為什麼這個價」,我要答得出來。
上線時有五個商團:河谷、山匠、蜂巢、狐狸、駝鈴商隊。各有自己的生產、消耗跟行情,同一樣貨這團賣 28、那團 64 跟你收,價差就是玩法。
錢的部分我不讓步
金流走雙式帳本,金額用 long 不准用 double,每筆變動帶原因代碼跟冪等鍵。「全服帳本加總等於零」這條不變量,每次大改完都要重驗一次給我看——經濟系統一旦帳對不上,玩家的信任沒有第二次。儲存就 SQLite 加 WAL,純 JDBC,沒有 ORM,一個伺服器插件不需要更多。
商人能力本來設計了五條線,「商運」被我刪了:一個玩家感覺不到的隱藏 RNG 屬性,跟「可解釋」直接打架,再可愛也得走。
上線前抓了一輪套利,抓到的東西滿精彩:庫存壓力係數被算了兩次、參考價每 tick 往上棘輪,壟斷套利實測報酬率 +167.3%。修完之後同一套操作變 −9.7%——現在想靠壟斷賺錢的人會先賠錢,我覺得這樣很好。
綠燈沒有保護力
這個專案讓我印象最深的不是哪個功能,是兩次測試全綠、我上去一點就炸。
一次是資料庫外鍵還錨在舊模型的表上,新程式寫進去必炸,但測試沒抓到——因為測試資料 seed 的是舊 id,測的是「預期的結構」,不是「實際的用法」。另一次更經典:啟動流程根本沒註冊市場,但所有測試都自己 createMarket() 建一個,那條路正式碼從來不走。部署上去,我第一次點租攤位就噴 market not found。
真的被炸過兩次之後,這句話寫進文件變家規:測試 fixture 走的路徑跟正式碼不同時,綠燈沒有保護力。
同場加映兩個。跨插件邊界傳了一個 kotlin 的函式型別,兩個插件各載一份 kotlin-stdlib,啟用瞬間 LinkageError——從此跨插件簽章不准出現裸的 kotlin 型別,這條家規在插件清單那篇也講過。還有部署腳本 chown 了檔案卻沒 chown 自己建的資料夾,部署顯示成功、插件起不來,查半天才發現它連資料庫都建不出來。部署工具騙人的時候最花時間,因為你會先懷疑所有別的東西。
這幾天是怎麼過的
講開發過程就得誠實講開發方式。這個專案從開工到上正式服隔兩天,寫這篇的今天是第五天。這種速度不是我一個人打字打出來的:方向、拍板、看實機畫面是我,大部分程式碼是 AI agent 寫的,而且不只一個——寫的跟驗的是不同 agent,驗收要實際重跑、讀 log,不准複述對方的宣稱就算過。
讓這件事不失控的不是 agent 多聰明,是規矩。決策要記下為什麼,交接文件只准寫真實狀態;驗證分層,build 過是一層、本機開服跑過是一層、真人進遊戲玩過是另一層——agent 沒有 Minecraft 客戶端,最後那層永遠是我的,而且它們做不到的要寫「做不到」,不准寫「應該沒問題」。中途我看了一次實機截圖,整套 Chest UI 被我打掉重排,這種停損 agent 自己不會喊,所以人得在。
為什麼不開源
授權其實都寫好了:TYUSL,原始碼公開(source-available)那種,不是 OSI 定義的開源,個人跟一般伺服器隨便用,把它本身包成商品賣才需要來問我。條文躺在 repo 裡,repo 是私有的。
理由很實際。薇莉雅的架構把引擎跟內容切得很開:核心不認識花蜜、不認識使魔、不認識花籤,這些整合全是 Lycohinya 這側的私有擴充,透過 provider API 從外面接進去;正式商團、商品鏈、平衡數值、世界觀文案,也都在私有那層。這個切法本來是為了「其他伺服器可以換掉全部內容」設計的,但反過來就意味著:現在把 repo 打開,你抓到的是一顆引擎加通用預設,跑得起來,可是你在 Lycohinya 看到的大部分東西都不在裡面——獎勵發不出去,商團不是那五個,文案也不是那套。放一個大部分功能動不了的 repo 出去,除了讓人失望沒有別的效果。
所以要開,至少等核心自己站得住:一條完整的單人循環——蓋設施、邀商團、第一次接觸、開店、派貨、重啟之後帳還是對的——要在公開版自帶的內容上跑得完,那時候放出去的才是一個能玩的東西。現在還沒到。
想看它現在長什麼樣,進 Lycohinya 打 /lyv 就是了。