Pokémon Emerald là một tựa game tuyệt vời, và chắc chắn nhiều người sẽ cảm thấy hoài niệm khi nghĩ về những trò chơi Pokémon cổ điển nói chung. Ngày nay, các tựa game Pokémon cũ hơn này có một cộng đồng modding cực kỳ thú vị, với rất nhiều bản mod do người hâm mộ tạo ra giúp kéo dài tuổi thọ của chúng hàng thập kỷ. Tuy nhiên, cộng đồng modding đó cũng đã giúp việc lưu trữ một file bên trong Pokémon Emerald trở nên khả thi. Một file có kích thước lên đến 10.8 KB, chính xác hơn là vậy… và tôi đã thử nghiệm điều này.
Để hiểu rõ hơn, khi bạn mở một file trên máy tính của mình, chẳng hạn như tài liệu văn bản, hình ảnh, hoặc thậm chí là trang web này, bạn đang xem 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ị dữ liệu mà bạn mong muốn. Trong trường hợp của một trang web, bạn có thể dễ dàng thấy điều tôi muốn nói bằng cách xem mã nguồn trang. Bạn có thể thấy 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 biết cách đọc dữ liệu bên trong một tệp JPG để diễn giải và hiển thị hình ảnh.
Khái quát hóa khái niệm đó có nghĩa là, thực sự, bất cứ thứ gì đều có thể hoạt động như một vùng chứa file, miễn là có một cách có cấu trúc để dữ liệu có thể được lưu và sau đó được truy xuất trong tương lai. Vì vậy, việc lưu trữ dữ liệu trong Pokémon Emerald là hoàn toàn có thể… và tất cả là nhờ mon-fs, nơi dữ liệu của bạn sẽ được mã hóa thành Pokémon. Điều này có vẻ phức tạp, tốn thời gian, nhưng đó là một cách thực sự độc đáo để giải thích cách dữ liệu được lưu trữ và làm thế nào hầu như bất cứ thứ gì cũng có thể được sử dụng để chứa dữ liệu.
Bí Mật Dữ Liệu Của Pokémon: 68 Bit Mỗi Loài
Phân Tích Cấu Trúc Dữ Liệu Pokémon
Nhìn vào các hình ảnh dưới đây, được chụp từ quá trình mã hóa một file vào bản lưu Emerald của tôi. Bản thân Pokémon, biệt danh, giới tính, OT (Người huấn luyện gốc), ruy băng, quả bóng dùng để bắt nó và kinh nghiệm đều là những giá trị có thể bị người chơi tác động, và đó chính xác là cách mon-fs hoạt động. Nó có hai chế độ: chế độ “Full” và chế độ “Lite”.
- Lite: Một file có kích thước lên đến 3.2 KB có thể được lưu trữ trong game, mặc dù 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 nó sẽ yêu cầu một trình chỉnh sửa file save để hoạt động.
Sự khác biệt giữa hai chế độ này là do dữ liệu dễ dàng truy cập bởi người dùng. Ví dụ, có 386 Pokémon trong Emerald, điều này sẽ cho phép 8 bit dữ liệu. Tuy nhiên, chỉ có 202 Pokémon có thể bắt được, và tính cả những Pokémon chỉ có thể bắt một lần hoặc nhận được thông qua trứng, con số này còn giảm hơn nữa. Sau khi tất cả những Pokémon đó được loại bỏ, và yếu tố tiện lợi được tính đến, con số này giảm xuống còn bốn Pokémon riêng biệt, cho phép lưu trữ hai 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 Đường 116, và tất cả đều có tỷ lệ xuất hiện từ 20% trở lên. Chúng cũng đều có cơ hội bằng nhau để là giống đực hoặc giống cái khi gặp, điều này cung cấp thêm một bit dữ liệu bên cạnh hai bit mà bốn Pokémon này cung cấp.
Cách tiếp cận này có thể đồng nghĩa với việc bạn không thể lưu trữ nhiều dữ liệu, nhưng nó có nghĩa là việc một người thực sự đi bắt những Pokémon này, đặt tên chúng theo đúng cách và đưa cho chúng những vật phẩm phù hợp để biểu diễn dữ liệu thực sự trở nên dễ dàng hơn đáng kể. Về tên, điều này 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 được loại trừ để dễ dàng nhập tên thủ công hơn. Cuối cùng, vật phẩm cầm cung cấp 5 bit dữ liệu, vì 32 vật phẩm có thể được mua rẻ trong game và đưa cho Pokémon cầm.
Tất cả những điều này để lại cho chúng ta các điểm dữ liệu sau:
- Loài: 2 bit
- Tên: 60 bit
- Giới tính: 1 bit
- Vật phẩm cầm: 5 bit
Điều này cung cấp 68 bit trên mỗi Pokémon, và với 419 ô trống có sẵn (ô trống cuối cùng sẽ cần được sử dụng để đệm), chúng ta có 28488 bit sử dụng được, tương đương với 3.561 KB.
Quy Trình Mã Hóa File Thành “Đội Quân” Pokémon
Mã Hóa Thủ Công Qua Công Cụ Web mon-fs
Sử dụng website mon-fs để tạo ra Pokémon cần thiết
Có một công cụ web đi kèm với mon-fs sẽ lấy một file và hiển thị cho bạn những Pokémon bạn cần, vật phẩm để đưa cho chúng và tên để đặt cho chúng. Bạn có thể lưu một file “pc.json” để phác thảo những yêu cầu này, và file này có thể được tải lại lên cùng trang web để nhận lại một file đầu ra. Như bạn có thể thấy ở trên, nó đưa ra các yêu cầu sau:
- Poochyena: Giống đực, không cầm vật phẩm, tên “baaaaaaaaa”
- Nincada: Giống đực, cầm X Accuracy, tên “aaaaaaaaaa”
- Poochyena: Giống đực, cầm Full Heal, tên “aaaaaaaaaa”
- Nincada: Giống cái, cầm Awakening, tên “g6n?Gizsvr”
- Whismur: Giống đực, không cầm vật phẩm, tên “pRh/vBaCaa”
- Poochyena: Giống đực, cầm Revive, tên “aaaaaaiwg6”
- Whismur: Giống cái, không cầm vật phẩm, tên “qBcxefviaa”
Bây giờ, giả sử tôi 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 một người có thể lấy thông tin, đưa nó cho người khác, và để họ giải mã nó? 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 OCR, và xuất ra một file pc.json trở lại… hoặc người dùng khác có thể tải file save của bạn, nhập thủ công các chi tiết vào trang web, và giải mã tại chỗ.
Sử dụng website mon-fs để giải mã hộp PC Pokémon
Dù bằng cách nào, bạn sẽ phải tái tạo lại file một cách tỉ mỉ. Chưa kể việc đi ra ngoài và bắt Pokémon cũng sẽ mất một 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 “bình thường” thực hiện điều này trong game với các công cụ có sẵn cho họ, mặc dù chế độ “Full” nâng tầm đáng kể. Trong chế độ này, bộ nhớ tăng lên 211 bit trên 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 tại sao lại như vậy, nhưng chế độ “Full” trên trang web mon-fs tuyên bố 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ù tôi không chắc chắn.
Giá Trị Thú Vị Từ Một Dự Án “Không Thực Tế”
Không Thể Hình Dung Việc Dùng Pokémon Emerald Để Chia Sẻ File
mon-fs-pokemon-injected-1
Tôi đã thử nghiệm với một bản mon-fs được xây dựng cục bộ để chèn Pokémon và đọc chúng trở lại từ file save game cục bộ, và mặc dù quá trình chèn hoạt động, nhưng việc đọc lại thì không. Chương trình không đọc được luồng dữ liệu từ file 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 theo cách đó hoạt động được. 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 điều đó thủ công.
Mặc dù dự án cụ thể 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, và 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 công nhận từ dữ liệu người dùng và diễn giải nó từ bên ngoài giới hạn của trò chơi.
Tùy chọn màu len trong Minecraft
Toàn bộ dự án này thật điên rồ, 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 mọi thứ 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 mỗi “khối” dữ liệu. Để kết thúc với một ví dụ khác dễ hình dung hơn, người ta 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 vào các màu đó, mà log_2 của 16 có nghĩa là chúng ta sẽ nhận được 4 bit bộ nhớ trên 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 phải là nhiều, nhưng đó là một khái niệm tương tự như việc lưu trữ dữ liệu trong Pokémon Emerald. Một khối màu trắng có thể biểu thị 0000, màu 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 sẽ hướng dẫn bạn cách thiết lập và cấu hình, đồ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 trong tầm nhìn.