스크린 샷

CHR-ROM 방식의 한글 패치 작업 과정

이 게임은 매퍼 23(Konami VRC2/VRC4 계열)을 사용한다.

PRG ROM: 128KB / 뱅크당 8KB / 16개 ($00~$0F)
CHR ROM: 128KB / 뱅크당 1KB / 128개 ($00~$7F)

한글 폰트과 추가 코드를 넣을 공간을 확보하기 위해 expand_rom.asm을 작성해 두 영역을 각각 256KB로 확장

PRG ROM: 256KB / 뱅크당 8KB / 32개 ($00~$1F)
CHR ROM: 256KB / 뱅크당 1KB / 256개 ($00~$FF)

ROM을 확장할 때는 원본 코드가 기존 주소에서 계속 실행될 수 있도록 PRG의 마지막 두 뱅크를 확장 영역의 맨 뒤로 옮겼다. CHR은 원본 데이터를 옮길 필요가 없어 그대로 두고 뒤에 확보한 공간에 한글 폰트를 넣는 방식으로 늘 해오던 방식으로 진행 하였다. 공간이 생겼다고 한 화면에서 쓸 수 있는 글자까지 늘어나는 것은 아니다. PPU의 패턴 테이블 한 페이지는 4KB이고, 이 매퍼에서는 1KB짜리 CHR 뱅크 네 개로 구성된다. 결국 폰트를 얼마나 넣을 수 있느냐와 별개로, CHR-ROM 방식으로 한글 패치를 할 경우 화면을 분석하여 어떤 글자를 함께 사용할지, 청크 처리를 어떻게 해야할지 고민해봐야 하는 것이다.

분석한 내용을 토대로 대사에 필요한 글자를 그룹으로 묶었다. 만든 파이썬 스크립트는 이를 돕기 위해 그룹화된 json파일을 이용하여 CHR 파일과 map.asm을 함께 생성한다. CHR에는 글자 그림이, map에는 문자 코드에 대응하는 타일 번호가 들어가는 구조다. 그리고 이를 배치하는 chr_groups.asm과 prg_groups.asm도 생성한다. 이렇게 만든 폰트를 출력하려면 대사에 맞는 그룹을 선택하는 과정도 필요하다. dialogue_links.asm에 대사 주소와 그룹 ID를 연결해 놓고, 출력할 대사에 따라 원본 폰트 뱅크인 $3E와 $3F 대신 해당 그룹의 뱅크를 사용하도록 바꿨다. 이후에는 그룹의 map에서 이진 검색을 통해 문자에 맞는 타일을 출력한다.

추가로 대사를 출력하는 것 외에도 신경 쓸 부분이 있었다. 미니게임에서는 숫자가 별도로 갱신되고, 화면이 바뀌어도 ‘남은’, ‘명’ 같은 문구는 계속 표시된다. 이때 폰트 그룹을 교체하면 기존 타일 번호가 다른 글자를 가리켜 표시가 깨질 수 있다. 그래서 계속 사용하는 숫자와 문구는 관련 그룹에서 같은 인덱스에 배치해, 그룹이 바뀌어도 그대로 보이도록 맞췄다.

다만 슬프게도 모든 구간에 폰트 뱅크 두 개를 통째로 넣을 수 있었던 것도 아님을 알았다. 보스 그림과 함께 쓰는 구간에서는 그림용 뱅크를 남겨 두고 나머지 한 뱅크만 교체해야 하는데 가용되는 타일 수를 넘어가버린다면 이에 맞게 기존 그룹을 또 쪼개야 한다. 뭐 시행착오였고 마지막 보스에서는 조금 다른 문제도 생겼다. 원래 빈 타일을 가리키던 스프라이트가 추가한 폰트를 표시하면서 화면에 글자 조각이 나타난 것이다. 이 경우에는 해당 타일을 다시 비우고 글자를 다른 인덱스로 옮기는 것으로 해결할 수 있었다.

다음은 문자열로 출력되지 않는 글자들은 따로 손을 봤다. 테두리가 포함된 안내판이나 하단 정보창의 스테이지, 기술명, 잔기, 메달 수가 여기에 해당한다. 같은 글자라도 배경색과 테두리 구성이 달라서, 각 화면에 맞는 타일을 준비하는 작업이 뒤따랐다. 폰트를 8×8에서 8×16으로 바꾸면서 대사창과 정보창을 늘리고 내부 위치를 맞추는 것은 물론, 글자를 지우거나 갱신하는 처리까지 함께 살펴야 했다. 기존처럼 한 행만 지우면 글자의 아래쪽이 남기 때문에, 위아래 두 행을 모두 처리하도록 수정하면서 화면 작업을 마무리했다.

결국 CHR-ROM 방식을 그대로 쓰면서 한글 패치하는 방식은 앞서 말했던 것 처럼 얼마나 한글폰트를 나누고 공용으로 쓰는 것을 구분하는 것이 아닐지 생각된다. 대부분이 히라가나, 카타카나만 쓰는 CHR-ROM 방식의 RPG 게임은 이부분이 힘들겠지만 이 매퍼처럼 CHR 뱅크 단위가 작아서 유연성이 좋은 경우 가능할수도 있지 않을까?

