[心得] SFC中文化經驗談(三)—指標篇—
【雜言】
我會做中文化主要還是松野的錯.....。
FF12讓我跑一次很high的低等級攻略後,我就很難從一般的玩法獲得滿足了。
後來因為一直提不起玩遊戲的興致,就開始看起我最喜歡的皇騎2的Rom data。
那時什麼都不懂,所以遇到一堆問題都要半猜半想、硬著頭皮解決。
然後.....就解析->翻譯->刻字->解析->loop n次....花差不多一年休閒時間做完了。
雖然那一年沒玩多少遊戲,但滿足感倒是前所未有的。
(日文拖U君等人的福,進步了一些XD)
【正文】
所謂的指標就是Rom裡指向圖片/字庫/文本起始位址的數據,
每個指標通常佔用2~3個bytes,遊戲會透過指標來快速載入這些資料。
由於中文化所需的字數通常比原日文遊戲使用字數多,
所以字庫大小與文本長度經常會比原本的長。
如果硬填回原位置的話,勢必會覆蓋掉後面的資料,
因此需要修改指標,將指向原字庫的指標指向一個放新字庫/文本的空間位址,
也就是所謂的"擴容"(註一)。
指向單一種未壓縮圖或字庫的指標通常只有單獨一個。
有時候,我們可以用"猜"的猜出這類指標位置,
特別是當你知道字庫的開始位置時。
例如我們可以YY-CHR看出0x4bdd9 (04 BD D9)的位址開始有指令名稱的圖,
用Lunar Address可以算出對應的SFC位址是0x9bdd9 (09 BD D9),
又因為SFC位址是高位byte在後面,
所以可以猜測SFC位址在Rom裡的數據也許會是D9 BD 09 (註二)。
於是我們用UltraEdit搜尋絕對位址D9 BD 09會發現.....沒這數據XD。
沒關係這常有的事,我們可以再用相對位址D9 BD去找.....發現有34筆。
我們試著把每一筆輪流改成D9 BE,也就是把指標指向的位址延後0x100,
希望將原本指向第一筆指令名稱圖的位址改成指向第二筆。
如果我們改到的是指標,原本畫面該顯示第一個圖就會改為顯示第二個圖。
最後我們在改0x4a390的數據時,發現改到指標了:
http://ppt.cc/OJIZ (又拿到奇怪的短網址...之前是o~mg)
事實上,運氣好的話我們可以在附近找到bank值(註二),也就是上述例子中的09。
我們將0x4a39c的09改成0A會發現指令名稱圖亂掉了,
這是因為它跑去0xabed9 (0A BE D9)的SFC位址。
如果我們再把0x4a390的數據改成20 92,就會存取到0xa9220 (0A 92 20)的SFC位址,
用Lunar Address可以算出該SFC位址對應的實際Rom裡位址是0x51220,
也就是下圖裡的あいうえおかきく圖像(因為調色盤不同,所以顯示出的文字顏色很暗)。
http://ppt.cc/~04w
以上就是不用反組譯,用猜就猜出指標的方法概念。
好,有多少人看到這裡放棄SFC中文化了(笑
劇情文本指標通常囉唆些(壓縮圖或字庫、名詞文本的指標有時也會這樣)。
以皇騎1為例,用了三層指標來存取劇情文本(對!三層!)。
先用一個總指標(第一層)指向連續存放的第一個章節指標(第二層),
再用各章節指標(第二層)指向某章節連續存放的的第一個對話指標(第三層),
最後用各對話指標(第三層,就是上一篇紫色的代碼)指向該對話的實際劇情代碼。
如此遊戲在進行時,只要知道進行到哪一章第幾段對話,就能透過多重指標快速存取。
(不過老實說,皇騎1把對話指標也壓縮進去沒有意義,甚至還拖累了一點存取時間。)
雖然我覺得大部份指標,只要知道資料起始位址就能反推出來,
但因為壓縮的關係,不少時候是根本不知道圖片、字庫、文本的開頭位置。
這時,就只好靠反組譯來知道指標位置跟壓縮方法了。
有趣的是,其實真正有必要知道壓縮方法的只有劇情文本,
圖片跟字庫的壓縮方法對反組譯來說.....根‧本‧不‧重‧要。
找塊空間放要取代的未壓縮新圖片跟字庫,用指標改連過去就好了。
下回開始就要進入胃痛的反組譯篇(不知道3篇能不能講完=___=|||),
對中文化有興趣的人.....請準備胃藥!
============================================================================
(註一) 事實上,擴容包含兩種層面,一種是上述的Rom裡原空間不足,
另一種是可使用的文本代碼範圍不足。例如皇騎1的劇情文字只允許
20 ~ FF, 19 00 ~ 1B FF ,接近1000個不重複代碼可供使用,
也就是只能定義最多不到1000個字,這種問題就只能靠反組譯解決,
透過修改原程式來增加更多可用代碼。
(註二) SFC的Rom\Ram裡任何位置都能用3個byte的絕對位址去存取。
但SFC是16 bits主機(簡略的說法),所以會把Rom裡空間拆成幾十個bank,
每個bank都有0000~FFFF的相對位址空間(2個bytes=16個 bits存取範圍)。
SFC位址09 BD D9也就代表第09個bank中相對位址為BD D9的地方。
遊戲程式執行時,bank其實不太常換,大多在處理同一bank裡的資料。
所以有時只會用兩個bytes來當指標,因為bank可能之前就指定了。
============================================================================
--
※ 發信站: 批踢踢實業坊(ptt.cc)
留言