作者lulaptt (Lula)
看板Emulator
標題[心得] SFC中文化經驗談(三)—指標篇—
時間Fri Nov 16 21:50:04 2012
【雜言】
我會做中文化主要還是松野的錯.....。
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)
◆ From: 111.249.43.151
1F:推 conpo:專業好文推,長知識! 11/16 21:51
2F:推 protect6090:真神人也!!!!!!!!!!! 11/16 22:04
3F:推 UlyssesLin:なるほど、わからん。大丈夫だ、問題ない。 11/16 22:25
4F:推 arcadyii:瓊安軟體那幾款經典作品 從沒看過漢化 是根本上做不到嗎 11/16 22:57
5F:推 ADHI:好文章,特來拜讀!! 11/16 23:02
6F:→ lulaptt:我覺得理論上都可以中文化 只是要"改多大"的程度 11/16 23:02
7F:→ lulaptt:只是SFC技術較麻煩 中文化圈有在弄反組譯的大概就那幾個人 11/16 23:07
8F:→ lulaptt:不知道這邊提的經典作品是....? 11/16 23:08
9F:推 kurenai911:瓊安軟體的遊戲幾乎每片都是經典之作,在超任上的有 11/16 23:23
10F:→ kurenai911:弟切草、恐怖驚魂夜、特魯內克和風塵英雄 11/16 23:23
11F:→ lulaptt:風塵英雄有中文化唷...破解我還認識...=__=||| 11/16 23:35
12F:推 oginome:推lulaptt專業!我超喜歡弟切草的說~破了不下30次呢~ 11/16 23:56
13F:推 busin:專業好文推一個~ 11/17 12:52
※ 編輯: lulaptt 來自: 111.249.79.124 (11/17 18:09)
14F:→ lulaptt:修改一項錯誤 之前BD D9跟BE D9寫反了.... 11/17 18:11
15F:推 katzdx:推專業文~ 11/17 18:53
16F:推 prudence:不得不感謝松野的錯 XDD 11/18 13:46
17F:推 qazxswptt:感謝好文 11/18 14:56
18F:推 willkill:推推推 11/18 16:30
19F:推 kaoen:中文化是個「厚工」的工作~有愛有推~ 11/19 01:45
20F:→ djboy:神文推! 11/19 10:14
21F:推 kuchibue:有看有推! 11/21 20:26
22F:推 EDGE: 路人推專業好文! 11/23 01:25