Quake II Rerelease Game Source - โค้ดเกมสำหรับ Quake II 2023 ฉบับวางจำหน่ายใหม่
(github.com/id-Software)- มี โค้ดเกม ของ Quake II 2023 ฉบับวางจำหน่ายใหม่ และโค้ดเกมต้นฉบับสำหรับใช้อ้างอิง ซึ่งเป็นซอร์สโค้ดที่ช่วยให้ผู้ใช้สามารถทำม็อดให้เกมได้
- ม็อดสามารถโหลดเข้ากับฉบับวางจำหน่ายใหม่ได้ในลักษณะเดียวกับเกมต้นฉบับ โดยใช้
+set game mymodตอนเปิดเกม หรือพิมพ์game mymodในคอนโซลระหว่างเล่นก็ได้ - เพื่อหลีกเลี่ยงการแก้ไขไฟล์เกมต้นฉบับ แนะนำให้ติดตั้งม็อดไว้ในไดเรกทอรี
%USERPROFILE%\Saved Games\Nightdive Studios\Quake II - ฉบับวางจำหน่ายใหม่ใช้ API ใหม่สำหรับการสื่อสารระหว่างเซิร์ฟเวอร์กับโมดูลเกม และเพิ่มโมดูลเกมฝั่งไคลเอนต์แบบบางที่คล้ายกับโมดูล
cgameของ Quake III Arena เพื่อให้สามารถเปลี่ยนพฤติกรรมไคลเอนต์ที่เดิมฝังตายไว้ในโค้ดได้ - โค้ดเบสเป็นการรวมโมดูลเกม
baseq2,ctf,rogue,xatrixของเกมต้นฉบับเข้าด้วยกัน และต้องใช้คอมไพเลอร์ C++17 - การคอมไพล์ได้รับการทดสอบเฉพาะบน Clang, VS2019 และ VS2022 และสามารถคอมไพล์ได้ทั้ง C++17 และ C++20 โดยหากใช้ C++20 จะไม่จำเป็นต้องมี dependency ของ
fmtlib - dependency ที่ต้องใช้คือ fmtlib และ jsoncpp ซึ่งติดตั้งได้ด้วย
vcpkg install jsoncpp:x64-windows fmt:x64-windows - DLL ของฉบับวางจำหน่ายใหม่อาจโหลดแผนที่ของภาคเสริมต้นฉบับได้ไม่ถูกต้อง และมีบางกรณีที่แผนที่ถูกแก้ไขเพื่อแก้ปัญหา
spawnflagsที่ชนกัน - ม็อดเดิมอาจพอร์ตมาได้ตามการเปลี่ยนแปลงของอินเทอร์เฟซ game export แต่เนื่องจากมีการเปลี่ยนแปลงใหญ่ในโครงสร้างและเลย์เอาต์เพื่อรองรับภาคเสริมทั้งหมดในโค้ดเบสเดียวและสะท้อนฟีเจอร์ใหม่ จึงอาจต้องเขียนใหม่หากจะใช้โค้ดเบสใหม่นี้
- ลอจิกภายใน DLL ของเกมถูกปรับจาก 40hz tickrate แทน 10hz ของเอนจินต้นฉบับ โดยเลือก 40hz เพื่อให้สมดุลระหว่างช่วงเวลา 25ms กับข้อพิจารณาเรื่องแบนด์วิดท์และ CPU
- ระบบเซฟจะบันทึกข้อมูลเลเวลและข้อมูลเกมเป็น UTF-8 JSON แทนการใช้ pointer offset และการคัดลอกหน่วยความจำ และระบบเซฟจะไม่เชื่อมต่อกับไฟล์ซิสเต็มโดยตรงอีกต่อไป
- Quake II ฉบับวางจำหน่ายใหม่ใช้เซิร์ฟเวอร์โปรโตคอล version 2023 โดยข้อความส่วนใหญ่ยังคงเข้ากันได้แบบย้อนหลัง แต่มีการปรับบางส่วนเพื่อรองรับฟีเจอร์ใหม่ ฟังก์ชันที่เปลี่ยนไป และการเพิ่มขีดจำกัด
- id Software ไม่สามารถให้การสนับสนุนสำหรับรีลีสนี้ได้ และแนะนำให้ใช้ทรัพยากรที่ขับเคลื่อนโดยชุมชน
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
Quake II คือประสบการณ์ครั้งแรกที่ผมได้ เขียน C
โค้ดชัดเจน สม่ำเสมอ และตรงไปตรงมา ถึงจะไม่ถึงกับบอกว่าเป็นซอร์สที่ดีที่สุดเท่าที่เคยอ่านมา แต่ก็ทำให้มาตรฐานของผมสูงขึ้น หลังจากนั้นผมเห็นโค้ดประหลาด ๆ ในซอร์สเกมหลายตัว เช่น การซ้อนกันที่ล้นไปทางขวาของหน้าจอ หรือฟังก์ชันยักษ์ที่ทำงานสารพัดอย่าง และมันกลายเป็นบทเรียนแรก ๆ ว่าโค้ดที่เรียบง่ายก็ทำสิ่งเจ๋ง ๆ ได้
ช่วงปลายทศวรรษ 1990 ถึงต้นทศวรรษ 2000 ผมใช้ Quake และ Quake II สอน VR ให้เด็ก ๆ มีเฮดเซ็ต VR กับพีซีไม่กี่เครื่องที่ลง Q.E.D. หรือ Qoole ไว้ แล้วให้เด็กอายุ 12–14 ปี หรือ 14–18 ปี สร้างเกมโลกเสมือนของตัวเอง
จริง ๆ แล้วคือการสร้างเลเวล Quake/Quake II ที่ไม่มีมอนสเตอร์หรือปืน และใช้ทริกเกอร์ในเลเวลแสดงข้อความบนหน้าจอเพื่อเล่าเรื่อง บางทีมทำเลเวลที่ต้องข้ามสไลม์แล้วกดปุ่มเปิดปั๊มเพื่อระบายสไลม์ออก อีกทีมทำเขาวงกตน้ำ 3D ที่ลอยอยู่ในอวกาศให้ว่ายผ่านไป ผมยังมีเลเวลบางส่วนที่นักเรียนทำเก็บไว้ในฮาร์ดดิสก์ แต่บางอันก็รันได้ไม่ค่อยดีแล้ว
สำหรับใช้ในชั้นเรียน ผมทำม็อดที่ให้ปืนพลุแทนบลาสเตอร์ โดยพื้นฐานยังเป็นบลาสเตอร์ แต่เอฟเฟกต์เสียงต่างออกไป ไม่มีโมเดลอาวุธ และปรับให้กระสุนได้รับผลจากแรงโน้มถ่วง กระเด้งไปมา แล้วดับลงหลังผ่านไประยะหนึ่ง ถ้าคุณเคยอยู่ในคลาสนั้น คุณอาจไม่ได้ลองใส่เฮดเซ็ตก็ได้ เพราะมันไม่ได้ทำงานถูกต้องเสมอไป
คอมเมนต์ในฟังก์ชันมีค่อนข้างน้อย และถ้าไม่มีความเข้าใจด้านกราฟิก 3D ในระดับสูง ก็มักจะเจอ นิพจน์เหมือนรหัสลับ ที่ทำให้งงได้บ่อย ๆ ก็เป็นเรื่องธรรมดาเพราะเป็นผลงานของผู้นำวงการอย่าง Carmack แต่ถ้าจะตามให้ทันอย่างมั่นใจ ต้องมีพื้นฐานล่วงหน้าเยอะและมี แนวโน้มทางคณิตศาสตร์ อยู่พอสมควร
สมัยก่อนผมเขียน โค้ดมักกะโรนี เป็นประจำ โค้ด 25 บรรทัดกลายเป็นโครงของฟีเจอร์เป็นสิบ ๆ อย่าง แล้วก็มีอีกสิบ ๆ อย่างซ้อนทับอยู่ข้างบน มันรันเร็วมาก แต่หนี้ทางเทคนิคก็สะสมอย่างรวดเร็ว และสุดท้ายฟังก์ชันเหล่านั้นก็แตะต้องไม่ได้ เพราะเสี่ยงจะทำให้สิ่งต่าง ๆ มากมายที่พึ่งพามันอยู่พัง
ผมพยายามอธิบายด้วยคอมเมนต์ แต่การสื่อสารไม่ดี เลยเขียนแค่ว่าฟังก์ชันทำอะไร ไม่ได้เขียนว่ามันทำงานอย่างไร เช่น “ประมวลผลตาราง SINE”, “จัดเรียงชิ้นส่วนตาราง”, “ตีความไบนารี” อะไรทำนองนั้น ทุกคนก็พูดว่า “นี่มันอะไรกันวะ? แต่เร็วโคตร ๆ เลยนะ” และถ้าไม่ใช่วงการวิดีโอเกม ผมคิดว่าทั้งตัวผมและผลิตภัณฑ์คงอยู่ได้ไม่นาน
น่าทึ่งที่เกมที่ประสบความสำเร็จ สนุก และเสถียรพอสมควร ถูกปล่อยออกมาพร้อมโค้ดเบื้องหลังที่เป็นหายนะสมบูรณ์แบบ พอเห็นว่าขยะที่ปะติดปะต่อกันแบบลวก ๆ ก็ยังทำเงินได้พอ บางครั้งก็ทำให้ผมสงสัยความพยายามและเวลาที่ตัวเองใช้เพื่อป้องกันความวุ่นวาย
ผมหัวเราะตรงนี้: https://github.com/ESWAT/john-carmack-plan-archive/blob/mast...
ใน .plan ของ John Carmack วันที่ 31 มกราคม 1997 เขาเล่าว่าไปที่โชว์รูม Ferrari เพื่อซื้อ F355 คันใหม่เป็นรถที่ “สมเหตุสมผล” แต่พอเห็น F40 อยู่ตรงหน้า สุดท้ายก็ซื้อมาแทน หลังจากนั้นยังเขียนแผนว่าจะให้ Ferrari คันแรกของเขาเป็นรางวัลผู้ชนะ ทัวร์นาเมนต์ Quake เพราะมี Ferrari มากเกินไปแล้ว
รางวัลคือ 328 GTS ปี 1987 รุ่นติดเทอร์โบ เคยลงในนิตยสาร Turbo ฉบับมกราคม 1994 ทำแรงม้าลงล้อหลังได้ 360 แรงม้าบนแชสซีไดโน และมีเครื่องยนต์ใหม่กับสีใหม่ แต่บอกว่าภายในยังมีจุดที่ต้องทำอยู่ เขาตั้งใจจะให้เงินสดไปด้วยเพื่อครอบคลุมภาษีและประกัน
ถ้าจะเล่าเกร็ดเกี่ยวกับ Quake II สักเรื่อง Quake II เป็น เกมยิงมุมมองบุคคลที่หนึ่ง เกมแรกที่ผมเล่นจนจบ
ตอนฤดูร้อนผมไปเยี่ยมเพื่อนที่อยู่อีกรัฐหนึ่งและเล่นอยู่หนึ่งสัปดาห์ ถ้าไม่ใช่แบบนั้นผมคงไม่มีทางได้รับอนุญาตให้เล่นแน่ ๆ ตอนเริ่มผมเคยเล่นแค่ DOOM เลยใช้วิธีควบคุมแบบนั้นเหมือนเดิม ซึ่งก็ใช้ได้อย่างน่าประหลาดใจ เลยเล่นต่อไปโดยไม่ได้คิดอะไรมาก
แล้วจู่ ๆ มุมมองก็ติดอยู่ที่เพดาน ทำเอางงสุด ๆ ปรากฏว่าผมไปขยับเมาส์เข้า และหลังจากลองงมอยู่นานก็เข้าใจแนวคิดของ การบังคับมุมมองด้วยเมาส์ หลังจากนั้นเกมก็ง่ายขึ้นมาก
ตอนนั้นไม่มีอินเทอร์เน็ต ทั้งผมและเพื่อนก็ไม่รู้เรื่องการบังคับมุมมองด้วยเมาส์ และไม่เคยเห็นใครเล่น FPS 3D แท้ ๆ มาก่อน ตอนนี้ความรู้แพร่หลายมากจนยากจะจินตนาการได้ว่าอินเทอร์เฟซเกมในยุคนั้นแปลกและเหมือนของต่างดาวแค่ไหน ดีใจที่ซอร์สโค้ดถูกเผยแพร่
[0]: https://github.com/id-Software/Quake-2
[1]: https://github.com/id-Software
ราวปี 1999 ผมอยู่ที่ ComicCon ในกรุงโรม อิตาลี ตอนนั้น Half-Life เพิ่งเข้าสู่สถานะ gold master และเดโมมัลติเพลเยอร์เพิ่งถูกปล่อยออกมา มีอย่างน้อย 20 คนกำลังเล่น Half-Life แบบมัลติเพลเยอร์ผ่าน LAN กันอยู่ทั้งหมด แถมยังใช้เมาส์ด้วย เป็นภาพที่บ้าบอมาก
หลังจากนั้นผมไป LAN party มากมายจนถึงปี 2005 แต่ระบบจับคู่ออนไลน์ก็ฆ่า QuakeNet และวัฒนธรรมการเข้าสังคมไป
อา ชวนคิดถึงจริง ๆ
ปี 1999 Quake II คือเกมที่ผมเล่นอยู่ และพูดได้ว่าแทบจะเป็นเกมเดียวที่เล่นเลย ผมทุ่มเวลาให้ QII ไปมหาศาล และเขียนโค้ดครั้งแรกจากการ ทำม็อด
จะบอกว่า Quake II เปลี่ยนผมจากผู้ใช้คอมพิวเตอร์ให้กลายเป็นโปรแกรมเมอร์ก็คงไม่เกินจริง มันกำหนดทิศทางชีวิตและอาชีพของผมหลังโตเป็นผู้ใหญ่
ตอนทำม็อดแรก ผมได้เรียนรู้การคำนวณเวกเตอร์ การทำความเข้าใจ codebase ที่มีอยู่ และการผสาน automated build เพื่อทดสอบได้เร็ว ๆ ผมลองแตะการทำแผนที่กับงานศิลป์ 3D อยู่บ้าง แต่ไม่นานก็รู้ว่าตัวเองไม่ใช่ศิลปินหรือนักออกแบบ
สมัยนั้นไม่มีระบบ version control หรือ policy การสำรองข้อมูลเลย โค้ดต้นฉบับทั้งหมดจึงหายไปหมด เกมถัดมาที่ผมติดในทำนองเดียวกันคือ Tribes 2 และความสามารถด้าน scripting กับ modding ในเกมนั้นก็ยอดเยี่ยมมากจริง ๆ
https://xn0.co/Xeno-Mod_1.9_Setup.exe
แน่นอนว่าทุกคนใน HN คงดาวน์โหลดไฟล์ executable จากแหล่งใดก็ได้บนอินเทอร์เน็ตมาเปิดรันกันอยู่แล้ว! แต่ถ้าคุณมี QII ต้นฉบับและอยากลอง ก็รันได้อย่างปลอดภัย
งานคารวะ: http://guake-project.org/
สุดยอดมาก พาผมย้อนกลับไปยุค 90s แบบเต็ม ๆ พูดให้ถูกคือเรื่อง Quake ภาคแรก
บนพื้นห้องนอนมีพีซีเครื่องหนึ่ง น่าจะเป็น Pentium 166MMX และเพื่อนผมก็เอาเครื่องคล้าย ๆ กันที่เร็วกว่าเล็กน้อย แถว ๆ 233 มา ไม่มีการ์ด LAN
เราใช้ สาย parallel เก่า ๆ ของพ่อผมหลอก Windows ให้คิดว่าเป็นการเชื่อมต่อ LAN และมันก็ทำงานดีพอจนเราเล่นกันได้หลายวัน จากนั้นก็เริ่มเบื่อนิดหน่อยแล้วหลุดเข้าไปในวงการ modding แต่ไม่ได้ทำเอง แค่ดาวน์โหลดของที่เผยแพร่มาลอง ผมไม่มีวันลืม Girobot กับ KQP (Killer Quake Patch)
บอต Girobot ค่อนข้างเก่งมาก ตราบใดที่มันไม่ไปติดอยู่กับภูมิประเทศ ขุมทรัพย์ตัวจริงคือ KQP ซึ่งเพิ่มม็อด อาวุธ และระบบบอตบ้า ๆ ทุกแบบเข้ามา Vampire Gun ทำให้ผู้เล่นที่โดนยิงค่อย ๆ แต่ก็ไม่ช้าจนเกินไป แตกสลายตายเป็นชิ้นเนื้อ ทำให้หัวเราะท้องแข็งทุกครั้ง คิดถึงยุค 90s จริง ๆ
เท่าที่รู้ KQP ก็มี ZeusBots รวมอยู่ด้วย
[1] https://github.com/Jason2Brownlee/QuakeBotArchive
เห็นที่อื่นมีคนบ่นว่า rerelease ไม่มีเวอร์ชัน Linux แต่เขาเปิดซอร์สแบบนี้ และบอกว่าทดสอบด้วย clang แล้ว ขอปรบมือดัง ๆ ให้ id ที่ยึดหลักการ
ผมคิดว่าโค้ดเก่าก็น่าจะยังเป็นของพวกเขาเอง ดังนั้นไม่น่าจะมีข้อผูกพันทางกฎหมาย
มีเกมจำนวนมากเกินไปที่ไม่ขายแล้ว และรันไม่ได้บนสแต็กซอฟต์แวร์/ฮาร์ดแวร์สมัยใหม่
ถ้าซอฟต์แวร์ไม่ได้ออกแพตช์ให้รันบนแพลตฟอร์มใหม่ ๆ มา 20 ปีแล้ว ผมอยากให้มีกฎหมายกำหนดว่าควรเปิดเป็นโอเพนซอร์สในแง่ของ ความสำคัญทางวัฒนธรรม
ผมสงสัยว่าคนอื่นคิดอย่างไรกับการใช้ _t เป็น suffix ของ type ใน C/C++ แบบซอร์สนี้
ตามที่ผมเข้าใจ มันถูกสงวนไว้สำหรับ type ที่นิยามโดยภาษา แต่ผมก็ยังไม่เคยเห็นทางเลือกที่สมเหตุสมผล ถ้าไม่มี suffix โค้ดบางทีก็ดูแปลก เช่น custom type สำหรับ “viewport” ผมว่า
viewport_t viewport;ดีกว่าviewport viewport;ปกติผมไม่ได้ต่อต้านถึงขั้นนั้น ก็เลยตั้งชื่อ type ตามที่ style guide ต้องการ คำนำหน้า
tแย่กว่า และการใส่คำเต็มtypedefก็แย่ยิ่งกว่า_tไม่ใช่ C แต่เป็น POSIXถึงอย่างนั้น หลังจากทำงานกับ codebase ของ id Tech ผมก็ติดนิสัย
_s/_tมา และตัดสินใจว่าโอเคถ้า codebase ภาษา C ของผมจะถูกแปะป้ายว่า “ไม่เป็นไปตาม POSIX” ไปตลอดกาล ไม่ว่ามันจะหมายความว่าอะไรก็ตาม ส่วนใน C++ ผมใช้ InitialCamelCase เฉย ๆunder_scoresกับตัวแปร แม้จะได้รูปแบบอย่างViewport viewport;ออกมา แต่อย่างน้อยก็ดูออกง่ายว่าViewportเป็น type_typeที่น่าสนใจคือ codebase ขนาดมหึมาของผลิตภัณฑ์ embedded ที่ใช้ OS แบบ custom ไม่ได้ใช้ type แบบ
uint32_tสำหรับ fixed-width integer แต่ header กลางของบริษัทนิยามuint32อะไรทำนองนี้แทน โดยไม่มี suffix_tผมก็ไม่รู้เหมือนกันว่าทำไมถึงตัดสินใจกันแบบนั้นช่วงที่ผมกำลังโต เกมนี้คือทุกอย่างสำหรับผม มันทำให้ผมได้รู้จักแคลน, ladder และ วัฒนธรรมเกมออนไลน์ จริง ๆ เป็นครั้งแรก
แผนที่ของผมคือ The Edge และอาวุธก็เป็น railgun หรือ rocket launcher ตอนนั้นยังเป็นยุค dial-up การหาเซิร์ฟเวอร์ที่มี latency ดี ๆ จึงสำคัญมาก สิ่งที่น่าหงุดหงิดที่สุดคือพวกคนที่ใช้ปืนนั่นแล้วทำให้ทุกคน lag
ผมรู้ว่า Q3 เป็นเกมที่ใหญ่กว่าและทำให้แนวนี้สมบูรณ์แบบขึ้น แต่เกมที่ผมชอบที่สุดจะเป็น Quake 2 เสมอ มันมี single-player ที่แน่นและ expansion pack ด้วย และความเร็วของเกมก็พอดีกับผม พอ Q3 ออกมา ทุกอย่างก็เร็วเกินไป
VQL ใกล้เคียงกับ Q2 มากกว่า ส่วน PQL ใกล้กับ CPMA หรือ QuakeWorld มากกว่า แถม The Edge ก็เล่นได้ใน Quake Live ด้วย
ถ้าคุณเป็นแฟน Quake 2 และมี Oculus Quest 2 ให้ใช้ ขอแนะนำให้ลอง Quake2Quest ความรู้สึกเหมือนได้วิ่งอยู่ในแผนที่ที่เคยใช้เวลาอยู่กับมันนานมากเมื่อก่อนด้วยตัวเองนั้นแปลกใหม่จริง ๆ