Phần 1 trong loạt bài viết về kỹ thuật cho Final Fantasy VII.




Lịch sử


Vào ngày 31 tháng 1 năm 1997, Final Fantasy VII được công bố trong cộng đồng gamer Nhật Bản. Bản game này là một cuộc cách mạng và nâng thể loại RPG Nhật lên một tầm cao mới. Thành công của nó đã giúp Square Soft bám rễ vững chắc vào thể loại RPG và thay thế vị trí hàng đầu của series Dragon Quest của công ty đối thủ là Enix.
Câu chuyện đằng sau bản game này đồ sộ hơn cả nội dung của chính nó. Và như mọi bản game khác, nó có khởi đầu và cả hậu bản.

Năm 1994, Square Soft phát hành Final Fantasy VI trong nước Nhật với một hợp đồng độc quyền với Nintendō. Phiên bản này được phát triển cho hệ máy Super Famicom (SFC) hay còn được biết đến rộng rãi trên toàn Thế giới với cái tên khác, Super Nintendō Entertainment System (SNES). FF6 trở thành tựa game bán chạy nhất lúc đó và có được sức mạnh khiến tác giả của nó nghĩ đến chuyện "vượt ra khỏi ao làng" để sang bên bờ Mỹ quốc. Nhưng đác tiếc là Nintendō nắm độc quyền phân phối mọi game ở Mỹ nên một quyết định được đưa ra để thay đổi game. Logo truyền thống của Final Fantasy đã bị thay đổi cho phù hợp với người Mỹ. Con số VI trong series cũng bị đổi thành III. Bởi vì Nintendō chỉ phát hành 2 phiên bản Final Fantasy ở Mỹ quốc trước đó, là FF1 cho hệ NES và FF4 cho hệ SNES (thực ra FF4 ban đầu được phát triển cho máy NES, nhưng giữa chừng được port sang SNES). Bản thân FF6 cũng bị biên tập nội dung, chẳng hạn như debug room và cuốn sách khiêu dâm trong game đều bị cắt bỏ. FF6 (FF3) là một thành công ở Mỹ, nhưng còn khuya mới sánh được với thành công của nó ở Nhật.
Có nhiều ý kiến cho rằng thể loại J-RPG không thích hợp với thị trường Mỹ.

Sau khi phát hành FF6 ở Mỹ, Nintendō bắt đầu phát triển một hệ máy chơi game khác, có tên mã là "Ultra 64" (N64). Hệ máy này sử dụng nhân xử lý đồ họa 3D và đĩa CD-ROM. Lúc đó, Nintendō và Sony đang bắt tay với nhay để sản xuất ra hệ máy CD-ROM tên là "PlayStation Expansion" (PSX) như một món add-on cho máy SFC. Giang hồ cũng đồn rằng công nghệ này cũng sẽ được dùng cho Ultra 64 luôn. Square Soft cũng nhận định rằng tương lai của mình sẽ là những bản game RPG như một bộ phim lợi dụng sức mạnh của nền tảng đa phương tiện này. Họ đầu tư hàng tỷ En vào các xưởng SGI khi biết máy Ultra 64 sẽ sử dụng cấu trúc R4300 MIPS của RISC với các thanh ghi (register) 64 bit. Một engine 3D mới được phát triển cho series Final Fantasy. Bản demo của công nghệ mới được tạo ra trên các hệ thống mới phát triển của họ. Đó là engine đơn giản sử dụng các nhân vật từ FF6 và được cho rằng đây sẽ là khởi đầu của FF7 trên máy Ultra 64.
Nhưng rồi Nintendō kéo giò Square Soft khi quan hệ giữa Nintendō và Sony đổ vỡ. Vấn đề xuất hiện khi cả hai công ty đều không hài lòng về việc ai sẽ cấp quyền các game trên những hệ máy sử dụng CD-ROM này. Sony muốn kiểm soát nhưng Nintendō đâu có chịu. Nintendō cũng gặp nhiều vấn đề khi Sony đã đang sản xuất chip âm thanh cho máy SFC vốn rất khó lập trình. Nintendō lại muốn kiểm soát nhiều hơn.

Nintendō lẻn ra sau lưng Sony và bắt tay với Phillips để nhờ giúp đỡ vì hãng này cũng có thể cấp quyền cho công nghệ CD-ROM. Khi biết Nintendō đi đêm với kẻ khác (hơn nữa lại là một thằng ngoại quốc!), Sony nổi khùng và rút công nghệ của mình ra khỏi hợp đồng. Sony còn thuyết phục Phillips, Matsushita, NEC và Pioneer không cấp quyền cho bất cứ công nghệ ổ đĩa quang nào của Nintendō.

