2P by GN⁺ | ★ favorite | 댓글 1개
  • Quake II 2023 재발매판의 게임 코드와 참조용 원본 게임 코드를 담고 있으며, 사용자가 게임을 모드화할 수 있게 하는 소스 코드
  • 모드는 원본 게임과 같은 방식으로 재발매판에 로드 가능하며, 실행 시 +set game mymod를 사용하거나 실행 중 콘솔에서 game mymod 입력 가능
  • 원본 게임 파일 수정을 피하기 위해 모드는 %USERPROFILE%\Saved Games\Nightdive Studios\Quake II 디렉터리에 설치하는 방식 권장
  • 재발매판은 서버와 게임 모듈 간 통신에 새 API를 사용하고, 기존에 하드코딩된 클라이언트 동작을 바꿀 수 있도록 Quake III Arena의 cgame 모듈과 유사한 얇은 클라이언트 게임 모듈을 도입함
  • 코드베이스는 원본 게임의 baseq2, ctf, rogue, xatrix 게임 모듈을 결합한 형태이며, C++17 컴파일러 필요
  • 컴파일은 Clang, VS2019, VS2022에서만 테스트되었고, C++17과 C++20 모두에서 컴파일 가능하며 C++20 사용 시 fmtlib 의존성 생략 가능
  • 의존성은 fmtlibjsoncpp이며, vcpkg install jsoncpp:x64-windows fmt:x64-windows로 설치 가능
  • 재발매판 DLL은 원본 확장팩 맵이 올바르게 로드되지 않을 수 있으며, 충돌하는 spawnflags 문제를 해결하기 위해 맵이 수정된 경우 존재
  • 기존 모드는 게임 export 인터페이스 변경에 맞춰 이전 가능할 수 있으나, 모든 확장팩을 하나의 코드베이스에서 지원하고 새 기능을 반영하기 위해 구조와 레이아웃에 큰 변경이 있어 새 코드베이스 사용 시 재작성 필요 가능성
  • 게임 DLL 내부 로직은 원본 엔진의 10hz 대신 40hz tickrate로 조정되었으며, 25ms 단위 단계와 대역폭·CPU 고려 사이의 균형을 이유로 40hz 선택
  • 저장 시스템은 포인터 오프셋과 메모리 복사 대신 레벨·게임 데이터를 UTF-8 JSON으로 기록하며, 저장 시스템은 더 이상 파일시스템과 직접 인터페이스하지 않음
  • Quake II 재발매판은 서버 프로토콜 version 2023을 사용하며, 대부분의 메시지는 하위 호환되지만 새 기능·변경 기능·상향된 제한을 위해 일부 조정됨
  • id Software는 이 릴리스에 대한 지원을 제공할 수 없으며, 커뮤니티 주도 리소스 활용을 권장함

댓글과 토론

