教學 › 把官方中文版的中文搬進英文版

把官方中文版的中文搬進英文版

官方中文版把中文放在遊戲的日文槽位,連字型檔裡每一個項目的名字都是。這一課教你從你自己那份官方中文版,把中文搬到英文版的英文槽位去。本站不附任何現成的包,全部用你手上那兩份原版加上站上的兩支腳本做出來。

🛟 動手之前:先完整備份整個遊戲資料夾

把整個遊戲資料夾複製一份到別的地方包括裡面存放紀錄的資料夾。不要挑檔案,整包複製最省事也最保險。

「紀錄」是指這些(它們跟遊戲檔混在同一個資料夾裡):

dir /s /b "〔你的遊戲資料夾〕\*.sav"
find "〔你的遊戲資料夾〕" -name "*.sav"

上面第一行 Windows、第二行 Mac。 本站每一支工具都會自己備份它要動的那一個檔, 但那只保得住那一個檔 —— 整包備份保的是「你玩到現在的一切」。 完整做法看備份與還原 SOP

⚡ 只想趕快做完?照這五步

  1. mvp_font_swap.pymvp_fix_loc.py 放到桌面,終端機切到桌面,把你兩個遊戲資料夾的路徑填進去(整段複製)

    Windows:

    cd %USERPROFILE%\Desktop
    set EN=這裡貼上英文版遊戲資料夾
    set CN=這裡貼上官方中文版遊戲資料夾

    Mac / Linux:

    cd ~/Desktop
    EN="這裡拖進英文版遊戲資料夾"
    CN="這裡拖進官方中文版遊戲資料夾"
  2. 備份英文原檔,順便做出腳本一定要有的比對資料夾(不能跳

    Windows:

    mkdir "%EN%\data\英文語系"
    copy "%EN%\data\FEENG.LOC" "%EN%\data\英文語系\FEENG.LOC"
    copy "%EN%\data\IGENG.LOC" "%EN%\data\英文語系\IGENG.LOC"
    copy "%EN%\data\fonts\fonts.big" "%EN%\data\英文語系\fonts.big"

    Mac / Linux:

    mkdir -p "$EN/data/英文語系"
    cp "$EN/data/FEENG.LOC" "$EN/data/IGENG.LOC" "$EN/data/英文語系/"
    cp "$EN/data/fonts/fonts.big" "$EN/data/英文語系/"
  3. 把中文語系檔放進英文槽位

    Windows:

    copy /Y "%CN%\data\FEJPN.LOC" "%EN%\data\FEENG.LOC"
    copy /Y "%CN%\data\IGJPN.LOC" "%EN%\data\IGENG.LOC"

    Mac / Linux:

    cp "$CN/data/FEJPN.LOC" "$EN/data/FEENG.LOC"
    cp "$CN/data/IGJPN.LOC" "$EN/data/IGENG.LOC"
  4. 把中文字型的名字從日文槽位改成英文槽位,順便把中文版裡那個英文 dflt_en.ffn 挪開讓位(檔案大小不會變,原檔不會被動)

    Windows:

    python -c "import sys;a,b=sys.argv[1],sys.argv[2];d=open(a,'rb').read();n=d.count(b'_jp.ffn');m=d.count(b'dflt_en.ffn');sys.exit('found '+str(n)+' _jp.ffn / '+str(m)+' dflt_en.ffn, expected 12/1, stop') if (n,m)!=(12,1) else None;d=d.replace(b'dflt_en.ffn',b'dflt_xx.ffn').replace(b'_jp.ffn',b'_en.ffn');open(b,'wb').write(d);print('renamed 12 entries, set aside 1, size unchanged:',len(d))" "%CN%\data\fonts\fonts.big" "%EN%\data\中文字型_英文槽位.big"

    Mac / Linux:

    python3 -c "import sys;a,b=sys.argv[1],sys.argv[2];d=open(a,'rb').read();n=d.count(b'_jp.ffn');m=d.count(b'dflt_en.ffn');sys.exit('found '+str(n)+' _jp.ffn / '+str(m)+' dflt_en.ffn, expected 12/1, stop') if (n,m)!=(12,1) else None;d=d.replace(b'dflt_en.ffn',b'dflt_xx.ffn').replace(b'_jp.ffn',b'_en.ffn');open(b,'wb').write(d);print('renamed 12 entries, set aside 1, size unchanged:',len(d))" "$CN/data/fonts/fonts.big" "$EN/data/中文字型_英文槽位.big"
  5. 兩支腳本各跑一次(先把 --apply 拿掉預覽,數字對了再加回去)

    Windows:

    python mvp_font_swap.py "%EN%" --source "%EN%\data\中文字型_英文槽位.big" --swap Tw24,au20b,dflt,frk12,mini1,mini2,twcnb,twc14,twc16,twc18,twn14 --apply
    python mvp_fix_loc.py "%EN%" --fix --apply

    Mac / Linux:

    python3 mvp_font_swap.py "$EN" --source "$EN/data/中文字型_英文槽位.big" --swap Tw24,au20b,dflt,frk12,mini1,mini2,twcnb,twc14,twc16,twc18,twn14 --apply
    python3 mvp_fix_loc.py "$EN" --fix --apply

上面每一步都給了 Windows 與 Mac / Linux 兩種寫法,照你的系統挑一種(Windows 打 python 說「不是內部或外部命令」,就改打 py -3set EN= 後面不要加引號)。做完照✅ 驗收那三行檢查,三項都不用進遊戲。這一課只保證中文顯示得出來,不保證不會跳出 —— 原因在做不到的事。只想複習,跳到 📌 重點整理

難度

★★☆ 會複製檔案、跑兩支腳本

時間

約 20 分鐘

可以還原嗎

可以,但要照最後那一節做

這一課只保證一件事:中文顯示得出來

不保證不會跳出。不跳出要調的是遊戲自己那塊記憶體池,而本站對四份原版安裝各跑了一次檢查,四份全部找不到那塊記憶體池。下面「這一課做不到的事」有實測數字。

本站不提供任何遊戲檔案下載。這一課從頭到尾用的是你自己那兩份光碟安裝,加上站上自己寫的兩支腳本。

先講清楚:站上另外兩頁曾經寫著「本站不寫中文化教學」

文字表 .LOCEA 自己的繁體中文版 兩頁都寫過「這兩塊補齊之前,本站不寫中文化教學」。那兩塊是:寫回 .LOC 的工具,以及字型檔的字符點陣

第一塊後來做了mvp_fix_loc.py)。第二塊讀得出來 —— 字型檔 .ffn 那頁 2026-09-05 訂正過:字圖集與字元表都量過了(中文字型那張是 0x79、1024 × 512,數到字型提供 1,529 個字)。仍然沒有的是「從零產生一份、再寫回去」的辦法,所以這一課還是整包搬官方做好的字型,不是自己刻。

