왜 지금까지 없었을까?
- 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 코딩에 대해서 좀 더 긍정적이 된 것 같음