Quake II Rerelease Game Source - Mã game cho bản tái phát hành Quake II 2023
(github.com/id-Software)- Mã nguồn chứa mã game của bản tái phát hành Quake II 2023 cùng mã game gốc để tham khảo, cho phép người dùng tạo mod cho game
- Mod có thể được nạp vào bản tái phát hành theo cùng cách như game gốc: dùng
+set game mymodkhi chạy, hoặc nhậpgame mymodtrong console khi đang chạy - Để tránh sửa đổi các tệp game gốc, nên cài mod vào thư mục
%USERPROFILE%\Saved Games\Nightdive Studios\Quake II - Bản tái phát hành sử dụng API mới để giao tiếp giữa server và module game, đồng thời đưa vào một module game phía client mỏng tương tự module
cgamecủa Quake III Arena để có thể thay đổi các hành vi client trước đây bị hard-code - Codebase là dạng kết hợp các module game
baseq2,ctf,rogue,xatrixcủa game gốc, và yêu cầu trình biên dịch C++17 - Việc biên dịch chỉ được thử nghiệm với Clang, VS2019, VS2022; có thể biên dịch bằng cả C++17 và C++20, và khi dùng C++20 có thể bỏ qua phụ thuộc
fmtlib - Các phụ thuộc gồm fmtlib và jsoncpp, có thể cài bằng
vcpkg install jsoncpp:x64-windows fmt:x64-windows - DLL của bản tái phát hành có thể khiến bản đồ từ các bản mở rộng gốc không được nạp đúng; có một số trường hợp bản đồ đã được chỉnh sửa để xử lý vấn đề
spawnflagsbị xung đột - Các mod hiện có có thể được chuyển đổi theo thay đổi của interface export game, nhưng do có những thay đổi lớn về cấu trúc và bố cục nhằm hỗ trợ mọi bản mở rộng trong một codebase và phản ánh các tính năng mới, có thể cần viết lại khi sử dụng codebase mới
- Logic nội bộ của DLL game đã được điều chỉnh sang tickrate 40hz thay vì 10hz của engine gốc; 40hz được chọn vì cân bằng giữa bước 25ms và các cân nhắc về băng thông/CPU
- Hệ thống lưu game ghi dữ liệu level và game dưới dạng JSON UTF-8 thay vì dùng offset con trỏ và sao chép bộ nhớ; hệ thống lưu không còn giao tiếp trực tiếp với filesystem nữa
- Bản tái phát hành Quake II sử dụng server protocol version 2023; phần lớn message vẫn tương thích ngược, nhưng có một số điều chỉnh cho các tính năng mới/đã thay đổi và các giới hạn được nâng lên
- id Software không thể cung cấp hỗ trợ cho bản phát hành này và khuyến nghị sử dụng các tài nguyên do cộng đồng dẫn dắt
1 bình luận
Ý kiến trên Hacker News
Quake II là trải nghiệm đầu tiên của tôi trong việc thử viết C
Mã nguồn rõ ràng, nhất quán và thẳng thắn; tôi không dám nói đó là nguồn hay nhất từng đọc cho đến nay, nhưng nó đã đặt tiêu chuẩn khá cao cho tôi. Về sau tôi đã thấy nhiều đoạn mã kỳ quặc trong mã nguồn của nhiều game, như các mức lồng nhau vượt quá mép phải màn hình, hay những hàm khổng lồ làm vô số việc; đó là bài học ban đầu rằng chỉ với mã đơn giản vẫn có thể làm được những điều tuyệt vời
Cuối thập niên 1990 đến đầu thập niên 2000, tôi dùng Quake và Quake II để dạy lớp VR cho trẻ em. Chúng tôi đặt headset VR và vài chiếc PC cài Q.E.D. hoặc Qoole, rồi cho học sinh 12–14 tuổi hoặc 14–18 tuổi tự tạo game thực tế ảo của riêng mình
Thực chất đó là tạo các màn Quake/Quake II không có quái vật hay súng, và dùng trigger trong màn để hiển thị thông điệp trên màn hình nhằm kể chuyện. Một nhóm tạo màn phải băng qua slime rồi bấm nút bật bơm để rút slime đi; nhóm khác tạo một mê cung nước 3D lơ lửng trong không gian để người chơi bơi qua. Tôi vẫn còn giữ vài màn do học sinh làm trên ổ cứng, nhưng một số không chạy ổn nữa
Để dùng cho lớp học, tôi làm một mod cấp cho người chơi súng bắn pháo sáng thay vì blaster. Về cơ bản vẫn là blaster, nhưng hiệu ứng âm thanh khác, không có model vũ khí, và đạn chịu tác động của trọng lực, nảy lên rồi tắt sau một khoảng thời gian. Nếu bạn từng ở lớp đó, có thể bạn chưa được thử headset, vì nó không phải lúc nào cũng hoạt động đúng
Chú thích trong hàm tương đối ít, và nếu không có hiểu biết sâu về đồ họa 3D thì thường gặp những biểu thức như mật mã khiến người ta bối rối. Đây là sản phẩm của một người dẫn đầu ngành như Carmack nên cũng dễ hiểu, nhưng để tự tin theo kịp cần rất nhiều kiến thức nền và phần nào đó là thiên hướng toán học
Trước đây tôi thường xuyên viết mã macaroni, kiểu 25 dòng mã làm bộ khung cho cả tá chức năng, rồi lại có cả tá thứ khác chồng lên trên. Chạy thì cực nhanh, nhưng nợ kỹ thuật tích tụ rất nhanh; rốt cuộc các hàm đó trở nên không thể động vào vì chỉ cần sửa là có nguy cơ làm hỏng rất nhiều thứ đặt bên trên
Tôi đã cố giải thích bằng chú thích, nhưng khả năng giao tiếp không tốt nên chỉ viết hàm làm gì, chứ không viết nguyên lý hoạt động. Kiểu như “xử lý bảng SINE”, “chống phân mảnh các mảnh bảng”, “diễn giải nhị phân”. Mọi người đều kiểu “Cái quái gì đây? Nhưng đúng là nhanh kinh khủng”, và nếu không phải trong lĩnh vực video game mà là lĩnh vực khác, có lẽ cả tôi lẫn sản phẩm đều không trụ được lâu
Thật đáng kinh ngạc khi những game thành công, vui và đủ ổn định lại được phát hành với phần mã phía sau như một thảm họa hoàn toàn. Nếu thứ rác rưởi vá víu cẩu thả như vậy vẫn đủ sinh lời, đôi khi tôi tự hỏi những nỗ lực và thời gian mình bỏ ra để ngăn hỗn loạn có đáng không
Tôi đã bật cười ở đoạn này: https://github.com/ESWAT/john-carmack-plan-archive/blob/mast...
Trong .plan ngày 31/1/1997 của John Carmack, ông kể rằng mình đến đại lý Ferrari để mua một chiếc F355 mới làm chiếc xe “hợp lý”, nhưng rồi thấy chiếc F40 ở phía trước và cuối cùng mua nó. Sau đó ông cũng viết kế hoạch rằng vì đã có quá nhiều Ferrari, ông sẽ tặng chiếc Ferrari đầu tiên của mình làm phần thưởng cho người thắng giải đấu Quake
Phần thưởng là mẫu 328 GTS đời 1987 có turbocharger, từng xuất hiện trên tạp chí Turbo số tháng 1/1994, đạt 360 mã lực ở bánh sau trên chassis dyno, đã có động cơ mới và sơn mới, nhưng nội thất còn cần sửa sang. Ông còn định tặng kèm tiền mặt để trang trải thuế và bảo hiểm
Kể một giai thoại về Quake II: đó là game bắn súng góc nhìn thứ nhất đầu tiên tôi chơi phá đảo từ đầu đến cuối
Tôi chơi nó trong một tuần khi đến thăm một người bạn ở bang khác vào mùa hè; nếu không có chuyến đó thì có lẽ tôi tuyệt đối không được phép chơi. Lúc bắt đầu, trước đó tôi vốn chỉ từng chơi DOOM nên dùng nguyên cách điều khiển đó, và bất ngờ là vẫn chơi được nên tôi cứ thế tiếp tục mà không nghĩ nhiều
Rồi đột nhiên góc nhìn bị cố định lên trần nhà khiến tôi hoàn toàn hoang mang; hóa ra là tôi đã chạm vào chuột, và sau một hồi loay hoay tôi mới nhận ra khái niệm điều khiển góc nhìn bằng chuột. Từ đó game trở nên dễ hơn rất nhiều
Khi ấy không có Internet, cả tôi lẫn bạn tôi đều không biết điều khiển góc nhìn bằng chuột, và cũng chưa từng thấy ai chơi một FPS 3D thực thụ. Giờ kiến thức này phổ biến đến mức khó tưởng tượng giao diện game thời đó xa lạ và “ngoài hành tinh” đến thế nào. Thật vui khi mã nguồn được công bố
[0]: https://github.com/id-Software/Quake-2
[1]: https://github.com/id-Software
Khoảng năm 1999, tôi ở ComicCon tại Rome, Ý; Half-Life vừa chuyển sang giai đoạn gold master và bản demo multiplayer đã được công bố. Ít nhất 20 người đều đang chơi Half-Life multiplayer qua LAN, và còn dùng cả chuột nữa. Đó là một cảnh tượng điên rồ
Sau đó đến tận năm 2005 tôi đã đi rất nhiều LAN party, nhưng matchmaking online đã giết chết QuakeNet và văn hóa giao lưu xã hội
À, đúng là gợi lại kỷ niệm
Năm 1999, Quake II là trò tôi chơi, và nói đúng nghĩa thì gần như là trò duy nhất. Tôi đã đổ rất nhiều thời gian vào QII, và viết những dòng code đầu tiên của mình bằng việc làm mod
Nói Quake II đã biến tôi từ một người dùng máy tính thành lập trình viên cũng không quá lời. Nó đã định hướng cuộc sống trưởng thành và sự nghiệp của tôi
Khi làm mod đầu tiên, tôi học được tính toán vector, hiểu một codebase có sẵn, và tích hợp build tự động để test nhanh. Tôi cũng đụng vào làm map và 3D art một chút, nhưng sớm nhận ra mình không phải artist hay designer
Hồi đó tôi hoàn toàn không có quản lý phiên bản hay chính sách backup, nên toàn bộ code gốc đã mất hết. Trò tiếp theo khiến tôi mê mẩn tương tự là Tribes 2, và khả năng scripting cùng modding trong đó thật sự tuyệt vời
https://xn0.co/Xeno-Mod_1.9_Setup.exe
Tất nhiên mọi người trên HN chắc chắn đều sẽ tải và chạy file thực thi từ bất kỳ nguồn Internet nào mà! Dù vậy, nếu bạn có QII gốc và tò mò thì chạy nó là an toàn
Lời tri ân: http://guake-project.org/
Thật dữ dội, kéo tôi thẳng về thập niên 90. Chính xác thì là chuyện về Quake đầu tiên
Trên sàn phòng ngủ có một chiếc PC hình như là Pentium 166MMX, và một người bạn mang tới một máy tương tự nhanh hơn chút, khoảng 233. Không có card LAN
Chúng tôi dùng cáp song song cũ của bố tôi để đánh lừa Windows như thể đó là kết nối LAN, và nó hoạt động đủ tốt để chơi suốt mấy ngày. Rồi hơi chán nên tôi lao vào scene modding, nhưng không tự làm mà tải các thứ được công khai về thử. Tôi sẽ không bao giờ quên Girobot và KQP (Killer Quake Patch)
Các bot Girobot khá mạnh nếu chúng không bị kẹt vào địa hình. Mỏ vàng thật sự là KQP, nó thêm đủ loại mod, vũ khí và hệ thống bot điên rồ. Vampire Gun khiến người chơi bị bắn chết bằng cách từ từ, nhưng không quá chậm, vỡ ra thành những mảnh thịt, lần nào cũng làm tôi cười đau bụng. Nhớ thập niên 90 thật
Nhân tiện, theo tôi biết KQP cũng bao gồm cả ZeusBots
[1] https://github.com/Jason2Brownlee/QuakeBotArchive
Tôi thấy ở nơi khác có người phàn nàn rằng bản phát hành lại không có phiên bản Linux, nhưng họ đã công khai source như thế này và ghi là đã test bằng clang. Xin vỗ tay lớn cho id vì đã giữ nguyên tắc
Tôi nghĩ code cũ chắc vẫn do họ sở hữu, nên hẳn không có nghĩa vụ pháp lý
Có quá nhiều game không còn được bán nữa và không chạy được trên stack phần mềm/phần cứng hiện đại
Giá mà có luật quy định rằng nếu trong 20 năm bạn không phát hành patch để phần mềm chạy được trên các nền tảng mới, thì xét từ góc độ tầm quan trọng văn hóa, bạn phải công khai nó dưới dạng open source
Tôi tò mò mọi người nghĩ gì về việc dùng _t làm hậu tố kiểu trong C/C++ như source này
Theo hiểu biết của tôi thì nó được dành riêng cho các kiểu do ngôn ngữ định nghĩa, nhưng tôi chưa thấy phương án thay thế hợp lý nào. Không có hậu tố thì code đôi khi trông kỳ. Ví dụ một kiểu tùy chỉnh cho “viewport” thì tôi thấy
viewport_t viewport;tốt hơnviewport viewport;Thường thì tôi không phản đối đến mức đó, nên style guide muốn đặt tên kiểu thế nào thì tôi theo thế ấy. Tiền tố
tcòn tệ hơn, và gắn nguyên chữtypedefcòn tệ hơn nữa_tlà POSIX chứ không phải CDù vậy, khi làm việc với codebase id Tech, tôi đã nhiễm thói quen
_s/_t, và tôi đã quyết định rằng nếu codebase C của mình bị dán nhãn “không tuân thủ POSIX” mãi mãi thì cũng ổn. Dù điều đó thực sự có nghĩa là gì đi nữa. Trong C++ thì tôi chỉ dùng InitialCamelCaseunder_scorescho biến. Dù sẽ có dạng nhưViewport viewport;, ít nhất vẫn dễ nhận raViewportlà một kiểu_typeĐiều thú vị là một codebase khổng lồ của sản phẩm nhúng dùng OS tùy chỉnh lại không dùng các kiểu như
uint32_tcho số nguyên độ rộng cố định. Thay vào đó, header chung của công ty định nghĩauint32v.v. mà không có hậu tố_t. Tôi không biết vì sao họ quyết định như vậyVới tôi thời còn trưởng thành, trò này là tất cả. Nó lần đầu cho tôi biết về clan, ladder và cả văn hóa game online thực sự
Map của tôi là The Edge, vũ khí là railgun hoặc rocket launcher. Hồi đó còn dùng dial-up nên việc tìm server có độ trễ tốt là rất quan trọng. Thứ khó chịu nhất là những người dùng khẩu súng gây lag cho tất cả mọi người
Tôi biết Q3 là một game lớn hơn, hoàn thiện thể loại này hơn, nhưng trò tôi thích nhất sẽ luôn là Quake 2. Nó có phần chơi đơn và các bản mở rộng chắc tay, tốc độ cũng vừa đúng với tôi. Khi Q3 ra mắt, mọi thứ trở nên quá nhanh
VQL gần với Q2 hơn nhiều, còn PQL thì gần với CPMA hoặc QuakeWorld hơn. Thêm nữa, The Edge cũng có thể chơi được trong Quake Live
Nếu là fan Quake 2 và có thể dùng Oculus Quest 2, tôi khuyên nên thử Quake2Quest. Cảm giác được tự mình chạy quanh những map mà ngày xưa mình từng dành rất nhiều thời gian thật sự rất khác lạ