하프라이프 2를 퀘이크 1 엔진으로 구동하다: Rad-Therapy II와 레거시 코드의 역습
서론: 기술적 광기, 혹은 순수한 열정
우리는 매일 ‘레거시(Legacy)‘와 싸웁니다. 5년 된 코드베이스도 낡았다고 불평하고, 최신 언어와 프레임워크로 마이그레이션하는 것을 엔지니어링의 미덕으로 여기곤 하죠. 그런데 여기, 시계바늘을 거꾸로 돌리다 못해 부수어 버린 프로젝트가 있습니다.
2004년작 Half-Life 2 를 1996년작 Quake 1 엔진 으로 구동하는 프로젝트, 바로 Rad-Therapy II 입니다.
처음 이 소식을 접했을 때 저는 만우절 농담인 줄 알았습니다. 물리 엔진(Havok)에 의존적인 하프라이프 2를, 3D 가속 카드도 없던 시절에 태어난 퀘이크 엔진으로 포팅한다니요? 하지만 코드를 들여다보고 구동 방식을 이해하는 순간, 이것이 단순한 장난이 아니라 엔진 아키텍처와 추상화 계층(Abstraction Layer)에 대한 깊은 이해가 동반된 ‘엔지니어링 차력쇼’라는 것을 깨달았습니다.
오늘은 이 기이하고도 놀라운 프로젝트를 기술적 관점에서 뜯어보겠습니다.
기술적 분석: 어떻게 가능한가?
1. 순정 퀘이크가 아니다: FTEQW의 마법
가장 먼저 짚고 넘어가야 할 점은, 이 프로젝트가 1996년 존 카맥이 짠 WinQuake.exe 바이너리 위에서 돌아가는 것은 아니라는 점입니다. 이 프로젝트의 핵심에는 FTEQW (FTE Quake World)라는 엔진이 있습니다.
Hacker News의 한 유저가 지적했듯이, FTE는 사실상 ‘순수 퀘이크’라고 보기 어렵습니다.
“FTE barely qualifies as a pure Quake engine at this point though, it does tons of stuff.”
FTEQW는 퀘이크 엔진의 소스 포트(Source Port)지만, 현대적인 렌더링 파이프라인, 실시간 라이팅, 그리고 무엇보다 확장된 파일 시스템과 스크립팅 을 지원합니다. Rad-Therapy II는 이 FTE 엔진의 유연성을 극한으로 활용합니다.
2. Clean-room Implementation (클린룸 구현)
이 프로젝트의 README에는 Clean-room implementation 이라는 단어가 등장합니다. 이는 리버스 엔지니어링의 법적/기술적 핵심 개념입니다. 밸브(Valve)의 소스 엔진 코드를 훔쳐보거나 복사한 것이 아니라, 게임의 동작 방식(Behavior)만을 관찰하고 퀘이크 엔진의 스크립트 언어인 QuakeC 와 플러그인으로 재구현했다는 뜻입니다.
소스 코드를 보면 흥미로운 지점들이 보입니다:
- Logic: 게임 로직은
progs.dat형태로 컴파일되는 QuakeC로 작성되었습니다. - Assets: 하프라이프 2의
.vpk파일이나 맵 포맷을 읽어들이기 위해 별도의 플러그인 빌드(make plugins)가 필요합니다.
즉, 하프라이프 2의 데이터(Data) 는 그대로 쓰되, 그 데이터를 해석하고 화면에 뿌리는 로직(Logic) 을 퀘이크 엔진 규격에 맞게 처음부터 다시 짠 것입니다. 이는 ‘데이터 주도 설계(Data-Driven Design)‘가 얼마나 강력할 수 있는지 보여주는 극단적인 예시입니다.
3. 빌드 시스템: Nuclide SDK
개발자는 Nuclide 라는 자체 SDK를 사용합니다. 이는 id Tech 기반 엔진들을 위한 일종의 통합 개발 환경/프레임워크로 보입니다.
git clone https://code.idtech.space/fn/hl2 hl2
make game GAME=hl2
make plugins GAME=hl2
위 빌드 커맨드를 보면, 게임 로직(make game)과 데이터 로더(make plugins)가 분리되어 있음을 알 수 있습니다. 이는 엔진 코어를 건드리지 않고도 모듈식으로 기능을 확장할 수 있는 구조를 잘 갖추고 있다는 증거입니다.
엔지니어로서의 단상
”왜?”라는 질문에 대하여
많은 사람들이 “도대체 왜 이런 짓을 하냐”고 묻습니다. 하지만 시니어 엔지니어 입장에서 이 프로젝트는 제약 사항(Constraints)이 창의성을 어떻게 자극하는지 를 보여주는 훌륭한 교보재입니다.
최신 언리얼 엔진 5로 하프라이프 2를 리메이크하는 것은 (시간만 있다면) 누구나 할 수 있습니다. 하지만 30년 된 아키텍처의 한계를 우회하고, 최신 에셋을 로딩하고, 물리 효과를 흉내 내는 것은 시스템의 바닥(Low-level)을 이해하지 못하면 불가능합니다.
레거시의 재발견
이 프로젝트는 퀘이크 엔진이 얼마나 유연하게 설계되었는지를 다시금 증명합니다. 1996년에 정의된 .bsp 맵 포맷과 QuakeC 가상 머신 구조가, 2025년에도 여전히 확장 가능한 기반이 되어준다는 사실은 존 카맥(John Carmack)의 설계 철학이 얼마나 시대를 앞서갔는지 보여줍니다.
결론: 실용성은 제로, 기술적 가치는 만점
물론, 이 프로젝트로 하프라이프 2를 엔딩까지 플레이하는 것은 불가능에 가깝습니다. README에도 명시되어 있듯 “Odd modes(이상한 모드들)“나 데스매치 정도만 가능합니다. 실용적인 관점에서는 아무 쓸모가 없습니다.
하지만 우리 엔지니어들에게는 ‘추상화의 힘’ 과 ‘레거시 코드의 잠재력’ 을 일깨워주는 신선한 자극제입니다. AI가 코드를 짜주는 시대에, 이런 밑바닥 감성의 ‘하드코어 엔지니어링’을 보는 건 언제나 즐거운 일입니다.
참고 자료: