Hướng dẫn dịch game Console

Thảo luận trong 'Thảo luận chung & Trình giả lập' bắt đầu bởi asm65816, 5/6/10.

  1. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    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

    [​IMG]

    Đâ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

    [​IMG]


    Đâ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.

    [​IMG]

    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.

    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]



    (To Pea Kontinue)



    Hướng dẫn dịch thuật FF9 cho máy PlayStation

    [video=youtube;uz3VuN_o9bQ]https://www.youtube.com/watch?v=uz3VuN_o9bQ[/video]
     
    Chỉnh sửa cuối: 16/1/15
  2. Flag.VietNam

    Flag.VietNam Mr & Ms Pac-Man

    Tham gia ngày:
    28/5/10
    Bài viết:
    217
    Mình đọc qua bài này thì thấy rất thích, nhưng tải phần mềm về, bật lên thì nó giống như 2 bức hình mà đưa ra ở trên :| Một bên là số, một bên là chữ ngoằn ngoằn... vậy dịch thì phải làm gì tiếp theo?

    Hy vọng bạn sẽ có bài viết hướng dẫn phần này, cảm ơn.
     
  3. Scorpion06

    Scorpion06 Legend of Zelda

    Tham gia ngày:
    22/3/07
    Bài viết:
    1,139
    Nơi ở:
    Heaven
    Ông kêu gọi cả ở đây nữa à. Mà cho tôi xin cái yahoo với nhé, cho tiện liên lạc.
     
  4. huuphuoc999

    huuphuoc999 Fire in the hole! Lão Làng GVN

    Tham gia ngày:
    4/7/06
    Bài viết:
    2,980
    Nơi ở:
    Ho Chi Minh City
    Cài này có áp dụng cho game PSP ko
     
  5. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    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

    [​IMG]

    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

    [​IMG]

    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.

    [​IMG]
    [​IMG]

    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

    [​IMG]


    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
     
    tuannam1988 and rôngchiêntranh like this.
  6. X-9

    X-9 Donkey Kong

    Tham gia ngày:
    30/4/05
    Bài viết:
    457
    Nơi ở:
    Cas†leVania
    bác đã dịch hoàn thành được game nào rồi cho mình xin luôn đi
    thanks bác lắm lắm
     
  7. huuphuoc999

    huuphuoc999 Fire in the hole! Lão Làng GVN

    Tham gia ngày:
    4/7/06
    Bài viết:
    2,980
    Nơi ở:
    Ho Chi Minh City
    Bạn có thể HD mình cách làm patch language dc ko. Hè ko bik làm gì hết nên mò cách làm ấy mà
     
  8. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Bạn click vào chữ ký của mình

    Bạn cứ đọc đi.
     
  9. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    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.

    [​IMG]
    [​IMG]

    Để ý 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.

    [​IMG]
    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.


    [​IMG]


    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!

    [​IMG]

    Đó, 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.

    [​IMG]

    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.

    [​IMG]

    Á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.

    [​IMG]
    [​IMG]


    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?
     
    tuannam1988 and rôngchiêntranh like this.
  10. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    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”.

    [​IMG]

    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…

    [​IMG]


    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ả.

    [​IMG]
    [​IMG]

    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ả!

    [​IMG]
    [​IMG]

    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.

    [​IMG]


    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
     
    rôngchiêntranh thích bài này.
  11. tifa78910

    tifa78910 Mr & Ms Pac-Man

    Tham gia ngày:
    18/5/10
    Bài viết:
    234
    một kiến thức rất bổ ích, đang thử làm,thanks
     
  12. tankhanh1993

    tankhanh1993 Youtube Master Race

    Tham gia ngày:
    13/5/05
    Bài viết:
    92
    bạn có thể cho mình link down mấy cái game ở trên ko ?
     
  13. mbflgizt

    mbflgizt Youtube Master Race

    Tham gia ngày:
    10/11/06
    Bài viết:
    18
    Rất công phu và bổ ích.
    Cám ơn bạn rất nhiều. Có thể nói dịch được 01 game là một kỳ công đáng nể.
     
  14. Scorpion06

    Scorpion06 Legend of Zelda

    Tham gia ngày:
    22/3/07
    Bài viết:
    1,139
    Nơi ở:
    Heaven
    Link thì ông lên google mà hỏi nó, nếu không đủ kiên nhẫn tìm thì không dịch được game đâu.
     
  15. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    Table File

    Bạn có để ý, khi mở Rom bằng Hex editor như Windhex hoặc Stirling thì phía bên tay trái của cửa sổ chương trình là mã Hex của Rom còn nửa bên tay phải là các ký tự lằng nhằng không? Có bao giờ bạn tự hỏi ý nghĩa của chúng là gì?
    Ở đây tôi trả lời luôn rằng, trong Rom, mỗi một giá trị Hex đều có một ý nghĩa khác nhau. Nhưng thông thường thì trình Hex editor sẽ hiểu các giá trị đó dưới dạng ký tự ASCII. Chẳng hạn, khi nào Windhex gặp giá trị $4C thì nó sẽ thể hiện chữ L ở nửa bên phải, gặp $4D thì nó hiển thị chữ M, $4E là chữ N,…

    Trong code hội thoại của game console, từng giá trị Hex cũng được gán cho một ý nghĩa nhất định và thay đổi tùy theo game. Chẳng hạn, game này có giá trị $01 được hiển thị ra màn hình dưới dạng text là chữ a thì game khác lại có giá trị $3A là chữ a. Để rõ ràng hơn, hãy load Rom FF4 (Rom backup chưa bị sửa đổi gì) bằng Windhex, nhảy đến địa chỉ (Ctrl G) $8070B (với Rom không header và $8090B với Rom có header), bạn sẽ thấy dãy Hex A6-8B-95-B9-04-00-99-8B… Bây giờ hãy sửa 3 hex đầu là A6-8B-95 thành A6-A6-A6, save Rom và mở bằng giả lập, chơi đến đoạn hội thoại mở đầu game và bạn sẽ thấy kết quả:

    [​IMG]

    Như vậy, bằng việc chỉnh sửa 3 Hex đầu tiên tính từ địa chỉ $8070B thì dòng text trong game đã thay đổi từ “heishi” thành “hehehe”. Giờ hãy thử thay thế bằng 3 Hex khác là 8B-8B-8B, bạn sẽ thấy “heishi” biến thành “iii”.
    Từ đây bạn rút ra kết luận gì? Tôi nghĩ ngay cả người kém cỏi nhất cũng suy luận được rằng mã Hex $A6 là code hiển thị của chữ Kana “he” ra màn hình và $8B là code hiển thị của chữ Kana “i”. Tương tự ta có $95 là giá trị code của chữ Kana “shi”,…

    Bây giờ hãy tạo một file text (click chuột phải, chọn New, Text Document) với tên bất kỳ. Xác nhận xem file text bạn vừa tạo ra có phần mở rộng là .txt hay không?
    Nếu không thấy, bạn hãy Click vào mục Tools bên trên cửa sổ Windows (đối với Win XP), chọn mục Folder Options, chọn View và bỏ dấu chọn ra khỏi hộp thoại “Hide extensions for known file type”. Bằng cách này, bạn sẽ thấy được đuôi .txt của file text vừa tạo ra.

    [​IMG]

    Nếu đã làm như tôi hướng dẫn mà vẫn không thấy được đuôi .txt của file văn bản vừa tạo ra thì, xin chúc mừng!
    Máy tính nhà bạn đã dính con virus Kavo bất trị rồi! Nếu bạn là người trị được con Kavo thì chắc khỏi cần phải đọc những dòng hướng dẫn điên rồ này. Còn nếu đọc mà vẫn không hiểu tôi viết gì ở đoạn này thì tốt nhất là bạn nên đập máy tính, quay mặt vào tường ba tháng, tự vấn lương tâm xem vì sao mình vẫn chưa hiểu?

    Ô cê, bỏ qua vụ Kavo. Nhớ backup lại Rom FF4 cho nguyên vẹn. Giờ hãy mở file text vừa tạo, gõ vào A6=1, enter để xuống dòng, gõ tiếp 8B=2, enter, 95=3, nhấn Ctrl s để save file. Xong hãy đổi đuôi .txt của file văn bản vừa tạo thành .tbl.
    Đoạn, nhấn vào mục File của cửa sổ Windhex, chọn Open Table File, Table #1 rồi load file văn bản .tbl vừa nãy.

    Voila! Bạn có nhìn thấy bên phải của cửa sổ Windhex, từ địa chỉ $8070B đã hiện ra 3 ký tự 1, 2, 3 rồi không? Bây giờ mở lại file .tbl lúc nãy, edit A6=Hello, save file rồi dùng chức năng mở file Table của Windhex để load file .tbl này. Bạn sẽ thấy ở cửa sổ bên phải sẽ xuất hiện dòng chữ Hello23 ở vị trí 123 lúc nãy.

    [​IMG]

    File văn bản bạn vừa tạo ra được cộng đồng hack Rom gọi là Table file. Table là một file văn bản (text) có phần mở rộng .tbl và chứa các entry định nghĩa các giá trị Hex của Rom. Lưu ý là file Table chỉ làm thay đổi hiển thị của Windhex chứ không ảnh hưởng gì tới bản thân Rom cả.
    Như vậy bạn đã hiểu rõ công dụng của file table rồi chứ? Dĩ nhiên là nó có nhiều công dụng mà tôi sẽ lần lượt đề cập đến ở các phần sau, nhưng công dụng đầu tiên hơn hết là là giúp Windhex hiển thị rõ Hex code nào tương đương với chữ cái (hoặc chữ Kana) nào. Để làm gì ư? Cứ đọc tiếp sẽ rõ.

    Bạn click vào link dưới đây để tải file table của FF4 mà tôi đã lập sẵn cho bạn.

    http://www.mediafire.com/?zz2jzei2jun

    Sau khi tải về, load file table này bằng Windhex và quan sát kết quả


    [​IMG]

    Cái quái gì thế này? Bên phải cửa sổ là những ký tự loằng ngoằng!
    Đừng lo, hãy nhấn Ctrl D hoặc vào mục Option -- > View Text Data as Unicode và…

    [​IMG]

    Và như bạn thấy đó! Tất cả mọi câu thoại trong game đều hiện ra trước mắt bạn!
    Bằng cách lập file Table, bạn có thể load Rom bằng Windhex và kéo xuống dưới cho đến khi tìm được dữ liệu hội thoại của nó. Nếu không có file Table thì việc dò tìm địa chỉ của text hiển thị trong game khó khăn hơn rất nhiều.

    Bạn đã tìm được dữ liệu text hội thoại, vậy phải làm gì tiếp theo?
    Hãy thử nghịch thay đổi text hội thoại bằng cách thay đổi Hex code như bạn đã làm bên trên thử xem. Nhớ backup file trước khi nghịch.

    Bây giờ thử mở file ff4dump.tbl lúc nãy bạn tải xuống ra xem, trong đó sẽ có đoạn như thế này

    Mã:
    00=\n<end>\r
    01=<line>\r
    
    02=<new>
    03=<BGM>
    Có lẽ bạn sẽ thắc mắc những code này là gì?
    Để ý, câu nói đầu tiên trong game là của các binh sĩ nói với Cecil, dưới đây tôi sẽ viết lại câu này bằng chữ Kana và chữ La tinh

    Mã:
    Kana: へいし「セシルたいちょう!
    まもなく バロンにつきます! 
    Romaji: Heishi “Sesiru taichō!
    Mamonaku Baron ni tsukimasu! 

    Giờ hãy nhập Hex code $00 vào địa chỉ $80713 (vị trí của chữ ち trong câu đầu tiên), save Rom và load bằng giả lập, bạn sẽ thấy

    [​IMG]

    Như vậy câu nói bị ngắt ngay sau từ “tai” (trong taichō) mà không hiển thị tiếp thần còn lại. Nếu bạn nhấn A thì màn hình sẽ hiển thị câu tiếp theo chứ không hiển thị phần còn lại của câu lúc nãy. Vậy có thể kết luận rằng Hex code $00 có tác dụng kết thúc câu nói (để chuyển qua câu khác, nếu có) ngay tại vị trí của nó được không?
    Do đó trong file table., tôi đề là
    Mã:
    00=<end>
    nghĩa là giá trị của nó là để kết thúc câu (bạn có thể thay 00=<end> bằng 00=<das ende>, 00=<ketthuc>, 00={finish},… hay gì cũng được, cứ tùy nghi)

    Giờ hãy làm tương tự, nhưng thay vì nhập coe $00 thì hãy thay bằng code $01 và bạn sẽ được kết quả

    [​IMG]


    Vậy là có thể hiểu code $01 có tác dụng ngắt câu, chuyển phần text đứng liền sau nó xuống một hàng. Do đó trong file table tôi để
    Mã:
    01=<line>
    Giờ cũng làm tương tự, nhưng thay code $01 bằng code $03, save Rom rồi load bằng giả lập. Bạn thấy chữ ち biến mất trong câu nói vì nó bị thay thế bằng code khác tại vị trí của nó, và phần nhạc nền cũng biến mất. Giờ hãy nhảy tới địa chỉ $80714, tức là cách địa chỉ của code $03 vừa nhập 1 byte về phía sau. Edit code tại địa chỉ này thành $23, save rồi load giả lập, bạn sẽ thấy nhạc nền thay đổi so với lúc nãy.
    Cũng tại vị trí $80714, edit $23 thành $24, save và vào game, bạn lại nghe nhạc nền thay đổi lần nữa.
    Vậy là có thể kết luận rằng Hex code $03 làm thay đổi nhạc nền, và game sẽ load đoạn nhạc nào trong thư viện của nó ứng với số của Hex code đứng ngay sau $03. Do đó trong file table tôi đề
    Mã:
    03=<BGM>
    Những code $00, $01, $03 vừa rồi được dân trong nghề gọi là “Control code”, tức là code chức năng. Nó không trực tiếp làm nhiệm vụ hiển thị chữ nhưng nó gián tiếp can thiệp vào quá trình này hoặc làm một số chức năng khác. Nói nôm na, control code là những code điều khiển việc xuống dòng, ngắt câu, kết thúc câu, làm chữ to ra hay thu nhỏ lại, làm thay đổi màu chữ, chèn avatar của nhân vật, thay đổi nhạc nền, làm thay đổi tốc độ hiển thị chữ trên màn hình,…
    Chức năng của control code khá giống với BB code trong các diễn đàn.

    Game FF4 còn sử dụng nhiều control code khác nhưng ở đây tôi chỉ đưa ra cho bạn vài code điển hình nhất. Nếu muốn bạn có thể tự tìm hiểu lấy (bằng cách dò, thử thay đổi giá trị từ code $00 cho đến code $FF và quan sát tác dụng của nó). Mỗi game lại có số lượng control code khác nhau và giá trị cũng như tác dụng của nó cũng không giống nhau. Nắm được Control code là đã nắm được một khâu khá quan trọng trong việc hách dịch Rom. Nếu không làm chủ được nó, có nguy cơ project của bạn sẽ thất bại.
     
  16. huuphuoc999

    huuphuoc999 Fire in the hole! Lão Làng GVN

    Tham gia ngày:
    4/7/06
    Bài viết:
    2,980
    Nơi ở:
    Ho Chi Minh City
    Cách làm của bạn rất hay. :D. Mình đang tìm cách để patch language cho game PSP nhưng có vẽ phức tạp hơn này nhiều :D
     
  17. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    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.
    [​IMG]
    Tương tự, ta có vị trí tương đối của chữ R đối với chữ A là +17
    [​IMG]
    Đố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.
    [​IMG]
    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ả

    [​IMG]

    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à…

    [​IMG]


    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

    [​IMG]

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

    [​IMG]

    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

    [​IMG]

    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õ.
     
  18. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    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.

    [​IMG]

    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.
     
  19. huuphuoc999

    huuphuoc999 Fire in the hole! Lão Làng GVN

    Tham gia ngày:
    4/7/06
    Bài viết:
    2,980
    Nơi ở:
    Ho Chi Minh City
    [​IMG][/URL] Uploaded with ImageShack.us[/IMG]
    Mình thử dịch game kingdom heart:BBS ra.Tuy nó mới ra bản J nhưng Nó đã có bản ENG PAtch.Mình đã down bản patch này về nhưng ko hiểu sao 1 số chổ nó ko hiện đúng chữ. 1 số thì nó hiện kí hiệu:-?
    KO hiểu sao nữa. Hay là mình chưa chuyển về đúng dạng code nên bị lỗi chăn

    Mình mới tìm thêm dc patch KH:BBS đã dc Patch E. Tình hình dùng WindhEX xem file

    [​IMG][/URL] Uploaded with ImageShack.us[/IMG]

    Nếu bay h mình thay cái dòng ở trong khung đỏ ấy thành 1 đoạn tiếng việt ko dáu thì mình chỉ cần thay đổi chỉ số HEX bên trái thôi hay sao

    Bạn có yahoo ko. Có gì liên lạc với mình với
     
    Chỉnh sửa cuối: 22/6/10
  20. asm65816

    asm65816 Mega Man

    Tham gia ngày:
    23/5/09
    Bài viết:
    3,320
    Nơi ở:
    El Sallia
    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.

    [​IMG]

    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

    [​IMG]

    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.

    [​IMG]


    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:

    [​IMG]


    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.

    [​IMG]

    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.

    [​IMG]

    Đâ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.
     

Chia sẻ trang này