向經典寶可夢遊戲致敬,而不借用它們
《寶可夢 金》《銀》與《水晶》(Pokémon Gold、Silver、Crystal)讓玩家走的每一步都經過同一支常式:每 256 步讓隊伍裡的蛋往孵化前進一格,每 512 步提高隊伍的親密度,每 4 步讓中毒的寶可夢受傷;《寶可夢 綠寶石》(Pokémon Emerald)則依即時時鐘讓樹果分四個階段長大,從種下到結果要 4 到 96 小時,還讓一句兩個詞組成的話每天漂移 5 點,並從一份存檔傳到另一份存檔。1234 這些是機制,而機制正是致敬可以保留的東西。紀錄則說明了它不能保留什麼:這份紀錄中 2016 到 2024 年間被撤下、或在收到撤下通知後下架的每一款同人遊戲、每一套工具組與每一個論壇,都建立在寶可夢自己的名稱、美術或程式碼上,或是連結到這樣的遊戲;5678 而唯一一件為機制而打的官司,也就是 2024年9月18日在東京提起的 Palworld 訴訟,所依據的專利,其請求項要求的是瞄準並投擲捕獲道具、顯示捕獲可能性的指示器,或在半空中登上可騎乘角色。910111213 所以我讀了四份反編譯原始碼來看系統,讀了請求項與法院報導來看界線,並為我們的 app Kiradex 寫了一份規格書:保留走路、時鐘、卡片、落差、每週大廳與會傳播的那句話,而其中每一個像素、每一個字與每一個數字都由它自己畫出、自己寫出。
重點摘要
- 走路就是貨幣。 兩套引擎都讓大地圖上的每一步經過同一個函式,蛋、親密度、中毒、除蟲噴霧(Repel)、狩獵地帶(Safari Zone)與再戰全都聽它的;節拍很粗(4、128、256 與 512 步),所以獎勵是以事件的形式出現,而預算是以步數而不是秒數來花:狩獵地帶一趟 500 步,三種除蟲噴霧分別是 100、200 與 250 步。1214151617
- 時鐘讓一週有了形狀。 《水晶》在 4 點、10 點與 18 點切分一天,在週二、週四與週六舉辦 20 分鐘的捕蟲大會(Bug-Catching Contest),每週五抽一次幸運號碼(Lucky Number)並對照您擁有的每一隻寶可夢,並在午夜重設 16 個每日旗標;《綠寶石》在日期改變時執行十一項更新,並在您回來時依經過的分鐘數讓樹果生長。18192021223
- 地位是要給別人看的。 《綠寶石》的訓練家卡片(Trainer Card)會隨四顆星的每一顆改變顏色,每一顆代表不同類型的遊玩;一個箱子以 6 乘 5 的格子放 30 隻;對戰開拓區(Battle Frontier)的對戰塔、對戰宮殿、對戰競技場或對戰工廠的一次挑戰是 7 場對戰(對戰巨蛋的一場錦標賽是 4 場,對戰管道一趟是 14 個房間,對戰金字塔一次攀登是 7 層),而對戰塔的 Frontier Brain 出現在連勝的第 35 場與第 70 場。232425
- 別人的世界會來到您的世界。 紀錄混合(record mixing)會在存檔之間複製 5,188 個位元組:20 個秘密基地(Secret Bases)、25 個電視節目欄位(其中 20 個保留給只能以這種方式到來的節目)、5 句流行語(trendy phrase)與一筆對戰塔紀錄;每五位玩家中有一位一開始就遇到 Hipster,他每次到來都會教您一個隱藏的詞。262728
- 版權、商標與專利是三條不同的線。 Uranium 的開發者在 2016 年表示沒有任何人聯絡過他們,並在收到撤下通知後撤下遊戲;Prism 在 2016年12月21日收到停止侵權函;Relic Castle 在 2024年3月據報收到 DMCA 通知後下線;Palworld 是唯一的專利案件,2025年11月縮小到只針對遊戲的舊版本,仍在請求禁制令,截至 2026年10月4日沒有任何裁決的報導。5682930
- 致敬遊戲保留了類型,捨棄了名稱。 我檢查的六款致敬遊戲與 Palworld 的 Steam 商店說明中,沒有一份寫出「Pokémon」;它們的開發者在訪談裡則把它當作影響來源,自在地談起。3132
- 這帶給 Kiradex 什麼。 一份規格書,不是一個 build:窗台上一盆每走 256 步廣場步數就長一次的植物、依 app 自己的時鐘送來的晨間木箱、收藏者卡片上的四顆星、路線上一道單向落差(由高度與路線的文章來決定)、每週大廳裡每七次參賽就得到一枚大廳玫瑰章,以及一句在廣場之間傳播的兩個詞的話;每一項都寫明它不得相似於什麼、以及一個測試能執行的檢查,再加上一份 app 絕不能做的事的清單。讀了四份專利,沒有對計步器或時鐘做專利檢索,也沒有律師:這是一位開發者的解讀,不是法律意見。33
1.「那種感覺」是由什麼構成的,以及我如何量測它
這篇文章談的不是《紅》、《金》或《紅寶石》裡的生物,而是它們周圍的那些時刻:回家路上孵出來的蛋、週五的廣播節目、變成金色的卡片、在一個連線的午後之後,朋友的秘密基地出現在您自己的遊戲裡。那些時刻是系統,而系統就是這篇文章的主題。這個系列先前的文章量測了圖塊、人物與建築;這一篇量測的是那些讓一個口袋裡的世界在卡匣關機時仍感覺活著的迴圈,接著讀那些愛著它的遊戲周圍的法律紀錄,最後寫下我們自己的城鎮可以借用什麼、絕不能借用什麼。343536
Kiradex 是一個卡片掃描器,旁邊有一座像素小鎮 Kiradex World:一個由 16 像素圖塊構成的廣場,收藏者在其中走動、說預設的台詞、展示他們的卡片。34 它掃描的卡片是真正的寶可夢卡片,而這正是這篇文章必須小心的原因。app 自己的規則早在這些研究之前就寫好了,已經寫明「nothing of theirs in the world」(世界裡不放任何屬於他們的東西):沒有生物、沒有訓練家、沒有捕獲裝置、沒有道館或徽章設計、沒有音樂、沒有「Poké-」開頭的名稱。37 這篇文章要回答的是下一個問題:像我們這樣的城鎮,可以從那麼多收藏者從小在其中長大的遊戲裡拿走什麼,而我們又怎麼知道?
方法
前半部是從原始碼讀出來的,不是從 wiki;只有一段,也就是談寶可夢全能競技賽(Pokéathlon)的那段是例外,而那段也會這樣說明。pret 專案維護著 Game Boy 與 Game Boy Advance 遊戲的反編譯專案:能重建每款遊戲的 C 與組合語言,其 README 列出它所重現的每一個 ROM 的 SHA-1,遊戲的常數都有名稱,有些地方還帶著逆向工程者寫下的註解。我用了其中四個的淺層複製,各自停在 master 分支的一個 commit:pokered 在 d2704a6(2026年9月22日提交)、pokecrystal 在 5beda23(9月29日)、pokeemerald 在 731ad5b(10月1日)、pokefirered 在 037335f(9月26日)。38 一支腳本 measure_systems.py 會印出第 2 到 6 節引用的每一個常數及其檔案與行號,並導出各項計數(43 種樹果的各階段時數、電話與再戰欄位、電視節目種類、每日旗標);另一支 measure_map_features.py 會走過《綠寶石》的每一張地圖,把每個布局的格子對照其圖塊集的屬性表,並依地圖類型計算斷崖、限定自行車與高草叢的格子數,以及可砍的樹。3839 來自這兩支腳本的數字是量測所得;至於什麼時候觸發什麼,那些描述是我對它們所指向的程式路徑的解讀。凡是反編譯專案帶有註解之處,我也會讀它所描述的程式碼,因為兩者可能不一致:在《水晶》的步數常式裡,呼叫端的一則註解說親密度每 256 步上升一次,而它呼叫的那支常式每隔一次呼叫才動作,所以第 2 節依循程式碼。2 《紅寶石》與《藍寶石》不在這些複製之中;這篇文章凡是提到它們的地方,都是從《綠寶石》與《火紅》中解讀《紅寶石》或《藍寶石》存檔的程式碼讀出來的。23
後半部是在 2026年10月4日抓取並儲存的:Nintendo 與 The Pokémon Company 自己的新聞稿與規則頁面、Pocketpair 的公告、Google Patents 上的三份日本專利與一份美國專利(日本專利的請求項附 Google 的英文機器翻譯,美國專利的請求項則是專利本身的英文)、六款致敬遊戲與 Palworld 的 Steam 商店紀錄,以及具名媒體附日期的報導。第 7 到 11 節的每一項說法都註明出自哪份文件或哪家媒體。凡是無法存取的頁面,我都會說明。凡是我自己得出的結論,我都會標明是我的。
這篇文章的任何內容都不是法律意見。我是一位讀過這些文件的開發者;我沒有就其中任何一點諮詢過律師,而且我讀的是四份專利,不是這些公司的全部專利組合。
這篇文章背後的研究是 Kiradex 儲存庫裡的一份研究檔案,每一項事實都附有 URL,每一個由腳本產生的數字都標有 [measured];這篇文章是那份檔案的可讀版本,而第 14 節就是它的規格書。33
2. 計步器:走路就是貨幣
掌機遊戲有一個玩家從不停止的動詞。兩套引擎都讓它經過單一一個函式,其他一切都聽這個函式的,而讀這兩個函式,是看出舊遊戲的生命有多少是用步數支付的最快方法。
《金》《銀》《水晶》:CountStep
在《水晶》裡,大地圖上的每一步都會經過 engine/overworld/events.asm 裡的 CountStep。它會跳過連線房間,先讓一通待處理的特殊電話或一瓶除蟲噴霧的失效使用這一步,然後遞增一個中毒計數器與一個一位元組的步數計數器,再依計數器的值動作。反編譯專案裡的註解說明了每個分支做什麼:「Every 256 steps, increase the happiness of all your Pokemon」(每 256 步,提高您所有寶可夢的親密度);「Every 256 steps, offset from the happiness incrementor by 128 steps,」(每 256 步,與親密度遞增錯開 128 步)遞減蛋的孵化計數器(程式碼把計數器與 $80,也就是 128 比較);「Every 4 steps, deal damage to all poisoned Pokemon.」(每 4 步,對所有中毒的寶可夢造成傷害)1 這三則註解的第一則描述的是呼叫,不是結果。它所呼叫的常式,也就是 engine/events/happiness_egg.asm 裡的 StepHappiness,開頭有它自己的註解「Raise the party’s happiness by 1 point every other step cycle」(每隔一個步數週期,讓隊伍的親密度提高 1 點):它讓第二個一位元組計數器在 0 與 1 之間切換(and 1),每隔一次呼叫就什麼都不做直接返回,所以隊伍的親密度每 512 步提高 1,蛋則略過。2 關於蛋的那則註解以一個限制作結:計數會停在第一個「one that is ready to hatch」(準備好要孵化的那一顆)。engine/pokemon/breeding.asm 裡的 DoEggStep 依序走過隊伍,把每顆蛋的計數器減 1,一旦某個計數器到達 0 就立刻返回;接著 CountStep 把這一步交給孵化腳本,而隊伍裡排在後面的蛋就等下一個節拍。40 每一步 CountStep 也會為寄放在培育屋的兩隻寶可夢各加 1 點經驗值,最後它還會計算自行車的步數。1
自行車是這支常式裡最妙的一個玩笑。在《金》《銀》《水晶》裡,自行車店把一台自行車借給您,店主的號碼會存進您的電話;一旦您在電話訊號範圍內騎了至少 1,024 步,他就會打電話給您,而自行車計數器會停在 65,535 飽和,不會繞回。1 這台自行車是一則您騎著走的廣告,而遊戲會計算您有沒有騎著它被人看見。
《綠寶石》:TryStartStepCountScript
《綠寶石》在一步上掛了更多東西。在 src/field_control_avatar.c 裡,TryStartStepCountScript 依序推進:再戰計數器、一個親密度計數器、遙遠的小島(Faraway Island)計數器、中毒、蛋的孵化、異常天氣的結束、一道打開洞窟入口的點字謎題、五通由腳本觸發的電話、狩獵地帶、凌波號(S.S. Tidal)的走廊,以及 Match Call。中毒每 4 步咬一次(%= 4),但在秘密基地裡絕不會。14 親密度並不是穩拿的。每 128 步(計數器以 %= 128 維持),遊戲會為每個隊伍欄位各呼叫一次 AdjustFriendship,而這個函式在「50% chance every 128 steps」(每 128 步有 50% 機率)這則註解底下,當 Random() & 1 為真時就提早返回;所以隊伍中的每隻寶可夢(蛋除外)各自擲一次硬幣,只在贏下的節拍上獲得親密度:平均每 256 步一次。1415
蛋有自己的時鐘。培育屋的步數計數器是一個位元組,到達 255 時觸發並繞回,所以每 256 步,隊伍裡的每顆蛋(在下述限制之內)會少一個孵化週期;如果隊伍裡有帶著火焰之軀(Flame Body)或熔岩鎧甲(Magma Armor)特性的夥伴,則少兩個。《綠寶石》也以它自己的形式有同樣的限制:迴圈會跳過被標記為資料損毀的蛋(MON_DATA_SANITY_IS_BAD_EGG),而當它遇到一顆計數器已經是 0 的蛋時,就停下來孵化那顆蛋,所以隊伍裡排在後面的蛋要等下一個節拍。培育屋也在同一個 256 步的節拍上擲骰決定是否產下新蛋,條件是第二隻親代步數的低位元組到達 0xFF。41
是預算,不是計時器
另一種步數是預算,只花一次。狩獵地帶是最清楚的例子。在《紅》《藍》裡,入口收費 ¥500,交給您 30 顆狩獵球,把 502 寫進步數計數器,然後自動帶您往園區裡走三步;《綠寶石》則把計數器設為整整 500。16 《紅》為什麼從 502 而不是 500 開始,程式碼沒有說,而我也沒有實際執行遊戲去數那三步裡計數器算了幾步。除蟲噴霧也是預算,從《紅》到《綠寶石》都沒變:除蟲噴霧 100 步、白銀噴霧(Super Repel)200 步、黃金噴霧(Max Repel)250 步。17 再戰在第三世代變成了預算:拿到五枚徽章之後,《綠寶石》的再戰計數器會累積到 255 步,在下一次載入地圖時,那條路線上隨機一位訓練家可能會想再打一場;《火紅》《葉綠》的對戰搜尋器(VS Seeker),也就是那個向訓練家要求再戰的裝置,要再走 100 步才能再次使用。42
一步能換到什麼,以每次事件所需步數表示;由 figures.py 依 measure_systems.out.txt 繪製。43
為什麼它行得通
從程式碼裡可以導出三個設計上的結果,而它們正是值得保留的部分。
一切都在粗節拍上。 兩個世代的蛋都是每 256 步前進一次;第二世代每 512 步提高親密度,第三世代每 128 步讓隊伍裡每隻寶可夢擲一次親密度的硬幣。玩家從來看不到數字跳動;他們看到的是偶爾發生的事件,一則蛋在動的訊息,一隻突然變得更親近的寶可夢。一位元組計數器是 Game Boy 最便宜的時鐘,而依我的解讀,它也正是獎勵感覺起來像天氣、而不像進度條的原因:您看不到它,所以會注意到它。《綠寶石》的硬幣讓這個天氣變得名副其實:同樣一段路,可能提高親密度,也可能不會。121415
預算靠移動來花,不是靠等待。 狩獵地帶的 500 步與除蟲噴霧的 100、200 或 250 步,只在您走路時才會花掉。停下來閱讀、思考,或是放下主機去吃晚餐的玩家,什麼都不會損失。1617 對一個每隔幾分鐘就會被放下的手機 app 來說,這是比倒數計時更好的約定。
走路是一種社交訊號。 自行車店的電話是遊戲注意到您騎著它的自行車出門,而《綠寶石》的再戰計數器讓一條路線「記得」您離開過又回來了。142 依我的解讀,計步器最深的把戲在於:它讓世界回應玩家的存在,卻不要求玩家做任何事,只要人在那裡就好。
這些都不需要生物:一個計數器、一個節拍、一筆預算。版權不及於操作方法,而計數器正屬於這一類;44 至於有沒有人持有以步數驅動的機制的專利,是我沒有檢索的問題,第 14 節也會這樣說明。第 14 節把這個計數器花在一盆植物上。
3. 時鐘與行事曆:一週有了形狀
《金》《銀》在卡匣裡放了一個即時時鐘,而設計者把它花在約會上。《綠寶石》保留了時鐘,並把約會移到一份會自己往前走的行事曆上。兩者合起來,是我所知道最有力的論證,支持一個在您離開時仍會改變的世界。
一天的三個時段
《金》《銀》《水晶》把一天分成三段:早上從 04:00 到 09:59,白天從 10:00 到 17:59,夜晚從 18:00 到 03:59。常數是 MORN_HOUR 4、DAY_HOUR 10 與 NITE_HOUR 18,而 TimesOfDay 表帶著註解「0400-0959 morn | 1000-1759 day | 1800-0359 nite」。一張未使用、數值為 20、40 與 60 的 BetaTimesOfDay 表,在反編譯專案裡就保留在它旁邊。18
Kiradex 已經在計時,而且刻意不用那些時刻。它的 Daylight.Phase 是早上 6 到 9 點、白天 9 到 17 點、傍晚 17 到 20 點,其餘為夜晚,並有它自己的四個光線層級;第 14 節的規格書維持這樣不變。45
在固定星期幾的約會
國家公園的捕蟲大會在週二、週四與週六舉行:入口的腳本只檢查這三天,其他日子一概不算。比賽持續 20 分鐘的真實時間,發給 20 顆公園球(BUG_CONTEST_MINUTES 20、BUG_CONTEST_BALLS 20),而一個每日旗標會阻止同一天第二次參加。19 《水晶》在午夜重設 16 個每日旗標,兩個各八位元的位元組:鋼石(Kurt)的球製作、捕蟲大會、大量出現、樹果樹、剪毛、百貨公司的招式學習器、招式教學者,以及其他。20
幸運號碼節目是每週一次。一個倒數到下一個週五的計時會選出一個新的五位數號碼;遊戲把它與您擁有的每一隻寶可夢身上的訓練家 ID 比對,包括隊伍裡的與全部 14 個箱子裡的,從最右邊的位數開始比對;五位全中是頭獎,三或四位是二獎,兩位是三獎。21 您電話裡的二十四位訓練家,每一位都有一個星期幾與一個時段可以打電話約再戰,每個星期幾分到三或四位,第 6 節會再回到他們。46
《水晶》的一天與一週,以及 app 自己的一天;由 figures.py 依 measure_systems.out.txt 與 Daylight.swift 繪製。43
《綠寶石》的行事曆
每當日期改變,《綠寶石》就在 UpdatePerDay 裡執行十一項「每日」更新:清除每日旗標;推移流行語;讓電視節目與大量出現老化;天氣;寶可夢病毒(Pokérus);幻影之島的號碼;小田卷博士(Professor Birch)的狀態;兩位對戰開拓區的角色,各一次呼叫;淺灘洞穴(Shoal Cave)的道具;以及樂透號碼。同一個檔案在玩家站在寶可夢中心裡時會跳過這一切。22 《綠寶石》具名了 12 個每日旗標,其中 9 個是某人送的免費樹果:華麗大賽的大廳、三位路線上的角色、樹果大師與他的妻子、水靜市(Lilycove)、花店,以及琉璃市(Sootopolis)。其他三個是秘密基地、樂透彩券,以及徒弟(Apprentice)離開。47
一座以真實小時生長的花園
第三世代的樹果樹有幾個階段:種下(Planted)、發芽(Sprouted)、長高(Taller)、開花(Flowering)與結果(Berries),再加上活動樹用的「閃亮」(sparkling)階段,而存檔保留 128 個樹的欄位。48 生長依即時時鐘的分鐘數進行,不是依步數:UpdatePerMinute 把經過的分鐘數交給 BerryTreeTimeUpdate,每個階段持續 stageDuration × 60 分鐘,而結果階段持續四倍長;然後樹會在發芽階段重新長起,沒採收的樹果就此消失(berryYield = 0),最多重新生長 10 次之後才被清除。3 當一次交給它的分鐘數達到 71 個階段長度時,樹也會被清除,這是我對 minutes >= GetStageDurationByBerryType(tree->berry) * 71 的解讀:對一個階段長一小時的樹果來說,大約是離開三天。3
在 43 種樹果的定義中,stageDuration 為 1 小時的有 5 種,3 小時 12 種,4 小時 1 種,6 小時 11 種,12 小時 1 種,18 小時 5 種,24 小時 8 種,所以從種下到第一次結果要 4、12、16、24、48、72 或 96 小時。3 澆水每個階段記錄一次,共四個旗標,而產量是從一個隨澆水階段數上升的區間裡隨機抽出:完全沒澆水就給樹果的最低產量,每多一個澆了水的階段,區間就從最低往最高移動四分之一,抽出的值再四捨五入(CalcBerryYieldInternal)。3 把這個函式套到 43 種樹果的產量範圍上逐一列舉:最高產量不超過最低產量加二的 33 種,四個澆水階段永遠給出最高產量;其他 10 種的產量是 2 到 6 或 3 到 6,四個澆水階段給出最高產量或少一個,而產量 2 到 6 的樹果,澆一個階段給 2 或 3,兩個給 3 或 4,三個給 4 或 5,四個給 5 或 6。49
《綠寶石》的樹果要多久;由 figures.py 依 measure_systems.out.txt 裡的 stageDuration 計數繪製。43
這個構想比 Game Boy Advance 活得更久。《心金》《魂銀》(HeartGold、SoulSilver)的寶可夢全能競技賽,我沒有量測,只從 Serebii 的指南得知:每輪三個項目之後會給「plus 100 points if you came in first」(若得第一名加 100 分),而它的商店販售的道具「change each day」(每天更換)。50
為什麼它行得通
一週有了形狀。《金》《銀》把時鐘花在約會上:一週三天的比賽、24 位各自在某個星期幾的某個時段才聯絡得到的訓練家、週五的抽獎、16 件在午夜重新出現的事。19462120 《綠寶石》把約會變成了漂移:流行語每天移動 5,大量出現持續 2 天,新聞倒數 4 天,樹果需要 4 到 96 小時。451273 依我的解讀,結果就是一個在卡匣關機時仍在改變的世界,而這正是重新開機的全部理由。
有兩個細節對手機很重要。《綠寶石》拒絕在寶可夢中心裡執行當天的更新,所以有一個安全的房間,在那裡沒有任何東西會在您腳下改變。22 而樹果的生長是在您回來時依經過的分鐘數計算出來的,不是靠一個必須持續運轉的計時器,所以您不在時樹仍然在長。不過它不會等您:成熟的果實在樹上停留四個階段長度後就會掉落,對一個階段長一小時的樹果而言是四小時,而離開 71 個階段長度就會清除這棵樹。3 這也是我希望我們的 app 運作的方式:在到達時依時鐘算出世界的狀態,絕不依賴一個在手機放在口袋裡時還得持續運轉的計時器。第 13 節談 API 那一面。
4. 拿來給人看的東西:卡片、箱子、連勝與抽獎
舊遊戲給了地位一個實體的形式,而每一種形式都是別的玩家看得見的東西。
訓練家卡片與它的星星
《綠寶石》的訓練家卡片會隨星星數改變顏色:沒有星時是綠色,接著是青銅、紅銅、銀,四顆星時是金色。《火紅》《葉綠》的關都卡片則依序是藍、綠、青銅、銀、金。23 《綠寶石》的四顆星寫在 CountPlayerTrainerStars 裡,是四項彼此無關的成就:進入名人堂;完成豐緣圖鑑;水靜美術館裡掛滿全部五幅大師級華麗大賽的畫作;以及擁有全部對戰開拓區的標誌。23 當《綠寶石》讀取一張來自《紅寶石》或《藍寶石》的卡片時,它改用 GetRubyTrainerStars 計算星星:名人堂、豐緣圖鑑與畫作仍然算數,而對戰塔超過 49 連勝(battleTowerStraightWins > 49)取代了開拓區標誌。23 《火紅》《葉綠》為連線對象建立的卡片,算的是名人堂、關都圖鑑、全國圖鑑,以及合計一顆星的兩個無線小遊戲:摘下 200 顆樹果與連續跳 200 次。52
這張卡片也是一個社交物件。它帶著一段簡易會話(Easy Chat)的自我介紹、上限 9,999 的連線對戰勝敗、交換次數、與朋友一起的華麗大賽與寶可方塊次數,以及您首次登上名人堂的時間,上限是 999 小時 59 分 59 秒。23
為什麼它行得通。 四項耗時的成就,分屬四種不同類型,每一項都會為您連線時別人看到的那個東西重新上色,所以那個顏色隔著一個房間就認得出來。《火紅》把四顆星中的一顆花在和朋友一起玩上。卡片上沒有任何東西是買來的;依我的解讀,正是這一點讓一張金色的卡片值得拿出來給人看。
電腦裡的箱子
儲存空間隨世代增長。《紅》《藍》有 12 個箱子、每箱 20 隻,共 240;《金》《銀》《水晶》14 箱、每箱 20 隻,共 280(日文版定義每箱 30 隻);《紅寶石》《藍寶石》《綠寶石》14 箱、每箱 30 隻,共 420,每個箱子是一個 6 乘 5 的格子,有名稱與桌布。24 一個 30 格的箱子和卡冊的一頁是同樣的構想:一個固定的格子,獎勵的是整理排列,而桌布讓它既是一份清單,也是一個房間。
緞帶與代幣
《綠寶石》定義了 32 個緞帶 ID:一個冠軍緞帶;20 個華麗大賽緞帶,五個類別各四個等級;Winning、Victory、Artist 與 Effort;以及七個贈禮緞帶。一枚讓寶可夢的緞帶數超過四的緞帶(程式碼測試 GetRibbonCount(...) > NUM_CUTIES_RIBBONS,而那個常數是 4),可以產生一個關於它主人的電視節目,前提是有空的欄位,而且還沒有這樣的節目在等著;這個節目建立時是關閉的(active = FALSE,原始碼的註解說要經過紀錄混合傳遞之後才會啟用),所以要等紀錄混合把它帶到另一份遊戲裡,它才會出現在電視上。532754 遊戲城的代幣上限是 9,999(MAX_COINS)。55 代幣是這篇文章裡第 14 節唯一斷然拒絕的系統,理由和 Nintendo 毫無關係:使用 Kiradex 的有兒童,36 而它的世界背後那份關於收藏的研究,早已排除了隨機付費道具,以及任何形狀像吃角子老虎的東西。33
對戰塔與開拓區的連勝
在對戰塔、對戰宮殿、對戰競技場或對戰工廠的一次挑戰是 7 場對戰;對戰巨蛋的一場錦標賽是 4 場(DOME_ROUNDS_COUNT 4),對戰管道一趟是 14 個房間(NUM_PIKE_ROOMS 14),並非每一間都是對戰,而對戰金字塔一次攀登是 7 層。FRONTIER_STAGES_PER_CHALLENGE 7 是一個共用常數,不是每個設施都遵守的規則。連勝計數到 9,999。25 每個設施的 Frontier Brain 出現在連勝的固定位置,先給一枚銀標誌,再給一枚金標誌。frontier_util.c 裡的那張表不能照字面讀:檢查時會把每個設施各自的修正值加到目前的連勝上,再拿總和與表比較(winStreak + modifier == value)。對戰塔、宮殿、競技場、工廠與管道的修正值是 1,所以 Brain 是第 35 場對戰,而不是贏了 35 場之後的那一場;對戰巨蛋的修正值是 0,它的連勝計算的是贏得的錦標賽,對戰金字塔也是 0,它的連勝計算的是通過的樓層。25
| 設施 | 連勝計算的是 | 銀 Brain | 金 Brain |
|---|---|---|---|
| 對戰塔 | 贏得的對戰 | 第 35 場對戰 | 第 70 場對戰 |
| 對戰巨蛋 | 贏得的錦標賽 | 第 5 場錦標賽 | 第 10 場錦標賽 |
| 對戰宮殿 | 贏得的對戰 | 第 21 場對戰 | 第 42 場對戰 |
| 對戰競技場 | 贏得的對戰 | 第 28 場對戰 | 第 56 場對戰 |
| 對戰工廠 | 贏得的對戰 | 第 21 場對戰 | 第 42 場對戰 |
| 對戰管道 | 通過的房間 | 第 28 個房間 | 第 140 個房間 |
| 對戰金字塔 | 通過的樓層 | 通過 21 層之後 | 通過 70 層之後 |
來源:frontier_util.c(那張表與那項檢查),以及各設施的腳本(看每種連勝計算的是什麼),由 measure_systems.py 與人工閱讀。25
對戰塔的里程碑是最乾淨的形狀:七場一組,頭目是第五組的最後一場,並在第十組再出現一次。連勝本身就是內容;頭目是標點符號。
獎勵收藏規模的抽獎
《綠寶石》的樂透屋每天抽一個新號碼,並把它與您擁有的每一隻寶可夢(隊伍與箱子)身上的訓練家 ID 比對,從最右邊的位數開始;程式碼寫著「do not calculate ticket values for eggs」(蛋不計算彩券值)。兩、三、四或五位相符,分別給 PP 提升劑、學習裝置、活力塊或大師球,而一個每日旗標限定一天一張彩券(FLAG_DAILY_PICKED_LOTO_TICKET)。56 《水晶》每週的幸運號碼也以同樣的方式給三個等級的獎:兩位數字相符,三或四位,以及五位全中。21
為什麼它行得通。 抽獎把箱子變成了彩券。您擁有的每一隻寶可夢都算數,包括帶著其他訓練家 ID 的交換來的寶可夢,所以一份龐大、多樣、經過交換的收藏,名副其實地更幸運。它也是一場抽獎,而抽獎讓獎勵變得隨機,這正是這個系列對外觀物品的規則「never random, never on a countdown」(絕不隨機,絕不倒數計時)所拒絕的;第 14 節把它排除在外。36
5. 會記得的地面:斷崖、可砍的樹與兩台自行車
城鎮之間的路線有自己的一套詞彙:單向的邊緣,以及在您打得開之前就看得見的鎖。我用 measure_map_features.py 在《綠寶石》裡數過它們,這支腳本逐格讀取每張地圖的布局,並在圖塊集的屬性表裡查出每一格的行為。這些計數是格子,不是地形特徵:一道長長的斷崖是許多格,而被好幾張地圖共用的布局只算一次。39
斷崖是路線上的手法
在《綠寶石》41 個路線布局、共 87,787 格中,有 726 格單向斷崖(MB_JUMP_* 行為)與 2,777 格高草叢;41 條路線中有 21 條有斷崖。前四條路線分別有 13、17、24 與 13 格斷崖。斷崖也出現在 9 個城市布局(34 格)、地下(215 格)與室內(48 格),而 7 個城鎮布局裡一格都沒有。39
《綠寶石》依地圖類型的斷崖格數;由 figures.py 依 measure_map_features.py 的輸出繪製。4339
斷崖讓玩家可以快速往下走,並迫使回程走另一條路,所以一條短短的路線裡就有一個迴圈。城鎮是人們生活、玩家抵達的地方,從來沒有斷崖。
提早看見的鎖:可砍的樹與兩台自行車
《綠寶石》放置了 33 個可砍的樹物件,22 個在路線上,11 個在室內,大多在道館的謎題裡。39 兩台自行車把關的是不同的地面。限定越野自行車(Mach Bike)的格子,也就是泥濘的斜坡與裂開的地板,路線上有 52 格、地下有 150 格;限定特技自行車(Acro Bike)的格子,也就是軌道與顛簸的斜坡,有 85 格,全都在路線上。39 越野自行車會在三段速度之間加速(sMachBikeSpeeds = {NORMAL, FAST, FASTEST});特技自行車則把按住 B 加上方向的操作讀成特技:翹孤輪與兔子跳。57
為什麼它行得通
在您打得開之前就看得見的鎖,是一種承諾。可砍的樹與限定自行車的地面,在第一次走過時讓玩家看到一條捷徑,並在之後的某一次兌現;而《綠寶石》的兩台自行車加上兩種上了鎖的地面,讓選擇哪台自行車變成選擇這一趟要看見哪一半的捷徑。3957 斷崖為方向做了同樣的事:往下又快又免費,往上則是另一條路。
斷崖也是這篇文章裡唯一一處,我們先前的一個決定會反過來施壓。建築研究拒絕了斷崖,理由是無中生有的高度在俯視視角下很難讀懂,而建築那篇文章也把「a one-way ledge」(一道單向斷崖)列在城鎮所沒有的東西裡。3533 一格高、單向的落差並不是無中生有的高度:它沒有 z 軸,只是行走圖裡一條單向的邊。所以規格書提出一個收窄的形式,並把決定留在它該在的地方,交給還沒寫的高度與路線兩篇文章。
6. 別人的世界:紀錄混合、流行語與電話
這一節裡的系統,是我最想放進廣場的,因為它們關乎其他玩家,卻不需要其他玩家在同一時刻上線。
秘密基地與紀錄混合
《綠寶石》的一個秘密基地最多放 16 件擺設;玩家的臥室放 12 件;而一份存檔保留 20 個基地,您自己的,加上您從其他玩家那裡收到的。58 從哪裡收到?從紀錄混合:當兩位玩家連線並混合紀錄時,遊戲會在存檔之間複製一份 0x1444 位元組、也就是 5,188 位元組的紀錄。它的欄位依序是全部 20 個秘密基地、25 個電視節目欄位、新聞、紫堇市老人(Mauville Old Man)、5 句流行語、培育屋的郵件、一筆對戰塔紀錄、一件贈禮道具、水靜市的女士、兩位徒弟,以及對戰開拓區的排名大廳紀錄(ranking-hall records)。26
所以在一個連線的午後之後,朋友的基地就在您的遊戲裡,您可以走進去。他們的電視節目在您的電視上播放。他們的對戰塔紀錄也一起過來了。依我的解讀,《綠寶石》裡感覺活著的東西,大多是從別人那裡來的。
電視
《綠寶石》的電視有 25 個節目欄位:5 個給關於您自己遊玩的節目,20 個給只能透過紀錄混合到來的節目。有 11 種「一般」節目,以及 19 種只透過紀錄混合存在的節目(Trend Watcher、Secret Base Visit、Lotto Winner、Spot the Cuties 等),再加上大量出現的報導;新聞事件要倒數 4 天才會播出。27 通關之後,您打完的每一場對戰,不論有沒有抓到東西,都有 1/200 的機率(rbernoulli(1, 200))排入一則大量出現的報導,除非那是連線、狩獵地帶、對戰開拓區或其他特殊對戰,或是電視 25 個欄位的前 24 個裡已經有一則大量出現的報導(檢查在最後一個欄位前一格就停止),而且只有在您自己節目的 5 個欄位中有空位時才會發生。報導要等一天才能播出(daysBeforeOutbreak = 1,由每日更新倒數),而大量出現本身要到您在電視上看了那則報導才會開始,那會呼叫 StartMassOutbreak;從那時起它持續 2 天,讓報導的寶可夢佔一條路線上一半的遭遇(probability = 50)。51 大量出現的節目和其他節目一樣會透過紀錄混合旅行,所以朋友那邊的大量出現可能會來到您的電視上。5126
流行語:一句有半衰期的話
「卡那茲(Dewford)流行語」是卡那茲集會所裡的人們不斷重複的兩個簡易會話詞。dewford_trend.c 開頭的註解區塊本身就是一份設計文件。每句話都有一個流行度,「Initialized as a random value between 30-127 inclusive」(初始值是 30 到 127 之間、含兩端的隨機值);「If a submitted phrase is less trendy than the current one it won’t be accepted」(若提交的話不如目前那句流行,就不會被採用);而一句「boring」(無聊)的話會「lose trendiness over time until it reaches 0,」(隨時間失去流行度,直到 0 為止)然後再回升到它的最大值,在那裡它又再次變得無聊。4 程式碼對這條採用規則有兩個例外。一份存檔有史以來提交的第一句話,如果這份存檔從未混合過紀錄,就會直接取代目前的詞,完全不比較;而當新的一句與目前那句流行度相同時,最大值較高的勝出,如果最大值也相同,就由擲硬幣(Random() & 1)決定。4 每日更新會依經過的每一天讓每句話移動 5 點(clockRand = days * 5)。4 保留五句話,依流行度排序;當您混合紀錄時,您的話會被對方的話取代,「unless the phrase is the same, in which case the version with a higher trendiness value is used.」(除非是同一句話,那時採用流行度較高的版本)4
Hipster 與隱藏的詞
流行用語(Trendy Sayings)是另一回事:一組隱藏的簡易會話詞群,共 33 個詞。28 反編譯專案的註解說明了怎麼取得它們:它們「normally inaccessible,」(平常無法取得)而「The Hipster can unlock one word each time he is received via record mixing (and once if he is the player’s default Old Man).」(每次透過紀錄混合收到 Hipster,他都能解鎖一個詞;如果他是玩家預設的老人,則解鎖一次)28 紫堇市老人有五種(Bard、Hipster、Trader、Storyteller、Giddy),而您的遊戲一開始是哪一種,由訓練家 ID 的最後一位數決定:(trainerId % 10) / 2。所以只有當那一位數是 2 或 3 時,Hipster 才是預設的:五位玩家中的一位。其他所有人都得和這些玩家之一混合紀錄才能遇到他。28
電話再戰與來電
《水晶》的電話可以存 10 位聯絡人(CONTACT_LIST_SIZE 10)。二十四位訓練家可以準備好再戰,各有一個每日旗標;10 位可以打電話來說他們有道具要給您;而這 24 位每一位都有一個星期幾與一個時段可以讓您打給他們,早上 9 位、白天 7 位(《水晶》一天中的第二個時段,10 點到 18 點)、夜晚 8 位,每個星期幾分到三或四位。46 來電是有配給的:一個計時器(ReceiveCallDelays)在您每接到一通電話後設為 20 分鐘,每次計時結束而沒有來電時就縮短為 10、5,再到 3 分鐘,它把關一次原始碼註解為「50% chance for a call」(50% 機率來電)的擲骰;來電者從那個時段可聯絡的人當中抽出,而您站在出入口上或訊號範圍外時不會有來電。59
為什麼它行得通
別人的世界會來到您的世界。 五 KB 就載著 20 個基地、20 個欄位的別人的電視,以及 5 句話。2627 這些都不需要對方在您玩的時候在場;只需要您曾經遇過他們一次。
流行語是一種有半衰期的傳染。 在一份存檔的第一句話之後,新的一句只有在勝過目前那句時才會佔領一座城鎮,會隨著變無聊而淡去,並透過接觸傳播;當兩份存檔相遇時,同一句話中較流行的那一份勝出。4 這是用寥寥幾個數字構成的一套完整社交機制:一個分數、一個漂移、一條接觸規則。
Hipster 是刻意設計成稀有的。 五位玩家中有一位擁有他;其他人透過擁有他的人遇見他,而每次相遇都能教會 33 個隱藏詞中的一個。28 詞彙本身變成一種在人與人之間旅行的收藏品。
打擾是有配給的。 一通來電要經過一個計時器與一次擲硬幣的把關,而且您站在門口時絕不會打來;剛接完一通電話後,等待時間最長,20 分鐘。59 依我的解讀,一個會跟您說話的世界,只有在它很少說話的時候才迷人。
7. 三條不同的線:版權、商標、專利
從這裡到第 11 節都是紀錄:Nintendo 與 The Pokémon Company 對什麼採取過行動、依據什麼理由,又放任了什麼。把這三種保護分開來看很重要,因為談論抄襲寶可夢的人,通常指的是其中一種,得到的回答卻是另一種。
版權保護的是表達。 美國版權局的通告第 33 號(Circular 33)把想法、程序、流程、系統與操作方法排除在版權之外;具體的圖塊、sprite、音樂、文字與角色則是受保護的表達。4434 這個系列的第一篇文章在它的常見問題裡也這麼說,並已在 10月4日更正為明確指出是版權:風格、方法與系統不受版權保護;具體的表達才受保護。34 依我的解讀,第 2 到 6 節的一切都是方法:一個計步器、一個時鐘、一張帶星星的卡片、一句有分數的話。
商標保護的是標識。 The Pokémon Company 自己的日文網站寫明「ポケットモンスター・ポケモン・Pokémon」是 Nintendo、Creatures 與 GAME FREAK 的商標。60 用一個名稱來銷售產品,是商標問題;用同一個名稱來描述某樣東西是什麼,就像一個掃描寶可夢卡片的 app 必須做的那樣,則是指示性使用(nominative use),我們自己的世界文件把它描述為其他每一個卡片 app 的做法,而這也正是 Kiradex 的規則早已劃下的界線。37
專利保護的是一個逐步請求的方法。 日本與美國都曾核准 Nintendo 與 The Pokémon Company 的專利,其請求項是遊戲程式,以程式讓電腦做什麼來描述。1161 一項專利請求項是一串步驟;依我的解讀(這不是法律意見),一項請求項要涵蓋一款遊戲,條件是那款遊戲執行了其中的每一個步驟(每個步驟都依法院的解釋來讀),或是執行了它的均等物,而兩國的法院都承認均等。美國最高法院逐步適用這套均等論,「to each of the individual elements of a claim,」(及於請求項的每一個個別要件)而日本最高法院在 1998 年列出了一項在某一部分與請求項不同的產品仍落入其範圍的條件。6263 所以改變或移除一個步驟,是主張改過的遊戲落在請求項之外的一個論點,而不是一個結果:它是否落在外面,取決於那個解釋以及均等,而在這裡唯一的一件案子裡,還沒有任何法院做出裁決。第 9 節會讀與此相關的四項請求項。
下面的紀錄依三者之中每一件案子是以哪一種為依據來分類。只有一件是專利案。
依日期與依據排列的紀錄;由 figures.py 依第 8 與第 9 節引用的附日期頁面繪製。43
8. 同人遊戲、一套工具組與一個論壇:什麼招來了行動
Pokémon Uranium,2016年8月:撤下通知,而據開發者自己的說法,他們沒有收到信
Uranium 常被描述為一款收到停止侵權函的遊戲;Aftermath 在 2026年10月1日刊出的一篇同人遊戲專題說它「was reportedly issued cease and desists from the legal teams at Nintendo and The Pokémon Company.」(據報收到了 Nintendo 與 The Pokémon Company 法務團隊的停止侵權函)64 它的開發者當時的說法並非如此。Kotaku 在 2016年8月13日報導,在九年的開發之後,製作它的玩家已經移除了所有下載連結,並全文刊出他們的聲明:「After receiving more than 1,500,000 downloads of our game, we have been notified of multiple takedown notices from lawyers representing Nintendo of America.」(在我們的遊戲獲得超過 1,500,000 次下載之後,我們得知代表 Nintendo of America 的律師發出了多份撤下通知)還有:「While we have not personally been contacted, it’s clear what their wishes are, and we respect those wishes deeply.」(雖然沒有人直接聯絡我們,但他們的意願很清楚,而我們深深尊重這些意願)Kotaku 補充說,開發者表示他們「haven’t received any cease & desist letters from Nintendo’s lawyers yet.」(還沒有收到 Nintendo 律師的任何停止侵權函)5 我們自己的世界文件原本寫的是停止侵權函;準確的說法是 Uranium 是在收到撤下通知後被撤下的,而且這個名稱就在它的標題裡。375
Pokémon Prism,2016年12月:發售前四天的停止侵權函
Prism 在性質上不同:它不是一款仿寶可夢風格的新遊戲,而是《水晶》本身的 ROM 改版,製作了八年,預定在聖誕節當天發布。Kotaku,2016年12月29日:「Nintendo hit them with a cease and desist four days before release,」(Nintendo 在發布前四天對他們發出停止侵權函)而一切「seemed ready for an official release until December 21st, when representatives of Nintendo sent a cease and desist to the project.」(看起來都已準備好正式發布,直到 12 月 21 日,Nintendo 的代表向這個專案發出了停止侵權函)創作者隨後關閉了他的網站,那個網站同時也託管另外兩個 ROM 改版:Pokémon Brown 與 Rijon Adventures。6 Nintendo Life 在隔天的報導有相同的日期,以及預定的 12 月 25 日發布。65 一份塗黑過的信件掃描檔由第三方張貼在 Internet Archive 上,上傳者說是一位 Prism 的貢獻者寄給他的;上傳者的說明帶有論戰色彩,而我沒有讀過那份掃描檔,所以它是一條通往那份文件的線索,而不是這篇文章的來源。66
Pokémon Essentials,2018年8月:一套工具組
Essentials 是一套用 RPG Maker 製作類寶可夢遊戲的免費工具組。TechSpot,2018年8月29日,承接 Ars Technica 的報導:Nintendo 發出了 DMCA 撤下通知,託管該工具組 wiki 的 Fandom 照辦,而下載也從 PokéCommunity 的同人遊戲區被移除。TechSpot 自己的解讀是「the assets Pokemon Essentials uses appear to be identical to the ones in Pokemon games.」(Pokemon Essentials 使用的素材看起來與寶可夢遊戲中的完全相同)7
Relic Castle,2024年3月:一個論壇,以及一位從未被確認的發送者
我們自己的研究簡報把 Relic Castle 和 Essentials 歸為同一批,當作 2018 年的撤下。33 其實是 2024年3月。GamesRadar+,2024年3月22日:這個自 2014 年起運作的同人論壇下線了;它的聲明寫道「the Relic Castle website has been taken down following a DMCA takedown notice.」(Relic Castle 網站在一份 DMCA 撤下通知之後已被撤下)GamesRadar+ 指出,這個網站「didn’t host these games directly,」(並沒有直接託管這些遊戲)但允許連結到它們,而通知是誰發出的並未獲得確認。8
同人專案是怎麼被注意到的,由注意到它們的律師親口說
Don McGowan 曾是 The Pokémon Company 的法務長。2024年3月,Aftermath 問他公司如何處理對同人專案的停止侵權函,他回答:「Short answer: thanks to you folks.」(簡單說:要感謝你們這些人)他告訴他的法律系學生,世上最糟的事,就是一個同人專案「gets press, because now I know about you.」(上了新聞,因為這下我就知道你了)而後半段是:「You don’t send a takedown right away. You wait to see if they get funded (for a Kickstarter or similar); if they get funded then that’s when you engage. No one likes suing fans.」(你不會馬上發撤下通知。你會等著看他們是否募到資金(Kickstarter 之類);如果募到了,那才是你出手的時候。沒有人喜歡告粉絲)67 Video Games Chronicle 在隔天刊出了同樣的引述。68
中國,2025:一份整款遊戲的複製
紀錄中金額最大的判決是一件版權與不正當競爭的案子,而不是同人遊戲。The National Law Review 報導,2025年2月21日,廣東省高級人民法院宣布 The Pokémon Company 就遊戲「Pokémon: Remastered」(2021年12月起訴)獲得 1.07 億人民幣的和解;公司原本請求 5 億人民幣,並在深圳的一審獲判 1.07 億。69 一審法院的理由,依報導的摘要,值得任何寫致敬作品的人仔細閱讀:被告遊戲的角色、主角與地圖與原作「one-to-one」(一一對應),它的系統「highly similar or even completely consistent, and many numerical system designs are the same.」(高度相似甚至完全一致,而且許多數值系統設計相同)69 依我的解讀,數字只是一項關於一款連其他一切也都抄襲的遊戲的認定中的一條線索;但這正是第 14 節只把少數幾個整數當作起點、在遊戲的數字不是整數時設定自己的範圍、而且絕不匯入遊戲的數值表的原因。
紀錄顯示了什麼
四件同人案件中有三件使用了寶可夢自己的表達,第四件 Relic Castle 則存放了連往使用這些表達的遊戲的連結。Uranium 在標題裡使用了這個名稱,而且依開發者自己的計算已被下載 150 萬次;Prism 是《水晶》的 ROM 改版,建立在遊戲自己的程式碼與美術之上;Essentials 附帶的素材被一位記者稱為與遊戲中的完全相同;Relic Castle 連結到這類遊戲。5678 依我的解讀,每一件的依據都是版權:其中兩件是據報的 DMCA 通知,而 DMCA 通知是版權通知,儘管 Relic Castle 那一份是誰發出的並未獲得確認;關於另外兩件的報導沒有指明依據,但兩款遊戲都建立在原作的表達之上,而 Uranium 還帶著這個名稱,那也是一個商標問題。沒有一件是專利訴訟。前法務長補上了觸發條件:先是新聞報導,然後是錢。67
我的解讀: 紀錄顯示的行動,針對的是寶可夢的表達,以及能見度加上募資,而不是針對一款遊戲屬於這個類型。第 11 節的每一款致敬遊戲都屬於這個類型、都在賣錢,而且都沒有被報導成某項行動的對象。這個解讀說的是已經發生的事,不是對未來的承諾。
9. Palworld:唯一一件關於機制的案子
Palworld 是改變這個解讀的案子,因為它是紀錄中唯一以專利為依據的一件。它也仍未結案。
聲明,2024年1月
Pocketpair 在 2024年1月19日發售 Palworld。10 1月25日,The Pokémon Company 在其企業網站上張貼了一則公告,標題是「他社ゲームに関するお問い合わせについて」,我譯作關於涉及其他公司遊戲的詢問,日文在上,下方附英文。英文內容是:「We have not granted any permission for the use of Pokémon intellectual property or assets in that game. We intend to investigate and take appropriate measures to address any acts that infringe on intellectual property rights related to the Pokémon.」(我們並未授權在該遊戲中使用寶可夢的智慧財產或素材。我們打算進行調查,並採取適當措施處理任何侵害寶可夢相關智慧財產權的行為)公告沒有指名那款遊戲。70 上方的日文還多說了一件英文沒說的事:那些詢問中包括認為該遊戲與寶可夢相似的意見(ポケモンに類似しているというご意見)。70 Nintendo Life 同一天的報導則指名了那款遊戲。71
訴訟,2024年9月
Nintendo 與 The Pokémon Company 在 2024年9月19日宣布,他們已於「on September 18, 2024,」(2024年9月18日)向東京地方法院對 Pocketpair 提起專利侵權訴訟,請求「an injunction against infringement and compensation for damages」(禁止侵權的禁制令與損害賠償),理由是 Palworld「infringes multiple patent rights.」(侵害多項專利權)9 Pocketpair 在 2024年11月8日的報告指名了這些專利與請求內容:10
| 專利 | 申請日 | 登錄日 |
|---|---|---|
| JP 7545191 | 2024年7月30日 | 2024年8月27日 |
| JP 7493117 | 2024年2月26日 | 2024年5月22日 |
| JP 7528390 | 2024年3月5日 | 2024年7月26日 |
原告請求針對 Palworld 的禁制令,並請求各給付 500 萬日圓加上遲延損害金,作為「compensation for a portion of the damages incurred between the date of registration of the patents and the date of filing of this lawsuit.」(自專利登錄日至本訴訟提起日之間所生損害之一部分的賠償)10 Google Patents 把 Nintendo 與 The Pokémon Company 列為三項專利的受讓人。111213 三項專利都是在 Palworld 發售之後申請的,但並非從零開始。GamesRadar+ 引用日本專利師栗原潔(Kiyoshi Kurihara)的說法,報導這三項都是某件母案的分割專利,並把那件母案描述為在 2021年12月登錄。72 Google Patents 的專利家族表的說法不同:三項專利各自列出 2021年12月22日的優先權日,並以分割的方式源自當天提出的一件申請,7493117 與 7545191 源自 JP 2021-208275,7528390 源自 JP 2021-208276;這兩件申請後來分別公告為 JP 7398425 B2(2023年12月14日)與 JP 7349486 B2(2023年9月22日)。2021年12月是申請日;在我儲存的頁面中,我沒有找到這兩件的登錄日。111213
三項請求項說了什麼
以下是每項專利的請求項 1,取自 Google Patents 對日文的機器翻譯;以日文文本為準,而且請求項在訴訟中可能被更正,Google 的頁面卻不一定會反映。7333 我做的是摘要,引號裡的是譯文本身的字句。
JP 7493117,指示器。 在「the first mode」(第一模式)中,程式決定「a direction of aim in the virtual space based on a first operation input which is a directional input」(依據作為方向輸入的第一操作輸入,決定虛擬空間中的瞄準方向);在第二個輸入時,它把準星轉向一個場上角色,並且「a first indicator is displayed」(顯示第一指示器);在第三個輸入時,它讓玩家角色釋放「a capture item for capturing the field character in the aiming direction」(往瞄準方向、用來捕獲場上角色的捕獲道具);命中時,它進行「a capture success determination」(捕獲成功判定);而指示器是「information indicating the ease of making a positive judgment of the successful capture judgment.」(表示捕獲成功判定得出肯定結果之容易程度的資訊)11
JP 7545191,投擲。 按下一個按鈕會進入一個準備姿勢,準備釋放一個捕獲道具(屬於第一類別群組)或一個戰鬥角色(屬於第二類別群組);方向輸入設定瞄準;一個「using an operation button different from the operation button」(使用與該操作按鈕不同的操作按鈕)的輸入,選擇要用哪一個捕獲道具或戰鬥角色;放開第一個按鈕就擲出所選的那一個;命中的捕獲道具會開始捕獲判定;而在能夠戰鬥的位置被釋放的戰鬥角色,會使「a battle between the combat character and the field character on the field to commence.」(該戰鬥角色與場上的場上角色之間開始戰鬥)12
JP 7528390,騎乘。 玩家角色由操作輸入控制;它騎乘自己擁有的「a plurality of types of rideable characters」(多種可騎乘角色)之一,而「when a first operation input is performed while the player character is in the air,」(當玩家角色在空中時進行第一操作輸入)它就登上「an airborne rideable character」(空中的可騎乘角色)並在空中移動。13
GamesRadar+ 給出了相同的對應,來源是經由 Automaton 引用的栗原與專利師事務所 Siarasia:7545191 是瞄準並投擲的捕獲,7493117 是捕獲可能性的指示器,7528390 是登上與騎乘。72
遊戲改了什麼
Pocketpair 在 2025年5月8日的公告說明了它做了什麼。2024年11月30日釋出的 v0.3.11 修正檔「removed the ability to summon Pals by throwing Pal Spheres and instead changed it to a static summon next to the player」(移除了投擲 Pal Sphere 來召喚 Pal 的功能,改為在玩家身旁靜態召喚);從 v0.5.5 起,「gliding will be performed using a glider rather than with Pals.」(滑翔將改用滑翔翼,而不是用 Pal)公告明白寫道「these changes were indeed a result of the ongoing litigation,」(這些變更確實是進行中訴訟的結果)而 Pocketpair 持續「to dispute these claims and assert the invalidity of the patents in question.」(爭執這些主張,並主張相關專利無效)74 依我的解讀,每一項變更各自觸及一項請求項中的一個步驟:第一項是 JP 7545191 請求項 1 中以投擲方式釋放戰鬥角色,第二項是 JP 7528390 中的空中坐騎。改過的遊戲現在是否落在任一請求項之外,取決於法院如何解釋那些步驟;Pocketpair 的公告報告的是它改了什麼,不是一項認定,而且沒有任何法院做出裁決。
縮小範圍,2025年11月
Automaton 在 2026年6月12日報導,依據其日本員工查閱的東京地方法院紀錄以及 Games Fray,原告「revised the scope of their claims in November 2025 so that they now apply only to older versions of Palworld.」(在 2025年11月修改了其請求的範圍,使其現在只適用於 Palworld 的舊版本)同一篇報導寫道:「While the plaintiffs are still seeking an injunction against Palworld, limiting the lawsuit to older versions of the game appears to reduce the likelihood that the current version will be directly affected.」(雖然原告仍在請求針對 Palworld 的禁制令,但把訴訟限縮到遊戲的舊版本,似乎降低了現行版本直接受到影響的可能性)法院紀錄顯示,技術說明會排定在 2026年10月1日,而法院的初步見解排定在 2026年11月9日。29
截至 2026年10月4日,Pocketpair 的重要公告列表在 2025年5月8日之後沒有任何關於這件訴訟的內容,而我也沒有找到任何具名媒體報導 10月1日說明會上發生了什麼。沒有任何判決、和解或禁制令的報導。30 Palworld 在 2026年7月結束了搶先體驗:Steam 列出的發售日是「9 Jul, 2026」,而 Automaton 報導宣布的日期是 7月10日。7529
一款同人遊戲成為先前技術
紀錄中有一個值得用一整段來說的諷刺。Automaton 在 2026年7月22日報導,日本特許廳維持了對 Nintendo 與 The Pokémon Company 的分割申請第 2026-019762 號的核駁,該申請描述的是一套「in-game monster-capturing system」(遊戲內的怪物捕獲系統)。關鍵理由之一,是一段 2013 年、關於同人遊戲 Pokémon Generations 的 YouTube 影片。Nintendo 一方主張那款同人遊戲侵害了它的版權;審查官依 Automaton 的摘要回應說,「whether an invention infringes on copyright or not has no bearing on determining inventive step.」(一項發明是否侵害版權,與判斷進步性無關)這項核駁涉及的是那件分割申請,而不是在東京被主張的那些專利,而 Nintendo 有三個月的時間可以對它請求審判。76 一款同人遊戲,也就是第 8 節那些案子所涉及的那類專案,成了關於這項機制的證據。
美國這一邊:一項專利,正在再審查
據我所能找到的,沒有任何針對 Pocketpair 的美國訴訟被報導過。但有一項美國專利。US 12,403,397 讓與給 Nintendo 與 The Pokémon Company,於 2023年3月1日申請,2025年9月2日核准。61 它的請求項 1 讓玩家角色在場地上移動,並以一個輸入召喚「a sub character」(一個副角色);如果副角色出現的地方有敵人,對戰就以「a first mode in which the battle proceeds based on an operation input,」(依操作輸入進行對戰的第一模式)進行,如果沒有,副角色就開始自動移動;第二個輸入會把它往某個方向送出,而那裡的敵人會開始「a second mode in which the battle automatically proceeds.」(對戰自動進行的第二模式)61
Engadget 在 2025年11月4日報導,美國專利商標局局長親自下令對這項專利進行再審查,並把一件 2002 年的 Konami 申請與一件較早的 Nintendo 公開列為先前技術。7778 律師事務所 MBHB 在 2026年4月3日寫道,這件編號 90/020,162 的再審查已經發出第一次審查意見通知,於 2026年3月25日寄出,依 35 U.S.C. § 103 以顯而易見為由駁回了該專利的全部請求項,回覆期限是 2026年6月25日,若延期則為 2026年9月25日。79 我沒有找到任何關於 Nintendo 回覆或之後任何程序的報導。
所讀四項專利請求項 1 中挑選出的捕獲、戰鬥與騎乘步驟,加上其中兩項共有的移動步驟,以及這個 app;由 figures.py 依 measure_patent_claims.out.txt 與美國專利的請求項繪製。4373
這對致敬作品意味著什麼
我的解讀,不是法律意見。 一項請求項要涵蓋一個產品,條件是該產品執行了其中的每一個步驟(依法院對每個步驟的解釋),或是執行了它的均等物,而兩國的法院都承認均等(第 7 節)。Pocketpair 改掉了投擲召喚與滑翔,並表示它仍在爭執侵權與專利的有效性;Automaton 報導那些變更可能促成了原告把請求縮小到舊版本,同時禁制令仍在請求中。7429 兩者都不是認定現行遊戲落在請求項之外,而且沒有任何法院做出裁決。Kiradex 確實執行了一個被請求的步驟:收藏者依輸入在場地上移動,這是美國專利請求項的第一個步驟,也是 JP 7528390 的一部分,而且是大多數遊戲共有的步驟。它沒有捕獲、沒有被投擲的物體、沒有生物、沒有對戰、沒有坐騎,而這四項請求項每一項也都要求捕獲、戰鬥或騎乘的步驟,所以依我的解讀,它們沒有一項描述的是 Kiradex。這是對四項專利的解讀,不是自由實施(freedom-to-operate)檢索。Nintendo 與 The Pokémon Company 持有其他我沒有讀過的專利,而我也沒有檢索關於計步器、由時鐘驅動的事件或會傳播的話語的專利。第 14 節的禁止清單讓 app 遠離這裡讀到的捕獲、戰鬥與騎乘步驟,僅此而已。
10. 這兩家公司公開了什麼
據我所能找到的,兩家公司都沒有公開的同人遊戲政策。它們公開的東西範圍更窄,而兩份文件指向同一個方向。
The Pokémon Company 在日本的網站規則
官方日文網站的規則頁面有一段關於衍生作品的文字,而那是一份單向的授權。任何人創作或使用以ポケモン財産(寶可夢財產)為基礎的衍生作品,這個頁面把它定義為受版權、商標、專利、營業秘密、隱私權與公開權保護的素材,就等於授予 The Pokémon Company 集團、Nintendo、Creatures、GAME FREAK 及其指定者一項非專屬、可再授權、免權利金、永久、不可撤銷、全球性的授權,可為任何目的使用它。下一句,依我對「個人的な利用を超えた…利用を許諾するものではありません」的翻譯,是說這些公司對您的作品所做的任何使用,都不代表授權您在個人使用的範圍之外使用寶可夢財產或您的衍生作品。準據法是日本法,第一審由東京地方法院專屬管轄。60 同一個頁面寫明公司不接受任何未經邀請的角色或產品提案或點子(企画・アイデア…一切公募をしておりません),並寫明ポケットモンスター、ポケモン與 Pokémon 這些名稱是 Nintendo、Creatures 與 GAME FREAK 的商標。60
pokemon.com 上的美國法律資訊頁面,次級來源說英文的同人創作條款就在那裡,但它在 2026年10月4日對我的抓取程式回應了一道機器人檢查,而它的封存副本也回傳同樣的阻擋。我沒有嘗試繞過它,所以它的內容在這裡未經查證,這篇文章也不引用它。80
Nintendo 的遊戲內容指南
Nintendo 針對影片與圖片分享的指南,允許在您為影片與圖片分享網站製作的內容中使用「for which Nintendo owns the copyright」(Nintendo 擁有版權的)遊戲畫面與截圖,並寫道「We encourage you to create videos that include your creative input and commentary.」(我們鼓勵您製作包含您的創意投入與評論的影片)營利只能透過 Nintendo 列出的方式,而且「you may not sell any videos, music, or images that you created using Nintendo Game Content.」(您不得販售任何您使用 Nintendo 遊戲內容製作的影片、音樂或圖片)第 6 題才是對任何想做其他東西的人重要的那一題:同人創作、音樂,以及遊戲畫面與截圖以外的內容都不在指南範圍內,而「Any other use of Nintendo’s intellectual property and creation of content outside of this scope is subject to the relevant laws of the applicable jurisdiction.」(對 Nintendo 智慧財產的任何其他使用,以及此範圍以外的內容創作,均受適用司法管轄區的相關法律規範)81
這些加起來是什麼
我的解讀: 同人遊戲沒有安全港。Nintendo 的指南涵蓋遊戲畫面與截圖,把其他一切交給一般法律;The Pokémon Company 的規則把衍生作品授權回公司,卻不授權給它的創作者任何超出個人使用的權利。8160 取而代之存在的是執法裁量,而第 8 節的紀錄就是那份裁量至今的樣子。對 Kiradex 來說,實際的結果是規格書禁止清單上的兩條:不製作任何屬於寶可夢財產衍生作品的東西,也不向任何一家公司的粉絲或點子管道寄送任何東西。
11. 致敬遊戲,用它們自己的話說
Coromon、Nexomon: Extinction、Cassette Beasts、Temtem、Monster Sanctuary 與 Moonstone Island 全都在像素或低多邊形的世界裡提供捕捉與培養的迴圈,全都在賣錢,而據我所找到的,沒有一款被報導成某項行動的對象。它們如何描述自己,是這篇文章裡最實用的指引,因為那是實際運作中的工作室真正在做的事。
商店頁面不提任何人的名字
我在七款遊戲的 Steam 商店紀錄裡數過這個字,也就是那六款加上 Palworld,於 2026年10月4日透過 Steam 的 app details API 抓取。在它們的簡短與完整說明中,七款沒有一款寫出「Pokémon」。它們寫的是「monster-taming RPG」(馴服怪物的 RPG;Coromon)、「a return to classic monster catching games」(回歸經典的捕捉怪物遊戲;Nexomon: Extinction)、「Collect awesome monsters」(收集超棒的怪物)加上「Fusion System」(融合系統;Cassette Beasts)、「an online creature-collection adventure」(線上生物收集冒險;Temtem)、「Monster taming meets metroidvania」(馴服怪物遇上銀河惡魔城;Monster Sanctuary)、「a creature-collecting life-sim」(收集生物的生活模擬)加上「card-based encounters」(以卡牌進行的遭遇;Moonstone Island),以及「Fight, farm, build and work alongside mysterious creatures」(與神秘生物一起戰鬥、耕作、建造與工作;Palworld)。31 有一筆紀錄確實包含這個字:Temtem 的評論引述欄位放了一句 Rock Paper Shotgun 的媒體評語,稱它為「A Pokemon-like that listens to what fans want.」(一款會聆聽粉絲想要什麼的類寶可夢遊戲)31 在這七筆紀錄中,工作室自己的文字從不用這個名稱來銷售。
訪談裡則自在地提起它
在訪談中,同一批開發者公開談論寶可夢,把它當作他們出發的起點,然後又從那裡走開的影響來源。Nintendo Life 為這個系列的 30 週年請教了其中幾位,專題於 2026年3月2日刊出。Crema 的 Guillermo Andrades:「In the early days of developing Temtem, we wanted to create almost a 1:1 homage to Pokémon,」(在開發 Temtem 的初期,我們想做的幾乎是對寶可夢一比一的致敬)後來團隊才找到更多空間做「different approaches and unique twists.」(不同的做法與獨特的轉折)Nexomon 的首席開發者 JVemon:「Strong inspirations needed to be drawn if we were to tap into the same player base.」(如果我們想打進同一群玩家,就需要汲取強烈的靈感)Coromon 的 Jochem Pouwels 把高草叢稱為「a little slot machine of possibility.」(一台小小的可能性吃角子老虎)Moonstone Island 的 Sandy Spink:「I got an atomic purple Game Boy Color and Pokémon Blue for my sixth birthday.」(我六歲生日時拿到了一台透明紫色的 Game Boy Color 和《寶可夢 藍》)而 Bytten Studio 的 Tom Coxon:「I’ve never felt like Pokémon was the only thing a monster-collecting RPG could be.」(我從不覺得收集怪物的 RPG 只能是寶可夢那樣)32
Cassette Beasts 是意圖最清楚的表述。依 Nintendo Life 在 2023年4月的報導,它的出發點問題是「How can two people make a monster-collecting game that does stuff that Pokémon doesn’t do?」(兩個人要怎麼做出一款收集怪物、卻能做到寶可夢沒做的事的遊戲?)Jay Baylis:「We love Pokémon, sure, but we’re not making a game meant to be a tribute or derivative.」(我們當然愛寶可夢,但我們不是在做一款打算當作致敬或衍生作品的遊戲)82 Temtem 在 2018年4月的發表,被 Gematsu 報導為「a massively multiplayer creature collection adventure game inspired by Pokemon,」(一款受寶可夢啟發的大型多人生物收集冒險遊戲)這是該媒體自己的措辭。83
為什麼它行得通
我的解讀: 這些工作室之間通行的規範,和法律與指南所指向的是同一條。在談話中提起寶可夢,說明自己從哪裡來;絕不用它來銷售;一切自己畫;並把迴圈改得夠多,讓它成為自己的(Cassette Beasts 的融合,Moonstone Island 用卡牌取代對戰)。Kiradex 離這個類型比它們任何一款都遠,完全沒有生物、沒有捕捉、沒有對戰,而它借用的也更少:一段路、一個時鐘、一張卡片、一句話。
12. 這門手藝,寫成帶數字的規則
這些是規格書據以建立的規則。每一條都以一般性的方式陳述一個機制,並指出它所依據的量測事實。這些數字是舊遊戲的數字,保留作為我們自己調整的起點,絕不當作要匯入的數值表;第 8 節的中國案件就是做出這個區分的原因。69
| 元素 | 規則 | 來源 |
|---|---|---|
| 步數節拍 | 以粗節拍推進由步數驅動的事物,128 到 512 步,絕不每一步,讓獎勵以事件而非量表的形式到來 | 第二世代蛋每 256 步,親密度每 512 步;第三世代每 128 步每位隊伍成員一次 50% 的親密度擲骰,蛋每 256 步 |
| 步數預算 | 受步行限制的事物以步數而不是秒數來花;短、中、長的保護分別是 100、200 與 250 步;一趟外出 500 步 | 除蟲噴霧,從第一到第三世代不變;《綠寶石》的狩獵地帶 |
| 一天的時段 | 依裝置自己的時鐘把一天切成幾個有名稱的時段;我們的是 6、9、17 與 20,不是遊戲的 4、10 與 18 | 《水晶》的 TimesOfDay;Kiradex 的 Daylight.Phase |
| 約會 | 在固定星期幾舉行的例行活動、在固定某一天的每週抽獎,每位聯絡人每個星期幾最多一個時段 | 三天各 20 分鐘的捕蟲大會;週五的幸運號碼;24 個再戰時段 |
| 生長 | 四個階段,最後一個是前三個階段各自長度的四倍(規格書中為 256、256、256 與 1,024 廣場步);在回來時依經過的時間計算;成熟的作物等待四個階段長度後掉落,只有非常長的離開才會清除植物 | 《綠寶石》的樹果:4 到 96 小時,結果階段結束時未採收的樹果消失,離開 71 個階段長度後樹被清除 |
| 安全房間 | 一個地方,您站在其中時當天的變化絕不觸發 | 《綠寶石》在寶可夢中心裡略過當天的更新 |
| 星星 | 四顆星,四種不同類型的遊玩,每一顆都為卡片重新上色;絕不兩顆給同一種活動,絕不有一顆能用錢買 | 《綠寶石》的四顆星與五種卡片顏色 |
| 格子 | 一個箱子是一頁 30 格,6 乘 5 | 第三世代的箱子,從每箱 20 增加而來 |
| 斷崖 | 在路線上,絕不在城鎮;第一條路線 10 到 25 格斷崖 | 《綠寶石》:路線上 726 格斷崖,7 個城鎮裡 0 格;101 到 104 號道路各 13 到 24 格 |
| 連勝 | 七個一組,里程碑在 5 組與 10 組 | 對戰塔七場一組的挑戰;它的 Brain 在第 35 與第 70 場 |
| 會傳播的話 | 一個分數,在設定範圍內隨機起始,每天漂移 5,在峰值處變得陳舊,在 0 時又變得新鮮;新的一句只有在分數較高時才取代舊的;兩處相遇時,同一句話中分數較高的那一份勝出;保留 5 句 | 《綠寶石》的流行語,分數從 30 到 127 之間起始;《綠寶石》也讓一份存檔的第一句話無條件進入,並以擲硬幣解決完全平手,規格書捨棄了這兩點,並設定自己的範圍 |
| 稀有的老師 | 一位老師,很難找到(我們的每次只站在一個房間,每週移動),透過接觸遇見;每次相遇,一天最多一次,依固定順序教會隱藏清單上的下一個詞 | Hipster:五位玩家中一位,33 個隱藏詞 |
| 收藏抽獎 | 研究,但不實作:一場與玩家擁有的一切比對的抽獎會獎勵龐大的收藏,但它的獎品是隨機的,而這個系列的外觀物品絕不隨機 | 《綠寶石》的樂透屋;《水晶》每週的幸運號碼;人物那篇文章的外觀物品規則 |
| 打擾 | 任何非主動要求的打擾,都要經過一個在每次之後從最長重新開始的計時器與一次擲硬幣把關,而且絕不在門口 | 《水晶》的來電計時器:來電後 20 分鐘,之後沒有來電時為 10、5 與 3,以及它 50% 的擲骰 |
| 上限 | 自建場所的物品 16 件,臥室 12 件,保留的別人的場所 20 個 | 《綠寶石》的秘密基地、臥室與基地上限 |
| 別人的世界 | 讓其他玩家的場所、新聞與話語來到您的世界,而不需要他們同時在線 | 《綠寶石》5,188 位元組的混合紀錄 |
| 表達 | 機制加上您自己的表達;不使用遊戲裡的名稱、美術、音樂、文字或程式碼 | 2016 到 2024 年的紀錄;通告第 33 號 |
| 被請求的步驟 | 排除所讀請求項中的捕獲、戰鬥與騎乘步驟:不瞄準並投擲捕獲道具、不顯示捕獲指示器、不釋放戰鬥夥伴、沒有空中坐騎、沒有以兩種模式戰鬥的被召喚幫手 | JP 7493117、7545191、7528390;US 12,403,397 |
表格的來源:計步器;121415411716 時鐘;1845192146223 卡片與箱子;2324 斷崖;39 連勝;25 紀錄混合;4285826 抽獎;5636 來電;59 紀錄與請求項。4411121361
有兩條規則各值得說一句。安全房間是若沒讀過程式碼我就不會想到的一條:一個自己會改變的世界,需要一個不會改變的地方,而對 Kiradex 來說,那就是收藏者自己的房間。而表達這條規則,用一行就說完了整個法律的部分,這也是為什麼它放在設計表格裡而不是免責聲明裡:它是工坊逐像素遵守的規則,就像它遵守調色盤一樣。
13. Apple 這條路:世界裡的步數,行事曆上的一天
規格書裡沒有任何一項需要新的框架。它需要正確地做出兩個決定:一步從哪裡來,以及一天是什麼。
一步是廣場上的一步,不是街上的一步
iOS 提供兩種計算一個人真實步數的方式。Core Motion 的 CMPedometer 自 iOS 8.0 起提供,是「An object for fetching the system-generated live walking data,」(一個用來取得系統產生的即時步行資料的物件)使用它需要在 app 的 Info.plist 裡寫一段用途說明,系統會在權限提示中顯示;HealthKit 的 stepCount 數量類型同樣自 iOS 8.0 起提供,是「A quantity sample type that measures the number of steps the user has taken.」(一種量測使用者已走步數的數量樣本類型)8485
規格書兩者都不用。讓第 14 節的植物生長的步數,是廣場上的步數。伺服器已經會拒絕移動到任何不可行走的圖塊,並限制收藏者移動的頻率;它還沒有檢查一次移動是否是到相鄰的圖塊,所以計算一步,意思會是計算一次被接受的一格移動,而規格書的驗收測試會把這一點固定下來。86 我的解讀: 為了讓一個像素裝飾生長,而要求一個兒童 app 取得動作或健康權限,是不相稱的;它會在一個收藏 app 裡放進一個與收藏毫無關係的健康權限,還會讓那盆植物變成健身追蹤器,那是另一種產品。舊遊戲也是計算世界裡的步數。
一天是收藏者行事曆上的一天
Kiradex 已經從裝置時鐘讀取時刻:Daylight.Phase(hour:) 把 6 到 9 對應到早上,9 到 17 對應到白天,17 到 20 對應到傍晚,其餘對應到夜晚,而一個 -plazaHour 啟動參數會為 UI 測試固定時刻。45 一天一次的事件還需要一個概念:日期鍵。Foundation 的 Calendar 直接就提供了。startOfDay(for:) 回傳「the first moment of a given Date,」(給定 Date 的第一個時刻)而 isDate(_:inSameDayAs:) 回答兩個日期是否落在同一天,兩者都自 iOS 8.0 起提供;傳入 Calendar.current,它們就依收藏者自己的行事曆回答。8788 下面是晨間木箱檢查的一份草稿,還沒有放進 app。木箱在 06:00 到來,也就是 Daylight 早上的開始,並一直等到被打開,所以這項檢查只問今天的木箱是否已經到來,以及是否已被打開。它讀取時刻的方式和廣場的舞台已經在用的一樣:當測試以 -plazaHour 啟動 app 時讀 Daylight.forcedHour,否則讀收藏者的時鐘,這樣規格書的 UI 測試就能驅動它:
/// Whether a crate is waiting for this collector now: today's crate has
/// arrived (it comes at 06:00, the start of Daylight's morning) and they
/// have not opened one today. It does not leave at 09:00.
func crateIsWaiting(lastOpened: Date?, now: Date = .now,
calendar: Calendar = .current) -> Bool {
let hour = Daylight.forcedHour ?? calendar.component(.hour, from: now)
guard hour >= 6 else { return false }
guard let lastOpened else { return true }
return !calendar.isDate(lastOpened, inSameDayAs: now)
}
這在形狀上就是《綠寶石》的 UpdatePerDay:當天的狀態在到達時依日期計算出來,沒有任何東西需要持續運轉才能正確。22 對一個跨過午夜仍開著的 app,有兩個通知可以重新啟動它。NSCalendarDayChanged 的說明是「posted whenever the calendar day of the system changes, as determined by the system calendar, locale, and time zone,」(每當系統的日曆日改變時發出,依系統日曆、地區設定與時區判定)自 iOS 8.0 起提供;UIKit 的 significantTimeChangeNotification 則會因「a change to a new day (midnight), a carrier time update, or a change to, or from, daylight savings time.」(換到新的一天(午夜)、電信業者的時間更新,或日光節約時間的開始或結束)而發出。8990
伺服器需要什麼
廣場的伺服器目前只處理在場狀態:它轉送位置與預設台詞,什麼都不儲存。8633 規格書中有兩項會改變這一點,而兩者性質不同。會傳播的話需要每個廣場房間一筆小小的持久紀錄:兩個詞的索引、一個分數、一個峰值、一個漂移方向,以及最後一次套用漂移時的伺服器日期,其中沒有任何關於誰提出或攜帶這句話的資訊。那筆紀錄屬於一個房間,不屬於一個人。每週大廳的玫瑰章則需要每位收藏者的參賽次數,而那確實屬於一個人:它是參與紀錄,依伺服器用來識別收藏者的那個識別碼儲存。目前那個識別碼是 app 自己產生的:收藏者第一次加入廣場時在裝置上產生的 UUID,保存在 app 的儲存空間裡,並隨每次連線送出,伺服器把它當作 UUID 讀取。86 app 的世界文件計畫改用 Game Center 玩家 id 作為伺服器的鍵,並這麼描述它:「That is a persistent identifier, which COPPA counts as personal information when combined with other data,」(那是一個持久性識別碼,COPPA 在它與其他資料結合時將其視為個人資訊)所以這個設計附帶隱私權政策、沒有第三方分析或廣告、「deletion on request,」(應要求刪除)並被建構為「to collect as little as possible from anyone.」(盡可能少地向任何人收集資料)37 依我的解讀,app 自己的 UUID 也是持久性識別碼,因為它產生一次就被保留,所以不論參賽次數依兩個識別碼中的哪一個儲存,這些規則都適用(規格書第 5 項說明怎麼做)。我的解讀: 任何在收藏者之間共享的東西,例如那句話的每日漂移,都應該依伺服器的日期而不是手機的日期運作,因為手機的時鐘可以被調快;任何私人且純外觀的東西,例如木箱,則可以信任手機,因為把自己的時鐘調快來提早打開一張貼紙,誰也沒有被騙。
它的成本
這裡的一切都還沒有實作,所以什麼都還沒計時。一個日期鍵是一次行事曆呼叫,一個計步器是每位收藏者一個整數;我預期兩者都不會出現在效能分析裡,而在一個 build 於手機上量測之前,我不會把這說成事實。
14. 規格書:Kiradex 要做什麼,以及它必須通過的檢查
這一節是我的綜合,為這個 app 而寫。每一個元素都保留第 2 到 6 節中的一個機制,並以 Kiradex 自己的表達取代全部的表達:它的調色盤、它由工坊繪製的圖塊、它的預設台詞、它的 kira 星。每一項都寫明它不得相似於什麼,以及一個測試、一張擷圖或一支腳本能執行的檢查。法律註記是解讀,不是建議。
已經存在、並作為基礎的東西:由 16 像素圖塊構成的廣場,預設台詞保存在伺服器上,伺服器只處理在場狀態、什麼都不儲存;Daylight.swift 及其自己的時段(早上 6 到 9、白天 9 到 17、傍晚 17 到 20、夜晚),它們本來就不是《水晶》的 4、10 與 18,並將維持如此;帶有主題的每週大廳;收藏者卡片,上面有贊助者等級、徽針,以及來自真實掃描的等級;以及每位收藏者的房間。86453533
1. 窗台上的植物:一個讓房間裡長出東西的計步器
- 機制。 每位收藏者的房間在窗邊都有一盆植物。在廣場與路線上走的步數會餵養它:每 256 步長一個階段,共四個階段(育苗盤、發芽、長葉、開花);最後一個階段持續四倍長,然後掉下一朵壓花,那是一件房間擺設,顏色依固定順序取自城鎮 14 道調色盤色階中的下一道,絕不隨機,接著植物從發芽階段重新開始。在房間裡走的步數絕不算數:房間是安全的地方,就像《綠寶石》在秘密基地裡暫停中毒、在寶可夢中心裡暫停當天的更新那樣。(規則:步數節拍、生長、安全房間。)1142234
- 為什麼。 走路是廣場上唯一不變的動詞;粗節拍讓那朵花成為一個事件;而那朵花是可以擺放的東西,這會餵養房間。
- 步數是廣場的步數,不是健康資料。 不用 Core Motion,不用 HealthKit(第 13 節)。
- 不得相似於。 蛋、孵化器、任何會孵化的東西、樹果樹、樹果的名稱或 sprite、與產量等級掛鉤的澆水機制、培育屋。任何會變成生物的東西都不行。任何字串裡都不得出現「berry」、「egg」或「hatch」。
- 驗收。 一個伺服器測試讓一個機器人走 2,048 個一格的步數,並斷言在 256、512 與 768 時階段改變,在 1,792 時掉下一朵壓花並讓植物回到發芽(開花階段持續 1,024 步),下一次改變在 2,048,而在房間地圖裡走的步數,以及被接受的超過一格的移動,都不會造成任何改變;在每個階段擷取一張房間的畫面,顯示由工坊繪製的植物,而一項調色盤檢查確認每一個像素都在工坊的調色盤內。
2. 晨間木箱:一個帶有早晨事件的每日時鐘
- 機制。 在 Kiradex 自己的早上開始時,也就是收藏者時鐘上的 06:00(
Daylight.Phase.morning從 6 開始),一個送貨木箱會送到卡片店門外,並一直留在那裡直到被打開。打開它會得到一份固定清單上的下一樣東西:一張貼紙、一種外框顏色,或是一個用於那句話的詞(第 6 項)。一天一個木箱,而且絕不會堆積。當天的狀態在到達時依本地日期計算,絕不靠一個運轉中的計時器。(規則:一天的時段、約會、生長。)4522 - 沒有倒數,沒有機率。 這個系列對外觀物品的規則是「never random, never on a countdown.」(絕不隨機,絕不倒數計時)36 所以木箱沒有期限:它不會在 09:00 離開,而且因為它的內容依序來自同一份清單,跳過一天只會延後下一張貼紙,絕不會失去一張。早上是它到來的時刻,不是一個要趕上的時段。
- 一週的形狀。 像《水晶》那樣給一週有名字的日子,但每天最多一個約會:大廳的評審日依計畫維持每週一次,而某一個平日傍晚,店主會重新布置櫥窗。1921
- 不得相似於。 捕蟲大會(週二、週四與週六的限時捕捉)、鋼石的球製作、廣播的樂透節目、寶可夢裝置(Pokégear)或電話。沒有遊戲內的來電。
- 驗收。 一個以
-plazaHour 7啟動的 UI 測試顯示一個未打開的木箱,以-plazaHour 21啟動的也一樣;以-plazaHour 5啟動的則還沒有。一個針對日期鍵的單元測試顯示,同一個本地日期打開兩次的木箱只給一次,而把日期往前推一天就會重新啟動它;一個跳過三天再打開木箱的測試,拿到的是清單上的下一項,而不是往後第三項。
3. 帶星星的收藏者卡片
- 機制。 別人點您時打開的那張卡片,最多可以得到四顆星,每一顆代表不同類型的遊玩,而它的邊框會隨每一顆星依 Kiradex 自己的順序改變:沒有星時是素面,接著是霧面、箔線、全像邊,四顆星時是完整的 kira。提議的星星,每一顆都來自真實的收藏或廣場遊玩:以掃描完成一個真實的系列;拜訪過 100 個不同的房間;在每週大廳中獲得名次;以及在 30 個不同的日子掃描過。贊助者等級在卡片上維持獨立的一行,絕不是一顆星。(規則:星星。)23
- 為什麼不是 30 天連續紀錄。 研究檔案提議的是 30 天的掃描連續紀錄。我把它改成 30 個不同的日子,永遠不會過期,因為一個會中斷的連續紀錄會因為離開一週而懲罰一個孩子,也因為 PEGI 自 2026年6月起就把會過期的登入連續紀錄納入分級,這個系列的人物那篇文章記錄了這一點。3336
- 不得相似於。「Trainer Card」這個名稱;訓練家卡片的版面(肖像在右、徽章列在底部、ID 號碼與金錢);綠、青銅、紅銅、銀與金的卡片配色;徽章形狀;道館的指涉;名人堂的時間。星星只能畫成 Kiradex 的 kira 星。
- 驗收。 一個快照測試以 0 到 4 顆星渲染卡片,並依序找到那五種邊框;一個單元測試證明沒有任何購買路徑會設定星星(StoreKit 交易從不碰觸星星欄位);在字串目錄中搜尋「Trainer」什麼都找不到。
4. 路線上的一道單向落差
- 機制。 在廣場外的路線上,設置一格高的單向落差:從上面走下去會掉下一列,絕不能爬回去。每一段落差都讓回程變成不同的路,所以一條短路線裡就有一個迴圈。第一條路線有十到 25 格落差,對照 101 到 104 號道路的 13 到 24 格;城鎮裡一格都沒有。(規則:斷崖。)39
- 由誰決定。 建築研究拒絕了斷崖,因為無中生有的高度在俯視視角下很難讀懂;一格高的單向落差沒有高度,只是行走圖中一條有方向的邊。這份規格書是收窄那項拒絕,而不是推翻它,而這個系列的高度與路線兩篇文章擁有這個決定。3533
- 不得相似於。 寶可夢的斷崖圖塊(一道帶著淺色上緣與深色陰影線的草地邊)、它的跳躍動畫或音效。在工坊裡以 Kiradex 的調色盤把它畫成石頭路緣或樹籬台階,並有它自己的落下畫格。
- 驗收。 伺服器的行走驗證在落差格有有向邊;一個測試斷言反向的一步會被拒絕;一支廣度優先搜尋腳本回報一條與去程不同的回程路徑。
5. 每週大廳,七個一組
- 機制。 保留大廳已經計畫好的每週評審。把開拓區的形狀加在參與上,而不是加在獲勝上:每七次參賽會在收藏者卡片上得到一枚大廳玫瑰章,而在 35 與 70 次參賽,也就是五組與十組時,大廳管理員會出來看他們的展示。參賽不論何時發生都算數,絕不只限於連續的週,理由同第 3 項。玫瑰章來自參賽與獲得名次,絕不來自購買。(規則:連勝。)25
- 資料。 參賽次數是與收藏者識別碼綁在一起的參與紀錄,所以依 app 自己的規則它是個人資訊:它依伺服器用來識別收藏者的那一個識別碼儲存,不論當時是哪一個,除此之外什麼都不存(目前是 app 為廣場產生的 UUID;一旦伺服器改以 Game Center 玩家 id 為鍵,如世界文件所計畫,就是那個 id;兩者都是持久性識別碼),受隱私權政策涵蓋,絕不傳給分析或廣告,並在刪除請求時與收藏者的其他紀錄一起抹除。它是一個累計數字,沒有個別參賽的紀錄。世界文件沒有設定保存期限;那要留給它已經要求的律師審閱。3786
- 不得相似於。 華麗大賽的類別(Cool、Beauty、Cute、Smart、Tough)、等級名稱(Normal、Super、Hyper、Master)、華麗大賽會場的舞台、表演回合、對戰塔、開拓區標誌、寶可夢的緞帶設計。Kiradex 的玫瑰章是它自己的,用它自己的調色盤。
- 驗收。 一個伺服器測試讓一位模擬參賽者跑完 70 次參賽,並斷言在 7、14 依此類推時得到玫瑰章,在 35 與 70 時管理員來訪;一個以最高等級贊助者進行的測試顯示計分沒有任何差異;一個刪除測試移除一位收藏者後,在其識別碼底下找不到任何殘留的參賽次數。
6. 本週的那句話:一句在廣場之間傳播的話
- 機制。 每個廣場房間都保存一句話:兩個取自 Kiradex 自己預設詞彙的詞,一個感覺加一個收藏用語(「lucky binder」、「quiet holo」)。當有人提出一組詞時,伺服器給它一個介於 25 到 100 之間的峰值,這是 Kiradex 自己的範圍(《綠寶石》的範圍是 30 到 127,受限於一個 7 位元欄位的上限),以及一個介於 25 到該峰值之間的起始分數。分數每天上升 5 直到峰值,在那裡這句話變得陳舊,然後每天下降 5 直到下限 0,在那裡它變得新鮮並再次上升;某一天的移動若會越過峰值或下限,就停在那裡。收藏者可以在布告欄提出一組新的詞;只有在它的分數嚴格較高時才會佔領房間,平手時房間保留自己的。這是 Kiradex 的簡化:《綠寶石》讓一份存檔的第一句話不經比較就進入,並以擲硬幣解決完全平手。當收藏者在房間之間移動時,那句話會跟著他們旅行,而兩個房間的話相遇時,分數較高的勝出。城鎮自己的收藏者會重複目前的那句話。其中一位,也就是詞語收藏家,每次只站在一個房間,每週移動;和他說話會依固定順序解鎖隱藏清單上的下一個預設詞,絕不隨機,而且一天最多一個詞。(規則:會傳播的話、稀有的老師。)428
- 伺服器。 每個房間一筆小小的持久紀錄:兩個詞的索引、一個分數、一個峰值、一個漂移方向,以及最後一次套用漂移時的伺服器日期。讀取時,伺服器依自那個日期以來的每一天套用 5 點,一次一天,然後儲存今天的日期,所以一天只會被套用一次,不論房間被讀取多少次或伺服器重新啟動。《綠寶石》的
UpdatePerDay用一個儲存的日數做同樣的事:它把它與今天的日數比較,把差值傳給流行語,然後儲存今天的日數。22 這筆紀錄屬於房間:其中沒有任何東西說明是誰提出或攜帶了那句話(第 13 節)。 - 兒童安全。 只用預設詞,來自伺服器保存並可以撤除的清單,就像廣場的預設台詞已經是的那樣。沒有自由輸入的文字,也沒有使用者自創的詞。86
- 不得相似於。 簡易會話的詞群與詞(包括那 33 個流行用語)、卡那茲集會所、紫堇市老人、Hipster 的外觀、作為具名功能的紀錄混合、關於流行趨勢的電視節目。
- 驗收。 一個伺服器測試:當一位收藏者從房間 A 走到房間 B 時,A 的分數 90 的話與 B 的分數 60 的話相遇,B 的話變成 A 的;一組與房間的話分數相同的新詞不會佔領。一個漂移測試讓一句話從 45 開始上升,峰值 60:在下一個伺服器日期讀取三次,結果是 50,而不是 60;伺服器重新啟動後,在那個日期讀到的仍然是 50;然後十天沒有讀取,第一次讀取一次套用全部十天,上升到 60、變得陳舊、再下降到 20,和每天讀一次的結果相同;一句陳舊、分數 10 的話,三天後讀到的是 5,在碰到 0 之後上升中。91 一支腳本把預設詞彙與 pokeemerald 的簡易會話詞表做差異比對,找不到任何共有的多詞條目(像「hello」這樣常見的單字無法避免,也沒有關係)。一個詞語收藏家測試:收藏者與他的第 n 次對話,每次在不同的日子,會解鎖隱藏清單上的第 n 個詞,而同一天的重複對話什麼都不會解鎖。
絕不
- 世界裡任何地方都沒有寶可夢的表達: 沒有生物,沒有生物剪影,或是與某隻生物押韻的原創生物,沒有訓練家、道具、地名、音樂、音效、圖塊、sprite、調色盤或畫面版面是取自、描摹自或重畫自任何一款寶可夢遊戲的。37
- 不以系列專有詞彙作為功能名稱: Pokédex、Poké Ball、Poké-任何東西、Trainer Card、Gym、Badge、Elite Four、Hall of Fame、Safari Zone、Repel、Secret Base、Record Mixing、Easy Chat、Trendy Saying、Contest、PokéNav、Pokégear、Match Call、VS Seeker、Battle Tower、Frontier。我沒有查證其中哪些是註冊商標;它們合在一起會把一個產品標記為衍生作品,而致敬遊戲自己的商店說明甚至連系列名稱都不用。31
- 不執行任何被請求的捕獲、戰鬥或騎乘步驟: 沒有任何為了捕獲而瞄準並投擲的東西;沒有捕獲可能性指示器;沒有被釋放去戰鬥的夥伴;沒有飛行或滑翔的坐騎;沒有以兩種模式對戰的被召喚幫手。11121361
- app 或工坊裡沒有任何來自反編譯專案的程式碼或資料。 它們是用來研究與量測的;它們的程式碼與素材衍生自遊戲。
- 行銷中除了 app 自己的規則所允許的那一行指示性描述之外,不出現「Pokémon」: App Store 名稱、副標題、圖示、截圖、廣告與預告片都保持乾淨。3731
- 不做建立在寶可夢懷舊上的群眾募資或媒體推銷。 先上新聞、再募到資金,正是 The Pokémon Company 前法務長所描述的觸發條件。67
- 沒有賭博的形狀,外觀物品也沒有機率: 沒有吃角子老虎,沒有遊戲城,沒有抽獎,沒有隨機道具,不論付費或免費。3336
- 不向 The Pokémon Company 或 Nintendo 寄送任何點子或同人作品, 也不使用它們的粉絲或點子管道:它們的規則把這類作品授權回它們自己,並寫明不接受未經邀請的點子。60
- 卡片圖像不超出辨識用途: 絕不打包附帶,絕不用在行銷美術中,絕不用在周邊商品上。37
- 遊戲獎勵不使用健康或動作資料(第 13 節)。
不在這份規格書裡的東西
代幣與遊戲城(已在上面拒絕);每日抽獎(一個與掃描卡片的收藏編號比對的版本曾經起草又被捨棄,因為它的獎品是隨機的);電話與電視(廣場的預設台詞已經會說話,而一個會打電話給孩子手機的世界,不是我想做的世界);大量出現與群聚(沒有生物可以群聚);電腦裡的箱子(一份收藏在一頁上如何排列,屬於房間那篇文章);自行車與可砍的樹(它們屬於路線);秘密基地的上限(房間那篇文章負責房間的上限);以及寶可夢全能競技賽的任何東西。
誠實的限制
讀了四份專利,三份日本、一份美國,來自 Google Patents,日本專利的請求項是機器翻譯;沒有對計步器、時鐘或會傳播的話做專利檢索;沒有諮詢律師。Palworld 的案子在 2026年10月4日仍未結案:技術說明會排定在 10月1日,沒有任何結果的報導,而法院的初步見解排定在 11月9日。美國再審查的下一步未見報導。The Pokémon Company 的美國法律頁面無法存取。上面的每一項,都是我相信可以作為我們自己的表達自由使用的機制,而每一個這樣的相信都是一種解讀。297980
重點整理
如果您負責畫美術
- 每一個像素都自己畫,用您自己的調色盤與您自己的規則。紀錄中每一個招來行動的同人專案,都使用了遊戲自己的名稱、美術或程式碼,或是連結到這樣做的遊戲。5678
- 一個機制的外觀是表達,即使機制本身不是:斷崖可以是石頭路緣,星星可以是您自己的星星,卡片的顏色可以是您自己的順序。在動手畫之前,先寫明每個元素不得相似於什麼。
- 讓詞彙屬於您自己。Trainer Card、Safari Zone、Secret Base 等名稱會把一個產品標記為衍生作品;致敬遊戲自己的商店說明甚至連系列名稱都不用。31
如果您負責做引擎
- 計算世界裡的步數,而不是人身上的步數:一次經伺服器驗證的一格移動,絕不為了一件裝飾而用 Core Motion 或 HealthKit。8684
- 在到達時以日期鍵計算當天(
startOfDay(for:)、isDate(_:inSameDayAs:)),在NSCalendarDayChanged時重新啟動,並且不在背景保持任何東西運轉;那就是用 Swift 寫的《綠寶石》UpdatePerDay。87888922 - 任何共享的東西依伺服器的時鐘運作,任何私人且純外觀的東西依手機的時鐘運作。
- 絕不出貨任何來自反編譯專案的程式碼或資料;讀它、量它、引用它。
如果您負責設計迴圈
- 以粗節拍(128 到 512 步)回報走路,以步數而不是秒數來花預算,並讓離開的代價很小:《綠寶石》成熟的樹果會等四個階段長度才掉落,只有非常長的離開才會清除那棵樹。1214153
- 給一週有名字的日子,每天最多一個約會,並保留一個什麼都不會改變的安全房間。192122
- 四顆星,四種不同類型的遊玩,沒有一顆是賣的;當您的玩家是孩子時,計算參賽次數,而不是不中斷的連續紀錄;外觀物品不靠機率,也不跟時鐘賽跑。2336
- 讓別人的世界來到您的世界:一句帶有分數、漂移與接觸規則的話,會在玩家相遇時旅行,不需要任何宣告。426
- 逐步閱讀您所屬類型中的專利請求項,記下您的設計確實執行了哪些步驟(在這裡,依輸入移動角色就是其中之一),並排除那些讓每項請求項之所以成立的步驟;然後清楚說明您讀了哪些專利。這是我的解讀,不是法律意見。11121361
常見問題
可以做一款受寶可夢啟發的遊戲而不被告嗎?
沒有人能保證這一點,而這也不是法律意見。不過紀錄是一致的:這份紀錄中 2016 到 2024 年間招來撤下的同人專案,都使用了寶可夢自己的名稱、美術或程式碼,或是連結到這樣做的遊戲;而唯一一件為機制而打的案子 Palworld,所依據的專利,其請求項要求特定的步驟,例如瞄準並投擲捕獲道具。567810 版權不保護系統或操作方法,但商標保護名稱,而專利可以請求一種遊戲方法。4411 像 Coromon、Temtem 與 Cassette Beasts 這樣的致敬遊戲以自己的美術推出這個類型,而它們 Steam 頁面上的簡短與完整說明,也就是我計算過的、由開發者撰寫的欄位,從不使用這個名稱;Temtem 的頁面在一則媒體引述中出現過一次。31
Pokémon Uranium 收到過停止侵權函嗎?
依它的開發者的說法,沒有。他們的聲明由 Kotaku 在 2016年8月13日報導,寫道在超過 1,500,000 次下載之後,他們已「been notified of multiple takedown notices from lawyers representing Nintendo of America」(得知代表 Nintendo of America 的律師發出了多份撤下通知),而且「we have not personally been contacted」(沒有人直接聯絡我們);是他們自己移除了下載連結。5 Pokémon Prism 則確實收到了一封,在 2016年12月21日,預定發布日的四天前。665
Nintendo 與 The Pokémon Company 是以哪些專利控告 Palworld?
三項日本專利,由 Pocketpair 在 2024年11月8日的報告中指名:第 7545191 號(從準備姿勢瞄準並投擲捕獲道具或戰鬥角色,並以第二個按鈕選擇道具或角色)、第 7493117 號(顯示捕獲成功可能性的指示器),以及第 7528390 號(騎乘自己擁有的角色,包括在半空中登上會飛的角色)。三項都是在 2024 年、Palworld 發售之後,以分割申請的形式提出,其優先權可追溯到 2021年12月22日提出的申請。1072111213 一項美國專利 12,403,397,內容是一個以兩種模式對戰的被召喚副角色,正在再審查中,而沒有任何針對 Pocketpair 的美國訴訟被報導過。6179
Palworld 的訴訟結束了嗎?
截至 2026年10月4日,還沒有。Automaton 在 2026年6月依據東京地方法院的紀錄報導,原告在 2025年11月把請求縮小到 Palworld 的舊版本,同時仍在請求禁制令,技術說明會排定在 2026年10月1日,法院的初步見解排定在 2026年11月9日。沒有任何判決、和解或禁制令的報導,而 Pocketpair 自 2025年5月8日以來沒有張貼任何關於這件訴訟的內容。2930
Nintendo 允許同人遊戲嗎?
據我所能找到的,沒有任何公開的 Nintendo 或寶可夢指南涵蓋同人遊戲。Nintendo 的遊戲內容指南涵蓋遊戲畫面與截圖,並寫道對其智慧財產的任何其他使用「is subject to the relevant laws of the applicable jurisdiction」(受適用司法管轄區的相關法律規範);The Pokémon Company 的日本網站規則把衍生作品授權回公司,卻不授權給創作者任何超出個人使用的權利。8160 依我的解讀,沒有安全港,只有執法裁量;該公司的前法務長曾說,觸發條件是先上新聞、再募到資金。67
舊寶可夢遊戲的計步器是怎麼運作的?
大地圖上的每一步都會經過一支常式。在《金》《銀》《水晶》裡,它每 256 步讓隊伍裡的蛋往孵化前進,每 512 步提高隊伍的親密度(它的親密度常式每 256 步被呼叫一次,每隔一次呼叫才動作),每 4 步讓中毒的寶可夢受傷,並在騎了 1,024 步自行車後讓自行車店老闆打電話來;在《綠寶石》裡,每 128 步隊伍中的每隻寶可夢有 50% 的機率獲得親密度,而蛋每 256 步少一個週期,依隊伍順序直到第一顆準備好孵化的蛋為止。狩獵地帶(500 步)與除蟲噴霧(100、200 與 250 步)是靠走路來花的預算。121415411617
《金》《銀》的即時時鐘改變了什麼?
一天有三個時段,早上從 4:00、白天從 10:00、夜晚從 18:00 開始;捕蟲大會在週二、週四與週六舉行,每次 20 分鐘;幸運號碼抽獎每週一次,在週五;24 位訓練家各自可以在某個星期幾的某個時段被打電話約再戰;而 16 個每日旗標在午夜重設。1819214620 《綠寶石》在這之上加了一份行事曆:需要 4 到 96 小時才結果的樹果,以及一句每天漂移 5 點的流行語。34
本站相關文章:iPhone 上的像素藝術世界 是這個系列的第一篇指南,包含圖塊系統、調色盤,以及繪製這座城鎮所用的 RealityKit 配方,而它的法律常見問題就是這裡第 7 到 10 節的簡短版;像素藝術建築 建造了城鎮的房屋、大廳,以及那盆植物將會擺放的房間,並把單向斷崖列在城鎮尚未擁有的東西之中;像素藝術人物 是將會走那 256 步的收藏者,並附有關於外觀物品與兒童的規則,第 3 項從連續紀錄改成不同日子的這項變更就是以它為依據。
來源
-
pret,
pokecrystal/engine/overworld/events.asm,commit5beda23(CountStep從第 877 行起:DoRepelStep、wStepCount,註解「Every 256 steps, increase the happiness of all your Pokemon,」「Every 256 steps, offset from the happiness incrementor by 128 steps」與cp $80、「Every 4 steps, deal damage to all poisoned Pokemon」;培育屋的經驗值步數;DoBikeStep從第 1279 行起,含cp HIGH(1024)與 65,535 的上限),https://github.com/pret/pokecrystal/blob/master/engine/overworld/events.asm。常數與行號由作者為本文準備的證據資料夾中的measure_systems.py印出(輸出為measure_systems.out.txt),2026年10月4日執行;行為描述是作者對程式碼的解讀。 ↩↩↩↩↩↩↩↩↩↩↩ -
pret,
pokecrystal/engine/events/happiness_egg.asm,commit5beda23(StepHappiness在第 107 行;其註解「Raise the party’s happiness by 1 point every other step cycle」在第 108 行;ld hl, wHappinessStepCount、inc a、and 1、ld [hl], a、ret nz在第 110 到 115 行;以cp EGG略過蛋),https://github.com/pret/pokecrystal/blob/master/engine/events/happiness_egg.asm,每當一位元組的wStepCount繞回時,由engine/overworld/events.asm裡的CountStep呼叫。行號由measure_systems.py印出,輸出為measure_systems.out.txt,2026年10月4日重新執行;親密度每 512 步上升是作者對這個切換的解讀。 ↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/berry.c,commit731ad5b(BerryTreeTimeUpdate、第 1089 行的* 71清除測試、第 1109 與 1127 行的minutesUntilNextStage *= 4、第 1071 行的 10 次重新生長重設、第 1252 行回傳stageDuration * 60的GetStageDurationByBerryType、CalcBerryYieldInternal;第 1064 到 1072 行的BerryTreeGrow,其中結果階段結束時設定berryYield = 0並把階段設回BERRY_STAGE_SPROUTED;43 種樹果的stageDuration值)與pokeemerald/src/clock.c(UpdatePerMinute),https://github.com/pret/pokeemerald/blob/master/src/berry.c。依階段時長的計數(1 小時:5,3:12,4:1,6:11,12:1,18:5,24:8)與到第一次結果的時數由measure_systems.py導出,輸出為measure_systems.out.txt,2026年10月4日。 ↩↩↩↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/dewford_trend.c,commit731ad5b(檔案開頭的註解:流行度「Initialized as a random value between 30-127 inclusive,」、採用與「boring」的規則、SAVED_TRENDS_COUNT (5)、紀錄混合的規則;第 96 行含clockRand = days * 5的UpdateDewfordTrendPerDay;第 369 到 383 行的SeedTrendRng,它抽出Random() % 98再加 30;從第 151 行起的TrySetTrendyPhrase,其第 158 到 169 行的首次提交分支在存檔從未改變流行語、也從未混合紀錄時不經比較就設定詞,而第 181 行的比較在SORT_MODE_NORMAL下使用CompareTrends,第 332 到 337 行與第 366 行:先比流行度,再比最大流行度,完全平手時用Random() & 1),https://github.com/pret/pokeemerald/blob/master/src/dewford_trend.c,以及同一 commit 的include/global.h(第 643 與 644 行的trendiness:7與maxTrendiness:7,所以分數不可能超過 127)。行號由measure_systems.py印出。 ↩↩↩↩↩↩↩↩↩↩↩ -
Jason Schreier,「Pokémon Uranium Creators Pull Game After A Reported 1.5 Million Downloads」,Kotaku,2016年8月13日(頁面上的日期;美東時間 20:34,即 UTC 的 8月14日),附開發者聲明全文,2026年10月4日查閱,https://kotaku.com/pokemon-uranium-creators-pull-game-after-1-5-million-do-1785258831。 ↩↩↩↩↩↩↩↩
-
Heather Alexandra,「Pirates Leak Pokémon Prism After Nintendo Shuts It Down」,Kotaku,2016年12月29日(12月21日的停止侵權函、預定的聖誕節發布、Pokémon Brown 與 Rijon Adventures 被撤下),2026年10月4日查閱,https://kotaku.com/pirates-leak-pokemon-prism-after-nintendo-shuts-it-down-1790598623。 ↩↩↩↩↩↩↩
-
Cohen Coberly,「Nintendo slaps fan game creation tool ‘Pokemon Essentials’ with DMCA takedown」,TechSpot,2018年8月29日,承接 Ars Technica 的報導(Fandom 照辦、PokéCommunity 的下載被移除、關於素材的引述),2026年10月4日查閱,https://www.techspot.com/news/76202-nintendo-slaps-fan-game-creation-tool-pokemon-essentials.html。 ↩↩↩↩↩
-
Catherine Lewis,GamesRadar+,「After almost 10 years, unofficial Pokemon website known for sharing fan-made games shuts down after reportedly receiving a DMCA takedown notice」,2024年3月22日(Relic Castle 的聲明;連結而非託管;發送者未獲確認),2026年10月4日查閱,https://www.gamesradar.com/after-almost-10-years-unofficial-pokemon-website-known-for-sharing-fan-made-games-shuts-down-after-reportedly-receiving-a-dmca-takedown-notice/。 ↩↩↩↩↩↩
-
Nintendo Co., Ltd. 與 The Pokémon Company,「Filing Lawsuit for Infringement of Patent Rights against Pocketpair, Inc.」,聯合新聞稿,2024年9月19日(2024年9月18日向東京地方法院提起;禁制令與損害賠償),2026年10月4日查閱,https://www.nintendo.co.jp/corporate/release/en/2024/240919.html。 ↩↩
-
Pocketpair,「Report on Patent Infringement Lawsuit」,重要公告,2024年11月8日(Palworld 於 2024年1月19日發售;專利第 7545191、7493117 與 7528390 號及其申請日與登錄日;禁制令,以及對每位原告 500 萬日圓加遲延損害金),2026年10月4日查閱,https://www.pocketpair.jp/en/news/report-on-patent-infringement-lawsuit/。 ↩↩↩↩↩↩
-
Google Patents,JP7493117B2,「Game program, game system, game device, and game processing method」(受讓人 Nintendo Co., Ltd. 與 The Pokémon Company;申請日 2024年2月26日;優先權表列出的優先權日為 2021年12月22日,主張優先權的申請表列出當天提出的 JP2021208275A 為 JP7398425B2,而公開清單列出 JP7398425B2 於 2023年12月14日公告),請求項 1 為 Google 從日文的機器翻譯,2026年10月4日儲存,並由作者為本文準備的證據資料夾中的
measure_patent_claims.py擷取(輸出為measure_patent_claims.out.txt),https://patents.google.com/patent/JP7493117B2/en。以日文文本為準。 ↩↩↩↩↩↩↩↩↩↩ -
Google Patents,JP7545191B1,「Game program, game system, game device, and game processing method」(受讓人 Nintendo Co., Ltd. 與 The Pokémon Company;申請日 2024年7月30日;優先權日 2021年12月22日,經由其母案 JP2024031879A,它是與 JP2021208275A 同一家族的分割案,JP2021208275A 於 2021年12月22日提出,2023年12月14日公告為 JP7398425B2),請求項 1 為 Google 的機器翻譯,2026年10月4日儲存並由
measure_patent_claims.py擷取,https://patents.google.com/patent/JP7545191B1/en。以日文文本為準。 ↩↩↩↩↩↩↩↩ -
Google Patents,JP7528390B2,「Game program, game system, information processing device, and information processing method」(受讓人 Nintendo Co., Ltd. 與 The Pokémon Company;申請日 2024年3月5日;優先權日 2021年12月22日,屬於當天提出的 JP2021208276A 的家族,該案於 2023年9月22日公告為 JP7349486B2),請求項 1 為 Google 的機器翻譯,2026年10月4日儲存並由
measure_patent_claims.py擷取,https://patents.google.com/patent/JP7528390B2/en。以日文文本為準。 ↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/field_control_avatar.c,commit731ad5b(TryStartStepCountScript,第 543 到 604 行,包括第 565 行的ShouldDoBrailleRegicePuzzle與IslandCave_EventScript_OpenRegiEntrance,以及第 570 到 590 行的五個ShouldDo...Call檢查;親密度用的第 620 行(*ptr) %= 128;中毒用的第 645 行(*ptr) %= 4,在秘密基地中略過),https://github.com/pret/pokeemerald/blob/master/src/field_control_avatar.c。行號由measure_systems.py印出。 ↩↩↩↩↩↩↩↩ -
pret,
pokeemerald/src/pokemon.c,commit731ad5b(從第 5914 行起的AdjustFriendship;以species != SPECIES_EGG排除蛋;FRIENDSHIP_EVENT_WALKING的註解「50% chance every 128 steps」與第 5950 到 5952 行的if (Random() & 1) return;;第 2100 行的步行修正值{ 1, 1, 1}),https://github.com/pret/pokeemerald/blob/master/src/pokemon.c,以及src/field_control_avatar.c(UpdateFriendshipStepCounter,它在第 624 到 626 行為隊伍的每個欄位呼叫AdjustFriendship(mon, FRIENDSHIP_EVENT_WALKING))。行號由measure_systems.py印出,2026年10月4日重新執行;平均每 256 步一次,是從 128 步節拍上 50% 的擲骰導出的。 ↩↩↩↩↩↩ -
pret,
pokered/scripts/SafariZoneGate.asm,commitd2704a6(第 186 行的 30 顆球、第 188 與 190 行的HIGH(502)/LOW(502)、第 214 行的 ¥500 文字,接著第 192 到 194 行的ld a, PAD_UP、ld c, 3與call SafariZoneEntranceAutoWalk,以及第 195 行的SetEvent EVENT_IN_SAFARI_ZONE;步數本身在engine/events/hidden_events/safari_game.asm裡遞減,本文未模擬),https://github.com/pret/pokered/blob/master/scripts/SafariZoneGate.asm,以及731ad5b的pokeemerald/src/safari_zone.c(第 61 行的sSafariZoneStepCounter = 500),https://github.com/pret/pokeemerald/blob/master/src/safari_zone.c。行號由measure_systems.py印出。 ↩↩↩↩↩ -
pret,
d2704a6的pokered/engine/items/item_effects.asm(ItemUseRepelld b, 100、ItemUseSuperRepelld b, 200、ItemUseMaxRepelld b, 250),https://github.com/pret/pokered/blob/master/engine/items/item_effects.asm,以及731ad5b的pokeemerald/src/data/items.h(holdEffectParam100、200、250),https://github.com/pret/pokeemerald/blob/master/src/data/items.h。行號由measure_systems.py印出。 ↩↩↩↩↩ -
pret,
5beda23的pokecrystal/constants/misc_constants.asm(MORN_HOUR 4、DAY_HOUR 10、NITE_HOUR 18,第 36 到 38 行)與pokecrystal/engine/rtc/rtc.asm(TimesOfDay表及其第 50 行的註解;未使用的BetaTimesOfDay),https://github.com/pret/pokecrystal/blob/master/constants/misc_constants.asm 與 https://github.com/pret/pokecrystal/blob/master/engine/rtc/rtc.asm。行號由measure_systems.py印出。 ↩↩↩↩ -
pret,
5beda23的pokecrystal/maps/Route35NationalParkGate.asm(週二、週四與週六的星期檢查,第 38 到 40 行)與pokecrystal/constants/script_constants.asm(BUG_CONTEST_BALLS 20、BUG_CONTEST_MINUTES 20,第 293 與 294 行),https://github.com/pret/pokecrystal/blob/master/maps/Route35NationalParkGate.asm。行號由measure_systems.py印出。 ↩↩↩↩↩↩↩ -
pret,
5beda23的pokecrystal/constants/engine_flags.asm(wDailyFlags1與wDailyFlags2,各 8 個旗標),https://github.com/pret/pokecrystal/blob/master/constants/engine_flags.asm。由measure_systems.py計數。 ↩↩↩↩ -
pret,
5beda23的pokecrystal/engine/overworld/time.asm(.GetDaysUntilNextFriday,第 241 行)與pokecrystal/engine/events/lucky_number.asm(與每一隻擁有的寶可夢 ID 的比對,以及三個獎項等級),https://github.com/pret/pokecrystal/blob/master/engine/events/lucky_number.asm。行號由measure_systems.py印出;獎項等級是作者對這支常式的解讀。 ↩↩↩↩↩↩↩↩ -
pret,
731ad5b的pokeemerald/src/clock.c(UpdatePerDay,它在第 38 行讀取儲存的日數VAR_DAYS,在第 41 行把它與今天的日數比較,在第 43 行計算daysSince,在第 44 到 54 行以它進行十一次呼叫,並在第 55 行儲存今天的日數;其中兩個是UpdateFrontierManiac與UpdateFrontierGambler,以及每日與每分鐘更新前方第 28 行的!InPokemonCenter()防護),https://github.com/pret/pokeemerald/blob/master/src/clock.c。行號由measure_systems.py印出。 ↩↩↩↩↩↩↩↩↩↩ -
pret,
731ad5b的pokeemerald/src/trainer_card.c(依星星數的豐緣與關都卡片配色,第 267 到 280 行;CountPlayerTrainerStars,第 663 到 677 行;GetRubyTrainerStars,第 679 到 692 行,用於《紅寶石》或《藍寶石》的卡片:名人堂首次登錄時間、caughtAllHoenn、第 687 行的battleTowerStraightWins > 49與hasAllPaintings;第 711 到 743 行的 9,999 與 999 上限),https://github.com/pret/pokeemerald/blob/master/src/trainer_card.c。行號由measure_systems.py印出;《紅寶石》與《藍寶石》不在複製之中,所以它們的規則是從這段解讀其卡片的程式碼讀出的。 ↩↩↩↩↩↩↩↩↩ -
pret,
pokered/constants/pokemon_data_constants.asm(MONS_PER_BOX 20、NUM_BOXES 12)、pokecrystal/constants/pokemon_data_constants.asm(MONS_PER_BOX 20、MONS_PER_BOX_JP 30、NUM_BOXES 14)與pokeemerald/include/pokemon_storage_system.h(TOTAL_BOXES_COUNT 14、IN_BOX_ROWS 5、IN_BOX_COLUMNS 6、箱子名稱與桌布),https://github.com/pret/pokeemerald/blob/master/include/pokemon_storage_system.h。行號由measure_systems.py印出。 ↩↩↩ -
pret,
731ad5b的pokeemerald/include/constants/battle_frontier.h(MAX_STREAK 9999、FRONTIER_STAGES_PER_CHALLENGE 7)與pokeemerald/src/frontier_util.c(Frontier Brain 連勝表,第 88 到 94 行,其第四欄是修正值;GetFrontierBrainStatus,第 1656 到 1693 行,第 1662 行為winStreakNoModifier + sFrontierBrainStreakAppearances[facility][3],第 1674 行為比較;從第 2111 行起的IncrementWinStreak)。每種連勝計算的是什麼,讀自同一 commit 的各設施腳本:對戰塔、宮殿、競技場與工廠的對戰房間在每擊敗一位對手後呼叫BattleFrontier_EventScript_IncrementWinStreak,並在對戰數到達 7 時結束挑戰(各房間scripts.inc裡的case 7:塔第 51 行、宮殿第 70 行、競技場第 107 行、工廠第 104 行);金字塔在BattlePyramid_WarpToNextFloor中呼叫它(data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc,第 88 行),並在第 7 層之後把玩家送到頂端(第 93 行);巨蛋在每贏得一場錦標賽時呼叫它一次,位於BattleFrontier_BattleDomeLobby_EventScript_WonChallenge(data/maps/BattleFrontier_BattleDomeLobby/scripts.inc,第 44 與 45 行),而IncrementWinStreak(src/frontier_util.c,第 2130 到 2134 行)會同時提高domeWinStreaks與domeTotalChampionships;一場錦標賽是DOME_ROUNDS_COUNT 4回合(include/constants/battle_dome.h,第 8 行)。(src/battle_dome.c裡的IncrementDomeStreaks也會做同樣的事,但它的巨集dome_incrementstreaks在data/中沒有任何地方使用。)include/constants/battle_pike.h在第 4 行設定NUM_PIKE_ROOMS 14,並列出九種房間,其中包括完全與部分回復、狀態異常房間,以及有非玩家角色的房間,而src/battle_pike.c在第 1401 行把管道的連勝除以NUM_PIKE_ROOMS,https://github.com/pret/pokeemerald/blob/master/src/frontier_util.c。行號由measure_systems.py印出。 ↩↩↩↩↩↩ -
pret,
731ad5b的pokeemerald/src/record_mixing.c(混合紀錄的布局,第 67 到 78 行,結束於偏移量0x1434加上 16 位元組的填充,共0x1444位元組),https://github.com/pret/pokeemerald/blob/master/src/record_mixing.c。行號由measure_systems.py印出。 ↩↩↩↩↩↩ -
pret,
731ad5b的pokeemerald/include/constants/tv.h(POKENEWS_COUNTDOWN 4、NUM_NORMAL_TVSHOW_SLOTS 5、5 加 20 的TV_SHOWS_COUNT;節目種類,由measure_systems.py計數為 11 種一般、19 種僅限紀錄混合與 1 種大量出現;第 84 行的NUM_CUTIES_RIBBONS 4,也就是 Spot the Cuties 的呼叫端用來比較的常數),https://github.com/pret/pokeemerald/blob/master/include/constants/tv.h。 ↩↩↩↩↩ -
pret,
731ad5b的pokeemerald/src/easy_chat.c(第 5429 到 5436 行關於流行用語的註解)、pokeemerald/include/constants/easy_chat.h(NUM_TRENDY_SAYINGS 33)、pokeemerald/src/mauville_old_man.c((trainerId % 10) / 2,第 120 行)與pokeemerald/include/constants/mauville_old_man.h(五種老人),https://github.com/pret/pokeemerald/blob/master/src/easy_chat.c 與 https://github.com/pret/pokeemerald/blob/master/src/mauville_old_man.c。行號由measure_systems.py印出。 ↩↩↩↩↩↩↩ -
Automaton West,「Nintendo and The Pokémon Company have reportedly narrowed Palworld lawsuit to older versions of the game only, likely thanks to ‘preventive’ updates by Pocketpair」,2026年6月12日(Automaton 日本員工查閱的東京地方法院紀錄,以及 Games Fray;2025年11月的變更;仍在請求的禁制令;2026年10月1日與11月9日的日期;宣布的 7月10日上市),2026年10月4日查閱,https://automaton-media.com/en/news/nintendo-and-the-pokemon-company-have-reportedly-narrowed-palworld-lawsuit-to-older-versions-of-the-game-only-likely-thanks-to-preventive-updates-by-pocketpair/。 ↩↩↩↩↩↩
-
Pocketpair,重要公告列表,2026年10月4日查閱(最新一則公告為 2026年1月12日,關於一款卡牌遊戲;關於訴訟的最新一則為 2025年5月8日),https://www.pocketpair.jp/en/news/category/important-en/。查無報導只代表作者找不到,不是證明。 ↩↩↩
-
作者的計數,2026年10月4日:草稿旁的
figures/steam_names.py,處理作者為本文準備的證據資料夾中儲存的七筆 Steam app details 紀錄(steam_*.html;Coromon 1218210、Nexomon: Extinction 1196630、Cassette Beasts 1321440、Temtem 745920、Monster Sanctuary 814370、Moonstone Island 1658150、Palworld 1623730),逐欄計算「Pokémon」或「Pokemon」:每一份簡短與完整說明中都是零;Temtem 的reviews欄位中一次,是一則 Rock Paper Shotgun 的引述。輸出為figures/steam_names.out.txt。 ↩↩↩↩↩↩↩ -
Nintendo Life,「’The Single Best Game Concept Ever’ - Pokémon-Inspired Devs Talk The Series That Started It All」,2026年3月2日(Andrades、JVemon、Pouwels、Spink、Coxon),2026年10月4日查閱,https://www.nintendolife.com/features/the-single-best-game-concept-ever-pokemon-inspired-devs-talk-the-series-that-started-it-all。 ↩↩
-
作者的研究檔案,「Homage without borrowing」,2026年10月4日,Kiradex 儲存庫中的
docs/research/homage/01-homage.md:本文第 14 節所依據的規格書、建築研究對斷崖的拒絕(其第 8.8 節)、收藏研究中關於隨機付費道具與吃角子老虎的條目,以及廣場伺服器只處理在場狀態的設計。私有儲存庫。 ↩↩↩↩↩↩↩↩↩↩↩ -
Blake Crosley,「Pixel-Art Worlds on iPhone: What the 16-Bit Masters Knew」,blakecrosley.com,2026年10月3日,2026年10月4日更新(工坊十四道色階中的 58 個顏色;法律常見問題,於 10月4日更正為明確指出版權並加入 Palworld 的專利),https://blakecrosley.com/blog/pixel-art-world-on-iphone。 ↩↩↩↩↩
-
Blake Crosley,「Pixel-Art Structures: Houses, Halls and Interiors on iPhone」,blakecrosley.com,2026年10月3日(房間、大廳,以及列在城鎮所沒有的東西中的「a one-way ledge」),https://blakecrosley.com/blog/pixel-art-structures-on-iphone。 ↩↩↩↩
-
Blake Crosley,「Pixel-Art People: Characters and a Creator on iPhone」,blakecrosley.com,2026年10月3日(PEGI 自 2026年6月起對付費隨機道具與會過期的登入連續紀錄的分級;它的規則:每一件外觀物品都是「purely visual, never random, never on a countdown」),https://blakecrosley.com/blog/pixel-art-characters-on-iphone。 ↩↩↩↩↩↩↩↩
-
作者的 app,Kiradex 儲存庫,commit
b1b78b1(2026年10月4日),docs/WORLD.md第 1 節「Can this exist without being sued」(Kiradex World 的規則、指示性描述那一行、卡片圖像僅供辨識,以及本文更正的早先 Uranium 措辭)、第 2 節(盡可能少收集資料的設計,第 146 到 149 行),以及第 3 節中的資料段落(以 Game Center 玩家 id 為鍵的伺服器,一個 COPPA 在與其他資料結合時視為個人資訊的持久性識別碼、隱私權政策、沒有第三方分析或廣告、應要求刪除,第 199 到 206 行)。私有儲存庫。 ↩↩↩↩↩↩↩↩ -
作者的量測,2026年10月4日,2026年10月5日擴充為印出註腳引用的每一行:作者為本文準備的證據資料夾中的
measure_systems.py,執行於 pret 的pokered(d2704a6)、pokecrystal(5beda23)、pokeemerald(731ad5b)與pokefirered(037335f)的淺層複製上,分別是日期為 2026年9月22日、9月29日、10月1日與 9月26日的 master 分支 commit(在每個複製中以git show -s確認);它印出每個常數及其檔案與行號並導出計數,輸出為measure_systems.out.txt。這些儲存庫的 README 列出它們建置的每個 ROM 的 SHA-1,例如 https://github.com/pret/pokeemerald/blob/master/README.md。 ↩↩ -
作者的量測,2026年10月4日:作者為本文準備的證據資料夾中的
measure_map_features.py,處理 pret 的pokeemerald在731ad5b的每一個data/maps/*/map.json,把每個不重複布局的map.bin對照其主要與次要的metatile_attributes.bin(斷崖MB_JUMP_*;限定越野自行車的MB_MUDDY_SLOPE與MB_CRACKED_FLOOR;限定特技自行車的軌道與MB_BUMPY_SLOPE;MB_TALL_GRASS),並在所有地圖上計算OBJ_EVENT_GFX_CUTTABLE_TREE物件;為本文重新執行,輸出儲存為草稿旁的figures/measure_map_features.out.txt。計的是格子,不是地形特徵;共用的布局只算一次。 ↩↩↩↩↩↩↩↩↩ -
pret,
pokecrystal/engine/overworld/events.asm,commit5beda23(第 892 與 893 行的註解「decrease the hatch counter of all your eggs until you reach the first」與「one that is ready to hatch」;第 898 與 899 行的farcall DoEggStep與jr nz, .hatch;.hatch在第 928 行載入PLAYEREVENT_HATCH,它會執行HatchEggScript,也就是第 999 行的標籤,其第 1000 行為callasm OverworldHatchEgg),以及同一 commit 的pokecrystal/engine/pokemon/breeding.asm(從第 174 行起的DoEggStep:它依序走過wPartySpecies,跳過任何不是EGG的東西,遇到蛋時在第 185 行執行dec [hl],並在計數器到達 0 時於第 189 行以非零結果返回),https://github.com/pret/pokecrystal/blob/master/engine/pokemon/breeding.asm。後面的蛋要等下一個節拍,是作者對這個提早返回的解讀。 ↩ -
pret,
731ad5b的pokeemerald/src/daycare.c(第 890 行的(daycare->mons[1].steps & 0xFF) == 0xFF;第 898 行的++daycare->stepCounter == 255;GetEggCyclesToSubtract;從第 903 行起的隊伍迴圈,它在第 907 行跳過MON_DATA_SANITY_IS_BAD_EGG,只在第 911 行eggCycles != 0時減少,否則在第 922 行設定gSpecialVar_0x8004 = i並在第 923 行返回,所以迴圈結束在那顆蛋;接著ShouldEggHatch在src/field_control_avatar.c第 554 到 557 行啟動EventScript_EggHatch),https://github.com/pret/pokeemerald/blob/master/src/daycare.c。行號由measure_systems.py印出。 ↩↩↩ -
pret,
731ad5b的pokeemerald/src/battle_setup.c(第 1792 行的STEP_COUNTER_MAX 255、第 1796 行的HasAtLeastFiveBadges()),https://github.com/pret/pokeemerald/blob/master/src/battle_setup.c,以及037335f的pokefirered/src/vs_seeker.c(第 855 行的vsSeekerChargeSteps == 100),https://github.com/pret/pokefirered/blob/master/src/vs_seeker.c。行號由measure_systems.py印出。 ↩↩ -
作者的圖表,2026年10月4日繪製(請求項矩陣的法律註記於 2026年10月5日重繪),由草稿旁的
figures/figures.py依measure_systems.out.txt、measure_map_features.out.txt、measure_patent_claims.out.txt、儲存的美國專利頁面、第 8 與第 9 節引用的附日期紀錄頁面,以及Kiradex/World/Daylight.swift繪製;腳本在繪製之前會重新讀取並斷言來源數值。沒有遊戲美術,沒有標誌。 ↩↩↩↩↩↩ -
美國版權局,Circular 33: Works Not Protected by Copyright,https://www.copyright.gov/circs/circ33.pdf,引用方式同本系列第一篇文章(其註腳 19,2026年10月2日查閱)。 ↩↩↩↩
-
作者的 app,Kiradex 儲存庫,commit
b1b78b1:Kiradex/World/Daylight.swift(Phase.init(hour:):case 6..<9: self = .morning、9..<17白天、17..<20傍晚,其餘為夜晚;讀取-plazaHour啟動參數的Daylight.forcedHour,第 100 到 105 行)、Kiradex/World/PlazaStage.swift(daylight(at:),在設定了Daylight.forcedHour時使用它,第 58 行)與KiradexUITests/KiradexUITests.swift(一次以-plazaHour 21啟動的行走)。私有儲存庫。 ↩↩↩↩↩ -
pret,
5beda23的pokecrystal/constants/phone_constants.asm(CONTACT_LIST_SIZE 10)與pokecrystal/constants/engine_flags.asm(wDailyRematchFlags24、wDailyPhoneItemFlags10、wDailyPhoneTimeOfDayFlags24;依星期幾的來電時段,週一 3、週二 3、週三 4、週四 4、週五 4、週六 3、週日 3,以及依時段,早上 9、下午 7、夜晚 8,由measure_systems.py計數),https://github.com/pret/pokecrystal/blob/master/constants/phone_constants.asm。 ↩↩↩↩↩ -
pret,
731ad5b的pokeemerald/include/constants/flags.h(12 個具名的FLAG_DAILY_*旗標,其中 9 個是樹果贈禮),https://github.com/pret/pokeemerald/blob/master/include/constants/flags.h。由measure_systems.py列出。 ↩ -
pret,
731ad5b的pokeemerald/include/constants/berry.h(第 20 到 26 行的階段常數、第 130 行的BERRY_TREES_COUNT 128),https://github.com/pret/pokeemerald/blob/master/include/constants/berry.h。行號由measure_systems.py印出。 ↩ -
作者的列舉,2026年10月5日:作者為本文準備的證據資料夾中的
enumerate_berry_yield.py,它印出731ad5b的 pokeemeraldsrc/berry.c中的CalcBerryYieldInternal(第 1210 到 1234 行:完全沒澆水時return min;否則在(max - min) * (water - 1)到(max - min) * water之間取randMin + Random() % (randMax - randMin + 1),除以NUM_WATER_STAGES(4),並四捨五入),讀取 43 種樹果的minYield與maxYield(14 種為 1 到 2、14 種為 2 到 3、5 種為 2 到 4、5 種為 2 到 6、5 種為 3 到 6),並列出每一種澆水階段數可能給出的每一種產量;輸出為enumerate_berry_yield.out.txt。 ↩ -
Serebii.net,「Pokéathlon」(《心金》《魂銀》;三個項目一輪、第一名加分、每日商店,以及「Daily & Weekly Events」標題),2026年10月4日查閱,https://www.serebii.net/heartgoldsoulsilver/pokeathlon.shtml。次級來源;未經量測。 ↩
-
pret,
731ad5b的pokeemerald/src/tv.c(在第 1115 行由TryPutPokemonTodayOnAir呼叫的TryStartRandomMassOutbreak、第 1652 行的通關旗標,以及第 1654 到 1657 行檢查既有大量出現的迴圈,它執行i < LAST_TVSHOW_IDX,而LAST_TVSHOW_IDX在第 49 行定義為TV_SHOWS_COUNT - 1,所以它檢查 25 個欄位中的第 0 到 23 個;從第 1563 行起的StartMassOutbreak,它在第 1578 行設定outbreakDaysLeft = 2,並在第 4906 行由DoTVShowPokemonNewsMassOutbreak呼叫,也就是大量出現的報導在電視上播放時;UpdateTimeBeforeMassOutbreak,第 1716 到 1737 行,每天倒數daysBeforeOutbreak,而GetRandomActiveShowIdx只在它到達 0 時才把大量出現的報導提供給電視,第 800 行;第 1659 行的rbernoulli(1, 200)、第 1661 與 1662 行的空欄位檢查,其中從第 3118 行起的FindFirstEmptyNormalTVShowSlot只在前NUM_NORMAL_TVSHOW_SLOTS(5)個欄位中尋找已停播的一個、第 1680 行的probability = 50、第 1682 行的daysBeforeOutbreak = 1),https://github.com/pret/pokeemerald/blob/master/src/tv.c,以及src/battle_main.c(從第 5098 行起的HandleEndTurn_FinishBattle,它在第 5102 到 5108 行略過連線、連線錄影、首戰、狩獵地帶、e-Reader、小光(Wally)教學與開拓區的對戰,並在第 5126 行呼叫TryPutPokemonTodayOnAir)。行號由measure_systems.py印出。 ↩↩↩ -
pret,
037335f的pokefirered/src/trainer_card.c(連線卡片的星星:第 850 行的HasAllKantoMons()、第 886 行的berriesPicked >= 200 && jumpsInRow >= 200),https://github.com/pret/pokefirered/blob/master/src/trainer_card.c。行號由measure_systems.py印出。 ↩ -
pret,
731ad5b的pokeemerald/include/constants/pokemon.h(從第 100 行的CHAMPION_RIBBON開始的緞帶 ID),https://github.com/pret/pokeemerald/blob/master/include/constants/pokemon.h。 ↩ -
pret,
731ad5b的pokeemerald/src/field_specials.c(第 1386 行的if (GetRibbonCount(leadMon) > NUM_CUTIES_RIBBONS),呼叫端之一;contest_util.c、battle_tower.c與post_battle_event_funcs.c中華麗大賽、對戰塔與戰後的呼叫端使用同樣的>測試)與src/tv.c(從第 2253 行起的TryPutSpotTheCutiesOnAir:它需要一個空的紀錄混合欄位,且尚未產生任何 Spot the Cuties 節目,第 2258 行,並在第 2262 行設定show->cuties.active = FALSE,附註解「NOTE: Show is not active until passed via Record Mix.」),https://github.com/pret/pokeemerald/blob/master/src/tv.c。 ↩ -
pret,
731ad5b的pokeemerald/include/constants/coins.h(MAX_COINS 9999),https://github.com/pret/pokeemerald/blob/master/include/constants/coins.h。 ↩ -
pret,
731ad5b的pokeemerald/src/lottery_corner.c(第 16 到 19 行的四種獎品;第 64 行的「do not calculate ticket values for eggs」註解;第 70 與 94 行超過一位數的規則),https://github.com/pret/pokeemerald/blob/master/src/lottery_corner.c,以及include/constants/flags.h中的FLAG_DAILY_PICKED_LOTO_TICKET與src/clock.c中的SetRandomLotteryNumber。行號由measure_systems.py印出。 ↩↩ -
pret,
731ad5b的pokeemerald/src/bike.c(sMachBikeSpeeds、特技自行車的特技處理),https://github.com/pret/pokeemerald/blob/master/src/bike.c。 ↩↩ -
pret,
731ad5b的pokeemerald/include/constants/global.h(SECRET_BASES_COUNT 20、DECOR_MAX_SECRET_BASE 16、DECOR_MAX_PLAYERS_HOUSE 12),https://github.com/pret/pokeemerald/blob/master/include/constants/global.h。 ↩↩ -
pret,
5beda23的pokecrystal/engine/overworld/time.asm(ReceiveCallDelays:第 45 行的db 20, 10, 5, 3,以wTimeCyclesSinceLastCall為索引,CheckReceiveCallTimer在每次計時結束時把它加一,最多到 3,第 47 到 59 行,而InitCallReceiveDelay(第 12 到 14 行)把它重設為 0;Script_ReceivePhoneCall在每通來電之後呼叫它,engine/phone/phone.asm第 431 行)與pokecrystal/engine/phone/phone.asm(第 119 行的「50% chance for a call」註解;時段與訊號範圍的檢查),https://github.com/pret/pokecrystal/blob/master/engine/phone/phone.asm。行號由measure_systems.py印出。 ↩↩↩ -
The Pokémon Company,ポケットモンスターオフィシャルサイト,ご利用について(網站規則),衍生作品段落、不接受未經邀請點子的段落與商標行,2026年10月4日查閱,https://www.pokemon.co.jp/rules/。正文中的翻譯為作者所譯。 ↩↩↩↩↩↩
-
Google Patents,US12403397B2,「Storage medium, information processing system, information processing apparatus, and game processing method」(受讓人 Nintendo Co., Ltd. 與 The Pokémon Company;2023年3月1日申請;2025年9月2日核准),請求項 1,2026年10月4日儲存,https://patents.google.com/patent/US12403397B2/en。 ↩↩↩↩↩↩↩
-
Warner-Jenkinson Co. v. Hilton Davis Chemical Co., 520 U.S. 17 (1997),判決彙編官(Reporter of Decisions)的判決摘要,由康乃爾法學院的 Legal Information Institute 發布,2026年10月5日儲存(法院「adheres to the doctrine of equivalents,」(堅持均等論)依此,一項未構成文義侵權的產品或方法「may nonetheless be found to infringe if there is ‘equivalence’」(若其要件與請求的要件之間存在「均等」,仍可能被認定為侵權),而這套理論適用於「to each of the individual elements of a claim, rather than to the accused product or process as a whole」(請求項的每一個個別要件,而不是被控產品或方法的整體);判決摘要是一份摘要,不屬於判決意見的一部分),https://www.law.cornell.edu/supct/html/95-728.ZS.html。 ↩
-
日本最高法院第三小法庭,1998年2月24日判決,案號 1994 (O) No. 1083,滾珠栓槽軸承(Ball Spline Bearing Device)案,依智慧財產高等法院在其均等論重要判決清單中發布的英文翻譯,2026年10月5日儲存(若產品在某一部分與請求項不同,在五項條件成立時,它「regarded as identical with the construction as indicated in the scope of the patent claim」(被視為與申請專利範圍所示的構成相同),第一項是「this part is not the essential part of the patented invention」(該部分不是專利發明的本質部分),最後一項是不存在特殊情事,「such as the fact that the products had been intentionally excluded from the scope of the patent claim in the patent application process」(例如該產品在專利申請過程中被刻意排除於申請專利範圍之外)),https://www.courts.go.jp/ip/eng/assets/ip/eng/chizai_en/chizai_en-pdf-1640.pdf,連結自 https://www.courts.go.jp/ip/eng/hanrei/Important_IP_Judgment_by_Category/Patent/Doctrine_of_Equivalents/index.html。以日文判決為準。 ↩
-
Ana Diaz,「Pokémon Fangames Evolve Beyond Their Origins」,Aftermath,2026年10月1日(最早於 2026年9月30日由 Fansplaining 刊出),2026年10月4日查閱,https://aftermath.site/pokemon-fangames-fansplaining/。它是 app 的世界文件中那句 Uranium 描述的來源。 ↩
-
Nintendo Life,「Fan-Made Pokémon Prism Game Leaks Online After Nintendo Shutdown Notice」,2016年12月30日(12月21日的信;預定的 12月25日發布),2026年10月4日查閱,https://www.nintendolife.com/news/2016/12/fan-made_pokemon_prism_game_leaks_online_after_nintendo_shutdown_notice。 ↩↩
-
Internet Archive,「Nintendo’s Cease and Desist to Pokémon Prism」,由一位第三方上傳,他說這份塗黑的掃描檔是一位 Prism 貢獻者寄給他的;上傳者的說明帶有立場,而本文未閱讀這份掃描檔,https://archive.org/details/pokemon-prism-cease-desist。 ↩
-
Luke Plunkett,「Pokémon’s Former Chief Lawyer On Shutting Down Fan Games & Honeymoon Business Deals」,Aftermath,2024年3月13日(一篇對 Don McGowan 的「What I Do」訪談),2026年10月4日查閱,https://aftermath.site/pokemon-lawyer-cease-desist-fan-project-pikachu-movie/。 ↩↩↩↩
-
Chris Scullion,「Former Pokémon lawyer says fundraising and press coverage lead to fan project takedowns」,Video Games Chronicle,2024年3月14日,2026年10月4日查閱,https://www.videogameschronicle.com/news/former-pokemon-lawyer-says-fundraising-and-press-coverage-lead-to-fan-project-takedowns/。 ↩
-
The National Law Review,「Guangdong Higher People’s Court: 107 Million RMB Settlement in Pokémon Copyright and Unfair Competition Case」,2025年2月23日(2月21日的宣布;2021年12月起訴;請求 5 億人民幣;一審的理由),2026年10月4日查閱,https://natlawreview.com/article/guangdong-higher-peoples-court-107-million-rmb-settlement-pokemon-copyright-and。 ↩↩↩
-
The Pokémon Company,他社ゲームに関するお問い合わせについて,企業新聞,2024年1月25日(日文內容,下方附英文聲明),2026年10月4日查閱,https://corporate.pokemon.co.jp/media/news/detail/335.html。 ↩↩
-
Nintendo Life,「The Pokémon Company Releases Official Statement About Palworld」,2024年1月25日,2026年10月4日查閱,https://www.nintendolife.com/news/2024/01/the-pokemon-company-releases-official-statement-about-palworld。 ↩
-
GamesRadar+,「Palworld developer reveals the exact patents it’s alleged to have infringed upon in the Nintendo lawsuit, and they all have application dates after the survival game’s release」,2024年11月8日(三項專利的對應,經由 Automaton、栗原潔與專利師事務所 Siarasia;2021年12月的母案),2026年10月4日查閱,https://www.gamesradar.com/games/survival/palworld-developer-reveals-the-exact-patents-its-alleged-to-have-infringed-upon-in-the-nintendo-lawsuit-and-they-all-have-application-dates-after-the-survival-games-release/。 ↩↩↩
-
作者的擷取,2026年10月4日,2026年10月5日改寫:作者為本文準備的證據資料夾中的
measure_patent_claims.py讀取儲存的 Google Patents 頁面以取得標題、受讓人與日期,並從頁面本身的請求項容器(日本頁面為<claim num="1">,美國頁面為CLM-00001)完整取出請求項 1,對三項日本專利分別印出日文原文與 Google 的英文機器翻譯,對美國專利印出英文原文,皆未截斷;輸出為measure_patent_claims.out.txt。第一個版本把請求項區段攤平並在 3,000 個字元處截斷,它的 JP 7545191「請求項 1」一路延伸到了請求項 2;它與新版本並存保留。 ↩↩ -
Pocketpair,「Regarding the lawsuit, changes to Palworld and the future」,重要公告,2025年5月8日(2024年11月30日的 v0.3.11 修正檔;v0.5.5 修正檔;這些變更「a result of the ongoing litigation」),2026年10月4日查閱,https://www.pocketpair.jp/en/news/regarding-the-lawsuit-changes-to-palworld-and-the-future/。 ↩↩
-
Steam,Palworld 的 app details(app 1623730),發售日「9 Jul, 2026」,2026年10月4日透過商店 API 抓取,https://store.steampowered.com/app/1623730/Palworld/。 ↩
-
Automaton West,「Nintendo patent tied to Palworld lawsuit stays rejected as JPO shuts down objections in unusually sharp-tongued notice」,2026年7月22日(分割申請第 2026-019762 號;2013 年的 Pokémon Generations 影片;審查官關於進步性的理由;三個月的期限),2026年10月4日查閱,https://automaton-media.com/en/news/nintendo-patent-central-to-palworld-lawsuit-stays-rejected-as-jpo-shuts-down-objections-in-unusually-sharp-tongued-notice/。 ↩
-
Engadget,「Nintendo’s patent on summoning fighting NPCs is being reexamined」,2025年11月4日(局長的命令;被列為先前技術的 2002 年 Konami 申請與 Nintendo 公開),2026年10月4日查閱,https://www.engadget.com/gaming/nintendo/nintendos-patent-on-summoning-fighting-npcs-is-being-reexamined-180949135.html。 ↩
-
Claire Jackson,「US Patent Office Reexamining Controversial Pokemon Patent」,Kotaku,2025年11月4日,2026年10月4日查閱,https://kotaku.com/pokemon-patent-summoning-nintendo-palworld-monsters-2000641133。 ↩
-
Andrew H. Velzen,「Pokémon Reexam Receives First Action from USPTO」,MBHB,2026年4月3日(再審查第 90/020,162 號;2026年3月25日寄出、依 35 U.S.C. § 103 駁回全部請求項的第一次審查意見通知;2026年6月25日與9月25日的回覆日期;引述請求項 1),2026年10月4日查閱,https://www.mbhb.com/intelligence/snippets/pokemon-reexam-receives-first-action-from-uspto/。 ↩↩↩
-
The Pokémon Company International,法律資訊頁面,https://www.pokemon.com/us/legal/information:2026年10月4日對作者的抓取程式回應了一道機器人檢查,而它的 Wayback Machine 副本也回傳同樣的阻擋;未經查證。 ↩↩
-
Nintendo,「Nintendo Game Content Guidelines for Online Video & Image Sharing Platforms」,附常見問題(A5 關於販售;Q6 與 A6 關於其他內容),2026年10月4日查閱,https://www.nintendo.co.jp/networkservice_guideline/en/index.html。 ↩↩↩
-
Nintendo Life,「Cassette Beasts Dev On Doing What Pokémon Doesn’t In A Zelda-Inspired Overworld」,2023年4月26日,2026年10月4日查閱,https://www.nintendolife.com/features/cassette-beasts-dev-on-doing-what-pokemon-doesnt-in-a-zelda-inspired-overworld。 ↩
-
Gematsu,「Crema Games announces Pokemon-inspired multiplayer creature collection game Temtem」,2018年4月30日,2026年10月4日查閱,https://www.gematsu.com/2018/04/crema-games-announces-pokemon-inspired-multiplayer-creature-collection-game-temtem。 ↩
-
Apple 開發者文件,「CMPedometer」(iOS 8.0;「An object for fetching the system-generated live walking data」;用途說明的要求),2026年10月4日以 JSON 抓取,https://developer.apple.com/documentation/coremotion/cmpedometer。 ↩↩
-
Apple 開發者文件,「stepCount」(HKQuantityTypeIdentifier;iOS 8.0),2026年10月4日以 JSON 抓取,https://developer.apple.com/documentation/healthkit/hkquantitytypeidentifier/stepcount。 ↩
-
作者的 app,Kiradex 儲存庫,commit
b1b78b1:server/app/rooms.py(WALKABLE、is_walkable、may_move)、server/app/main.py(從第 156 行起的_player,它在第 160 行把每個連線的玩家id當作 UUID 讀取,連同一個代號與它展示的卡片;_tile,它拒絕移動到不可行走的圖塊;以及從第 217 行起的移動處理器,它在第 222 行設定玩家的圖塊)、server/app/lines.py(「The preset lines: everything anyone can say in the plaza. Nothing is typed」)、Kiradex/World/PlazaStage.swift(第 333 行的@AppStorage("plaza.id")屬性,其文件註解說這個 id 只產生一次、從不被輸入或顯示,以及join(),它在 id 為空時於第 576 與 577 行把它設為UUID().uuidString)與Kiradex/World/PlazaClient.swift(在第 135 行送出這個 id 的 hello 訊息)。私有儲存庫。 ↩↩↩↩↩↩↩ -
Apple 開發者文件,「startOfDay(for:)」(Calendar;iOS 8.0),2026年10月4日以 JSON 抓取,https://developer.apple.com/documentation/foundation/calendar/startofday(for:)。 ↩↩
-
Apple 開發者文件,「isDate(:inSameDayAs:)」(Calendar;iOS 8.0),2026年10月4日以 JSON 抓取,https://developer.apple.com/documentation/foundation/calendar/isdate(:insamedayas:)。 ↩↩
-
Apple 開發者文件,「NSCalendarDayChanged」(NSNotification.Name;iOS 8.0),2026年10月4日以 JSON 抓取,https://developer.apple.com/documentation/foundation/nsnotification/name-swift.struct/nscalendardaychanged。 ↩↩
-
Apple 開發者文件,「significantTimeChangeNotification」(UIApplication;說明中的範例),2026年10月4日以 JSON 抓取,https://developer.apple.com/documentation/uikit/uiapplication/significanttimechangenotification。 ↩
-
作者的檢查,2026年10月5日:草稿旁的
figures/saying_drift.py,它以驗收測試的數字執行規格書提議的漂移規則,並斷言一次套用十天等於十次每日讀取;輸出為figures/saying_drift.out.txt(在同一日期讀取三次後與重新啟動後皆為 50;十天後為 20、陳舊;一句陳舊、分數 10 的話三天後為 5、上升中)。 ↩