오늘도 끄적끄적

슈퍼 패미컴 · 1995 · 한글패치 v1.1

드래곤볼 Z 초오공전 돌격편 한글판

가지고 있는 일본판 게임 파일을 고르면 바로 한글판으로 바꿔 저장합니다. 따로 프로그램을 설치하지 않아도 됩니다.

파일은 이 기기 안에서만 바꾸고 어디에도 보내지 않습니다.

직접 패치하려면

Floating IPS·Lunar IPS·ROM Patcher JS 같은 도구로 손대지 않은 일본판 원본에 적용하세요. 파일 크기에 맞는 IPS를 받으세요.

헤더 없는 파일 기준
구분크기CRC32MD5
일본판 원본2,097,152바이트D531289B8BD89634D1B2205B1E7EF016485C0076
한글판 v1.12,097,152바이트7405D969FCA11D34E7D5AD8D9D2021AC1C8E34E5

세이브 구조는 바꾸지 않아 v1.0 세이브 파일을 그대로 이어서 쓸 수 있습니다.

'초오공전 돌격편' 한글 로고와 여의봉을 든 오공이 있는 타이틀 화면

v1.1에서 달라진 것

2012년에 낸 v1.0 이후 약 14년 만의 업데이트입니다. 대사 5,370줄을 일본어 원문과 한 줄씩 대조해 4,483줄을 고쳤습니다.

같은 장면을 같은 입력으로 찍어 v1.0과 v1.1을 나란히 놓았습니다.

원문대로 옮긴 대사

일본어 원문과 한 줄씩 맞춰 보고, 뜻이 달랐거나 빠졌던 대사를 원문대로 옮겼습니다.

v1.0v1.0: 뒷강에서 물고기를 찾아낸 오공 (1/2)
v1.1v1.1: 뒷강에서 물고기를 찾아낸 오공 (1/2)
v1.0v1.0: 뒷강에서 물고기를 찾아낸 오공 (2/2)
v1.1v1.1: 뒷강에서 물고기를 찾아낸 오공 (2/2)
물고기를 잡으러 간 오공. 원문에 없던 "저 녀석으로 정했다!"를 "잡아먹는 건 내 쪽이라고!"로 고쳤습니다.
v1.0v1.0: 캡슐 하우스로 오공을 부르는 부르마 (1/2)
v1.1v1.1: 캡슐 하우스로 오공을 부르는 부르마 (1/2)
v1.0v1.0: 캡슐 하우스로 오공을 부르는 부르마 (2/2)
v1.1v1.1: 캡슐 하우스로 오공을 부르는 부르마 (2/2)
캡슐 하우스에 들어가는 부르마와 오공. 꼬리를 잡아당기는 장면을 원문대로 살렸습니다.
1장면 더 보기
v1.0v1.0: 해변에서 바다를 반기는 바다거북과 부르마 (1/3)
v1.1v1.1: 해변에서 바다를 반기는 바다거북과 부르마 (1/3)
v1.0

v1.0에 없던 대사

v1.1v1.1: 해변에서 바다를 반기는 바다거북과 부르마 (2/3)
v1.0v1.0: 해변에서 바다를 반기는 바다거북과 부르마 (3/3)
v1.1v1.1: 해변에서 바다를 반기는 바다거북과 부르마 (3/3)
바다에 도착한 바다거북과 부르마. v1.0에서 빠졌던 대사를 되살렸습니다.

캐릭터마다 다른 말투

누가 누구에게 말하는지에 따라 말투와 호칭을 원작대로 맞췄습니다.

