2 điểm bởi GN⁺ 2023-08-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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 mymod khi chạy, hoặc nhập game mymod trong 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 cgame củ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, xatrix củ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 fmtlibjsoncpp, 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 đề spawnflags bị 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

 
GN⁺ 2023-08-11
Ý 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

    • Mã của id đúng là gọn gàng và có cấu trúc tốt, nhưng với người bình thường thì khá khó hiểu
      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
    • Tôi cũng có tội viết kiểu mã đó
      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
    • Nếu bạn thích mã của id, có thể bạn cũng sẽ thích John Carmack on Inlined Code (2014): https://news.ycombinator.com/item?id=12120752
    • Tôi chưa từng đào sâu vào mã nguồn của id Software, nhưng đã thấy rất nhiều mã nguồn game thật sự khủng khiếp. Chuẩn tối thiểu ở đây cực kỳ thấp
      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
    • Giá mà có thể chia sẻ ảnh chụp màn hình các sản phẩm của lớp học này. Nghe thật sự rất tuyệt
  • 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

    • Có khách mua tiềm năng đến à? Vậy cứ “tình cờ” đỗ chiếc F40 ngay cạnh lối vào là được
  • 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ố

    • Nếu bạn chưa biết, đây là mã nguồn của bản tái phát hành Quake II. Mã nguồn Quake II gốc đã được công bố từ nhiều năm trước[0], cùng với nhiều tác phẩm kinh điển khác của id Software[1]
      [0]: https://github.com/id-Software/Quake-2
      [1]: https://github.com/id-Software
    • Tôi nhớ lần đầu thấy nhiều người cùng chơi FPS qua LAN
      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

    • Tôi đã tìm thấy binary của mod mình trong một đống file vô tận
      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
    • Tribes 2 là trải nghiệm modding đầu tiên của tôi, và trò đó cũng có một vị trí rất đặc biệt trong lòng tôi. Sau đó, Sphere và RunUO, các emulator Ultima Online, đã biến tôi từ gamer thành lập trình viên
    • Phát hiện ra console dạng thả xuống đúng như một sự khai sáng
      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

    • Nếu nói “Girobot” thì có phải ý là Gyrobot[1] của “Gyro Gearloose” không?
      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 từng có tới 8GB mod, map, skin cho multiplayer Quake 2, tải bằng modem, thỉnh thoảng là T1. Nhớ những mod đó thật
    • Cáp song song cũ của bố bạn à, có phải là nối kiểu null modem không? Tôi từng dùng cấu hình tương tự trong căn hộ với bạn cùng phòng đại học. Đó là giữa thập niên 90 nên chúng tôi chơi Doom 2 và các FPS thời đó, kỷ niệm đẹp
  • 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 tò mò vì sao họ công khai source code lần này. Không biết thuần túy vì nguyên tắc, hay vì code cũ cũng là GPL nên có nghĩa vụ pháp lý
      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ý
    • Phiên bản này được phát hành trên toàn bộ các nền tảng lớn, và tôi khá chắc hiện nay cả Nintendo lẫn Sony đều dùng Clang/LLVM trong SDK toolchain của họ. Có thể họ cũng nghĩ tới Linux, nhưng tôi đoán động lực chính là làm cho nó build được trên các console hiện đại
    • Đây có vẻ chỉ là game code chứ không phải source code của engine, hay tôi bỏ sót gì đó?
  • 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ơn viewport viewport;

    • Theo tôi biết đó là quy tắc của POSIX hơn là của bản thân ngôn ngữ C. Dù sao thì trong code cá nhân tôi vẫn dùng, nhưng trong các coding standard mà tôi từng làm việc thì nó thường bị cấm, kể cả trong môi trường không phải POSIX
      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ố t còn tệ hơn, và gắn nguyên chữ typedef còn tệ hơn nữa
    • Theo hiểu biết của tôi, thứ dành riêng hậu tố _t là POSIX chứ không phải C
      Dù 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 InitialCamelCase
    • Không hợp gu tất cả mọi người, nhưng tôi thường dùng CamelCase cho kiểu và under_scores cho biến. Dù sẽ có dạng như Viewport viewport;, ít nhất vẫn dễ nhận ra Viewport là một kiểu
    • Khi IDE không giúp được nhiều, nếu phải nhìn ngay vào đoạn code trước mắt để biết cái nào là gì thì cách đó hữu ích
    • C style guide ở nơi tôi làm quy định dùng _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_t cho số nguyên độ rộng cố định. Thay vào đó, header chung của công ty định nghĩa uint32 v.v. mà không có hậu tố _t. Tôi không biết vì sao họ quyết định như vậy
  • Vớ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

    • Có thể bạn sẽ thích các server Quake Live dùng vật lý VQL
      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
    • Bắn trúng bằng railgun rồi kết liễu bằng machine gun, gg
  • 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ạ