Còn lại một mình, Sony quyết định gắn thêm ổ CD-ROM vào board mạch của máy chơi arcade System 11 (do Namco phát triển, có cấu trúc tương tự
PlayStation) và gọi đó là PlayStation.
Mất đi ổ đĩa cho hệ máy của mình, Nintendō lặng lẽ cho các đối tác bên thứ 3 biết rằng máy Ultra 64 sẽ là nền tảng cartridge như các hệ máy trước đó của mình. Vì vậy nên giới hạn tối đa của các game sẽ là 32 Mb. Giờ đây Square Soft lâm vào tình huống dở ông dở thằng. Họ đã đầu tư hàng triệu En vào việc phát triển một game RPG hoành tráng như một bộ phim và giờ phải cắt bỏ bớt để đủ dung lượng chứa trong một cartridge. Khi hay tin PSX cũng sử dụng CPU với các tập lệnh cấu trúc MIPS (thực tế là PSX sử dụng ít lệnh hơn N64) thì Square Soft bỏ rơi Nintendō để ký hợp đồng phân phối độc quyền với Sony. Giờ đây nền tảng cho Final Fantasy VII đã được thiết lập và có thể tiến hành mà không gặp trở ngại gì.



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

Máy Sony PSX và Nintendō 64 đều sử dụng cùng cấu trúc MIPS của hãng RISC


Quá trình sản xuất


Có 2 việc quan trọng trong quá trình sản xuất Final Fantasy 7. Đầu tiên là việc một nhóm thứ hai được thành lập để bắt đầu phát triển Final Fantasy 8. Việc này cho phép rút ngắn thời gian phát triển, khi một game đã xong thì game kia cũng được một nửa. Việc quan trọng thứ hai là trong quá trình sản xuất, mẹ của đạo diễn Sakaguchi Hironobu là Aki qua đời. Sakaguchi đã mang cái chết này vào game, thay đổi nội dung game đáng kể. Lúc này nội dung của FF7 xoay quanh sự sống, cái chết và Địa cầu.

Phát hành


FF7 được tung ra thị trường Nhật Bản vào ngày 31 tháng 1 năm 1997, và nó mắc phải vài vấn đề. Thứ nhất là bản game này chưa được hoàn thiện. Trong game có vài cảnh không chạy đúng và những con trùm phụ cũng chưa được thêm vào trong lần phát hành này. Ngoài ra còn vài lỗi nhỏ nữa, sau được khắc phục trong phiên bản US.
Tại Mỹ, bản demo của FF7 được phát hành cùng game đấu võ "Tobal No.1". Bản demo này là , phiên bản cải biến của phần đầu game nhưng lại sử dụng các nhân vật trong phần sau của game. Và đây cũng là lần đầu tiên phát hành ở Mỹ mà một game Final Fantasy được đánh đúng số thứ tự của nó. Đây cũng là lần đầu tiên gamer Mỹ được nhìn thấy logo thật sự của Final Fantasy.
FF7 được phát hành ở Mỹ vào ngày 3 tháng 9 năm 1997. Phiên bản này đã được fix bug, thêm vài con trùm, sửa những cảnh đơ. Sau đó, một phiên bản khác được phát hành lại tại Nhật dựa trên nền tảng bản US mở rộng, thêm một số nội dung bonus. Phiên bản này được gọi là "Final Fantasy 7 International".


Phiên bản PC


Với thành công rực rỡ của FF7, các cổ đông của Square bắt đầu thúc ép công ty phải đa dạng hóa sản phẩm của mình. Lúc đó Square chỉ làm game cho mỗi Sony, cho nên thị trường bị giới hạn. Và rõ ràng những game cũ của họ cũng không còn thích hợp với các hệ máy mới. Ngay cả Final Fantasy 6 cũng không dễ gì tương thích với các hệ máy khác. Square lựa chọn cập nhật các game cũ của họ sang các hệ máy và ngôn ngữ lập trình hiện đại. Họ cũng quyết định port FF7 lên PC.

Square chọn Eidos làm nhà phát hành cho bản port PC này.
Đương thời, Eidos đã thành công trong việc chuyển tựa game "Tomb Rider" nổi tiếng của hãng Core Design từ PSX lên PC. Với kinh nghiệm như vậy nên có vẻ như Eidos là một lựa chọn đúng.

