世界上獨一無二的寶可夢

概覽

遊戲進行到一半,在遊戲自身開啟的一個視窗裡,玩家輸入幾個詞。遊戲仍在執行的同時,AI 把這些詞變成一種全新的寶可夢——立繪、名字、屬性、種族值、招式——並將其登錄為正式的種族。你會在草叢裡遇到牠,捕捉牠,替牠取暱稱,像養任何一隻寶可夢那樣把牠養大。

沒有任何東西是事先寫好的。最終留在存檔裡的那個種族此前從未存在過,別處也不存在。

遊戲一直以來提供的東西裡,有一部分是「做出屬於自己的東西」。但實際上,那意味著從一組固定的選項裡挑選。這個專案的存在,是為了檢驗生成式 AI 能否讓「屬於自己」變成字面意義上的真實——更關鍵的是,字面意義上屬於自己的東西,玩家是否真的會對牠產生依戀。

完整流程

一切從在橙華森林裡跟一位老婆婆搭話開始。你描述心裡想到的那種生物;在你繼續遊玩的過程中,這些詞被轉化成一個種族;幾分鐘後牠已經在草叢裡等著了——可以遭遇、可以捕捉,此後就跟遊戲裡其他任何東西一樣使用。全部都是當場生成的:名字、屬性、種族值、招式組合、正反兩面的戰鬥圖像,以及隊伍圖示。

橙華森林裡站著一對老夫婦。對話框寫著:說說看……你心裡想的是什麼樣的生物?
跟老婆婆搭話,一切由此開始。
標題為「想像中的生物:」的簡易對話輸入畫面,已輸入 BEAUTIFUL、ATTACK、FIRE 三個詞。
透過《綠寶石》內建的簡易對話系統,交給她六個詞。
玩家站在森林裡的草叢旁。對話框寫著:草叢在動……裡面有東西!
生成在電腦上跑幾分鐘。一聲叫聲提示牠已經準備好了。
戰鬥畫面。一隻頭頂帶火的紅色蜥蜴面對玩家。文字寫著:野生的 FLAMEREL 出現了!
火屬性蜥蜴 FLAMEREL,從搖動的草叢中出現。
戰鬥中,一顆寶貝球被扔向 FLAMEREL。
可以用寶貝球捕捉,跟其他種族一樣。
詢問 FLAMEREL 暱稱的命名畫面,已輸入 GGG。
可以取暱稱,跟其他種族一樣。
隊伍畫面上,生成的種族帶著自己的圖示,與三隻普通寶可夢並排。
帶著自己的圖示待在隊伍裡,跟其他種族一樣。
FLAMEREL 的寶可夢資訊畫面:火屬性、猛火特性、頑皮性格、在橙華森林以 7 級相遇。
狀態畫面正常運作,跟其他種族一樣。

完整一輪的紀錄在這裡: My Own Pokémon Generation — demo02

為什麼不是一個「生物產生器」

有意思的問題不在於 AI 能不能想出一隻寶可夢,而在於牠能不能想出一隻遊戲可以吸收、且吸收之後不會散架的寶可夢。放任不管的話,產生器給出的要麼是沒法用的東西——一隻種族值合計 900 的怪物,讓遊戲失去意義——要麼是讓人不適的東西:一張崩壞到讀不出是生物的圖像。

所以這裡的設計工作不是那隻生物,而是牠被生成於其中的那個空間:種族值的區間、招式合法性的規則、能在 64×64 圖像裡存活下來的剪影、玩家甚至被允許用來描述的詞彙。模型探索這個空間,但輪不到牠來定義這個空間。

這個專案正是我的設計哲學不再只是主張、而被拿去檢驗的地方:定義形塑設計空間的目標、價值、約束與邊界,讓生成在其中發生,然後看結果站不站得住。

框架本身就是研究對象

大型語言模型從不自由書寫。牠只是填充一個固定 schema 中的空位,而每一次輸出都會由一個驗證器重新檢查。違反規則的輸出會連同「具體違反了哪一條」一起被退回重新生成。

