Pokémon Emerald là một tựa game kinh điển, khơi gợi ký ức tuổi thơ tươi đẹp về thế giới Pokémon đối với nhiều người chơi. Ngày nay, các phiên bản game Pokémon cũ này đang chứng kiến một phong trào modding vô cùng thú vị, với hàng loạt bản sửa đổi do người hâm mộ tạo ra, kéo dài vòng đời của chúng thêm nhiều thập kỷ. Tuy nhiên, cộng đồng modding này còn làm được một điều độc đáo hơn: tạo ra khả năng lưu trữ dữ liệu trong Pokémon Emerald. Cụ thể hơn, một file có kích thước lên đến 10.8 KB có thể được ẩn giấu bên trong tựa game này. Đó là một ý tưởng nghe có vẻ điên rồ, nhưng hoàn toàn khả thi.
Khi bạn mở một tập tin trên máy tính – dù là một tài liệu văn bản, một hình ảnh hay thậm chí là trang web này – bạn đang tương tác với một tập hợp các cấu trúc dữ liệu mà máy tính của bạn biết cách diễn giải để hiển thị thông tin như bạn mong đợi. Chẳng hạn, với một trang web, bạn có thể dễ dàng thấy điều này bằng cách xem mã nguồn. Bạn sẽ thấy mã HTML mà trình duyệt của bạn biết cách diễn giải và hiển thị cho bạn, tương tự như cách máy tính của bạn đọc dữ liệu bên trong một tệp JPG để hiển giải và hiển thị một hình ảnh.
Khái niệm này cho thấy rằng, trên thực tế, bất cứ thứ gì cũng có thể đóng vai trò là một “vật chứa” dữ liệu, miễn là có một phương pháp cấu trúc hóa để lưu trữ và sau đó truy xuất dữ liệu đó trong tương lai. Và việc lưu trữ dữ liệu trong Pokémon Emerald là hoàn toàn có thể, nhờ vào một dự án có tên là mon-fs
. Công cụ này mã hóa dữ liệu của bạn dưới dạng các Pokémon. Quá trình này có thể chậm và đôi khi gây khó khăn, nhưng đây là một minh họa tuyệt vời về cách dữ liệu được lưu trữ và cách mà hầu như bất kỳ thứ gì cũng có thể được sử dụng làm phương tiện lưu trữ thông tin.
Pokémon – Nơi ẩn chứa lượng dữ liệu đáng kinh ngạc
Từng Pokémon lưu giữ 68 bit dữ liệu
Hãy nhìn vào những gì có thể thấy trong các save file của Pokémon Emerald. Bản thân Pokémon, biệt danh của nó, giới tính, OT (Người huấn luyện gốc), băng ruy băng, loại bóng dùng để bắt và điểm kinh nghiệm – tất cả đều là những giá trị mà người chơi có thể tác động. Và đó chính xác là cách mon-fs
hoạt động. Nó có hai chế độ: “Full” (Toàn diện) và “Lite” (Rút gọn).
- Lite: Một file có kích thước lên đến 3.2 KB có thể được lưu trữ trong game, và mọi Pokémon có thể được bắt và đặt tên mà không cần bất kỳ công cụ bên ngoài nào.
- Full: Một file có kích thước lên đến 10.8 KB có thể được lưu trữ trong game, nhưng sẽ yêu cầu một save editor để hoạt động.
Sự khác biệt giữa hai chế độ này nằm ở lượng dữ liệu dễ dàng truy cập bởi người dùng. Ví dụ, có 386 Pokémon trong Emerald, cho phép lưu trữ 8 bit dữ liệu nếu chỉ dựa vào loài. Tuy nhiên, chỉ có 202 loài có thể bắt được, và nếu tính cả những Pokémon chỉ có thể bắt một lần hoặc nhận qua trứng, con số này còn giảm xuống nữa. Sau khi loại bỏ các Pokémon đặc biệt và tính đến sự tiện lợi, con số này được rút gọn xuống chỉ còn bốn loài Pokémon riêng biệt, cho phép lưu trữ 2 bit dữ liệu. Bốn Pokémon này là:
- Poochyena
- Whismur
- Taillow
- Nincada
Cả bốn Pokémon này đều có thể được bắt trên Tuyến đường 116, và tất cả đều có tỷ lệ xuất hiện từ 20% trở lên. Chúng cũng có tỷ lệ đực hoặc cái như nhau khi gặp, cung cấp thêm 1 bit dữ liệu bên cạnh 2 bit được cung cấp bởi việc chọn loài Pokémon.
Phương pháp này có thể không cho phép lưu trữ nhiều dữ liệu, nhưng nó đảm bảo rằng một người chơi thực sự có thể dễ dàng đi bắt những Pokémon này, đặt tên và cho chúng giữ đúng vật phẩm để biểu diễn dữ liệu. Về tên, nó cung cấp 60 bit dữ liệu và sử dụng mọi ký tự tiếng Anh cùng hầu hết các ký hiệu. Khoảng trắng bị loại trừ để dễ dàng nhập tên bằng tay hơn. Cuối cùng, vật phẩm giữ cung cấp 5 bit dữ liệu, vì có 32 vật phẩm có thể mua rẻ trong game và cho Pokémon giữ.
Tất cả những điều này mang lại các điểm dữ liệu sau:
- Loài (Species): 2 bit
- Tên (Name): 60 bit
- Giới tính (Gender): 1 bit
- Vật phẩm giữ (Item Held): 5 bit
Tổng cộng, mỗi Pokémon cung cấp 68 bit dữ liệu. Với 419 ô trống có sẵn (ô cuối cùng cần được sử dụng để đệm), chúng ta có 28488 bit khả dụng, tương đương 3.561 KB.
Quy trình mã hóa dữ liệu thành Pokémon
Biến dữ liệu thành Pokémon bằng tay (và công cụ hỗ trợ)
Giao diện công cụ web mon-fs hiển thị danh sách Pokémon cần bắt và tùy chỉnh để mã hóa dữ liệu ở chế độ Lite
Có một tiện ích web đi kèm với mon-fs
sẽ lấy một tệp và hiển thị cho bạn những Pokémon bạn cần, các vật phẩm để cho chúng giữ và tên để đặt. Bạn có thể lưu một tệp “pc.json” để phác thảo những yêu cầu này, và tệp này có thể được tải lại lên cùng một trang web để nhận lại tệp đầu ra đã được giải mã. Như bạn có thể thấy ở hình trên, nó đưa ra các yêu cầu sau để mã hóa một file mẫu:
- Poochyena: Giới tính đực, không giữ vật phẩm, tên “baaaaaaaaa”
- Nincada: Giới tính đực, giữ X Accuracy, tên “aaaaaaaaaa”
- Poochyena: Giới tính đực, giữ Full Heal, tên “aaaaaaaaaa”
- Nincada: Giới tính cái, giữ Awakening, tên “g6n?Gizsvr”
- Whismur: Giới tính đực, không giữ vật phẩm, tên “pRh/vBaCaa”
- Poochyena: Giới tính đực, giữ Revive, tên “aaaaaaiwg6”
- Whismur: Giới tính cái, không giữ vật phẩm, tên “qBcxefviaa”
Vậy, giả sử bạn bắt được tất cả những Pokémon này, điều gì sẽ xảy ra tiếp theo? Làm thế nào để ai đó có thể lấy thông tin này, gửi cho người khác và nhờ họ giải mã? Họ có thể sử dụng công cụ mon-fs
mà bạn cung cấp ảnh chụp màn hình, sử dụng công nghệ OCR để đọc và xuất ra tệp pc.json, hoặc người dùng khác có thể tải tệp save của bạn, nhập thủ công các chi tiết lên trang web và giải mã ngay lập thì.
Trang web mon-fs giúp giải mã dữ liệu từ các Pokémon trong hộp lưu trữ của game Pokémon Emerald
Dù bằng cách nào, bạn sẽ phải trải qua một quá trình phục dựng file một cách tỉ mỉ. Chưa kể việc đi bắt từng Pokémon cũng sẽ tốn khá nhiều thời gian, vì vậy đây không phải là một cách thực tế để chuyển file cho người khác.
Có một số hạn chế được đặt ra ở đây để giúp một người chơi “bình thường” thực hiện điều này trong game với các công cụ có sẵn. Tuy nhiên, chế độ “Full” tăng cường đáng kể khả năng lưu trữ. Ở chế độ này, dung lượng lưu trữ tăng lên 211 bit cho mỗi Pokémon, hoặc khoảng 11.05 KB. Tài liệu trên kho lưu trữ GitHub không nêu rõ lý do, nhưng chế độ “Full” trên trang web mon-fs
khẳng định rằng các file dưới 10.8 KB được đảm bảo hoạt động. Điều này có thể liên quan đến các giá trị đệm một lần nữa, mặc dù chưa rõ ràng.
Ứng dụng thú vị nhưng không thực tế
Hình ảnh các Pokémon đã được "tiêm" dữ liệu thành công vào save file của Pokémon Emerald bằng mon-fs
Để thử nghiệm, tôi đã cố gắng sử dụng một bản mon-fs
được xây dựng cục bộ để chèn Pokémon và đọc chúng ra khỏi tệp save của game. Mặc dù quá trình chèn hoạt động, nhưng việc đọc lại dữ liệu thì không. Chương trình đã thất bại trong việc đọc luồng dữ liệu từ tệp save, và tôi cũng không thể làm cho công cụ đọc ảnh chụp màn hình bằng OCR và chuyển đổi chúng hoạt động. Tuy nhiên, việc nhập thủ công trên trang web mon-fs
vẫn hoạt động, và một người thực sự tận tâm với việc chuyển file qua Pokémon có thể làm được điều đó một cách thủ công.
Mặc dù dự án đặc biệt này chắc chắn không thực tế đối với hầu hết mọi người, nhưng nó vẫn rất thú vị. Bất kỳ trò chơi nào cho phép bất kỳ loại dữ liệu nào do người dùng kiểm soát đều có thể được sử dụng theo cách này. Chúng ta đã thấy các kỹ thuật tương tự cho phép thực thi mã tùy ý trong nhiều trò chơi trước đây, bao gồm cả Pokémon Diamond và Pearl. Tất nhiên, những kỹ thuật này phức tạp hơn đáng kể so với việc chỉ tạo một cấu trúc được nhận dạng từ dữ liệu người dùng và diễn giải nó từ bên ngoài ranh giới của trò chơi.
Các loại len màu sắc trong Minecraft minh họa cách sử dụng vật phẩm để lưu trữ dữ liệu theo hệ nhị phân
Toàn bộ dự án này vừa điên rồ, vừa tuyệt vời, và nó có thể dạy cho bạn rất nhiều về cấu trúc dữ liệu và cách bất cứ thứ gì cũng có thể là một phần của cấu trúc dữ liệu nếu bạn có thể kiểm soát thứ tự và một số tham số của các mục được sử dụng để xây dựng từng “khối” dữ liệu. Để đưa ra một ví dụ khác dễ hình dung hơn, bạn có thể làm điều này trong một trò chơi như Minecraft. Có 16 màu len trong Minecraft, và bạn có thể ánh xạ 0-F (hệ thập lục phân) cho những màu đó. Theo log cơ số 2 của 16, chúng ta sẽ nhận được 4 bit lưu trữ cho mỗi khối. Chỉ với 100 khối, bạn có thể biểu diễn 0.05 KB dữ liệu; không nhiều, nhưng nó là một khái niệm tương tự như lưu trữ dữ liệu trong Pokémon Emerald. Một khối len trắng có thể đại diện cho 0000, len xám nhạt 0001, v.v.
Nếu bạn quan tâm đến việc thử nghiệm điều này, hãy xem kho lưu trữ GitHub của mon-fs
và truy cập trang web mon-fs
. Cả hai đều sẽ hướng dẫn bạn cách thiết lập và cấu hình nó, đồng thời có thể cung cấp cho bạn một số ý tưởng về những nơi kỳ lạ khác mà bạn có thể lưu trữ dữ liệu, ẩn mình ngay trước mắt.