Skip to content

Releases: snake7594/gba-nobunaga-korean-patch

v2.3 — 지도 상단 상태창 라벨 14개 한글화

Choose a tag to compare

@snake7594 snake7594 released this 06 Aug 00:26

지도 화면 상단 상태창의 金 米 兵数 / 石高 治水 商業 / 技術 城防 鉄砲 가 한글이 되었습니다.
v2.2.2 에서 "못 찾았다"고 적었던 바로 그 라벨들입니다.

상태창 라벨 전후

항목 값
원본 MD5 2d1ceffbc8c34e3101ab91ea49f43a44
패치본 MD5 7f4222b3140b0bc5d8084971375bd70c
크기 4,194,304 바이트 (원본과 동일)

바꾼 것

0x23AD04, stride 0xE0, 24×16 스프라이트 14개

금 · 쌀 · 민심 · 석고 · 치수 · 상업 · 문화 · 기술 · 수비 · 병수 · 철포 · 무장 · 훈련 · 사기

이미지 라벨은 89개 → 103개가 되었습니다.


왜 못 찾고 있었나

0x239264 · 0x23A2E4 배열에 같은 글자(金 · 石高 · 技術 …)로 된 액자형 판이
따로 있어서, 그것이 상태창 라벨이라고 판단했습니다. 대조 기준이 문제였습니다.

기준 결과
흰 글자 픽셀의 배치만 비교 486/512 일치 → "같다" (잘못된 결론)
팔레트 없이 색 ↔ 인덱스 일대일 대응 384칸 중 147칸 불일치 → 다른 그림

첫 기준은 배경이 전부 '흰색 아님'으로 뭉뚱그려져 실제보다 훨씬 후하게 나옵니다.

어떻게 찾았나

analysis/tile_bij.py — 화면 8×8 조각을 롬에서 찾되 두 조건만 봅니다.

(a) 모든 자리 i 에서  T[i] == T[대표자리(색_i)]   같은 색 -> 같은 인덱스
(b) 색마다의 대표 인덱스가 서로 전부 다르다        다른 색 -> 다른 인덱스

조건이 둘뿐이라 벡터 연산으로 롬 4MB 를 몇 초에 훑습니다.
화면 (88,16) 한 칸을 넣으니 롬 전체에서 0x23AD24 단 하나가 나왔습니다.

거기서 이웃 칸을 같은 방법으로 확인해 배치를 역산했습니다.

  • 가로 이웃 간격 0x20 (타일 1개), 세로 이웃 간격 0x60 (타일 3개)
  • → 한 줄에 타일 3개 = 폭 24px
  • 라벨 간 간격 0xE0 (그림 6타일 + 여분 1타일)

이 판의 만듦새

다른 라벨들과 다릅니다.

항목 내용
폭 24px 중 왼쪽 2px 투명, 그려지는 곳은 x=2~23
배경 디더 없이 줄마다 단색인 세로 그라데이션 1356 78A9 9A87 6531
글자 흰 획 + 1px 외곽선
외곽선 색 그 줄 배경의 그림자색 — 줄마다 다름 13BCCDDDDDDCC531

배경을 되살릴 때 폭이 22px 뿐이라 획 픽셀이 배경보다 많은 줄이 흔했습니다.
최빈값도, '가장 긴 연속 구간'도 획에 밀렸습니다. 결국 글자가 거의 닿지 않는
양끝 두 칸만 보고 14장으로 다수결
하는 방식으로 해결했습니다.
(技術 처럼 끝까지 닿는 글자가 몇 개 있어도 다수는 배경이라 흔들리지 않습니다)


검증

이미지 라벨 한글화: 103/103개
주입 대조 : OK 7104 / 불일치 0
포인터 이상: 0
>>> 검증 통과
설명 안 되는 변경 바이트(롬 전체): 0

롬 전체에서 바뀐 바이트가 하나도 빠짐없이 포인터 갱신 / 폰트 / 문자열 /
의도한 코드 패치 3바이트 / 의도한 그림 패치로 설명됩니다.


적용 방법

xdelta3 -d -s "Nobunaga no Yabou (Japan).gba" Nobunaga_Korean.xdelta "Nobunaga no Yabou (Korean).gba"

롬 파일은 포함되어 있지 않습니다. 본인이 소유한 정품 롬이 필요합니다.
에뮬레이터에 이미 예전 롬이 올라가 있으면 파일 → 열기로 다시 지정해야 반영됩니다.


남은 것

  • 行(우상단 카운터)과 지도 위 마커 大 城 軍 船 内 — 원본 유지
  • 성+이름이 9음절을 넘는 소수의 무장(이나와시로 모리쿠니)은 명판 64px 를 넘어 끝이 잘림
  • 히라가나 이름 입력 그리드 — 한 글자 단위 UI라 한글 조합 불가

이번 판도 에뮬레이터로 직접 플레이해 확인하지는 않았습니다.
롬 데이터 대조와 렌더 검증까지 마친 상태입니다.

v2.2.2 — 상태창 라벨 판단 오류 정정 (패치 롬은 v2.2.1과 동일)

Choose a tag to compare

@snake7594 snake7594 released this 05 Aug 23:59

패치 롬 자체는 v2.2.1 과 완전히 같습니다. (MD5 6d33a5af7408eeda4d92982ce69aca6b)
이미 v2.2.1 을 적용하셨다면 다시 받으실 필요 없습니다.

이 릴리스는 잘못 적어 둔 내용을 바로잡고, 그 과정에서 만든 조사 도구를 함께 올리는 것입니다.


바로잡는 것 — 상단 상태창은 아직 일본어입니다

v2.2 릴리스 노트에 "상태창 항목명 20개를 한글화했다"고 적었습니다. 틀렸습니다.

지도 화면 상단의 金 米 兵数 / 石高 治水 商業 / 技術 城防 鉄砲 는 여전히 일본어입니다.

왜 틀렸나

0x239264 · 0x23A2E4 배열에 같은 글자(金 石高 技術 …)로 된 액자형 판이 있어서
그것이 상태창 라벨이라고 판단했습니다. 대조에 쓴 기준이 문제였습니다.

기준 결과
흰 글자 픽셀의 배치만 비교 486/512 일치 → "같다" (잘못된 결론)
팔레트 없이 화면 색 ↔ 롬 인덱스 일대일 대응 384칸 중 147칸 불일치 → 다른 그림

첫 번째 기준은 배경이 전부 '흰색 아님'으로 뭉뚱그려져 실제보다 훨씬 후하게 나옵니다.
어긋난 픽셀을 하나씩 뽑아 보니, 화면에서 흰색인 자리의 롬 인덱스가 2가 아니라 9·10·11이고
롬 인덱스 2인 자리는 화면에서 파랑(8,96,208)이었습니다. 대응 자체가 성립하지 않습니다.

