File Kernel



Trên bản PSX, file này nằm ở vị trí /INIT/KERNEL.BIN, còn đối với bản PC thì có đến 2 file là /DATA/KERNEL/KERNEL.BIN và /DATA/KERNEL/KERNEL2.BIN

File này bao gồm những thành phần và Offset của chúng như dưới đây

1. Dữ liệu các Command (như Attack, Item...) 0x0006
2. Dữ liệu liên quan đến tấn công 0x0086
3. Savemap? 0x063A
4. Chỉ số ban đầu của nhân vật 0x0F7F
5. Dữ liệu Item 0x111B
6. Dữ liệu vũ khí 0x137A
7. Dữ liệu áo giáp 0x1A30
8. Dữ liệu đồ trang bị Accessory 0x1B73
9. Dữ liệu Materia 0x1C11
10. Mô tả về các Command 0x1F32
11. Mô tả về ma pháp 0x2119
12. Mô tả về Item 0x28D4
13. Mô tả về vũ khí 0x2EE2
14. Mô tả về áo giáp 0x307B
15. Mô tả về Accessory 0x315F
16. Mô tả về Materia 0x3384
17. Mô tả về Item quan trọng 0x3838
18. Tên Command 0x3BE2
19. Tên ma pháp 0x3CCA
20. Tên Item 0x4293
21. Tên vũ khí 0x4651
22. Tên áo giáp 0x4B02
23. Tên Accessory 0x4C4B
24. Tên Materia 0x4D90
25. Tên Item quan trọng 0x5040
26. Chữ trong màn hình trận đấu 0x5217
27. Tên đòn tấn công của thú chiêu hồi 0x5692


Dữ liệu 9 vùng đầu tiên trong file Kernel (không liên quan đến text) có dạng format của file BIN chuẩn. Còn 18 vùng còn lại đều liên quan đến text mô tả hay thể hiện tên, không có 6 byte header như 9 vùng trước. Mở đầu mỗi vùng luôn là các Pointer chỉ đến vị trí của từng câu text trong vùng. Định dạng text của FF7 không theo chuẩn ASCII hay SHIFT-JIS mà ở định dạng riêng, như hầu hết game console ở các thế hệ ban đầu.

Trong mỗi vùng lại có sự phân chia nhỏ ra nữa, chẳng hạn lấy ví dụ là vùng số 5, dữ liệu liên quan đến Item. Dưới đây là từng thuộc tính và Offset của chúng.

0x00 độ dài 8 byte: không rõ chức năng
0x08 độ dài 2 byte: không rõ chức năng
0x0A độ dài 1 byte: quy định vùng cấm chỉ
0xFF: chỉ xuất hiện ở Menu, không xuất hiện ở Battle
0xFE: xuất hiện ở Battle và Menu (không dùng được)
0xFD: xuất hiện ở Menu, không xuất hiện ở Battle (dùng được ở Battle)
0xFC: xuất hiện ở Battle và Menu (dùng được ở Battle)
0xFB: xuất hiện ở Menu, không xuất hiện ở Battle (dùng được ở Menu)
0xFA: xuất hiện ở Battle và Menu (dùng được ở Menu)
0xF9: xuất hiện ở Menu, không xuất hiện ở Battle (dùng được ở Menu)
0xF8: xuất hiện ở cả Battle và Menu (dùng được cả 2)
0xF7: xuất hiện ở Menu, không xuất hiện ở Battle (dùng được ở Battle)
0xF6: xuất hiện ở Battle và Menu (dùng được ở Battle)

0x0B độ dài 2 byte: đối tượng tấn công
0x01: 1 đối tượng
0x03: không rõ
0x05: nhiều đối tượng
0x07: không rõ
0x10: chỉ tấn công cả nhóm

0x0D độ dài 1 byte: số ID của Item
0x0E độ dài 1 byte: hồi phục
0x00: không rõ
0x08: cũng áp dụng cho MP
0x22: không rõ
0x23: không rõ
0x24: gây sát thương/hồi phục theo %
0x26: gây sát thương/hồi phục x (con số)
0x37: gây sát thương
0x47: không rõ
0x50: ảnh hưởng đến trạng thái

