Game Translating Tutorial

Cửa hàng game Nintendo nShop

1658m6As

Nấm bình thường
ROM TRANSLATING HACKING​

Hướng dẫn dịch ROM

Written by Asm65816 – 2010 ©

Chú ý đầu tiên: để dịch và hack Rom, bạn cần nhất là sự đam mê và lòng kiên nhẫn.
Hãy kiên nhẫn, nó là vũ khí lợi hại nhất của bạn, và cũng là vì tôi sẽ viết rất dài, rất dài để thử lòng kiên nhẫn của bạn. Nếu không đọc hết những gì tôi viết, bạn có nguy cơ chẳng hiểu gì ráo… :D

Lời nói đầu

Chào các bạn.
Năm 2010, chúng ta đang sống trong thời đại của kỹ thuật số. Công nghệ máy tính trong những năm gần đây phát triển thật ghê gớm. Nó tác động lên mọi mặt của đời sống con người, bao gồm cả các mặt văn hóa, tinh thần. Một trong những món ăn tinh thần không thể thiếu được trong cuộc sống thường nhật của các bạn trẻ (và một số không nhỏ các bạn “không còn trẻ” :D) chính là game, hay gọi nôm na theo ông bà ta ngày nào là “trò chơi điện tử”.

Thế hệ trẻ từ 9x trở đi được sinh ra và lớn lên trong kỷ nguyên số nên họ không xa lạ gì với các thiết bị tiện nghi hiện đại. Nhưng chúng tôi, những người thuộc thế hệ 8x trở về trước không có được những sự tiện nghi như các bạn thời còn trẻ. Nhiều người trong số chúng tôi đã trải qua thời thơ ấu thiếu thốn đủ mọi phương tiện vật chất cơ bản nhất như điện, nước,… Thế nhưng chúng tôi có những kỷ niệm với những thứ mà, có thể các bạn trẻ sẽ cho là lạc hậu, cổ rồi, neck rồi nhưng đối với chúng tôi, không gì có thể thay thế được vị trí của chúng trong lòng mình. Trong số đó có game. Cũng là game nhưng game thời đại của chúng tôi khác xa game của thời đại các bạn được sinh ra và lớn lên…
Thời đại của chúng tôi, phần lớn đều trải qua tuổi thơ ấu với đồ họa 8 bit của máy NES (Nintendō Famicom), sau đó là đồ họa 16 bit của SNES (Super Famicom), rồi Sony PlayStation… Và thời đó, chúng tôi hãy còn dùng những chiếc máy tính có tốc độ siêu rùa bò, còn dùng chiếc đĩa B to đùng như chiếc đĩa hát thời “trung cổ” mà dung lượng lưu trữ chỉ bằng một phần trăm, phần nghìn của chiếc USB bé tẹo của các bạn bây giờ. Tôi không nhớ rõ là ai nói, nhưng chính xác thời đó đã nghe có người nói là máy tính chỉ cần có Ram vài Mb là đủ xài….!!

Bối cảnh thời đại khác nhau khiến góc nhìn, tâm lý của hai thế hệ trước và sau khác nhau rất nhiều. Các bạn sinh sau này vốn quen nhìn hình ảnh 32 bit trở lên, âm thanh nổi nên không ít người cảm thấy không ưa nổi đồ họa 2D cấp thấp của các loại console thế hệ cũ.
Nhưng đối với chúng tôi, những người đã sống và lớn lên cùng các hệ máy NES, ARCADE, SNES, SEGA Megadrive… thì dẫu cho bây giờ có theo thời đại, tậu về vài cỗ máy PS3 hay PS4, 5 gì đó nữa cũng không thể nào quên được những game “cổ lổ sĩ” ngày xưa được. Chúng đã ăn sâu vào tiềm thức của chúng tôi, những người từng sống trong thời đại của chúng và không bao giờ quên được chúng.

Không như các bạn bây giờ chơi game, rào cản lớn nhất của thế hệ 8x chúng tôi “thời đó” khi đến với game chính là ngôn ngữ. Phần lớn game console lúc bấy giờ đều là sản phẩm của các hãng Nhật Bản, và dĩ nhiên là ngôn ngữ trong game là tiếng Nhật, một thứ tiếng mà cho tới tận bây giờ không phải ai cũng biết, mà có “biết” đi nữa cũng không phải ai thấu rõ. Tuy nhiên, rào cản ngôn ngữ đã không thể ngăn niềm say mê của chúng tôi “phá đảo” (“về nước”) hết các game “Mộc Đế” (Fire Emblem), tìm tòi hết mọi bí mật của “Đại chiến Rô-bô” (Sūpā Robotto Taisen) vốn chi chít chữ Nhật trên màn hình. Năm thuở mười thì mới có một vài trường hợp ngoại lệ là nhà sản xuất phát hành thêm bản tiếng Anh sau bản tiếng Nhật. Thời đó, tôi rất tò mò muốn biết người ta làm cách nào để tạo ra một game Snes, từng nghịch ngợm đưa đĩa Snes vào trong máy tính của trường trong giờ “bổ túc tin học” và bị thầy giáo quát vì tội dám đưa virus vào máy của trường! Và thời đó, tôi cũng chưa bao giờ dám mơ rằng một ngày nào đó, mình sẽ hiểu được cấu trúc của những game này chứ đừng nói là dịch chúng sang một ngôn ngữ khác, điều mà ngày nay tôi bắt đầu chập chững tập tành và đã có được một ít thành tựu nhất định.

Các bạn trẻ trong thời đại này chắc hẳn không còn xa lạ với việc hack game online, hack game PC, dịch Việt ngữ cho các game này và nhiều người còn rất giỏi, có thể tự viết ra một game “made in tự tui”. Thế nhưng ngược lại, mảnh đất game console tuy rất màu mỡ tại Việt Nam nhưng lại không có mấy người nghiên cứu sâu về nó. Tôi viết bài này để phổ biến những kiến thức cơ bản nhất của việc dịch game trên các hệ máy console sang ngôn ngữ khác với ngôn ngữ của nhà sản xuất. Tuy mỗi hệ máy lại đòi hỏi những kiến thức, cách hack khác nhau nhưng nhìn chung các khái niệm cơ bản là giống nhau. Ở đây tôi trình bày các khái niệm về hack dịch (hách dịch :D) trên hệ máy Snes (Super Nintendō Entertainment System) hay còn gọi là SFC (Super Famicom). Chỉ cần nắm rõ kiến thức cơ bản về việc dịch game của hệ máy này là bạn có thể tự học tiếp cách hack, dịch game của các hệ máy khác như GameBoy, NDS, PSX, PS2 hay thậm chí PS3, Xbox… mà không cần tôi hướng dẫn (bởi vì tôi cũng mù tịt những hệ máy cao cấp này :D). Dĩ nhiên là tự bạn phải tự đầu tư, trang bị kiến thức. Tôi chỉ là người dẫn đường, còn chịu đi hay không, đi đến đâu là việc của bạn.


Khái niệm

Trước hết nói qua khái niệm hack (đọc là “hắc” hay “hách” tùy bạn :D). Theo định nghĩa từ điển, hack là sự can thiệp trái phép vào dữ liệu máy tính, thay đổi, phá hoại chúng. Còn theo tôi, hack là sự thay đổi trật tự ban đầu của dữ liệu (phần mềm) máy tính hay các loại máy thuộc họ máy tính (không chơi máy cày, máy tiện, máy kéo à nghe).

Bài này tôi chỉ đi sâu vào việc dịch game từ ngôn ngữ này sang ngôn ngữ nọ chứ không bàn về hack. Nhưng bản thân việc dịch ngôn ngữ cũng là hack. Vì sao?
Vì hai lý do. Đầu tiên, dịch là quá trình thay đổi trật tự câu chữ. Chẳng hạn, game Nhật dùng tiếng Nhật, dùng font chữ “loằng ngoẳng” như giun bò, khi dịch sang tiếng Anh hay tiếng Việt thì bạn phải thay chúng bằng bộ font La Tinh. Như vậy là thay đổi trật tự rồi.
Tương tự, game tiếng Anh dùng mẫu tự La Tinh không dấu nhưng khi dịch sang tiếng Việt thì phải thêm dấu (trừ khi bạn muốn bị gọi là “dùng tiếng mọi” :D), ấy là thay đổi trật tự của dữ liệu rồi. Tiếng Nhật có động từ nằm cuối câu, nhưng bạn dịch sang tiếng Việt thì lại lôi động từ lên giữa câu, đó là thay đổi rồi. Lý do thứ hai, để dịch được thì bạn cần phải có kiến thức về cấu trúc dữ liệu của game đó, ít nhất là về mảng font chữ, cách thể hiện chữ ra màn hình… Do vậy, nói rốt ráo thì bạn cần phải biết hack để dịch được game.


Trang bị

Để hiểu được bài hướng dẫn này và làm theo, bạn cần có những thứ cơ bản sau:

+ Lòng kiên nhẫn, sự đam mê: như đã nói trên, tôi là người ưa nói, ưa viết nên bạn cần phải có lòng kiên nhẫn Level 255 để đọc hết bài viết của tôi. Những ai cảm thấy mình không đủ kiên nhẫn thì nên xác địch, bỏ ngay từ đầu. Hack Rom là một việc rất tốn thời gian, cả đời bạn bỏ ra chưa chắc đủ. Vì sao lại tốn cả cuộc đời cho “trò vô bổ” này? Đơn giản chỉ là vì say mê. Những ai không có lòng say mê sẽ thấy nó vô bổ, phí thời gian, phí cuộc đời, phí tuổi trẻ…Hãy dùng thời gian để làm việc có ích hơn, nhưng kiếm tiền chẳng hạn.

Còn đối với tôi, tôi dịch game không vì mục đích gì khác hơn việc kích thích trí não của mình. Nó là một thú tiêu khiển mất thì giờ, nhưng cũng mang lại những niềm vui nho nhỏ như khi chia sẻ thành quả của mình cho một vài người nào đó. Họ chơi bản dịch của tôi, họ khen vài câu, dù là xã giao hay thật lòng thì tôi cũng cảm thấy lòng mình đang có một mùa xuân nho nhỏ. Chỉ vậy thôi.
Do đó, nếu bạn thấy trò này là vô bổ thì nên bỏ ngay từ lúc này, đừng đọc tiếp nữa và đừng bao giờ nghĩ rằng bạn có thể đạt được thành công ở bất kỳ lãnh vực nào trong cuộc sống mà không cần phải đổ mồ hôi nước mắt, đầu tư thời gian, trừ khi bạn được ông trời thiên vị :D

+ Một trình Hex Editor. Đây là phần mềm để xem và chỉnh sữa dữ liệu của game (Rom). Tốt nhất là bạn nên dùng WindHex, vì nó được phát triển dành riêng cho dân hack game mà.
Tải Windhex tại đây: http://www.romhacking.net/utils/WindHex.zip



Đây là giao diện của Windhex sau khi mở file


Nhưng WindHex không có một số chức năng mà các trình Hex Editor khác có. Bạn nên dùng thêm Hex Workshop. Nhưng đây là phần mềm thương mại, nếu có điều kiện thì hãy mua một bản về mà dùng. Nếu không mua được, bạn có thể dùng phần mềm Stirling để thay thế. Nó có hầu hết các chức năng mà Hex Workshop có, lại gọn nhẹ, không phải cài đặt. Điểm duy nhất cần lưu ý là giao diện của Stirling là tiếng Nhật.
Tải Stirling tại đây: http://www.mediafire.com/?bwnnjfqegzd




Đây là giao diện của Stirling sau khi mở file


+ Bài viết này sử dụng một số từ tiếng Nhật, nếu máy tính của bạn không có font tiếng Nhật (thấy các ô vuông) thì hãy tải file sau và cài vào máy để đọc được:

http://www.mediafire.com/?dg5otb9hgdm (ie_ja.exe, dung lượng 2.5MB)


+ Làm ơn ghi nhớ địa chỉ http://romhacking.nethttp://www.zophar.net/ vào trong đầu hay trong ổ cứng của bạn. Sẽ có những lúc bạn sẽ cần các công cụ khác và phần lớn đều tải từ hai trang web hack rom này. Nếu hiểu tiếng Anh, bạn có thể vào hai trang web này để đọc các bài hướng dẫn mà không cần đọc bài này. (lại một lý do nữa để bạn nên dừng đọc tại đây :D)


+ Kiến thức về ngôn ngữ: để dịch một game từ ngôn ngữ này sang ngôn ngữ nọ thì đòi hỏi bạn phải có kiến thức ở cả ngôn ngữ nguồn và ngôn ngữ đích. Tuy đa số trường hợp là dịch một thứ tiếng khác sang tiếng mẹ đẻ nhưng nếu không thạo cả tiếng mẹ đẻ, câu cú nghệch ngoặc, từ ngữ lủng củng thì nhiều khả năng bản dịch của bạn hoàn thành xong chỉ để ma nó chơi :D. Bậy, cũng có những thành phần chỉ biết lao đầu vào chơi, có chữ đọc được là chơi chứ chẳng quan tâm gì đến câu cú, chính tả hay ngữ pháp hết. Đây là lực lượng ủng hộ bạn nhiệt tình nhất. Trước khi hoàn thành bản dịch, bạn nên lót đường, mua chuộc những người này lập FC cho game bạn đang dịch thì hơn :D


