드래곤 퀘스트 몬스터즈 2: 이루와 루카의 신비하고 이상한 열쇠 — 한글 패치
==========================================================================

                    ★ 이 파일은 【 게임 v1.1 】 전용입니다 ★

이 패키지는 **공식 업데이트 v1.1 을 설치한** 본체용입니다.
업데이트를 지우지 마세요 — 설치한 그대로 쓰는 것이 이 패키지입니다.
업데이트를 설치하지 않았다면 `Game-v1.0` 패키지를 받으세요.

⚠ 두 패키지의 `code.ips` 를 **서로 바꿔 쓰지 마세요.** 게임 버전마다 실행 코드의
  자리가 다릅니다. 잘못 넣으면 게임이 시작되지 않습니다. 다른 것은 그 한 파일뿐이고
  romfs(대사·메뉴·글꼴·이미지)는 두 패키지가 완전히 같습니다.

패치 버전 : v0.9.4
대상      : Nintendo 3DS  /  CTR-P-BDMJ  /  타이틀 ID 00040000000CF500  /  일본판
원본 ROM SHA-256 : 6EA488D2AE08FBE8CC505329BB412EC460101EB9E3ACB706A35392FCA05E036B
한글 자산 빌드 : 2026-08-13T21:30:00+09:00

이 패치는 게임 롬을 포함하지 않습니다. 본인이 소유한 카트리지에서 덤프한
일본판에만 적용됩니다. 위 지문과 다른 덤프에는 적용을 보장하지 않습니다.
공식 업데이트 CIA 나 패치 적용이 끝난 실행파일도 들어 있지 않습니다 — 들어 있는
것은 **차분 패치(`code.ips`)와 우리가 만든 한글 자산**뿐입니다.


내 3DS 가 어느 쪽인지 확인하는 법
---------------------------------

본체 HOME 메뉴 → 본체 설정 → 데이터 관리 → 닌텐도 3DS → 추가 콘텐츠/소프트웨어
목록에서 이 게임의 **업데이트 데이터**가 있는지 봅니다.

    업데이트 데이터가 없다 ......... 게임 v1.0  ->  `Game-v1.0` 패키지
    업데이트 데이터가 있다(v1.1) ... 게임 v1.1  ->  `Game-v1.1` 패키지  (권장)

업데이트를 **지울 필요가 없습니다.** 예전 안내(「업데이트를 삭제하세요」)는
폐기했습니다. 1.1 을 설치한 그대로 `Game-v1.1` 패키지를 쓰면 됩니다.

⚠ 업데이트가 **v1.2 이상**으로 표시된다면 어느 쪽도 그대로 쓰지 마세요. 지금
  확보·대조한 업데이트 실행 코드는 v1.1 뿐입니다. 그 버전 `code.bin` 을 받아
  같은 자리를 다시 찾고 검증하기 전에는 추측으로 안내하지 않습니다.


무엇이 한글화되었나
-------------------

텍스트 : 두 갈래입니다. 잔량은 갈래별로 적습니다.

         메뉴·도감·전투 로그 (Message 파일 24개, 레코드 12,767개)
           원본에 일본어가 담긴 문자열이 9,567개 있었고,
           **지금 남은 것은 0개입니다.**
           검수 확정(confirmed) 용어집 9,764행이 들어가 있습니다.

         시나리오 대사 (Event 스크립트 440개)
           일본어 문자열 13,911개 가운데 **13,911개를 옮겼고
           남은 것은 0개입니다.**

이미지 : 텍스처에 그려진 글자 128종을 한글로 다시 그려
         401자리에 넣었습니다(아카이브 253개).

글꼴   : 게임 글꼴 두 벌에 번역이 쓰는 한글 1,273자를 넣었습니다.
         기존 일본어·영문 글리프 3,775자는 한 자도 바뀌지 않았습니다.

         FontDefault(메뉴·도감) — Galmuri11 Bitmap Regular. 확대·축소 없이
           원본 그대로 쓴다. 글자폭 12px·좌측 베어링 1px 로 원본 배치를
           따르고, ㅏ·ㅑ 의 가로 꼭지만 대사창 글꼴과 같게 1px 넓혔다.
           ⚠ 메뉴는 글자 몸통이 11x11px 로 고정이라(advance 12) 윤곽선
           글꼴을 넣으면 획 많은 음절이 뭉갠다 — 그래서 픽셀 글꼴을 지킨다.
           ⭐ 2026-08-13 부터 **가나 글리프를 건드리지 않는다.** 원본 3,775자가
           그대로다 — 키보드는 code.bin 팔레트로 옮겼다.
         FontLarge(대사창) — Pretendard-Medium 을 16ppem 으로 래스터라이즈.
           글자폭 15px 로 원본 일본어와 같아 줄 길이 계산이 바뀌지 않는다.
           알파 16단계 안티에일리어싱(감마 0.55), 잉크 폭 14px 통일.
           2026-08-13 에 갈무리14 Regular 에서 갈아 끼웠다 — 검수 제보의
           「폰트 굵기가 좀 굵었으면」에 대한 조치.