那這一課憑什麼成立?因為它繞過那一塊,不是解開它。本站不會自己畫中文字型 —— 這一課是把官方中文版早就做好的字型整包搬過去,一個字符點陣都不用懂。所以「本站不寫中文化教學」那句話後來改掉了 —— 那兩頁現在寫的是「本站有中文化教學,教的是把官方中文搬進英文版,不是教你從零刻一套中文字型」,而且都反向連回這一課。

你需要什麼

先看清楚兩份原版差在哪

本站把兩份剛安裝好的原版 data\ 逐檔比對過。

英文版官方中文版
data\ 檔案數9022,098
data\ 佔用1,385,256 KB1,400,260 KB
只有這一邊有的檔4 個1,200 個
兩邊同名的檔898 個,其中 84 個內容不一樣

那 1,200 個「只有中文版有」看起來嚇人,其實 1,196 個是 anims\(730 個)跟 datafile\(466 個)被拆成散裝檔了,英文版那兩個資料夾裡各只有一個封裝檔。那是安裝方式的差別,不是語言的差別。剩下的四個才是重點:FEJPN.LOCIGJPN.LOCtuningdefaults.hcredits.BAK

84 個「不一樣」裡,有 22 個不是語言造成的

把那 84 個逐位元組數過之後,其中 22 個大小完全相同,而且只差 1 到 20 個位元組。這 22 個合計只差 85 個位元組。但它們不是同一種東西,要分成兩類:

幾個檔差幾個位元組差異長什麼樣
第一類20合計 45每一個差異都是同一個位元(中文版比英文版大 8)。models.big 172,992,803 位元組裡只差 4 個位元組,就是這一類
第二類2各 20frontend\feonlyln.bigigshapes\igcrsr9.fsh,兩個都在位移 17,605 起有一段 20 位元組的欄位

🔬 第二類長什麼樣

中文版那兩個檔在那 20 個位元組寫的是可列印的十六進位 ASCII0bfffcc9753aabac325f。英文版寫的是 20 個看不出結構的位元組(igcrsr977d53ac1…feonlylna4d0f3dd…)。

更有意思的是:中文版那兩個檔彼此逐位元組完全相同,英文版那兩個卻互不相同。

未解 那 20 個位元組是什麼(序號?雜湊?壓片母帶識別?)本站不知道,只知道它跟語言無關。

扣掉這 22 個,真正因為語言而不同的只有 62 個檔:

檔案英文版官方中文版是什麼
fonts\fonts.big204,8201,683,513字型,8.22 倍
frontend\load*.big 60 個134,609 – 170,795132,168 – 166,365載入畫面的圖
frontend\minibat.big253,292243,897迷你遊戲的圖

那 60 個載入畫面本站也拆開看過:每個裡面只裝一個 .fsh,裡面只有 1 張 1024 × 512 的 DXT1 圖,60 個解開後大小全部是 262,304、兩版完全一樣,只是壓縮後的內容 60 個全部不同(畫面上的提示文字一邊英文一邊中文)。它們是圖片,不是文字表,要不要換純粹是美觀問題,這一課不處理。

⚠️ minibat.big 不一樣:它一樣只裝一個 .fshbminiov.fsh),但那個 .fsh 裡面有 52 張圖、十種尺寸(32×32 佔 23 張、256×128 佔 11 張、128×128 與 128×64 各 5 張…),兩版解開後都是 2,264,176。「只裝一個 .fsh」跟「只有一張圖」是兩件事,不要混。

語系檔:中文放在日文槽位

英文版官方中文版
選單文字FEENG.LOC 415,528FEJPN.LOC 219,136
比賽中文字IGENG.LOC 59,432IGJPN.LOC 42,696
字串條數6,352 / 1,5846,436 / 1,663

四個檔的檔頭都是 LOCH,內容是 UTF-16LE,不是 Big5,所以不會有編碼問題。中文版檔案比較,因為同一句話中文用的字比較少,而 UTF-16 每個字都是兩個位元組。

值得注意的是中文版的條數比英文版還多,而且編號對不齊:選單有 6,349 個編號兩邊都有、3 個只有英文版有、87 個只有中文版有;比賽中文字是 1,584 個共有、0 個只有英文、79 個只有中文版有。這是等一下第五步要處理的問題的根源。

字型檔:連名字都是日文槽位

這是整件事的關鍵。把兩個 fonts.big 的目錄攤開:

英文版(12 項)字元數官方中文版(13 項)字元數
Tw24_en.ffn33Tw24_jp.ffn1,529
au20b_en.ffn98au20b_jp.ffn1,529
dflt_en.ffn95dflt_en.ffn dflt_jp.ffn95 / 1,529
frk12_en.ffn98frk12_jp.ffn1,529
hrdbg_en.ffn26hrdbg_jp.ffn26
mini1_en.ffn / mini2_en.ffn98 / 98mini1_jp.ffn / mini2_jp.ffn267 / 267
twcnb twc14 twc16 twc18 twn14_en各 98同五個的 _jp各 1,529
解開後合計2,126,0803,250,656

兩件事可以直接看出來。第一,檔名的後綴跟語系檔的後綴是同一套:ENG_enJPN_jp。第二,官方中文版裡九個字型都是 1,529 個字,不是只有六個。hrdbgdflt_en 兩版解開後逐位元組相同,那兩個根本沒被中文化。

為什麼不能把中文版的 fonts.big 直接蓋過去

直覺會想:那把中文版的 fonts.big 複製到英文版不就好了?不行,而且原因可以量出來。

遊戲的介面版面檔(.fel)會指名要用哪一個字型檔。本站把六個裝版面檔的封裝檔(frontend.bigcooplay.bigingame.bigminigame.bigapt.bigtitle.big)全部解開,一共 329 個版面檔,其中 280 個提到字型,總共 17,380 次字型引用