Quan điểm của tôi: Hiện nay trên thế giới có rất nhiều nhóm dịch game. Đa số là dịch từ tiếng Nhật, và đa số là dịch sang tiếng Anh (một số trường hợp không đáng kể là dịch sang tiếng Tây Ban Nha, Đức, Pháp…và dĩ nhiên là trong đó có tiếng Việt của chúng ta :D). Đa số trường hợp, các nhóm dịch này được cấu thành từ hai bộ phận: bộ phận hacker chuyên lo mọi vấn đề kỹ thuật trong game, từ việc hack dữ liệu, sửa font chữ cho đến việc trình bày (cho hiển thị chữ ra màn hình) sao cho đẹp nhãn. Bộ phận thứ hai là các translator, các “dịch giả” chỉ có nhiệm vụ dịch file text mà hacker giao cho từ ngôn ngữ nguồn sang ngôn ngữ đích. Và thường thì nhóm translator có từ vài cho đến rất nhiều người.

Ưu điểm của cách hoạt động này là ai làm việc nấy, tính chuyên môn hóa cao và do vậy tiến độ dịch được đẩy nhanh. Còn nhược điểm là “lắm thầy nhiều mà”, “đẽo cày giữa đường”, “chín người mười ý”… Vì có nhiều người dịch nên văn phong không đồng nhất với nhau, hơn nữa không phải trình độ của mọi người đồng đều nhau nên chất lượng bản dịch rất chênh vênh. Để khắc phục tình trạng, họ thường cử ra một người gọi là “proof-reader” chuyên đọc hết các bản dịch mà các translator cung cấp, rà soát lỗi và chỉnh sửa lại câu cú cho đồng nhất văn phong. Thế nhưng vấn đề cũng không được giải quyết triệt để.
Vì sao? Vì người kỹ thuật (hacker) thì không biết gì về dịch thuật với ngôn ngữ, còn người dịch (translator) và proof-reader lại không biết gì về kỹ thuật. Có những tình huống mà người dịch thấy cần phải dịch như thế này mới đảm bảo về mặt ngữ nghĩa và tính “nghệ thuật”, nhưng chàng hacker bảo như thế dài quá, không đủ chỗ trống đâu anh ơi.
Lại có những tình huống mà người dịch đã Ô Cê hết rồi, nhưng anh chàng kỹ thuật khi chèn (insert) đoạn văn bản đã dịch vào Rom lại cảm thấy không hài lòng (vì trong câu đó có từ nào đó là tên bố mẹ anh ta, hay đại khái vậy) nên phén bớt, chỉnh sửa lại theo ý mình. Thế là xong. Vâng vâng và vâng vâng. Chỉ vì hai bên không hiểu rõ công việc của nhau mà sinh ra một bản dịch không mấy chất lượng.

Tôi nghĩ, phàm đã bắt tay vào dịch game thì người dịch phải là người hiểu rõ về mặt kỹ thuật, về cấu trúc dữ liệu của game mình định dịch. Ngược lại, người kỹ thuật phải hiểu rõ cả ngôn ngữ nguồn của game và ngôn ngữ đích mình định dịch. Nói tóm lại, người kỹ thuật chính và người dịch chính phải là một. Tất nhiên là có thể có thêm vài người kỹ thuật để giúp anh ta hack các mảng khác và vài người dịch khác để lo các phần không quan trọng nếu không có đủ thời gian.

Một xu hướng nữa trong việc dịch game hiện nay trong cộng đồng fan là tuy không hiểu rõ ngôn ngữ nguồn và ngôn ngữ đích nhưng vẫn cứ lao đầu vào dịch. Chẳng hạn, có một nhóm nọ rất mê một game Nhật, họ không rành tiếng Nhật nên đành dùng công cụ dịch tự động, và kết quả cho ra những câu tiếng Anh mà ngàn năm sau người ta vẫn còn phải lập viện nghiên cứu để xem ý muốn nói gì :D. Điển hình cho trường hợp này là bản dịch Der Langrisser trên hệ máy Snes của nhóm dịch Langfandood.



Tệ hại hơn, còn có cả một nhóm các anh Đức không rành tiếng Nhật, dùng phần mềm dịch tự động để dịch nhưng không phải dịch sang tiếng mẹ đẻ của họ mà lại dịch sang tiếng Anh, trong khi bản thân họ chỉ mới bập bẹ tiếng Anh. Nghe đâu cái game hút hồn đó có tên là Tearing Saga và nhóm dịch đó muốn bản dịch của mình mang tính toàn cầu chứ không dịch sang tiếng Đức vì chỉ có người Đức biết thôi, rất là phí!
Họ không hề biết rằng người Anh, Mỹ sau khi đọc vài dòng trong bản dịch đó đã phì cười như khi các bạn cười vào bản dịch của nhóm Langfandood trong bức hình bên trên. Mà cũng phải, họ không phải người Anh, chỉ dùng tiếng Đức, không rành tiếng Anh thì làm sao biết được những chỗ tinh tế trong tiếng Anh mà chỉ có người bản xứ mới hiểu được.


Thành ra…
Quan điểm của tôi vẫn là chỉ dịch game từ thứ tiếng mà mình nắm rõ trong lòng bàn tay sang tiếng mẹ đẻ, hoặc tiếng cha đẻ (nếu như cha mẹ từ hai nước khác nhau :D). Như thế bản dịch mới hoàn chỉnh nhất, toàn vẹn nhất về mặt ngữ nghĩa. Ngay cả khi dịch sang tiếng mẹ đẻ, bạn còn chưa đảm bảo là bản dịch của mình đã ổn, không bị thiên hạ ném đá huống hồ là dịch sang một thứ tiếng mà mình chỉ mới biết nửa mùa.

Nhưng nói gì thì nói, tôi khuyên bạn nên nhớ lấy một câu mà ông bà hay nói: “dù ai nói ngả nói nghiêng, lòng ta vẫn vững như kiềng ba chân”.
Đời có lắm kẻ không làm mà chỉ thích đi phá kẻ khác. Hãy cẩn thận với những thành phần đó. Và nên nhớ là nếu bạn dịch một game sang thứ tiếng mà tôi biết chắc bạn không giỏi, tôi cũng sẽ biến thành quỷ sứ đi phá cho tới khi project của bạn sụp thì thôi :D

Đùa thôi, tôi không làm mấy trò tiểu nhơn ác đức đó. Dưới đây là một số hình ảnh về những game tôi dịch được từ trước đến giờ. Có game đã hoàn thành, có game đang trong giai đoạn… Có game đã bỏ xó luôn, không động đến nữa.













(To Pea Kontinue)
 

zelda131292

Nấm nhỏ
Hôm nọ cũng tò mò kiếm mấy bài thế này mà chỉ có HD trên GBA... Rất muốn làm thử trên DS mà không hiểu gì ráo :|
 

Ultimate

Nấm nhỏ
Mọi người spam ít thôi, để bài viết đc liền mạch :D. 4rum mình hạn chế ảnh lắm đâu Edit cho vào hết #1 đc :(
 

1658m6As

Nấm bình thường
Lịch sử

Người ta vẫn nói: “con người có tổ có tông, con công có cánh, con gà có lông” :)d), “uống nước nhớ nguồn” để thể hiện lòng biết ơn đối với công lao của những bậc tiền hiền đi trước mở đường. Chả thế mà trong lòng người Việt, quanh năm có đủ 365 ngày giỗ tổ. Nay giỗ tổ thợ mộc mai giỗ tổ thợ nề, rồi ngày kia lại giỗ tổ… Và trong lãnh vực hách dịch Rom này cũng vậy, bạn cần phải biết lịch sử của nó và nhớ ơn những người đi trước mở đường. Nếu không, tôi bảo đảm bạn chẳng bao giờ trở thành một tay hách dịch game thực thụ. Bạn có thể tham khảo địa chỉ dưới đây để biết về lịch sử của cộng đồng hách dịch game

http://www.romhacking.net/transhistory/

Phần này tôi tóm tắt lược sử của cộng đồng này, nếu như bạn không đọc được tiếng Anh. Đại khái, lịch sử của việc dịch Rom bắt đầu từ năm 1993, nhưng có thể xem năm 1996 là điểm khởi thủy của việc dịch game console do fan thực hiện. Game đầu tiên được dịch là Final Fantasy V trên máy Snes. Kể từ đó cho đến nay, cộng đồng game console chứng kiến sự ra đời ồ ạt của các bản dịch dưới hình thức patch.

Còn tại Việt Nam, cộng đồng dịch game console có lẽ chưa bao giờ tập hợp lại thành một tổ chức lớn mạnh mà chỉ thấy một vài cá nhân đơn lẻ hoạt động. Vào thời điểm máy Snes còn đương thịnh hành ở các quán trò chơi điện tử thì chúng ta đã thấy một vài bản game đơn giản như “đá banh 96” (International Super Star Soccer), “đua xe thú” (Biker Mice from Mars) được chuyển từ tiếng Anh sang tiếng Việt không dấu. Những game này không nhiều lời thoại nên việc dịch sang tiếng Việt cũng không mấy khó khăn. Khoảng năm 2002, cộng đồng console Việt biết đến Luxifer Angel (tôi không hiểu tại sao không phải Lucifer mà lại là Luxifer) với bản dịch Fire Emblem Thracia 776. Tuy bản dịch chưa hoàn chỉnh hết nhưng nó đã ghi một dấu mốc trong lịch sử Việt hóa game RPG có nhiều lời thoại. Sau đó ít lâu lại thấy có Le_Nguyen_Si chuyển ngữ một số game Gameboy như “câu cá”, “Nhất dương chỉ” (Yūyū Hakusho) sang tiếng Việt. Từ đó đến nay còn thấy rải rác một vài bản dịch của Pokémon, và một số game RPG khác trên nhiều hệ máy.

Tôi tự thấy, anh tài hào kiệt thời nào cũng có, nước nào cũng đông. Nhưng vấn đề là có tập hợp lại với nhau để làm nên sức mạnh được hay không. Do đó, khi viết bài này, ngoài mục đích phổ biến kiến thức về hách dịch game, tôi còn mong muốn các bậc hiền tài, các bậc anh hùng hào kiệt trong thiên hạ thấy được bài viết này liền nổi máu giang hồ, liên kết tụ nghĩa với nhau để lập thành một hội dịch game lớn mạnh của người Việt.


Kiến thức lập trình

Như đã nói trên, bài này tôi chỉ đề cập đến viêck hách dịch game Snes bởi vì đây là hệ máy tôi quen thuộc nhất. Các hệ máy khác đòi hỏi có cách hack khác nhưng nhìn chung nó vẫn tuân theo các quy tắc cơ bản tôi đề ra ở đây. Nếu trang bị kiến thức dịch game Snes làm hành trang cơ bản thì chỉ cần bỏ thêm một ít thời gian nghiên cứu, bạn có thể dịch được game PSX, PS2, PSP, GBA, NDS,… Và để quá trình hách dịch được thuận tiện, bạn nên chuẩn bị sẵn cho mình một ít (hoặc nhiều) kiến thức về lập trình. Game trên console được viết bằng ngôn ngữ ASM (viết tắt của Assembly hay được dịch là “hợp ngữ”). Mỗi hệ máy lại đòi hỏi từng ngôn ngữ ASM khác nhau. Chẳng hạn, máy NES dùng ngôn ngữ ASM 6502, máy SNES dùng ngôn ngữ ASM 650c816 (thường được gọi tắt là Asm65816 :D), vân vân và vân vân.

Ngôn ngữ ASM (hợp ngữ) được gọi là ngôn ngữ bậc thấp, là ngôn ngữ của phần cứng và đối lại với ngôn ngữ bậc cao là ngôn ngữ dành cho người, chẳng hạn như Visual Basic hay C. Nhưng đừng bị danh từ “bậc thấp” và “bậc cao” đánh lừa, đừng tưởng ngôn ngữ “bậc thấp” dễ học và kém cỏi hơn ngôn ngữ “bậc cao” nhé. Cao hay thấp chỉ là danh từ đánh dấu đối tượng sử dụng mà thôi. Có thể hiểu nôm na là ngôn ngữ bậc thấp hay Asm được dùng để điều khiên, giao tiếp với phần cứng của máy. Và vì vậy mỗi hệ máy console lại sử dụng một ngôn ngữ Asm khác nhau. Vậy nên nếu bạn đã biết Asm dành cho Nes (6502) thì không có nghĩa là bạn có thể hack được game Snes vốn đòi hỏi ngôn ngữ 65816. Tuy nhiên, nếu đã biết một ngôn ngữ rồi bạn có thể coi nó như nền tảng để tiếp tục học sang ngôn ngữ khác dễ dàng hơn so với người không biết về lập trình.
Tương tự, nếu bạn giỏi các ngôn ngữ bậc cao như C thì không có nghĩa là bạn biết về Asm, nhưng bạn có lợi thế hơn những người hoàn toàn không biết gì về lập trình như tôi.
Bạn có thể hình dung điều này như việc học ngoại ngữ. Giỏi tiếng Anh không có nghĩa là sẽ giỏi tiếng Pháp, nhưng bạn có lợi thế hơn những người chưa từng học ngoại ngữ.