그래서 0x239264 · 0x23A2E4 배열은 다른 화면에서 쓰이는 판으로 보입니다.
(그 배열들이 한글로 바뀐 것 자체는 사실이며, 롬 데이터로 확인됩니다)

아직 못 찾은 이유

시도한 방법 결과
롬 4MB 전체를 4바이트 간격으로 4bpp/8bpp 타일 역검색 없음
폭 16 / 24 / 32 / 64px, OBJ 1D·2D 매핑 모두 없음
액자형 라벨 배열 앞뒤 빈 구간 육안 확인 없음
UI 영역 LZ77 압축 블록 탐색 블록 0개

확실한 방법은 그 화면이 떠 있는 상태에서 VRAM 을 덤프해 타일을 역검색하는 것입니다.


함께 올리는 도구

파일 하는 일
analysis/tile_hunt.py 화면 캡처의 8×8 타일을 롬에서 역검색 (팔레트를 몰라도 됨)
analysis/label_locate.py 32×16 라벨을 롬 전체에서 역검색
analysis/lz_hunt.py LZ77 블록 탐색·해제

원리는 "한 타일 안에서 글자는 팔레트 인덱스 하나로 칠해져 있다"입니다.
후보 타일에서 첫 글자 픽셀 자리의 값을 획색으로 잡고, 그 값의 마스크가
화면 마스크와 같은지만 보면 되므로 인덱스 16가지를 다 돌 필요가 없습니다.


v2.2 / v2.2.1 에서 그대로인 것

  • 커맨드 버튼 39개 (이동 수송 전투 개간 치수 상업 …), 합전 명령 16개,
    무장 능력치 이름 9개, 제목 라벨 3개 — 롬 데이터상 한글로 바뀌어 있습니다.
    다만 이들도 아직 실제 화면에서 확인된 적은 없습니다.
  • 전진폭 8px 통일 (그리기 0x3EAC · 폭 계산 0x0AE6 · 줄 수 계산 0x0B20)
  • 긴 이름의 성 뒤 공백 제거 (명판 64px 초과 시)

적용 방법

xdelta3 -d -s "Nobunaga no Yabou (Japan).gba" Nobunaga_Korean.xdelta "Nobunaga no Yabou (Korean).gba"

롬 파일은 포함되어 있지 않습니다. 본인이 소유한 정품 롬이 필요합니다.

v2.2.1 — 글자가 붙어 보이던 문제 수정 (전진폭 8px 복귀)

Choose a tag to compare

@snake7594 snake7594 released this 05 Aug 22:44

v2.2 를 쓰고 계시면 이 판으로 교체해 주세요.

v2.2 에서 전진폭을 8px → 7px 로 내렸는데, 글자가 붙어 보이는 문제가 있었습니다.
갈무리11 Condensed 한글의 잉크 폭이 정확히 7px 라, 전진폭을 7px 로 하면 글자 사이
여백이 0 이 됩니다.

전진폭 7px vs 8px

8px 로 되돌렸습니다. 획을 잃지 않으면서 글자가 붙지 않는 가장 좁은 값입니다.

항목 값
원본 MD5 2d1ceffbc8c34e3101ab91ea49f43a44
패치본 MD5 6d33a5af7408eeda4d92982ce69aca6b
크기 4,194,304 바이트 (원본과 동일)

유지되는 것

v2.2 의 나머지는 그대로입니다.

  • 이미지 라벨 89개 한글화 — 커맨드 버튼·상태창 항목명·합전 명령·무장 능력치 이름
  • 전진폭 계산 일치 — 전진폭이 그리기 루프(0x3EAC)뿐 아니라 문자열 폭
    계산(strwidth, 0x0AE6)과 줄 수 계산(0x0B20)에도 따로 박혀 있습니다.
    v1.2 에서 그리기 루프만 8px 로 고쳐 두어 계산이 12px 로 남아 있었고, 게임이
    이 값으로 이름을 맞춤 정렬하기 때문에 이름이 엉뚱한 x 에서 시작했습니다.
    이번에 세 곳을 모두 8px 로 맞췄습니다.
  • 긴 이름의 성 뒤 공백 제거 — 명판 안쪽 64px 를 넘으면 공백을 뺍니다.
    (도쿠가와 이에야스 72px → 도쿠가와이에야스 64px)

이름 폭 전후


검증

이미지 라벨 한글화: 89/89개
주입 대조 : OK 7106 / 불일치 0
포인터 이상: 0
>>> 검증 통과
설명 안 되는 변경 바이트(롬 전체): 0

적용 방법

xdelta3 -d -s "Nobunaga no Yabou (Japan).gba" Nobunaga_Korean.xdelta "Nobunaga no Yabou (Korean).gba"

롬 파일은 포함되어 있지 않습니다. 본인이 소유한 정품 롬이 필요합니다.


남은 제한

  • 성+이름이 9음절을 넘는 소수의 무장(예: 이나와시로 모리쿠니 72px)은 공백을
    빼도 명판 64px 를 넘어 끝이 잘립니다. 더 좁히면 글자가 붙어 보여 여기까지가 한계입니다.
  • 行(우상단 카운터)과 지도 위 마커 大 城 軍 船 内 는 원본을 유지했습니다.
  • 히라가나 이름 입력 그리드는 한 글자 단위 UI라 한글 조합이 불가능합니다.

v2.2 — 이미지 속 일본어 89개 한글화 + 이름 잘림 해결

Choose a tag to compare

@snake7594 snake7594 released this 05 Aug 17:07

⚠️ 정정 (v2.2.2)

아래에서 "상태창 항목명 20개"를 한글화했다고 적었으나 틀렸습니다.
지도 화면 상단의 金 米 兵数 石高 治水 商業 技術 城防 鉄砲 는 여전히 일본어입니다.
같은 글자로 된 다른 판(0x239264 · 0x23A2E4)을 상태창 라벨로 잘못 짚었습니다.
자세한 경위는 v2.2.2 릴리스 노트 를 보세요.

커맨드 버튼 39개·합전 명령 16개·무장 능력치 9개·제목 라벨 3개는 그대로 유효합니다.


GBA 『信長の野望』(KOEI, 2001 / 롬 코드 ANBJ) 한국어 팬 번역 패치 v2.2 입니다.

이번 판은 그림으로 박혀 있던 일본어를 마저 한글로 바꾸고, 이름이 잘리던 문제를 고쳤습니다.

항목 값
원본 MD5 2d1ceffbc8c34e3101ab91ea49f43a44
패치본 MD5 3ab599c3f672c9db22bd600d438d6df2
크기 4,194,304 바이트 (원본과 동일)