Tuy nhiên, ban đầu thì phiên bản PC gặp nhiều vấn đề. Khi các lập trình viên nhận mã nguồn của FF7 từ Square thì họ nhận ra đây là phiên bản ban đầu đầy lỗi. Công việc phải tạm dừng trong khi Square thu thập lại bản mới hơn. Ngoài ra, những con người và công cụ từng dùng để tạo ra bối cảnh cho FF7 giờ đang được dùng để phát triển FF8 và FF9. Không có cách nào để re-render lại bối cảnh nên nhóm thực hiện bản port buộc phải dùng bản code với màu sắc, độ phân giải kém của PSX. Những đoạn phim trong game mờ đi một cách tệ hại. Square Soft chưa bao giờ render video với độ phân giải cao, và định dạng video cũng không tương thích với DirectX của Microsoft. Vì vậy người ta đã quyết định convert các đoạn phim vốn dĩ đã bị nén của PSX sang định dạng phù hợp với PC. Kết quả là các đoạn phim thảm hại của bản port giờ đây là bản copy của bản copy của bản render với độ phân giải thấp.

Square cũng từ chối không cho thêm vào bất cứ thứ gì. Cho nên bản port PC giống hệt như bản PSX từ giao diện tới mọi thứ. Chỉ khác là có sự nhân nhượng ở font chữ khi game cho phép chạy với "độ phân giải cao" 640x480, vốn chẳng là cái đinh gì đối với độ phân giải của PC. Sau này, bản port FF8 lên PC cũng cho phép thể hiện font chữ ở "độ phân giải cao" và độ phân giải mặc định của PSX. Màu sắc cũng bị giới hạn ở 15 bit.
Ngoài ra còn nhiều vấn đề nữa. Máy PSX có khả năng sử dụng nhiều độ sâu màu trên màn hình cùng một thời điểm. Rất nhiều hiệu ứng đồ họa dựa vào đặc tính này. Trong khi đó thì nhiều card đồ họa trên PC không có khả năng sử dụng CLUT (color look up table) ở chế độ high color. Điều này khiến game phải ở chế độ software render với độ phân giải thấp. FF7 vốn được thiết kế cho đồ họa 15 bit nên dải màu trở nên cách biệt rõ ràng khi thể hiện trên màn hình PC. Kiến trúc âm thanh của PSX và PC cũng khác nhau rõ rệt khiến mảng âm thanh cũng chịu nhiều vấn đề. Đến bản port PC cho FF8 sau này cũng bị chê lên chê xuống là "âm thanh dở như hạch" so với bản PSX.

Bản port PC được phát hành vào tháng 6 năm 1998. Lúc đó nó vẫn còn đầy bug và không phải là bản port hoàn hảo. Ban đầu, bản port không tương thích với CPU của Cyrix và AMD và Eidos cũng từ chối hỗ trợ kỹ thuật. Nhiều người dùng card đồ họa cao cấp buộc phải sử dụng chế độ software render vì thiếu tính năng CLUT. Các đoạn phim cũng bị chiếu lộn ngược hình ảnh hay khiến game bị crash. Giải pháp duy nhất mà Eidos đưa ra là cung cấp dữ liệu save để người chơi vượt qua đoạn bị crash. Nhưng việc này cũng hủy diệt hết công sức hàng giờ đồng hồ của người chơi.
Nhiều card âm thanh không được thiết kế để chơi MIDI và phần mềm chơi nhạc được sử dụng nhiều, chiếm dụng tài nguyên và làm chậm cả hệ thống.
Tùy chọn bàn phím ban đầu cũng hết sức điên khùng khi chỉ dùng mỗi bàn phím số. Rất nhiều laptop không thể chơi được game chỉ vì không có bàn phím số, muốn chơi phải gắn từ ngoài vào.

Eidos bỏ luôn FF7 khi bản Final Fantasy 8 cho PC được phát hành.

Bây giờ chúng ở đâu?


Bản port cho PC giờ đã tuyệt bản và không thể chạy trên kiểu kernel của Windows NT bởi pointer đặt không đúng chỗ. Nhiều người chơi giờ đến với FF7 thông qua giả lập lập PSX với nhiều ưu điểm như đồ họa phân giải từ 1024x768 trở lên, màu sắc 32 bit và texture filter cho hình ảnh mịn hơn. Bản PSX cũng ổn định hơn, không có lỗi.
Engine dùng cho FF7 trên PSX cũng được tiếp tục dùng cho một vài game không thuộc dòng Final Fantasy, chẳng hạn như "Parasite Eve". Đây là game đầu tiên hỗ trợ texture toàn thân nhân vật trước FF8.
Tuy nhiên bản port PC của FF7 vẫn còn sống trong một số ít người chơi. Những bản vá lỗi không chính thức từng được tung ra và đạt được một số thành công nhất định.