Vì sao đòi hỏi phải có kiến thức lập trình Asm? Vì trong quá trình dịch game bạn sẽ cần đến nó, chẳng hạn để kéo dài một cửa sổ để text dịch sang ngôn ngữ đích được hiển thị tốt hơn, để giải nén font chữ, để di chuyển dữ liệu sang một nơi khác thuận tiện hơn,…
Trong nhiều trường hợp, không biết Asm đồng nghĩa với việc hủy bỏ project vì bạn không thể tiếp tục dịch nữa.

Nhưng đừng lo nếu bạn không biết gì về Asm. Bản thân tôi không phải dân kỹ thuật, không học “Ai Ty”, một hex bẻ đôi cũng không biết. Ấy thế mà tôi cũng đã có một vài bản dịch (“khoe hàng” :D). Bí quyết quan trọng nhất, như tôi đã nhiều lần nhắc ở trên, là lòng kiên nhẫn. Bạn có biết trên đời có vô số người không học hành, không bằng cấp nhưng lại cực kỳ giỏi và nổi tiếng ở các lãnh vực đó không? Quan trọng nhất vẫn là lòng say mê, chịu bỏ thời gian tìm tòi cộng với một chút (một chút xíu thôi) óc quan sát, nhận xét, suy luận và lòng học hỏi miệt mài. Ở đây tôi sẽ hướng dẫn cho bạn cách hách dịch game cơ bản nhất mà không cần dùng đến kiến thức lập trình Asm. Nhưng nói thế không có nghĩa là phủ nhận việc học hành bài bản, chính quy. Nếu được, tốt nhất là bạn nên đi học một khóa Asm (đừng quên là Asm cho PC không dùng để hack game console được, nhưng làm nền tảng để học tiếp thì được) cho lành. Mà nếu đã biết về Asm cho console thì bạn còn đọc bài viết dong dài của tui làm gì?

Bạn có thể đọc nhiều tài liệu về lập trình ASM tại địa chỉ www.romhacking.net
Bản thân tôi cũng đang đọc cuốn “Programming the 65816” của The Western Design Center (tiếng Anh) và thấy rất bổ ích. Bạn có thể tải về từ địa chỉ:

http://www.romhacking.net/docs/423/


Phân loại

Theo ý chủ quan, tôi phân loại việc hack game thành các mục sau:

* Hack dữ liệu: thay đổi cấu trúc, dữ liệu của game nhằm tác động lên mặt nào đó của trò chơi. Chẳng hạn Mario có thể nhảy cao 2m nhưng b có thể khiến anh ta nhảy cao 5m bằng cách hack dữ liệu, game Contra có tối đa 30 “mạng” nhưng có thể hack thành 50 “mạng”,…Mảng hack này có thể rất đơn giản như làm nhân vật “bất tử” hay đến rất phức tạp và hoàn toàn có thể biến một game khác xa so với nguyên bản của nó.

* Hack dữ liệu liên quan đến text: thay đổi nội dung chữ hiển thị, thay đổi kiểu chữ, cách thể hiện,… Hách dịch mà chúng ta bàn tới nằm trong mục này. Đây là mảng hách mang lại lợi ích thiết thực nhất và cũng đơn giản nhất vì có rất nhiều tài liệu về nó.

* Hack âm thanh: tác động đến, thay đổi dữ liệu âm thanh của game. Đây là mảng khó
nhất vì có rất ít tài liệu liên quan tới nó.

Các mảng hack trên đều đòi hỏi kiến thức về Asm ở một mức độ nhất định. Nhưng ở đây chúng ta chỉ cần tập trung vào mặt hách dịch, và tôi sẽ hướng dẫn bạn qua từng bước như dưới đây.


Nhập cuộc

Sau một hồi dong dài, cuối cùng bạn cũng đã vào đến nơi cần vào. Từ giai đoạn này trở đi, chỉ có hai loại người tồn tại được. Đầu tiên là cường giả, những người thực sự mạnh và thứ hai là những người may mắn. Để đọc tới phần này, hẳn là bạn đã đọc hết những thứ lang mang tôi viết bên trên, như vậy chứng tỏ bạn là người rất kiên nhẫn. Còn nếu không, bạn là người rất may mắn vì vô tình kéo xuống đúng chỗ quan trọng mà không cần phải đọc những thứ vớ vẩn bên trên (^^)!

Hệ thập lục

Điều đầu tiên bạn cần phải nắm kỹ trước khi bước vào thế giới mê cung của hách dịch game nói riêng và hách game nói chung là nắm kỹ về hệ thập lục, tức là cơ số mười sáu. Hàng ngày, chúng ta sử dụng hệ thập phân (cơ số mười) để đếm và tính toán trong cuộc sống. Hệ thập phân rất thuận tiện cho con người vì họ có mười ngón tay, mười ngón chân. Người nguyên thủy đã biết sử dụng ngón tay, ngón chân để hỗ trợ việc đếm và tính rợ.
Nhắc lại, hệ thập phân là hệ số sử dụng những con số sau:

0, 1, 2, 3, 4, 5, 6, 7, 8 và 9



Nếu chưa biết thế nào là hệ thập phân thì tốt nhất là bạn nên dừng đọc bài viết này, xin bố mẹ làm đơn cho học lại bậc tiểu học là vừa.
Nhưng cái máy tính của chúng ta và những thứ máy móc họ hàng bà con của nó lại không hiểu được hệ thập phân. Đối với máy tính, nó chỉ hiểu được hai trạng thái “có” và “không” tương ứng với trạng thái sáng (có dòng điện chạy qua) và tắt (không có dòng điện chạy qua) của bóng đèn. Vì thế máy tính sử dụng hệ nhị phân, hệ số chỉ gồm số 0 và số 1.
Hệ nhị phân đã được dạy trong chương trình toán lớp 6 nên ở đây tôi không nhắc lại. Bạn phải nắm rõ cách tính cộng trừ nhân chia của hệ số này và cách chuyển đổi qua lại giữa hệ thập phân và nhị phân. Nếu quên thì làm ơn lật lại sách toán lớp 6 mà đọc. Bạn chỉ cần nhớ điều này:

* Trong hệ nhị phân, một con số (0 hoặc 1) được xem là 1bit.
* 8bit hợp lại được gọi là 1 byte.

Thực chất, game console (ở đây là Snes) chỉ là một file bao gồm một chuỗi nhiều câu lệnh nối tiếp nhau được viết bằng ngôn ngữ Asm. Nhưng máy (phần cứng) chỉ xem những câu lệnh này chỉ là những con số không hơn không kém, và những con số này chỉ gồm 0 và 1 (hệ nhị phân). Nhưng việc biểu diễn dữ liệu bằng hệ nhị phân gây rất nhiều phiền toái cho lập trình viên. Bạn có thấy mệt không, nếu như phải dùng tới 4 con số là 1100 chỉ để biểu diễn số 12 bên hệ thập phân?

Vì vậy, để tránh rắc rối và nhầm lẫn do hệ nhị phân mang lại, người ta biểu diễn dữ liệu game bằng hệ thập lục. Đúng như tên gọi của nó, hệ số này bao gồm 16 con số được sắp xếp theo thứ tự tăng dần như dưới đây


0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E và F



Do số 9 là số đơn có giá trị cao nhất nên người ta dùng các chữ cái từ A~F để biểu diễn giá trị tương đương từ 10~15 bên hệ thập phân. Việc chuyển đổi từ hệ nhị phân sang hệ thập lục cũng đơn giản hơn so với việc chuyển sang hệ thập phân.

Chú ý 1: người ta dùng ký hiệu $ hoặc chữ h đi kèm với con số để chỉ rằng đó là số của hệ thập lục. Chẳng hạn như $0A hoặc 0Ah để chỉ rằng đây là số của hệ 16, 0A tương đương với số 10 bên hệ thập phân.

Chú ý 2: trong một byte, ở hệ thập lục thì số nhỏ nhất có thể biểu diễn được là $00 (tương đương với số 0 bên thập phân) và số cao nhất có thể biểu diễn được là $FF (tương đương 255 trong hệ thập phân. Giờ thì đã hiểu lý do tại sao max chỉ số ở nhiều game RPG là 255 chưa?). Số 2 bytes thấp nhất biểu diễn được là $0100 (256 ở hệ thập phân) và số cao nhất là $FFFF (65535 bên thập phân). Tương tự, các số 3 bytes sẽ bắt đầu từ $10000 cho tới $FFFFFF, và cứ tiếp tục như thế.

Chú ý 3: để chuyển đổi giữa các hệ thập phân, nhị phân và thập lục cũng như tính toán trên các hệ này, bạn có thể gõ lệnh calc.exe trong Windows (nhấn phím có logo của Windows, ở một số bàn phím thì nó nằm giữa phím Alt và Ctrl) hoặc vào mục Start--> All Program--> Accessories--> Calculator.




Sau khi “giả lập” máy tính bỏ túi xuất hiện, bạn vào mục View--> Scientific để chuyển sang chế độ dùng hệ thập lục và nhị phân như hình dưới đây




Các chữ viết tắt:

Hex (Hexadecimal) là chữ viết tắt của hệ thập lục.
Bin (Binary) là chữ viết tắt của hệ nhị phân.
Dec (Decimal) là chữ viết tắt của hệ thập phân.

Bạn chỉ cần quan tâm nhiêu đó là đủ. Mọi việc tính toán hay chuyển đổi cứ để máy tính làm, đừng lật lại sách toán lớp 6 làm gì cho ê mặt với đàn em \(^^)/

Một vài ví dụ:

(Hex) F - A = 5
(Dec) 15 - 10 = 5
(Bin) 1111 - 1010 = 0101
(Hex) 35 + 06 = 3B
(Dec) 53 + 6 = 59
(Bin) 00110101 + 00000110 = 00111011
 

1658m6As

Nấm bình thường
Header

Header là một chuỗi hex liên tiếp nhau, có độ dài nhất định ở phần mở đầu của từng loại Rom. Header của Rom Nes có kích thước 10 bytes, header của Rom Snes có kích thước 200 bytes.
Thật ra bản thân Rom gốc được nhà sản xuất “in” trên cardtridge không hề có header. Nhưng khi dùng máy copy nội dung của cardtridge xuất (thuật ngữ chuyên ngành gọi là dump) ra file thì thường đi kèm header để các giả lập đọc được file. Nhưng ngày nay, hầu hết các loại giả lập đều đọc được file mà không cần đến header. Header không có tác dụng gì hết ngoại trừ giúp các loại giả lập (ngày xưa) đọc được file được dump từ cardtridge ra mà thôi.
Tuy nhiên, bạn cần chú ý xem Rom của mình có header hay không vì nó ảnh hưởng tới việc tính địa chỉ trong Rom (sẽ nói kỹ ở phần sau). Phần lớn Rom Nes và Snes tải trên mạng về đều có header nhưng một số khác thì không.

Chỉnh sửa hình ảnh trong Rom

Những thứ bạn cần chuẩn bị trong mục này:

+ Tile Layer Pro hoặc YY-CHR
+ Rom Nekketsu Kakutō Densetsu (Nes)
+ Một trình giả lập Nes
+ Luôn backup Rom để phòng khi bạn làm gì sai còn có cái mà dùng

Tất cả những thứ trên bạn đều có thể hỏi anh Google xem nó đang nằm ở đâu trên mạng.

Chỉnh sửa hình ảnh là một trong những kỹ năng cơ bản nếu bạn có ý định bước chân vào thế giới của Rom hacking. Nếu bạn định dịch Rom từ ngôn ngữ này sang ngôn ngữ nọ thì thường phải dùng kỹ năng này để vẽ lại bộ font (từ ký tự Kana, Kanji sang ký tự La Tinh). Bạn còn có thể chỉnh sửa lại hình ảnh trong game để mọi thứ mới mẻ hơn và theo ý mình.
Hình ảnh trong game thường được lưu trữ ở chỗ nào đó trong Rom. Để chỉnh sửa được nó thì bạn cần mở Rom bằng các trình hỗ trợ sửa hình ảnh như Tile Layer Pro hoặc yy-Char (bản thân tôi ưa dùng cái sau hơn) và kéo xuống phía dưới cho tới khi thấy được hình ảnh cần sửa.

Tuy nhiên, phần lớn các game phức tạp ngày nay và đại bộ phận game Snes đều được nén hình ảnh ở một chuẩn nào đó làm cho việc tìm kiếm dữ liệu hình ảnh trở nên khó khăn hơn. Bạn có thể dùng kiến thức Asm của mình để giải nén hình ảnh, chỉnh sửa nó và nén lại vào trong Rom. Nhưng nếu bạn có đủ kiến thức để làm việc này thì cần gì đọc cái bài viết khỉ gió này nữa?