1. 이미지 속 일본어 89개 한글화

커맨드 버튼, 상태창 항목명, 합전 명령, 무장 능력치 이름은 폰트가 아니라
그림(OBJ 스프라이트) 입니다. 폰트만 한글로 바꾼 v2.1 까지는 여기가 일본어로 남아 있었습니다.

v2.1 문서에는 "이미지에 박힌 일본어는 타이틀 로고 하나뿐"이라고 적혀 있었는데,
틀린 서술이었습니다. 그때는 다이묘 선택 화면까지밖에 확인하지 못했습니다.
본편 화면에 들어가고 나서야 커맨드 버튼과 상태창이 전부 그림이라는 것을 알았습니다.

전후 비교

이미지 라벨 한글화 전후

바꾼 것

배열 주소 개수 내용
커맨드 버튼 0x233A24 39 개간 치수 상업 기술 축성 금산 교역 조략 외교 첩보 위임 직할 교육 추방 포상 몰수 다회 이동 수송 전투 공동 고용 훈련 시혜 제조 매입 매각 철포 다기 철갑 매수 유언 적대 공물 동맹 혼인 협박 단교
합전 명령 0x153400 16 이동 통상 돌격 철포 파괴 대포 진언 지형 부대 이웃 성내 권고 개문 출진 위임 대기
상태창 항목명 0x239264 0x23A2E4 20 동맹 가문 혼인 우호 문화 무장 치수 기술 병충 병수 병량 위임 금 국 훈련 민충 성방 석고 상업 철포
무장 능력치 0x237704 외 9 충성 다기 교양 매력 연령 정치 전투 철갑 야망
제목 라벨 (64px) 0x2372E4 외 3 무장명 다이묘 성주
강조된 決定 0x237944 1 결정

MAX MIN START SELECT 는 영문이라 그대로 두었습니다.

어려웠던 점 — 빈 판 복원

한글을 넣으려면 먼저 원래 글자를 지운 빈 판이 필요합니다. 그런데 12px 한자는
획이 촘촘해서 한 줄 안에서 획 픽셀이 배경보다 많은 경우가 흔합니다.
그래서 "픽셀별 최빈값"으로는 글자가 지워지지 않고 그대로 남습니다.

세 단계로 풀었습니다.

  1. 테두리 쪽에 한 번이라도 쓰인 색만 배경 후보로 좁힌다
  2. 라벨마다 그 줄의 최빈 후보색을 먼저 뽑고, 그 결과를 같은 계열 라벨 전체로
    다시 다수결한다 (2단 투표) — 획은 글자마다 자리가 달라 2차에서 밀린다
  3. 배경은 위에서 아래로 이어지는 색 사다리다. 사다리에서 벗어난 칸
    (대개 하이라이트)만 사다리 안에서 다시 뽑는다

폭이 다른 라벨(24/32/64px)도 x 원점과 디더 위상이 같아 한 계열로 묶어 표본을
늘렸습니다. 배경 그라데이션·디더·음각 하이라이트가 원본 그대로 유지됩니다.
팔레트·타일맵·OAM·코드는 건드리지 않았습니다.

찾은 방법

라벨 하나의 주소를 실행 화면에서 확보한 뒤, 라벨의 생김새 자체를 조건으로
롬 전체를 4바이트 간격으로 훑었습니다 — 4변 테두리가 각각 한 색이고, 안쪽에
3색 이상이고, 오른쪽 끝이 투명하면 그만큼 폭을 줄여 다시 판정. 이렇게 폭
16/24/32/64px 라벨 배열을 전부 찾았습니다. (analysis/label_find.py)


2. 이름 잘림 해결

오다 노부나가가 오다 노부로 잘리던 문제입니다.

이름 폭 전후

원인은 전진폭이 세 곳에 따로 박혀 있다는 것이었습니다. v1.2 에서 그리기 루프만
12→8px 로 고쳤는데, 문자열 폭 계산(strwidth)과 줄 수 계산은 12px 그대로였습니다.
게임은 이 값으로 이름을 맞춤 정렬하므로, 그리는 위치와 계산이 어긋나 이름이
엉뚱한 x 에서 시작하고 오른쪽이 창 밖으로 밀렸습니다.

여섯 군데를 전부 7px 로 통일했습니다.

주소 원래 지금 하는 일
0x003EAC 0C 07 그리기 루프 — 전각
0x003EE4 08 07 그리기 루프 — 반각
0x000AE6 0C 07 strwidth() — 전각
0x000AEC 08 07 strwidth() — 반각
0x000B20 0C 07 줄 수 계산 — 전각
0x000B2E 08 07 줄 수 계산 — 반각

7px 는 갈무리11 Condensed 한글의 잉크 폭과 정확히 같아, 획을 하나도 잃지 않으면서
넣을 수 있는 가장 좁은 값
입니다. 반각 폰트(ASCII 96자)도 원본 잉크가 전부 7px
이하라 숫자가 잘리지 않습니다.

그래도 명판 안쪽 64px 를 넘는 긴 이름은 성 뒤 공백을 빼서 넣습니다.
(이나와시로 모리쿠니 70px → 이나와시로모리쿠니 63px)

부수 효과로 대사 창에 한 줄에 30칸 이상 들어가, 창 넘침이 0건으로 유지됩니다.


검증

이미지 라벨 한글화: 89/89개
주입 대조 : OK 7106 / 불일치 0
포인터 이상: 0
크기: 4194304 (원본과 동일: True ) 헤더 보존: True
>>> 검증 통과
설명 안 되는 4바이트 워드(포인터·의도한 코드/그림 패치·문자열 제외): 0
설명 안 되는 변경 바이트(코드 영역): 0
설명 안 되는 변경 바이트(롬 전체): 0

롬 전체에서 바뀐 바이트가 하나도 빠짐없이 포인터 갱신 / 폰트 / 문자열 /
의도한 코드 패치 6바이트 / 의도한 그림 패치로 설명됩니다.
python build_patch.py 를 다시 돌리면 같은 MD5 가 나옵니다.


적용 방법

xdelta3 -d -s "Nobunaga no Yabou (Japan).gba" Nobunaga_Korean.xdelta "Nobunaga no Yabou (Korean).gba"

GUI(xdeltaUI) 사용법과 문제 해결은 docs/패치방법.md 를 보세요.
롬 파일은 포함되어 있지 않습니다. 본인이 소유한 정품 롬이 필요합니다.


아직 남은 것

  • 行 (화면 우상단 카운터, 0x238DA4) — 무엇을 세는 값인지 확정하지 못해 한 글자 번역을 보류했습니다
  • 지도 위 마커 大 城 軍 船 内 (0x238784 계열) — 글자라기보다 도안에 가까워 원본을 유지했습니다
  • 히라가나 이름 입력 그리드 — 한 글자 단위 UI라 한글 조합이 불가능합니다

