오늘도 끄적끄적

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

드래곤볼 Z 초오공전 각성편 한글판

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

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

직접 패치하려면

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

헤더 없는 파일 기준
구분크기CRC32MD5
일본판 원본2,097,152바이트3172CD4F8502A3E5C0FDC56B6495A644ACA54413
한글판 v1.22,097,152바이트E46C7A28E2457778B2F11063A75DFA69681E6FA3

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

'초오공전 각성편' 한글 로고와 오공·오반이 있는 타이틀 화면

v1.2에서 달라진 것

2016년에 낸 v1.1 이후 약 10년 만의 업데이트입니다. 일본어 원문과 한 줄씩 대조해 대사 782줄을 고쳤습니다.

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

원문대로 옮긴 대사

원문과 다르게 옮겼거나 글자 수 제한으로 잘렸던 대사를 원문대로 되살렸습니다.

v1.1v1.1: 바위밭에 쓰러져 혼잣말하는 오공 (1/4)
v1.2v1.2: 바위밭에 쓰러져 혼잣말하는 오공 (1/4)
v1.1v1.1: 바위밭에 쓰러져 혼잣말하는 오공 (2/4)
v1.2v1.2: 바위밭에 쓰러져 혼잣말하는 오공 (2/4)
v1.1

v1.1에 없던 대사

v1.2v1.2: 바위밭에 쓰러져 혼잣말하는 오공 (3/4)
v1.1

v1.1에 없던 대사

v1.2v1.2: 바위밭에 쓰러져 혼잣말하는 오공 (4/4)
대원숭이가 된 베지터에게 진 오공의 독백. 잘려 나갔던 뒷부분을 되살렸습니다.
v1.1v1.1: 우주를 날아가며 내퍼에게 말하는 베지터 (1/3)
v1.2v1.2: 우주를 날아가며 내퍼에게 말하는 베지터 (1/3)
v1.1

v1.1에 없던 대사

v1.2v1.2: 우주를 날아가며 내퍼에게 말하는 베지터 (2/3)
v1.1

v1.1에 없던 대사

v1.2v1.2: 우주를 날아가며 내퍼에게 말하는 베지터 (3/3)
내퍼에게 불로불사를 이야기하는 베지터. 빠졌던 대사를 되살렸습니다.
2장면 더 보기
v1.1v1.1: 대결장에서 천진반에게 슈퍼 도돈파를 예고하는 도백백 (1/4)
v1.2v1.2: 대결장에서 천진반에게 슈퍼 도돈파를 예고하는 도백백 (1/4)
v1.1

v1.1에 없던 대사

v1.2v1.2: 대결장에서 천진반에게 슈퍼 도돈파를 예고하는 도백백 (2/4)
v1.1

v1.1에 없던 대사

v1.2v1.2: 대결장에서 천진반에게 슈퍼 도돈파를 예고하는 도백백 (3/4)
v1.1v1.1: 대결장에서 천진반에게 슈퍼 도돈파를 예고하는 도백백 (4/4)
v1.2v1.2: 대결장에서 천진반에게 슈퍼 도돈파를 예고하는 도백백 (4/4)
도백백이 슈퍼 도돈파를 쓰기 전의 대사를 원문대로 채웠습니다.
v1.1v1.1: 예선 회장에서 상대를 보고 웃는 크리링 (1/2)
v1.2v1.2: 예선 회장에서 상대를 보고 웃는 크리링 (1/2)
v1.1v1.1: 예선 회장에서 상대를 보고 웃는 크리링 (2/2)
v1.2v1.2: 예선 회장에서 상대를 보고 웃는 크리링 (2/2)
천하제일 무술대회 예선에서 크리링이 하는 말도 원문대로 고쳤습니다.

캐릭터마다 다른 말투

프리더는 존댓말을 쓰고, 치치는 원문의 悟空さ에 맞춰 "오공 씨"라고 부릅니다. 원작의 말장난도 살렸습니다.