Một điểm cần lưu ý nữa là khái niệm Bit-plane mà tôi sẽ nói rõ hơn ở phần font chữ. Bạn có thể xem hình ảnh của từng Rom ở các chế độ Bpp (Bits per pixel, số bit ở từng điểm ảnh) khác nhau. Ngay trong cùng một Rom mà có khi hình ảnh chỗ này dùng chế độ Bpp khác với hình ảnh chỗ nọ. Sau đây là các chế độ Bpp thường gặp:

+ Snes: 4Bpp (Snes), 2Bpp (GB/GBC), 1Bpp (monochrome)
+ Nes: 2Bpp (Nes), 1Bpp (Monochrome)
+ GB/GBC: 2Bpp (GB/GBC), 1Bpp (monochrome)

Chỉnh sửa hình ảnh là một công việc khá đơn giản một khi bạn đã tìm được dữ liệu của nó (không bị nén) nhưng rất tốn thời gian. Ở đây tôi sử dụng Rom Nekketsu Kakutō Densetsu trên Nes để minh họa vì phần lớn game Nes không bị nén hình ảnh như ở Snes.

Đầu tiên, bạn mở Rom Nekketsu Kakutō Densetsu bằng chương trình YY-chr (hoặc Tile Layer Pro), ở địa chỉ $20010 (đối với Rom có header và địa chỉ $20000 đối với Rom không header), bạn sẽ thấy sprite nhân vật của game. Bật giả lập Nes, load Rom và bắt đầu chơi, bạn sẽ thấy hình khuôn mặt của nhân vật Kunio giống như những gì hiển thị trong Yy-chr.




Để ý bên dưới cùng của Yy-chr có ô lựa chọn chế độ xem và mặc định là 2BPP NES. Nếu thay đổi chế độ xem, bạn sẽ không còn thấy được hình ảnh như lúc nãy nữa. Phía bên tay phải là ô chọn x1, x2, x4, x5, x16. Ở game Nes, thông thường các tile hình ảnh có dạng 8x8 nên Yy-chr mặc định ở chế độ x16.
Trong Rom, hình ảnh được lưu trữ trong các tile (mảng). Tile là một hình vuông chứa các điểm ảnh (điểm ảnh ở đây được hiển thị bằng các hình vuông nhỏ nhất, không thể phân chia được nữa. Hình dung điểm ảnh hay pixel là nguyên tử và tile là phân tử). Phần lớn tile đồ họa của game Nes ở dạng 8x8 pixel, tức mỗi tile chứa được 64 pixels.


Hình ảnh của một tile

Bây giờ, nhìn qua phải của cửa sổ Yy-chr, ở đó có các công cụ để chỉnh sửa (vẽ lại) hình ảnh. Tôi không đi sâu vào phần này mà để bạn tự tìm tòi. Và tôi vẽ lại phần mặt của nhân vật Kunio thành một cái đầu lâu đơn giản như thế này.





Sau đó save Rom lại, dùng giả lập load lại Rom bạn vừa chỉnh sửa (nhớ backup Rom trước khi chỉnh sửa), bạn sẽ thấy kết quả chỉnh sửa của mình!



Đó, thấy chưa? Bạn vừa học được một kỹ năng cơ bản của việc Hack rom!


Chỉnh sửa font chữ

Những thứ bạn cần chuẩn bị trong mục này:

+ Tile Layer Pro hoặc YY-CHR
+ Rom Final Fantasy IV (Snes) bảng tiếng Nhật
+ Một trình giả lập Snes
+ Luôn backup Rom để phòng khi bạn làm gì sai còn có cái mà dùng

Tất cả những thứ trên bạn đều có thể hỏi anh Google xem nó đang nằm ở đâu trên mạng.
Đa phần khi chúng ta đọc truyện tranh đều cho rằng chữ và hình ảnh là hai thứ khác biệt. Nhưng tôi quan niệm chúng chỉ là một. Thực chất chữ hay ký tự cũng chỉ là một dạng hình ảnh vì chúng cũng được cấu thành từ các pixel (điểm ảnh) mà ra.

Thông thường, khi dịch một game tiếng Nhật sang tiếng Việt thì việc đầu tiên bạn cần làm là vẽ lại bộ font. Tiếng Nhật dùng ký tự Kana và Kanji, bạn cần xóa chúng đi để vẽ lại một bộ font chữ La Tinh mới, có dấu tiếng Việt. Ở phần này bạn có thể áp dụng kiến thức chỉnh sửa hình ảnh ở phần trước để làm.
Đầu tiên, mở giả lập Snes lên và load game Final Fantasy IV. Ở đầu game, bạn sẽ thấy đoạn hội thoại giữa các binh sĩ với nhân vật Cecil như hình dưới đây.



Bây giờ dùng Yy-chr để load Rom, kéo xuống địa chỉ $57400 (đối với Rom có header và $57200 đối với Rom không header), chọn chế độ view 2BPP GB, bạn sẽ thấy được font chữ tiếng Nhật dùng trong game.



Áp dụng những điều đã học ở phần trước, hãy thay đổi font chữ và save lại. Ở đây tôi đã thay ký tự kana “he” bằng chữ “a” La Tinh, thay kana “i” bằng “b” và thay kana “shi” bằng “c” La Tinh. (Chú ý chỗ đánh dấu tròn màu xanh trong hình bên dưới). Nhớ save lại Rom (Ctrl + s), mở lại giả lập và chơi đến đoạn lúc nãy, bạn sẽ thấy thành quả của mình.





Như vậy là cụm từ “heishi” (binh sĩ) bằng ký tự Kana của tiếng Nhật đã được thay thế bằng ba chữ abc mẫu tự La Tinh. Bạn đã hiểu ra phần nào chưa?
 

1658m6As

Nấm bình thường
Font chữ và chỉnh sửa Hex

Đọc xong phần trên, có lẽ bạn sẽ tự hỏi liệu có cần phải vẽ lại bộ font nếu game đã có sẵn font chữ La Tinh? Câu trả lời không nhất định mà tùy thuộc vào ngôn ngữ đích bạn muốn dịch sang và yêu cầu thẩm mỹ của bạn. Nếu muốn dịch một game tiếng Anh sang tiếng Việt thì bạn vẫn phải vẽ lại font chữ với các ký tự có dấu tiếng Việt. Hoặc giả bạn không thích font chữ La Tinh vốn có trong Rom và muốn vẽ lại bộ font khác cho hợp nhãn hơn. Tất cả tùy vào mục đích của bạn.

Trong phần này bạn cần chuẩn bị thêm:

+ Rom Der Langrisser (Snes phiên bản 1.1)

Trong phần trên tôi đã hướng dẫn bạn thử chỉnh sửa font chữ của Rom Final Fantasy IV bằng Yy-chr. Bây giờ hãy nhấn Ctr Z để undo những thay đổi đó và save Rom lại. Hoặc bạn cũng có thể sử dụng backup để lấy lại Rom nguyên gốc chưa chỉnh sửa.
Bây giờ mở Rom bằng Yy-chr, kéo xuống địa chỉ $57A60 (đối với Rom không header, còn đối với Rom có header thì ta cộng thêm 200 bytes header thành ra $57C60), ta sẽ thấy chữ “he” Kana trong tiếng Nhật nằm ở góc trên cùng bên trái. Đó là địa chỉ (offset) của dữ liệu của chữ “he”.



Bây giờ hãy mở Windhex ra, nhảy tới địa chỉ $57A60 bằng cách nhấn Ctrl G (hoặc chọn Menu Search -- > Goto Offset) rồi nhập số 57A60 vào. Nhấn Enter, bạn sẽ nhảy tới địa chỉ bắt đầu của dữ liệu font chữ “he” trong bảng chữ cái Kana. Tại địa chỉ này bạn sẽ thấy dãy số FF-00-FF-00-FF-70-FF-D8…




Sau khi xác nhận, nhấn vào menu Edit của Windhex, xác nhận không có đánh dấu ở mục Hex/Text Edit Mode. Tôi sẽ giải thích ý nghĩa của mục này sau. Bây giờ trở lại địa chỉ (offset) $57A60 và chỉnh sửa dãy số FF-00-FF-00-FF-70-FF-D8… thành 33-33-33-33-33…. (chỉ chỉnh sửa tầm 10 bytes thôi), sau đó save Rom (Ctrl s) lại, load bằng giả lập, đến đoạn hội thoại mở đầu của game thì bạn sẽ thấy ngay kết quả.




Nếu bạn chưa hiểu ý nghĩa của việc này thì ở đây tôi sẽ giải thích cặn kẽ. Dữ liệu font chữ bạn nhìn thấy được trong YY-char ở dưới dạng hình ảnh, rất trực quan và dễ chỉnh sửa. Nhưng nếu bạn xem trong Windhex thì chỉ thấy một chuỗi hex liên tiếp mà thôi. Bất kỳ dữ liệu nào trong game cũng chỉ là một dãy hex nếu bạn xem chúng bằng trình Hex editor như Windhex. Khi bạn thay đổi dãy số đó thì có nghĩa là đã tác động đến dữ liệu hình ảnh của font chữ, và khi game đọc đến đoạn dữ liệu đó thì nó sẽ thể hiện đúng theo những gì bạn thay đổi ra màn hình. Phần dưới đây tôi sẽ giải thích font chữ được tạo ra như thế nào.

Như tôi đã nói bên trên, font chữ không phải là “chữ” mà chỉ là một dạng hình ảnh. Console đọc dữ liệu font và xem chúng như là những bức hình đơn giản mà thôi. Các hệ console như Nes, Snes hay Gameboy lưu trữ font trong những hình vuông ít nhất là 8 pixel được gọi là Bit-plane. Bạn hãy xem hình dưới đây.

_ _ _ _ _ _ _ _
|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|


Đây là một Bit-plane 8x8 pixel. Mỗi một ô vuông nhỏ tượng trưng cho một pixel. Giả dụ chúng ta muốn “vẽ” chữ A vào trong Bit-plane này.

_ _ _ _ _ _ _ _
|_|_|_|_|_|_|_|_|
|_|_|x|x|x|x|_|_|
|_|x|_|_|_|_|x|_|
|_|x|_|_|_|_|x|_|
|_|x|x|x|x|x|x|_|
|_|x|_|_|_|_|x|_|
|_|x|_|_|_|_|x|_|
|_|x|_|_|_|_|x|_|


Bạn thấy chữ A chưa? Nếu bạn nắm rõ cơ bản về hệ nhị phân thì sẽ hình dung ra những gì tôi sắp nói tiếp theo. Số nhị phân là con số gồm 8 chữ số, số thấp nhất là 00000000 (tương đương với số 0 bên thập phân) và Bit-plane của chúng ta cũng có 8x8 pixels. Hãy xem ô (pixel) trắng là số 0, ứng với trạng thái bóng đèn tắt và những ô đánh dấu x là số 1, ứng với trạng thái bóng đèn sáng. Bây giờ hãy thử miêu tả lại Bit-plane trên dưới dạng số nhị phân.

00000000
00111100
01000010
01000010
01111110
01000010
01000010
01000010

Đã hình dung được chưa? Thế nhưng, như tôi đã nói trên, số nhị phân gây nhiều “ức chế” cho lập trình viên lẫn hacker nên người ta ưa chuyển sang hệ thập lục hơn. Bật “giả lập” máy tính bỏ túi trong Windows lên, chuyển các dãy số nhị phân kia sang hệ thập lục.

00000000=00h
00111100=3Ch
01000010=42h
01000010=42h
01111110=7Eh
01000010=42h
01000010=42h
01000010=42h

Vậy là bạn đã có dữ liệu “hình ảnh” của chữ A dưới dạng số thập lục là 00-3C-42-42-7E-42-42-42. Để kiểm chứng điều này thì hãy bật Stirling lên, chọn mục tạo file mới (ファイル-- > 新規作成), gõ dãy số 003C42427E424242 vào, save lại với tên font. Bin (hoặc bất cứ tên gì tùy bạn). Bây giờ dùng Yy-chr mở file binary bạn vừa tạo ra với Stirling, xem ở chế độ 1BP và nhận xét kết quả!




Vậy là bạn đã hiểu dãy số số FF-00-FF-00-FF-70-FF-D8… tại địa chỉ $57A60 trong Rom FF4 lúc nãy có ý nghĩa là gì chưa?

Nhưng ví dụ tôi vừa đưa ra trên đây chỉ là font 1 Bit-plane mà thôi. Game Snes thường có font chữ 2 hoặc 4 Bit-planes. Về cơ bản thì chúng giống font 1 Bit-plane. Tôi sẽ giải thích tiếp về font 2 Bit-planes. Font này gồm một Bit-plane chứa dữ liệu “hình ảnh” của chữ và Bit-plane còn lại ảnh hưởng tới màu sắc của chữ. Nó có tới 4 màu sắc khác nhau và để đơn giản, tôi gọi nó là màu 1, 2, 3 và 4. Lấy lại ví dụ trên.