이번 판의 화면 변경은 에뮬레이터로 직접 플레이해 확인하지 않았습니다.
롬 데이터 대조와 렌더 검증까지만 마친 상태이니, 실제 화면에서 어색한 곳이
보이면 이슈로 알려주세요.

노부나가의 야망 (GBA) 한국어 패치 v2.1 — 타이틀 로고 한글화

Choose a tag to compare

@snake7594 snake7594 released this 05 Aug 10:13

이미지에 박힌 일본어를 조사해 한글로 교체한 릴리즈입니다.

교체한 이미지: 타이틀 로고

패치 전 패치 후
before after

信長の野望 → 노부나가의 야망

비교


조사 결과: 이미지 속 일본어는 이것 하나뿐이었습니다

"모든 이미지를 추출해 일본어가 든 것만 추린다"는 요청대로 전수 조사했습니다.

정적 분석으로는 그래픽 위치를 특정하지 못했습니다. 4bpp 타일로 렌더해도 타일셋은
타일맵 없이 조립되지 않고, 폭 자동 검출도 평탄한 값(세로 연속성 0.33)만 나왔습니다.
그래서 실행 중인 화면을 그대로 가져오는 방식으로 바꿨습니다.

  1. mGBA GDB 서버에서 VRAM(96KB)·팔레트·IO 레지스터 덤프
  2. DISPCNT·BGnCNT 를 해석해 BG 레이어를 실제 화면대로 재구성
  3. 화면에 쓰인 타일 바이트를 ROM 에서 역검색해 원본 위치 확정 (그래픽은 비압축)

키 입력은 UI 조작 없이 넣었습니다. 키 처리 루틴을 찾아

08002486: mvns r1, r1       ; GBA 키는 active-low
08002496: strh r0, [r4]     ; [0x03001478] 새로 눌린 키
08002498: strh r1, [r3]     ; [0x03001470] 현재 눌린 키

루틴 끝에 브레이크포인트를 걸고 멈출 때마다 두 변수에 값을 써 넣어 화면을 순회했습니다.

결론: 이 게임은 거의 모든 문자를 12×12 폰트로 그립니다.
시나리오 선택, 다이묘 선택, 커맨드 메뉴, 인물 열전 — 전부 폰트 출력이라
이전 릴리즈에서 이미 한글이 되어 있었습니다.
이미지에 일본어가 통째로 그려진 곳은 타이틀 로고 하나였습니다.
(Press Start Button, © 2001 KOEI CO.,LTD. 는 영문이라 그대로 둡니다.)

초기 조사에서 0x232000 대가 "일본어 텍스트 그래픽"처럼 보였지만,
SJIS 대사 데이터를 4bpp 타일로 잘못 렌더한 착시였습니다.


로고 교체 방법

항목 값
레이어 BG0, 8bpp(256색)
타일 VRAM 0x4000 ← ROM 0x08002C / VRAM 0x7300 ← ROM 0x0595F0
압축 없음
글자 색 크림 (248,248,192) / 빨강 외곽 (248,0,0) / 어두운 그림자
글자 영역 205×59px

로고는 별도 스프라이트가 아니라 불꽃 배경 그림에 통째로 그려져 있어서,
글자만 지우고 다시 그려야 했습니다.

  1. 글자 픽셀 검출 (크림 + 채도 높은 빨강 — 팔레트 인덱스만 보면 어두운 외곽선을
    놓쳐 획이 남습니다)
  2. 검출 영역을 주변 배경에서 반복 확산으로 복원
  3. 원본과 같은 3겹으로 한글 렌더: 그림자(우하 3px) → 빨강 외곽(2px) → 크림 면
  4. 원본 팔레트로 8bpp 인덱스화 — 팔레트와 타일맵은 건드리지 않음

글자 크기

원문 信長の野望 은 5자가 205px, 자당 약 41px 입니다.
노부나가의 야망 7자를 한 줄에 넣으면 자당 29px 로 작아지므로
두 줄로 나눠 자당 41px 을 지켰습니다.

공유 타일

같은 타일을 여러 칸이 쓰는 경우가 37개 있었습니다. 그냥 건너뛰면 지워야 할 획이
화면에 남아서, 원본과 가장 많이 다른 쪽(= 글자를 지운 결과) 을 채택했습니다.
배경 무늬는 어디서 쓰이든 같은 그림이라 안전합니다.


적용 방법

롬은 포함되어 있지 않습니다. 본인이 소유한 정품 롬에 적용하세요.

xdelta3 -d -s "Nobunaga no Yabou (Japan).gba" Nobunaga_Korean.xdelta "Nobunaga no Yabou (Korean).gba"
항목 값
원본 MD5 2d1ceffbc8c34e3101ab91ea49f43a44
패치본 MD5 210ff917c0a5ae3b249e0adb2be24bad
크기 4,194,304 바이트 (원본과 동일)

이번에 함께 고친 것

빌드 재현성 버그 2건. set 순회가 파이썬 해시 랜덤화 때문에 실행마다 달라져
같은 입력인데도 결과 ROM 이 바뀌고 있었습니다
(names.FAMOUS_GIVEN, logo_patch 의 set(blks)).
정렬해서 돌도록 고쳤고, 3회 연속 빌드 MD5 동일을 확인했습니다.

추가된 것

  • tools/logo_patch.py — 로고 타일 기록 (빌드 단계에 포함)
  • analysis/ 16개 — 화면 캡처(drive.py·render_screen.py), ROM 역검색(find_gfx.py),
    로고 제작(logo_make.py), 그래픽 조사(실패 기록 포함)
  • docs/이미지.md — 조사 방법과 작업 내용

로고 도안을 바꾸려면 analysis/logo_make.py 의 LINES 와 글꼴을 고쳐
data/logo_new.json 을 다시 만든 뒤 빌드하세요.

이전 릴리즈에서 이어지는 내용

  • 텍스트 7,138개 전체 한국어 번역
  • 인명·지명 일본어 읽기 (오다 노부나가 / 오와리)
  • 전각 전진폭 8px + 갈무리11 Condensed 로 창 넘침 0건
  • 반각 1바이트 한글로 7바이트 이름 필드 문제 해결

라이선스

  • 도구·스크립트: MIT
  • 갈무리 폰트: SIL Open Font License 1.1
  • 로고의 한글 글자는 맑은 고딕 Bold 로 렌더했습니다.
  • 게임 원본 데이터의 저작권은 코에이테크모에 있으며, 본 릴리즈는 롬을 포함하지 않습니다.

노부나가의 야망 (GBA) 한국어 패치 v2.0 — 이름·지명 일본어 읽기

