TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 43 READS

고전 게임 한글패치의 숨은 기술 — 새 ROM 패처 'Slap'으로 살펴보는 패치 파일의 세계

어릴 때 고전 게임 한글패치 해보신 분들 많으시죠? 인터넷에서 받은 조그만 패치 파일을 게임 롬(ROM) 파일에 적용하면 영어로 나오던 게임이 한국어로 바뀌는, 그런 마법 같은 경험이요. 최근 이 작업을 해주는 새로운 도구인 'Slap'이라는 ROM 패처가 공개됐는데요. 이 소식을 계기로, 그 마법이 실제로 어떻게 동작하는지 한번 제대로 파헤쳐 보려고 해요.

왜 게임 파일을 통째로 안 주고 '패치'로 줄까요

먼저 근본적인 질문부터요. 팬 번역팀이 한글화를 끝냈으면 그냥 한글화된 롬 파일을 배포하면 편할 텐데, 왜 굳이 '패치 파일'이라는 걸 따로 만들어서 사용자가 직접 적용하게 할까요? 답은 저작권이에요. 게임 롬 자체는 게임 회사의 저작물이라서 함부로 재배포하면 불법이거든요. 그래서 팬 커뮤니티는 '원본 파일과 수정본 파일의 차이점'만 담은 패치 파일을 만들어 배포해요. 이 차이점 데이터에는 원본 게임의 저작물이 거의 포함되지 않으니까, 법적 위험을 줄이면서 성과물을 나눌 수 있는 거죠. 원본은 각자 알아서 구하고 패치만 공유하는 문화가 이렇게 자리잡았어요.

IPS 포맷: 단순함의 미학, 그리고 한계

이 세계에서 가장 오래되고 유명한 패치 포맷이 IPS예요. 1990년대부터 쓰였는데, 구조가 놀랄 만큼 단순하거든요. 파일 맨 앞에 'PATCH'라는 다섯 글자 시그니처가 있고, 그 뒤로 레코드(record)들이 쭉 이어져요. 레코드 하나는 '3바이트 오프셋(파일의 몇 번째 위치인지) + 2바이트 길이 + 실제 덮어쓸 데이터'로 구성돼요. 패처는 이걸 순서대로 읽으면서 원본 파일의 해당 위치에 데이터를 덮어쓰기만 하면 끝이에요. 같은 바이트가 반복되면 압축해서 표현하는 RLE(Run-Length Encoding)라는 간단한 기법도 지원하고요.

그런데 이 단순함이 발목을 잡아요. 오프셋이 3바이트라서 16MB가 넘는 파일에는 쓸 수 없고요. 더 큰 문제는 체크섬(파일이 맞는지 확인하는 검증값)이 없다는 거예요. 엉뚱한 롬에 패치를 적용해도 패처는 아무 불평 없이 그냥 덮어써 버려요. 결과물은 당연히 실행이 안 되는 깨진 파일이고요. 옛날에 '패치 적용은 됐는데 게임이 안 켜져요' 하는 사연의 상당수가 이것 때문이었어요. 롬 파일 앞에 헤더가 붙어 있느냐 없느냐에 따라 전체 위치가 밀려버리는 문제도 유명하고요.

BPS 포맷: 검증과 압축을 더하다

이런 문제를 해결하려고 나온 게 BPS 포맷이에요. 에뮬레이터 bsnes를 만든 전설적인 개발자 byuu(near)가 설계했는데요. 원본 파일, 결과 파일, 패치 파일 각각의 CRC32 체크섬을 패치 안에 담아서, 엉뚱한 파일에 적용하려고 하면 바로 오류를 내줘요. 또 단순히 '덮어쓸 데이터'만 담는 게 아니라 '원본의 어느 부분을 복사해 와라' 같은 델타 인코딩 방식을 써서 패치 파일 크기도 훨씬 작아요. 파일 크기 제한도 사실상 없고요. 그래서 요즘 롬핵 커뮤니티에서는 BPS가 사실상의 표준으로 자리잡았고, Slap 같은 새 패처들도 이런 포맷들을 다루는 계보 위에 서 있는 거예요.

실무 개발자에게도 남 얘기가 아닌 이유

'바이너리 차이를 계산해서 패치로 배포한다'는 아이디어는 사실 우리 주변에 널려 있어요. 온라인 게임이 업데이트할 때 수십 GB 클라이언트를 다시 받지 않고 바뀐 부분만 받는 것도 델타 패치고요. bsdiff나 xdelta 같은 도구는 서버 배포나 앱 업데이트 용량 최적화에 지금도 쓰여요. 크롬 브라우저가 자동 업데이트할 때도 이런 기술이 들어가 있죠.

그리고 IPS 같은 포맷은 구조가 워낙 단순해서, 파일 포맷 파싱을 공부하기에 최고의 교재예요. 스펙 문서 한 페이지만 읽고 주말에 파서를 직접 구현해 볼 수 있는 수준이거든요. 바이너리 파일을 바이트 단위로 읽고 해석하는 경험은 네트워크 프로토콜이나 이미지 포맷을 다룰 때도 그대로 이어지는 기본기예요.

정리하면

작은 ROM 패처 하나 뒤에는 저작권을 우회하는 커뮤니티의 지혜, 30년 된 포맷의 역사, 그리고 델타 인코딩이라는 실무 기술이 다 녹아 있어요. 여러분은 바이너리 diff/패치 기술을 실무에서 써본 적 있으신가요? 혹시 추억의 한글패치 경험담이 있다면 댓글로 나눠주세요.


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://nyuu.page/projects/slap/
SHARE
처리 중...