11 điểm bởi colus001 27 ngày trước | 3 bình luận | Chia sẻ qua WhatsApp

Vì sao đến giờ vẫn chưa có?

  • The Legend of Kyrandia, một series phiêu lưu point-and-click ra mắt từ 35 năm trước. Trong cả series, chỉ riêng phần 2, Hand of Fate, là chưa từng được bản địa hóa sang tiếng Hàn
  • Trong các engine được triển khai trong ScummVM, với SCUMM của Lucas hay SCI của Sierra thì có khá nhiều game được fan bản địa hóa, nhưng engine Kyra của Westwood thì gần như không có mấy bản dịch fan
    • Định dạng nhị phân độc quyền, render font chỉ tính đến 1 byte, và cũng không có đủ font cần thiết
  • Muốn bản địa hóa tiếng Hàn thì không thể chỉ đơn giản trích xuất rồi dịch, mà còn phải sửa mã render văn bản của engine Kyra trong ScummVM

Dịch thuật

  • Bản thân việc dịch không quá khó, script đã trích xuất được đưa qua LLM để dịch
  • Chỉ nhập một prompt đơn giản để giữ đúng tông của game, và nhìn chung hiện tại chưa thấy vấn đề lớn nào
    • Có vẻ những chi tiết tinh tế như chơi chữ hay ngôn ngữ giàu ẩn ý thì vẫn dịch chưa tốt

Reverse engineering

  • Các định dạng game độc quyền của Westwood: PAK (package), EMC (scene script), DLG (dialogue), ENG (UI text)
  • Reverse engineering từng định dạng và tạo công cụ Python
    • Dịch lần lượt EMC -> KMC, DLG -> DLK, ENG -> KOR rồi lưu vào OTHER.PAK
  • Sửa mã ScummVM để trong trường hợp bản dịch fan, game sẽ nạp các file đã dịch từ OTHER.PAK
  • Không cần phụ thuộc bên ngoài, chỉ với một dòng $ python tools/build_korean.py là build toàn bộ, đóng thành file .zip, rồi chép đè lên game gốc là xong

Font

  • Về cơ bản không có font tiếng Hàn, nên phải tự tìm
    • Từng có sẵn font tiếng Hàn từ bản phát hành chính thức tại Hàn Quốc của game cổ điển The Dig nên đã dùng lại
    • Cấu trúc font hơi khác một chút nên đã loại bỏ phần header
  • Thêm renderer font tiếng Hàn vào ScummVM
    • May mắn là hệ thống font dành cho bản dịch fan tiếng Trung đã có sẵn bitmap loading, render 1bpp, xử lý viền, và cả ghép 1 byte + 2 byte (MultiSubsetFont)
    • Kyrandia 1 từng có hệ thống font tiếng Hàn kiểu tổ hợp nên sẵn cả logic đọc 2 byte
    • Chỉ cần thêm logic chuyển cặp byte của EUC-KR thành glyph index
    • Ban đầu định xử lý gì đó với font tiếng Nhật trong bản FM-Towns, nhưng cuối cùng lại giải quyết khá dễ

Cuộc chiến với bug

  • Bug “gagagaga”
    • Hàm preprocessString() dùng để chỉnh các câu thoại dài theo bề rộng màn hình được viết dựa trên font 1 byte
      • \r bị chèn vào giữa chuỗi 2 byte khiến toàn bộ phần văn bản phía sau bị vỡ và hiển thị thành “gagagaga”
    • Khi nạp scene script, phần tham chiếu _scriptLangExt bị lỗi nên file tiếng Nhật được nạp thay thế
      • Vì cũng không có đúng font tương ứng nên tiếp tục hiển thị thành “gagagaga”
    • Cả hai đều do getFontOffset trả về 0 khi không tìm thấy ký tự tương ứng, và phải sửa chỗ này thì mọi thứ mới chạy đúng, khá vất vả
  • Game data not found
    • Từ lần chạy thứ hai trở đi thì game crash một cách kỳ lạ
    • Khi thoát game, ScummVM lưu ngôn ngữ là tiếng Hàn nên khâu detection bị lỗi
    • Tạm thời detection vẫn dùng tiếng Anh, rồi nếu có KOREAN.FNT thì lưu cờ này vào fanLang để xử lý. Đây cũng là cách làm đúng
  • Bug Chunk overread
    • Khi ScummVM IFFParser parse scene script KMC đã bản địa hóa, nó tạo lỗi Chunk overread
    • Khi đóng gói KMC theo chuẩn IFF, giá trị được lưu là form_size = file_size - 8, nhưng riêng Westwood lại lưu form_size = file_size
      • Offset không khớp nên phát sinh lỗi

Đóng góp cho ScummVM

  • Bản dịch fan được ScummVM chính thức hỗ trợ theo cách FLAGS_FAN(KO_KOR, EN_ANY)
    • Phần trước là ngôn ngữ bản dịch fan, phần sau là ngôn ngữ gốc
  • Sau khi engine khởi động, chế độ được chuyển trong kyra_hof.cpp để hỗ trợ tiếng Hàn thật sự và nạp các file dịch
  • Hệ thống phần mở rộng file khác nhau theo từng ngôn ngữ, mà với file DLG thì trên DOS tiếng Anh là DLE còn tiếng Đức là DLG
    • Ban đầu làm dựa trên FM Towns, đến khi làm thêm bản DOS thì đột nhiên tiếng Đức xuất hiện
  • Nếu không có KMC thì dùng EMC, để dù chưa dịch hết vẫn có thể chạy được
  • Đã gửi PR, và phản hồi không gay gắt như lo lắng ban đầu, chỉ cần sắp xếp lại các commit

Khả năng của AI

  • Trên thực tế, phần lớn việc này là do OpenCode và Opus / Sonnet thực hiện
  • Việc của tôi giống như trưởng dự án: thúc đẩy, kiểm thử, debug và cổ vũ (tức là viết prompt)
  • Mọi nguyên liệu đều đã được chuẩn bị sẵn, và dù có thể tự làm, có lẽ tôi cũng không biết nên bắt đầu từ đâu
  • Hầu như tôi không viết nổi dù chỉ một dòng Python hay C++, và điều đó khiến tôi nghĩ đây có lẽ chính là engineering cùng AI
  • Nhờ vậy mà tôi có cái nhìn tích cực hơn về AI coding

3 bình luận

 

Ôi, cái cảm giác hoài niệm từ màn hình game ấy thật rõ ràng;;

 
computerphilosopher 27 ngày trước

Có vẻ là kiểu game như The Secret of Monkey Island. Trông khá thú vị.

 

Đúng vậy. Nói là đối thủ thì hơi gượng ép, nhưng The Legend of Kyrandia cũng từng khá được yêu thích nhờ được Việt hóa. Haha