Biên dịch Quake như năm 1997: Hành trình quay lại thời kỳ hoàng kim của lập trình game

Công nghệ29 tháng 5, 2026·6 phút đọc

Bài viết tái hiện lại quy trình biên dịch tựa game kinh điển Quake trong môi trường phát triển năm 1997, sử dụng hệ điều hành Windows NT 4.0 và bộ công cụ Visual C++ 6.0. Đây là cơ hội để nhìn lại những thách thức kỹ thuật và sự tối giản nhưng mạnh mẽ của công nghệ lập trình cuối thế kỷ 20.

Biên dịch Quake như năm 1997: Hành trình quay lại thời kỳ hoàng kim của lập trình game

Biên dịch Quake như năm 1997: Hành trình quay lại thời kỳ hoàng kim của lập trình game

Những lô hàng đầu tiên của tệp thực thi Quake (quake.exe và vquake.exe) thực tế được lập trình trên máy HP 712-60 chạy hệ điều hành NeXT và biên dịch chéo thông qua DJGPP trên máy chủ DEC Alpha 2100A. Tuy nhiên, đến tháng 6 năm 1996, sau khi phát hành trò chơi nhưng lo ngại về sự đi vào ngõ cụt của NeXT, id Software đã quyết định chuyển đổi hoàn toàn môi trường phát triển của mình.

Các phiên bản tiếp theo của Quake, bao gồm winquake.exe, glquake.exe và QuakeWorld (qwcl.exe và qwsv.exe), đều được phát triển và biên dịch trên Windows NT với Visual C++ 4.X. Bài viết này sẽ mô tả các bước để tái tạo lại trải nghiệm xây dựng các tệp nhị phân win32 của Quake y như những gì đã diễn ra vào năm 1997.

Cài đặt Windows NT 4.0

Tùy thuộc vào mức độ chính xác về mặt lịch sử mà bạn muốn đạt được, bạn có thể thực hiện các bước này trong bốn môi trường khác nhau. Các bước này đã được kiểm tra cả trên máy tính Quake gốc và trên Virtualbox, chạy either Windows 98SE hoặc Windows NT 4.0.

Việc cài đặt Windows NT 4 khá dễ dàng vì đĩa CD có khả năng khởi động (bootable). Quá trình cài đặt mất khoảng 30 phút.

Màn hình khởi động Windows NT 4Màn hình khởi động Windows NT 4

Một điểm rất đáng yêu là màn hình khởi động của Windows NT cực kỳ tối giản. Nó tự hào hiển thị số lượng CPU được phát hiện (Windows 95/98 chỉ hỗ trợ một CPU) và lượng RAM hiện có. Không có bất kỳ hoạt ảnh nào sến súa hay thừa thãi.

Thêm CPU thứ hai vào hệ thống sẽ không được Windows NT phát hiện tự động. Bạn cần cài đặt lại để phần HAL (Hardware Abstraction Layer) có thể xử lý các hệ thống SMP (đa xử lý đối xứng). Điều tương tự cũng xảy ra với bo mạch chủ dual CPU. Trên bo mạch W6-LI, bạn không chỉ cần thêm một Pentium Pro khác mà còn phải gắn thêm một bộ điều chỉnh điện áp!

Windows NT 4 sử dụng giao diện chủ đề giống như Windows 9X. Phiên bản đầu tiên, Windows NT 3, sử dụng các yếu tố giao diện giống như Windows 3.1 và trông khá tệ.

Visual C++ 6.0 và mã nguồn

Phiên bản Win32 của Quake được viết trên Visual C++ 4.X vì đây là phiên bản IDE mới nhất của Microsoft vào giữa năm 1996. Tuy nhiên, đến năm 1999, dự án đã được chuyển sang Visual C++ 6. Nếu bạn không có đĩa cài đặt sẵn, bạn có thể tìm thấy nó trên Internet Archive hoặc winworldpc.com.

Trong thời kỳ trước khi Internet "luôn luôn kết nối", hầu hết phần mềm đều có Product ID để chống vi phạm bản quyền.

Giao diện Windows NT 4Giao diện Windows NT 4

Màn hình cài đặt cũng giới thiệu về "Visual Studio" tiếp theo, kết hợp nhiều môi trường phát triển khác nhau. Nó sớm trở thành IDE thống trị của Microsoft.