v1.0v1.0: 할아버지에게 먹을 것을 잡아 오겠다는 오공
v1.1v1.1: 할아버지에게 먹을 것을 잡아 오겠다는 오공
오공은 할아버지에게도 반말을 씁니다.
v1.0v1.0: 황야에서 자기가 싸우겠다고 나서는 천진반
v1.1v1.1: 황야에서 자기가 싸우겠다고 나서는 천진반
천진반은 스승에게 깍듯한 존댓말을 씁니다.
2장면 더 보기
v1.0v1.0: 카메하우스에서 무천도사에게 잠수정을 빌리려는 부르마 (1/2)
v1.1v1.1: 카메하우스에서 무천도사에게 잠수정을 빌리려는 부르마 (1/2)
v1.0v1.0: 카메하우스에서 무천도사에게 잠수정을 빌리려는 부르마 (2/2)
v1.1v1.1: 카메하우스에서 무천도사에게 잠수정을 빌리려는 부르마 (2/2)
무천도사에게 존댓말과 반말을 섞어 쓰는 부르마. 장소 이름도 카메하우스로 바꿨습니다.
v1.0v1.0: 천계에서 자신을 소개하는 미스터 포포 (1/2)
v1.1v1.1: 천계에서 자신을 소개하는 미스터 포포 (1/2)
v1.0v1.0: 천계에서 자신을 소개하는 미스터 포포 (2/2)
v1.1v1.1: 천계에서 자신을 소개하는 미스터 포포 (2/2)
짧게 끊어 말하는 미스터 포포의 말투를 살렸습니다.

원문에 없던 농담

v1.0에 들어 있던 말장난과 비속어를 원문대로 정리했습니다. 일부 농담은 그대로 남겨 두었습니다.

v1.0v1.0: 무대 위에서 우승을 중얼거리는 오공
v1.1v1.1: 무대 위에서 우승을 중얼거리는 오공
천하제일 무술대회 우승을 꿈꾸는 오공. 대학교 이름 말장난을 원문대로 고쳤습니다.
v1.0v1.0: 레드 리본군 사령실에서 엄포를 놓는 타오파이파이
v1.1v1.1: 레드 리본군 사령실에서 엄포를 놓는 타오파이파이
타오파이파이의 엄포도 원문대로 "손도 발도 안 쓰고 쓰러뜨려 주지"입니다.

이름과 타이틀 화면

고유명사는 국내 정식 발매판과 초오공전 각성편 한글판 v1.2에 맞췄습니다. 엔딩 크레딧의 이름도 같은 기준으로 맞췄습니다.

v1.0v1.0: 드래곤볼 Z 로고와 여의봉을 든 오공이 있는 타이틀 화면
v1.1v1.1: 드래곤볼 Z 로고와 여의봉을 든 오공이 있는 타이틀 화면
타이틀 로고를 "초오공전 돌격편"으로 바꾸고 로고 아래 가타카나는 지웠습니다.
v1.0v1.0: 해변에서 자신을 소개하는 무천도사 (1/2)
v1.1v1.1: 해변에서 자신을 소개하는 무천도사 (1/2)
v1.0v1.0: 해변에서 자신을 소개하는 무천도사 (2/2)
v1.1v1.1: 해변에서 자신을 소개하는 무천도사 (2/2)
거북신선은 무천도사로 부릅니다.
1장면 더 보기
v1.0v1.0: 새 게임과 옵션을 고르는 타이틀 메뉴
v1.1v1.1: 새 게임과 옵션을 고르는 타이틀 메뉴
타이틀 메뉴도 한국어입니다.

창에 맞춘 줄바꿈

대사가 창 폭보다 길면 게임이 알아서 줄을 바꾸는 바람에 한두 글자만 다음 줄로 밀려났습니다. 이런 대사를 모두 창 폭에 맞췄습니다.

v1.0v1.0: 캡슐 코퍼레이션에서 오공에게 말하는 브리프 박사
v1.1v1.1: 캡슐 코퍼레이션에서 오공에게 말하는 브리프 박사
줄 끝이 밀려나 세 줄이 된 브리프 박사의 대사.
v1.0v1.0: 황야에서 혼잣말하는 무천도사
v1.1v1.1: 황야에서 혼잣말하는 무천도사
닫는 괄호만 다음 줄로 밀려났던 무천도사의 대사.
1장면 더 보기
v1.0v1.0: 블루 장군에게 드래곤볼의 행방을 보고하는 부하 (1/2)
v1.1v1.1: 블루 장군에게 드래곤볼의 행방을 보고하는 부하 (1/2)
v1.0v1.0: 블루 장군에게 드래곤볼의 행방을 보고하는 부하 (2/2)
v1.1

