2P by colus001 3시간전 | ★ favorite | 댓글과 토론

왜 지금까지 없었을까?

  • 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 코딩에 대해서 좀 더 긍정적이 된 것 같음