보스 러시

분석을 해보니 구조가 생각했던 것보다 쉬워보여서 보스 러시도 넣어 보고 싶었다. 원본에서는 스테이지 번호로 맵을 선택하고 현재 방에 해당하는 배치 데이터를 읽어 적과 보스를 등장시키는 구조다. 보스가 나온 뒤에는 각각의 상태에 따라 등장 연출과 공격, 피격 처리가 이어진다. 그렇다면 전투 동작을 새로 작성할 필요 없이, 기존 보스 구간으로 바로 들어가도록 연결하면 되겠다는 생각이 들었다.

먼저 시작 메뉴에 보스 러시를 추가하고, 원본에서 스테이지 시작 위치를 정하는 부분에 훅을 걸었다. 여기서 확장 PRG 뱅크의 bos_rush.asm으로 넘어가 보스 방 좌표와 스크롤 위치를 설정한 뒤 원본으로 돌아온다. 배경과 적 배치 데이터를 읽는 과정은 그대로 이어지므로 각 보스의 공격과 피격 코드도 기존 것을 사용할 수 있다.

막상 연결해 보니 방 좌표만 맞추는 것으로는 부족한 구간이 있었다. 원래 그곳까지 이동하면서 설정되는 스크롤 상태나 등장 준비가 빠져 있었기 때문이다. 이런 부분은 플레이어 위치와 필요한 상태를 맞추고 원본 처리를 이용해 전투로 이어지도록 해야하므로 따로 코드가 더 필요했다.

구간 진입을 맞춘 다음에는 보스 러시의 규칙을 적용했다. 잔기는 0으로 두고 처음부터 모든 기술을 사용 가능하며 보스를 쓰러뜨렸을 때 남은 체력을 다음 전투로 넘기도록 연결했다. 5스테이지의 여신짱은 퀴즈 구간이라 이번 구성에서는 제외했다.

마지막 9스테이지에는 중간 보스가 화염사자와 거대로봇 둘이라 전환을 따로 구분해야 한다. 그래서 화염사자는 독립된 구간으로 두고 거대로봇에서 최종 보스와 엔딩까지 이어지는 원래 흐름을 이용했다. 덕분에 거대로봇 이후의 연결을 별도로 다시 만들 필요는 없어서 쫌 수월하게 끝낼 수 있었다.

패스워드

패스워드 입력에는 공백을 포함한 18개 문자만 사용한다. 폰트는 메뉴와 패스워드가 함께 사용하는 그룹에 들어 있으며, 별도의 문자 목록은 입력할 수 있는 글자와 선택 순서를 정한다. 정답 표는 이 목록의 순번 세 개로 단어를 지정한다. 두 글자 단어는 마지막 입력칸을 공백으로 두어여 한다.

달밤  : 1스테이지

깊은밤: 2스테이지

흐린날: 3스테이지

이슬비: 4스테이지

한여름: 5스테이지

내일  : 6스테이지

새벽  : 7스테이지

5 스테이지 여신짱 퀴즈 정답

내가 살고 있는 나라는 어디?                               미국

나는 어느 나라에서 온 선물일까?                           프랑스

지금 미국인이 가장 많이 쓰는 일본어는?                    닌텐도

다음 섬 중에서 가장 남쪽에 있는 섬은?                     괌

코나미 게임 음악 밴드의 이름은?                           구형파 클럽

지금 몇 번째 문제?                                        6번째

2스테이지의 보스는 무엇이었을까요?                        니와토리상

기상위성은 히마와리, 그럼 방송위성은?                     백합

악마성 전설의 주인공 이름은?                              랄프

코나미 하면 고베. 다음 중 고베에 없는 것은 어느 것?       마린타워

에비스마루라는 녀석이 나왔던 게임은?                      고에몽2

내 몸은 무엇으로 만들어졌을까요?                          구리

내가 왼손에 들고 있는 것은 무엇?                          퀴즈 문제집

1스테이지의 보스는 무엇이었을까요?                        마도사 부자

TAS

두가지 글리치가 존재하는데 박쥐 폼에서 피격당하면 이때 점프가 되는데 스테이지에서 이걸 이용해서 벽을 넘을 수가 있다.

다음은 연사 글리치로 발사후에 화면에서 보이는 반대 방향으로 1프레임 입력 후 다시 발사하면 탄이 사라지기 전까지 한번에 3개탄을 빠르게 발사할수 있다.

또한 완전한 글리치는 아니지만 영상에서 7스테이지 를 보면 프레임 조절을 통해 꽤 화려한 전투 장면을 연출해 보았다.

  1. 박쥐 폼 취소와 발사, 재변신을 반복한 공중 곡예
  2. 화면 끝에서 박쥐 폼을 사용할 때 발생하는 버그로 보스를 구석에 고정
  3. 발사 프레임을 조절해 유도탄 전탄 명중

소스코드

https://github.com/sunlightface/Akumajou-Special—Boku-Dracula-Kun-KR-

패치

MD5: 58e2a3b62103c1f4af7aec452caff175
패치 파일