한 페이지에 모두 들어감

느낌표만 다음 페이지로 넘어갔던 블루 장군 부하의 보고. 이제 한 페이지에 모두 들어갑니다.

진행 버그

v1.0 배포 때 공지했던 문제입니다. 진행 상황에 따라 나타나지 않을 때도 있었습니다.

v1.0v1.0: 이벤트 표 맨 아래에서 B 버튼을 두 번, A 버튼을 한 번 누른 화면 (1/3)
v1.1v1.1: 이벤트 표 맨 아래에서 B 버튼을 두 번, A 버튼을 한 번 누른 화면 (1/3)
v1.0v1.0: 이벤트 표 맨 아래에서 B 버튼을 두 번, A 버튼을 한 번 누른 화면 (2/3)
v1.1v1.1: 이벤트 표 맨 아래에서 B 버튼을 두 번, A 버튼을 한 번 누른 화면 (2/3)
v1.0v1.0: 이벤트 표 맨 아래에서 B 버튼을 두 번, A 버튼을 한 번 누른 화면 (3/3)
v1.1v1.1: 이벤트 표 맨 아래에서 B 버튼을 두 번, A 버튼을 한 번 누른 화면 (3/3)
v1.0은 이벤트 표를 맨 아래(203번)까지 내리면 B 버튼으로 닫히지 않고, A 버튼을 누르면 기술 설정 화면으로 넘어갔습니다. 이제 B 버튼으로 바로 게임에 돌아옵니다.

이야기

산속에서 할아버지의 유품인 사성구를 지키며 사는 꼬리 달린 소년 오공. 어느 날 드래곤볼을 찾아 나선 부르마를 만나 함께 모험을 떠납니다.

드래곤볼을 노리는 피라후 일당과 레드 리본군, 무천도사 밑에서의 수행과 천하제일 무술대회를 거쳐 피콜로 대마왕과의 결전까지, 원작 만화 《드래곤볼》의 소년 오공 시절을 따라갑니다.

반다이가 1995년에 낸 슈퍼 패미컴 게임입니다. 같은 해 나온 초오공전 각성편이 그 뒤 이야기를 다룹니다.

총을 맞고도 멀쩡한 오공에게 놀라는 부르마
드래곤볼 7개를 모으면 굉장한 일이 생긴다고 설명하는 부르마

진행 방식

숲과 강이 펼쳐진 지도

지도

장소를 옮겨 가며 원작의 장면이 이어집니다. 드래곤볼을 찾을 때는 X 버튼으로 레이더를 보며 직접 돌아다닙니다.

오른쪽·가운데·왼쪽 중 겨냥할 곳을 고르는 선택지

선택지

대사 사이사이에 오공이 할 일을 고릅니다. 고른 것에 따라 뒤에 이어지는 장면이 달라집니다.

프테라노돈이 발톱 공격을 쓰는 순간의 전투 화면

전투

상대가 기술을 쓰면 화면 위에 기술 이름이 뜹니다. 그 순간 맞는 버튼을 눌러 받아칩니다. 기술을 쓸수록 전투력이 줄어듭니다.

198번부터 203번까지 보이는 이벤트 표

이벤트 표

본 장면은 이벤트 표에 하나씩 채워집니다. 모두 204개입니다.

한글판을 만든 방법

v1.0은 한자와 가나가 있던 폰트 자리 1,010칸에 한글을 다시 그려 썼고, 그 칸은 거의 다 차 있었습니다. 대사를 원문에 맞춰 다시 옮기니 꽃·쫓·흙처럼 그 칸에 없는 글자가 필요해졌습니다. v1.1은 게임이 글자 그림을 찾는 코드에 새 길을 하나 끼워 넣어 512자를 더 넣을 수 있게 했습니다. 아래는 v1.1에서 새로 그린 213자를 롬에서 꺼낸 것입니다.