v1.1v1.1: 오공에게 서운함을 털어놓는 치치 (1/2)
v1.2v1.2: 오공에게 서운함을 털어놓는 치치 (1/2)
v1.1v1.1: 오공에게 서운함을 털어놓는 치치 (2/2)
v1.2v1.2: 오공에게 서운함을 털어놓는 치치 (2/2)
치치는 오공을 "오공 씨"라고 부릅니다.
v1.1v1.1: 나메크성에서 베지터와 마주한 프리더 (1/2)
v1.2v1.2: 나메크성에서 베지터와 마주한 프리더 (1/2)
v1.1v1.1: 나메크성에서 베지터와 마주한 프리더 (2/2)
v1.2v1.2: 나메크성에서 베지터와 마주한 프리더 (2/2)
프리더는 베지터에게도 존댓말을 씁니다.
3장면 더 보기
v1.1v1.1: 계왕별에서 자기소개를 하는 계왕 (1/3)
v1.2v1.2: 계왕별에서 자기소개를 하는 계왕 (1/3)
v1.1

v1.1에 없던 대사

v1.2v1.2: 계왕별에서 자기소개를 하는 계왕 (2/3)
v1.1v1.1: 계왕별에서 자기소개를 하는 계왕 (3/3)
v1.2v1.2: 계왕별에서 자기소개를 하는 계왕 (3/3)
계왕의 말장난 "가려‥ 계려‥ 계왕"을 살렸습니다.
v1.1v1.1: 대결장에서 오공을 응원하는 치치 (1/2)
v1.2v1.2: 대결장에서 오공을 응원하는 치치 (1/2)
v1.1v1.1: 대결장에서 오공을 응원하는 치치 (2/2)
v1.2v1.2: 대결장에서 오공을 응원하는 치치 (2/2)
천하제일 무술대회에서 오공을 응원할 때도 "오공 씨"라고 부릅니다.
v1.1v1.1: 나메크성에서 베지터에게 말하는 프리더 (1/2)
v1.2v1.2: 나메크성에서 베지터에게 말하는 프리더 (1/2)
v1.1v1.1: 나메크성에서 베지터에게 말하는 프리더 (2/2)
v1.2v1.2: 나메크성에서 베지터에게 말하는 프리더 (2/2)
힘을 감춘 프리더의 여유도 존댓말로 옮겼습니다.

이름·별명·맞춤법

고유명사는 국내 정식 발매판에 맞추고(슈퍼 도돈파, 미스터 포포 등), 원문에 없던 별명(빠박이, SKIN HEAD 등)은 정리했습니다. 맞춤법과 띄어쓰기, 줄바꿈도 바로잡았습니다.

v1.1v1.1: 드래곤볼 Z 로고와 오공·오반이 있는 타이틀 화면
v1.2v1.2: 드래곤볼 Z 로고와 오공·오반이 있는 타이틀 화면
타이틀 로고를 "초오공전 각성편"으로 바꾸고 로고 아래 가타카나는 지웠습니다.
v1.1v1.1: 천하제일 무술대회 예선 회장에서 오공에게 말하는 신 (1/2)
v1.2v1.2: 천하제일 무술대회 예선 회장에서 오공에게 말하는 신 (1/2)
v1.1v1.1: 천하제일 무술대회 예선 회장에서 오공에게 말하는 신 (2/2)
v1.2v1.2: 천하제일 무술대회 예선 회장에서 오공에게 말하는 신 (2/2)
센으로 변장한 신의 대사. MR. 포포는 미스터 포포로 부릅니다.
4장면 더 보기
v1.1v1.1: 엔딩 크레딧의 야지로베·카린·신·미스터 포포
v1.2v1.2: 엔딩 크레딧의 야지로베·카린·신·미스터 포포
엔딩 크레딧도 미스터 포포입니다.
v1.1v1.1: 드래곤볼을 손에 넣고 크리링을 떠올리는 베지터 (1/2)
v1.2v1.2: 드래곤볼을 손에 넣고 크리링을 떠올리는 베지터 (1/2)
v1.1v1.1: 드래곤볼을 손에 넣고 크리링을 떠올리는 베지터 (2/2)
v1.2v1.2: 드래곤볼을 손에 넣고 크리링을 떠올리는 베지터 (2/2)
베지터가 크리링을 "빠박이"라고 부르던 대사를 원문대로 고쳤습니다.
v1.1v1.1: 캡슐하우스에서 크리링과 함께 있는 부르마
v1.2v1.2: 캡슐하우스에서 크리링과 함께 있는 부르마
부르마의 대사에서도 원문에 없던 별명을 덜어 냈습니다.
v1.1v1.1: 바위산에서 오반에게 말하는 피콜로 (1/2)
v1.2v1.2: 바위산에서 오반에게 말하는 피콜로 (1/2)
v1.1v1.1: 바위산에서 오반에게 말하는 피콜로 (2/2)
v1.2v1.2: 바위산에서 오반에게 말하는 피콜로 (2/2)
피콜로의 대사. 맞춤법과 띄어쓰기, 줄바꿈을 바로잡았습니다.

