速查 › 官方繁體中文版的三個更新檔,到底改了什麼

官方繁體中文版的三個更新檔,到底改了什麼

把官方中文版原版跟裝完三個更新檔的版本逐檔比對:2,389 個檔裡只有 19 個變了,沒有新增也沒有刪掉任何檔,整套 1.4 GB 淨長 6,930 個位元組。它是一份 2005 年開季名單更新,不是相容性修正 —— 中文版配大球場跳出的那件事,它一個位元組都沒碰。

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

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

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

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

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

⚡ 速解:想知道你手上那份更新過沒有

  1. mvp2005.exe 的檔案大小。7,525,175 bytes = 沒更新過;7,533,368 bytes = 三個都裝了。
  2. 大小被動過或不確定,就用 2026 年怎麼跑得起來那課的腳本唯讀看一次(不加 --apply 不會動到檔案)

    Windows:

    python mvp_modernize.py "<遊戲資料夾>/mvp2005.exe"

    Mac / Linux:

    python3 mvp_modernize.py "<遊戲資料夾>/mvp2005.exe"
  3. 看它印出來的編譯時間戳2005-02-16 = 原版;2005-04-21 = 更新過。
  4. 不想碰指令的話:開遊戲看授權聲明畫面上那行 Team Rosters Current as of01/12/05 = 原版,04/05/05 = 更新過。

Windows 打 python 說「不是內部或外部命令」的話,改打 py -3。第 4 步那兩行字是本站把 sushared.big 裡那張圖算出來讀到的,本站沒有實機開過遊戲。想知道它到底改了什麼,往下讀;只想複習,跳到 📌 重點整理

一句話

官方繁體中文版的那三個更新檔做的事是:把名單從 2005 年 1 月 12 日更新到 4 月 5 日,順手改了 18 條連線對戰與換人的中文句子、換掉一張載入畫面、把授權畫面上的名單日期改掉。

不是相容性修正。最常被問的那題「裝了官方更新檔,中文版配大球場就不會跳出了吧」,答案是不會,下面有量到的理由。

這一頁跟官方更新檔動了哪些檔那一頁不一樣

那一頁講的是英文版的四個更新檔(mvp2005patch1/2/3/5.exe),用的方法是掃安裝程式裡那份「我要覆蓋哪些路徑」的清單,沒有真的執行過它們。

這一頁講的是官方繁體中文版的三個更新檔(MVP2005PATCH1/2/3_TC.EXE),用的方法是拿一份沒裝過更新檔的安裝、跟一份三個都裝完的安裝,2,389 個檔逐一比對位元組。所以這一頁回答的是「跑完之後檔案真的變成什麼」。

本站不提供這三個更新檔。它們是 EA 的檔案,要用得自己去找。

先看規模:2,389 個檔裡只動了 19 個

兩份都是剛安裝好、誰都沒動過的遊戲(比對時排除 macOS 自己產生的 .DS_Store):

更新前的檔案數2,389 個 / 1,441,798,039 bytes
更新後共同的檔案數2,389 個(同一批檔)
新增的檔0 個
消失的檔0 個
內容有變的檔19 個(佔 0.80%)
大小一樣但內容不同的0 個
19 個檔的淨增量+6,930 bytes

一套 1.4 GB 的遊戲,更新完淨長 6,930 個位元組。這個數字本身就已經說明它的性質了。

更新後那個資料夾實際上是 2,393 個檔,多出來的四個是 MVP2005PATCH1/2/3_TC.EXE 與一顆備份用的 mvp2005 - 全新未更新.exe,是留在資料夾裡的東西,不是更新檔裝出來的。扣掉它們之後整套淨增量正好也是 6,930,兩邊對得起來。那顆「全新未更新」的 md5 跟更新前的主程式完全相同(725bbe80…),所以比對基準是對的。

那 19 個檔全部集中在三個地方:

