作者lulaptt (Lula)
看板Emulator
標題[心得] SFC中文化經驗談(二)—解壓篇—
時間Fri Nov 9 22:44:18 2012
【雜言】
雖然實作上是以top-down的方式,從反組譯開始找出指標、壓縮規則,
但我還是以bottom-up的方式來解說中文化技術,
因為這樣比較不會一次遇到大量名詞與觀念。
所以讓我們假設已經知道文本、字庫指標,先來看看常見的壓縮規則與觀念。
【正文】
由於早期卡匣昂貴,如何在有限的ROM裡盡量壓縮資料塞進去,
就成了早期遊戲的基本要求。
會壓縮的資料主要包括圖像、字庫、文本,
不過反正都是看成以byte為單位的連續資料,所以壓縮時沒太大差別。
事實上,因為連壓縮規則都是每個遊戲自由訂定旳,
所以沒有通則存在。不過我一般會分成下列幾種類型:
==================================================================
‧無壓縮型
-
無壓縮的資料大致
只包含資料本身與控制碼。
控制碼是各遊戲各自訂定的,可能包含結束碼、換行碼、
甚至主人公名字、取得道具名等非固定資料,也會以特定代碼表示。
-
名詞文本因為太短無壓縮必要,因此通常沒被壓縮。
無壓縮圖像、字庫通常不會有控制碼,無壓縮劇情文本則一定會有。
例如:
皇家騎士團一代中,武器名稱是以未壓縮形式存放在ROM裡。
ソ ニ ッ ク ブ レ ー ド
BF C6 AF B8 19 32 DA B0 19 2E
00
從上例可見有些字的代碼長度是1 byte、有些是2 bytes。
最後的
00就是用於判斷名稱末尾的控制碼。
我們要
如何知道每個字的代碼是什麼?
最簡單的方法就是
去找改名字的金手指,
這特別適用在文字量大、能取名的RPG與SLG遊戲。
‧字典型
-
用固定2~3個byte當作某些常用詞(例如道具名、人名)的代碼。
加上特定控制碼就會直接透過代碼取得名稱。
-
這其實應該不算壓縮,比較像引用....
因為比起等下要講的簡單多了,所以省略(逃
-
多半使用在劇情文本上,大多
利用名詞文本當字典,
有時也會跟下面方法混用。
‧參照型
-
將至今解壓出的本文內容當參考對象,
指定"
位移量"與"
參照byte數"來得到重複出現過的句子段落。
-
圖像、字庫、劇情文本都可能使用。
-
以下舉例介紹:
========================================================
SFC中最常見的壓縮法是....
用1個壓縮byte來指示後面幾個bytes內容,
用 bit = 1 或 0 來代表哪些是未壓縮資料、哪些是參照資料。
FF 74 00 9A 00 CE 00 0E 01
FF 46 01 80 01 B1 01
D2 01
FF 10 02 51 02 88 02 9F 02
FF BB 02 E0 02
0D 03 3B 03
FF 60 03 9A 03 AC 03 D7 03
FF F9 03
25 04 5A 04 94 04
FF C9 04 08 05 38 05 78 05
FF
98 05 C0 05 FD 05 2E 06
FF 71 06 B2 06 EA 06 15
07
FF 3A 07 6A 07 A0 07 DD 07
FF 19 08 4E 08 85
08 AC 08
FF E2 08 23 09 56 09 92 09
FF CF 09 0A
0A 33 0A 66 0A
FF 8D 0A BB 0A F0 0A 11 0B
FF 36
0B 6C 0B B3 AB B0 DA
FF DD 0D 3E FC 19 00 19 9C
FF ED A4 F6 93 9A 9F A1 0D
FF 20 91 E5 E0 86 95
1A AA
FF E1 9C E3 95 F8 EF 9C E0
F7 A1 00 3E
07
EE EA 19 C2 9C
FF 97 19 28 C3 19 21 C8 B1 FF 19
96 19 89 E4 0D 20 18
FF 1E FC E8 19 10 E5 F8 EF
FB 9E FD
07 CA 19 A7 19 00 9F
FF 93 E2 19 03 E3
92 EF 9D...(略)
以上面皇騎1代的壓縮劇情代碼為例:
當壓縮byte為
FF時,就表示後面8個bytes都是未壓縮資料。
因為
FF以2進位看時是 11111111,
而每個1都代表1byte的未壓縮資料。
當壓縮byte為
F7時,因為
F7以2進位看時是 11110111,
其中0是位在從右邊(低位)數來第4筆的位置,
表示第4筆是
參照資料(2 bytes),其他7筆是1 byte未壓縮:
A1 00 3E
07 EE EA 19 C2 9C
這2 bytes
參照資料轉成2進位就是
00000111 11101110。
前5 bits用來表示需複製多少byte資料。
因為參照資料本身就佔2 bytes了,最少要複製3 bytes才夠本。
因此就算前5 bits換算十進位值為0,也會複製3 bytes過來。
如果前5 bits換算十進位值為X,就會複製 X+3 bytes過來。
後11個bits表示要複製的資料離多遠。
因為111 11101110相當於十進位的-18,
因此會從已解壓的資料尾部,向前推18 bytes作為開始複製的地方。
可以參考下面的解壓資料,其中
91 E5 E0就是被複製過來的資料。
0D、00都是
控制碼,用於表示
換行、結束。
有興趣的人可以推敲
FB 9E FD
07 CA 19 A7 19 00 9F ,
應該會得到符合下面解壓的結果。
74 00 9A 00 CE 00 0E 01 46 01 80 01 B1 01
D2 01 10 02 51 02 88 02 9F 02 BB 02 E0 02
0D 03 3B 03 60 03 9A 03 AC 03 D7 03 F9 03
25 04 5A 04 94 04 C9 04 08 05 38 05 78 05
98 05 C0 05 FD 05 2E 06 71 06 B2 06 EA 06 15
07 3A 07 6A 07 A0 07 DD 07 19 08 4E 08 85
08 AC 08 E2 08 23 09 56 09 92 09 CF 09 0A
0A 33 0A 66 0A 8D 0A BB 0A F0 0A 11 0B 36
0B 6C 0B B3 AB B0 DA DD
0D 3E FC 19 00 19 9C
ウ ォ ー レ ン 「 わ が 城
ED A4 F6 93 9A 9F
A1 0D 20 91 E5 E0 86 95
へ 、 よ う こ そ 。 □ あ な た を お
1A AA E1 9C E3 95 F8 EF 9C E0 A1
00 3E
91 E5 E0
待 ち し て お り ま し た 。 「 あ な た
EA 19 C2 9C 97 19 28 C3 19 21 C8 B1 19 96 19 89
は 悪 し き ゼ テ ギ ネ ア 帝 国
E4
0D 20 18 1E FC E8 19 10 E5 F8 EF 9E FD
A1 0D
と □ 戦 わ ね ば な り ま せ ん 。
20 19 A7 19 00 9F 93 E2 19 03 E3 92 EF 9D
□ 星 が そ う つ げ て い ま す
這邊要注意的一點是,
參照資料的定義可能因遊戲而不同。
有的用較多bits在容許複製的byte數;
有的用較多bits在容許的位移量,
我印象中皇騎2就用了3種以上定義來壓資料。
也許有人會想問,上面
紫色的是什麼。
注意看應該會發現,如果以每2個bytes為一組,
並且前後對調的話(SFC是low byte在前),會有遞增的趨勢:
(00 74) (00 9A) (00 CE) (01 0E) (01 46) (01 80) (01 B1)
....(略)
簡單來說,每一組都是"
位移指標",
記錄了從某處位移的距離。
此處的第1組(00 74)表示了第1段對話的位置,
是從解壓後資料開始處算起的第 0x74 byte (十進位的116 byte),
第2段對話是在第 0x9A byte位置,....以此類推。
這樣遊戲在顯示對話時,才能很快透過位移指標找到特定對話。
中文化中有很多使用指標的機會,我們以後還會再陸續討論。
當我們要中文化遊戲劇情時,每段對話長度一定會有所變動,
所以要連位移指標都一起修改至新的正確位置才行。
之後,用最簡單的壓縮byte(FF)把改好的指標、劇情塞回去就行。
(事實上、一般應該是不會連指標都壓縮,皇騎1應該是少數例子)
‧特殊型
- 有的遊戲會自己定義一些奇怪的壓縮規則,例如聖火降魔錄。
因為特性不一,在此就不提出討論,有興趣可以自行尋找。
- 另一個不討論的原因是,其實就算是特定壓縮方法,
理論上也能透過反組譯來知道壓縮流程。
==================================================================
這週大概就先介紹到此,我再想想下週要寫什麼比較順...
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.249.54.35
推 qazxswptt:請受一拜 謝謝你的辛苦奉獻 11/09 22:51
推 tonybin:謝謝分享 11/09 23:10
推 snakeONE:推阿~ 11/09 23:17
推 imasa:推一個,感覺我遲早會要再來參拜一次... 11/09 23:17
推 pb220708:不推不是人 11/09 23:50
推 silver00:請受小弟一拜... 11/10 06:23
推 kuchibue:有看有推~ 11/10 12:20
推 msun:推! 11/10 13:06
→ klt:認真看了之後..決定還是當伸手族 XD 11/10 14:53
推 lin1987www:因為有你這種人~我才知道世界的美好~Q"Q 謝謝你的奉獻 11/10 17:32
→ reallurker:真的很辛苦 感謝所有無償協助中文化的朋友 11/10 21:00
推 ukyo323:感謝分享好文~~! 11/10 22:07
推 ADHI:感謝經驗分享~~~ 11/10 23:41
推 oginome:大推參拜啊,以前有碰過中文化的回過頭來看這個...淚 11/11 01:09
推 wenen:太強了,一定要推 11/11 11:55
推 klt:昨天推用完,今天補一下推 11/11 17:18
推 EDGE: OB fan必推!好偉大的工程… 11/11 17:37
推 honokas:神~~~ 11/11 23:36
推 conpo:專業好文推! 11/12 12:44
推 piece1:看不懂!你們好偉大 11/13 16:17
推 protect6090:好強!!!!!!!真人神也 11/15 16:21