教學 › 把官方中文版的中文搬進英文版
把官方中文版的中文搬進英文版
官方中文版把中文放在遊戲的日文槽位,連字型檔裡每一個項目的名字都是。這一課教你從你自己那份官方中文版,把中文搬到英文版的英文槽位去。本站不附任何現成的包,全部用你手上那兩份原版加上站上的兩支腳本做出來。
🛟 動手之前:先完整備份整個遊戲資料夾
把整個遊戲資料夾複製一份到別的地方, 包括裡面存放紀錄的資料夾。不要挑檔案,整包複製最省事也最保險。
「紀錄」是指這些(它們跟遊戲檔混在同一個資料夾裡):
Support\MVP Baseball 2005\—— 遊戲自己建的, 裡面是設定(MVPOptions_Options.sav)與手把設定 (controller.cfg)。剛安裝好時沒有這個資料夾,玩過才出現。- 王朝、老闆模式、名單與玩家檔案的存檔(
*_Franchise.sav、*_Owner Mode.sav、*_Rosters.sav、*_Profile.sav)—— 沒有固定的資料夾名,你或你裝的模組包叫它什麼它就叫什麼。找不到就用這一行找:
dir /s /b "〔你的遊戲資料夾〕\*.sav"
find "〔你的遊戲資料夾〕" -name "*.sav"
上面第一行 Windows、第二行 Mac。 本站每一支工具都會自己備份它要動的那一個檔, 但那只保得住那一個檔 —— 整包備份保的是「你玩到現在的一切」。 完整做法看備份與還原 SOP。
⚡ 只想趕快做完?照這五步
- 把 mvp_font_swap.py 與 mvp_fix_loc.py 放到桌面,終端機切到桌面,把你兩個遊戲資料夾的路徑填進去(整段複製)
Windows:
cd %USERPROFILE%\Desktop set EN=這裡貼上英文版遊戲資料夾 set CN=這裡貼上官方中文版遊戲資料夾Mac / Linux:
cd ~/Desktop EN="這裡拖進英文版遊戲資料夾" CN="這裡拖進官方中文版遊戲資料夾" - 備份英文原檔,順便做出腳本一定要有的比對資料夾(不能跳)
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/英文語系/" - 把中文語系檔放進英文槽位
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" - 把中文字型的名字從日文槽位改成英文槽位,順便把中文版裡那個英文
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" - 兩支腳本各跑一次(先把
--apply拿掉預覽,數字對了再加回去)Windows:
python mvp_font_swap.py "%EN%" --source "%EN%\data\中文字型_英文槽位.big" --swap Tw24,au20b,dflt,frk12,mini1,mini2,twcnb,twc14,twc16,twc18,twn14 --applypython mvp_fix_loc.py "%EN%" --fix --applyMac / Linux:
python3 mvp_font_swap.py "$EN" --source "$EN/data/中文字型_英文槽位.big" --swap Tw24,au20b,dflt,frk12,mini1,mini2,twcnb,twc14,twc16,twc18,twn14 --applypython3 mvp_fix_loc.py "$EN" --fix --apply
上面每一步都給了 Windows 與 Mac / Linux 兩種寫法,照你的系統挑一種(Windows 打 python 說「不是內部或外部命令」,就改打 py -3;set EN= 後面不要加引號)。做完照✅ 驗收那三行檢查,三項都不用進遊戲。這一課只保證中文顯示得出來,不保證不會跳出 —— 原因在做不到的事。只想複習,跳到 📌 重點整理。
難度
★★☆ 會複製檔案、跑兩支腳本
時間
約 20 分鐘
可以還原嗎
可以,但要照最後那一節做
這一課只保證一件事:中文顯示得出來
它不保證不會跳出。不跳出要調的是遊戲自己那塊記憶體池,而本站對四份原版安裝各跑了一次檢查,四份全部找不到那塊記憶體池。下面「這一課做不到的事」有實測數字。
本站不提供任何遊戲檔案下載。這一課從頭到尾用的是你自己那兩份光碟安裝,加上站上自己寫的兩支腳本。
先講清楚:站上另外兩頁曾經寫著「本站不寫中文化教學」
文字表 .LOC 與 EA 自己的繁體中文版 兩頁都寫過「這兩塊補齊之前,本站不寫中文化教學」。那兩塊是:寫回 .LOC 的工具,以及字型檔的字符點陣。
第一塊後來做了(mvp_fix_loc.py)。第二塊讀得出來 —— 字型檔 .ffn 那頁 2026-09-05 訂正過:字圖集與字元表都量過了(中文字型那張是 0x79、1024 × 512,數到字型提供 1,529 個字)。仍然沒有的是「從零產生一份、再寫回去」的辦法,所以這一課還是整包搬官方做好的字型,不是自己刻。
那這一課憑什麼成立?因為它繞過那一塊,不是解開它。本站不會自己畫中文字型 —— 這一課是把官方中文版早就做好的字型整包搬過去,一個字符點陣都不用懂。所以「本站不寫中文化教學」那句話後來改掉了 —— 那兩頁現在寫的是「本站有中文化教學,教的是把官方中文搬進英文版,不是教你從零刻一套中文字型」,而且都反向連回這一課。
你需要什麼
- 一份英文版的遊戲(要改的就是它)。
- 一份官方中文版,或至少它的
data資料夾。這一課從頭到尾只會讀它三個檔:FEJPN.LOC(219,136)、IGJPN.LOC(42,696)、fonts\fonts.big(1,683,513),三個加起來 1,945,345 位元組。中文版本身完全不會被改到。 - Python 3。
- 本站兩支腳本 mvp_font_swap.py 與 mvp_fix_loc.py(原本住在中文版配大球場就跳出那一課,零外部相依)。
先看清楚兩份原版差在哪
本站把兩份剛安裝好的原版 data\ 逐檔比對過。
| 英文版 | 官方中文版 | |
|---|---|---|
data\ 檔案數 | 902 | 2,098 |
data\ 佔用 | 1,385,256 KB | 1,400,260 KB |
| 只有這一邊有的檔 | 4 個 | 1,200 個 |
| 兩邊同名的檔 | 898 個,其中 84 個內容不一樣 | |
那 1,200 個「只有中文版有」看起來嚇人,其實 1,196 個是 anims\(730 個)跟 datafile\(466 個)被拆成散裝檔了,英文版那兩個資料夾裡各只有一個封裝檔。那是安裝方式的差別,不是語言的差別。剩下的四個才是重點:FEJPN.LOC、IGJPN.LOC、tuningdefaults.h、credits.BAK。
84 個「不一樣」裡,有 22 個不是語言造成的
把那 84 個逐位元組數過之後,其中 22 個大小完全相同,而且只差 1 到 20 個位元組。這 22 個合計只差 85 個位元組。但它們不是同一種東西,要分成兩類:
| 幾個檔 | 差幾個位元組 | 差異長什麼樣 | |
|---|---|---|---|
| 第一類 | 20 | 合計 45 | 每一個差異都是同一個位元(中文版比英文版大 8)。models.big 172,992,803 位元組裡只差 4 個位元組,就是這一類 |
| 第二類 | 2 | 各 20 | frontend\feonlyln.big 與 igshapes\igcrsr9.fsh,兩個都在位移 17,605 起有一段 20 位元組的欄位 |
🔬 第二類長什麼樣
中文版那兩個檔在那 20 個位元組寫的是可列印的十六進位 ASCII:0bfffcc9753aabac325f。英文版寫的是 20 個看不出結構的位元組(igcrsr9 是 77d53ac1…、feonlyln 是 a4d0f3dd…)。
更有意思的是:中文版那兩個檔彼此逐位元組完全相同,英文版那兩個卻互不相同。
未解 那 20 個位元組是什麼(序號?雜湊?壓片母帶識別?)本站不知道,只知道它跟語言無關。
扣掉這 22 個,真正因為語言而不同的只有 62 個檔:
| 檔案 | 英文版 | 官方中文版 | 是什麼 |
|---|---|---|---|
fonts\fonts.big | 204,820 | 1,683,513 | 字型,8.22 倍 |
frontend\load*.big 60 個 | 134,609 – 170,795 | 132,168 – 166,365 | 載入畫面的圖 |
frontend\minibat.big | 253,292 | 243,897 | 迷你遊戲的圖 |
那 60 個載入畫面本站也拆開看過:每個裡面只裝一個 .fsh,裡面只有 1 張 1024 × 512 的 DXT1 圖,60 個解開後大小全部是 262,304、兩版完全一樣,只是壓縮後的內容 60 個全部不同(畫面上的提示文字一邊英文一邊中文)。它們是圖片,不是文字表,要不要換純粹是美觀問題,這一課不處理。
⚠️ minibat.big 不一樣:它一樣只裝一個 .fsh(bminiov.fsh),但那個 .fsh 裡面有 52 張圖、十種尺寸(32×32 佔 23 張、256×128 佔 11 張、128×128 與 128×64 各 5 張…),兩版解開後都是 2,264,176。「只裝一個 .fsh」跟「只有一張圖」是兩件事,不要混。
語系檔:中文放在日文槽位
| 英文版 | 官方中文版 | |
|---|---|---|
| 選單文字 | FEENG.LOC 415,528 | FEJPN.LOC 219,136 |
| 比賽中文字 | IGENG.LOC 59,432 | IGJPN.LOC 42,696 |
| 字串條數 | 6,352 / 1,584 | 6,436 / 1,663 |
四個檔的檔頭都是 LOCH,內容是 UTF-16LE,不是 Big5,所以不會有編碼問題。中文版檔案比較小,因為同一句話中文用的字比較少,而 UTF-16 每個字都是兩個位元組。
值得注意的是中文版的條數比英文版還多,而且編號對不齊:選單有 6,349 個編號兩邊都有、3 個只有英文版有、87 個只有中文版有;比賽中文字是 1,584 個共有、0 個只有英文、79 個只有中文版有。這是等一下第五步要處理的問題的根源。
字型檔:連名字都是日文槽位
這是整件事的關鍵。把兩個 fonts.big 的目錄攤開:
| 英文版(12 項) | 字元數 | 官方中文版(13 項) | 字元數 |
|---|---|---|---|
Tw24_en.ffn | 33 | Tw24_jp.ffn | 1,529 |
au20b_en.ffn | 98 | au20b_jp.ffn | 1,529 |
dflt_en.ffn | 95 | dflt_en.ffn 與 dflt_jp.ffn | 95 / 1,529 |
frk12_en.ffn | 98 | frk12_jp.ffn | 1,529 |
hrdbg_en.ffn | 26 | hrdbg_jp.ffn | 26 |
mini1_en.ffn / mini2_en.ffn | 98 / 98 | mini1_jp.ffn / mini2_jp.ffn | 267 / 267 |
twcnb twc14 twc16 twc18 twn14 的 _en 版 | 各 98 | 同五個的 _jp 版 | 各 1,529 |
| 解開後合計 | 2,126,080 | 3,250,656 |
兩件事可以直接看出來。第一,檔名的後綴跟語系檔的後綴是同一套:ENG 對 _en、JPN 對 _jp。第二,官方中文版裡九個字型都是 1,529 個字,不是只有六個。hrdbg 與 dflt_en 兩版解開後逐位元組相同,那兩個根本沒被中文化。
為什麼不能把中文版的 fonts.big 直接蓋過去
直覺會想:那把中文版的 fonts.big 複製到英文版不就好了?不行,而且原因可以量出來。
遊戲的介面版面檔(.fel)會指名要用哪一個字型檔。本站把六個裝版面檔的封裝檔(frontend.big、cooplay.big、ingame.big、minigame.big、apt.big、title.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 全部換成 _en,dflt_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,twn14python mvp_fix_loc.py "%EN%" --fixMac / Linux:
python3 mvp_font_swap.py "$EN" --source "$EN/data/中文字型_英文槽位.big" --swap Tw24,au20b,dflt,frk12,mini1,mini2,twcnb,twc14,twc16,twc18,twn14python3 mvp_fix_loc.py "$EN" --fix確定了才真的寫入。兩支都會自己先備份(fonts.big.fontbak、FEENG.LOC.locbak、IGENG.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 --applypython mvp_fix_loc.py "%EN%" --fix --applyMac / Linux:
python3 mvp_font_swap.py "$EN" --source "$EN/data/中文字型_英文槽位.big" --swap Tw24,au20b,dflt,frk12,mini1,mini2,twcnb,twc14,twc16,twc18,twn14 --applypython3 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%" --restorepython mvp_fix_loc.py "%EN%" --restoreMac / Linux:
python3 mvp_font_swap.py "$EN" --restorepython3 mvp_fix_loc.py "$EN" --restore本站實測:mvp_font_swap.py --restore 之後 fonts.big 跟英文原版逐位元組相同(204,820),備份檔也被移除;但 mvp_fix_loc.py --restore 之後 FEENG.LOC 與 IGENG.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.ffn 跟 twc14_en.ffn 逐位元組相同,各 14,525 bytes。所以對這一課的成品來說,沒有東西可以靠合併省下來。
要真正不跳出得調記憶體池,而原版做不到
本站對四份安裝的執行檔各跑了一次 mvp_modernize.py:
| 執行檔 | 大小 | 編譯時間戳 | 位址上限 | 記憶體池 |
|---|---|---|---|---|
| 英文版原版 | 6,972,001 | 2005-01-22 | 2 GB | 找不到 |
| 官方中文版原版 | 7,525,175 | 2005-02-16 | 2 GB | 找不到 |
| 官方中文版+三個更新檔 | 7,533,368 | 2005-04-21 | 2 GB | 找不到 |
| 另一份社群流傳的安裝 | 7,525,175 | 2005-02-16 | 4 GB 已開 | 找不到 |
四份全部找不到。原因見中文版為什麼會跳出那一頁(那一節在同意閘後面,要先把那三個框勾完才看得到):這幾顆執行檔的程式碼段在磁碟上是加密的,工具穿不透。本站不教怎麼處理光碟保護。
另外一個值得注意的:第四份那顆的 4 GB 大位址旗標已經是開的,記憶體池照樣找不到。4 GB 跟記憶體池是兩件不同的事,互不取代。
本站也試過對英文版原版的複本下 --pool 128:腳本印完唯讀報告之後,最後一行是「停下來了:這個執行檔裡找不到記憶體池的樣態,沒辦法改。」,離開碼 2。前後算 SHA-256 完全相同,也沒有留下任何備份檔 —— 它拒絕得很乾脆,不會亂改。
本站工具做得到哪些、做不到哪些
| 步驟 | 有沒有工具 |
|---|---|
| 備份英文原檔 | 沒有工具,手動複製(步驟 2) |
| 語系檔搬到英文槽位 | 沒有工具,手動複製(步驟 3)。兩支腳本都只認 data\FEENG.LOC 與 data\IGENG.LOC,不會幫你改名 |
字型名字 _jp 改 _en | 沒有工具,一行手打指令(步驟 4)。mvp_font_swap.py --swap 是照名字精準比對的,跨不過這個後綴 |
| 把中文字型裝進去 | ✅ mvp_font_swap.py --swap --source --apply |
| 修 168 條格式符 | ✅ mvp_fix_loc.py --fix --apply |
| 驗收 | ✅ 兩支腳本不加參數就是唯讀檢查 |
| 換載入畫面的中文圖 | 沒有工具,而且這一課不做(純美觀) |
| 讓它不跳出 | ❌ 原版安裝上做不到 |
兩個對得起來的旁證
本站在寫完之後,拿機器上留著的一份社群中文語系資料夾回頭對照,結果正好印證上面的推論:
- 它裡面的檔案叫
FEENG.LOC跟IGENG.LOC,不是FEJPN。中文確實被搬到英文槽位。 - 它的
fonts.big12 個項目全部是_en.ffn,_jp.ffn零個。當年社群做的就是這件事。
⚠️ 三個標籤要講清楚,免得以後引用錯
本站內部曾把兩個數字都掛在「社群 2023」名下,那個標籤兩邊都掛不上:
- 2,726,912 來自
歷史資料\MVP\中文語系\Fonts\fonts.big,檔案 1,279,340 位元組、修改日期 2008-05-25,而且跟Taiwan_mod_20090427裡那一份逐位元組相同。它旁邊的兩個.LOC是 2009-04-14。 - 777,520 根本不在什麼「英文語系」資料夾裡 —— 全機掃過九個
fonts.big,那個數字來自MVP2026\data\fonts\fonts.big(397,327 位元組,修改日期 2022-11-13)。 mvp_font_swap.py執行時會印一行「全英文 777,520 能玩 · 全中文 2,726,912 當機」。那兩個數字是上面那兩份的,不是光碟原版的。光碟英文原版的字型解開後是 2,126,080,官方中文版是 3,250,656。你照這一課做,看到的數字會跟腳本印的那一行對不上,那是正常的。
另外,社群那份的 hrdbg 是 158 個字 72,544 位元組,跟兩份原版光碟的 26 個字 131,680 都對不上。未解 那個字型從哪來,本站不知道。
一個沒查出來的問題:遊戲怎麼知道自己是什麼語系
整條推論最脆弱的一環是這裡。本站查過:
- 三顆執行檔(英文版、中文版、中文版更新後)裡都同時含有
FEENG.LOC、FEJPN.LOC、IGENG.LOC、IGJPN.LOC、IDL_ESPERANTO.LOC、IDL_SPANISH.LOC六個字串,各出現 1 次。 mvp.ini裡沒有任何語系設定。而且mvp.ini只有官方中文版那份安裝有,英文版整份安裝根本沒有這個檔。
未解 所以「英文版的執行檔一定跑在英文語系」這件事,本站是假設,不是量到的。這一課能成立是因為結果對得上(社群當年做的就是這個做法),不是因為本站看懂了那段程式。
📌 重點整理
- 一句話 這一課是把你自己那份官方中文版的三個檔(
FEJPN.LOC、IGJPN.LOC、fonts.big,合計 1,945,345 位元組)搬到英文版的英文槽位。本站不附任何現成的包,中文版原檔也完全不會被動到。 - 官方中文版把中文放在日文槽位,而且不只語系檔 —— 連字型封裝檔裡 12 個項目的名字都是
_jp.ffn。九個字型有 1,529 個字,hrdbg與dflt_en兩版逐位元組相同、根本沒被中文化。 - 不能把中文版的
fonts.big直接蓋過去 本站解開 329 個版面檔,17,380 次字型引用全部寫_en.ffn、_jp零次,而那六個裝版面檔的封裝檔在兩版是逐位元組相同的。 - 修起來很便宜
_jp.ffn跟_en.ffn都是 7 個字元,12 次全部落在檔頭目錄區(位移 28 到 278,第一筆資料從 296 才開始),所以位元組取代之後檔案大小 1,683,513 一個位元組都不會變。但那會產生兩個同名的dflt_en.ffn,腳本碰到同名會用離開碼 2 停手,所以步驟 4 先把中文版裡那個英文的改名成dflt_xx.ffn挪開讓位。成品是 12 項而官方是 13 項 —— 少的是 95 字的英文dflt。 - 本站腳本能做的是兩件 「裝字型」跟「修 168 條格式符」。「語系檔改名」跟「字型名字改後綴」兩步沒有工具,要手動,而且
mvp_font_swap.py --swap跨不過後綴,會用離開碼 2 停在「來源檔裡沒有frk12_en.ffn」。 - 驗收完全不用進遊戲
mvp_fix_loc.py要印 0 條、mvp_font_swap.py那張表 12 列左右都要一樣(兩個合計會差 +67,168,那是步驟 4 挪開的英文dflt)、fonts.big裡_jp.ffn要是 0 次而_en.ffn12 次(size 1,677,672)。 - 做完只保證中文顯示得出來,不保證不跳出 這一課做出來的字型解開後 3,183,488,比那份會跳出的社群字型 2,726,912 還多 456,576。要不跳出得調記憶體池,而本站對四份安裝各跑一次,四份全部找不到那塊池;對原版下
--pool 128腳本會用離開碼 2 拒絕,SHA-256 前後相同、0 個備份殘留。 - 本站沒驗的 整個流程本站沒有實機開過遊戲,只驗到檔案結構、腳本行為與名字對得上;「遊戲執行時會照語系把
_en換成該語系後綴」是推論,沒有反組譯證實,而且「英文版執行檔一定跑在英文語系」是假設(三顆執行檔都同時含四個語系檔名,mvp.ini裡沒有語系設定,而且mvp.ini只有中文版安裝才有);少掉那個 95 字的英文dflt會不會有影響、把au20b/Tw24/dflt拿掉會在哪些畫面缺字、做出來的成品配大球場會不會照樣跳出,全部要進遊戲才知道;那 22 個同大小差異檔裡兩個非 +8 的 20 位元組欄位是什麼、社群那份hrdbg(158 字 72,544)從哪來,本站都不知道。