Claude Code로 20년 전 상용 게임을 거의 고치지 않고 브라우저로 이식하기까지

blueocean·2026년 3월 15일
post-thumbnail

여러분, PC 온라인 게임 해본 적 있으신가요?

요즘은 플랫폼에 구애받지 않는 크로스플랫폼 게임이 많아졌지만, 예전에는 PC 게임 하면 윈도우 전용이었고, 엄청 길고 긴 다운로드와 설치 과정을 거쳐야 겨우 플레이할 수 있었죠.

이번에 저는 2003년에 출시된 윈도우 전용 온라인 TPS 건즈 온라인(GunZ: The Duel)WebAssembly + WebGL로 브라우저에서 돌아가도록 만들었습니다.

다운로드·설치 필요 없습니다!

할 일은 딱 하나. 구글 크롬으로 페이지 열기뿐입니다.

저만 그런 게 아닐 거라 생각하는데, 예전에 몇 시간씩 걸려 다운로드·설치해서 겨우 플레이했던 게임을 그냥 사이트 열기만 하면 바로 즐길 수 있다면 감동적이지 않나요?

게다가 이번 작업에서는 기존 소스코드를 거의 손대지 않았고, 새로 필요한 코드의 99%를 AI가 작성해줬습니다.

이 글에서는 건즈를 브라우저로 완전 이식한 기술적인 이야기와, 이전에는 불가능하다고 여겨졌던 일이 AI 덕분에 가능해진 사례를 소개하려고 합니다.

건즈 온라인을 웹 게임으로 이식했습니다

건즈 스크린샷

건즈는 한국의 MAIET Entertainment에서 개발한 게임으로, 벽을 차고 날아다니며 검과 총을 자유롭게 바꿔가며 공중전투를 펼치는 독특한 액션이 특징이었죠. 저도 그 시절 열심히 했던 기억이 납니다.

2007년경에 클라이언트·서버 전체 C++ 소스코드가 유출된 이후, 커뮤니티에서 계속 유지·보수해오고 있습니다.

20년이 넘는 역사를 가진 게임인데, 아무도 성공하지 못했던 브라우저 구동을 드디어 해냈고 공개했습니다.

https://gunz.sigr.io/

링크만 누르면 바로 플레이 가능합니다. 윈도우가 아니어도 돼요. Linux, MacOS, 아이폰, 안드로이드… 거의 모든 기기에서 동작합니다 (물론 스마트폰으로는 플레이가 좀 무리지만 ㅋㅋ)

게임 화면

또 다른 화면


“일부만 됐다” “비슷하게 만들었다” … 그런 게 아닙니다. 원본 게임과 완전히 동일하게 동작합니다. 이번에는 게임 전체를 풀 이식했습니다.

  • 어떻게 가능했는지? 그 과정까지
  • 왜 20년 전 게임을 지금 이 타이밍에?
  • 과거의 실패들

모두 솔직하게 풀어보려 합니다!

과거 실패와 브라우저 완전 이식까지의 여정

과거 실패

사실 브라우저로 건즈를 돌리려는 시도는 이번이 처음이 아닙니다.

예전에 JavaScript + Three.js로 처음부터 브라우저판을 만들어보려 했던 적이 있었어요.

https://github.com/LostMyCode/three-gunz

맵 렌더링까지는 갔지만, 게임 엔진 전체를 재구현하는 벽이 너무 높아서 프로젝트가 흐지부지됐죠. (리포지토리는 아직 남아있습니다)

브라우저 이식의 다른 접근법

건즈 소스코드는 거의 전부 C++로 작성되어 있습니다.

C++ 코드를 브라우저에서 돌리는 건 가능하죠. Emscripten으로 WebAssembly(wasm)로 컴파일하면 됩니다.

Emscripten 이미지

그럼 건즈도 간단히 wasm으로! …… 라고 생각했지만 현실은 그렇지 않았습니다.

제목 그대로, 건즈는 윈도우에 완전히 찰싹 달라붙은 게임이었기 때문이죠.

윈도우 전용 게임은 렌더링 등에 Direct3D 같은 윈도우 고유 API를 호출합니다. 브라우저에는 그런 API가 당연히 없으니 Emscripten을 써도 불가능했습니다.

Direct3D는 3D 그래픽스를 그리기 위한 API로, 마이크로소프트가 제공하는 멀티미디어 API 세트 DirectX의 일부입니다. 주로 Windows 95 이상에서 동작하며, Xbox 시리즈의 그래픽스 API 기반이기도 합니다. 흔히 D3D라고 부릅니다. — wikipedia

기본적으로 플랫폼 의존성이 없는 코드만 WebAssembly로 컴파일이 가능하다는 뜻이죠.

즉 Direct3D에 의존하는 게임을 이식하려면 WebGL 같은 브라우저용 명령으로 전부 바꿔야 하는데, 이론상 가능해도 학습 시간 포함하면 어마어마한 공수입니다.

Image description

그런 거 할 시간 어딨어요!!!

그래서 오랫동안 “이론상은 되는데… 수명 다할 것 같아서 못하겠다” 상태로 몇 년이 흘렀습니다. (three-gunz로 맵만 이식한 지 4~5년 정도 됐네요)

AI 시대가 왔습니다

“C++ 소스코드가 있으니 그대로 쓰면 되지 않을까” 하고 늘 생각했어요.

직접 이식하는 건 미친 짓 ── 그렇게 생각하며 손도 못 댔는데, AI가 코딩 영역에서도 엄청난 힘을 발휘하기 시작한 지금이라면 가능하지 않을까.

내가 못 쓰면 전부 AI한테 쓰게 하면 되지 않나?

그렇게 생각하고 드디어 무거운 엉덩이를 뗐습니다.

사용한 도구는 아래 두 가지입니다

  • Google Antigravity (AI Pro 플랜 3000원)
  • Claude Code (Max 5x 플랜 100달러)

처음에는 Google Antigravity로 시작했어요.

Antigravity 이미지

월 3,000원이면 하루 종일 돌려도 쿼터 걱정 없어서 좋았는데… 나중에 Google이 제한을 엄청 세게 걸어버렸죠.

건즈 같은 기업 규모 소스코드를 계속 돌리니까 당연히 주간 제한에 금방 걸리더라고요.

그래서 다음으로 간 게 Claude Code입니다.

Claude 이미지

Pro 플랜으로는 쿼터 터질까 봐 그냥 Max 5x 플랜(100달러)으로 과감히 질렀는데… 이게 진짜 미쳤습니다. 쿼터 거의 안 줄고(오히려 다 못 쓸 정도), Antigravity에서 1주일 넘게 막혔던 버그를 몇 시간 만에 해결해줬어요.

윈도우 의존성을 제거한 방법 — Direct3D 명령을 실시간으로 WebGL로 변환!

앞서 말했듯이 윈도우에서만 되는 Direct3D 명령을 브라우저에서도 동작하게 바꿔야 했습니다.

이건 기업이 만든 대규모 게임입니다.

개인 취미 프로젝트가 아니라 상용 게임 코드베이스라 렌더링 엔진만 해도 수만 줄. 3D 모델, 맵, UI, 이펙트… 전부 Direct3D 9를 직접 호출하고 있어요.

당연히 Direct3D 호출을 전부 바꾸는 건 미친 짓이고 버그도 엄청 날 거예요.

“그럼 Direct3D 호출은 그대로 두고, 명령만 실시간으로 WebGL로 번역하면 되지 않나?”

그래서 만든 게 이겁니다! D3D9 명령을 WebGL로 변환해주는 래퍼.

https://github.com/LostMyCode/d3d9-webgl

래퍼 이미지

게임 쪽은 전혀 안 건드리고, 게임과 그래픽 API 사이에 ‘번역 레이어’를 끼워 넣는 방식입니다.

접근법내용문제점
게임 코드 직접 수정모든 D3D9 호출을 WebGL로 변경수만 줄 수정, 상위 호환 불가능
자동 변환 툴D3D9→WebGL 트랜스파일러 제작API 의미 차이 때문에 기계적 변환 불가
번역 레이어D3D9와 동일한 API를 가진 WebGL 래퍼래퍼 구현 비용만 발생

이 D3D9 → WebGL 래퍼 덕분에 게임 쪽 렌더링 코드를 하나도 안 바꾸고 최대 윈도우 의존성을 제거할 수 있었습니다.

제가 직접 만든 게 아니라 Antigravity와 Claude Code 에이전트가 열심히 해줬어요. 이 녀석들 진짜 뭐든 되네!

(쉽게 쓰긴 했지만 제대로 렌더링 될 때까지 몇 주 걸렸습니다 ㅠㅠ)

이 D3D9 변환 부분은 따로 글 썼으니 관심 있으시면 읽어보세요~
https://zenn.dev/aespa/articles/7d77ec02bf070a

렌더링 외의 이식 작업들

렌더링이 제일 큰 산이었던 건 맞아요. 하지만 건즈를 브라우저로 돌리려면 그 외에도 넘어야 할 벽이 많았습니다. 몇 가지 소개할게요.

네트워크: 게임 서버도 브라우저 안에서 돌아갑니다

가장 놀라는 부분이 이거 아닐까 싶어요.

게임 서버도 C++ → WebAssembly로 빌드해서 Web Worker로 같은 브라우저 안에서 돌리고 있습니다. 원래 네트워크로 서버에 접속하던 걸 postMessage 메시지 교환으로 흉내내는 거죠.

서버 구조

즉 하나의 탭 안에서 클라이언트와 서버가 모두 돌아가고, 전부 로컬로 완결됩니다. 서버 데이터(플레이어 정보, 전적 등)는 SQLite + IDBFS(IndexedDB 기반 파일시스템)로 영속화해서 탭 닫아도 데이터가 안 사라지는 서버리스 게임 서버가 된 거예요.

물론 WebSocket으로 진짜 서버에 접속해서 다른 사람들과 온라인 대전도 가능합니다.

사운드: FMOD → Web Audio API (1,260줄)

원본은 FMOD 사운드 미들웨어를 썼는데, 브라우저에서는 Web Audio API로 완전 교체했습니다. 3D 사운드(PannerNode), BGM 스트리밍, 효과음 거리 컬링 등 게임에 필요한 사운드 기능을 거의 다 재구현했어요.

입력: Win32 메시지 변환 / 게임 내 텍스트 입력 대응

입력 이미지

브라우저 키보드·마우스 이벤트를 Win32의 WM_KEYDOWN, WM_MOUSEMOVE, WM_CHAR 같은 메시지로 변환해서 게임 엔진 메시지 펌프에 흘려줍니다. Pointer Lock API로 마우스 캡처, HTML <input> 오버레이 연동(로그인 화면 텍스트 입력용)도 필요했죠.

파일 시스템: 2단계 로드 + Cache API

게임 에셋은 .mrs라는 건즈 전용 아카이브 형식으로 배포돼요. 이걸 Emscripten MEMFS에 올리고 2단계 로드로 처리했습니다.

필수 7개 파일만 먼저 로드하고, 장비 파츠 등은 백그라운드 다운로드. Cache API 써서 2회차부터는 네트워크 없이 바로 시작 가능하게 했습니다.

게임 데이터 최적화

브라우저라 당연히 데이터는 네트워크로 받아와야 하니까, 로컬 파일 읽던 걸 GET 요청으로 바꿔야 했어요.

필요한 타이밍에만 로드하지 않으면 게임 시작 전 다운로드로 몇 분 걸리는 최악의 상황이 됩니다.

그래서 데이터 사이즈 줄이고, 최소 파일만 먼저 로드하는 식으로 최적화 작업을 계속했습니다.

게임 데이터(mrs) 사이즈 줄이기 반복

↓ 버전 올라갈수록 사이즈 줄어드는 게임 데이터 (default → v2 … v10)

데이터 최적화

음성 포맷 변환 효과가 제일 컸음

효과음 전부 wav → opus로 바꾸니까 44.3MB → 5.30MB! 총 용량 88% 절감했습니다.

opus 비교

또 다른 비교

항목WAVOpus
압축 방식비압축 (Linear PCM)가역/비가역 압축 (주로 비가역)
음질매우 높음 (원음 그대로)높음 (압축률 대비 매우 우수)
용량매우 큼매우 작음
지연거의 0매우 낮음 (5~26.5ms)
호환성매우 높음높음 (모던 브라우저·모바일)
라이선스제한 없음 (오픈)제한 없음 (오픈, 로열티 프리)
주 용도음악 제작·마스터링·보관용인터넷 통화·스트리밍·웹

직접 플레이해보시면 알겠지만 10초 이내에 플레이 가능 상태가 됩니다.

에셋 다운로드 속도 안정은 필수라 S3 + CloudFront로 CDN 구성해서 어느 지역이든 빠르게 받을 수 있게 했어요.

Image description

마무리 / 돌아보며

역시 때가 올 때까지 기다리는 것도 중요하네요

사실 저는 WebGL이나 Direct3D 같은 3D 게임 지식이 거의·아예 없다시피 했어요. 역시 AI 시대가 올 때까지 기다렸다가 실행한 게 정답이었던 것 같습니다. 그래, 줄곧 이 때를 기다리고 있었던 거죠.

AI 없었으면 절대 이 건즈 이식 프로젝트 성공 못 했을 거예요.

고마워 Antigravity, 고마워 Claude Code, 수고 많았다.

건즈 옛날에 했던 분들께

추억의 건즈가 다운로드 없이 돌아가는 이 감동을 다른 플레이어들에게도 전하고 싶어서요. 많이 퍼뜨려주시면 진짜 감사하겠습니다!

https://x.com/LostMyCode/status/2028778665895743599

요약

20년 전 게임이 브라우저 <canvas> 위에서 돌아가고 있습니다. 어린 시절 즐겼던 게임을 웹으로 부활시키는 로망이, 뜻밖에도 지금 이 타이밍에 이뤄졌네요.

기술적으로 관심 가져주시는 분, 그 시절 게임을 클릭 한 번으로 즐길 수 있는 감동을 공감해주시는 분들께 닿았으면 좋겠습니다.

여기까지 읽어주셔서 정말 감사합니다. 디스코드 커뮤니티도 운영 중이니 놀러 오세요~!

profile
super hacker

24개의 댓글

comment-user-thumbnail
2026년 3월 15일

잘 읽었습니다!

답글 달기
comment-user-thumbnail
2026년 3월 16일

해외 글 번역본인가요? d3d9 래퍼 이게 진짜 대단한 내용으로 보입니다.

1개의 답글
comment-user-thumbnail
2026년 3월 17일

바우트도 만들어주세요

답글 달기
comment-user-thumbnail
2026년 3월 18일

와 대박이네요..!

답글 달기
comment-user-thumbnail
2026년 3월 18일

어릴 때 건즈 즐겨했는데 현 5년차 개발자로 아티클 읽고 플레이해보고왔는데 재밌네요 이런 생각을 하고 실행에 옮기는거자체가 대단하게 느껴집니다.

답글 달기
comment-user-thumbnail
2026년 3월 18일

어릴 때 건즈 즐겨했는데 현 5년차 개발자로 아티클 읽고 플레이해보고왔는데 재밌네요 이런 생각을 하고 실행에 옮기는거자체가 대단하게 느껴집니다.

답글 달기
comment-user-thumbnail
2026년 3월 18일

지린다 반스탭 되나요

답글 달기
comment-user-thumbnail
2026년 3월 19일

와우 대박이네요 잘 읽었습니다

답글 달기
comment-user-thumbnail
2026년 3월 19일

멋집니다 잘읽었습니다

답글 달기
comment-user-thumbnail
2026년 3월 19일

쩔어요 ..

답글 달기
comment-user-thumbnail
2026년 3월 19일

지리네요..

답글 달기
comment-user-thumbnail
2026년 3월 19일

대단하네요.. 섭종한 예전 온라인 게임들이 (소스가 풀려있다면) 포팅이 가능해지겠네요

답글 달기
comment-user-thumbnail
2026년 3월 19일

잘 보고 갑니다. WASM으로 이정도까지 가능하다니 대단하네요.

답글 달기
comment-user-thumbnail
2026년 3월 19일

감사합니다 좋은글

답글 달기
comment-user-thumbnail
2026년 3월 20일

댓글 쓰려고 가입했어요 마침 부동산 모델링해서 직접 돌아다닐 수 있는 웹 제작 중인데 참고할 내용이 많네요 감사합니다

답글 달기
comment-user-thumbnail
6일 전

와 멋저요

답글 달기
comment-user-thumbnail
5일 전

개인적 이식 작업은 그렇다쳐도 외부 공개는 저작권 문제가 있지는 않나요?

답글 달기
comment-user-thumbnail
5일 전

와, 이 글 진짜 읽을 만하네요! 2003년 건즈라니... 저도 옛날에 한 번 해봤던 기억이 나는데, 그때 설치的过程이 정말 복잡했죠. 근데 이제 브라우저에서 바로 실행된다니 혁명적이네요.

특히 놀라운 건 기존 소스코드를 거의 손대지 않았다는 부분이에요. direct3d 명령어를 실시간으로 webgl로 변환한다니... 저도 게임 개발,稍微 해봤는데 이게 얼마나 어려운 작업인지 상상이 가요. ai가 99%의 코드를 작성해줬다고 하니까 이제 개발 패러다임이 정말 달라졌구나 싶습니다.

https://scritchyscratchy.cc/ 커뮤니티에서도 이런 ambitious한 프로젝트 보면 항상 감동인데, 이건 진짜 레벨이 다릅니다. 네트워크 부분도 브라우저 안에서 해결하고, 사운드도 fmod에서 web audio api로 변환하고... 모든 게 자동화되었다니 앞으로 类似한 시도들이 더 많아지겠네요.

마지막에 "역시 때가 올 때까지 기다리는 것도 중요하다"라니, 정말 많이 드셨네요. 좋은 글 감사합니다!

답글 달기
comment-user-thumbnail
5일 전

나의 청소년시절 추억의 건즈. 사용해보니 잘 됩니다.

답글 달기
comment-user-thumbnail
5일 전

와 상상만 해본 일을 실제로 하셨군요! 이런 시대가 진짜 오다니, 기분이 요상하면서도 신기하고 그렇습니다.

답글 달기
comment-user-thumbnail
4일 전

멋진 글 잘봤습니다!
AI는 정말 쓰기 나름인거 같습니다!

답글 달기
comment-user-thumbnail
4일 전

와 진짜 개쩌네요

답글 달기
comment-user-thumbnail
3일 전

대단하네요

답글 달기