Màn hình cài đặt trông có chút lạ lẫm. Có rất nhiều khoảng trống và thanh tiến trình được đặt một cách vụng về. Đó là vì Microsoft không mong đợi nó chạy ở độ phân giải cao điên rồ là 1280x1024 (mà các nhà phát triển của id có thể đã sử dụng trên màn hình 21 inch của họ). Nó chỉ trông đúng như ý định ở chế độ 640x480 hoặc 800x600.

Sau khi cài đặt VC++6, chúng ta cần lấy mã nguồn. Đừng lấy mã nguồn từ GitHub hoặc chuyển tệp qua FTP. Điều này sẽ làm hỏng tệp không gian làm việc .dsw. Khi đó, VC++6 sẽ không thể phân tích cú pháp nó. Nó thậm chí không đưa ra thông báo lỗi, chỉ mở ra và không hiển thị tệp/dự án nào. Bạn sẽ mất nửa ngày để cố gắng gỡ lỗi vấn đề này.

Thay vào đó, bạn cần lấy q1source.zip. Nó từng có sẵn trên máy chủ FTP của id Software nhưng bây giờ bạn có thể lấy nó từ Kho lưu trữ chính thức của Quake tuyệt vời do Jason Brownless duy trì.

Với máy ảo, bạn có thể chuyển tệp qua thao tác kéo/thả. Ngoài ra, bạn có thể sử dụng Quick ‘n Easy FTP Server hoạt động trên cả 9X/NT.

Để giải nén q1source.zip, bạn sẽ cần WinRar. Phiên bản v2.50 vẫn hoạt động tốt trên 9X/NT.

Bây giờ hãy khởi chạy VC++6. Chọn "Open Workspace" rồi chọn "WinQuake.dsw".

Các phiên bản Visual Studio hiện đại sử dụng .sln (Solution) và .vcxproj, nhưng Visual C++ 6 sử dụng .dsp và .dsw. Tệp dsp chứa một dự án duy nhất trong khi dsw là không gian làm việc trỏ đến các dự án dsp.

Quá trình biên dịch và các lỗi "kinh điển"

Quá trình build sẽ thất bại vì VC6++ không thể hợp ngữ (assemble) tất cả các tệp .s chứa mã assembly tối ưu hóa thủ công bởi Michael Abrash.

Các tệp .s được xây dựng bằng bước "Custom Build" "mycoolbuild" phụ thuộc vào trình hợp ngữ ml.exe. Nó đi kèm với gói VC++6 Processor Pack (vcpp5.exe).

Trước tiên, hãy cài đặt Visual Studio 6.0 Service Pack 5 (vc6sp5.exe). Tất nhiên, việc chạy setupsp5.exe sẽ thất bại. Đó là vì bạn cần cài đặt MDAC 2.5 trước.

Đừng mất một giờ để cố tải MDAC từ đâu đó. Bạn chỉ cần chạy mdac_typ.exe nằm trong cùng thư mục được tạo ra khi vs6spp5.exe tự giải nén.

Hãy quay lại và chạy setupsp5.exe. Lần này nó sẽ hoạt động. Đến lúc này, bạn sẽ cảm thấy như mình đang đang theo dõi lời giải của trò Monkey Island. Không gì hợp lý cả. Chúng ta chắc chắn đang ở sâu... trong thập niên 90.

Quá trình cài đặt và cấu hìnhQuá trình cài đặt và cấu hình

Thanh tiến trình nhỏ nhặt một cách kỳ lạ nhưng đây vẫn là tiến bộ.

Cài đặt VC++6 Processor Pack (vcpp5.exe). Bây giờ bạn nên thấy ml.exe nằm cạnh cl.exe trong thư mục bin của VC++6. Mở lại dự án với VC++6 và chạy "Rebuild All" một lần nữa. Lần này nó nên hoạt động.

Vâng, nó đã build thành công! Bạn cần sao chép PmProXX.dll, WdirXX.dll, và id1 thì trò chơi sẽ khởi chạy. Bạn thậm chí có thể build/chạy QuakeWorld và nó hoạt động với QSpy!

VC++6 là một công cụ đáng kể mạnh mẽ vào năm 1996. Nó có các tính năng như "Go to definition", điểm ngắt (breakpoints), truy vết ngăn xếp (stacktrace), và kiểm tra biến (nhưng chưa có tính năng tự động hoàn thành Intellisense). Tôi chưa bao giờ sử dụng nó nhưng nó chắc chắn phải cảm thấy như một giấc mơ vào thời điểm đó.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