v1.1에서 새로 그린 한글 213자. 남색 칸에 흰 글자와 짙은 그림자로 그려져 있다
v1.1 롬에서 꺼낸 새 글자 213자

슈퍼 패미컴 구조나 65816 어셈블리를 몰라도 읽을 수 있게 풀어 썼습니다. 절마다 그 작업에 쓴 도구 파일 이름을 적었습니다. 아래 묶음을 받아 설명과 코드를 같이 볼 수 있습니다.

자세히 보기

1. 배경지식

도구: tools/dis65816.py · lua/scenario.lua 파일 설명

게임기 안의 메모리

CPU는 화면에 직접 그리지 않습니다. 그림 조각(타일)을 VRAM에 올려 두고 "이 칸에는 몇 번 타일" 이라는 배치표(타일맵)를 적어 화면을 만듭니다. 대사 글자도 폰트에서 읽어 와 타일로 그립니다.

이름크기비유하는 일
롬2MB책카트리지에 든 프로그램·대사·폰트·그림. 읽기만 합니다.
WRAM128KB작업 책상CPU가 계산하며 값을 적어 두는 곳. 지금 보고 있는 장면 번호 같은 것이 여기 있습니다.
VRAM64KB스티커판화면에 붙일 8×8 그림 조각(타일)을 올려 두는 곳.
SRAM-수첩전원을 꺼도 남는 세이브 데이터.

주소 읽는 법

0x1B97BC 같은 파일 오프셋은 롬 파일을 처음부터 센 위치이고, $B7:97BC 같은 SNES 주소는 CPU가 보는 뱅크:주소입니다. 이 게임은 LoROM이라는 방식이라 뱅크마다 뒤쪽 32KB에만 롬이 보입니다. 그래서 다음처럼 바꿉니다.

파일 오프셋 = (뱅크 & 0x7F) × 0x8000 + (주소 & 0x7FFF)
$B7:97BC → 0x37 × 0x8000 + 0x17BC = 0x1B97BC

어셈블리, 필요한 만큼만

어셈블리는 CPU가 실행하는 명령을 사람이 읽는 이름으로 적은 것이고, 롬 안에서는 그냥 바이트입니다. 롬 파일 0x61에는 80 04가 있습니다. 80은 BRA(무조건 건너뛰기)이고 04는 건너뛸 바이트 수입니다. 건너뛰는 4바이트 안에 개발자용 디버그 메뉴로 가는 명령이 있어서 제품판에서는 메뉴가 열리지 않습니다. 두 바이트를 EA EA(NOP, 아무 일도 안 함)로 바꾸면 디버그 메뉴가 열립니다.

남색 화면에 날짜와 TITLE, FMAP, BATTLE, ADVENTURE, DATA, VOICE, ADVSE, BTLSE 메뉴가 있는 디버그 메뉴

ADVENTURE의 SCENARIO SELECT로 장면 번호(0x00–0xFF)를 고르면 그 장면을 실제 플레이와 같은 상태로 시작합니다. DATA의 ENDING으로는 엔딩을 처음부터 볼 수 있습니다. 이 메뉴가 뒤에 나올 테스트의 바탕이 됐습니다.

2. 대사는 뱅크 밖으로 못 나간다

도구: tools/dialogue1.py · tools/text_patch1.py · tools/layout1.py · tools/lint1.py 파일 설명

대사는 5,370줄이고 ID로 찾습니다. ID 범위마다 뱅크 하나와 포인터 표가 있습니다. 포인터는 2바이트라 뱅크 안의 주소만 가리킬 수 있어서, 대사가 길어져도 다른 뱅크로 넘길 수 없습니다.

대사가 들어 있는 뱅크: $A8 · $A9 · $AB · $9D · $9E · $B2 · $B4 · $B5 · $8E. v1.1은 뱅크마다 일본어 문자열이 있던 영역 전체를 처음부터 다시 채웠습니다. 똑같은 문자열은 하나만 두고 포인터 여러 개가 같이 가리키게 해서 공간을 아꼈습니다.

창 폭과 페이지

얼굴이 나오는 창은 폭 128px, 나레이션 창은 176px이고 한 페이지는 3줄입니다. 줄이 폭을 넘으면 엔진이 알아서 줄을 바꾸는데, 그러면 한 줄이 밀려 페이지가 엉뚱한 곳에서 넘어갑니다. v1.0에도 이렇게 넘치는 줄이 24줄 있었습니다. v1.1은 글자마다 폭을 더해 모든 줄을 검사했고, 넘치는 줄이 0이 될 때까지 고쳤습니다. 줄을 나눌 때는 이렇게 정했습니다.

  1. 단어 중간에서 끊지 않습니다.
  2. 위아래 줄 길이를 비슷하게 맞춥니다.
  3. 필요한 것보다 줄을 많이 쓰지 않습니다.
  4. 더듬는 말(「주‥죽어」)은 한 줄에 둡니다.

3. 폰트 칸이 모자랐다

도구: tools/font1.py · tables/ 파일 설명

이 게임은 글자마다 폭이 다른 가변폭 폰트를 씁니다. 대사의 글자 하나는 2바이트 코드이고, 코드 범위에 따라 폰트를 읽는 곳이 다릅니다.

코드크기폭원래 글자롬 위치
0x100–0x4FF8×169px가나$83:DE00
0x500–0x7EF16×1613px한자$83:8000
0x7F0–0xBEF16×1613px한자$BF:8000

한 글자는 두 겹으로 되어 있습니다. 한 겹은 글자 모양, 다른 한 겹은 오른쪽 아래로 비키는 그림자입니다. v1.0은 한자 자리 850개와 가나 자리 160개에 한글을 그려 넣었습니다. 아래는 v1.0 롬의 16×16 칸 전체입니다. 남색은 한글이 들어간 칸, 노란색은 한글이 아닌 칸(기호와 남은 한자)입니다.

v1.0 폰트의 16×16 칸 888개. 대부분 한글로 차 있고 끝부분 몇 줄만 기호와 한자다

한글 음절은 자주 쓰는 것만 해도 2,350자입니다. 1,010칸에는 v1.0 번역문에 쓴 글자만 골라 넣을 수 있었고, 대사를 고치면서 새로 필요해진 글자를 넣을 자리는 없었습니다.

4. 글자 칸을 512개 늘리기

도구: tools/fontext1.py · tools/text_patch1.py 파일 설명

글자를 그리는 코드($B7:9763)는 코드 범위를 보고 어느 폰트를 읽을지 고릅니다. 그중 0x7F0 이상 코드를 맡는 갈림길($B7:97BC)을 "새 코드로 가라" 는 명령으로 덮어쓰고, 새 코드를 롬의 빈 공간에 두었습니다. 이렇게 원래 코드 중간에 새 코드를 끼워 넣는 것을 후킹이라고 합니다.

코드 0x100부터 0xBEF까지는 원래 폰트 세 곳을 읽고, 0xC00 이상은 후킹한 코드가 블록 표를 보고 롬의 빈 공간 8곳 중 하나를 읽는다
CMP #$0C00      ; 코드가 0xC00 이상이면
BCS ext         ; 새 블록으로 간다
...             ; 아니면 원래 $BF 폰트 처리
ext:
SEC
SBC #$0C00      ; 0xC00을 빼고 128로 나눠 몇 번째 블록인지 구한다
...
LDA base_tab,X  ; 블록 표에서 그 블록의 주소를 읽고
JML $B797D6     ; 원래 글자를 그리는 코드로 돌아간다

블록 하나는 4KB이고 글자 64개가 들어갑니다. 원본에서 0xFF로 비어 있던 4KB 8곳을 찾아 512자를 넣을 자리를 만들었습니다. 글자 폭은 원래부터 0x500 이상 코드를 모두 13px로 계산하므로 따로 고칠 필요가 없었습니다.

새 글자는 먼저 v1.1에서 더 쓰지 않게 된 칸 37개에 넣고, 나머지 176자를 새 블록에 넣었습니다. 글자 모양은 픽셀 폰트 Galmuri11로 그리고, 그림자는 원래 폰트와 같은 방식으로 만들었습니다.