位置幾個是什麼
data\database\14名單與成績表
data\FEJPN.LOC IGJPN.LOC2中文介面文字
data\frontend\2兩張介面圖
根目錄(mvp2005.exe1主程式

反過來說,這些資料夾一個檔都沒被動到

資料夾裡面有幾個檔被動到幾個
data\fonts\10
data\stadium\880
data\audio\1100
data\anims\7300
data\datafile\4660
data\misc\330
Support\2840

字型跟球場各動了零個檔。這一條先記著,等一下講跳出那題會用到。

三個更新檔各自宣告要蓋掉什麼

上面那 19 個是「三個都裝完」的總和。想知道第 1、2、3 個各做什麼,還有另一條路:每個安裝程式裡面存著一份「我要覆蓋哪些路徑」的清單,用文字掃描就讀得到(這正是英文版那一頁用的方法)。三個 _TC 安裝程式掃出來是:

宣告的目標數內容
PATCH123主程式 + 18 個 database\*.datFEJPN.LOC IGJPN.LOCfonts\fonts.bigfrontend\sushared.big
PATCH22主程式 + frontend\load53.big
PATCH320主程式 + 同樣 18 個 database\*.datfrontend\sushared.big

三份清單的聯集是 24 個路徑,而實際變了的是 19 個檔。差的那 5 個是清單裡有、但裝完之後內容一模一樣的:manager.datorg.datteam.dattstat.dat,還有 fonts\fonts.big

⭐ 字型那一項特別值得注意

PATCH1 宣告它要覆蓋 data\fonts\fonts.big,可是裝完之後那個檔逐位元組沒變。合理的解釋是它蓋上去的就是同一份 —— 官方中文版出貨時字型本來就已經是中文的,不需要換。

這也示範了「宣告的清單」跟「實際的改動」是兩件事。只讀清單會高估,只比對結果會不知道是哪一個更新檔幹的。兩種方法各有各的盲點。

兩個「19」不是同一組檔

英文版那一頁的結論是「四個更新檔加起來只碰 19 個檔案」。這一頁量到的也是 19 個。這是巧合,兩組不一樣。

英文版四個更新檔(宣告的聯集)繁中版三個更新檔(實際變動)
database\.dat16 個14 個
差在哪多了 manager.dat org.dat少了那兩個,多了 FEJPN.LOC IGJPN.LOC
frontend\ 的圖2(sushared load532(同兩個)
主程式11
合計1919

本站自己重掃了那四個英文安裝程式,各自宣告 16 / 17 / 17 / 19 個目標,聯集 19 —— 跟那一頁寫的一樣。但那 19 個裡有 manager.datorg.dat、沒有語系檔;繁中這 19 個剛好相反。

⚠️ 這是本站踩過好幾次的坑:兩個數字一樣,不代表在數同一件事。引用的時候要連「這是哪一組」一起講。

一、名單:更新到 2005 年 4 月 5 日

這是更新檔的主體。data\database\ 底下那些 .dat 其實是純文字的逗號分隔表,第一行是帶編號的欄位名,每個值前面還會再標一次自己的欄號(像 2 55 就是「第 2 欄,值 55」)。這種自己標號的寫法很好用,因為欄位對齊對不對,檔案自己會講

列數幾乎沒變,而且是刻意的

更新前更新後
打者類 8 張(attrib bstats career fbstats lhattrib lhbstats rhattrib rhbstats2,921 筆2,921 筆0
投手類 5 張(pitcher pstats careerp lhpstats rhpstats1,430 筆1,429 筆−1
roster.dat(誰在哪一隊)2,970 列 / 126 隊 / 2,920 名球員2,970 列 / 126 隊 / 2,920 名球員0
14 張表的欄位定義完全沒變(表頭逐字相同)

EA 自己更新名單的做法是在固定的格子裡換人,不是把表加長:attrib.dat 換掉 74 個人、換進 74 個人,總數一位都沒變。這對想自己改名單的人是很實用的一條情報。

完全沒被動到的表是 hist.datmanager.datorg.datteam.dattstat.dat(注意還有一個 resign.csv,副檔名不是 .dat),以及 progress.bigrookie.bigschedule.big 三個封裝檔。

換掉的是誰

拿球員編號當鍵去比對(同一個人在更新前後編號不變),74 進 74 出:

但幾乎沒有改能力值

這一點跟直覺相反,所以要把數字攤開。把 attrib.dat 裡兩邊都存在的 2,847 個人逐欄比對,有變的欄位一共 14 個:

欄位幾個人
背號245
薪水137
主守位50
合約年限27
副守位19
明星光環4
選球 · 盜壘積極度 · 速度 · 守備 · 守備範圍 · 傳球準度各 1
球棒顏色(Brian Jordan 3→2)· 守備手套顏色(Pedro Martinez 4→3)各 1

換句話說,更新的是行政資料(誰在哪一隊、穿幾號、領多少錢),不是重新評分。而 bstatscareerfbstats 這些成績表,共同球員的數字改動 0 筆 —— 2004 年球季已經打完了,成績當然不會變。

真正大搬風的是 roster.dat:2,970 個名單格裡有 854 格換了人,四欄守位各重排 502 至 549 格、四欄打序各重排 487 至 504 格。這就是「換隊」。

打者能力只有一個人被改:Rick Ankiel

上面那六個「各 1 人」的能力欄位,查出來是同一個人。而且他還是本站在另外兩張表裡唯一量到改動的人:

欄位更新前更新後
attrib主守位106
attrib副守位011
attrib速度4262
attrib盜壘積極度04
attrib選球47
attrib守備47
attrib守備範圍56
attrib傳球準度127
lhattrib(對左投)擊球 / 力量25 / 2145 / 41
rhattrib(對右投)擊球 / 力量24 / 2554 / 55

這張表列的是那六個能力欄位加上守位。他在 attrib 裡還有薪水 2→3 與明星光環 2→1,那兩欄不是只有他一個人被改,已經算在上一張表的 137 與 4 裡面。

守位代號不用猜,EA 自己的編輯器設定檔(MVPtools\config.txt)裡就寫著:主守位 10 = RP(後援投手)、6 = LF(左外野手);副守位 0 = P(投手)、11 = OF(外野手)。

再對一下投手表:Rick Ankiel 在更新前的 pitcher.dat 裡有 1 筆,更新後0 筆。投手少掉的那一位,就是他。

這就是 2005 年 Rick Ankiel 從投手改練外野手那件事

四條分別來自不同表的證據指向同一個結論:他從投手表被刪掉、主守位從後援投手改成左外野手、速度 +20、對左右投的擊球與力量各加了 20 到 30。EA 把這件真實世界的轉職寫進更新檔裡了。

投手那邊另外有 8 個人被改,而且有一位台灣人

pitcher.dat 的 1,395 名共同投手裡,有 8 個人被改,改的全部是同一欄 —— 續航力

投手更新前更新後
Miguel Batista9055
Shawn Chacon4575
Ryan Dempster4459
Brandon Lyon6656
Rafael Soriano4050
Steve Karsay4454
Mike Gosling5358
Chin-Hui Tsao(曹錦輝)6454

Miguel Batista 從 90 掉到 55 是整包更新裡幅度最大的一筆。本站沒有查證這 8 個人在真實世界發生了什麼,只能說 EA 動的全是同一欄。

二、語系:改了 18 條句子,一條字串都沒增減

先講一件值得知道的事:EA 官方繁體中文版的文字放在日文的檔名裡。中文版的 data\ 底下只有 FEJPN.LOC(219,136)跟 IGJPN.LOC(42,696),沒有 ENG 那一對;英文版則只有 FEENG.LOC(415,528)跟 IGENG.LOC(59,432)。三顆執行檔裡四個檔名都各出現 1 次,所以是 EA 本來就留了這個位置。詳細見EA 自己的繁體中文版

本站解開的 .LOC 格式把兩邊都讀出來:

更新前條數更新後條數文字有變的
IGJPN.LOC(比賽中)1,6631,66311 條
FEJPN.LOC(選單)6,4366,4367 條

字串編號一個都沒增減,前後兩份的編號表逐筆相同。那 18 條裡 12 條是連線對戰(對手斷線、延誤比賽、中途離開判敗)、4 條是換人與牛棚2 條是「被逐出比賽」。改法一致:18 條全部變長,沒有一條變短或一樣長

更新前更新後
換人完成替換完成。球員的替換動作以經完成了。
投手熱身投手被召往練投區。投手已經被召往練投區熱身了。
投手召回投手從練投區召回。熱身中的投手已經從練投區召回了。
被驅逐出場%1被逐出比賽。%1 已經被逐出這一場的遊戲比賽了。
對手斷線你的對手已從網路上消失,並被遊戲除名。你的對手已從網路上消失了,並也被遊戲比賽除名。

EA 這次又多打錯兩次同一個字

新版的「球員的替換動作以經完成了」應該是「已經」。這一條同時出現在 IGJPN.LOC 第 735 條與 FEJPN.LOC 第 3302 條,兩邊都錯。

但這不是第一次。更新FEJPN.LOC 裡就已經有一條「%s的禁賽以經結束。」(編號 17992,第 4591 條)。所以正確的講法是:這個錯字原本 1 條,更新之後變成 3 條

三、介面:換了兩張圖

data\frontend\ 底下 114 個檔(98 個 .bigmovies\ 裡 16 個)只有兩個變了,而且各自只裝一張 1024 × 512 的圖:

載入畫面 load53.big:整張換掉

裡面是一個 load53.fsh,解開後 262,304 bytes(每像素 0.5 byte,DXT1 壓縮),前後83.0% 的位元組不同 —— 也就是重畫。把它算成圖讀出來,內容從一則 MVP Online 連線功能的說明(標題「美國職棒大聯盟 Online」),換成一則打擊迷你遊戲的提示(標題「迷你遊戲」,內文「打不到快速球嗎?…把三振都變成打擊!」)。照片跟文字都換了。

授權畫面 sushared.big:只改一行字

裡面是一個 license.fsh,解開後 2,097,296 bytes(每像素 4 byte,32 位元無壓縮),只有 1.5% 的位元組不同,而且集中在兩塊:y 381–400(x 89–578)與 y 417–454(x 90–450)。那個形狀一看就是兩塊文字。把它算成圖讀出來:

更新前Team Rosters Current as of 01/12/05
更新後Team Rosters Current as of 04/05/05

更新檔自己把名單日期寫在授權畫面上。從 2005 年 1 月 12 日推到 4 月 5 日 —— 開季前後。這跟前面量到的 Rick Ankiel、Huston Street、井口資仁完全對得起來,而且是兩條互相獨立的證據:一條在名單資料裡,一條畫在圖上。

下面那一塊(y 417–454)是「©2005 Electronic Arts Inc. / All rights reserved.」。它的位元組確實變了,但本站把兩張都算出來看,文字讀起來一模一樣,看不出改了什麼 —— 上面那塊的最大色差是 249,下面那塊只有 118,像是整區重新算過一次造成的細微差異。未解 到底變了什麼,本站看不出來。

四、最重要的一題:有沒有解決「中文版配大球場就跳出」

沒有。

拿本站 2026 年的電腦怎麼跑得起 2005 年的遊戲 那課的 mvp_modernize.py,對更新前後兩顆執行檔各跑一次唯讀檢查(不加 --apply 就完全不會動到檔案):

項目更新前更新後
大位址旗標2 GB(沒開)2 GB(沒開)
解析度表8 筆,最大 1280×10248 筆,逐位元組相同
記憶體池找不到找不到
編譯時間戳2005-02-162005-04-21
解析度表的位址0x52F8600x530830(往後挪 4,048 bytes)

大位址旗標是直接讀 PE 檔頭那個位元量的:兩邊都是 Characteristics = 0x010F0x0020 那一位都是 0。解析度表那 128 個位元組前後完全相同,只是整張表被往後推了 4,048 個位元組(因為前面的程式碼長了)。

⚠️ 順便訂正一個很容易掉進去的誤會

寫這一頁的過程中一度以為「英文版的解析度表只有 6 筆、最大 1024×768,中文版才有 8 筆」,還差點拿它當中英版的差異寫上去。那是錯的。

本站用三種方式各驗一次:跑腳本、直接讀原始位元組、拿後四筆的位元組樣態去全檔搜尋。結論是英文版原版(表在 0x4C3FD8)、中文版原版(0x52F860)、中文版更新後(0x530830)三顆的那 128 個位元組逐位元組相同,全部 8 筆、全部到 1280×1024,樣態在三顆檔案裡也都各只出現 1 次。

⭐ 這條錯誤的形狀值得記下來:它憑空造出一個不存在的差別。而且腳本自己的開頭說明就寫著英文版的表在 0x4C3FD8 —— 資料一直都在,是量的人沒去對。

「記憶體池找不到」這一行,不能拿來當證據

這裡要誠實。兩邊都印「找不到」,並不代表兩邊的記憶體池一樣,只代表工具在這兩顆執行檔裡都看不到它

做個對照組就知道了:拿英文版原版跟另一份社群流傳的安裝跑同一支腳本,也都是「找不到」。所以這一行講的是工具的極限,不是更新檔的行為。詳細見中文版為什麼會跳出那一頁(記憶體池那一段在那一頁勾完同意之後才會出現)。

為什麼看不到:程式碼在硬碟上是密文

量熵就破案了(單一位元組的熵最大是 8.0000):

執行檔.text 的熵.rdata 的熵
中文版 更新前7.99905.6078
中文版 更新後7.99895.5435
英文版 原版7.99905.5704
對照:同資料夾的 eauninstall.exe6.61075.0953

同一個資料夾裡那支普通的 EA 反安裝程式是 6.6107,那才是正常編譯出來的 x86 程式碼該有的樣子。遊戲執行檔的 .text 幾乎頂到滿值,而隔壁的 .rdata 卻很正常 —— 只有程式碼那一段被加密。

這同時解釋了另一個乍看嚇人的數字:更新前後兩顆執行檔的 .text 有 94.4% 的位元組不同。這不代表 EA 改寫了 94.4% 的程式,而是重新保護時換了金鑰,密文自然整片不一樣。同樣的道理,拿那支腳本找記憶體池用的機器碼樣態push 一個常數、緊接著呼叫再返回)去掃 32 / 64 / 128 / 192 / 256 / 384 / 512 MB 這幾種大小,更新前後都是 0 次,英文版原版也是 0 次。密文裡當然找不到。

⚠️ 這個「0 次」要照上面那個完整樣態數才對得起來。只把那幾個數字當成四個位元組在整顆檔裡數是不行的 —— 那樣數更新前是 344 / 500 / 252 / 107 / 361 / 211 / 385 次、更新後是 344 / 544 / 250 / 103 / 392 / 217 / 422 次,一個都不是 0。四個位元組的樣式在 7 MB 的檔案裡到處都會撞到,不能拿來當「程式碼裡有沒有這個常數」的依據。

✅ 這一格已經對帳完畢。本站另一課對同一顆英文版執行檔原本寫的是 7.998,2026-09-05 重新逐區段量過之後改成 7.9990,跟本頁量到的一致;兩邊的結論本來就一樣(接近滿值 = 加密)。

所以誠實的講法是這樣

更糟的一點:更新完之後,還是修不了

本站 中文版配大球場就跳出 那課的做法,是把執行檔裡那個 64 MB 的記憶體池常數改大。那一課已經寫得很清楚:「看到『找不到』就是光碟原版,這一項做不到。」

裝完三個官方更新檔,執行檔還是「找不到」。也就是說,官方更新檔沒有把一顆不能修的執行檔變成能修的。想用那一課的方法,前提仍然是手上要有一顆程式碼沒被加密的執行檔。

五、防拷保護層:更新前後都在

直接讀 PE 的區段表跟程式進入點:

更新前更新後英文版原版
區段數777
最後兩個區段stxt774 stxt371stxt774 stxt371stxt774 stxt371
進入點落在stxt371stxt371stxt371
進入點 RVA0x005F409E0x005F609E0x0056609E

一般程式的進入點會落在 .text。這三顆都落在最後那個叫 stxt371 的區段,代表程式是先從保護層的程式碼開始跑,由它把 .text 解密之後再交棒。遊戲資料夾裡的 DrvMgt.dll(23,552 bytes,更新前後逐位元組相同)內含 SECDRVSECDRV.SYSSecDrv 三個字串,那是這一代光碟保護的驅動程式名稱。

更新前後的 stxt774stxt371 大小完全一樣(12,288 與 16,384 bytes),內容各只差 126 與 110 個位元組 —— 同一套保護重新包一次的樣子。

三個更新檔的安裝程式本身則是普通的 PE 檔:7 個區段(.text .bss .rdata .data .idata .rsrc .reloc)、進入點在 .text、沒有那兩個保護區段,而且三個的 PE 檔頭一模一樣(時間戳都是 2002-12-03,那是安裝程式外殼的日期,不是 EA 發布這三個更新檔的日期)。

本站不提供、不教學、也不包含任何規避技術保護措施的方法。上面只是把 PE 檔頭裡公開可讀的欄位念出來,用途是解釋「為什麼那支腳本讀不到記憶體池」。這條紅線見法律與版權說明第 3 節。

六、那它對誰還是有用的

想自己更新名單的人,這份更新檔是很好的教材,因為它是 EA 自己示範的標準做法:

各張表的欄位意義見名冊資料庫

七、幾個日期的順序

2005-01-12原版的名單基準日(寫在授權畫面上)
2005-01-22英文版執行檔的編譯時間戳
2005-02-16中文版原版執行檔的編譯時間戳
2005-04-05更新後的名單基準日(寫在授權畫面上)
2005-04-21更新後執行檔的編譯時間戳

執行檔的編譯時間戳在名單基準日之後 16 天,順序合理。

(本站手上這三個安裝程式的檔案日期都是 2009-03-24,那是這份備份被存下來的時間;PE 檔頭裡的 2002-12-03 是安裝程式外殼的日期。兩個都不是 EA 發布這三個更新檔的日期,不要拿它們當發布日。)

📌 重點整理