Tut - Tool Game 4D: God of War series

Thảo luận trong 'Tut - Tool hướng dẫn dịch game' bắt đầu bởi Yugisokubodai, 25/12/16.

Tags:
  1. Yugisokubodai

    Yugisokubodai Làm dâu trăm họ Dịch Giả

    287
    1,141
    93
    Nam
    A. Khái quát

    I. Giới thiệu chung

    God of War: Ghost of Sparta (tạm gọi: Chiến thần-vong linh xứ Sparta) là phiên bản thứ 6 trong series God of War (từ đây về sau gọi tắt là GOW) và là bản game thứ 2 được phát hành cho máy Sony PlayStation Portable (từ đây về sau gọi tắt là PSP) vào tháng 11 năm 2010. Ghost of Sparta (từ đây gọi tắt là GOS) được phát hành sau phiên bản Chains of Olympus (từ đây gọi tắt là COO) và có nội dung xảy ra khoảng giữa thời gian của các sự kiện trong phiên bản đầu tiên và phiên bản thứ hai trên máy Sony PlayStation 2.

    Cả hai phiên bản GOS và COO cho máy PSP sau đó đều được phát hành chung trong đĩa GOW Collection cho máy PlayStation 3. GOS phiên bản tiếng Nhật được gọi là "Kōtan no kokuin" (tạm dịch: dấu khắc đản sinh, ám chỉ vết chàm trên người Deimos, em trai của Kratos).

    + Tên: GOW GOS
    + Thể loại: 4D (bốn đê: đụng đâu đánh đó)
    + Số người chơi: 01
    + Hệ máy: Sony PSP/ giả lập PSP trên các nền tảng khác
    + Bản dịch Việt ngữ: Asm65816

    II. Nội dung

    Ở phiên bản đầu tiên, Kratos là một con người trần thế đoản mệnh, trong lúc nguy cấp đã cầu xin chiến thần Ares đánh bại kẻ thù của mình và bù lại, Kratos sẽ hiến linh hồn cho Ares. Điều kiện được chấp thuận, Kratos đánh bại mọi kẻ thù của mình dưới sự điều khiển của Ares. Kratos trở thành chiến binh bất bại vô cảm trong tay Ares, và tự tay sát hại chính vợ con mình. Sau cái chết của người thân, Kratos bừng tỉnh và căm hận Ares, lấy tro hài cốt của vợ con khắc lên mình nên bị người đời gọi là "vong linh xứ Sparta".
    Để chuộc lại lỗi lầm, Kratos đến sa mạc chết dưới sự dẫn dắt của Nữ thần trí tuệ Athena, tìm chiếc hòm Pandora ẩn chứa sức mạnh giết chết các vị thần. Có được Pandora, Kratos lấy mạng Ares trong trận giao tranh và trở thành chiến thần giữa các vị thần trên đỉnh Olympus.

    Mở đầu GOS, Kratos tuy đã yên vị trên đỉnh Olympus trong tư cách một vị thần nhưng vẫn luôn bị ký ức của một con người năm xưa ám ảnh, dày vò. Kratos biết rằng mình phải ra đi tìm câu trả lời cho nỗi ám ảnh này. Câu trả lời nằm ở thần điện Poseidon sâu thẳm dưới đáy biển Atlantis...


    III. Bản dịch Việt ngữ

    [​IMG]
    [​IMG]

    GOS được bạn Bánh Mì (diễn đàn PSPVN) dịch Việt văn lần đầu tiên, nhưng bản dịch này có nhiều hạn chế:

    + Không có dấu tiếng Việt
    + Số lượng chữ của câu dịch không vượt quá số chữ câu gốc, dẫn đến ý nghĩa câu bị thay đổi, biến dạng ở một số chỗ
    + Một số lỗi sai ngữ nghĩa về mặt dịch thuật

    Bản dịch Việt văn do Asm65816 thực hiện sử dụng kỹ thuật disassembly ngôn ngữ RISC MIPS R4000 nên khắc phục được các nhược điểm trên:

    + Đầy đủ dấu tiếng Việt
    + Số lượng chữ không bị giới hạn, nên tự do diễn đạt đầy đủ ý của câu
    + Bản dịch dựa trên nền Nhật ngữ, có tham khảo bản tiếng Anh để bảo đảm giữ trọn ngữ nghĩa


    IV. Kredit

    + Asm65816: dịch thuật, assembly hack
    + Cộng Mạng: biên tập, chỉnh lý, playtest
    + Công cụ sử dụng: giả lập kiêm debugger PPSSPP + kiến thức Risc Mips R4000

    Bản dịch này là một bài tập thử nghiệm kiến thức Risc Mips.

    V. Download

    Link sẽ được cung cấp sau khi hoàn thành bài hướng dẫn ở mục B.


    B. Hướng dẫn dịch thuật

    Từ phần này trở đi là hướng dẫn kỹ thuật để chuyển ngữ GOW GOS sang tiếng Việt, hay bất cứ thứ tiếng nào khác. Phiên bản GOW COO có cùng cấu trúc với GOS nên phần hướng dẫn này cũng có thể áp dụng để dịch COO.

    I. Chuẩn bị

    Danh mục những thứ cần có, cần biết. Thứ gì chưa có, chưa biết thì tra Gu Gồ. Tất cả những thứ bên dưới tôi có được cũng nhờ chịu khó hỏi xin Gu Gồ.

    1. Kiến thức:

    + Cách sử dụng Hex editor
    + Kiến thức vệ hệ số thập phân và thập lục
    + Kiến thức chung về dịch game
    + Kiến thức phần cứng PSP (biết càng tốt)
    + Kiến thức ngôn ngữ assembly của PSP (biết càng tốt). PSP dùng Mips R4000, nếu biết các đời Mips khác cũng là một lợi thế

    2. Công cụ:

    + Hex editor
    + Text editor
    + Phần mềm gõ dấu tiếng Việt
    + Atlas text inserter (tải từ Romhacking.net hoặc tự code)
    + Catographer text dumper (tải từ Romhacking.net hoặc tự code)
    + Phần mềm xem đồ họa kiểu mảng: Tilemolester hoặc Crystal tile
    + Giả lập kiêm Debugger PPSSPP

    Tham khảo:

    + Hướng dẫn dịch game (PC/console): click
    + Các bài hướng dẫn cụ thể cho từng game (click)
    + Tìm hiểu về Assembly hacking (tiếng Anh) (click)
    + Khái quát về Risc Mips (tiếng Anh) (click)

    Tại sao phải dùng đến Assembly hack?

    + Một phần mềm được viết ra, nếu không có mã nguồn thì rất khó hoặc không thể can thiệp/thay đổi nó. Game cũng vậy.
    + Vì không có mã nguồn nên cần phải xem các lệnh mà máy (console) xử lý khi phần mềm (game) đang chạy để từ đó hiểu được phần mềm được viết như thế nào --> lập đối sách.
    + Cần có debugger để xem các lệnh CPU xử lý khi game đang chạy.
    + Cần có kiến thức về ngôn ngữ Assembly (ở đây là Mips R4000) để hiểu được các lệnh CPU xử lý khi đang chạy game
    + Việc debug + khả năng đọc hiểu ngôn ngữ Assembly giúp ta hiểu được chính xác, một cách tuyệt đối những gì có trong game.
    + Những thủ thuật hack/dịch game đều là kết quả ứng dụng của Assembly hack.
    + Nếu không debug và không hiểu Assembly thì các thủ thuật hack/dịch game như con người không có mắt, mò mẫm trong bóng tối mà không biết mình đang đi đâu, làm gì.
    + Nếu không debug và không hiểu Assembly thì các thủ thuật hack/dịch game sẽ không phát huy hết tác dụng. Các thủ thuật này sẽ trở nên vô dụng khi gặp những game có thuật toán lạ hoặc khi gặp các thuật toán nén/mã hóa. Thường thì các thủ thuật hack, dịch game thông thường chỉ đáp ứng khoảng 60% nhu cầu cơ bản trong việc hack, dịch.
    + Kiến thức Assembly + việc debug mang lại ma thuật cho người sử dụng: bạn có thể làm bất cứ trò gì, miễn là trong khả năng của phần cứng.
    + Rom GOW GOS tiếng Nhật
    + Phần mềm CD Mage hoặc UMD Gen

    (Còn tiếp)

     
    Chỉnh sửa cuối: 2/1/17
  2. huntersun

    huntersun Thành viên cấp 1

    83
    40
    18
    Nam
    Đã chơi xong phần GOW: Bóng ma thành Spartan :D
     
  3. mowes.lh

    mowes.lh Thành viên mới

    8
    0
    1
    Nam
    Thái Nguyên
    tiếp đi ad ơi, cũng muốn học cách debug app :)
     
  4. willyamspencer

    willyamspencer Thành viên mới

    1
    0
    1
    Nam
    tphcm
    bản âm thanh này là bản tiếng tây ban nha hả ???
     
  5. ngthduong1996

    ngthduong1996 Quản trị viên Thành viên BQT

    1,039
    243
    63
    Nam
    Nha Trang
    tiếng Nhật đấy. Chủ bài viết thường hay dịch từ tiếng Nhật.
     
  6. LordEmperor

    LordEmperor Thành viên cấp 1

    game này 2 bản olympus và ghost trên PSP có việt hoá rồi nè
     
  7. ngthduong1996

    ngthduong1996 Quản trị viên Thành viên BQT

    1,039
    243
    63
    Nam
    Nha Trang
    Ừ, là Việt ngữ không dấu và câu Việt ngữ không dài hơn câu gốc nên dẫn tới có những ý bị thay đổi.
     
  8. Stefano

    Stefano Thành viên mới

    11
    0
    1
    Nam
    hanoi
    klq , mình rất ghiền game này , ai cho mình link down cả giả lập chơi được không :(
     
  9. vinet4u

    vinet4u Thành viên cấp 1

    64
    11
    8
    Nam
    Stefano thích bài này.
  10. Stefano

    Stefano Thành viên mới

    11
    0
    1
    Nam
    hanoi
  11. ngthduong1996

    ngthduong1996 Quản trị viên Thành viên BQT

    1,039
    243
    63
    Nam
    Nha Trang
    Bạn có thể tải giả lập cho PC ở đây: http://www.ppsspp.org/
    Game bạn có thể tải ở bài viết mà bạn vinet4u đưa
    Cách chỉnh cấu hình giả lập có thể coi ở đây:
     
    Stefano thích bài này.
  12. Tnk24

    Tnk24 Thành viên cấp 1

    43
    4
    8
    Nam
    Mong chủ top vh game này rất hay nhưng chỉ có tiếng Nhật [​IMG]
     
    anhduy1661 thích bài này.
  13. Tnk24

    Tnk24 Thành viên cấp 1

    43
    4
    8
    Nam
    Game kenka banchou bros tokyo battle royale cũng hay
    Screenshot_2017-01-01-19-27-48.png
     
    anhduy1661 thích bài này.
  14. anhduy1661

    anhduy1661 Thành viên mới

    13
    1
    3
    Nam
    Saigon
    Ways of samurai 2 psp cũng hay lắm dịch đi asm đại hiệp :(
     
  15. Yugisokubodai

    Yugisokubodai Làm dâu trăm họ Dịch Giả

    287
    1,141
    93
    Nam


    II. Quy trình

    1. Mua vui một vài trống canh

    Quy trình để chuyển ngữ một game từ ngôn ngữ này sang ngôn ngữ nọ luôn có những bước chính sau đây, chung cho mọi hệ thống, dù đó là PC, Snes, PS, Xbox, Genesis hay gì đi nữa.

    - Tìm, xác định bộ font và sửa đổi nó
    - Tìm và xác định text (thoại, chữ) trong ngôn ngữ nguồn, sửa đổi nó sang ngôn ngữ đích

    Đây là hai bước chủ chốt, bất di bất dịch, luôn được áp dụng trong mọi trường hợp. Tuy nhiên trong thực tế, ta có thể phải làm nhiều bước nhỏ hơn để đến được hai cái đích lớn này, tùy từng trường hợp. Các bước nhỏ hơn có thể là:

    - Giải nén font/text nếu chúng bị nén
    - Giải mã font/text nếu chúng bị nén
    - Nén lại font/text sau khi chỉnh sửa
    - Mã hóa lại font/text sau khi chỉnh sửa
    - Viết lại chương trình để tối ưu hóa việc hiển thị/đọc text
    - Chỉnh sửa độ rộng của từng ký tự cho phù hợp với văn bản ngôn ngữ đích
    - Viết chương trình độ rộng biến thiên theo từng ký tự cho phù hợp với ngôn ngữ đích, nếu như trong ngôn ngữ nguồn không có chương trình này
    - Trích xuất (dump) text từ Rom/game ra ngoài file văn bản
    - Chèn text đã dịch vào Rom/game

    Trên đây chỉ là một số vấn đề nho nhỏ thường gặp trong quá trình dịch game. Đối với các yêu cầu đầu tiên thì đòi hỏi phải có kiến thức chuyên sâu vào game mình cần dịch, hay nói nôm na là kiến thức về ngôn ngữ để viết nên game đó. Cụ thể ở đây là ngôn ngữ Assembly Mips, cộng với kiến thức về đặc trưng phần cứng của hệ máy, nó sẽ giúp ta xác định mọi thứ trong cái game cần dịch.

    Ngoài lề: bản thân tôi không phải lập trình viên, không học ngành IT nhưng nhờ ham đọc tài liệu (sách + Google) mà đã có được một số kiến thức cơ bản về phần cứng, Assembly cho các hệ máy. Do vậy đừng nghĩ những gì tôi đề cập bên trên là cao siêu vượt quá tầm của bạn.

    2. Cấu trúc đĩa

    Game cho PSP được lưu trữ trên đĩa UMD do chính Sony phát triển, nó có thể chứa tối đa 1.8GB dữ liệu nên việc tìm kiếm một thứ gì đó trong đĩa sẽ rất khó, hoặc không thể nếu không có phương pháp tìm kiếm khoa học.
    Đầu tiên cần biết về cấu trúc dữ liệu của game PSP lưu trên UMD.

    - Thư mục gốc\UMD_DATA.BIN chứa các thông tin về đĩa game như mã số game, phân vùng khu vực.
    - Thư mục gốc\PSP_GAME chứa các Icon ở định dạng PNG, các file thông tin khác và hai thư mục quan trọng là SYSDIR và USRDIR.
    - SYSDIR chứa file EBOOT.BIN, đây là file khởi động của PSP, tương đương với file .exe trên PC. Nói chung chỉ cần nhìn tên là biết SYSDIR là thư mục hệ thống.
    -USRDIR là thư mục User, tùy từng nhà sản xuất game mà tên gọi file, folder bên trong đó khác nhau. Đây là nơi chứa dữ liệu của game.

    Nếu bạn mở GOW GOS (bản tiếng Nhật) bằng CD Mage hoặc UMD thì sẽ thấy cấu trúc file/folder như hình dưới đây.

    [​IMG]
    [​IMG]

    Bạn có thể dùng bất kỳ phần mềm nào khác để mở file ISO, ở đây tôi quen dùng CD Mage.

    III. Bắt tay vào việc: tìm và xử lý font chữ

    1. Khái niệm về font

    Trước tiên cần hiểu khái niệm font chữ. Từ "font" bao hàm cả hai ý nghĩa sau:

    - Diện mạo (cao gầy béo lùn to tròn...) hay ngoại quan của chữ
    - Dữ liệu (gồm 0 và 1) cấu thành nên cái diện mạo bên trên

    Đối với người dùng máy tính ở cấp phổ thông thì khi nói tới font, người ta chỉ nói tới cái ý nghĩa thứ nhất (như font Arial, font Tahoma... là nói tới ngoại quan). Còn ở cấp sâu hơn, phải đề cập tới ý nghĩa thứ hai. Vì lý do này mà hay nghe nhiều bạn kêu khổ:

    - Game này không hỗ trợ font tiếng Việt, em gõ dấu toàn ra lỗi
    - Game này không dùng font Unicode, em không Việt hóa được

    Đó là do chưa hiểu rõ về bản chất của font.
    Về bản chất thì font chữ cũng chỉ là một dạng hình ảnh đồ họa. Tất cả mọi thành phần được hiển thị trên màn hình PC, console đều là đồ họa hết, dù ở định dạng gì đi nữa.

    Dòng PS của Sony, trong đó có PSP là máy chơi game sử dụng đồ họa pixel. Trái với các dòng NES, SNES của Nintendō là đồ họa dạng mảng (tile). Đối với hai loại máy của Nintendō thì một đơn vị đồ họa nhỏ nhất mà máy thể hiện được là một ô vuông 8x8 pixel, còn đối với dòng PSP thì đơn vị nhỏ nhất là 01 pixel, tức là chiếm diện tích nhỏ hơn 64 lần, khiến hình ảnh mịn hơn.

    Quay trở lại ý nghĩa thứ hai của font, về bản chất nó là một chuỗi dài gồm 0 và 1. Khi máy gặp phải giá trị 0, nó sẽ thể hiện khoảng trống ra màn hình. Còn khi gặp giá trị 1, nó thể hiện một điểm (pixel) ra màn hình.

    Lấy ví dụ về chữ "a" có kích thước 8x8 pixel như dưới đây. Ta xem những ô trống là 0 (không hiển thị ảnh), những ô có hiển thị ảnh là 1 thì chữ “a” sẽ như sau.

    [​IMG]

    Đổi chuỗi này sang hệ thập lục, ta được $387EC6C6C6C67F3B. Đây là giá trị cho chữ “a” nếu ta xem bằng Hex editor. Còn khi máy tính (Super Famicom) hoạt động, nó chỉ hiểu được chuỗi
    11100001111110110001101100011011000110110001100111111100111011 mà thôi.

    Ngoài ra còn có khái niệm bitplane, hay bit per pixel. Chữ "a" bên trên là 01 bpp (1 bit cho mỗi pixel) nên nó có hai trạng thái màu: không màu (giá trị 0) và có màu (giá trị 1). Đối với 2bpp, hình ảnh sẽ có 4 màu, 4bpp là 8 màu...

    Lấy ví dụ về chữ "a" bên trên, nhưng lần này là 2bpp. Thực chất, 2 bpp là dạng triển khai của 1 bpp, trong đó có 1 bit plane thể hiện phần thịt của chữ, 1 bit plane còn lại thể hiện phần bóng mờ của chữ. Nếu font càng sử dụng nhiều bit plane thì nó sẽ có nhiều cấp độ bóng mờ. Nhiều game console sau này sử dụng font nhiều bit plane để tạo ra hiệu ứng đổ bóng nhiều màu, nhiều cấp độ để việc hiển thị chữ được đẹp hơn, rõ ràng hơn so với việc chỉ dùng 1 bit plane (chỉ gồm phần thịt của chữ, không có bóng).

    [​IMG][​IMG]

    Lồng ghép vào nhau

    [​IMG]


    2. Xác định font

    GOW GOS có nhiều chế độ ngôn ngữ. Bản EU có các ngôn ngữ: Anh, Pháp, Ý, Hy Lạp... trong một đĩa UMD. Còn bản JP có hai ngôn ngữ: Nhật và Anh trong cùng một đĩa UMD. Đối với giả lập PPSSPP, nó sẽ tự động chọn ngôn ngữ trong game dựa vào ngôn ngữ của giả lập.

    Đầu tiên, hãy chọn ngôn ngữ tiếng Anh cho giả lập PPSSPP. Ta sẽ tìm font chữ trong bản tiếng Anh. Vào game, chụp lại ảnh màn hình đầu tiên.

    [​IMG]

    Phóng to phần chữ trong phần mềm xem ảnh, để ý kỹ thì sẽ thấy phần chữ có 16 màu. Tức font chữ ở đây là 4bpp.

    [​IMG]

    Bây giờ chọn New Game để xem cảnh mở đầu của GOS. Từ giao diện PPSSPP, vào Debug --> GE Debugger hoặc dùng phím tắt Ctr + G để bật Debugger đồ họa của PPSSPP.

    Trong GE Debugger ta thấy có các nút sau và ý nghĩa của chúng sau một thời gian mày mò:

    - Step frame: dừng game và cho biết các lệnh xử lý mọi thành phần đồ họa trong frame (khung hình) tiếp theo.
    - Step Tex: dừng game và cho biết các lệnh và thông tin liên quan tới texture đang được xử lý. Font chữ cũng là một dạng texture.
    - Step Draw: dừng game và cho biết các lệnh và thông tin liên quan tới những gì sẽ được vẽ ra màn hình
    - Step Prim: dừng game và thể hiện các thành phần trong texture sắp được vẽ ra màn hình. Những thành phần này được bôi đỏ ở khung preview bên phải.
    - Step Into: dừng game và đi vào từng lệnh đồ họa một, ở cấp chi tiết nhất, hết lệnh này đến lệnh kia.
    - Resume: thoát khỏi chế độ debug, cho game tiếp tục chạy.

    [​IMG]

    Như vậy, sau khi click vào ô "Step Tex" nhiều lần, ta sẽ thấy hình ảnh font chữ hiện ra ở khung preview bên phải. Bên dưới là dòng thông tin:

    - Texture L0: 0x8cfd3d0 (128x128)

    Dòng này có ý nghĩa: Texture (font) cấp độ 0 nằm ở địa chỉ 0x8CFD3D0 trong Ram và bộ font này có kích thước 128x128 pixel.
    Đọc tài liệu kỹ thuật về PSP, ta biết được console này có Ram 24MB, bắt đầu từ địa chỉ 0x08800000. Đối với các loại console cũ như NES, SNES do dung lượng Ram hạn chế nên CPU đọc dữ liệu và lệnh xử lý từ Rom. Còn đối với những dòng console đời sau, cấu hình mạnh hơn và nhiều Ram hơn thì CPU thường copy dữ liệu, lệnh từ Rom vào Ram, sau đó mới đọc các dữ liệu này từ Ram.

    [​IMG]

    GOW GOS cũng đọc dữ liệu từ Ram. Bây giờ, từ giao diện PPSSPP vào Debug --> Memory View (hoặc Ctrl + M) để mở công cụ xem Ram. Gõ địa chỉ 0x8CFD3D0 vào ô "Goto", Enter để đi đến địa chỉ này. Tại đây ta thấy được dữ liệu của font ở khung preview bên phải.
    Từ đây ta có hai cách xác định dữ liệu này nằm ở đâu trong đĩa UMD.

    Cách thủ thuật:

    - Để ý tìm một chuỗi giá trị đặc trưng trong Memory View. Ở đây tôi để ý đến chuỗi 20 22 62 00 30. Bạn có thể dùng chuỗi khác.
    - Mở file ISO bằng Hex editor, tìm chuỗi kể trên. Kết quả tôi tìm được chuỗi này nằm ở 0x4A955E75 trong file ISO. Nói cách khác, dữ liệu font bắt đầu ở 0x4A955E10.
    - Đọc tài liệu kỹ thuật về đĩa CD/UMD thì ta biết khái niệm LBA. 1 LBA = 0x800 byte. Lấy địa chỉ 0x4A955E10 chia cho 0x800 ta được 0x952AB hay 610987. Điều này cho thấy dữ liệu font nằm ở vị trí LBA 610987.
    - Quay trở lại phần cấu trúc UMD, ta thấy file PSP_GAME\USRDIR\DATA\ENGLISH\GAME.BIN bắt đầu ở LBA 610960 và kết thúc ở 610991. Dữ liệu font nằm ở LBA 610987 thuộc phạm vi này, như vậy ta kết luận font chữ nằm ở file PSP_GAME\USRDIR\DATA\ENGLISH\GAME.BIN.


    [​IMG]
    [​IMG]

    Cách khoa học:

    Nếu đọc tài liệu kỹ thuật của PSP, ta biết CPU MIPS có khái niệm gọi là "syscall". Có thể hiểu nôm na nó là chức năng của hệ điều hành, nói rõ hơn là chức năng của kernel. Khi phần mềm (game) đang chạy, nếu nó gặp lệnh syscall thì nó sẽ giao quyền xử lý cho hệ điều hành.

    Đối với MIPS, chức năng của syscall phụ thuộc vào giá trị của register $v0. Chẳng hạn, giá trị này là 1 thì kernel sẽ in con số nguyên ra màn hình console, nếu giá trị này là 4 thì kernel sẽ in chữ ra màn hình console...

    Lấy ví dụ:

    text: asciiz "Hello"

    la $a0, text #đưa địa chỉ chuỗi text vào $a0
    li $v0, 4 # đưa giá trị 4 vào $v0
    syscall #in ra màn hình console chuỗi text "Hello"

    Tùy vào giá trị của $v0 mà nội dung của syscall sẽ khác nhau. Và cũng tùy nội dung mà các tham số cũng thay đổi. Đối với chức năng syscall này thì tham số là register $a0, nhưng đối với chức năng khác thì lại cần $a1, $s0....

    Quay trở lại vấn đề chính, ta đã biết dữ liệu font bắt đầu tại địa chỉ 0x8CFD3D0 trong Ram. Tiếp theo:

    - Từ giao diện PPSSPP --> Debug --> Disassemble (Ctr + D).
    - Đặt địa chỉ breakpoint: 0x8CFD3D0, chỉ tích mục "write". Điều này có nghĩa là bất cứ khi nào CPU ghi dữ liệu vào địa chỉ trên, nó sẽ dừng game để ta có thể truy lại các lệnh xử dẫn đến việc ghi dữ liệu vào vùng Ram trên.
    - Reset lại game (vì GOS ghi font vào Ram từ lúc đầu), lúc này CPU sẽ ngừng xử lý game.
    - Khi CPU ngừng game, lần lượt click vào "Step Into" để đi vào từng lệnh chi tiết. Sau một vài lệnh, ta thấy dòng xử lý di chuyển tới 0x880868C trong Ram với nội dung: JAL zz_sceIoRead và giá trị $v0 lúc này là FE18, kích thước của file cần đọc.
    - zz_sceIoRead là chức năng syscall đọc file từ đĩa UMD của PSP. Chức năng này sử dụng tham số đường dẫn đến file đã mở trong chức năng zz_sceIoOpen trước đó. Tham số $s3 cho ta biết thông tin về vị trí của file cần đọc trên đĩa.
    - Giá trị của $s3 lúc này là 8CFF4A4. Nhảy tới địa chỉ này trong Ram và ta thấy được thông tin về vị trí file trên đĩa:

    disc0:/PSP_GAME/USRDIR/DATA/ENGLISH/GAME.BIN


    [​IMG]

    [​IMG]

    [​IMG]



    Như vậy, ta đã xác định được file chứa dữ liệu font: GAME.BIN. Đây là một file hỗn hợp gồm nhiều file nhỏ khác nhau. Mở file bằng Hex editor, dễ dàng xác định phần "file chứa font bắt đầu từ 0xDDB0 nhưng dữ liệu font thật sự bắt đầu ở DE10 vì 0x60 byte đầu tiên là header.

    Copy dữ liệu từ 0xDDB0 đến hết file GAME.BIN, tạo thành file mới và mở bằng các phần mềm như Crystal Tile hay Tile Molester, điền các thông số như bpp (mà ta đã xác định ở bước đầu tiên) ta sẽ thấy được hình ảnh font.

    [​IMG]

    Lúc này chỉ cần export hình ảnh ra dạng PNG hoặc BMP, chỉnh sửa bộ font này rồi import vào GAME.BIN là kết thúc công việc.

    Lưu ý: nếu dùng phần mềm Tile Molester thì phải chèn thêm một số dummy byte vào cuối file để nó hiển thị hết bộ font. Đây là bug của phần mềm.




    (Còn tiếp)
     
    Chỉnh sửa cuối: 15/1/17
  16. Yugisokubodai

    Yugisokubodai Làm dâu trăm họ Dịch Giả

    287
    1,141
    93
    Nam
    Hình như game đó có tiếng Anh, bạn tham khảo khía cạnh kỹ thuật ở đây rồi tự dịch cũng được.
     
    anhduy1661 thích bài này.
  17. anhduy1661

    anhduy1661 Thành viên mới

    13
    1
    3
    Nam
    Saigon
    Bản psp không có ạ. Nếu là tiếng anh thì quá dễ rùi ạ. Mà psp nhìu game hay mà toàn tiếng nhật không
     
  18. [DC]

    [DC] Thành viên cấp 1

    80
    51
    18
    /
    Biết thêm cách hay.|-)

    ---
    4bpp -> 2^4 = 16 colors
    Sao ở trên đếm 8 màu -> 4bpp được vậy drunk~~?

    Nếu bạn xem thêm vài file "RADI" khác sẽ thấy header thường kết thúc bằng "NULL"
    Trong header có 2 pointer đến offset 0x20 và 0x60
    Block từ 20->5F là palette.
    Font fixed (hình trái)
    [​IMG]

    Mà sao xác định được size tile 32x8 vậy ?drunk~~

    ---
    Đoạn ví dụ $v0 có vẻ đúng, nhưng ở dưới $v0 = FE18 thì là sceIoRead
    lại không đúng rồi, mình lại thấy nó bằng với $s1 (lúc này là số byte muốn đọc)
    giá trị này có vẻ là giá trị trả về (số byte đã đọc được = size game.bin)

    "$s3 lúc này là 8CFF4A4" ~ trên ram là 05000000 18FE0000
    Cái thông tin lại ở 8CFF530, sao nằm xa vậy @@? (chắc là đoándrunk~~)

    ps: Có vẻ nhiều lỗi, nhưng vẫn hayYes~~
     
  19. Mugiwara

    Mugiwara Thành viên cấp 2

    Qua bên gamevn thấy mấy ông bàn luận về cái tên Ghost of Sparta nên dịch ra thế nào thì hay :v
    Cuối cùng kết thúc với cái tên " Cô hồn xứ Sparta ", buồn cười thật giggle~~
     
  20. Yugisokubodai

    Yugisokubodai Làm dâu trăm họ Dịch Giả

    287
    1,141
    93
    Nam
    1. Thanks bạn đã nhắc đoạn 4bpp. Đúng là 16 màu chứ không phải 8 màu.
    Viết đêm khuya nên mắt quáng gà và cũng quên nói nhiều đoạn.
    2. Cái pointer trong header ban đầu định nhắc tới nhưng quên, sẽ đề cập ở phần sau vì nó chỉ có lợi trong việc mở rộng file text trong trường hợp bản dịch dài hơn bản gốc.
    3. Xác định 32x8 là có cơ sở, mình tôi không nhắc tới ở đây vì viết dài quá buồn ngủ rồi. Sau khi xác định được bộ font nằm ở file nào, vào Step Prim để biết chính xác chữ cái nào nằm trong đoạn dữ liệu nào. Lúc này bạn có thể thử thay đổi một số byte trong vùng dữ liệu đó, load game và quan sát kết quả thay đổi sẽ rõ. (Thực ra là tôi load cả trăm lần mới biết được)
    4. Đoạn syscall thì bạn nói đúng rồi, FE18 là kích thước file và $v0 là trung gian chuyển giá trị đó qua $s2.
    5. Đoạn cuối không rõ bạn nói gì?
     

Chia sẻ trang này