Hướng dẫn dịch Fire Emblem 5
(Thracia 776)
© Asm65816 2015
Bài viết này hướng dẫn về phương diện kỹ thuật của quá trình dịch game Fire Emblem (FE) Thracia 776 cho hệ máy Super Famicom sang tiếng Việt.
Đọc bản pdf tại đây (click)
I.Chuẩn bị
+ Rom FE5 không có 200 byte header. Nếu có thì xóa đi (dùng hex editor).
+ Kiến thức cơ bản về hệ nhị phân, hệ thập lục phân.
+ Phần mềm YY-CHR hay bất cứ phần mềm biên tập tile nào.
+ Phần mềm chèn text vào Rom: ở đây dùng Atlas (tải từ www.romhacking.net)
+ Phần mềm dump text từ Rom ra file văn bản: ở đây dùng Catographer (tải từ www.romhacking.net)
+ Hex editor: dùng Windhex (cố định), Stirling (tùy nghi)
+ Phần mềm biên tập ảnh dạng pixel. Ở đây dùng Pixelformer.
+ Phần mềm soạn văn bản: khuyên dùng EmEditor. Không có thì dùng notepad cũng được.
+ Phần mềm Lunar Address (tải từ www.romhacking.net)
+ Phần mềm giả lập cho Super Famicom. Ở đây dùng Snes9X.
+ Phần mềm debugger cho giả lập Super Famicom. Ở đây dùng debugger của Snes9X.
+ Phần mềm tìm kiếm tương đối Search Relative.
II. Xác định, chỉnh sửa bộ font
Đầu tiên ta cần xác định bộ font của FE5 có những đặc tính như thế nào. Bật giả lập, load Rom và chơi một đoạn cho tới khi thấy chữ xuất hiện trên màn hình. Sau đó dùng chức năng chụp màn hình (save screen) lúc chữ xuất hiện. Chú ý chỉ chụp bằng chức năng của giả lập, không chụp bằng chức năng của Windows hay máy ảnh để có hình ảnh trung thực nhất.
Độ phân giải của FE5 cho Super Famicom là 256x224 pixel, khá nhỏ so với những game console đương đại như PlayStation 3 hay Xbox. Cũng dễ hiểu thôi, Super Famicom xuất hiện từ thế kỷ trước, cách PS3 hơn 20 năm mà.
Ví dụ như thế này.
Rồi dùng phần mềm biên tập ảnh, phóng to phần chữ.
Khi phóng to, ta thấy chữ có 2 màu trắng và xám. Điều này nói rằng font chữ hội thoại của FE5 là kiểu 2 bit plane hay 2 bpp. Bpp là viết tắt của chữ bit per pixel. 2 bpp nghĩa là 2 bit cho mỗi pixel ảnh. Mỗi byte gồm 8 bit, như vậy mỗi byte dữ liệu sẽ là 4 pixel ảnh.
Vd: giả sử font chữ 1bpp, có chiều cao và chiều rộng là 8x8 pixel. Ta xem những ô trống là 0 (không hiển thị ảnh), những ô có hiển thị ảnh là 1 thì chữ “a” sẽ như sau.
Đổi chuỗi này sang hệ thập lục, ta được $387EC6C6C6C67F3B. Đây là giá trị cho chữ “a” nếu ta xem bằng Hex editor. Còn khi máy tính (Super Famicom) hoạt động, nó chỉ hiểu được chuỗi
11100001111110110001101100011011000110110001100111111100111011 mà thôi.
Trên đây là ví dụ về font chữ 1bpp. Còn FE5 lại dùng 2bpp. Thực chất, 2 bpp là dạng triển khai của 1 bpp, trong đó có 1 bit plane thể hiện phần thịt của chữ, 1 bit plane còn lại thể hiện phần bóng mờ của chữ. Nếu font càng sử dụng nhiều bit plane thì nó sẽ có nhiều cấp độ bóng mờ. Nhiều game console sau này sử dụng font nhiều bit plane để tạo ra hiệu ứng đổ bóng nhiều màu, nhiều cấp độ để việc hiển thị chữ được đẹp hơn, rõ ràng hơn so với việc chỉ dùng 1 bit plane (chỉ gồm phần thịt của chữ, không có bóng).
Hãy hình dung font 2 bpp là sự kết hợp lồng ghép của phần thịt chữ và phần bóng. Lấy lại ví dụ chữ “a” bên trên.
Lồng ghép vào nhau
Đã biết font hội thoại của FE5 là 2 bpp. Giờ ta bật YY-CHR, load Rom, chỉnh chế độ xem là 2Bpp GB. Di chuyển xuống địa chỉ từ $340000 đến $353EE0 sẽ thấy font.
Để chắc chắn, ta thử thay đổi chữ け xuất hiện trong đoạn thoại đầu game, xem thay đổi trong game thế nào.
Thay đổi trong game
Vậy đã chắc chắn từ $340000 đến $353EE0 là font hội thoại. Việc tiếp theo là thay thế font chữ Nhật bằng font chữ Việt bằng cách chỉnh sửa bằng YY-CHR hay bất cứ phần mềm biên tập nào khác.
Sau khi thay font, ta sẽ thấy tình trạng như thế này. Dân trong nghề gọi là “tiếng mọi” (cave speak). Bởi trật tự sắp xếp của chữ vẫn còn tuân theo trật tự của tiếng Nhật.
Việc tiếp theo cần làm là sắp xếp trật tự của câu chữ thành trật tự tiếng Việt. Nhưng trước đó phải làm một số việc khác.
III. Lập table
Table là một kiểu file text liệt kê các ký tự sử dụng trong game được encode với giá trị gì. Đối với PC, trong kiểu encode ANSI thì khi ta gõ chữ “a” trên bàn phím thì phím sẽ truyền một tín hiệu với tần suất là xxx vào trung tâm xử lý, tại đây sẽ phát ra dữ liệu có giá trị là $61, và màn hình thể hiện ra chữ “a”. Tương tự, bất cứ khi nào cần thể hiện chữ ra màn hình, nếu PC đọc được dữ liệu $61 thì nó sẽ cho ra chữ “a”, $62 ra chữ “b”, cứ thế mà tiếp tục, $6B cho chữ “k”.
Hầu như tất cả mọi kiểu encode ký tự đều có giá trị tương đương nhau đối với 26 chữ cái La Tinh, trừ một số bộ font đặc biệt. Tuy nhiên đối với các ký tự có dấu trong tiếng Việt thì giá trị khác nhau tùy thuộc vào kiểu encode. Chẳng hạn với kiểu encode UTF-7 thì chữ “á” có giá trị $2B414F452D, với kiểu UTF-8 without signature thì “á” có giá trị $C3A1, UTF-8 with signature lại có giá trị $EFBBBFC3A1 cho chữ “á”,….
Còn đối với các game console từ thế hệ PlayStation 2 trở về trước thì đa phần đều không tuân theo các chuẩn encode ký tự của PC, do đó khi load game bằng Hex editor thì chỉ thấy được một loạt giá trị Hex chứ không thấy được phần text có nghĩa tương ứng ở cột bên phải của Hex editor.
Bằng cách lập table, ta biết được giá trị hex nào tương đương với ký tự nào trong game. Việc này có 3 ý nghĩa: giúp xác định text trong Hex editor, giúp dump (trích xuất) text từ Rom và giúp chèn lại text vào Rom.
Hình dưới đây là Rom FE5 trong Hex editor tại vị trí $AA490 trở đi, bên phải là cột hiển thị text nhưng hiện tại vẫn chưa thấy được text đúng.
Như vậy, ta cần phải lập table xác định ký tự nào trong game tương ứng với giá trị nào.
Ở đây ta dùng phương pháp tìm kiếm tương đối va các bước như sau:
1. Chạy game cho tới khi thấy được text. Chọn một cụm từ không quá dài và phải mang tính đặc trưng, ít bị lặp lại trong game. Như hình dưới đây chọn cụm từ “karakumo” vì đây là cụm từ hơi đặc biệt, tần số sử dụng trong hội thoại tiếng Nhật khá ít nên kết quả tìm cũng sẽ được chắt lọc hơn những từ phổ thông.
2. Mở bảng font của game để xác định vị trí tương đối của từng ký tự. Nếu cho “ka” là vị trí số 1 thì “ku” là số 3, “ke” là số 4, “ko” là số 5. Cũng có thể đặt số 1 cho chữ “a”, khi đó thì “ka” trở thành số 6. Đây chỉ là những vị trí tương đối cho biết chữ này cách chữ kia bao nhiêu chữ thôi, chẳng hạn chữ “e” trong bảng chữ cái La Tinh cách chữ “c” 1 chữ, nên nếu “c” là 1 thì “d” là 2 và “e” là 3.
Vậy ở đây ta thấy “karakumo” có vị trí 1 đối với “ka”, 34 với “ra”, 3 với “ku” và 30 với “mo”. Ghi nhớ “karakumo” = 1, 34, 3, 30.
3. Đặt file Rom vào cùng thư mục với phần mềm dò tìm tương đối, chạy file RELSEARC.EXE và một giao diện hiện lên, đòi nhập tên file cần tìm và nhập vị trí các ký tự trong chuỗi cần tìm.
Kết quả tìm kiếm chuỗi 1-34-3-30 (karakumo) cho ra tại địa chỉ $1484B (chữ h sau cùng cho biết chuỗi số trước đó ở hệ thập lục). Vì chuỗi ta tìm khá độc đáo nên chỉ có một kết quả. Trong trường chuỗi cần tìm không quá độc đáo thì dẫn đến nhiều kết quả, và khi đó cần phải thử các kết quả để biết chắc chắn.
Trong hình trên thì trình dò tìm tương đối báo rằng tại $1484B có chuỗi hex thỏa mãn các điều kiện: ký tự 2 cách 1 là 33 đơn vị, 3 cách 1 là 2 đơn vị và 4 cách 1 là 29 đơn vị. Nói cách khác, cụm từ ta cần tìm đang ở vị trí $1484B.
Trong cửa sổ Windhex, nhấn Ctrl + G và nhập địa chỉ 1484B, Enter để nhảy đến vị trí này. Tại đây ta thấy các giá trị 16-36-17-32….
Thử kiểm chứng: $36 - $16= $20 = (32+1)=33, $17-$16=$1=(1+1)=2,
$32-$16= $1C = (28+1) =29. Hoàn toàn khớp với điều kiện đặt ra.
Thử thay đổi 16 thành 17, save Rom và chạy game xem có thay đổi gì không.
Ta tăng từ $16 lên $17 và kết quả chữ “ka” đã biến thành “ki”. Vậy có thể chắc chắn rằng $16 là giá trị của chữ “ka”, và $17 là giá trị của chữ “ki”. Đối với các chữ cái khác, có thể dùng lại phương pháp tìm kiếm tương đối này để dò, hay đơn giản hơn là dùng phương pháp tăng dần hay giảm dần đối với các ký tự đứng trước/sau chữ cái gốc. Vì ta chọn “ka” làm gốc và có giá trị $15 nên đứng ngay trước “ka” là “u” nên “u” có giá trị “$14”.
Khi biết được hết các giá trị này, ta lập file có phần mở rộng .tbl như sau
Nhớ lưu file ở dạng encode Shift-Jis để đọc trong Windhex. Còn đối với mục đích dump (xuất) hay Insert (chèn) text thì lưu ở bất cứ định dạng nào hỗ trợ ký tự Nhật là được.
Lưu ý là ngoài bộ chữ Kana chiếm 1 byte mỗi ký tự thì FE5 còn sử dụng bộ chữ Hán chiếm 2 byte mỗi ký tự. Vì chữ Hán chiếm 2 byte nên không thể dùng phần mềm dò tìm tương đối để tìm mà chỉ có thể tìm bằng cách sửa đổi các giá trị hex chưa biết trong một đoạn text đã xác định được (vì đã biết hết Kana), xem chữ thay đổi trong game ra sao rồi từ đó dựa vào vị trí của các chữ Hán trong bảng font mà tính.
Trở lại vị trí $AA490 trong Windhex, load file table đã lập và giờ đây ta có thể thấy được text đã hiển thị đúng trong cột bên phải.
Để tìm vị trí một đoạn text bất kỳ trong game khi đã lập xong table, hãy nhấn Control + K và chọn ký tự Kana cần tìm.
Sau khi lập xong table để đọc và dump (tiếng Nhật) thì cần phải lập một table khác dành cho việc chèn text sau khi dịch vào Rom. Table thứ hai này có cùng các giá trị với table đầu tiên, chỉ thay đổi các ký tự Kana thành các ký tự La Tinh tương ứng mà ta đã chỉnh sửa trong bộ font.
Bài viết chi tiết qua
ReplyDeletenhìn chóng mặt qá :D, z mới thấy các bác vất vả ntn ...
ReplyDeletenhìn chóng mặt qá :D, z mới thấy các bác vất vả ntn ...
ReplyDeletecảm ơn anh $-)
ReplyDeletebạn có thể làm 1 video trên youtube dịch đại khái vài dòng được không
ReplyDeletequá kinh khủng :3 ,em k làm được
ReplyDelete