Bit-plane 1 Bit-plane 2

00000000 00000000
00111100 00000000
01000010 00000000
01000010 00000000
01111110 00000000
01000010 00000000
01000010 00000000
01000010 00000000


Bit-plane 2 hoàn toàn trống rỗng. Trong game thì dữ liệu font được lưu trữ theo trình tự như sau: dòng thứ nhất của BP (Bit-plane) 1, dòng thứ nhất của BP 2, dòng thứ hai của BP 1, dòng thứ hai của BP 2,…. Cụ thể như sau:

00000000 00000000 00111100 00000000
01000010 00000000 01000010 00000000
01111110 00000000 01000010 00000000
01000010 00000000 01000010 00000000

Chuyển đổi sang hệ thập lục ta được: 00 00 3C 00 42 00 42 00 7E 00 42 00 42 00 42 00. Lần này tạo file khác trong Stirling, nhập dãy số trên vào, save lại và load file bằng yy-chr. Bạn sẽ thấy chữ A như lúc nãy mà không có gì thay đổi vì Bp 2 là BP trống. Giờ thử thay đổi một chút ở BP 2.

Bit-plane 1 Bit-plane 2

00000000 00000000
00111100 00111100
01000010 01000010
01000010 01000010
01111110 01111110
01000010 01000010
01000010 01000010
01000010 01000010

Chuyển sang hệ thập lục ta được

00 00 3C 3C 42 42 42 42 7E 7E 42 42 42 42 42 42

Nhập vào Stirling rồi mở bằng yy-chr, bạn sẽ thấy chữ A giờ đã có màu sắc khác!

Tương tự, font 4 BP có dạng như thế này

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|

Và cách thức hoạt động của nó cũng giống với font 2 BP.
Đó là một số kiểu font bạn thường gặp khi hack Rom. Tuy nhiên đôi khi bạn cũng gặp phải những kiểu định dạng font khùng khoằm khác không theo dạng 1 BP, 2BP hay 4 BP nữa. Lấy ví dụ là game Der Langrisser trên Snes.


Dùng Yy-chr load Rom Der Langrisser, kéo xuống địa chỉ $11814C (đối với Rom có header và $117F4C đối với Rom không header). Đây là địa chỉ font chữ của game. Tại đây bạn thấy một mớ dữ liệu có vẻ như là bộ font tiếng Nhật, nhưng không rõ hình thù thế nào. Dù có chọn chế độ view thế nào đi nữa bạn cũng không thấy được font trọn vẹn như đối với FF4 bên trên.




Có hai câu trả lời cho trường hợp này. Thứ nhất là dữ liệu font bị nén. Trong trường hợp này thì bạn nên bỏ project mình định dịch đi, trừ khi bạn biết Asm và dùng nó để giải nén bộ font. Thứ hai là game chứa dữ liệu font ở một định dạng khác với các kiểu định dạng mà chúng ta (và Yy-chr) đã biết. Đối với trường hợp của Der Langrisser thì câu trả lời là trường hợp thứ hai.
Cụ thể là mỗi chữ trong bộ font của game này được lưu trữ trong 18 bytes. 12x12 pixels. Các trình chỉnh sửa hình ảnh thông thường như Yy-chr và Tile Layer Pro, Naga… sẽ không xem được định dạng này. Ở đây tôi dùng một chương trình xuất font chữ ở mọi định dạng tên là feidian và được bộ font ở dạng ảnh Bmp. Bạn có thể tham khảo cách dùng feidian ở link dưới đây nếu quan tâm kỹ đến định dạng font chữ này.

http://elsallia.com/bbs/index.php/topic,962.0.html
 

1658m6As

Nấm bình thường
Relative Search


Ô Cê Men!
Bạn đã biết một phần công dụng của Table file. Nhưng làm cách nào để xác định “nội dung” của các Hex code trong Table? Trong phần trên tôi có chỉ bạn nhảy tới địa chỉ $8070B và từ đó xác định được “nội dung” của các Hex code. Nhưng bạn sẽ làm thế nào nếu không biết trước địa chỉ này?

Lúc này chúng ta sẽ nhờ đến một chức năng gọi là “tìm kiếm vị trí tương đối” (Relative Search).

Trong phần này bạn cần có:

+ Phần mềm Search Relative. Có thể tải tại đây: http://www.romhacking.net/utils/39/

Thông thường, đối với Rom không nén font chữ thì các chữ cái trong bộ font được sắp xếp theo một trật tự nhất định. Đối với bản chữ La tinh thường là
Mã:
 A B C D E F G H I J K L M N OP Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
Còn đối với bảng chữ Kana của tiếng Nhật, chúng thường được sắp xếp theo trật tự 50 âm

Mã:
a I u e o
Ka ki ku ke ko
Sa shi su se so
Ta chi tsu te to
Na ni nu ne no
Ha hi fu he ho
Ma mi mu me mo
…
Lưu ý rằng trật tự này có thể thay đổi tùy theo Rom. Cách tốt nhất là mở Rom bằng Yy-chr, tìm đến dữ liệu font chữ để xác nhận xem chúng sắp xếp theo trật tự nào. Điều này rất quan trọng, nó quyết định việc tìm kiếm của bạn thành công hay thất bại.
Như vậy bạn có thể thấy, chữ A đứng đầu tiên trong bảng chữ cái, chữ B đứng thứ hai và chữ C đứng thứ ba,… Nếu lấy chữ A làm gốc tọa độ thì vị trí của nó là 0, từ đó suy ra vị trí của chữ B là 0 + 1= 1, vị trí chữ C là 0 + 2=2,…Nói cách khác, vị trí tương đối của chữ B so với chữ A là +1, của chữ C so với chữ A là +2. Dễ thấy vị trí tương đối của chữ A đối với chữ M là -12 nếu như lấy M làm gốc.

Tương tự, ta có vị trí tương đối của chữ R đối với chữ A là +17

Đối với trường hợp của bảng chữ thường a b c d e f cũng vậy.
Trường hợp của bảng chữ Kana cũng có cùng nguyên tắc.
Bây giờ quay trở lại FF4. Mở Rom bằng YY-chr, kéo xuống địa chỉ $57100 để thấy được bộ font.

Bạn có thể thấy trật tự của bảng chữ như sau: nếu lấy chữ a Hiragana làm gốc thì chữ ma (Hira) là 31, chữ mo (Hira) là 35, chữ na (Hira) là 21, chữ ku (Hira) là 8,…
Bây giờ xem lại đoạn hội thoại đầu tiên xuất hiện trong game

Mã:
Heishi“Sesiru taichō!
Mamonaku Baron ni tsukimasu!
Giờ ta hãy thử tìm cụm từ “mamonaku” xem.
Như trên đã có vị trí tương đối của ma=31, mo=35, na=21, ku=8 rồi. Giờ hãy chạy file RELSEARCH.EXE, nhập tên Rom vào rồi nhập các vị trí tương đối của chuỗi cần tìm vào, ta được kết quả



Như vậy chương trình đã tìm kiếm giúp ta chuỗi có các Hex code mang vị trí tương đối thỏa mãn điều kiện 31-35-21-8. Nếu may mắn thì chuỗi bạn cần tìm mang tính độc đáo, là duy nhất trong Rom thì chương trình tìm ra một kết quả duy nhất. Nhưng thường thì nó sẽ tìm ra vài hoặc nhiều kết quả. Như trường hợp ở trên, nó tìm ra hai địa chỉ thỏa mãn điều kiện là
Mã:
$80719 (80719h) và
$89CA1 (89CA1h)
Muốn biết đâu là địa chỉ cần tìm thì bạn phải thử lần lượt. Nhảy tới một trong các địa chỉ trên, thử thay đổi Hex code, save Rom và load bằng giả lập xem có thay đổi gì không. Nếu không thấy thay đổi nào thì có nghĩa là địa chỉ mà bạn vừa thay đổi Hex code không phải thứ chúng ta đang tìm. Lặp lại thao tác trên cho đến khi thấy thay đổi trong giả lập.
Trong trường hợp này, nhảy đến $80719 thì tôi thấy giá trị của Hex code đầu tiên là $A8. Thử đổi nó thành $A9 và…




Bạn thấy đó, Mamonaku đã chuyển thành Mimonaku. Có nghĩa là ta đã dò đúng địa chỉ và cũng xác định được luôn trong file Table là
Mã:
A8=ま
A9=み
Đã nắm được một manh mối rồi thì những Hex code còn lại quá đơn giản để dò ra đúng không. Bằng cách này, bạn có thể tự xây dựng được file Table rồi.

Bạn đã biết cách edit hex code, biết cách chỉnh sửa font chữ, biết cả file Table rồi thì giờ làm gì tiếp đây? Thử áp dụng những gì đã có được xem.
Đầu tiên là thay đổi bộ font Kana của tiếng Nhật bằng font chữ La tinh của tiếng Việt xem. Dưới đây là thành quả của tôi



Giờ hãy save Rom lại, load bằng giả lập và…



Dân trong nghề gọi hiện tượng này là “nói tiếng mọi” (cavespeak). Sở dĩ có hiện tượng là vì hai lý do sau:

+ Đầu tiên là như bạn quan sát trong cửa sổ Yy-chr, tiếng Nhật có đến 50 âm Hiragana và 50 âm Katakana trong khi tiếng Việt chỉ có chừng 24 âm cơ bản (chưa tính dấu). Như vậy thì ngoài nhữ tile được sửa từ Kana sang font chữ La tinh thì vẫn còn sót lại một số font Kana. Đó là lý do tại sao bạn thấy một số chữ Kana còn lẫn trong mớ hỗn độn bên trên.

+ Lý do thứ hai là trật tự ngôn ngữ. Chắc là bạn còn nhớ tôi đã nói điều này ở phần trước? Các Hex code hiển thị text hội thoại của Rom gốc được sắp xếp theo trật tự của tiếng Nhật với bộ font tiếng Nhật. Nhưng ở trên, bạn đã thay đổi bộ font sang chữ La tinh rồi mà vẫn chưa thay đổi lại trật tự ngôn ngữ này. Đó là lý do chính.

Như vậy, bạn cần phải sắp xếp lại các Hex code hiển thị text hội thoại từ trật tự của tiếng Nhật sang trật tự mới, trật tự của ngôn ngữ đích mà bạn muốn dịch sang. Cụ thể, ở đây chúng ta cần đổi sang trật tự của tiếng Việt.

CHÚ Ý rằng sau khi chỉnh sửa font chữ, bạn nên lập một file Table mới theo trật tự đã chỉnh. Chẳng hạn, trong file ff4dump.tbl cũ là

Mã:
 7F=ょ
Thì khi sửa font Kana thành font La tinh như trên thì phải lập Table mới như sau

Mã:
7F=đ
Vì vị trí tile của chữ ょ đã được thay bằng chữ đ.

Giờ đã đến lúc nghịch thử!
Xác nhận xem trong file Table mới của bạn có những entry như thế này không

Mã:
 59=X
5A=Y
5B=Z
5C=a
5D=b
5E=c
5F=d

60=e
61=f
62=g
63=h
64=i
65=j
66=k
67=l
68=m
69=n
6A=o
6B=p
6C=q
6D=r
6E=s
6F=t

70=u
71=v
72=w
73=x
74=y
75=z
Nhảy tới địa chỉ $8070B là vị trí bắt đầu hội thoại trong game. Tham chiếu bảng Table để chỉnh sửa các Hex code câu nói tiếng mọi bên trên thành câu có ý nghĩa hơn



Vậy là bạn đã dịch được một đoạn rồi đó! Về cơ bản thì nguyên tắc dịch Rom tới đây là hết. Nhưng cuộc đời đâu có đơn giản như vậy. Bạn sẽ sớm nhận ra một vấn đề là nếu edit Hex code bằng tay dựa theo Table sẽ rất mất thời gian. Bạn có thể edit một vài đoạn ngắn nhưng không thể edit hết các câu thoại tràng giang đại hải trong Rom bằng cách vừa gõ Hex vừa xem Table. Vậy phải làm sao?

Muốn biết việc này giải quyết thế nào, hãy đọc phần sau sẽ rõ.
 

1658m6As

Nấm bình thường
Dump Text


Như tôi đã nói trên, edit Hex code bằng tay là một việc rất mất thời gian và dễ nhầm lẫn. Nếu có khả năng về lập trình ngôn ngữ bậc cao (như C ha VB) thì bạn có thể viết cho mình một chương trình để chèn text sau khi dịch vào trong Rom. Nếu không có khả năng thì bạn có thể dùng những phần mềm người ta viết sẵn phục vụ cho việc chèn text như Script Insertor hay Atlas. Dưới đây là link download

+ Script Insertor: http://www.romhacking.net/utils/573/

+ Atlas: http://www.romhacking.net/utils/224/

Ngoài ra còn một số phần mềm giúp chèn text vào Rom khác như Gizmo, nhưng tôi khuyên bạn nên làm quen với Atlas vì nó có nhiều tính năng ưu việt mà các phần mềm khác không có được (sẽ đề cập ở phần sau). Nguyên tắc hoạt động cơ bản của các phần mềm này là dựa trên các entry trong Table file để chèn Hex code vào Rom theo file text mà bạn dịch.

