Biên dịch như năm 1992 (2014)
(fabiensanglard.net)- Mã nguồn gốc của Wolfenstein 3D năm 1992 không còn khớp ngay với các hệ thống hiện đại, nhưng vẫn có thể biên dịch lại nếu tái tạo môi trường DosBox và Borland C++ 3.1
- Các thành phần cần thiết gồm mã nguồn Wolfenstein 3D, DosBox, Borland C++ 3.1 và tài nguyên shareware để chạy
- Trong quá trình build, không chỉ cần chỉnh thiết lập dự án Borland C++ mà còn phải sửa trực tiếp đường dẫn
PATH,SIGNON.OBJ,GAMEPAL.OBJ - Lý do đồ họa bị lỗi khi chạy lần đầu là vì chỉ mục đồ họa được biên dịch vào engine không còn khớp với vị trí bên trong các tệp tài nguyên
- Có thể chạy game với tỷ lệ gần với màn hình CRT năm 1992 bằng cách sao chép lại các tài nguyên VGA đã được tái tạo và bật aspect correction trong DosBox
Tái tạo môi trường build năm 1992
- Mã nguồn gốc năm 1992 của Wolfenstein 3D rất khó dùng nguyên trạng trên các hệ thống hiện đại sau hơn 20 năm, nhưng vẫn có thể biên dịch nếu dùng đúng công cụ và môi trường chạy của thời đó
- Cần chuẩn bị bốn thành phần sau
- Mã nguồn Wolfenstein 3D
- DosBox
- Borland C++ 3.1
- Tài nguyên shareware của Wolfenstein 3D
Chuẩn bị thư mục dùng như ổ đĩa DOS
- Tạo 2 thư mục cục bộ để dùng như ổ đĩa DOS
system/csystem/a
- Tải tệp nén Borland C++ 3.1 vào
system/a - Tải mã nguồn Wolfenstein 3D và các tệp VGA vào
system/c - Sau khi giải nén, bố cục tệp được sắp xếp như sau
system/a:BCPP31.zipsystem/c:wolfsrc.zip,vgafiles.zip
Cài compiler và mã nguồn trong DosBox
- Sau khi chạy DosBox, mount các thư mục cục bộ thành ổ đĩa DOS
- Mount
~/system/cthànhC: - Mount
~/system/athànhA:
- Mount
- Chạy
installtrongA:\BCPP31để cài Borland C++ 3.1- Giữ nguyên cấu hình mặc định và bắt đầu cài đặt
- Cảnh báo không tìm thấy thư mục Microsoft Windows là không cần thiết, chỉ cần nhấn Enter để bỏ qua
- Tại
C:\, chạy trình cài đặt mã nguồn Wolfenstein 3D và dùng đường dẫn mặc định\WOLFSRC
Build dự án Borland C++
- Chạy Borland C++ 3.1 bằng
C:\BORLANDC\BIN\BC.EXE - Mở dự án
..\..\WOLFSRC\WOLF3D.PRJvà đặt thư mục như sauInclude Directories: C:\BORLANDC\INCLUDELibrary Directories: C:\BORLANDC\LIBOutput Directories: OBJSource Directories: C:\WOLFSRC
- Ở lần build đầu tiên sẽ xuất hiện lỗi
Cannot find executable TASM- Thoát Borland C++, đặt
PATH=C:\BORLANDC\BINrồi chạy lại
- Thoát Borland C++, đặt
- Ở lần build tiếp theo sẽ xuất hiện lỗi
Unable to find OBJ fileở bước liên kếtSIGNON.OBJvàGAMEPAL.OBJđang bị chỉ tới sai đường dẫnC:\SOURCE\WOLF\trong dự án- Xóa hai mục này khỏi dự án rồi thêm lại bằng
WOLFSRC\OBJ\SIGNON.OBJ,WOLFSRC\OBJ\GAMEPAL.OBJ
- Sau đó chạy
Compile -> Build Allthì build sẽ thành công
Tài nguyên chạy và nguyên nhân lỗi đồ họa
- Muốn chạy file thực thi đã biên dịch thì cần tài nguyên của Wolfenstein 3D bản shareware hoặc bản đầy đủ
- Sau khi cài shareware, nếu sao chép file
.EXEđã biên dịch vào thư mục game rồi chạy thì màn hình sẽ hiển thị bất thường - Nguyên nhân nằm ở pipeline tạo nội dung cho các tệp đồ họa và cách engine truy cập tài nguyên
- Adrian Carmack và Kevin Cloud tạo các tệp đồ họa rồi đóng gói bằng công cụ IGRABed
- Đầu ra gồm 3 tệp
VGAHEAD.WL1,VGAGRAPH.WL1,VGADICT.WL1và 2 tệpGRE.H,GRE.EQU
VGAHEAD.WL1là chỉ mục trỏ tới vị trí dữ liệu bên trongVGAGRAPH.WL1VGAGRAPH.WL1lưu dữ liệu nén HuffmanVGADICT.WL1chứa từ điển Huffman dùng để giải nén
GRE.HvàGRE.EQUlà các tệp giúp engine truy cập tài nguyên theo tên- Ví dụ, tên logic như
L_GUYPICđược ánh xạ tới giá trị chỉ mục thực tế - Engine được build với các chỉ mục hình ảnh hardcode sẵn bên trong
- Ví dụ, tên logic như
- Sau khi Wolfenstein 3D shareware phát hành, tài nguyên và codebase tiếp tục thay đổi cùng với Spear of Destiny, khiến chỉ mục của bản game biên dịch mới không còn khớp với vị trí trong các tệp tài nguyên cũ
Thay thế tài nguyên VGA và hiệu chỉnh tỷ lệ hiển thị
- Cách giải quyết là sao chép các tài nguyên VGA đã được tái tạo vào thư mục game sao cho khớp với các chỉ mục
.H,.EQUđi kèm trong mã nguồn - Nếu dùng tài nguyên shareware thì cần đổi phần mở rộng tệp từ
.WL6sang.WL1trước khi sao chépVGADICT.WL6→VGADICT.WL1VGAGRAPH.WL6→VGAGRAPH.WL1VGAHEAD.WL6→VGAHEAD.WL1
- Sau khi thay thế, chạy lại
WOLF3D.EXEthì game sẽ hoạt động bình thường - Màn hình mặc định của DosBox khác với những gì người dùng thấy vào năm 1992
- Framebuffer VGA là 320x200
- Màn hình CRT có tỷ lệ 4:3, nên khi hiển thị hình ảnh sẽ bị kéo dãn theo chiều dọc
- Trong cấu hình DosBox, nếu đổi
aspect=falsethànhaspect=truetrong mục[render]thì hiệu chỉnh tỷ lệ sẽ được áp dụng - Khi áp dụng cả hiệu chỉnh tỷ lệ, Wolfenstein 3D sẽ chạy với hình ảnh gần hơn với cách nó từng được hiển thị trên màn CRT thời đó
1 bình luận
Các ý kiến trên Hacker News
Rất khuyến nghị cuốn sách Wolfenstein 3D được nhắc đến ở cuối bài. Dù là nội dung kỹ thuật, sách không hề khô khan hay nhàm chán, và có rất nhiều tối ưu kiểu xưa như 64 hàm được trải sẵn để scale texture tường, cách lưu sprite “theo chiều ngang”, xử lý các card đồ họa kỳ quặc, hay hack chế độ đồ họa ngay từ đầu để trông giống game
Trông như chưa phát hành, đúng không?
Điểm hay của các hệ thống retro là chỉ cần gom đủ công cụ là có thể build lại. Gần đây tôi đã thử biên dịch lại game Uplink cũ cho vui; thứ cần thiết chỉ là Visual Studio 6.0, và archive phát triển đã chứa sẵn mọi dependency cần để build
Mất khoảng một giờ để khớp dependency, nhưng cuối cùng cũng thành công và game chạy tốt. Tôi còn sửa vài lỗi nhỏ và thêm một số cải tiến lặt vặt. Nghĩ đến việc đụng vào phần mềm ngày nay thì đúng là điên rồ
thirdparty/, và cố định cả toolchain đang dùng, nên thiết lập luôn tái lập đượcTôi học lập trình bằng Borland Turbo C++. Một trong những lý do tôi nhớ thời đó là những việc trông có vẻ phức tạp lại làm được quá dễ. Chỉ cần gọi hàm hình học là vẽ được hình lên màn hình, và sau khi vẽ một hình, gọi hàm
xorvới một hình hơi khác là có thể tạo animationTôi cùng bạn bè đã dùng kỹ thuật này để làm một game giống Final Fantasy, với sprite tự làm, map theo từng màn hình, thế giới chuyển sang map liền kề khi đi tới mép, và cơ chế vào trận nếu mỗi bước đi ra số tự nhiên 1. Dù khá phiền phức, với học sinh cấp ba thì cực kỳ vui, và điểm lớn là thay vì ngay từ đầu phải học SFML, ActiveX, OpenGL như ngày nay, chỉ cần gọi
circleconio.hngày xưa tốt đẹp và BGIgraphics.hcủa Borland. Ngày nay SDL phần nào đóng vai trò đó, nhưng không đơn giản đến vậySau khi thấy được nhắc đến nhiều lần ở đây trong mấy năm, vài tháng trước cuối cùng tôi đã đọc Masters of Doom, và đó là một cuốn sách xuất sắc. Những game họ làm thời đó tự thân đã cực kỳ thú vị để chơi, nhưng nhìn lại thì việc vài lập trình viên trẻ với rất ít nguồn lực có thể tạo ra những gì còn truyền cảm hứng hơn
Tôi thật sự nhớ UI dựa trên văn bản của DOS. Nhớ chiếc PS/2 đáng tin cậy mà tôi dùng mãi đến khoảng năm 1997
Cài vào ổ C ư, xa xỉ quá! Không có ổ cứng nên phải liên tục đổi đĩa mềm giữa ổ A và B, và trình biên dịch cứ đòi phần đã bị thay ra. Dù vậy chúng tôi vẫn thấy vui. Bọn trẻ ngày nay nghe kể mấy chuyện này cũng không tin đâu
Borland C++ thật sự xuất sắc. Một IDE có compiler C++, thư viện chuẩn và debugger nằm gọn trong khoảng 5MB, kèm bảng màu Borland ấm cúng với chữ vàng trên nền xanh dương
Các MS-DOS IDE của Borland là những ký ức ngọt ngào
Tôi đã dùng nó cho vài ngày Advent of Code năm nay, nhưng cảm giác hoài niệm nhanh chóng biến mất. Khi đã quen với môi trường hiện đại, các giới hạn của IDE và sự dài dòng của Pascal không “vui” để dùng hằng ngày. Dù vậy ký ức chắc chắn vẫn ngọt ngào
Đặc biệt là không nhận được nhấn riêng phím Alt, tổ hợp Alt+chữ, hay Ctrl+Shift+mũi tên trái/phải
Bài liên quan: Let’s compile like it’s 1992 (2014) - https://news.ycombinator.com/item?id=13750097 - tháng 2/2017, 80 bình luận
Tôi gặp vấn đề khi mở archive. Với
wolfsrc.zipcó lỗi End-of-central-directory signature not found, và thông báo rằng đó không phải file zip hoặc có thể là một phần của archive chia nhiều đĩacurl -O [http://fabiensanglard.net/Compile_Like_Its_1992/tools/wolfsr...](<http://fabiensanglard.net/Compile_Like_Its_1992/tools/wolfsrc.zip>)thì tải về một file HTMLKết quả
$ file wolfsrc.zipcũng làwolfsrc.zip: HTML document text, ASCII text. Trong khi đówgettải đúng file và giải nén không gặp vấn đề