
지도
장소를 옮겨 가며 원작의 장면이 이어집니다. 드래곤볼을 찾을 때는 X 버튼으로 레이더를 보며 직접 돌아다닙니다.
슈퍼 패미컴 · 1995 · 한글패치 v1.1
가지고 있는 일본판 게임 파일을 고르면 바로 한글판으로 바꿔 저장합니다. 따로 프로그램을 설치하지 않아도 됩니다.
메신저 앱 안에서 열린 화면이라 파일을 고르거나 저장하지 못할 수 있습니다. 메뉴에서 "다른 브라우저로 열기"를 눌러 크롬이나 사파리로 열어 주세요.
파일은 이 기기 안에서만 바꾸고 어디에도 보내지 않습니다.
Floating IPS·Lunar IPS·ROM Patcher JS 같은 도구로 손대지 않은 일본판 원본에 적용하세요. 파일 크기에 맞는 IPS를 받으세요.
| 구분 | 크기 | CRC32 | MD5 |
|---|---|---|---|
| 일본판 원본 | 2,097,152바이트 | D531289B | 8BD89634D1B2205B1E7EF016485C0076 |
| 한글판 v1.1 | 2,097,152바이트 | 7405D969 | FCA11D34E7D5AD8D9D2021AC1C8E34E5 |
세이브 구조는 바꾸지 않아 v1.0 세이브 파일을 그대로 이어서 쓸 수 있습니다.

2012년에 낸 v1.0 이후 약 14년 만의 업데이트입니다. 대사 5,370줄을 일본어 원문과 한 줄씩 대조해 4,483줄을 고쳤습니다.
같은 장면을 같은 입력으로 찍어 v1.0과 v1.1을 나란히 놓았습니다.
일본어 원문과 한 줄씩 맞춰 보고, 뜻이 달랐거나 빠졌던 대사를 원문대로 옮겼습니다.










v1.0에 없던 대사



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












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




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








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







한 페이지에 모두 들어감
v1.0 배포 때 공지했던 문제입니다. 진행 상황에 따라 나타나지 않을 때도 있었습니다.






산속에서 할아버지의 유품인 사성구를 지키며 사는 꼬리 달린 소년 오공. 어느 날 드래곤볼을 찾아 나선 부르마를 만나 함께 모험을 떠납니다.
드래곤볼을 노리는 피라후 일당과 레드 리본군, 무천도사 밑에서의 수행과 천하제일 무술대회를 거쳐 피콜로 대마왕과의 결전까지, 원작 만화 《드래곤볼》의 소년 오공 시절을 따라갑니다.
반다이가 1995년에 낸 슈퍼 패미컴 게임입니다. 같은 해 나온 초오공전 각성편이 그 뒤 이야기를 다룹니다.



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

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

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

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

슈퍼 패미컴 구조나 65816 어셈블리를 몰라도 읽을 수 있게 풀어 썼습니다. 절마다 그 작업에 쓴 도구 파일 이름을 적었습니다. 아래 묶음을 받아 설명과 코드를 같이 볼 수 있습니다.
도구: tools/dis65816.py · lua/scenario.lua 파일 설명
CPU는 화면에 직접 그리지 않습니다. 그림 조각(타일)을 VRAM에 올려 두고 "이 칸에는 몇 번 타일" 이라는 배치표(타일맵)를 적어 화면을 만듭니다. 대사 글자도 폰트에서 읽어 와 타일로 그립니다.
| 이름 | 크기 | 비유 | 하는 일 |
|---|---|---|---|
| 롬 | 2MB | 책 | 카트리지에 든 프로그램·대사·폰트·그림. 읽기만 합니다. |
| WRAM | 128KB | 작업 책상 | CPU가 계산하며 값을 적어 두는 곳. 지금 보고 있는 장면 번호 같은 것이 여기 있습니다. |
| VRAM | 64KB | 스티커판 | 화면에 붙일 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, 아무 일도 안 함)로 바꾸면 디버그 메뉴가 열립니다.

ADVENTURE의 SCENARIO SELECT로 장면 번호(0x00–0xFF)를 고르면 그 장면을 실제 플레이와 같은 상태로 시작합니다. DATA의 ENDING으로는 엔딩을 처음부터 볼 수 있습니다. 이 메뉴가 뒤에 나올 테스트의 바탕이 됐습니다.
도구: 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이 될 때까지 고쳤습니다. 줄을 나눌 때는 이렇게 정했습니다.
도구: tools/font1.py · tables/ 파일 설명
이 게임은 글자마다 폭이 다른 가변폭 폰트를 씁니다. 대사의 글자 하나는 2바이트 코드이고, 코드 범위에 따라 폰트를 읽는 곳이 다릅니다.
| 코드 | 크기 | 폭 | 원래 글자 | 롬 위치 |
|---|---|---|---|---|
0x100–0x4FF | 8×16 | 9px | 가나 | $83:DE00 |
0x500–0x7EF | 16×16 | 13px | 한자 | $83:8000 |
0x7F0–0xBEF | 16×16 | 13px | 한자 | $BF:8000 |
한 글자는 두 겹으로 되어 있습니다. 한 겹은 글자 모양, 다른 한 겹은 오른쪽 아래로 비키는 그림자입니다. v1.0은 한자 자리 850개와 가나 자리 160개에 한글을 그려 넣었습니다. 아래는 v1.0 롬의 16×16 칸 전체입니다. 남색은 한글이 들어간 칸, 노란색은 한글이 아닌 칸(기호와 남은 한자)입니다.