Chẳng hạn, bạn có file Table như sau:

Mã:
3A=H
3B=e
3C=l
3D=o
Thì khi muốn đoạn hội thoại hiện từ “Hello” ra màn hình thì thay vì phải nhập Hex code bằng tay, bạn chỉ cần viết “Hello” vào trong file script, chạy phần mềm và nó sẽ tự động nhập code 3A-3B-3C-3C-3D vào vị trí chỉ định trong Rom.
Toàn bộ quá trình này dân trong nghề gọi là Insert (chèn). Nhưng chèn là chèn cái gì? Ở đây là chèn text bạn đã dịch ra ngôn ngữ đích vào trong Rom. Nhưng muốn dịch được thì bạn cần phải nắm rõ nội dung của văn bản trong ngôn ngữ nguồn đã. Nằm bằng cách nào? Có nhiều cách, dưới đây là một vài cách:

+ Tìm trên mạng xem có ai đó post script bằng ngôn ngữ nguồn của game bạn cần dịch hay không? Nếu có thì bạn chỉ việc tải về mà đọc rồi dịch, tiết kiệm được một khoảng thời gian.

+ Bật game lên chơi, vừa chơi vừa đọc nội dung, đọc tới đâu dịch tới đó.

+ Làm cách nào đó để trích xuất nội dung text trong Rom ra thành file văn bản.

Trong những cách trên thì cách đầu đơn giản nhất, ít tốn công sức nhất nhưng lại là cách chờ may rủi. Những trường hợp như thế không nhiều nên bạn đừng trông đợi vào cách này, trừ khi game bạn cần dịch quá nổi tiếng và trước đó đã có vài bản dịch qua các thứ tiếng khác rồi. Trường hợp thứ hai đòi hỏi rất nhiều thời gian nhưng lại không hiệu quả? Vì tình huống (event) trong game thường là rất nhiều và được sắp xếp theo dạng phân nhánh để người chơi chọn lựa. Chẳng hạn, trong game bạn nhặt được một món Item và game đưa ra hai chọn lựa là đi tiếp về phía Đông hay đi tiếp về phía Tây, dù chọn hướng đi nào chăng nữa thì sau đó game lại phân chia tiếp và một lần chơi của bạn chắc chắn sẽ không đủ bao quát hết mọi tình huống trong game. Đó là chưa tính đến trường hợp nhân vật này chết sẽ xuất hiện hội thoại khác, nhân vật kia sống hay làm sao đó lại xuất hiện hội thoại khác.
Vậy nên cách tốt nhất là làm cách nào đó để trích xuất toàn bội nội dung lời thoại trong Rom ra thành file văn bản để đọc. Quá trình này dân trong nghề gọi là dump. Để dump nội dung thoại trong Rom ra bạn cần:

+ Biết vị trí (offset) bắt ầu và kết thúc của block hội thoại đó. Điều này quá dễ nếu Rom không nén text và bạn đã có một file Table.

+ Một phần mềm chuyên dụng để dump text. Bạn có thể tự viết bằng các ngôn ngữ bậc cao hoặc dùng những cái đã có sẵn như Script Extractor hoặc Romjuice. Cả hai phần mềm này đều nằm trong trang web www.RomHacking.net

Thông thường, các câu thoại trong game được sắp xếp chung với nhau, liền mạch và tạo thành một khối (block) nhưng không nhất thiết phải theo đúng thứ tự trước sau về mặt thời gian và diễn biến như khi chúng ta chơi. Do đó có thể bạn sẽ thấy câu nói của “trùm cuối” nằm ở đầu block còn câu nói mở đầu game lại nằm ở cuối cùng. Một Rom có thể có nhiều block hội thoại nằm rải rác khắp nơi bên trong nó.
Bây giờ quay lại với FF4, bạn có thể dùng bản back-up chưa thay đổi font chữ hoặc bạn đã thay đổi font chữ nhưng chưa thay đổi các Hex code trong hội thoại. Vì cái mà bạn sắp dump ra chỉ là trật tự ngôn ngữ và không liên quan gì tới bộ font nên chừng nào bạn còn chưa nghịch với cái trật tự đó thì vẫn đảm bảo kết quả xuất ra là đúng.
Load Rom bằng Windhex, nhớ load cả file ff4dump.tbl, bạn dễ dàng tìm được một block hội thoại bắt đầu tại $80400 và kết thúc tại $87F59 (đối với Rom không header). Bạn chỉ cần nhập tên Rom, tên file Table và hai vị trí bắt đầu, kết thúc của block vào file thực thi của Romjuice là xong. Nên nhớ Romjuice là chương trình không có giao diện mà chỉ điều khiển bằng câu lệnh. Mọi chi tiết về cách sử dụng nó đều có trong file readme.



Dưới đây là một đoạn text FF4 tôi dump ra từ Rom bằng cách dùng phần mềm Romjuice

Mã:
 もちものが いっぱいです゜<end>
たからばこには<line>
<$07>が はいっていた!<end>
たからばこから <num>ギル<line>
てにいれた!<end>
たからばこに まものが!<end>
なにも はいっていない゜<end>
カギが かかっている゜<end>
カギを あけた!<end>
Nguyên tắc hoạt động của các phần mềm dump text ngược lại với các phần mềm chèn text. Phần mềm dump sẽ tham chiếu các entry trong file Table, chẳng hạn trong Table bạn có

Mã:
E0=a
E1=b
E2=c
E3=d
…
Thì không gặp bất cứ Hex code nào mang giá trị E0 trong phạm vi chỉ định thì phần mềm sẽ xuất ra ký tự “a” trong file text. Nếu gặp cụm giá trị E3-E0-E1 thì nó sẽ xuất ra là “dab”.

Lợi ích của việc dump nội dung hội thoại ra file text là bạn có thể đọc hết mà không cần phải chơi, có thể gửi file text đó cho người khác dịch nếu như bạn không biết ngôn ngữ nguồn mà chỉ biết về mặt kỹ thuật. Ngoài ra, trong một số trường hợp thì việc dump text bao gồm cả control code ra file văn bản giúp cho việc chèn vào (insert) dễ dàng hơn vì nó theo một định dạng nhất định của game.

Chú ý:

+ Windhex cũng có chức năng dump text (bằng cách nhấn F10 hoặc vào mục Tools -- >Dump Text) nhưng không chuyên dụng như Romjuice.

+ Điều quan trọng khi dump text là file Table của bạn phải thật chính xác và địa chỉ bắt đầu cũng như kết thúc của block hội thoại phải chuẩn. Chỉ cần một trong các yếu tố trên sai lệch thì kết quả sẽ sai lệch.
 

1658m6As

Nấm bình thường
Variable Width Font

Để dễ hiểu những gì tôi đề cập trong phần này, bạn cần có:

+ Rom Fire Emblem Monshō no Nazo (Mộc đế 3) bản tiếng Nhật, chưa bị chỉnh sửa. Trên mạng hiện giờ đang có bản tiếng Anh, Nhật và Việt nhưng bạn chỉ cần bản tiếng gốc tiếng Nhật mà thôi.

Sau khi tải Rom về, hãy mở bằng Yy-chr, kéo xuống địa chỉ $2C0200 (đối với Rom có 200 bytes header) và xem ở chế độ 2BP GBA, bạn sẽ thấy được bộ font của game.



Hãy quan sát thật kỹ và so sánh với bộ font của FF4. Bạn thấy điểm gì khác nhau?
Câu trả lời là tile của FE3 là 16x16 trong khi tile của FF4 chỉ là 8x8, do đó một tile của FE3 rộng gấp 4 lần của FF4.
Dưới đây là file Table của FE3 có được sau khi dùng chức năng Relative Search như đã đề cập bên trên

Mã:
0001=<line>
01=あ
02=い
03=う
04=え
05=お
06=か
07=き
08=く
09=け
0A=こ
0B=さ
0C=し
0D=す
0E=せ
0F=そ
10=た
11=ち
12=つ
13=て
14=と
15=な
16=に
17=ぬ
18=ね
19=の
1A=は
1B=ひ
1C=ふ
1D=へ
1E=ほ
1F=ま
20=み
21=む
22=め
23=も
24=や
25=ゆ
26=よ
27=ら
28=り
29=る
2A=れ
2B=ろ
2C=わ
2D=を
2E=ん
2F=が
30=ぎ
31=ぐ
32=げ
33=ご
34=ざ
35=じ
36=ず
37=ぜ
38=ぞ
39=だ
3A=ぢ
3B=づ
3C=で
3D=ど
3E=ば
3F=び
40=ぶ
41=べ
42=ぼ
43=ぱ
44=ぴ
45=ぷ
46=ぺ
47=ぽ
48=ぁ
49=ぃ
4A=ぅ
4B=ぇ
4C=ぉ
4D=ゃ
4E=っ
4F=ゅ
50=ょ
51=ア
52=イ
53=ウ
54=エ
55=オ
56=カ
57=キ
58=ク
59=ケ
5A=コ
5B=サ
5C=シ
5D=ス
5E=セ
5F=ソ
60=タ
61=チ
62=ツ
63=テ
64=ト
65=ナ
66=ニ
67=ヌ
68=ネ
69=ノ
6A=ハ
6B=ヒ
6C=フ
6D=ヘ
6E=ホ
6F=マ
70=ミ
71=ム
72=メ
73=モ
74=ヤ
75=ユ
76=ヨ
77=ラ
78=リ
79=ル
7A=レ
7B=ロ
7C=ワ
7D=ン
7E=ガ
7F=ギ
80=グ
81=ゲ
82=ゴ
83=ザ
84=ジ
85=ズ
86=ゼ
87=ゾ
88=ダ
89=ヂ
8A=ヅ
8B=デ
8C=ド
8D=バ
8E=ビ
8F=ブ
90=ベ
91=ボ
92=パ
93=ピ
94=プ
95=ペ
96=ポ
97=ァ
98=ィ
99=ゥ
9A=ェ
9B=ォ
9C=ャ
9D=ッ
9E=ュ
9F=ョ
A0=0
A1=1
A2=2
A3=3
A4=4
A5=5
A6=6
A7=7
A8=8
A9=9
AA=神
AB=何
AC=会
AD=賊
AE=大
AF=男
B0=元
B1=気
B2=出
B3=状
B4=今
B5=皇
B6=帝
B7=聖
B8=寺
B9=-
BA=勇
BB=者
BC=?
BD=苦
BE=加
BF=争
C0=「
C1=」
C2=(
C3=)
C4= 
C5=!
C6=攻
C7=撃
C8=力
C9=守
CA=備
CB=魔
CC=竜
CD=石
CE=団
CF=閾
D0=技
D1=場
D2=店
D3=必
D4=殺
D5=一
D6=道
D7=書
D8=杖
D9=系
DA=M
DB=星
DC=話
DD=兵
DE=士
DF=使
E0=用
E1=運
E2=速
E3=法
E4=軍
E5=白
E6=火
E7=飛
E8=地
E9=暗
EA=黒
EB=進
EC=城
ED=海
EE=人
EF=騎
F0=院
F1=王
F2=子
F3=女
F4=様
F5=父
F6=行
F7=戦
F8=来
F9=.
FA=母
FB=山
FC=集
FD=*
FE=剣
FF=国
Nếu kéo xuống thì bạn còn thấy nhiều chữ Kanji bên dưới nữa, nhưng ở đây tôi chỉ liệt kê font chữ Kana và một phần Kanji từ giá trị $01 đến $FF mà thôi.

Bây giờ thử thay thế bộ font tiếng Nhật bằng font chữ tiếng Việt. Lưu ý là do tile của FE3 là 18x18 nên bạn thừa sức “vẽ” dấu tiếng Việt. Dưới đây là kết quả của tôi



Và dĩ nhiên, sau khi sửa lại bộ font thì tôi cũng làm một file Table mới

