
윈도우 10에서 안 돌아가는 고-전 게임(문명2) 재설계 작업
클리커 픽나만 즐기는 고전 게임을 토큰 녹여서 새로 만들어 보기
- 유형 · 웹 서비스·앱
- 사용 도구 · Claude
- 만든 방식 · 바이브코딩
- 제작 기간 · 일주일 째 작업 중
만든 과정
[실제 배포하는 게임이 아닙니다!]
- 문명2의 저작권은 마이크로프로즈에서 파이락시스로 다시 테이크투로 넘어갔지만, 문명2에 사용된 여러 사운드 라이브러리 에셋, 실사 출연 배우의 저작권 문제로 GOG와 같은 플랫폼 출시도 어려운 상태라고 합니다.
- 또한 테이크투가 현재 문명에 대한 상표권을 가지고 있는 관계로 OpenRCT나 OpenTTD와 같은 역설계 작업도 원칙적으로 불허한다고 합니다(물론 FreeCIV 같은 2차 창작 게임은 제외)
- 그래서 이번 프로젝트에서는 간단하 윈도우 3.1(도스) 기반의 게임을 어떻게 윈도우 10, 11과 같은 최신 환경에 맞게끔 바꾸었는지 간단히 소개하는 프로젝트입니다.
1990년대 16비트 게임인 문명 2(v2.42)를 요즘 Windows에서 CD 없이, 한국어로 즐기고 싶어서 시작한 작업입니다. Windows 10/11에서 돌아가는 실행 팩은 이미 만들었고, 지금은 에뮬레이터 없이 돌아가는 네이티브 버전을 새로 만들고 있습니다.
단순 에뮬레이팅으로 돌아가게 만들 수는 있었지만, 이걸 윈도우 10, 11에서도 안정적으로 돌아가도록 만들려면 1990년 대 초반 DOS 기반의 C++에서 작성되고(후에 윈도우 95로 포팅되긴 했지만) 구형 컴파일러로 만들어진 게임을 바로 옮기기는 여간 고역이 아니더라고요...
그래서 일단 윈도우 10에서 작동 가능하도록 에뮬레이팅, 값을 대조하며 새로 코드 작성, 컴파일 후 클로드 코드에게 에뮬레이팅 버전과 새로 작성한 버전을 번갈아 플레이하며 기본적인 작동이 제대로 이루어지는지 테스트 후에 작업을 이어나가고 있습니다.
1단계: 요즘 Windows에서 돌아가게 만들기
작업은 2026년 10월 31일, 제가 가지고 있던 v2.42 디스크에서 시작했습니다. 64비트 Windows에서는 16비트 프로그램을 실행하지 못하기 때문에, 먼저 호환 계층인 winevdm 위에 게임을 올렸습니다. 실행 파일 분석에는 Ghidra를 썼고, 작업 전반은 AI 코딩 에이전트인 Claude Code와 함께 진행했습니다.
게임이 뜬 뒤에도 해결할 문제가 많았습니다.
• CD 확인: 게임이 CD 드라이브만 찾기 때문에, 실행 파일을 고쳐 하드 디스크에서도 실행되게 했습니다.
• 음악: 게임의 CD 음악 요청을 가로채 WAV 파일을 대신 재생하도록 했습니다.
• 영상: 영상에 필요한 Indeo 4 코덱이 없어서, 영상을 변환하고 디코더를 직접 만들었습니다.
• 속도: 16비트 코드를 해석해서 실행하다 보니 지도 그리기가 느렸습니다. 스프라이트를 그리는 함수를 네이티브로 바꾸자 줌 아웃이 5.65초에서 1.1초로 줄었고, 나중에는 함수 2,886개를 자동으로 번역하는 정적 재컴파일러까지 만들었습니다.
여기에 요즘 게임에 익숙한 조작과 한국어를 더했습니다.
• 조작: 휠로 확대·축소, 휠 버튼 드래그로 지도 이동, 우클릭으로 경로를 미리 보고 이동, 이동 범위 표시, 턴 넘기기 버튼, 자동 정찰을 넣었습니다.
• 한국어: 언어 선택 창부터 메뉴, 대화상자, 조언, 튜토리얼, 시나리오, 시빌로피디아까지 옮겼습니다. 용어집에는 561개 용어가 들어 있습니다.
• 게임 확장: 유닛을 80종까지 늘려 호버 탱크를 넣었고, 게임 종료 연도를 고를 수 있게 했으며, 한 칸에 쌓을 수 있는 유닛 수도 제한했습니다.
• 이동 범위 표시와 유닛 수 제한, 새 유닛은 구현을 마쳤지만 직접 플레이하며 확인할 부분이 남아 있습니다. 번역 검수도 마지막에 한 번 더 할 예정입니다.
2단계: 네이티브로 다시 만들기
실행 팩은 잘 돌아가지만, 유닛이나 문명 수를 크게 늘리려면 16비트 구조가 걸림돌이 됩니다. 그래서 OpenTTD나 OpenRCT2처럼 원작에 충실한 네이티브 버전을 C++20과 SDL3로 새로 만들고 있습니다. 앞으로 추가할 기능은 모두 이쪽에 넣고, 실행 팩은 원작의 동작을 비교하는 기준으로 남겨 둡니다.
모든 코드를 한꺼번에 새로 쓰지는 않습니다. 원본을 자동 번역한 코드로 일단 게임을 돌리면서, 함수를 하나씩 사람이 읽을 수 있는 C++로 옮깁니다. 옮긴 결과는 두 가지로 확인했습니다.
• 함수 비교: 실제 게임 상태와 무작위 입력을 넣어, 옮긴 함수의 결과가 원본과 같은지 봅니다.
• 저장 파일 비교: 원본 게임을 세이브 3개, 난수 시드 2개로 1·2·6턴씩 돌려 저장 파일 18개를 만들어 두고, 새 버전의 결과와 바이트 단위로 비교합니다.
커밋할 때마다 바뀐 함수와 저장 파일의 첫 턴 6개를 자동으로 검사하고, 통과하지 못하면 커밋되지 않습니다.
저장 파일 비교 :18개 모두 일치 (함수 135개를 옮겼을 때 측정, 원본 실행에서 기록한 값을 일부 넣은 조건)
화면도 상당 부분 갖춰졌습니다. 이제 자체 창에서 원본의 시작 메뉴, 지도, 도시 창, 팝업, 보고서, 메뉴가 나오고 소리와 영상도 재생됩니다. 시빌로피디아는 외부 프로그램 없이 게임 안에서 열립니다. 대부분의 화면은 새로 그리지 않고 원본 게임 코드가 그린 그림을 그대로 보여 줍니다.
다만 아직은 자동 번역 코드 위에서 돌아가는 단계이고, 사람이 처음부터 끝까지 한 판을 해 보는 시험도 남아 있습니다.
작업하면서 알게 된 것들
저장 파일을 바이트 단위로 비교하니 눈으로는 찾기 어려운 문제가 여러 번 드러났습니다.
• 한 번에 두 턴씩 넘어가는 버튼: 턴 넘기기 버튼을 고친 첫 버전은 누를 때마다 턴이 1→3→5로 넘어갔습니다. 같은 실행을 두 번 돌려 비교할 때는 결과가 같아서 몰랐고, 이전에 만든 정답과 비교하고서야 알았습니다.
• 저절로 열리는 도시 창: 원래 버튼은 이동을 마친 유닛에도 Space 키를 보냈습니다. 이 키가 커서 아래 도시의 창을 열었고, 그 과정에서 난수가 2개 더 쓰여 게임 결과까지 달라졌습니다.
• 원작에 30년 가까이 숨어 있던 버그: 도시 교역 계산은 초기화하지 않은 변수를 더합니다. 앞선 호출이 남긴 값을 읽는 셈이어서, 코드를 옮기면 교역 수치가 달라졌습니다. 시험에서는 원본 실행에서 기록한 값으로 맞췄고, 실제 게임에서 쓸 값은 이 함수를 옮길 때 정합니다.
• 입력 8개로는 보이지 않던 차이: 무작위 입력 8개로는 통과한 함수들이 64개에서는 차이를 냈습니다. 원인은 게임 코드가 아니라 시험 재생 중에도 돌던 훅이었습니다.
실행할 때마다 저장 파일 크기가 달라서 AI의 움직임 때문인지도 궁금했는데, 난수를 고정하니 같은 시드에서는 파일이 바이트까지 똑같이 나왔습니다. 네이티브 작업 전체가 이 재현성 위에 서 있습니다.
앞으로 남은 일
가장 큰 일은 남은 함수 1,148개를 옮기는 것입니다. AI와 턴 진행처럼 큰 함수가 뒤쪽에 몰려 있어서, 지금까지의 진행 속도가 끝까지 유지된다고 장담하기는 어렵습니다.
- 화면 마무리: 처음부터 끝까지 한 판을 할 수 있는 첫 네이티브 실행 파일을 만듭니다.
- 코드 옮기기 완료: 자동 번역 코드를 빼고 C++만으로 게임을 돌립니다.
- 확장: 문명 16개, 유닛·기술 개수 제한 해제, 칸당 유닛 수 제한, 시작할 때 고르는 규칙을 넣습니다.
- 모딩과 새 그림: 스크립트 모드와 32비트 그림을 지원합니다.
- 그 뒤에 검토할 아이디어: 포병 포격, 일부 유닛의 ZOC 무시, 스택 몰살 규칙 제거, 맵 에디터가 있습니다.
내 역할
혼자 진행
성과
윈도우 10에서 안정적으로 돌아가는 문명2
댓글 0
첫 댓글을 남겨 보세요
응원이나 질문 한마디면 충분해요.