# AI로 35년전 고전 게임 한글화하기

> Clean Markdown view of GeekNews topic #27850. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=27850](https://news.hada.io/topic?id=27850)
- GeekNews Markdown: [https://news.hada.io/topic/27850.md](https://news.hada.io/topic/27850.md)
- Type: news
- Author: [colus001](https://news.hada.io/@colus001)
- Published: 2026-03-26T01:41:04+09:00
- Updated: 2026-03-26T01:41:04+09:00
- Original source: [seokjun.kim](https://seokjun.kim/korean-patch-with-ai/)
- Points: 11
- Comments: 3

## Summary

35년 전 고전 게임 **‘키란디아의 전설 2’**를 AI와 함께 완전 한글화한 프로젝트입니다. 독자적인 Kyra 엔진 구조와 1바이트 폰트 한계를 뚫기 위해 ScummVM 렌더링 코드를 직접 수정하고, LLM으로 번역한 스크립트를 Python 도구로 자동 빌드하도록 구성했습니다. 개발자는 거의 코드를 쓰지 않고 AI에게 리버스 엔지니어링과 번역을 맡겼으며, 이 과정이 **“AI와 협업하는 엔지니어링”**의 실제 사례로 작동했다는 점이 흥미롭습니다.

## Topic Body

#### 왜 지금까지 없었을까?  
- 35년전에 나온 포인트 앤 클릭 어드벤처 시리즈 키란디아의 전설 시리즈. 시리즈 중 유일하게 2편 운명의 손만 한글화 되지 않았음  
- ScummVM 에 구현되어있는 엔진 중 Lucas 의 SCUMM 이나 Sierra 의 SCI 의 경우는 꽤 팬 한글화 된 게임이 있는데 Westwood 의 Kyra 엔진은 팬 한글화 되어있는 게임이 별로 없음  
  - 독자적인 바이너리 포멧, 1 byte 만 고려한 폰트 렌더링, 필요한 폰트 다 없음  
- 한글화를 위해서는 단순 추출 및 번역은 안되고, ScummVM 의 Kyra 엔진의 텍스트 렌더링 코드들을 변경해야 함  
  
#### 번역  
- 번역 자체는 크게 어렵지 않았고, 추출된 스크립트를 LLM 에 돌려서 번역함  
- 게임의 톤을 유지하기 위한 간단한 프롬프트만 입력했고, 일단 크게 문제는 없어보임  
  - 말장난이나 언어유희 같은 미묘한 부분들은 번역이 잘 안되는듯  
  
#### 리버스 엔지니어링  
- Westwood 의 독자적인 게임 포멧 PAK (패키지), EMC (씬 스크립트), DLG (다이얼로그), ENG (UI 텍스트)  
- 각 포멧을 리버스 엔지니어링 해서 Python 도구로 만듬  
  - EMC -> KMC, DLG -> DLK, ENG -> KOR 로 각각 번역해서 만들어서 OTHER.PAK 에 저장  
- ScummVM 코드를 수정해서 Fan 번역의 경우 OTHER.PAK 에서 번역된 파일을 불러오도록 수정  
- 외부 의존성 없이 `$ python tools/build_korean.py` 한줄로 전부 빌드 되서 .zip 파일로 만들고, 원본 게임에 덮어쓰면 끝  
  
#### 폰트  
- 기본적으로 한글 폰트가 없음, 따라서 구해야 했음  
  - 한국에 정발된 고전게임 "더 디그" 에 한글 폰트가 있어서 받아둔 게 있었음  
  - 폰트 구조가 약간 달라서, 헤더를 날려줌  
- ScummVM 에 한글 폰트 렌더러 추가  
  - 다행히 중국어 팬 번역을 위한 폰트 시스템에 비트맵 로딩, 1bpp 렌더링, 외곽선 처리, 1바이트+2바이트 합체(MultiSubsetFont) 까지 갖춰져 있었음  
  - 키란디아1에 있던 한글어 조합형 폰트 시스템이 있어서 2바이트 읽기 로직까지 존재했고  
  - EUC-KR의 바이트 쌍을 글리프 인덱스로 변환하는 로직만 추가함  
  - FM-Towns 버젼에 일본어 폰트가 있어서 이걸 어떻게 하려고 했는데, 쉽게 해결됨  
  
#### 버그와의 전쟁  
- "가가가가" 버그  
  - 긴 대사를 화면 폭에 맞춰 수정하는 `preprocessString()` 함수가 1 byte 폰트를 기준으로 구현되어 있음  
    - 2바이트 중간에 `\r` 이 들어가서 이후 텍스트가 다 깨져서 "가가가가" 로 표시됨  
  - 씬 스크립트를 로딩할 때 `_scriptLangExt` 참조하는 부분에서 오류가 나서 일본어로 대신 로딩이 됨  
    - 역시 해당하는 폰트가 없어서 "가가가가" 로 표시됨  
  - 둘다 `getFontOffset` 에서 해당하는 글자가 없으면 0 을 리턴해서 생기는 거였고, 고쳐야 제대로 동작해서 고생함  
- Game data not found  
  - 두번째 실행부터 이상하게 크래시됨  
  - ScummVM 에서 게임 종료시 언어를 한글로 저장하면서 detection 이 안되는 현상  
  - 일단 detection 은 영어로 하고 KOREAN.FNT 가 있으면 이걸 fanLang 에 저장해서 처리함. 이렇게 하는게 맞는 방식  
- Chunk overread 버그  
  - 한글화된 씬 스크립트 KMC 를 ScummVM IFFParser 가 파싱하다가 `Chunk overread` 에러를 만듬  
  - IFF 표준대로 KMC 를 패키징할때 `form_size = file_size - 8` 로 저장했는데, Westwood 만 `form_size = file_size` 저장함  
    - 오프셋이 안맞아서 에러남  
  
#### ScummVM 에 기여하기  
- 팬 번역은 ScummVM 이 공식적으로 `FLAGS_FAN(KO_KOR, EN_ANY)` 이 방식으로 지원하고 있음  
  - 앞에가 팬 번역, 뒤에가 원래 언어  
- 엔진 시작 후 kyra_hof.cpp에서 전환하여 실제 한국어 모드를 지원하고 번역을 파일을 불러오게 됨  
- 파일 확장자 체계가 언어마다 다른데, DLG 파일이 DOS 에서는 영어가 DLE, 독일어가 DLG 임  
  - FM Towns 기반으로 작업하다가 DOS 도 작업하다보니 갑자기 독일어가 튀어나옴  
- KMC 가 없으면 EMC 를 쓰도록 해서 번역을 다 안해도 돌아가게 했음  
- PR 남겼는데 걱정만큼 뭐라 하진 않고, 커밋만 정리했음  
  
#### AI의 가능성  
- 실제로 이 대부분은 OpenCode 와 Opus / Sonnet 이 했음  
- 내가 한건 프로젝트 리더 처럼 독려하고 테스트하고 디버깅하고 응원하기 (프롬프트 넣기) 였음  
- 재료는 다 모아뒀고, 직접 할 수도 있었겠으나, 어디부터 해야할지 엄두도 안났을 것 같음  
- Python 과 C++ 코드를 거의 한줄도 안썼고, 이게 AI와 함께하는 엔지니어링인가 싶음  
- 덕분에 AI 코딩에 대해서 좀 더 긍정적이 된 것 같음

## Comments



### Comment 54312

- Author: roxie
- Created: 2026-04-01T11:30:06+09:00
- Points: 1

와 게임 화면에서 느껴지는 옛 시절의 향기가;;

### Comment 53857

- Author: computerphilosopher
- Created: 2026-03-26T08:52:18+09:00
- Points: 1

원숭이섬의 비밀 같은 게임인가 보네요. 재밌어 보입니다.

### Comment 53885

- Author: colus001
- Created: 2026-03-26T13:28:00+09:00
- Points: 1
- Parent comment: 53857
- Depth: 1

맞습니다. 라이벌이라고 하기까진 무리지만, 키란디아의 전설도 한글화 덕분에 나름 인기가 있었죠. ㅎㅎ