0x0F độ dài 1 byte: số nhân để tính toán lượng sát thương/hồi phục
0x10 độ dài 1 byte: kiểu hồi phục
0x00: hồi phục HP
0x01: hồi phục MP

0x11 độ dài 3 byte: không rõ
0x14 độ dài 4 byte: ảnh hưởng đến trạng thái
0x18 độ dài 2 byte: thuộc tính
0x1A độ dài 2 byte: không rõ

Bản FF7 trên PC có tới 2 file là KERNEL.BIN và KERNEL2.BIN.
File KERNEL.BIN chứa từ vùng 1~9 như trong KERNEL của PSX, và KERNEL2.BIN chứa text từ vùng 10~27 như trong KERNEL của PSX.








Định dạng bản PSX và bản PC

Các file và dữ liệu của FF7 trên bản PSX và bản PC đều như nhau, có cùng chức năng nhưng định dạng của chúng khác nhau khá nhiều. FF7 cho PSX đầu tiên được phát triển dựa trên nền tảng thư viện Psy-Q vốn "quen thuộc" với máy PSX. Người ta đã dùng nhiều công cụ để chuyển đổi các định dạng như TGA hay GIF sang định dạng TIM cố hữu của Psy-Q.

Trong quá trình phát triển bản PC, một vài thiết kế ban đầu không còn phù hợp bởi nhiều file sử dụng Psy-Q tương thích với cấu trúc của PC rất kém nên phải chuyển đổi. Chẳng hạn, các file TIM (định dạng hình ảnh của PSX) được chuyển đổi sang định dạng TEX vốn được khai thác hiệu quả hơn trong Vram của PC.
Tình hình còn phức tạp hơn khi cả bản PSX và PC đều lưu trữ archive theo những cách khác nhau, khiến việc giải nén và render file phức tạp hơn. Trong nhiều trường hợp thì dữ liệu trong các file này là như nhau.
Phần lớn dữ liệu được lưu trữ theo các định dạng archieve để tiết kiệm dung lượng, truy cập nhanh hay tối ưu hóa cấu trúc file. Một số kiểu archieve thường thấy là kiểu BIN, BIN-GZIP, định dạng nén LZS vốn rất phổ biến trong các game console và định dạng LGP. BIN là định dạng không nén, với header 4 byte chỉ độ dài phần dữ liệu phía sau nó, không bao gồm 4 byte này. Định dạng LZS có header ở 0x00 chỉ định rõ dung lượng của file sau khi được giải nén, và phía sau đó là vùng dữ liệu nén. Mỗi block trong file bắt đầu bằng 1 byte chỉ định block đó có dung lượng thế nào sau khi giải nén (dữ liệu thật) và dung lượng khi nén (tham chiếu). Đọc từ phải qua trái, với 1=thật, 0=tham chiếu. Phần dữ liệu thật có ý nghĩa: đọc 1 byte từ "nguồn" (nén) và ghi thẳng ra output. Dữ liệu tham chiếu gồm 2 byte, là Pointer chỉ đến dữ liệu đã được viết ra và bao gồm 2 thông tin: Offset (tìm dữ liệu ở đâu, hay phần dữ liệu nào sẽ được lặp lại) và độ dài. Phần tham chiếu (16 bit) thường ở dạng

OOOO OOOO LLLL


Trong đó O là Offset, L là độ dài.


Ở đây ta có 12 bit chỉ Offset và 4 bit chỉ độ dài. Cả 2 giá trị này cần được điều chỉnh tiếp để hoạt động. Chẳng hạn, phải +3 vào độ dài để tính toán. Tại sao? Vì nếu dữ liệu được lặp lại ít hơn 3 byte thì chẳng ai phí công làm giải thuật nén cho nó. Vì vậy nên mọi dữ liệu tham chiếu đều có độ dài ít nhất là 3 byte. Độ dài 0 có nghĩa là 3 byte được lặp lại, độ dài 1 có nghĩa là 4 byte được lặp lại... Vì ở đây ta có 4 bit nên độ dài cuối cùng dao động từ 3~18 byte (%1111=$0F=15, +3=18). Điều này có nghĩa rằng tỷ lệ nén tối đa với giải thuật LZS là 9:1