빈 공간을 고를 때 조심한 것

0xFF가 길게 이어진 곳이라고 다 빈 공간은 아닙니다. 바로 앞의 자료가 0xFFFF를 끝 표시로 쓰고 있을 수 있습니다. 일본판 원본에서도 0xFF였는지, 앞의 자료가 그 값을 읽지 않는지 확인한 곳만 썼습니다.

5. 타이틀 화면

도구: tools/title.py · tools/lz.py 파일 설명

타이틀 화면은 그림 여러 겹을 겹쳐서 만듭니다. 왼쪽부터 오공 그림, 배경 그라데이션, 로고와 글자가 있는 층(BG3)입니다. 한글 타이틀은 이 중 글자 층만 고쳤습니다. 「超悟空伝 突激編」을 한글로 다시 그리고, 로고 아래 가타카나는 지웠습니다.

일본판 타이틀 화면을 세 겹으로 나눈 그림. 오공, 파랑에서 초록으로 바뀌는 배경, 로고와 저작권 글자
일본판 타이틀의 세 겹

글자 층의 타일과 배치표는 LZSS라는 방식으로 압축되어 있습니다. 같은 무늬가 앞에 나왔으면 "몇 칸 앞에서 몇 바이트 복사" 로 줄여 쓰는 방식입니다. 새로 그린 그림을 같은 방식으로 다시 압축하니 원래보다 길어져서, 롬의 빈 공간으로 옮기고 그 위치를 가리키는 항목을 고쳤습니다. 압축 형식과 그림 배치가 각성편과 같아서 각성편 v1.2를 만들 때 쓴 도구를 주소만 바꿔 썼습니다.

「DRAGON BALL Z」 로고와 「© BANDAI 1995」는 원본 그대로입니다. 이 © 타일은 위쪽 저작권 줄과 함께 쓰기 때문에 건드리면 두 줄이 같이 바뀝니다.

6. 이벤트 목록에서 못 나오던 문제

도구: lua/eventlist.lua 파일 설명

  1. 대사가 떠 있을 때 START를 누르면 스토리 현황 화면이 열립니다.
  2. 오른쪽 메뉴에서 「클리어 표」를 고르고, 기술습득표에서 B를 누르면 이벤트 목록이 나옵니다.
  3. 목록을 맨 아래까지 내리면 204개 뒤에 숨은 줄 하나를 더 그립니다.

이벤트는 204개(0–203번)인데, 목록을 내리는 조건이 205줄을 기준으로 되어 있어서 맨 아래에서 없는 204번 줄을 그립니다. 그 줄의 포인터 자리에는 첫 이벤트 이름의 글자 코드가 있습니다. 게임은 이 값을 주소로 알고 WRAM의 그 자리를 문자열로 읽습니다.

포인터 표의 0–203번은 이벤트 이름을 가리키고, 숨은 204번은 WRAM의 쓰레기 값을 가리켜 줄이 넘친다. v1.1은 204번에 빈 문자열을 넣었다

그 자리 값은 게임 상황마다 다릅니다. 끝 표시가 늦게 나오면 줄이 넘치고, B로 목록을 닫을 수 없게 됩니다. 일본판에도 있는 동작이지만, v1.0은 첫 글자 코드가 바뀌면서 읽는 주소가 $7E:0686이 됐습니다. 디버그 메뉴로 장면을 바꿔 가며 재현해 보니 0xC0번 장면에서 실제로 목록이 닫히지 않았습니다.

v1.1은 204번 자리에 빈 문자열을 가리키는 포인터를 넣었습니다. 같은 0xC0번 장면에서 B를 두 번 눌러 게임으로 돌아오는 것을 확인했습니다.

7. 확인은 에뮬레이터가

도구: lua/scenario.lua · tools/pages1.py · tools/rgcmp1.py 파일 설명