平衡約束讓遊戲保持可玩。種族值合計被限制在一個固定區間內——280 到 360,大致是御三家的水準——每項能力也各有範圍,超出區間的方案會被直接駁回。招式從 pokeemerald 的原始碼中自動抽取,再篩選到該種族自身的屬性或一般屬性,並去掉一擊必殺技、自爆類效果,以及固定傷害或威力過高的招式。剩下的集合還要接受合理性檢查:攻擊招式是否足夠、是否至少有一個與自身屬性一致的攻擊招式、高威力招式是否不超過一個。等級的分配由框架確定性地決定,而不是由模型決定。其餘一切都被固定下來——每種屬性一個特性、捕獲率、經驗類型、性別比例、招式學習器相容性——這樣個體差異就被限制在 schema 的空位之內,各次執行之間仍然可以比較。

外觀約束防止輸出崩壞。體型來自一份能在 64×64 圖像裡存活的剪影白名單:四足、齧齒類、鳥類、蜥蜴。顏色從一份具名的白名單中選取,圖鑑體色由此機械地導出。特徵限定為一到三個簡短的既定短語,並由一份封鎖清單排除人類特徵、血、武器與文字。最終提示詞由框架自己組裝,並附上一段固定的結尾:只有一隻生物、全身、解剖結構合理、沒有多餘肢體、表情平靜。

牠是有效的,而且能看到牠生效的過程。在一次被記錄下來的執行中,模型提出的種族值合計是 380;驗證器退回了三次——380、360、340——直到方案落在區間之內的 320。

執行方式

遊戲本身什麼也不生成。做事的是電腦上常駐的一個 Python 行程,兩邊透過一個檔案信箱交談,而 mGBA 裡的一段 Lua 腳本每一影格都去查看牠。

  1. 文字。本機模型(qwen3:8b)把詞語變成一份經過驗證的種族紀錄。
  2. 圖像。圖像模型先畫出一張參考插畫,再據此生成三張角色一致的視圖:正面戰鬥圖像、背面圖像,以及隊伍圖示。
  3. 轉換。把畫量化到一份共用的 15 色調色盤上,並轉換成 pokeemerald 的圖像格式。
  4. 編碼。圖像變成 GBA 的二進位資料:4bpp 與 1bpp 的圖塊、gbapal 調色盤,以及與 BIOS 相容的 LZ77 壓縮。
  5. 注入。把二進位資料寫入 ROM 中預留的區域。

在執行時寫入卡帶,意味著正在執行的實例不必重啟就能接收到這個新種族;同樣的位元組序列也會寫到磁碟上,所以這個變更在重新載入之後依然存在。

出現的東西是持久且不可撤銷的。牠會在世界裡遊蕩:逃跑也好、戰敗也好,牠都留在世界裡。一旦把牠打倒,就永遠沒有了。

實作

產生器、約束框架、GBA 編碼器,以及遊戲端的修補程式,全部公開: github.com/takafumihoriuchi/my-own-pokemon-generation

後記——關於依戀

這個原型了結的是一個技術問題。在牠後面的,才是我真正在意的問題:一隻為你而生成、別處並不存在的寶可夢,最終會比遊戲裡原本就有的那些更有分量嗎?

從玩自己做的這個版本來看——樣本數為一,不值得讀出更多——似乎有兩個條件在左右這個答案。

遊戲之外有一個例子同時說明了這兩點。我用手工的方式和 ChatGPT 反覆來回,直到自己滿意為止,設計了一個屬於我自己的種族——花狐(Hanagitsune)。我對牠有依戀。因為那是我做出來的,而不是我要來的;而且做出來的東西越過了品質的門檻。

花狐正面:一隻淡綠色的狐狸,尾巴是一串垂落的開花藤蔓。 花狐背面,可以看到開花尾巴的完整長度。
花狐——森林的守護者,尾巴上開滿了花。牠跑過的地方會長出草與花,即使在貧瘠的土地上也能喚來新的生命。人們把牠的身影看作森林正朝著自己的未來生長的徵兆。

這兩個條件都是可以著手的。更深的製作過程——選擇、修改、否決——能推動第一個;更好的模型與設計得更用心的提示詞框架,能推動第二個。接下來要去的就是那裡。

所以這個原型的結果不是對那個問題的判決,而是把那個問題變成了可測量的東西:兩個如今可以刻意去改動、並加以觀察的變數。

作為個人研究,基於 pret/pokeemerald 的反編譯成果製作。不散布任何 ROM、ROM 修補檔或遊戲素材,此處所有圖像均為 AI 生成的原創作品。寶可夢是任天堂、Creatures Inc. 與 GAME FREAK Inc. 的商標;本專案與這些公司沒有關聯,也未獲得其認可。