Mã:
0001=<line>
01=A
02=B
03=C
04=D
05=E
06=F
07=G
08=H
09=I
0A=J
0B=K
0C=L
0D=M
0E=N
0F=O
10=P
11=Q
12=R
13=S
14=T
15=U
16=V
17=W
18=X
19=Y
1A=Z
1B=a
1C=b
1D=c
1E=d
1F=e
20=f
21=g
22=h
23=i
24=j
25=k
26=l
27=m
28=n
29=o
2A=p
2B=q
2C=r
2D=s
2E=t
2F=u
30=v
31=w
32=x
33=y
34=z
35=ọa
36=Đ
37=Á
38=Ố
39=Ồ
3A=Ô
3B=á
3C=à
3D=ả
3E=ã
3F=ạ
40=ă
41=ắ
42=ằ
43=ẳ
44=ẵ
45=ặ
46=â
47=ấ
48=ầ
49=ẩ
4A=ẫ
4B=ậ
4C=í
4D=ì
4E=ỉ
4F=ĩ
50=ị
51=é
52=è
53=ẻ
54=ẽ
55=ẹ
56=ê
57=ế
58=ề
59=ể
5A=ễ
5B=ệ
5C=ó
5D=ò
5E=ỏ
5F=õ
60=ọ
61=ô
62=ố
63=ồ
64=ổ
65=ỗ
66=ộ
67=ơ
68=ớ
69=ờ
6A=ở
6B=ỡ
6C=ợ
6D=ú
6E=ù
6F=ủ
70=ũ
71=ụ
72=ư
73=ứ
74=ừ
75=ử
76=ữ
77=ự
78=ý
79=ỳ
7A=ỷ
7B=ỹ
7C=ỵ
7D=ng
7E=th
7F=tr
80=ch
81=ph
82=qu
83=gi
84=gì
85=Ma
86=ru
87=su
88=kỵ
89=sĩ
8A=Si
8B=da
8C=đ
8D=đã
8E=đa
8F=đá
90=đà
91=ần
92=Qu
93=Th
94=Tr
95=Ch
96=đô
97=ốc
98=ộc
99=am
9A=ám
9B=àm
9C=ươ
9D=ướ
9E=ườ
9F=ưở
A0=0
A1=1
A2=2
A3=3
A4=4
A5=5
A6=6
A7=7
A8=8
A9=9
AA=!!
AB=!?
AC= "
AD="
AE=sẽ
AF=...
B0=,
B1=Kh
B2=kh
B3=ưỡ
B4=ượ
B5=ắc
B6=ắn
B7=iê
B8=iế
B9=iề
BA=iể
BB=iễ
BC=?
BD=iệ
BE=oa
BF=óa
C0=òa
C1=ỏa
C2= (
C3=) 
C4= 
C5=!
C6=Ni
C7=na
C8=Nà
C9=nà
CA=bị
CB=tà
CC=lo
CD=uô
CE=uố
CF=uồ
D0=uộ
D1=Fi
D2=re
D3=Em
D4=bl
D5=em
D6=do
D7=âm
D8=ấm
D9=ầm
DA=ết
DB=ệt
DC=óc
DD=ọc
DE=Ak
DF=an
E0=án
E1=ia
E2=ía
E3=Ar
E4=it
E5=ít
E6=oá
E7=oà
E8=oả
E9=ke
EA=đị
EB=nữ
EC=ấn
ED=ẩn
EE=ận
EF=Pa
F0=ậm
F1=le
F2=kẻ
F3=lạ
F4=kỳ
F5=mỹ
F6=có
F7=cô
F8=cò
F9=.
FA=dễ
FB=để
FC=Ta
FD=*
FE=ta
FF=mà
Chú ý rằng nếu bạn chỉnh sửa font khác tôi (tile nào là chữ nào) thì Table cũng phải khác.

Bạn có để ý rằng các tile có giá trị Hex từ $7D trở đi thường gồm 2 chữ cái tiếng Việt đi liền nhau không? Bởi vì tile của FE3 là 18x18, còn đủ chỗ trống để bạn vẽ liền 2 ký tự vào.




Hãy hình dung, trong bất cứ ngôn ngữ nào cũng có hiện tượng một số chữ này hay đi liền với một số chữ khác. Trong tiếng Việt thì đó là các cặp phụ âm như “th”, “tr”, “ch”, “ph”,… hoặc “mà”, “ta”…

Giả sử nếu bạn có câu “Xin chào” và 01 Hex code ứng với 01 chữ cái
3F=X
2A=i
2B=n
2C= (khoảng trắng)
2D=c
2E=h
2F=à
30=o

Thì “xin chào” sẽ tương đương: 3F-2A-2B-2C-2D-2E-2F-30, tức là phải mất 8 bytes.
Nhưng nếu bạn có
3F=X
2A=in
2B= (khoảng trắng)
2C=ch
2D=ào

Thì cụm từ trên sẽ tương đương: 3F-2A-2B-2C-2D, tức là rút gọn chỉ còn 5 bytes so với trường hợp trên. Dĩ nhiên lời thoại trong game không bao giờ chỉ là một câu duy nhất, nên nếu áp dụng kiểu một tile thể hiện hai ký tự thế này thì bạn sẽ tiết kiệm được rất nhiều chỗ trống trong Rom. Đây là một yếu tố quan trọng, vì bạn càng chừa lại nhiều chỗ trống càng tốt.

Bây giờ thử load Rom chưa chỉnh sửa font chữ bằng giả lập, ở đầu game bạn sẽ thấy đoạn hội thoại như sau:




Bây giờ load Rom FE3 (đã chỉnh sửa font chữ hay chưa cũng được) bằng Windhex nhưng nhớ phải load file Table Kana chứ không load Table chữ tiếng Việt. Kéo xuống địa chỉ $2E7443 (đối với Rom có header), bạn sẽ tìm được đoạn text này trong Rom (ở đây còn một số chữ bạn chưa thấy được vì chúng là Kanji 2 bytes và chưa có trong file Table của bạn). Thử thay đổi một vài Hex, save lại để xác nhận xem đây có đúng là địa chỉ cần tìm hay chưa.

Sau khi xác định được địa chỉ cần tìm, load Rom đã sửa font chữ bằng Windhex, nhảy tới địa chỉnh trên và edit thành một câu có nghĩa trong tiếng Việt bằng cách tham chiếu file Table tiếng Việt hoặc dùng phần mềm insert như đề cập bên trên.



Bạn sẽ thấy hiện tượng vỡ font chữ như trên. Cụm từ “các bạn” không được viết liền mạch mà là “c á c b ạ n”, tức là các chữ cái không đứng sát nhau.
Hiện tượng này được giải thích như thế nào?

Bạn nên biết rằng các chữ cái Kana trong tiếng Nhật thường có bề ngang bằng nhau đối với mọi chữ. Kiểu font chữ này được gọi là Fixed Font (font cố định) hoặc Monospace Font. Trong khi đó, bảng chữ La tinh thì không thế. Rõ ràng chữ m có bề ngang lớn hơn nhiều so với chữ i, bề ngang của chữ b cũng khác với chữ B. Do đó, khi sửa bộ font từ tiếng Nhật thành font La tinh thì hay gặp trường hợp này.
Chẳng hạn, mọi chữ Kana đều có bề ngang là như nhau và đều bằng 8 pixels trong khi chữ a có bề ngang 6 pixels, chữ m có 7 pixels, chữ l có 2 pixels… thì khi thay thế câu chữ tiếng Nhật bằng câu chữ La tinh thì khoảng cách giữa các chữ không còn được bảo đảm như trước nữa và rất khó đọc. Trong hình trên bạn còn thấy các từ phía sau có chữ chồng lên nhau là vì chữ Kana trước đó chiếm 8 pixels trong một tile trong khi bạn sửa tile đó thành 2 ký tự liên tiếp nhau (như ph, tr,…) và chúng có bề ngang vượt 8 pixels.

Để khắc phục tình trạng này, hacker chèn vào Rom bộ font gọi là Variable Width Font hay Proportional Font, tức font chữ thay đổi được bề ngang của nó tùy vào chữ đứng kế trước hoặc sau nó là chữ gì. Variable Width Font (VWF) có ưu điểm mà ai cũng thấy là làm cho văn bản đẹp mắt hơn, dễ đọc hơn vì nó tự điều tiết khoảng cách giữa các chữ trong cụm từ, trong câu. Để đưa VWF vào trong Rom thì bạn cần có kiến thức về ASM. May mắn thay, FE3 lại là game sử dụng Vwf, nghĩa là trong Rom đã có sẵn đoạn code quy định bề ngang của từng chữ nên ta chỉ cần edit lại đoạn code này mà không cần phải hiểu biết về Asm.

Bây giờ load Rom mà bạn vừa thay đổi nội dung text như trên bằng Windhex, nhảy tới địa chỉ $3B6B8 (đối với Rom có header). Bắt đầu từ địa chỉ này trở đi là code điều chỉnh bề ngang của từng chữ trong bộ font. Mở đầu, $0B là số pixels của chữ “a”, $0A là của chữ “i” và cứ tiếp tục như vậy…

Sau khi edit đoạn code này, save Rom lại và kiểm tra bằng giả lập. Dưới đây là kết quả của tôi.



Đây là toàn bộ khái niệm về Vwf. Đừng quên là bạn cần phải có kiến thức Asm để có thể tự chèn code Vwf vào trong Rom nếu không có sẵn.
 

1658m6As

Nấm bình thường
Pointer


Nếu đã nắm kỹ những gì tôi nói bên trên thì tại thời điểm này, bạn đã có thể dịch một game sang thứ tiếng mà bạn muốn. Nhưng như vậy chưa phải là đủ. Vì sao?
Vì một lý do rất đơn giản: như tôi có đề cập ở phần trước, các câu thoại trong Rom thường được sắp xếp nối tiếp nhau tạo thành một khối hội thoại. Trong đó câu 1 ngăn cách với câu 2, câu 3, câu 4,… bằng control code chỉ định kết thúc câu. Và thông thường thì khi dịch một câu từ ngôn ngữ nguồn sang ngôn ngữ đích thì câu được dịch dài hơn câu gốc, do đó dẫn đến hiện tượng không đủ chỗ nếu muốn dịch hết và dịch đầy đủ và hiện tượng các câu nằm chồng lên nhau như hình minh họa dưới đây



Phần màu hồng là 3 câu trong ngôn ngữ nguồn và phần màu đen là 3 câu đã được dịch ra. Một ví dụ khác, nếu mỗi một chữ cái là một Hex code và block hội thoại của chúng ta gồm 2 câu: Hello<end>Goodbye<end>
(<end> tượng trưng cho Hex code chỉ kết thúc câu). Trong trường hợp này thì block của chúng ta có 14 Hex code (14 bytes) bao gồm cả 2 control code. Nếu dịch block này sang tiếng Việt thì

Mã:
Xin chao<end>Tam b
Như vậy thì chưa dịch hết câu thứ 2 trong block mà chúng ta đã sử dụng hết 14 bytes. Trường hợp nếu chỉ dịch câu đầu tiên trong block thì

Mã:
Xin chao<end>dbye<end>
Rõ ràng bạn thấy câu 1 (được dịch) lấn sang câu 2 (chưa dịch). Vậy phải giải quyết trường hợp này như thế nào?
Có nhiều cách để giải quyết:

+ Dùng kiến thức Asm để viết lại toàn bộ cấu trúc lời thoại, sắp xếp lại các câu thoại.
+ Dùng kiến thức Asm để mở rộng Rom, tăng thêm chỗ trống cho các câu thoại.
+ Dùng Pointer.

Trong các cách trên thì sử dụng Pointer không đòi hỏi phải có kiến thức về Asm và là vũ khí duy nhất của bạn trong giai đoạn này. Phần này tôi sẽ giải thích về Pointer và cách hoạt dụng của nó. Đây là phần quan trọng nhất trong toàn bộ bài viết này, nếu không nắm và ứng dụng được nó thì rất nhiều khả năng Project dịch thuật của bạn bị phá sản.

Vậy pointer là gì?
Như mọi thành phần khác trong Rom, Pointer cũng chỉ là các Hex code (có thể là 2 bytes, 3 bytes, 4 bytes,…). Và đúng như tên gọi của nó, các Hex code này làm nhiệm vụ chỉ chỗ (địa chỉ) cho game đọc dữ liệu (trong trường hợp này là text) cần thiết. Chẳng hạn, trong Rom Super Mario Bros. có sẵn đoạn text “Game Over” và đoạn này được hiển thị ra màn hình khi người chơi “hết mạng”.
Nguyên tắc hoạt động như sau: game kiểm tra xem người chơi còn bao nhiêu “mạng”, nếu số “mạng” bằng 0 thì nó sẽ đọc một Pointer và Pointer này chỉ đến vị trí của đoạn text “Game Over”. Nhưng Pointer không chỉ đến toàn vị trí của toàn dữ liệu (dòng text “Game Over”) mà nó chỉ tới byte đầu tiên trong khối dữ liệu đó (cụ thể ở đây là chữ G). CPU sẽ đọc từ byte đầu tiên được Pointer dẫn đường này cho tới khi gặp control code báo kết thúc.
Mọi thành phần trong Rom được xác định bằng hai thành phần cơ bản là giá trị Hex của nó và địa chỉ (offset) của nó.
Để dễ hiểu hơn, bạn hãy làm theo hướng dẫn như dưới đây.

Đầu tiên hãy load Rom FE3 gốc (chưa thay đổi font chữ) và chơi đoạn mở đầu, xác nhận lời thoại đầu tiên trong game là câu sau



Đoạn, load Rom bằng Winhed và file Table, bạn dễ dàng tìm được vị trí bắt đầu của đoạn hội thoại này trong Rom là $71A3C (đối với Rom có 200 bytes header). Thử thay đổi vài Hex code để xác nhận xem địa chỉ bạn tìm được đã chính xác chưa rồi backup lại Rom. Bây giờ nhảy tới địa chỉ $71416, tại đây bạn sẽ thấy các Hex code: 2E-98-8E-4D-99-8E-41-9B-8E…
Thử thay đổi 3 bytes đầu tiên là 2E-98-8E thành 4D-99-8E, save Rom và kiểm tra bằng giả lập.



