精華區beta Emulator 關於我們 聯絡資訊
【雜言】 我會做中文化主要還是松野的錯.....。 FF12讓我跑一次很high的低等級攻略後,我就很難從一般的玩法獲得滿足了。 後來因為一直提不起玩遊戲的興致,就開始看起我最喜歡的皇騎2的Rom data。 那時什麼都不懂,所以遇到一堆問題都要半猜半想、硬著頭皮解決。 然後.....就解析->翻譯->刻字->解析->loop n次....花差不多一年休閒時間做完了。 雖然那一年沒玩多少遊戲,但滿足感倒是前所未有的。 (日文拖U君等人的福,進步了一些XD) 【正文】 所謂的指標就是Rom裡指向圖片/字庫/文本起始位址的數據, 每個指標通常佔用2~3個bytes,遊戲會透過指標來快速載入這些資料。 由於中文化所需的字數通常比原日文遊戲使用字數多, 所以字庫大小與文本長度經常會比原本的長。 如果硬填回原位置的話,勢必會覆蓋掉後面的資料, 因此需要修改指標,將指向原字庫的指標指向一個放新字庫/文本的空間位址, 也就是所謂的"擴容"(註一)。 指向單一種未壓縮圖或字庫的指標通常只有單獨一個。 有時候,我們可以用"猜"的猜出這類指標位置, 特別是當你知道字庫的開始位置時。 例如我們可以YY-CHR看出0x4bed9 (04 BE D9)的位址開始有指令名稱的圖, 用Lunar Address可以算出對應的SFC位址是0x9bed9 (09 BE D9), 又因為SFC位址是高位byte在後面, 所以可以猜測SFC位址在Rom裡的數據也許會是D9 BE 09 (註二)。 於是我們用UltraEdit搜尋絕對位址D9 BE 09會發現.....沒這數據XD。 沒關係這常有的事,我們可以再用相對位址D9 BE去找.....發現有15筆。 我們試著把每一筆輪流改成D9 BD,也就是把指標指向的位址延後0x100, 希望將原本指向第一筆指令名稱圖的位址改成指向第二筆。 如果我們改到的是指標,原本畫面該顯示第一個圖就會改為顯示第二個圖。 最後我們在改0x4a390的數據時,發現改到指標了: http://ppt.cc/OJIZ (又拿到奇怪的短網址...之前是o~mg) 事實上,運氣好的話我們可以在附近找到bank值(註二),也就是上述例子中的09。 我們將0x4a39c的09改成0A會發現指令名稱圖亂掉了, 這是因為它跑去0xabdd9 (0A BD 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 00 ,接近1000個不重複代碼可供使用, 也就是只能定義最多不到1000個字,這種問題就只能靠反組譯解決, 透過修改原程式來增加更多可用代碼。 (註二) SFC的Rom\Ram裡任何位置都能用3個byte的絕對位址去存取。 但SFC是16 bits主機(簡略的說法),所以會把Rom裡空間拆成幾十個bank, 每個bank都有0000~FFFF的相對位址空間(2個bytes=16個 bits存取範圍)。 SFC位址09 BE D9也就代表第09個bank中相對位址為BE D9的地方。 遊戲程式執行時,bank其實不太常換,大多在處理同一bank裡的資料。 所以有時只會用兩個bytes來當指標,因為bank可能之前就指定了。 ============================================================================ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.249.43.151
conpo:專業好文推,長知識! 11/16 21:51