수록 파일 720개 — Event 440 · Font 2 · Layout 44 · Message 24 · NaviMap 205 · PartsIcon 5

이름 입력 : 키보드가 진짜 한글입니다. 가나·한자 네 판이 「한1」~「한4」가 되고
         칸마다 한 자씩 200자를 쓸 수 있습니다. 게임 안 문자표를
         직접 고치므로 **저장되는 값도 한글 코드포인트**입니다 — 통신으로 남에게
         전해져도 한글로 보입니다. 주인공 기본 이름도 「이루」·「루카」입니다.


설치 — 3DS 실기 (Luma3DS CFW)
------------------------------

1. SD 카드를 PC 에 꽂습니다.
2. 이 패치의 `luma` 폴더를 SD 카드 **루트**에 그대로 복사합니다.
   결과 경로: SD:/luma/titles/00040000000CF500/romfs/...
              SD:/luma/titles/00040000000CF500/code.ips
   ⚠ `code.ips` 도 함께 넣어야 합니다. 이름 입력 키보드와 기본 이름이 여기 있습니다.
3. 구판을 깔았던 SD 카드라면 `SD:/luma/titles/00040000000CF500/code.bin` 을
   **지우고** 시작합니다. 실기 Luma3DS 는 외부 `code.bin` 을 싣지 않아서,
   남아 있으면 게임이 시작되지 않습니다.
4. Luma3DS 설정에서 "Enable game patching" 을 켭니다.
   (전원 켤 때 SELECT 를 누르고 있으면 설정 화면이 나옵니다)
5. 게임을 실행합니다.

업데이트가 깔려 있어도 설치 경로는 같습니다 — 실행되는 프로세스의 타이틀 ID 가
본편(00040000000CF500)이기 때문입니다. 바뀌는 것은 **어느 패키지의 `code.ips` 를
넣느냐**뿐입니다.

되돌리려면 `SD:/luma/titles/00040000000CF500` 폴더를 지우면 됩니다.
세이브 파일은 건드리지 않습니다.


설치 — 에뮬레이터 (Azahar)
--------------------------

Azahar 도 실기와 **같은 `code.ips`** 를 읽습니다(2126.0 확인). 예전 판에 있던
`exefs/code.bin` 은 더 이상 배포하지 않습니다.

   <에뮬레이터 user 폴더>/load/mods/00040000000CF500/romfs/...
   <에뮬레이터 user 폴더>/load/mods/00040000000CF500/exefs/code.ips

즉 이 패키지의 `luma/titles/00040000000CF500/` 안에 있는 `romfs` 를 위 자리에 복사하고,
`code.ips` 는 그 아래 `exefs/` 폴더를 만들어 넣습니다.

공식 업데이트를 에뮬레이터에 설치한 경우에도 같은 자리입니다(Azahar 가 업데이트
타이틀 ID 를 본편 ID 로 되돌려 찾습니다). 다만 **설치한 업데이트에 맞는 패키지**를
써야 하는 것은 실기와 같습니다.


이 패키지가 고치는 자리 — 그리고 왜 서로 바꿔 쓰면 안 되는가
------------------------------------------------------------

`code.ips` 는 실행 코드의 **정해진 오프셋**에 바이트를 덮어씁니다. 형식 안에
「어느 파일용인가」가 없어서, 다른 버전에 얹어도 형식상으로는 통과합니다 —
그리고 조용히 엉뚱한 자리를 덮습니다.

이 패키지의 `code.ips` 는 아래 코드에만 맞습니다.

    대상 실행 코드   6,471,680 B
    대상 SHA-256     42971E127080BA8223F4BD3EFB2AF7FC4FCE31F92A98E50370E657DECC7CFA38
    적용 결과 SHA-256 F7C762458C9CAF50A0D4549F280B3E5FC0A505ADE74DC30CCDFA9AC4F28A7EAC
    code.ips         1,144 B / SHA-256 0C07AB06A17B689565A02A8A5315728D2496E1A1A2051A0DA285ABBC271E27E1
                     레코드 6개 / 총 808바이트

    이 코드는 공식 업데이트 타이틀 0004000E000CF500 (v1.1) 에서 옵니다.

고치는 것은 세 가지뿐입니다.

    이름 입력 팔레트 4페이지(200칸)  ->  한글 200자
    코드->유니코드 문자표            ->  본문용 한글 재지정 + イ·カ·ル 를 이·카·루
                                        (그래서 기본 이름이 「이루」·「루카」)
    배합 메뉴의 인라인 문자열        ->  「스킬포인트배분」

동봉한 `code.ips.json` 에 위 해시와 **레코드별 수정 전 바이트 해시**가 들어 있습니다.
`tools/verify_code_ips.py` 로 확인하면, 상대 버전 코드에 적용하려 할 때 「이 code.ips
는 게임 v1.1 전용이다」라고 거부합니다.


검증 수준 — 어디까지 확인했는가
-------------------------------