Kỳ lạ thay! Đoạn hội thoại mở đầu đã thay đổi hoàn toàn trong khi bạn chỉ edit mỗi 3 bytes ở một địa chỉ khác hoàn toàn không liên quan đến text hội thoại. Giờ hãy thay đổi 3 bytes vừa rồi thành 41-9B-8E xem sao.



Đoạn hội thoại mở đầu lại thay đổi!
Điều này nghĩa là sao? Tôi sẽ giải thích qua, hãy đọc kỹ phần dưới đây.

Bạn vừa edit 3 bytes đầu tiên tại địa chỉ $71A3. Địa chỉ này tuy không phải là địa chỉ chứa text nhưng lại là nơi chứa các Pointer chỉ đến các đoạn hội thoại nằm ở chỗ khác trong Rom. Và 3 bytes bạn vừa edit chính là giá tri của Pointer chỉ đến đoạn hội thoại mở đầu game. Vì vậy, khi edit 3 bytes này tức là bạn đã edit giá trị của Pointer và nó sẽ chỉ đến đoạn hội thoại khác, tùy vào giá trị mà bạn edit. Nói cách khác, giá trị của Pointer chính là địa chỉ của dữ liệu (text) mà nó chỉ đến. Game Snes sử dụng các loại Pointer sau:

+ Pointer 16 bit hay còn gọi là Pointer 2 bytes. Chính vì có độ dài 2 bytes nên nó có thể chỉ tới bất kỳ vị trí nào trong phạm vi từ $00~$FFFF. FF4 trên Snes là game sử dụng Pointer 2 bytes.

+ Pointer 32 bit hay còn gọi là Pointer 3 bytes. hính vì có độ dài 2 bytes nên nó có thể chỉ tới bất kỳ vị trí nào trong phạm vi từ $00~$FFFFFF. Vì dung lượng của game Snes thường được giới hạn trong phạm vi 4Mb nên Pointer 3 bytes có thể chỉ tới bất cứ vị trí nào trong Rom. FE3 là game sử dụng Pointer 3 bytes.

Lưu ý rằng các hệ máy khác nhau thì dùng Pointer có kích thước khác nhau.

Lợi ích của Pointer:
Như đã nói trên, Pointer là vũ khí lợi hại nhất của bạn trong giai đoạn này để giải quyết vấn đề thiếu chỗ trống trong Rom. Bởi vì trong Rom luôn tồn tại những vị trống, tức là vị trí mà tại đó không chứa bất kỳ dữ liệu nào của Rom (thường là khu vực với Hex $00 hoặc $FF) nên bạn có thể chuyển chỗ những câu thoại dài trong block hội thoại ra những khu vực trống này và edit lại Pointer để nó chỉ tới vị trí hội thoại mới.



Trong hình trên, màu đỏ là vị trí các câu hội thoại ban đầu trong block, màu đen là sau khi dời một số câu đi chỗ khác. Mũi tên là các Pointer.
Do vậy dễ dàng thấy rằng tuy bản thân việc edit giá trị của Pointer không làm tăng thêm chỗ trống cũng như không làm giảm đi kích thước của văn bản nhưng nó cho phép ta sắp xếp các câu thoại vào từng chỗ trong Rom hiệu quả hơn. Những người dịch game bằng cách edit text trực tiếp mà không dùng đến Pointer thường lâm vào tình cảnh không đủ chỗ trống để dịch câu đầy đủ nên phải sử dụng khá nhiều từ viết tắt, lược bỏ đi nhiều từ và do vậy chất lượng của bản dịch cũng không được nguyên vẹn trong khi đó trong Rom vẫn còn nhiều chỗ trống khác.
Nói cách khác, Pointer giúp bạn khai thác hiệu quả không gian trống trong Rom nếu sử dụng đúng cách và là vũ khí quan trọng bậc nhất trong việc hách Rom.
 
Mình không biết việt hóa các game classic như của nes, Snes, gba lại khó như vậy. Mình đang dịnh VH game Mother 3 của GBA :">
Các game của N64 thường dúng text bằng texture (như ssb 64 chắc hạn) nên chỉ cần dúng photo shop thôi :|
Cám ơn bạn bỏ ra kha khá thời gian viết bài này.
 
Header

Header là một chuỗi hex liên tiếp nhau, có độ dài nhất định ở phần mở đầu của từng loại Rom. Header của Rom Nes có kích thước 10 bytes, header của Rom Snes có kích thước 200 bytes.
Thật ra bản thân Rom gốc được nhà sản xuất “in” trên cardtridge không hề có header. Nhưng khi dùng máy copy nội dung của cardtridge xuất (thuật ngữ chuyên ngành gọi là dump) ra file thì thường đi kèm header để các giả lập đọc được file. Nhưng ngày nay, hầu hết các loại giả lập đều đọc được file mà không cần đến header. Header không có tác dụng gì hết ngoại trừ giúp các loại giả lập (ngày xưa) đọc được file được dump từ cardtridge ra mà thôi.
Tuy nhiên, bạn cần chú ý xem Rom của mình có header hay không vì nó ảnh hưởng tới việc tính địa chỉ trong Rom (sẽ nói kỹ ở phần sau). Phần lớn Rom Nes và Snes tải trên mạng về đều có header nhưng một số khác thì không.

Chỉnh sửa hình ảnh trong Rom

Những thứ bạn cần chuẩn bị trong mục này:

+ Tile Layer Pro hoặc YY-CHR
+ Rom Nekketsu Kakutō Densetsu (Nes)
+ Một trình giả lập Nes
+ Luôn backup Rom để phòng khi bạn làm gì sai còn có cái mà dùng

Tất cả những thứ trên bạn đều có thể hỏi anh Google xem nó đang nằm ở đâu trên mạng.

Chỉnh sửa hình ảnh là một trong những kỹ năng cơ bản nếu bạn có ý định bước chân vào thế giới của Rom hacking. Nếu bạn định dịch Rom từ ngôn ngữ này sang ngôn ngữ nọ thì thường phải dùng kỹ năng này để vẽ lại bộ font (từ ký tự Kana, Kanji sang ký tự La Tinh). Bạn còn có thể chỉnh sửa lại hình ảnh trong game để mọi thứ mới mẻ hơn và theo ý mình.
Hình ảnh trong game thường được lưu trữ ở chỗ nào đó trong Rom. Để chỉnh sửa được nó thì bạn cần mở Rom bằng các trình hỗ trợ sửa hình ảnh như Tile Layer Pro hoặc yy-Char (bản thân tôi ưa dùng cái sau hơn) và kéo xuống phía dưới cho tới khi thấy được hình ảnh cần sửa.

Tuy nhiên, phần lớn các game phức tạp ngày nay và đại bộ phận game Snes đều được nén hình ảnh ở một chuẩn nào đó làm cho việc tìm kiếm dữ liệu hình ảnh trở nên khó khăn hơn. Bạn có thể dùng kiến thức Asm của mình để giải nén hình ảnh, chỉnh sửa nó và nén lại vào trong Rom. Nhưng nếu bạn có đủ kiến thức để làm việc này thì cần gì đọc cái bài viết khỉ gió này nữa?

Một điểm cần lưu ý nữa là khái niệm Bit-plane mà tôi sẽ nói rõ hơn ở phần font chữ. Bạn có thể xem hình ảnh của từng Rom ở các chế độ Bpp (Bits per pixel, số bit ở từng điểm ảnh) khác nhau. Ngay trong cùng một Rom mà có khi hình ảnh chỗ này dùng chế độ Bpp khác với hình ảnh chỗ nọ. Sau đây là các chế độ Bpp thường gặp:

+ Snes: 4Bpp (Snes), 2Bpp (GB/GBC), 1Bpp (monochrome)
+ Nes: 2Bpp (Nes), 1Bpp (Monochrome)
+ GB/GBC: 2Bpp (GB/GBC), 1Bpp (monochrome)

Chỉnh sửa hình ảnh là một công việc khá đơn giản một khi bạn đã tìm được dữ liệu của nó (không bị nén) nhưng rất tốn thời gian. Ở đây tôi sử dụng Rom Nekketsu Kakutō Densetsu trên Nes để minh họa vì phần lớn game Nes không bị nén hình ảnh như ở Snes.

Đầu tiên, bạn mở Rom Nekketsu Kakutō Densetsu bằng chương trình YY-chr (hoặc Tile Layer Pro), ở địa chỉ $20010 (đối với Rom có header và địa chỉ $20000 đối với Rom không header), bạn sẽ thấy sprite nhân vật của game. Bật giả lập Nes, load Rom và bắt đầu chơi, bạn sẽ thấy hình khuôn mặt của nhân vật Kunio giống như những gì hiển thị trong Yy-chr.




Để ý bên dưới cùng của Yy-chr có ô lựa chọn chế độ xem và mặc định là 2BPP NES. Nếu thay đổi chế độ xem, bạn sẽ không còn thấy được hình ảnh như lúc nãy nữa. Phía bên tay phải là ô chọn x1, x2, x4, x5, x16. Ở game Nes, thông thường các tile hình ảnh có dạng 8x8 nên Yy-chr mặc định ở chế độ x16.
Trong Rom, hình ảnh được lưu trữ trong các tile (mảng). Tile là một hình vuông chứa các điểm ảnh (điểm ảnh ở đây được hiển thị bằng các hình vuông nhỏ nhất, không thể phân chia được nữa. Hình dung điểm ảnh hay pixel là nguyên tử và tile là phân tử). Phần lớn tile đồ họa của game Nes ở dạng 8x8 pixel, tức mỗi tile chứa được 64 pixels.


Hình ảnh của một tile

Bây giờ, nhìn qua phải của cửa sổ Yy-chr, ở đó có các công cụ để chỉnh sửa (vẽ lại) hình ảnh. Tôi không đi sâu vào phần này mà để bạn tự tìm tòi. Và tôi vẽ lại phần mặt của nhân vật Kunio thành một cái đầu lâu đơn giản như thế này.





Sau đó save Rom lại, dùng giả lập load lại Rom bạn vừa chỉnh sửa (nhớ backup Rom trước khi chỉnh sửa), bạn sẽ thấy kết quả chỉnh sửa của mình!



Đó, thấy chưa? Bạn vừa học được một kỹ năng cơ bản của việc Hack rom!


Chỉnh sửa font chữ

Những thứ bạn cần chuẩn bị trong mục này:

+ Tile Layer Pro hoặc YY-CHR
+ Rom Final Fantasy IV (Snes) bảng tiếng Nhật
+ Một trình giả lập Snes
+ Luôn backup Rom để phòng khi bạn làm gì sai còn có cái mà dùng

Tất cả những thứ trên bạn đều có thể hỏi anh Google xem nó đang nằm ở đâu trên mạng.
Đa phần khi chúng ta đọc truyện tranh đều cho rằng chữ và hình ảnh là hai thứ khác biệt. Nhưng tôi quan niệm chúng chỉ là một. Thực chất chữ hay ký tự cũng chỉ là một dạng hình ảnh vì chúng cũng được cấu thành từ các pixel (điểm ảnh) mà ra.

Thông thường, khi dịch một game tiếng Nhật sang tiếng Việt thì việc đầu tiên bạn cần làm là vẽ lại bộ font. Tiếng Nhật dùng ký tự Kana và Kanji, bạn cần xóa chúng đi để vẽ lại một bộ font chữ La Tinh mới, có dấu tiếng Việt. Ở phần này bạn có thể áp dụng kiến thức chỉnh sửa hình ảnh ở phần trước để làm.
Đầu tiên, mở giả lập Snes lên và load game Final Fantasy IV. Ở đầu game, bạn sẽ thấy đoạn hội thoại giữa các binh sĩ với nhân vật Cecil như hình dưới đây.



Bây giờ dùng Yy-chr để load Rom, kéo xuống địa chỉ $57400 (đối với Rom có header và $57200 đối với Rom không header), chọn chế độ view 2BPP GB, bạn sẽ thấy được font chữ tiếng Nhật dùng trong game.



Áp dụng những điều đã học ở phần trước, hãy thay đổi font chữ và save lại. Ở đây tôi đã thay ký tự kana “he” bằng chữ “a” La Tinh, thay kana “i” bằng “b” và thay kana “shi” bằng “c” La Tinh. (Chú ý chỗ đánh dấu tròn màu xanh trong hình bên dưới). Nhớ save lại Rom (Ctrl + s), mở lại giả lập và chơi đến đoạn lúc nãy, bạn sẽ thấy thành quả của mình.





Như vậy là cụm từ “heishi” (binh sĩ) bằng ký tự Kana của tiếng Nhật đã được thay thế bằng ba chữ abc mẫu tự La Tinh. Bạn đã hiểu ra phần nào chưa?
Hình lỗi hết rồi anh ơi, khó hình dung quá
 

Bình luận bằng Facebook

Pokémon Center

Pokémon Center Việt Nam

Cộng đồng Facebook của NintendoVN

Top