Hacker News 의견들
  • Quake II가 내가 처음으로 C를 작성해 본 경험이었음
    코드는 명확하고 일관적이며 직선적이었고, 지금까지 읽은 최고의 소스라고까지 하진 않겠지만 기준을 높게 잡아 줬음. 이후 여러 게임 소스에서 화면 오른쪽을 넘어가는 중첩, 수많은 일을 하는 거대한 함수 같은 별난 코드를 많이 봤고, 단순한 코드로도 멋진 일을 할 수 있다는 초기 교훈이 됨
    1990년대 말~2000년대 초에는 Quake와 Quake II로 아이들에게 VR 수업을 했음. VR 헤드셋, Q.E.D.나 Qoole이 깔린 PC 몇 대를 놓고 12~14세 또는 14~18세 학생들에게 자기만의 가상현실 게임을 만들게 했음
    실제로는 몬스터나 총이 없는 Quake/Quake II 레벨을 만드는 것이었고, 레벨 안 트리거로 화면 메시지를 띄워 이야기를 전달했음. 어떤 팀은 슬라임을 건너가고 버튼으로 펌프를 켜 슬라임을 빼는 레벨을 만들었고, 다른 팀은 우주에 떠 있는 물 3D 미로를 만들어 헤엄쳐 지나가게 했음. 아직도 몇몇 학생 제작 레벨을 하드디스크에 갖고 있지만 일부는 실행이 잘 안 됨
    수업용으로는 블래스터 대신 조명탄 총을 주는 모드를 만들었음. 기본적으로 블래스터지만 효과음이 다르고 무기 모델이 없으며, 탄환이 중력 영향을 받고 튕기다가 일정 시간이 지나면 꺼지도록 바꿨음. 그 수업에 있었다면 헤드셋을 못 써 봤을 수도 있는데, 항상 제대로 동작하진 않았음

    • id의 코드는 확실히 깔끔하고 구조도 좋지만, 일반인 입장에서는 이해하기 꽤 어려웠음
      함수 안 주석은 비교적 드물고, 3D 그래픽에 대한 높은 이해가 없으면 당황스러운 암호 같은 표현식도 자주 나옴. Carmack 같은 업계 선도자의 산출물이라 당연하긴 하지만, 자신 있게 따라가려면 많은 사전지식과 어느 정도 수학적 성향이 필요함
    • 나도 그런 코드 쓴 죄가 있음
      예전에는 만성적으로 마카로니 코드를 썼고, 25줄짜리 코드가 열두 가지 기능의 뼈대가 되고 그 위에 또 열두 가지가 쌓이는 식이었음. 실행은 엄청 빠르지만 기술 부채가 빠르게 쌓였고, 결국 그 함수들은 건드리면 위에 얹힌 많은 것들이 깨질 위험 때문에 손댈 수 없게 됨
      주석으로 설명하려 했지만 커뮤니케이션이 좋지 않아 함수가 뭘 하는지만 쓰고 동작 원리는 안 썼음. “SINE 테이블 처리”, “테이블 조각 모음”, “이진 해석” 같은 식이었음. 다들 “이게 대체 뭐야? 그런데 빠르긴 엄청 빠르네”라고 했고, 비디오게임 말고 다른 분야였다면 나도 제품도 오래 못 갔을 것 같음
    • id 코드를 좋아한다면 John Carmack on Inlined Code (2014) 도 마음에 들 수 있음: https://news.ycombinator.com/item?id=12120752
    • id Software 소스를 자세히 파 본 적은 없지만, 정말 끔찍한 게임 소스는 많이 봤음. 기준선이 극도로 낮음
      성공했고 재미있고 충분히 안정적인 게임들이 뒤에서는 완전한 재앙 같은 코드로 출시됐다는 점이 놀라웠음. 그렇게 대충 짜깁기한 쓰레기도 충분히 수익을 낼 수 있다면, 혼란을 막으려고 들이는 내 노력과 시간이 가끔 의문스러워짐
    • 이 수업 결과물 스크린샷을 공유할 수 있으면 좋겠음. 정말 멋져 보임
  • 이 대목에서 웃었음: https://github.com/ESWAT/john-carmack-plan-archive/blob/mast...
    1997년 1월 31일 John Carmack의 .plan에서, 새 F355를 “합리적인” 차로 사러 Ferrari 매장에 갔다가 앞에 놓인 F40을 보고 결국 샀다는 내용임. 이후 Ferrari가 너무 많아졌으니 첫 Ferrari를 Quake 토너먼트 우승 상품으로 주겠다는 계획도 적었음
    상품은 1987년식 328 GTS 터보차저 모델이고, 1994년 1월 Turbo 잡지에 실렸으며, 섀시 다이노에서 후륜 360마력을 냈고, 새 엔진과 새 도색이 들어갔지만 실내는 손볼 곳이 있다고 함. 세금과 보험을 감당할 현금도 함께 주려 했음

    • 잠재 구매자가 온다고? 그럼 F40을 우연히 입구 바로 옆에 세워 두면 되겠네
  • Quake II 일화를 하나 남기자면, 내가 처음으로 끝까지 깬 1인칭 슈팅 게임이 Quake II였음
    다른 주에 사는 친구를 여름에 방문했을 때 일주일 동안 했고, 아니었다면 절대 허락받지 못했을 것 같음. 시작할 때는 원래 DOOM밖에 안 해 봐서 그 조작법을 그대로 썼는데, 의외로 먹혀서 별생각 없이 진행했음
    그러다 갑자기 시점이 천장에 고정돼 완전히 당황했는데, 알고 보니 마우스를 건드린 것이었고 한참 만지작거리다 마우스 시점 조작이라는 개념을 깨달았음. 그 뒤로 게임이 훨씬 쉬워짐
    인터넷도 없었고 나도 친구도 마우스 시점 조작을 몰랐으며, 진짜 3D FPS를 하는 사람을 본 적도 없었음. 이제는 지식이 너무 널리 퍼져 있어서 당시 게임 인터페이스가 얼마나 낯설고 외계적이었는지 상상하기 어려움. 소스 코드가 공개돼 반가움

    • 혹시 몰랐다면, 이건 Quake II 재출시판 소스 코드임. 원래 Quake II 소스 코드는 수년 전부터 공개돼 있었고[0], id Software의 여러 고전도 함께 공개돼 있음[1]
      [0]: https://github.com/id-Software/Quake-2
      [1]: https://github.com/id-Software
    • 처음으로 여러 사람이 LAN에서 FPS를 하는 걸 봤던 때가 떠오름
      1999년쯤 이탈리아 로마의 ComicCon에 있었는데, Half-Life가 막 골드 마스터에 들어가고 멀티플레이 데모가 공개된 시기였음. 최소 20명이 모두 LAN 멀티플레이 Half-Life를 하고 있었고, 마우스까지 쓰고 있었음. 미친 광경이었음
      그 뒤 2005년까지 수많은 LAN 파티에 갔지만, 온라인 매치메이킹이 QuakeNet과 사교 문화를 죽여 버림
  • 아, 추억 돋네
    1999년에 Quake II는 내가 하던 게임이었고, 말 그대로 거의 유일한 게임이었음. QII에 엄청난 시간을 쏟았고, 모드 제작으로 내 첫 코드를 썼음
    Quake II가 나를 컴퓨터 사용자에서 프로그래머로 바꿨다고 해도 과장이 아님. 성인 이후 삶과 커리어의 방향을 정해 줬음
    첫 모드를 만들며 벡터 계산, 기존 코드베이스 이해, 빠른 테스트를 위한 자동 빌드 통합을 배웠음. 맵 제작과 3D 아트도 조금 건드렸지만, 곧 내가 아티스트나 디자이너는 아니라는 걸 깨달음
    당시에는 버전 관리와 백업 정책이 전혀 없어서 원래 코드는 전부 잃어버렸음. 그다음 비슷하게 빠져든 게임은 Tribes 2였고, 거기서 가능한 스크립팅과 모딩은 정말 대단했음

    • 끝없는 파일 더미에서 내 모드의 바이너리를 찾았음
      https://xn0.co/Xeno-Mod_1.9_Setup.exe
      HN의 모두가 당연히 아무 인터넷 출처에서 실행 파일을 내려받아 실행하겠지만! 그래도 원본 QII가 있고 궁금하다면 실행해도 안전함
    • Tribes 2가 내 첫 모딩 경험이었고, 그 게임도 내 마음속에 아주 특별한 자리를 차지함. 이후 Ultima Online 에뮬레이터인 Sphere와 RunUO가 나를 게이머에서 프로그래머로 바꿔 줬음
    • 드롭다운 콘솔을 발견한 건 계시 같았음
      오마주: http://guake-project.org/
  • 엄청나고, 나를 그대로 90년대로 데려다 놓음. 정확히는 첫 Quake 얘기임
    침실 바닥에 Pentium 166MMX였던 것 같은 PC가 있었고, 친구가 조금 더 빠른 233쯤 되는 비슷한 기계를 들고 왔음. LAN 카드는 없었음
    아버지의 오래된 병렬 케이블을 써서 Windows가 LAN 연결인 것처럼 속였고, 충분히 잘 작동해서 며칠 동안 플레이했음. 그러다 약간 지겨워져서 모딩 장면에 빠졌는데, 직접 만들진 않고 공개된 것들을 내려받아 시험했음. Girobot과 KQP(Killer Quake Patch)는 절대 잊지 못함
    Girobot 봇들은 지형에 끼지만 않으면 상당히 강력했음. 진짜 금광은 KQP였고, 온갖 미친 모드와 무기, 봇 시스템을 추가해 줬음. Vampire Gun은 맞은 플레이어가 천천히, 하지만 너무 느리진 않게 고깃덩이 조각으로 부서져 죽게 만들어서 매번 배꼽 잡게 했음. 90년대가 정말 그리움

    • “Girobot”이라면 “Gyro Gearloose”의 Gyrobot[1]을 말하는 건가?
      참고로 KQP에는 ZeusBots도 포함됐던 걸로 알고 있음
      [1] https://github.com/Jason2Brownlee/QuakeBotArchive
    • 모뎀으로, 가끔은 T1으로 내려받은 Quake 2 멀티플레이용 모드, 맵, 스킨이 8GB나 있었음. 그 모드들이 정말 그리움
    • 아버지의 오래된 병렬 케이블이라니, 널 모뎀으로 연결한 건가? 대학 룸메이트와 아파트에서 같은 구성을 썼음. 90년대 중반이라 Doom 2와 그 시절 FPS를 했고, 좋은 추억임
  • 재출시판에 Linux 버전이 없다고 다른 곳에서 투덜대는 걸 봤는데, 이렇게 소스를 공개했고 clang으로 테스트됐다고 되어 있음. 원칙을 지킨 id에 큰 박수를 보냄

    • 왜 이번 소스 코드를 공개했는지 궁금함. 순전히 원칙 때문인지, 예전 코드도 GPL이라 법적 의무가 있었던 건지 모르겠음
      예전 코드도 자신들이 소유했을 테니 법적 의무는 없었을 거라고 생각함
    • 이 버전은 주요 플랫폼 전체에 출시됐고, 요즘 Nintendo와 Sony 모두 SDK 도구 체인에 Clang/LLVM을 쓰는 걸로 꽤 확신함. Linux도 염두에 뒀을 수는 있지만, 현대 콘솔에서 빌드되게 만드는 것이 주된 동기였을 것 같음
    • 이건 게임 코드뿐이고 엔진 소스 코드는 아닌 것 같은데, 내가 뭔가 놓친 건가?
  • 더 이상 판매되지 않고 현대 소프트웨어·하드웨어 스택에서 실행되지 않는 게임이 너무 많음
    소프트웨어에 대해 20년 동안 새 플랫폼에서 돌아가게 하는 패치를 내지 않았다면, 문화적 중요성 관점에서 오픈소스로 공개해야 한다는 법이 있으면 좋겠음

  • 이 소스처럼 C/C++에서 타입 접미사로 _t를 쓰는 것에 대해 어떻게 생각하는지 궁금함
    내 이해로는 언어 정의 타입용으로 예약돼 있지만, 합리적인 대안을 본 적이 없음. 접미사가 없으면 코드가 이상해지기도 함. 예를 들어 “viewport”용 커스텀 타입은 viewport viewport;보다 viewport_t viewport;가 더 낫다고 봄

    • 그건 C 언어 자체라기보다 POSIX 쪽 규칙으로 알고 있음. 어쨌든 내 개인 코드에서는 쓰지만, 내가 일해 온 코딩 표준에서는 비POSIX 환경에서도 자주 금지됐음
      보통 반대할 정도는 아니라 스타일 가이드가 원하는 대로 타입 이름을 붙임. t 접두사는 더 나쁘고, typedef 전체 단어를 붙이는 것도 더 나쁨
    • 내가 이해하기로 _t 접미사를 예약한 건 C가 아니라 POSIX임
      그래도 id Tech 코드베이스를 다루며 _s/_t 습관이 붙었고, 내 C 코드베이스에 영원히 “POSIX 비준수” 딱지가 붙어도 괜찮다고 판단했음. 그게 실제로 무슨 의미든 말임. C++에서는 그냥 InitialCamelCase를 씀
    • 모두 취향에 맞진 않겠지만, 나는 타입에는 CamelCase를 쓰고 변수에는 under_scores를 쓰는 편임. Viewport viewport; 같은 형태가 나오긴 해도, 적어도 Viewport가 타입이라는 건 쉽게 알 수 있음
    • IDE가 별로 도와주지 않을 때, 눈앞의 코드만 보고 어떤 것이 무엇인지 알아야 한다면 유용함
    • 내가 일하는 곳의 C 스타일 가이드는 _type을 쓰라고 정함
      흥미롭게도 커스텀 OS를 쓰는 임베디드 제품의 거대한 코드베이스는 고정 폭 정수 타입에 uint32_t 같은 타입을 쓰지 않음. 대신 회사 공통 헤더가 _t 접미사 없이 uint32 등을 정의함. 왜 그렇게 결정했는지는 모르겠음
  • 성장기에 나에게는 이 게임이 전부였음. 클랜, 래더, 그리고 진짜 온라인 게임 문화를 처음 알려 줬음
    내 맵은 The Edge였고, 무기는 레일건이나 로켓 런처였음. 당시에는 전화 접속이라 지연 시간이 좋은 서버를 찾는 게 중요했음. 가장 짜증 나는 건 모두에게 랙을 유발하는 그 총을 쓰는 사람들이었음
    Q3가 장르를 완성한 더 큰 게임이라는 건 알지만, 내가 가장 좋아하는 건 언제나 Quake 2일 것임. 탄탄한 싱글플레이와 확장팩도 있었고, 속도감도 나에게 딱 맞았음. Q3가 나오면서 모든 게 너무 빨라졌음

    • VQL 물리를 쓰는 Quake Live 서버가 마음에 들 수 있음
      VQL은 Q2에 훨씬 가깝고, PQL은 CPMA나 QuakeWorld에 더 가까움. 덤으로 The Edge도 Quake Live에서 플레이 가능함
    • 레일건으로 맞히고 머신건으로 마무리, gg
  • Quake 2 팬이고 Oculus Quest 2를 쓸 수 있다면 Quake2Quest를 해 보길 권함. 예전에 엄청 오래 보냈던 맵들을 직접 뛰어다니는 느낌이 정말 색다름