Choose a tag to compare

@snake7594 snake7594 released this 05 Aug 08:04

인명·지명을 한자 독음이 아닌 일본어 읽기로 바꾼 릴리즈입니다.

직전신장  →  오다 노부나가        상삼겸신  →  우에스기 겐신
풍신수길  →  도요토미 히데요시     이달정종  →  다테 마사무네
덕천가강  →  도쿠가와 이에야스     미장(尾張) →  오와리 / 경(京) → 교토

샘플


적용 방법

롬은 포함되어 있지 않습니다. 본인이 소유한 정품 롬에 적용하세요.

xdelta3 -d -s "Nobunaga no Yabou (Japan).gba" Nobunaga_Korean.xdelta "Nobunaga no Yabou (Korean).gba"
항목 값
원본 MD5 2d1ceffbc8c34e3101ab91ea49f43a44
패치본 MD5 618c2ac80e903751ebc63752cbed6b5f
크기 4,194,304 바이트 (원본과 동일)

GUI(xdeltaUI) 사용법은 docs/패치방법.md 참고.


무엇이 어려웠나 — 이름 필드는 7바이트

무장 레코드는 스트라이드 44바이트이고, 그 안에서 성·이름이 각 7바이트 고정입니다.

0x330010: [4] 헤더 | [7] 성 金上 | [7] 이름 盛備 | [7] 능력치 | …
                    ↑ NUL 빼면 6바이트 = 전각 3음절이 한계

노부나가(4음절 = 8바이트)가 들어가지 않습니다.
레코드를 넓히는 방법도 봤지만 ×44 계산이 코드 298곳에 흩어져 있어 접었습니다.

어떻게 풀었나 — 반각 1바이트 한글

게임에는 1바이트 문자를 8px 전진으로 그리는 반각 경로가 이미 있습니다
(폰트 0x304DF4, 글리프 12바이트 = 8×12).
실제 게임 텍스트가 쓰지 않는 ASCII 코드 50칸을 실측해 찾아내 한글을 넣었습니다.

'노'→0x23  '부'→0x24  '나'→0x26  '가'→0x2A
노부나가 = 4바이트  ✓ 여유 있게 들어감
  • 갈무리11 Condensed 의 한글 잉크가 7px 이라 8×12 반각 글리프에 그대로 맞습니다.
  • 전각 전진폭도 이미 8px 이라 반각·전각이 섞여도 자간이 어긋나지 않습니다.
  • 빈도순 50종을 배정하고 나머지는 전각을 씁니다. 이름 825종 중 용량 초과 0종.

본문 속 이름도 바꿨고, 오치환을 막았다

대사·인물 열전은 이미 독음으로 번역돼 있어 '독음 → 일본어 읽기' 로 다시 치환했습니다(2,239회).
한자 독음은 한국어 낱말과 자주 겹쳐서, 실제로 아래 사고들을 잡아냈습니다.

원인 잘못된 결과 대응
移動 vs 伊東(이동) 이동시킵니다 → 이토시킵니다 단독 치환 제외
加賀(가하) 기습을 가하거나 → 가가거나 뒤 글자 검사
前田(전전) 인질로 전전하였다 → 마에다하였다 뒤 글자 검사
結城(결성) 동맹을 결성되었다 → 유키되었다 뒤 글자 검사
日向(일향) 일향종 문도 → 휴가 종 문도 단독 치환 제외
綱成(강성) 岡城 성주 → 쓰나시게 성주 이름 단독 치환 금지
  • 이름(名)은 단독으로 치환하지 않습니다. 성과 함께 올 때만 바꿉니다
    (信長·秀吉 등 그 인물이 확실한 36개만 예외).
  • 3음절 이하는 뒤에 조사·구두점이 와야 이름으로 인정합니다.
  • 光秀(미쓰히데)와 光寿(고주)처럼 독음이 같은 경우는, 게임 DB의
    실제 성+이름 조합 492개를 읽어 明智光秀/本願寺光寿를 갈랐습니다.
  • 조사도 자동 보정합니다: 가강과 → 이에야스와, 수길이 → 히데요시가

창 넘침 재정리

일본어 읽기는 독음보다 깁니다(수길 2음절 → 히데요시 4음절).
원문 자체가 창 크기에 맞춰 문장 도중에 잘려 있으므로(…勝家の死後は前田),
같은 방식으로 원문 줄 수에 맞춰 자동 절단했습니다(61건). 결과 창 넘침 0건.


검증

검사 결과
게임과 동일한 조회 로직으로 전수 대조 7,107개 불일치 0
코드 영역 변경 포인터 갱신 + 전진폭 1바이트, 미설명 변경 0
DB 필드 침범 0건 (전부 패딩 내)
창 넘침 0건
클린 클론 재현 원본 롬만으로 MD5 일치

검수·수정

읽기표는 사람이 고칠 수 있게 분리해 두었습니다.

파일 내용
data/yomi_place.py 구니·지역 84종
data/yomi_surname.py 성씨 293종
data/yomi_given.py 이름 498종
data/이름대조표.txt 검수용 대조표 (게임 등장 횟수·실제 조합 492개 포함)

고친 뒤 python build_patch.py 를 다시 돌리면 반영됩니다.
반각 슬롯 배정과 용량 검사는 자동으로 다시 계산됩니다.

한자 독음으로 되돌리려면:

set NOBU2_JPNAMES=0
python build_patch.py

원리와 오치환 사례는 docs/이름표기.md 에 정리했습니다.


알려진 한계

  • 무명 가신의 읽기는 문헌이 갈리는 경우가 있어 일부 오독 가능성이 있습니다.
    대조표를 보시고 알려주시면 고치겠습니다.
  • 備後(빙고)·肥後(히고)처럼 독음이 같은 지명은 번역문만으로 구분할 수 없어
    본문에서는 원래 표기가 남습니다(DB 필드는 원문이 한자라 정확히 바뀝니다).
  • 히라가나 이름 입력 그리드는 원본 유지 (한 글자 단위 UI라 한글 조합 불가).
  • 전각 전진폭 8px 라 글자가 원본보다 좁습니다.

라이선스

  • 도구·스크립트: MIT
  • 갈무리 폰트: SIL Open Font License 1.1 (quiple/galmuri v2.40.3)
  • 게임 원본 데이터의 저작권은 코에이테크모에 있으며, 본 릴리즈는 롬을 포함하지 않습니다.

노부나가의 야망 (GBA) 한국어 패치 v1.2 — 창 넘침 해결 (글자 폭 대책)

Choose a tag to compare

@snake7594 snake7594 released this 05 Aug 06:56

인물 열전이 창 밖으로 잘리던 문제를 해결한 릴리즈입니다. 패치를 다시 받아 적용하시길 권합니다.