진행 버그

v1.1에서는 아래 두 장면에서 우주선이 맵 밖을 헤매어 한참 기다려야 했습니다. 한글 대사를 넣다가 우주선 이동 경로 데이터를 덮어쓴 탓이었습니다. 이제 원본처럼 바로 진행됩니다.

v1.1v1.1: 바위밭에서 우주선을 부르는 베지터 (1/5)
v1.2v1.2: 바위밭에서 우주선을 부르는 베지터 (1/5)
v1.1v1.1: 바위밭에서 우주선을 부르는 베지터 (2/5)
v1.2v1.2: 바위밭에서 우주선을 부르는 베지터 (2/5)
v1.1v1.1: 바위밭에서 우주선을 부르는 베지터 (3/5)
v1.2v1.2: 바위밭에서 우주선을 부르는 베지터 (3/5)
v1.1v1.1: 바위밭에서 우주선을 부르는 베지터 (4/5)
v1.2v1.2: 바위밭에서 우주선을 부르는 베지터 (4/5)
v1.1v1.1: 바위밭에서 우주선을 부르는 베지터 (5/5)
v1.2v1.2: 바위밭에서 우주선을 부르는 베지터 (5/5)
패배한 베지터가 우주선을 부르는 장면. 같은 시점(0·8·16·23·24초)에 찍었습니다.
v1.1v1.1: 우주선을 타고 나메크성으로 출발하는 부르마 일행 (1/5)
v1.2v1.2: 우주선을 타고 나메크성으로 출발하는 부르마 일행 (1/5)
v1.1v1.1: 우주선을 타고 나메크성으로 출발하는 부르마 일행 (2/5)
v1.2v1.2: 우주선을 타고 나메크성으로 출발하는 부르마 일행 (2/5)
v1.1v1.1: 우주선을 타고 나메크성으로 출발하는 부르마 일행 (3/5)
v1.2v1.2: 우주선을 타고 나메크성으로 출발하는 부르마 일행 (3/5)
v1.1v1.1: 우주선을 타고 나메크성으로 출발하는 부르마 일행 (4/5)
v1.2v1.2: 우주선을 타고 나메크성으로 출발하는 부르마 일행 (4/5)
v1.1v1.1: 우주선을 타고 나메크성으로 출발하는 부르마 일행 (5/5)
v1.2v1.2: 우주선을 타고 나메크성으로 출발하는 부르마 일행 (5/5)
부르마 일행이 나메크성으로 출발하는 장면. 같은 시점(0·5·11·22·28초)에 찍었습니다.

이야기

피콜로 대마왕을 쓰러뜨리고 3년, 제23회 천하제일 무술대회에서 오공과 친구들이 다시 모입니다. 그로부터 5년 뒤 오공의 형이라는 사이어인 라데츠가 지구에 나타납니다.

지구로 오는 베지터와 내퍼에 맞서 1년을 수련하고, 드래곤볼을 찾아 나메크성으로 건너가 프리더와 결전을 벌이기까지, 원작 만화 《드래곤볼》의 어른이 된 오공의 이야기를 따라갑니다.

반다이가 1995년에 낸 슈퍼 패미컴 게임으로, 같은 해 나온 초오공전 돌격편의 뒤를 잇습니다.

대원숭이로 변신해 모두 파괴해 주겠다고 외치는 베지터
프리더의 우주선에서 베지터를 찾는 도도리아와 프리더 일당