這 17,380 次全部是 _en.ffn_jp 出現零次。引用最多的是 twc14_en.ffn(9,888 次),12 個字型裡有 11 個被引用到,只有 hrdbg 一次都沒有。

而那六個封裝檔在英文版跟官方中文版是逐位元組相同的。也就是說,官方中文版跑的時候,版面檔一樣寫著 frk12_en.ffn,可是它的 fonts.big 裡根本沒有這個名字。

推論(標明是推論,本站沒有反組譯證實)

遊戲執行的時候會照當下的語系,把版面檔裡的 _en 換成該語系的後綴再去找檔案。所以你把語系檔改名成 FEENG.LOC、讓遊戲跑在英文語系,它就會去找 _en.ffn。這時候字型檔的名字必須是 _en.ffn,裡面裝的才可以是中文字。

支持這個推論的還有一點:如果遊戲是死板照著版面檔的字面去找,官方中文版就只會找到 dflt_en.ffn(95 個字,沒有中文),那它根本顯示不出中文。但 EA 是把它當繁體中文版賣的,所以它顯示得出來。

順帶一提:版面檔裡寫的是小寫的 tw24_en.ffn(190 次),而封裝檔目錄裡的名字是大寫開頭的 Tw24_en.ffn大小寫對不上照樣找得到,這也是這一路查證時差點被自己的搜尋條件騙過去的地方 —— 第一次用區分大小寫的比對,得到「有兩個字型沒被引用」的錯誤結論。

好消息是這件事修起來很便宜:_jp.ffn_en.ffn 都是 7 個字元。本站數過,中文版 fonts.big_jp.ffn 出現 12 次,位移分別是 28、49、89、110、131、152、173、194、215、236、257、278,全部落在檔頭的目錄區(第一筆資料從 296 開始),沒有一個在壓縮後的字型資料裡。所以直接做位元組取代,檔案大小 1,683,513 一個位元組都不會變,所有位移也不用重算。

👉 你要做的事(手把手)

步驟 1:把兩支腳本跟兩個路徑準備好