이 패키지의 `code.ips` 는 아래까지 확인했습니다. **부풀려 적지 않습니다.**

정적    : v1.1 코드 안에서 우리가 고치는 표 넷(이름 입력 팔레트 1,750 B ·
          코드→유니코드 문자표 1,024 B · 인라인 문자열 16 B · 기본 이름 코드열
          8 B)을 **내용으로** 다시 찾았고, 넷 모두 v1.1 안에서 딱 한 번만
          나오며 v1.0 과 바이트가 같습니다. 자리를 옮길 때는 「밀린 양」을 믿지
          않고 앵커(표 전체)와 지문(수정 구간+문맥) 두 방법으로 따로 찾아 **두
          답이 같을 때만** 진행했습니다. 적용 결과는 v1.0 출하본과 같은 바이트가
          같은 논리 자리에 들어간 것이고, 의도한 구간 밖에서 바뀌는 바이트는
          0개입니다.

에뮬레이터: Azahar 2126.0 에 **공식 업데이트 1.1 을 설치한 상태**에서 아래를
          직접 확인했습니다 (2026-08-21).

            부팅 · 한글 타이틀 화면 · 새 게임 시작
            이름 입력 키보드가 한글 — 탭이 「한1 한2 한3 한4」
            기본 이름 「이루」·「루카」가 그대로 뜬다
            키보드로 친 한글이 저장되고 메뉴에 그 이름이 다시 뜬다
            프롤로그 대사 · 3D 필드 · 주 메뉴(칭호·플레이 시간·도구)

          같은 환경에서 **v1.0 용 IPS 를 얹으면 앱이 예외로 죽는 것**도 함께
          재현했습니다 — 제보자분이 겪은 「1.1이면 에러」가 그것이고, 이 패키지가
          고치는 것이 바로 그 문제입니다.
          (`evidence/RUNTIME_CODE_IPS_2026-08-21.json`)

          다만 **전투 진입은 확인하지 못했습니다.** 이 게임의 전투는 열쇠 세계
          안에서만 일어나서 프롤로그 구간에서는 닿지 못합니다.

실기      : **실기에서 확인하지 못했습니다.** 공식 업데이트 1.1 을 설치한 실제
          3DS 에서 이 파일을 확인한 기록은 아직 없습니다. 에뮬레이터에서 되는
          것과 실기에서 되는 것은 다른 주장이고, 2026-08-17 에 그 둘을 섞어
          판단했다가 틀린 적이 있습니다. 그래서 여기서는 나눠 적습니다.
          쓰시다가 문제가 있으면 제보 바랍니다. 안 되면 `Game-v1.0` 패키지와
          업데이트 삭제 경로로 언제든 돌아갈 수 있습니다.


알려진 제약
-----------

* 번역에 없는 한글은 글꼴에 없습니다. 어딘가에서 빈칸이 보이면 제보 바랍니다.
* 줄 넘침은 레이아웃의 실제 상자 폭 기준으로 감사했습니다. 상자 폭을 특정하지
  못한 화면이 남아 있어 긴 한국어가 창을 넘치는 곳이 있을 수 있습니다.
* 몬스터·아이템 이름 뒤 조사는 「을(를)」처럼 두 형태를 함께 적었습니다. 이름이
  실행 중에 채워지는 자리라 받침 유무를 미리 알 수 없습니다.
* 배합 확인창의 「악마의 서」 이름 뒤에 없는 글자가 붙어 보이는 문제가 남아
  있습니다. 표시만의 문제이고 세이브·진행에는 영향이 없습니다.


검증 기록
---------

폰트   : 두 벌 모두 기존 글리프 3,775/3,775 렌더 동일, 빈 글리프 0
텍스트 : 지정하지 않은 레코드 전부 바이트 동일, 재직렬화 왕복 일치,
         Message 에 남은 일본어 문자열 0
대사   : 재배치 뒤 링크 전건이 명령 경계 + 같은 논리 명령
         (440파일 / 13,911문자열)
번들   : 720개 파일 크기·SHA-256·레코드 수·왕복 전부 일치
코드   : 이 zip 안의 `code.ips` 를 대상 code.bin 에 적용해 목표 해시 재현,
         상대 버전 코드에는 거부되는 것까지 확인
회귀   : pytest: 311 passed, 2745 subtests · bundle_verify: pass


글꼴 라이선스
-------------

Pretendard — SIL Open Font License 1.1 / Copyright (c) 2021 Kil Hyung-jin
Galmuri (갈무리) — SIL Open Font License 1.1 / Copyright (c) 2020 Yeun Vinnie (Quiple)
LINE Seed Sans KR — SIL Open Font License 1.1 / Copyright (c) 2023 LY Corporation

전문은 동봉된 PRETENDARD_LICENSE.txt · Galmuri_LICENSE.txt · OFL.txt 참조.


재배포
------

패치 파일 자체는 자유롭게 재배포해도 좋습니다.
게임 롬과 공식 업데이트 파일은 절대 함께 배포하지 마세요.