진행 방식

나메크성에서 애플이 연속 에너지탄을 쓰는 순간의 전투 화면

전투

상대가 기술을 쓰면 화면 위에 기술 이름이 뜹니다. 그 순간 맞는 버튼을 눌러 받아칩니다. 기술마다 계열이 있어 서로 이기고 지는 관계가 있습니다.

세 가지 답 중 하나를 고르는 DBZ 퀴즈

DBZ 퀴즈

이야기 중간중간 DBZ 퀴즈가 나와 세 가지 답 중 하나를 고릅니다. 맞힌 비율은 세이브 화면에 남습니다.

신룡 앞에서 소원을 고르는 화면

신룡의 소원

드래곤볼을 모으면 신룡에게 소원을 빕니다. 전투력이나 체력을 올려 다음 싸움에 대비합니다.

20배 중력 속에서 수련을 시작하는 오공

수련

나메크성으로 가는 우주선 안에서는 20배 중력 속에서 수련합니다.

한글판을 만든 방법

v1.2는 2016년에 낸 v1.1 패치를 일본판에 적용한 롬에서 출발했습니다. 그 위에 v1.1이 만든 진행 버그를 고치고, 압축된 타이틀 그림을 풀어 한글로 다시 그리고, 대사 782줄을 고쳐 넣었습니다. 롬 크기는 원본과 같은 2MB입니다. 장면 확인은 일본판 롬 안에 남아 있던 개발자용 디버그 메뉴로 했습니다.

일본판 롬에 남아 있는 디버그 메뉴. 왼쪽은 ADVENTURE·BATTLE·SOUND 첫 화면과 95/08/03 빌드 날짜, 오른쪽은 시나리오·플래그·메시지 번호를 고르는 ADVENTURE 화면
일본판 롬에 남아 있는 디버그 메뉴

슈퍼 패미컴 구조나 65c816 어셈블리를 몰라도 읽을 수 있게 풀어 썼습니다. 절마다 그 일을 한 도구 파일을 적어 두었고, 도구 묶음은 마지막 분석 도구에서 받을 수 있습니다.

자세히 보기

1. 배경지식

관련 도구: lua/dbgscene.lua 받기

게임기 안의 메모리

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

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

주소 읽는 법

0xCA9BE 같은 파일 오프셋은 롬 파일을 처음부터 센 위치이고, $99:A9BE 같은 SNES 주소는 CPU가 보는 뱅크:주소입니다. 이 게임은 LoROM이라 뱅크마다 뒤쪽 32KB($8000–$FFFF)에만 롬이 보입니다. 그래서 다음처럼 바꿉니다.

파일 오프셋 = (뱅크 & 0x7F) × 0x8000 + (주소 & 0x7FFF)
$99:A9BE → 0x19 × 0x8000 + 0x29BE = 0xCA9BE

어셈블리, 필요한 만큼만

어셈블리는 CPU가 실행하는 명령을 사람이 읽는 이름으로 적은 것이고, 롬 안에서는 그냥 바이트입니다. 전원을 켠 직후 실행되는 코드($80:805C, 파일 0x5C)를 보겠습니다.

바이트어셈블리뜻
80 0CBRA $806A무조건 12바이트 뒤로 건너뜁니다. 제품판은 아래 네 줄을 늘 건너뜁니다.
AD 33 02LDA $0233$0233번지 값을 읽습니다. 주소는 거꾸로 적힙니다.
29 FF 00AND #$00FF아래 바이트만 남깁니다.
D0 04BNE $806A0이 아니면 다음 4바이트를 건너뜁니다.
22 2B 9F 80JSL $809F2B디버그 메뉴 루틴을 부릅니다.

첫 줄 80 0C를 아무 일도 안 하는 명령 두 개 EA EA(NOP NOP)로 바꾸면 건너뛰지 않고 디버그 메뉴로 들어갑니다. 위 화면이 그렇게 연 메뉴입니다. ADVENTURE에서 장면 번호를 넣고 시작하면 맵까지 그 장면에 맞게 불러와서, 처음부터 플레이하지 않고도 원하는 대사를 띄울 수 있습니다. 롬 해킹은 이런 바이트 바꾸기의 연속입니다.