先把上面那兩支腳本抓下來,從「下載」資料夾拖到桌面(沒拖會出現 can't open file)。然後開終端機(Windows 是命令提示字元),下面這段整段複製,把後兩行的資料夾換成你自己的(直接把資料夾拖進視窗最快)。

Windows:

cd %USERPROFILE%\Desktop
set EN=這裡貼上英文版遊戲資料夾
set CN=這裡貼上官方中文版遊戲資料夾

Mac / Linux:

cd ~/Desktop
EN="這裡拖進英文版遊戲資料夾"
CN="這裡拖進官方中文版遊戲資料夾"
按了下載之後,檔案跑到哪裡去了?

瀏覽器多半不會問你要存哪裡,它會直接放進「下載」資料夾。所以按完之後還有一步:

1打開檔案總管(Mac 用 Finder),左邊點「下載
2找到那兩個 .py
3把它們拖到桌面

沒做這一步的話,後面 cd 到桌面再執行,畫面會出現 can't open file —— 那不是你打錯,是檔案還在「下載」裡。

⚠️ 這一課從這裡開始,每一段指令都給兩種寫法。Mac / Linux 那一種是本站實際跑過的;Windows 那一種是照 cmd 的語法對照寫的,本站還沒在 Windows 上實測。Windows 的 set EN= 後面不要加引號(引號會變成路徑的一部分),要用的時候才寫成 "%EN%\data\…"Windows 把資料夾拖進視窗時,路徑有空白就會自己帶一對引號進來,記得把那對引號刪掉再按 Enter。

填對了的話,下面這行會印出兩個檔案的大小。印不出來就是路徑錯了,不要往下做。

Windows:

dir "%EN%\data\FEENG.LOC" "%CN%\data\FEJPN.LOC"

Mac / Linux:

ls -l "$EN/data/FEENG.LOC" "$CN/data/FEJPN.LOC"

步驟 2:備份英文原檔

這一步做兩件事:留下你自己的英文原檔,同時做出 mvp_fix_loc.py 一定要有的比對資料夾。這一步不能跳,跳了第五步會直接停下來。而且一定要在還沒覆蓋之前做,不然複製過去的是中文檔。

Windows:

mkdir "%EN%\data\英文語系"
copy "%EN%\data\FEENG.LOC" "%EN%\data\英文語系\FEENG.LOC"
copy "%EN%\data\IGENG.LOC" "%EN%\data\英文語系\IGENG.LOC"
copy "%EN%\data\fonts\fonts.big" "%EN%\data\英文語系\fonts.big"

Mac / Linux:

mkdir -p "$EN/data/英文語系"
cp "$EN/data/FEENG.LOC" "$EN/data/IGENG.LOC" "$EN/data/英文語系/"
cp "$EN/data/fonts/fonts.big" "$EN/data/英文語系/"

步驟 3:把中文語系檔放進英文槽位

Windows:

copy /Y "%CN%\data\FEJPN.LOC" "%EN%\data\FEENG.LOC"
copy /Y "%CN%\data\IGJPN.LOC" "%EN%\data\IGENG.LOC"

Mac / Linux:

cp "$CN/data/FEJPN.LOC" "$EN/data/FEENG.LOC"
cp "$CN/data/IGJPN.LOC" "$EN/data/IGENG.LOC"

步驟 4:把字型的名字改成英文槽位

這一步本站沒有工具,是一行手打的指令。它讀中文版的 fonts.big,做兩件事:先把中文版裡本來就有的那個英文 dflt_en.ffn 改名成 dflt_xx.ffn 挪開讓位(同樣 11 個字元),再把 12 個名字裡的 _jp.ffn 換成 _en.ffn,寫出一個新檔;你的官方中文版原檔完全不會被動到。兩個數量只要有一個不是預期的(12 個 _jp.ffn、1 個 dflt_en.ffn)它就會停手,不會寫出東西。

Windows:

python -c "import sys;a,b=sys.argv[1],sys.argv[2];d=open(a,'rb').read();n=d.count(b'_jp.ffn');m=d.count(b'dflt_en.ffn');sys.exit('found '+str(n)+' _jp.ffn / '+str(m)+' dflt_en.ffn, expected 12/1, stop') if (n,m)!=(12,1) else None;d=d.replace(b'dflt_en.ffn',b'dflt_xx.ffn').replace(b'_jp.ffn',b'_en.ffn');open(b,'wb').write(d);print('renamed 12 entries, set aside 1, size unchanged:',len(d))" "%CN%\data\fonts\fonts.big" "%EN%\data\中文字型_英文槽位.big"

Mac / Linux:

python3 -c "import sys;a,b=sys.argv[1],sys.argv[2];d=open(a,'rb').read();n=d.count(b'_jp.ffn');m=d.count(b'dflt_en.ffn');sys.exit('found '+str(n)+' _jp.ffn / '+str(m)+' dflt_en.ffn, expected 12/1, stop') if (n,m)!=(12,1) else None;d=d.replace(b'dflt_en.ffn',b'dflt_xx.ffn').replace(b'_jp.ffn',b'_en.ffn');open(b,'wb').write(d);print('renamed 12 entries, set aside 1, size unchanged:',len(d))" "$CN/data/fonts/fonts.big" "$EN/data/中文字型_英文槽位.big"

應該要印出這一行:

renamed 12 entries, set aside 1, size unchanged: 1683513

⚠️ 為什麼要先把那個英文 dflt_en.ffn 挪開

官方中文版的 fonts.big 裡本來就有一個 dflt_en.ffn(95 字,英文)。如果直接把 _jp 全部換成 _endflt_jp.ffn 也會變成 dflt_en.ffn —— 同一份檔案裡出現兩個同名項目,而 mvp_font_swap.py 碰到同名項目會用離開碼 2 停手(它擋的是「靜默丟掉其中一份」)。所以上面那一行先把英文那個改名成 dflt_xx.ffn,兩個名字就不會撞在一起。

(2026-09-05 訂正:本課原本的指令沒有挪開這一步,做出來的來源檔裡有兩個 dflt_en.ffn;腳本後來加上同名守門之後,那樣的來源檔會讓步驟 5 直接停下來,fonts.big 一個位元組都不會被改。下面「❌ 出錯處理」有那一行訊息。)

換上去的是 dflt_jp.ffn 那一份(1,529 字的中文版)。做出來的成品仍然是 12 項(成品是照英文版原本那 12 個槽位寫回去的),而官方中文版是 13 項兩個都留著。成品裡少掉的是 95 字的英文 dflt —— 它以 dflt_xx.ffn 的名字留在中間那個檔裡,沒有被裝進遊戲。

未解 少掉它會不會有影響,本站驗不出來 —— 要進遊戲才知道。所以下面驗收 C 寫「_en.ffn 12 次」是本站量到的成品狀態,不是一條保證。

步驟 5:兩支腳本各跑一次

先預覽。這兩行不會動到任何檔案,先看數字對不對。

Windows:

python mvp_font_swap.py "%EN%" --source "%EN%\data\中文字型_英文槽位.big" --swap Tw24,au20b,dflt,frk12,mini1,mini2,twcnb,twc14,twc16,twc18,twn14
python mvp_fix_loc.py "%EN%" --fix

Mac / Linux:

python3 mvp_font_swap.py "$EN" --source "$EN/data/中文字型_英文槽位.big" --swap Tw24,au20b,dflt,frk12,mini1,mini2,twcnb,twc14,twc16,twc18,twn14
python3 mvp_fix_loc.py "$EN" --fix

確定了才真的寫入。兩支都會自己先備份(fonts.big.fontbakFEENG.LOC.locbakIGENG.LOC.locbak)。

Windows:

python mvp_font_swap.py "%EN%" --source "%EN%\data\中文字型_英文槽位.big" --swap Tw24,au20b,dflt,frk12,mini1,mini2,twcnb,twc14,twc16,twc18,twn14 --apply
python mvp_fix_loc.py "%EN%" --fix --apply

Mac / Linux:

python3 mvp_font_swap.py "$EN" --source "$EN/data/中文字型_英文槽位.big" --swap Tw24,au20b,dflt,frk12,mini1,mini2,twcnb,twc14,twc16,twc18,twn14 --apply
python3 mvp_fix_loc.py "$EN" --fix --apply

第五步的第二支在做什麼:前面量到中文版的字串編號跟英文版對不齊。對不齊的後果不只是顯示怪怪的。同一個編號,英文那句不需要參數,中文那句卻寫著 %s%d,遊戲不會傳參數過去,程式就會拿堆疊上的隨機值當指標去讀記憶體。本站在這兩份原版上量到 168 條(比賽中 25 條、選單 143 條)。mvp_fix_loc.py 只拿掉多出來的格式符,中文字一個都不動

⭐ 168 這個數字在兩份不同來源上各自成立

本站另外拿一份留在機器上的社群語系檔(FEENG.LOC 219,421、IGENG.LOC 42,983,檔案日期 2009-04-14)跑同一支腳本,得到的一樣是 25 + 143 = 168

那兩個檔跟光碟原版的 219,136 / 42,696 不是同一個檔(字串編號表相同,但內文有出入)。兩個獨立來源給出同一個數字,比「跟另一課寫的一樣」有力得多。

✅ 驗收(三項都不用進遊戲)

驗收 A:語系檔剩幾條

Windows:

python mvp_fix_loc.py "%EN%"

Mac / Linux:

python3 mvp_fix_loc.py "$EN"

要看到:

  IGENG.LOC  0 條會讓遊戲拿到不存在的參數
  FEENG.LOC  0 條會讓遊戲拿到不存在的參數
  合計 0 條。

驗收 B:字型每一列左右一致

Windows:

python mvp_font_swap.py "%EN%" --source "%EN%\data\中文字型_英文槽位.big"

Mac / Linux:

python3 mvp_font_swap.py "$EN" --source "$EN/data/中文字型_英文槽位.big"

表格裡「現在」跟「來源」每一列都要一樣,最後兩行要是:

  解開後合計               3,183,488
  來源合計                3,250,656  (差 +67,168)

兩個合計差的 67,168 就是步驟 4 挪開的那個英文 dflt_xx.ffn:來源檔有 13 項,成品只有 12 項。要看的是上面那 12 列左右一不一樣,不是這兩行的差。

驗收 C:檔案裡不該再有日文槽位的名字

Windows:

python -c "d=open(r'%EN%\data\fonts\fonts.big','rb').read();print('_jp.ffn',d.count(b'_jp.ffn'),'· _en.ffn',d.count(b'_en.ffn'),'· size',len(d))"

Mac / Linux:

python3 -c "d=open('$EN/data/fonts/fonts.big','rb').read();print('_jp.ffn',d.count(b'_jp.ffn'),'· _en.ffn',d.count(b'_en.ffn'),'· size',len(d))"

本站從乾淨狀態照這一課跑一次,三項的結果是:

驗收本站跑出來
A合計 0 條
B解開後合計 3,183,488 · 來源合計 3,250,656(差 +67,168)
C_jp.ffn 0 · _en.ffn 12 · size 1677672

另外兩個順便會變的數字:IGENG.LOC 修 25 條後變成 39,176 bytes、FEENG.LOC 修 143 條後變成 205,322 bytes,而腳本會自己複驗 1,663 與 6,436 條字串全部讀得回來、編號一個都沒變。fonts.big 從 204,820 變成 1,677,672。

❌ 出錯處理

看到什麼怎麼回事做什麼
can't open file '…\mvp_font_swap.py'腳本還在「下載」資料夾,不在桌面開檔案總管(Mac 用 Finder)左邊點「下載」,把那兩個 .py 拖到桌面,再跑一次。這是本站最常見的第一個卡點。
found 0 _jp.ffn / 1 dflt_en.ffn, expected 12/1, stop(離開碼 1)步驟 4 餵到的不是官方中文版的 fonts.big回步驟 1 確認 $CN(Windows 是 %CN%)。本站拿英文版的檔去餵,印的就是這一行,而且不會寫出任何檔案
停下來了:找不到英文語系資料夾(離開碼 2)步驟 2 跳掉了回頭做步驟 2。注意要在還沒覆蓋之前做
停下來了:來源檔裡沒有 frk12_en.ffn(離開碼 2)--source 指到還沒改名的中文版原檔指到步驟 4 產生的那個檔,不是 $CN(Windows %CN%)底下那個。本站對 12 個字型名各試一次,11 個都停在這一行
· dflt_en.ffn 兩邊本來就一樣,跳過然後說「沒有東西需要換」同上,來源沒改名。中文版裡唯一跟英文版同名的就是 dflt_en.ffn同上
停下來了:中文字型_英文槽位.big 裡有兩個同名項目 "dflt_en.ffn"(離開碼 2)步驟 4 沒有把中文版那個英文 dflt_en.ffn 挪開就換名字(例如照本課 2026-09-05 之前的舊指令做,或自己手動改名)。腳本不肯對同名項目動手,因為那會靜默丟掉其中一份回步驟 4,用這一頁上面那一行重跑一次、覆蓋掉 中文字型_英文槽位.big,再回來做步驟 5。這時候 fonts.big 一個位元組都還沒被動到,也不會留下 .fontbak
驗收 B 有某一列左右不同那個字型沒換到把那個名字加回 --swap 清單再跑一次

還原

兩支腳本各自的 --restore 都會回到它自己動手之前的狀態,不是回到英文版。

Windows:

python mvp_font_swap.py "%EN%" --restore
python mvp_fix_loc.py "%EN%" --restore

Mac / Linux:

python3 mvp_font_swap.py "$EN" --restore
python3 mvp_fix_loc.py "$EN" --restore

本站實測:mvp_font_swap.py --restore 之後 fonts.big 跟英文原版逐位元組相同(204,820),備份檔也被移除;但 mvp_fix_loc.py --restore 之後 FEENG.LOCIGENG.LOC 回到的是還沒修格式符的中文檔(逐位元組等於官方中文版的 FEJPN.LOC / IGJPN.LOC),不是英文檔。

要真的變回全英文,得自己從步驟 2 存的地方複製回來:

Windows:

copy /Y "%EN%\data\英文語系\FEENG.LOC" "%EN%\data\FEENG.LOC"
copy /Y "%EN%\data\英文語系\IGENG.LOC" "%EN%\data\IGENG.LOC"
copy /Y "%EN%\data\英文語系\fonts.big" "%EN%\data\fonts\fonts.big"

Mac / Linux:

cp "$EN/data/英文語系/FEENG.LOC" "$EN/data/FEENG.LOC"
cp "$EN/data/英文語系/IGENG.LOC" "$EN/data/IGENG.LOC"
cp "$EN/data/英文語系/fonts.big" "$EN/data/fonts/fonts.big"

⚠️ 這一課做不到的事:顯示得出來不等於不會跳出

這一課處理的是「字看不看得到」。它沒有處理「會不會在讀取條跑完那一瞬間跳回桌面」。那是另一件事,詳見中文版為什麼會跳出

而且本站有一個必須講清楚的數字。這一課做出來的字型,解開後合計 3,183,488 位元組。機器上那份社群語系檔的字型是 2,726,912這一課做出來的比它還多 456,576 位元組,因為社群那份把三個沒有中文的字型(au20b 98 字、Tw24 33 字、dflt 95 字)留成英文版的,只換了六個。而 2,726,912 那一份,配大球場時已經會跳出

想省一點的話,把那三個從 --swap 清單裡拿掉。代價是那三個字型負責的地方會缺中文字 —— 會缺在哪些畫面,本站沒有逐處查證,那要進遊戲看

本站也試過 mvp_font_swap.py --dedupe(把內容相同的字型合併)。結果要看你是在哪個狀態下跑的:在這一課做出來的成品上、以及在官方中文版原版上,它都回「沒有內容重複的字型」;但在英文版原版上(也就是 --restore 之後的狀態)它找得到一組 —— twcnb_en.ffntwc14_en.ffn 逐位元組相同,各 14,525 bytes。所以對這一課的成品來說,沒有東西可以靠合併省下來

要真正不跳出得調記憶體池,而原版做不到

本站對四份安裝的執行檔各跑了一次 mvp_modernize.py

執行檔大小編譯時間戳位址上限記憶體池
英文版原版6,972,0012005-01-222 GB找不到
官方中文版原版7,525,1752005-02-162 GB找不到
官方中文版+三個更新檔7,533,3682005-04-212 GB找不到
另一份社群流傳的安裝7,525,1752005-02-164 GB 已開找不到

四份全部找不到。原因見中文版為什麼會跳出那一頁(那一節在同意閘後面,要先把那三個框勾完才看得到):這幾顆執行檔的程式碼段在磁碟上是加密的,工具穿不透。本站不教怎麼處理光碟保護。

另外一個值得注意的:第四份那顆的 4 GB 大位址旗標已經是開的,記憶體池照樣找不到。4 GB 跟記憶體池是兩件不同的事,互不取代。

本站也試過對英文版原版的複本下 --pool 128:腳本印完唯讀報告之後,最後一行是「停下來了:這個執行檔裡找不到記憶體池的樣態,沒辦法改。」,離開碼 2。前後算 SHA-256 完全相同,也沒有留下任何備份檔 —— 它拒絕得很乾脆,不會亂改

本站工具做得到哪些、做不到哪些

步驟有沒有工具
備份英文原檔沒有工具,手動複製(步驟 2)
語系檔搬到英文槽位沒有工具,手動複製(步驟 3)。兩支腳本都只認 data\FEENG.LOCdata\IGENG.LOC,不會幫你改名
字型名字 _jp_en沒有工具,一行手打指令(步驟 4)。mvp_font_swap.py --swap 是照名字精準比對的,跨不過這個後綴
把中文字型裝進去mvp_font_swap.py --swap --source --apply
修 168 條格式符mvp_fix_loc.py --fix --apply
驗收✅ 兩支腳本不加參數就是唯讀檢查
換載入畫面的中文圖沒有工具,而且這一課不做(純美觀)
讓它不跳出❌ 原版安裝上做不到

兩個對得起來的旁證

本站在寫完之後,拿機器上留著的一份社群中文語系資料夾回頭對照,結果正好印證上面的推論

⚠️ 三個標籤要講清楚,免得以後引用錯

本站內部曾把兩個數字都掛在「社群 2023」名下,那個標籤兩邊都掛不上

另外,社群那份的 hrdbg 是 158 個字 72,544 位元組,跟兩份原版光碟的 26 個字 131,680 都對不上。未解 那個字型從哪來,本站不知道。

一個沒查出來的問題:遊戲怎麼知道自己是什麼語系

整條推論最脆弱的一環是這裡。本站查過:

未解 所以「英文版的執行檔一定跑在英文語系」這件事,本站是假設,不是量到的。這一課能成立是因為結果對得上(社群當年做的就是這個做法),不是因為本站看懂了那段程式。

📌 重點整理