샘플


무엇이 문제였나

한자 독음은 1자 = 1음절이라 이름·지명은 폭이 늘지 않습니다.
織田信長(4칸) → 직전신장(4칸). 실제로 DB 필드 4,491건 중 넓어진 것은 0건이었습니다.

문제는 문장이었습니다. 일본어는 한자의 압축률이 높습니다.

원문 폭 번역 폭
娶る 2칸 아내로 맞았다 7칸

그 결과 인물 열전이 원문 72칸 → 번역 97칸까지 늘었습니다.

게임에는 자동 줄바꿈이 이미 있어 가로로 삐져나가지는 않지만, 대신 줄 수가 늘어납니다.
원문 열전 폭이 864px = 18칸 × 4줄에 312건 몰려 있어 창이 18칸×4줄임을 확인했고,
장문 564건 중 522건이 줄 수 증가(1줄↑ 401건, 2줄↑ 120건)해 4줄 창에서 잘리고 있었습니다.


어떻게 고쳤나

전각 전진폭 12px → 8px (코드 1바이트)

0x003EAC:  0C  ->  08        (adds r6,#0xc  ->  adds r6,#8)

화면에 18칸 대신 27칸이 들어갑니다.

갈무리11 Condensed 로 교체

폰트 한글 787자의 잉크 폭
Galmuri11 10px 364자, 11px 423자
Galmuri11-Condensed 7px — 787자 전부

예외 없이 7px이라 8px 칸에 정확히 맞습니다.

겹쳐도 획이 지워지지 않는 이유

그리기 루틴(0x08003900)은 12×12 글리프를 불투명하게 씁니다.
8px 전진이면 앞 글자의 오른쪽 4px를 뒷 글자가 덮는데, 잉크가 7px 이내이고
왼쪽 정렬이면 덮이는 부분은 항상 여백이라 손실이 없습니다.

부수 효과로 x가 항상 8의 배수가 되어 그리기 루틴의 타일 정렬 고속 경로만 타게 됩니다.

기호·외자도 같이 좁혔다

대상 처리 건수
기호·전각숫자·전각영문 Condensed 재렌더 (전각형이 없으면 NFKC 반각 대응) 69
々 ∞ Condensed 에 없어 원본을 가로 압축 2
가이지(게임 전용 외자) 원본을 가로 압축 18

가이지를 한글 독음으로 바꾸는 방안도 검토했으나, 문맥이 다의적이라
(G06 이 恵瓊 와 撹乱 양쪽에 나타남) 한자를 확정할 수 없어
오식별 위험을 피해 원본 압축을 택했습니다.

남은 21건은 번역을 다듬었다


효과

전진폭 폭 절약 창 넘침 2줄 이상 넘침
12px (v1.1까지) — 517건 121건
10px 17% 368건 1건
8px (v1.2) 34% 2건 0건
8px + 번역 정리 34% 0건 0건

코드 변경은 1바이트뿐입니다. code_diff.py 검사 결과 그 외 미설명 변경은 0바이트입니다.


적용 방법

롬은 포함되어 있지 않습니다. 본인이 소유한 정품 롬에 적용하세요.

xdelta3 -d -s "Nobunaga no Yabou (Japan).gba" Nobunaga_Korean.xdelta "Nobunaga no Yabou (Korean).gba"
항목 값
원본 MD5 2d1ceffbc8c34e3101ab91ea49f43a44
패치본 MD5 064ca6d25a43afe12ba0ac58a76712bb (v1.1에서 변경됨)
크기 4,194,304 바이트 (원본과 동일)

GUI(xdeltaUI) 사용법·문제 해결은 docs/패치방법.md 참고.

직접 빌드

pip install -r requirements.txt
python build_patch.py

원본 폭(12px)으로 되돌리려면:

set NOBU2_ADVANCE=12
python build_patch.py

tools/glyphs.py 가 전진폭에 맞춰 폰트(12px→일반 / 8px→Condensed)와
정렬(12px→가운데 / 그 미만→왼쪽)을 자동으로 고릅니다.


이번에 추가된 것

  • tools/glyphs.py — 전진폭별 폰트·정렬 선택과 전진폭 코드 패치
  • tools/screen_preview.py — 실제 롬 바이트로 화면 렌더.
    재배치된 문자열의 포인터를 따라가고 자동 줄바꿈을 그대로 재현해 실제 화면과 일치합니다.
  • docs/글자폭.md — 측정치·디스어셈블·원리 정리
  • font/Galmuri11-Condensed.bdf
  • code_diff.py 가 의도한 코드 패치를 인식하도록 수정 (미설명 변경 0바이트 유지)

알려진 제한

  • 전각 전진폭을 줄여 글자가 원본보다 좁습니다. 가운데 정렬된 UI는 왼쪽으로 몰려 보일 수 있습니다.
  • 가이지 18자는 가로 압축이라 원본보다 빽빽합니다.
  • 히라가나 이름 입력 그리드는 원본 유지 (한 글자 단위 UI라 한글 조합 불가).
  • 고유명사는 일본어 발음이 아닌 한자 독음입니다 (직전신장 ≠ 오다 노부나가).

번역 오류나 표시 깨짐을 발견하시면 이슈로 알려주세요.


라이선스

  • 도구·스크립트: MIT
  • 갈무리 폰트: SIL Open Font License 1.1 (quiple/galmuri v2.40.3)
  • 게임 원본 데이터의 저작권은 코에이테크모에 있으며, 본 릴리즈는 롬을 포함하지 않습니다.

노부나가의 야망 (GBA) 한국어 패치 v1.1 — 누구나 직접 빌드 가능

Choose a tag to compare

@snake7594 snake7594 released this 05 Aug 02:25

GBA용 『信長の野望』(KOEI, 2001 / 롬 코드 ANBJ) 비공식 한국어 팬 번역 패치입니다.

v1.0과 패치 내용은 동일합니다. 이번 릴리즈는 누구나 스스로 패치를 만들 수 있도록 저장소를 전면 정비한 것입니다.

샘플


그냥 플레이하고 싶다면

Nobunaga_Korean.xdelta 를 받아 본인이 소유한 정품 롬에 적용하세요. 롬은 포함되어 있지 않습니다.

xdelta3 -d -s "Nobunaga no Yabou (Japan).gba" Nobunaga_Korean.xdelta "Nobunaga no Yabou (Korean).gba"

Windows GUI(xdeltaUI)를 쓰는 방법, 실기·에뮬레이터 실행, 세이브 호환, 문제 해결까지
docs/패치방법.md 에 단계별로 정리해 두었습니다.

항목 값
원본 MD5 2d1ceffbc8c34e3101ab91ea49f43a44
패치본 MD5 9d0fc1753c1cd3b9c6819b15aac6200f
크기 4,194,304 바이트 (원본과 동일 — 플래시카트 그대로 사용 가능)

직접 만들고 싶다면

원본 롬을 rom/ 폴더에 넣고 두 줄이면 끝납니다.

pip install -r requirements.txt
python build_patch.py

배포본과 바이트 단위로 동일한 롬이 나오고, 검증까지 자동으로 돌아갑니다.

주입 대조 : OK 7107 / 불일치 0
포인터 이상: 0
크기: 4194304 (원본과 동일: True ) 헤더 보존: True
>>> 검증 통과
  MD5     : 9d0fc1753c1cd3b9c6819b15aac6200f
  >>> 공식 배포본과 바이트 단위로 동일합니다

--full 을 붙이면 롬에서 문자열을 추출하는 단계부터 전 과정을 다시 돌립니다.
--patch 를 붙이면 xdelta 패치까지 만듭니다.

번역을 고치려면 data/번역대조표.txt 에서 문장을 찾아 data/tr_merged.json 을 수정하고
다시 빌드하면 됩니다. 필요한 한글 글리프는 자동으로 폰트에 새로 주입됩니다.


v1.1에서 달라진 것

어디서든 빌드됩니다

  • tools/paths.py 신설 — 저장소 상대 경로로 해석하고, 원본 롬은 rom/ 폴더나
    환경변수 NOBU2_ROM 에서 찾아 MD5까지 검증합니다.
  • 모든 도구에서 D:\gba\NOBU2 같은 하드코딩 경로를 제거했습니다. Windows·mac·Linux 공통으로 동작합니다.
  • build/ 우선 읽기 규칙 — 전체 재실행과 부분 실행이 모두 자연스럽게 됩니다.

원클릭 빌드

  • build_patch.py 추가.
  • tools/make_patch.py 추가 — xdelta3 가 설치돼 있으면 그것을 쓰고,
    없으면 내장 VCDIFF 인코더로 패치를 만듭니다 (xdelta.exe 로 복호 적용 확인).

검증 정합성 수정

주입기와 검증기가 서로 다른 기준을 쓰고 있었습니다.
검증기가 주입기의 안전 스킵을 반영하지 않아, 정상인 항목 10건이 불일치로 잡히던 문제가 있었습니다.

tools/plan.py 로 주입 계획을 분리해 inject.py 와 verify_all.py 가 같은 판단을 공유하게 했습니다.
이제 불일치 0건, 의도적으로 제외한 20건은 따로 보고됩니다.

제외 20건이 무해함도 확인했습니다.

  • 겹침 오검출 8건 — 추출기가 진짜 문자열 안쪽을 새 문자열로 오인한 것.
    8건 모두 실제 포인터를 가진 쪽이 정상 번역되므로 게임 표시에 영향이 없습니다.
  • 표현 불가 12건 — 바이너리 데이터가 문자열로 잘못 추출된 조각. 원본 바이트를 보존합니다.

자료 보강

  • analysis/ 조사 스크립트 38개 — 폰트를 어떻게 찾아냈는지, 실패한 시도까지 그대로.
    밀도 스캔·주기 검출·LZ77 스캔·글리프 패턴 검색이 전부 실패한 뒤
    mGBA GDB 스텁으로 VRAM을 덤프해 화면의 글리프를 롬에서 역검색해 찾아낸 과정이 들어 있습니다.
    GDB 스텁 사용법과 함정(512바이트 읽기 제한, detach 없이 끊으면 재접속 거부 등)도 정리했습니다.
  • data/tr_batches, data/tr_out 54쌍 — 번역 작업 단위와 그 결과 전부.
  • docs/패치방법.md 신설 — GUI/CLI 적용, 직접 빌드, 번역 수정 규칙, 문제 해결.
  • requirements.txt, README 전면 개정.

저장소에 들어 있는 것 (188개 파일)

폴더 내용
tools/ (20) 추출·번역배치·인코딩·주입·검증·패치생성 도구
data/ (117) 번역 데이터, 문자열 DB, 용어집, 음절↔슬롯 대응표, 원문↔번역 대조표, 번역 배치 54쌍
analysis/ (39) 폰트·구조 조사 스크립트와 설명
docs/ (3) 패치 방법 · 롬 구조 분석 · 작업 과정
font/ (2) 갈무리11 BDF + OFL 라이선스
patch/, images/ xdelta 패치, 샘플 이미지

패치 내용 (v1.0과 동일)

항목 수치
번역된 문자열 7,138개
원문 분량 SJIS 143 KB / 고유 문자열 3,332종
주입한 한글 글리프 787자 (갈무리11 12×12)
제자리 기록 / 재배치 5,753 / 1,354
오버플로·잘림 0건

타이틀·모드 선택 등 시스템 메뉴, 내정/군사/인사/외교/거래 전 커맨드와 도움말,
합전·평정·이벤트 대사 전체(규슈 사투리 포함), 인물 열전 수백 건, 시나리오 해설,
다기(茶器) 설명, 세이브·로드·통신 대전 메시지까지 번역했습니다.

인명·지명은 한자 독음 + 두음법칙(織田信長 → 직전신장, 龍造寺 → 용조사),
가신→주군 대사는 사극체, 시스템 메시지는 경어체로 통일했습니다.


어떻게 한글이 출력되나

이 게임은 SJIS 코드를 매핑 테이블에서 이진 탐색해 슬롯 번호를 얻고 그 슬롯의 비트맵을 그립니다.
따라서 매핑 테이블을 전혀 수정하지 않고 기존 한자·가나 슬롯의 글리프 이미지만 한글로 교체하면
게임 코드를 건드리지 않고도 한글이 나옵니다.

항목 주소
본문 폰트 12×12 0x305274 — 글리프당 18바이트(행당 12비트 패킹), 1,869자
문자 매핑 테이블 0x30D6CE — u16 LE SJIS 오름차순
렌더러(이진 탐색) 0x08003620
재배치 텍스트 영역 0x33A1A0 ~ 0x356788 (원본 패딩, 116 KB 사용)

문자열 재배치 시 가짜 포인터를 고치면 게임이 깨지므로 참조 2,765개의 진위를
Thumb 리터럴 풀 역추적(585개)과 포인터 배열 소속 판정(2,159개)으로 확인했고,
미확인 21개는 재배치에서 제외했습니다.


알려진 제한

  • 히라가나 이름 입력 그리드는 원본 유지 — 한 글자 단위 UI라 한글 조합이 불가능합니다.
  • 바이너리 데이터가 문자열로 오인 추출된 조각 12건은 원본 바이트를 보존했습니다.
  • 인물 열전 등 일부 문장은 전각 폭 제약 때문에 압축된 표현을 썼습니다.
  • 고유명사는 일본어 발음이 아닌 한자 독음입니다 (직전신장 ≠ 오다 노부나가).

번역 오류나 표시 깨짐을 발견하시면 이슈로 알려주세요.


라이선스

  • 도구·스크립트: MIT
  • 갈무리11 폰트: SIL Open Font License 1.1 (quiple/galmuri v2.40.3)
  • 게임 원본 데이터의 저작권은 코에이테크모에 있으며, 본 릴리즈는 롬을 포함하지 않습니다.
    이 패치는 팬 번역이며 코에이테크모와 무관합니다.

노부나가의 야망 (GBA) 한국어 패치 v1.0

Choose a tag to compare

@snake7594 snake7594 released this 29 Jul 02:27

GBA용 『信長の野望』(KOEI, 2001 / 롬 코드 ANBJ)의 비공식 한국어 팬 번역 패치 첫 정식 릴리즈입니다.

게임 텍스트 7,138개 문자열 전체를 한국어로 번역하고, 12×12 비트맵 폰트에 한글 글리프 787자를 주입했습니다.

샘플


적용 방법

롬은 포함되어 있지 않습니다. 본인이 소유한 정품 롬에 xdelta 패치를 적용하세요.

항목 값
원본 파일 Nobunaga no Yabou (Japan).gba
원본 MD5 2d1ceffbc8c34e3101ab91ea49f43a44
원본 크기 4,194,304 바이트
xdelta -d -s "Nobunaga no Yabou (Japan).gba" Nobunaga_Korean.xdelta "Nobunaga no Yabou (Korean).gba"

GUI를 쓰신다면 xdeltaUI에서 Source = 원본 롬, Patch = Nobunaga_Korean.xdelta 로 지정하세요.

패치 결과 확인 — MD5 9d0fc1753c1cd3b9c6819b15aac6200f, 크기 4,194,304 바이트(원본과 동일).
크기가 그대로라 플래시카트·에뮬레이터 어디서든 문제없이 동작합니다.


무엇이 번역되었나

항목 수치
번역된 문자열 7,138개
원문 분량 SJIS 143 KB / 고유 문자열 3,332종
주입한 한글 글리프 787자 (갈무리11 12×12)
제자리 기록 / 재배치 5,753 / 1,354
오버플로·잘림 0건
  • 타이틀·모드 선택·난이도 등 시스템 메뉴
  • 내정 / 군사 / 인사 / 외교 / 거래 전 커맨드와 도움말
  • 합전·평정·이벤트 대사 전체 (규슈 사투리 대사 포함)
  • 인물 열전 수백 건, 시나리오 해설, 다기(茶器) 설명
  • 세이브·로드·통신 대전 등 시스템 메시지

번역 방침

대상 방침 예
인명·지명·성·구니 한자 독음 + 두음법칙 織田信長 → 직전신장, 龍造寺 → 용조사
게임 용어 용어집 통일 大名 → 다이묘, 足軽 → 아시가루, 一揆 → 잇키
가나 고유명사 외래어 표기법 음차 ぬらりひょん → 누라리횬
가신 → 주군 대사 사극체 ~하옵니다 / ~하시오소서
나레이션·열전 평서체 ~했다 / ~이다
시스템 메시지 경어체 ~하시겠습니까?

기술적으로 어떻게 했나

이 게임은 SJIS 코드를 매핑 테이블에서 이진 탐색해 슬롯 번호를 얻고 그 슬롯의 비트맵을 그립니다.
따라서 매핑 테이블을 전혀 수정하지 않고 기존 한자·가나 슬롯의 글리프 이미지만 한글로 교체하면
게임 코드를 건드리지 않고도 한글이 출력됩니다.

항목 주소
본문 폰트 12×12 0x305274 — 글리프당 18바이트(행당 12비트 패킹), 1,869자
문자 매핑 테이블 0x30D6CE — u16 LE SJIS 오름차순
렌더러(이진 탐색) 0x08003620
ASCII 폰트 8×12 0x304DF4
재배치 텍스트 영역 0x33A1A0 ~ 0x356788 (원본 패딩, 116 KB 사용)

폰트는 정적 분석으로 찾지 못해(밀도 스캔·주기 검출·LZ77 스캔·글리프 패턴 검색 전부 실패),
mGBA를 GDB 스텁으로 붙여 VRAM을 덤프하고 화면에 뜬 글리프 비트맵을 7가지 인코딩 가설로
롬 전역 역검색해 찾아냈습니다. 자세한 과정은 docs/ROM구조.md 참고.


검증

검사 결과
게임과 동일한 조회 로직으로 렌더링 대조 7,117개 전부 일치
포인터 진위 역추적(Thumb 리터럴 풀·포인터 배열) 2,765개 중 2,744개 확인, 미확인 21개는 재배치 제외
코드 영역 변경 분석 494워드 전부 의도한 포인터 갱신 — 설명되지 않는 변경 0바이트
DB 고정 필드 침범 0건
롬 헤더·크기 무변경
에뮬레이터 구동 mGBA 0.10.5 정상

저장소에 함께 들어 있는 것

  • tools/ — 추출·번역배치·인코딩·주입·검증 스크립트 17개 전체 (Python 3 + Pillow)
  • data/ — 추출 문자열 DB, 번역 데이터, 용어집, 음절↔슬롯 대응표, 원문↔번역 전체 대조표
  • docs/ — 롬 구조 분석 문서, 작업 과정 문서
  • font/ — 갈무리11 BDF + OFL 라이선스

번역만 고치고 싶다면 data/번역대조표.txt 에서 문장을 찾아 data/tr_merged.json 을 수정하고
tools/inject.py 를 다시 돌리면 됩니다. 필요한 한글 글리프는 자동으로 새로 주입됩니다.


알려진 제한

  • 히라가나 이름 입력 그리드는 원본 유지 — 한 글자 단위 UI라 한글 조합이 불가능합니다.
  • 바이너리 데이터가 문자열로 오인 추출된 조각 12건은 원본 바이트를 보존했습니다.
  • 인물 열전 등 일부 문장은 전각 폭 제약 때문에 압축된 표현을 썼습니다.
  • 고유명사는 일본어 발음이 아닌 한자 독음입니다 (직전신장 ≠ 오다 노부나가).

번역 오류나 표시 깨짐을 발견하시면 이슈로 알려주세요.


라이선스

  • 도구·스크립트: MIT
  • 갈무리11 폰트: SIL Open Font License 1.1 (quiple/galmuri v2.40.3)
  • 게임 원본 데이터의 저작권은 코에이테크모에 있으며, 본 릴리즈는 롬을 포함하지 않습니다.
    이 패치는 팬 번역이며 코에이테크모와 무관합니다.