2. 대사가 롬에 들어 있는 모양

관련 도구: tools/dialogue.py, tools/extract.py, tables/kr-v1.2.txt 받기

대사 글자 하나는 16비트(2바이트) 코드이고, 작은 쪽 바이트를 먼저 적습니다. 0A 00은 줄바꿈,00 00은 대사 끝입니다. 한 페이지는 4줄이고, 한 줄에는 얼굴 그림이 있는 창은 10자, 나레이션 창은 15자까지 들어갑니다. 크리링의 대사 하나를 롬에서 그대로 꺼내면 이렇습니다.

바이트A2 0645 0952 090A 0005 06B4 0572 0220 0172 0213 0624 0100 00
글자크리링줄바꿈좋은빈칸걸빈칸줄게끝

대사 ID는 0x000부터 0xF94까지 4천 개 가까이 됩니다. ID 범위마다 뱅크가 정해져 있고, 뱅크 첫머리에 포인터 표가 있습니다.

대사 ID뱅크포인터 표
000–3DF$99$99:8000
3E0–5B6$9A$9A:8000
5B7–7AE$9B$9B:8000
7AF–97C$9C$9C:8000
97D–B44$9D$9D:8000
B45–D15$9E$9E:8000
D16–ED3$9F$9F:8000
ED4–F94$98$98:C1C8
  1. 스크립트의 대사 명령(0x08)이 16비트 대사 ID를 줍니다. 예: 0x2A7
  2. ID 범위로 뱅크를 고릅니다. 0x2A7은 $99입니다.
  3. 그 뱅크 첫머리 포인터 표에서 ID 순서대로 2바이트를 읽습니다. $99:8000 + 0x2A7 × 2 = $99:854E에 BE A9가 있습니다.
  4. 같은 뱅크의 $99:A9BE(파일 0xCA9BE)에 대사 문자열이 있습니다.

3. 폰트에 없는 글자

관련 도구: tools/font.py, tools/usedsheet.py, tools/dialogue_patch.py 받기

대사 폰트는 16×16 픽셀이고, 8×8 타일 4장으로 나뉘어 들어 있습니다. 롬에 저장된 시트는 한 줄에 타일 16장이라 글자 8개의 위 절반이 한 줄, 아래 절반이 그다음 줄입니다. 그래서 0x108–0x10F처럼 아래 절반 줄에 해당하는 코드는 글자로 쓰지 않습니다.

롬의 폰트 시트 네 줄. 파란 줄은 글자 8개의 위 절반, 빨간 줄은 아래 절반이고, 이어 붙이면 슈·가·각·간 같은 글자가 된다

v1.1 폰트에는 대사를 고치며 필요해진 글자 몇 개가 없었습니다. 그래서 어떤 대사에서도 쓰지 않는 글자 자리를 찾아 Galmuri11 폰트로 깨·꽉·꾼·닿·렁·롭·벅·빡·뻐·셋·씻 11자를 그려 넣었습니다. 아래는 그렇게 넣은 「깨」입니다.

대사 폰트 코드 0x123에 그려 넣은 「깨」를 16×16 픽셀 격자와 줄마다의 바이트 값으로 나타낸 그림

글자 표를 그대로 믿으면 안 된다는 것도 배웠습니다. v1.1 글자 표에는 922번이 「렁」이라고 적혀 있었지만 실제 그림은 「렇」이었습니다. 지금은 표의 글자와 롬의 그림을 대조해서 씁니다.

4. 늘어난 대사는 같은 뱅크 안으로

관련 도구: tools/dialogue_patch.py, tables/dialogue-v1.2.tsv 받기

포인터는 2바이트라 뱅크 번호 없이 같은 뱅크 안의 주소만 가리킵니다. 그래서 고친 대사가 원래보다 길면 다른 뱅크로는 못 보내고, 같은 뱅크의 빈 공간으로 옮긴 뒤 포인터만 고칩니다. 여러 ID가 한 문자열을 같이 가리키는 경우도 있어서, 그런 문자열은 제자리에서 고치지 않고 새 자리에 따로 씁니다.