대사 5,370줄을 사람이 다 띄워 볼 수는 없어서, 에뮬레이터 Mesen 2와 Lua 스크립트로 확인했습니다.

  • 디버그 메뉴로 256개 시나리오를 하나씩 시작하고, A 버튼을 일정 간격으로 눌러 8000프레임씩 진행합니다.
  • 게임은 대사를 띄울 때마다 대사 ID로 창 정보($8E:C9BA + ID×2)를 읽습니다. 이 자리를 누가 읽는지 감시하면 어떤 대사가 몇 번째로 나왔는지 기록할 수 있습니다.
  • 일본판과 v1.1의 대사 ID 순서를 시나리오마다 비교했습니다. 순서가 다르거나 v1.1에서 먼저 멈춘 시나리오는 없었습니다. 한글 대사가 짧아 같은 시간에 더 진행한 경우만 있었습니다.
  • 패치 노트의 비교 화면도 이 방법으로 찍었습니다. 3프레임마다 화면을 저장하고, 아래 절반의 흰 글자가 지워지기 직전 화면을 그 페이지의 완성 화면으로 골랐습니다.
  • A 버튼을 여러 프레임 누르고 있으면 글자 출력 완료와 페이지 넘김이 한꺼번에 일어나 페이지가 화면에 다 나오지 않습니다. 촬영할 때는 1프레임만 눌렀습니다.

8. 그 밖에

도구: tools/credits1.py · tools/fixsum.py 파일 설명

  • 세이브 구조는 바꾸지 않았습니다. v1.0에서 만든 세이브를 v1.1에서 불러와 이어서 진행되는 것을 확인했습니다.
  • 엔딩 크레딧은 줄마다 칸 크기가 일본어 줄 길이로 정해져 있어 그보다 길게 쓸 수 없습니다. 출연진은 열 가운데에 맞춰 다시 줄을 세웠습니다.
  • 롬 헤더에는 롬 전체를 더한 체크섬이 있습니다. 롬을 고친 뒤 다시 계산해 넣었습니다(파일 0x7FDC–0x7FDF).

9. 분석 도구

위에서 설명한 주소 전체와 빌드 도구가 들어 있고, 게임 롬은 들어 있지 않습니다. 압축을 푼 폴더에 일본판 원본(헤더 없음, CRC32 D531289B)을 super-gokuden-jp.smc로 두고 zsh tools/build.sh를 실행하면 배포판과 같은 롬(CRC32 7405D969)이 나옵니다. Python 3(Pillow, numpy)이 필요하고, 사용법은 묶음 안의 README.txt에 있습니다.

파일하는 일
tools/build.sh전체 빌드 순서. 일본판 + v1.0 IPS → 타이틀 → 텍스트 → 체크섬
tools/dialogue1.py대사 포인터 표 읽기
tools/textsets.py전투 대사·선택지·장소 이름 등 그 밖의 포인터 표 정의
tools/extract1.py일본어·한국어 대사 덤프(TSV)
tools/text_patch1.py텍스트 삽입, 뱅크별 재배치, 새 글자 그리기, 메뉴 문자열 수정
tools/layout1.py창 폭·페이지 검사
tools/lint1.py표기·말투 규칙 검사
tools/font1.py폰트 글자 읽기
tools/fontext1.py글자 추가 블록과 렌더러 후킹
tools/title.py타이틀 그래픽 생성
tools/lz.pyLZSS 압축과 해제
tools/credits1.py엔딩 크레딧 줄 정렬
tools/fixsum.py헤더 체크섬 다시 계산
tools/ips.pyIPS 만들기와 적용
tools/dis65816.py65816 역어셈블러
tools/pages1.py촬영한 화면에서 페이지별 완성 화면 고르기
tools/rgcmp1.py두 롬의 시나리오별 대사 ID 순서 비교
lua/scenario.luaMesen 2용. 디버그 시나리오 시작, A 연타, 대사 ID 기록, 촬영
lua/eventlist.luaMesen 2용. 이벤트 목록 문제 재현
tables/v1.1 텍스트, 메뉴 문자열, 일본어 원문과 v1.0 대조 덤프, 글자 코드표

한글판 만들러 가기