Texture


Thực chất, texture là một bức hình chứa trong Vram, sau đó nó được engine xử lý và thể hiện ra màn hình. Texture căn bản trên các game PSX là TIM (Texture Image Map) và file này có thể chứa nhiều CLUT và đây là lý do để cần một video card trên PC để có thể chứa dữ liệu pallet ngay cả ở độ sâu màu cao.

Định dạng TIM có thể ở dạng raw hay nằm trong một vài kiểu archieve, như BIN, LZS hay MNU. Định dạng này được tạo ra vì PSX không thể trực tiếp truy cập vào Vram của nó và buộc phải đi qua GPU để truy cập bất kỳ hình ảnh nào. File TIM là cách đơn giản để tải texture và CLUT vào trong Vram.

CLUT là viết tắt của chữ "Color Look Up Table". Trong Vram của PSX thì nó xác định vị trí của bảng độ sâu màu cao và sử dụng nó làm tham chiếu đến texture đã được đánh pallet. CLUT trong Vram có thể bị Vram thay đổi trực tiếp và dữ liệu màu được cập nhật xuất hiện tự động trên màn hình mà không cần phải re-render.

Vị trí Vram là nơi TIM được tải vào bộ nhớ video. PSX sử dụng một "bề mặt" có thể thể hiện cửa sổ xem, texture và CLUT với tọa độ X/Y. Trong Vram có mấy khu vực cache cho phép đặt texture vào đấy. 
File TIM có định dạng hơi khác nhau một tí giữa các độ sâu màu khác nhau: 4 bpp, 8 bpp hay 16 bpp.
Còn hình ảnh ở bản PC chứa header, pallet và dữ liệu bitmap. Thường thì dữ liệu được lưu trữ như bức ảnh đã được đánh pallet với các pixel tham chiếu đến pallet. Màu 0 (thường là đen trong pallet) luôn được sử dụng như màu trong suốt.


Module Menu



Menu là module mạnh mẽ thứ hai trong FF7. Từ Menu có thể xem được dữ liệu liên quan đến nhân vật và dường như nó có thể kiểm soát mọi thứ chứ không đơn thuần chỉ để chọn lựa thứ gì đó (như chọn xem Item, trạng thái,...). Menu có vài chức năng phức tạp, và có thể được đặt trong "chế độ Tutorial". Khi chế độ này được gọi ra từ module Field, nó sẽ chơi tự động những lựa chọn Menu khác nhau để giúp người chơi hiểu rõ hơn về hệ thống Menu. Chức năng này còn thấy trên FF8.


Một chức năng chính yếu khác trong hệ thống Menu là khả năng lưu game. Đây có lẽ là phần mạnh mẽ và quan trọng nhất vì Menu có quyền truy cập vào nhiều mảng khác nhau của hệ thống. 

Bản thân Menu là một tập hợp gồm 13 module nhỏ khác là Begin, Party, Item, Magic, Equip, Stat, Change, Limit, Config, Save, Name, Form và Shop. Trong đó có 4 module có thể gọi trực tiếp từ Field.

Dưới đây là những file quan trọng trong module này.


Bản PSX:


+ /MENU/*.MNU

+ /INIT/WINDOW.BIN

Bản PC:


+ /DATA/MENU/MENU_US.LGP

+ /DATA/KERNEL/WINDOW.BIN


Menu là module duy nhất giữ dữ liệu vĩnh viễn trong Vram để các module khác truy cập vào, chẳng hạn như font chữ. Ở bản PSX, đồ họa được nạp từ /INIT/WINDOW.BIN và định dạng này đã được mô tả ở phần Kernel. Cấu trúc của WINDOW.BIN như sau


Offset: 0x0000 (6 byte): header

Offset: 0x0006 (1062 byte): texture tĩnh cho Menu
Offset: 0x2754 (3034 byte): texture của bộ font
Offset: 0x332E (163 byte): không rõ

"Begin" là module đầu tiên trong Menu được thực thi. Dưới đây là hình ảnh "Begin" trong Vram. Font chữ và texture cố định từ /INIT/WINDOW.BIN được khoanh vùng ở góc phải bên dưới.



Ảnh đã được thu nhỏ. Vui lòng nhấn vào đây để xem kích thước thật 784x413.


Tiếp theo là hình ảnh texture trong bản PC và mô tả các phân vùng. Bản PSX chỉ khác ở kích thước texture và hình ảnh các nút bấm. 



Ảnh đã được thu nhỏ. Vui lòng nhấn vào đây để xem kích thước thật 786x391.


Các phân vùng nhỏ có thể bị ghi đè khi nạp Battle, nhưng khi nạp Menu thì chúng lại được ghi trở lại như cũ. Phần trống ở dưới bên trái là bộ chữ Kana trong tiếng Nhật vốn đã bị loại bỏ trong các phiên bản ngôn ngữ Tây Âu.




Module Field


Field là module hạch tâm trong FF7. Những vùng nhà cửa, thành phố ngoài World Map ra đều là Field. Module này quan hệ chặt chẽ với Kernel và có thể gọi Kernel từ cấp độ thấp. Module này có các chức năng:

+ Tải các file Field.
+ Thể hiện bối cảnh 2D và các hiệu ứng liên quan.
+ Thể hiện các yếu tố 3D trong Field như camera, góc nhìn.
+ Chạy Field script hiển thị các event, bao gồm hội thoại.
+ Tải các module khác khi được yêu cầu.

Dưới đây là các file quan trọng ở bản PSX và bản PC

Bản PSX:

+ /FIELD/*.DAT
+ /FIELD/*.MIM
+ /FIELD/*.BSX

Bản PC:

+ /DATA/FIELD/FLEVEL.LGP
+ /DATA/FIELD/CHAR.LGP

Khi hoạt động, module này tải các file Field. Trong bản PC thì Field là một file với 9 phần, trong khi ở bản PSX là 3 file nhưng có phần mở rộng khác nhau và có cùng chức năng, là MIM (bối cảnh), DAT (dữ liệu Script, event) và BSX (3D).
Hình ảnh bên dưới là bối cảnh field qua các giai đoạn Assembly trong Vram của PSX.

Ảnh đã được thu nhỏ. Vui lòng nhấn vào đây để xem kích thước thật 783x391.



Bối cảnh (khung nền) của FF7 là các khối 16x16 được tải vào trong Vram rồi sau đó được lắp ghép vào video buffer từng khung hình. Ở bản PC, các file Field nằm trong FLEVEL.LGP và bị nén với giải thuật LZS. 2 byte đầu tiên của file (khi đã giải nén) luôn là zero, 4 byte tiếp theo chỉ định trong file hiện tại có bao nhiêu phần. Mọi file Field đều có 9 phần, trong đó phần đầu tiên là block Pointer chỉ đến vị trí các câu thoại. Block hội thoại đứng liền sau block Pointer, giống như đa phần ở các game console và kết thúc câu thoại bằng $FF.



3 bình luận :

  1. Chúc các bạn nhiều sức khỏe và sớm hoàn thành bản dịch thuật. Mình mong chờ bản việt ngữ ff vii này lắm lắm. Squax cũng đang remake lại bản này
    http://csttol.blogspot.com/2015/06/ffiiv-hoi-sinh-sau-gan-20-nam.html

    ReplyDelete
  2. Chúc các bạn nhiều sức khỏe và sớm hoàn thành bản dịch thuật. Mình mong chờ bản việt ngữ ff vii này lắm lắm. Squax cũng đang remake lại bản này
    http://csttol.blogspot.com/2015/06/ffiiv-hoi-sinh-sau-gan-20-nam.html

    ReplyDelete
  3. cho em hỏi làm sao để vẽ lại phông chữ của FF7 bản PC vậy anh?

    ReplyDelete

 
Top