5. 우주선이 맵 밖을 헤매던 이유

관련 도구: tools/fix_overwrites.py 받기

v1.1은 늘어난 대사를 0xFF가 이어진 곳에 넣었습니다. 비어 있다고 생각했기 때문입니다. 그런데 0xFF가 시작되는 자리가 사실은 바로 앞 데이터의 끝 표시(FF FF)였습니다. 두 곳이 이렇게 덮였습니다.

  • $88:FFAE: 맵 이동 경로 레코드의 끝 표시와 그 뒤 레코드 하나. 이동 루틴이 대사 바이트를 경로로 읽어서 우주선이 맵 밖으로 나갔습니다.
  • $83:F3AF: 컷신 캐릭터 X 좌표 표의 끝 표시. 캐릭터가 엉뚱한 좌표 쪽으로 미끄러져 갔습니다.
파일 0x47FA8부터 16바이트. 일본판은 경로 레코드와 끝 표시 FFFF 뒤가 비어 있고, v1.1은 끝 표시부터 한글 대사로 덮였고, v1.2는 원래 바이트를 되살리고 대사를 뒤로 밀었다

v1.2는 원래 바이트를 되살리고, 그 자리에 있던 대사를 뒤로 민 다음, 그 대사를 가리키는 포인터를 같은 만큼 고쳤습니다. 이제 빈 공간을 쓸 때는 앞뒤에 여유를 두고, 일본판 원본에서도 그 자리가 0xFF였는지 확인합니다.

6. 압축된 타이틀 그림

관련 도구: tools/lz.py, tools/title.py 받기

타이틀 로고는 롬에 LZSS로 압축돼 있습니다. 앞에서 나온 것과 같은 내용이 또 나오면 바이트를 다시 적지 않고 "몇 바이트 앞에서 몇 바이트를 베껴라" 라고만 적는 방식입니다. 플래그 바이트 하나가 뒤따르는 항목 8개의 종류를 아래 비트부터 알려 줍니다. 1이면 바이트 1개를 그대로, 0이면 2바이트짜리 "베껴라" 명령입니다. 일본판 타이틀 그림의 첫머리를 실제로 풀어 보면 이렇습니다.

50 13      풀면 0x1350 = 4,944바이트
DC         플래그 11011100 → 아래 비트부터 0 0 1 1 1 0 1 1
2F 01      베끼기: 길이 0xF+3 = 18, 거리 18 → 시작보다 앞이라 0으로 18바이트
F0 00      베끼기: 길이 3, 거리 15 → 0 세 바이트
01 0F 3F   그대로 세 바이트
89 00      베끼기: 길이 12, 거리 8 → 방금 쓴 8바이트를 겹쳐 가며 반복
1F FF      그대로 두 바이트

타이틀 그림을 푸는 루틴($80:9DA7)은 다 푼 뒤에 타일마다 바이트 순서를 한 번 더 바꿉니다. 그래서 압축만 풀어서는 왼쪽처럼 줄무늬가 지고, 순서를 바꿔야 오른쪽처럼 제대로 보입니다.

타이틀 그림을 롬에서 꺼낸 결과. 위는 일본판, 아래는 v1.2이고 왼쪽은 압축만 푼 줄무늬 상태, 오른쪽은 바이트 순서를 바꿔 超悟空伝 覚醒編과 초오공전 각성편 로고가 보이는 상태
위 일본판, 아래 v1.2. 왼쪽은 압축만 푼 상태, 오른쪽은 순서를 바꾼 상태

한글 로고를 그린 뒤 다시 압축했더니 원래 3,608바이트가 3,232바이트로 줄어 제자리에 들어갔습니다. 더 길어지면 같은 영역의 빈 공간(파일 0x4C801–0x4FFFF)으로 옮기고 위치 정보를 고치도록 해 두었습니다. 「DRAGON BALL Z」 로고와 저작권 줄은 원본 그대로입니다. 저작권 줄의 © 타일은 두 줄이 같이 쓰기 때문입니다.

7. 엔딩 크레딧과 세이브