Rồi mọi chuyện cũng chấm hết khi một bản port mới lên PC được tung ra vào năm 2012. Nội dung, hình ảnh vẫn như trước nhưng bản port này tương thích với các nền tảng Windows mới và tỏ ra "đã sạch lỗi".


Engine của FF7


1. Các phần của engine

Engine của FF7 được chia nhỏ thành nhiều module. Việc này cho phép các lập trình viên chia thành nhiều nhóm nhỏ, tạo ra nhiều kiểu môi trường đa dạng và cho phép họ những người thiết kế linh động tối đa khi chỉ làm việc trong module của riêng họ. Hệ thống module này cho phép truy cập từ một điểm và truy xuất ra nhiều điểm khác nhau của game. Máy PSX có tài nguyên hạn chế, chỉ có 1Mb cho VRam và 2Mb cho Ram hệ thống nên mọi thứ cần được sắp xếp sao cho có hiệu quả nhất. Và module là một cách dễ dàng để dump toàn bộ các phần của engine để giải phóng chỗ cho các phần khác.
Hệ thống cốt lõi bao gồm 6 module là Kernel, Field, Menu, World Map, Battle và Mini game. Chúng được sắp xếp theo thứ tự như sau.




Kernel là phần chứa text giải thích xuất hiện trên một số phần của Menu. Field là một khái niệm đặc trưng của dòng game Final Fantasy, chỉ những khu vực bên trong các tòa nhà, khu vực mà tại đó người chơi không đụng độ quái vật. Nói nôm na, nơi nào không phải World Map thì đó là Field. Module này là phần code liên quan đến Field, bao gồm cả hội thoại xuất hiện trong Field. World Map là tất cả mọi thứ, bao gồm cả hội thoại cho các event diễn ra ngoài bản đồ. Battle là module quản lý các trận chiến ngẫu nhiên, đấu trùm và cả text xuất hiện trong trận đấu.

2. Tương quan giữa các module

Không phải mọi module đều có thể truy cập vào module khác, mà có một lưu trình đặc biệt giữa chúng. Chẳng hạn ta có thể truy cập vào Menu từ World Map hay Field nhưng không thể truy cập từ Battle. Field là module bên cạnh kernel điều khiển gần như toàn bộ game. Nó được lập trình để có thể gọi bất kỳ module nào trong quá trình chơi. Chẳng hạn, từ Field có thể ra ngoài World Map, truy cập Menu, nhảy sang các trận đấu (trùm) hay chơi Mini game.


Kernel


1. Tổng quát về kernel

Lịch sử kernel bắt đầu từ phiên bản đầu tiên của Final Fantasy cho hệ máy Famicom (NES) 8 bit của Nintendō. Famicom chỉ có thể đọc 32 kb chương trình trong Rom, nên để khắc phục hạn chế này thì Nintendō đã pháp triển hệ thống memory mapper cho phép các phần của chương trình được chuyển đổi, thay thế phần khác từ cartridge vào trong bộ nhớ.
FF1 sử dụng "Memory Manager Controller #1" (MMC1) chia game thành 16 phần, mỗi phần 16kb (mỗi chương trình MMC1 tối đa có thể lên tới 256k), và nó cũng chia bộ nhớ có thể truy cập từ cartridge thành 2 phần 16k. Phần 16k đầu là nơi có thể để xếp dữ liệu, còn 16k sau không thể bị chuyển đổi, nó nằm cố định trong bộ nhớ cho tới khi cartridge bị rút khỏi máy. Kernel của FF1 nằm trong 16kb bộ nhớ sau này.
Kernel là module chứa vòng lặp chính của game. Nó xử lý mọi chức năng cấp thấp của game như đưa dữ liệu từ các phần thích hợp của game vào bộ nhớ tạm thời, nhảy sang module khác, phát nhạc và các nhiệm vụ khác.
Càng về sau, dòng Final Fantasy càng phát triển, tỷ lệ thuận với dung lượng của game nhưng vẫn giữ lại hệ thống kernel/module cho tới sau này. Khi port một phiên bản từ hệ máy này sang hệ máy khác thì điều này gây ra nhiều trở ngại. Chẳng hạn, FF6 được phát triển cho máy SFC. Khi dữ liệu của module Menu cần được xếp vào bộ nhớ tạm để hiển thị lên màn hình thì nó được chuyển đổi bằng hệ thống điện tử. Bản port lên PSX lại xếp dữ liệu từ CD-ROM, gây ra một khoảng thời gian lag đáng kể. Còn đối với FF7 trên PC thì hệ thống Menu được tích hợp luôn trong file exe.