한글 음절은 자주 쓰는 것만 해도 2,350자입니다. 1,010칸에는 v1.0 번역문에 쓴 글자만 골라 넣을 수 있었고, 대사를 고치면서 새로 필요해진 글자를 넣을 자리는 없었습니다.
도구: tools/fontext1.py · tools/text_patch1.py 파일 설명
글자를 그리는 코드($B7:9763)는 코드 범위를 보고 어느 폰트를 읽을지 고릅니다. 그중 0x7F0 이상 코드를 맡는 갈림길($B7:97BC)을 "새 코드로 가라" 는 명령으로 덮어쓰고, 새 코드를 롬의 빈 공간에 두었습니다. 이렇게 원래 코드 중간에 새 코드를 끼워 넣는 것을 후킹이라고 합니다.
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였는지, 앞의 자료가 그 값을 읽지 않는지 확인한 곳만 썼습니다.
도구: tools/title.py · tools/lz.py 파일 설명
타이틀 화면은 그림 여러 겹을 겹쳐서 만듭니다. 왼쪽부터 오공 그림, 배경 그라데이션, 로고와 글자가 있는 층(BG3)입니다. 한글 타이틀은 이 중 글자 층만 고쳤습니다. 「超悟空伝 突激編」을 한글로 다시 그리고, 로고 아래 가타카나는 지웠습니다.

글자 층의 타일과 배치표는 LZSS라는 방식으로 압축되어 있습니다. 같은 무늬가 앞에 나왔으면 "몇 칸 앞에서 몇 바이트 복사" 로 줄여 쓰는 방식입니다. 새로 그린 그림을 같은 방식으로 다시 압축하니 원래보다 길어져서, 롬의 빈 공간으로 옮기고 그 위치를 가리키는 항목을 고쳤습니다. 압축 형식과 그림 배치가 각성편과 같아서 각성편 v1.2를 만들 때 쓴 도구를 주소만 바꿔 썼습니다.
「DRAGON BALL Z」 로고와 「© BANDAI 1995」는 원본 그대로입니다. 이 © 타일은 위쪽 저작권 줄과 함께 쓰기 때문에 건드리면 두 줄이 같이 바뀝니다.
도구: lua/eventlist.lua 파일 설명
이벤트는 204개(0–203번)인데, 목록을 내리는 조건이 205줄을 기준으로 되어 있어서 맨 아래에서 없는 204번 줄을 그립니다. 그 줄의 포인터 자리에는 첫 이벤트 이름의 글자 코드가 있습니다. 게임은 이 값을 주소로 알고 WRAM의 그 자리를 문자열로 읽습니다.
그 자리 값은 게임 상황마다 다릅니다. 끝 표시가 늦게 나오면 줄이 넘치고, B로 목록을 닫을 수 없게 됩니다. 일본판에도 있는 동작이지만, v1.0은 첫 글자 코드가 바뀌면서 읽는 주소가 $7E:0686이 됐습니다. 디버그 메뉴로 장면을 바꿔 가며 재현해 보니 0xC0번 장면에서 실제로 목록이 닫히지 않았습니다.
v1.1은 204번 자리에 빈 문자열을 가리키는 포인터를 넣었습니다. 같은 0xC0번 장면에서 B를 두 번 눌러 게임으로 돌아오는 것을 확인했습니다.
도구: lua/scenario.lua · tools/pages1.py · tools/rgcmp1.py 파일 설명
대사 5,370줄을 사람이 다 띄워 볼 수는 없어서, 에뮬레이터 Mesen 2와 Lua 스크립트로 확인했습니다.
도구: tools/credits1.py · tools/fixsum.py 파일 설명
0x7FDC–0x7FDF).위에서 설명한 주소 전체와 빌드 도구가 들어 있고, 게임 롬은 들어 있지 않습니다. 압축을 푼 폴더에 일본판 원본(헤더 없음, 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.py | LZSS 압축과 해제 |
tools/credits1.py | 엔딩 크레딧 줄 정렬 |
tools/fixsum.py | 헤더 체크섬 다시 계산 |
tools/ips.py | IPS 만들기와 적용 |
tools/dis65816.py | 65816 역어셈블러 |
tools/pages1.py | 촬영한 화면에서 페이지별 완성 화면 고르기 |
tools/rgcmp1.py | 두 롬의 시나리오별 대사 ID 순서 비교 |
lua/scenario.lua | Mesen 2용. 디버그 시나리오 시작, A 연타, 대사 ID 기록, 촬영 |
lua/eventlist.lua | Mesen 2용. 이벤트 목록 문제 재현 |
tables/ | v1.1 텍스트, 메뉴 문자열, 일본어 원문과 v1.0 대조 덤프, 글자 코드표 |