관련 도구: tools/credits.py, lua/crjump.lua 받기

엔딩 크레딧도 대사와 같은 16비트 문자열이고, 이름 줄마다 포인터가 있습니다($83:949D). 「MR. 포포」를 「미스터 포포」로 늘리면서 원래 자리에 줄여 넣지 않고 빈 공간으로 옮겨 포인터를 고쳤습니다. 제자리에서 글자 수를 바꾸면 가운데 정렬이 틀어집니다.

세이브 구조는 건드리지 않아 v1.1 세이브를 그대로 쓸 수 있습니다. 함께 배포한 100% 세이브 파일에서 깨진 슬롯을 지울 때는 슬롯 본체만이 아니라 요약 정보 두 곳(0x800대, 0x860대)도 같이 지워야 했습니다.

8. 확인은 에뮬레이터가

관련 도구: lua/dbgscene.lua, lua/lib.lua 받기

  • Mesen 2와 Lua 스크립트로 디버그 메뉴에서 장면을 시작하고, 버튼을 눌러 대사를 넘기며 화면을 저장합니다. 중간의 DBZ 퀴즈도 스크립트가 넘깁니다.
  • 대사 포인터 표를 읽는 순간을 감시해 어느 프레임에 어떤 대사 ID가 떴는지 기록하고, 그 프레임을 찾아 찍습니다.
  • 위 비교 화면은 모두 이렇게 실제 장면에서 찍었습니다. 포인터를 억지로 바꿔 만든 화면은 쓰지 않았습니다.
  • 376개 장면을 일본판, v1.1, v1.2로 끝까지 돌려 마지막 화면을 비교합니다.
  • 빌드 결과가 늘 같은 CRC32(E46C7A28)인지 확인합니다.

9. 분석 도구

빌드 스크립트, 대사·폰트·LZSS 도구, 글자 표, 고친 대사 782줄, Mesen 2용 Lua 스크립트와 롬 분석 문서를 묶었습니다. 같은 엔진을 쓰는 초오공전 돌격편을 분석할 때도 주소만 바꾸면 대부분 쓸 수 있습니다.

분석 도구 받기(zip, 2.4MB, 롬 파일은 들어 있지 않음)

파일하는 일설명
tools/build.sh아래 순서대로 전체 빌드9. 분석 도구
tools/dialogue.py대사 ID로 대사 위치 찾기2. 대사
tools/extract.py일본어·한국어 대사 덤프(TSV)2. 대사
tools/font.py대사 폰트 글자 읽기3. 폰트
tools/usedsheet.py대사에 쓰인 글자 목록3. 폰트
tools/dialogue_patch.py대사 넣기, 옮기기, 새 글자 그리기4. 대사 옮기기
tools/fix_overwrites.pyv1.1이 덮어쓴 데이터 되살리기5. 진행 버그
tools/lz.pyLZSS 압축·해제6. 타이틀
tools/title.py타이틀 그림 그리기·넣기6. 타이틀
tools/credits.py엔딩 크레딧 고치기7. 크레딧
tools/fixsum.py롬 헤더 체크섬 다시 계산9. 분석 도구
tools/ips.pyIPS 적용·생성9. 분석 도구
tables/일본판·v1.1·v1.2 글자 표, 고친 대사 782줄2. 대사
lua/Mesen 2 스크립트: 디버그 메뉴 장면 시작, 크레딧 바로 보기8. 확인
README.txt롬 분석 문서(주소·형식 전체)1. 배경지식

압축을 푼 폴더에 일본판 원본을 넣고 빌드 스크립트를 돌리면 아래 순서로 v1.2와 같은 롬이 나옵니다.

  1. 일본판 원본에 v1.1 IPS를 적용합니다.
  2. v1.1이 덮어쓴 데이터를 되살립니다.
  3. 타이틀 그림을 그려 다시 압축해 넣습니다.
  4. 고친 대사 782줄을 넣고, 늘어난 대사는 옮긴 뒤 포인터를 고칩니다.
  5. 엔딩 크레딧을 고칩니다.
  6. 롬 헤더 체크섬을 다시 계산하고 IPS를 만듭니다.

한글판 만들러 가기