2. Chức năng của kernel

Kernel là một chương trình đa nhiệm quản lý hết mọi nhiệm vụ trong hệ thống. Nó dùng một trình quản lý bộ nhớ đơn giản có thể xử lý cả Ram chính và VRam cho tất cả các module trong game. Hỗ trợ kernel còn có các thư viện Psy-Q (thư viện của PSX). Khi port lên PC thì thư viện Psy-Q được thay thế bằng thư viện PC tương ứng. Chẳng hạn, trình chơi nhạc SEQ của Psy-Q được thay bằng trình chơi Midi. Cả 2 kiểu thư viện này đều làm cùng nhiệm vụ, chỉ khác nhau ở định dạng và các thực thi. Hình ảnh bên dưới giới thiệu mối tương quan giữa kernel với các phần khác của chương trình.


Bộ nhớ chính


Dù module nào đang được xếp vào bộ nhớ đi nữa thì cũng luôn có một khu vực với dung lượng 4340 byte ($10F4) dành riêng cho các chức năng tổng thể trong toàn bộ game. Đây gọi là "Save Map" và khi người chơi lưu game thì phần bộ nhớ này được copy vào phần Ram bất biến như đĩa cứng hay Memory card đối với máy PSX.
Trong Save Map có 5 bank bộ nhớ có thể truy cập trực tiếp thông qua các câu lệnh của module Field. 5 bank này có thể là 8 hay 16 bit tùy vào lệnh của phần Field.


Bộ nhớ Video (Vram)


Kernel là thứ chỉ định, cache và thể hiện mọi thứ trong Vram. Máy PSX chỉ có 1 Mb cho Vram và hệ thống cache cho Vram cũng giúp giảm tải bớt độ phức tạp khi thể hiện lên màn hình.
Có thể xem Vram của PSX như một "bề mặt" hình chữ nhật với 2048x512 điểm ảnh. PSX có thể có nhiều độ sâu màu trong Vram cùng một thời điểm. Hình bên dưới là một trạng thái điển hình của Vram khi đang thể hiện game (một số giả lập cho phép xem Vram như F11 đối với PSX_fin).

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

Hai màn hình game bên trái là vùng đệm video (đệm khung). Phần phía trên bên phải là đồ họa Field cho cảnh đó, còn phần bên dưới bao gồm độ họa cache và các hiệu ứng đặc biệt. Bên phải là texture cố định và bán cố định của game.
PSX dùng 2 trang đệm tiêu chuẩn để làm hình ảnh chuyển động. Phần các đốm màu ở dưới, bên trái (dưới Barret và Cloud) chính là CLUT (Color Look Up Tables). Đây là nơi palette màu cho texture được lưu trữ. Nếu hack vào phần CLUT này thì ta có thể thay đổi màu sắc thể hiện của texture, có thể biến Cloud thành da đỏ, tóc đen, áo vàng... CLUT cũng cho phép PSX thể hiện nhiều độ sâu màu cùng thời điểm.

CD-Rom


Một trong những quy tắc lớn khi phát triển game PSX là cấm truy cập trực tiếp vào phần cứng. Mọi thứ phải đi qua Bios, nếu không sẽ dẫn đến nguy cơ không tương thích với các hệ thống sau này. Việc này gây nên một vấn đề cho module kernel. Khi chuyển đổi giữa các module (chẳng hạn, từ "Map" sang "Battle") thì engine phải load trước module kế tiếp trong khi module hiện tại vẫn đang còn trong bộ nhớ. Khi truy cập vào Bios thì phần còn lại của hệ thống sẽ dừng cho đến khi thoát ra.
Vấn đề này được giải quyết trong FF7 bằng cách điều khiển truy cập CD-Rom. Kernel có thể load 8 kb cùng lúc trong chế độ này, và kernel chỉ tham chiếm các file dựa trên sector của CD-Rom mà dữ liệu nằm trên đó chứ không dựa trên tên file.

0 bình luận :

Post a Comment

 
Top