게임보이 용 「마법기사 레이어스 2nd - 더 미싱 컬러」 의 개조, 디버깅 기록.
(하단에 조금 개조된 롬파일)
- 타이틀 명 : Mahou Kishi Rayearth 2nd - The Missing Colors
- 영문 타이틀 명 : Magic Knight Rayearth 2nd - The Missing Colors
난이도가 너무 쉬워서. 개조 시도함.
* 디버거 사용 에뮬레이터 - BGB
- 홈페이지 : https://bgb.bircd.org
- 장점 : 디버거가 좋은 듯
- 단점 : 메모리상에서 'Search' 불가능
- 메모 : Option 에서 키설정할때 밑에 'Configure Extra Buttions'에 체크하고 설정하면 터보키, 강제세이브or로드 등 키 설정 가능.
(에뮬 Sameboy 도 괜찮다는 평가가 있지만, 텍스트 형식 디버거라 불편함)
■ BGB 디버거 화면 메모
디버거 화면
- (디버거 메인창 _ 좌상) 롬파일 내용을 어셈블리어 코드로 변환한 내용이 나와있다.
명령 예) 「ld b, 04 : b에 04 값을 넣는다」
이런 명령들은 구글AI 등에 물어보면 친절히 알려준다.
(만약 한국이 공산화가 되어 구글이 철수한다면 불을 얻은 문명에서 불을 잃어버린 문명 수준이 될 지도 모른다는 생각이 듦)
- (디버거 메인창 _ 좌하) Memory View 인 듯 한데, 'Bank'가 바뀌면 알려줌.
예) 「WRA1:D230」 이라고 된 부분이, 롬뱅크 1이면 「Rom1:????」라고 나온다. 뱅크가 바뀌면 같은 주소라도 값이 다르다. (뱅크 스위칭)
- (디버거 메인창 _ 우상) 레지스터들과 값이 나와있음. af, bc(buffer counter), de(destination), hl(high low) 등의 레지스터 값.
오른쪽 z,n,h,c는 플래그 이다. af 레지스터의 f 레지스터의 값들이다.
a레지스터는 누산기로서 모든 연산은 a 를 거치는 듯.
bc레지스터는 반복문 카운터 등에 잘 쓰이는듯.
de는 대상 주소 지정에 잘 쓰이는 듯.
그런데 a, b 이렇게 8비트씩 연산이 되는 경우도 많아서 해석이 어렵다.
- (디버거 메인창 _ 우하) : 스택 표시 창
위에서부터 아래로 쌓이는 것이다. push 명령시 아래쪽으로 늘어나며, pop 명령시 줄어든다.
- (추가 창 _ 좌상) Debug -> Breakpoint 창.
hl 레지스터값이 '07A4' 가 되면 브레이크가 걸리는 조건을 지정한 상태.
문맥때문에 애먹었지만, 결론은 「hl=$07A4」 로 쓰면 됨.
- (추가 창 _ 중간 위) Watchpoint
메모리 뷰에서 우클릭 -> 'Set Watchpoint' 시 되는데, 이곳의 값이 변하면 브레이크 걸림.
- (추가 창 _ 우상) joy (패드 버튼 조작)
디버거 상태에서는 조작이 안되어 이 창을 이용해야 함. 클릭하면 버튼 눌러짐.
* 디버거 단축키 (자주 쓰는것만)
https://bgb.bircd.org/#documentation 에 나와있으나 주로 쓰이는 것들 메모
- F3 : Step Over - 한칸씩 넘어가는데, 함수 'call' 명령은 건너뛴다.
- Shift + F3 : 거꾸로 진행
- F7 : Step into - 한칸씩 넘어가며, 함수 'call' 명령시 안으로 진입.
- F8 : Step Out - 함수에서 빠져나온다.
- Ctrl + G : 주소로 이동 (아래 Memory View 창에서도 사용가능)
- Ctrl + S : 찾기 (아래 Memory View 창에서는 사용불가...)
* 개조 목적달성 후 결론 : 어셈블리어의 의미를 하나하나 해석하는건 어렵고 무의미하다.
(대충 함수 내용을 AI한테 물어보면 어떤 작업인지 추정해서 알려줌)
값이 어디에 있으며, 그 값이 변경될때 Watchpoint 또는 Breakpoint 건다음, Shift+F3 으로역추적 하는게 좋음.
몇개 안되는 레지스터로 온갖 연산을 수행하므로 헷갈림. 값이 어디로부터 오는지 추적해야.
■ 에딧1 - 램 에딧 과정 기록
* 적 데이터 _ 램 주소
window -> cheat searcher 를 이용해 적 HP 주소를 찾았고, 그 주변에 적 데이터가 있음을 알아내게 됨.
- C0B2 부터 첫번째 적의 이름이다.
- C0C3 (4바이트) : 현재HP, 최대HP
(그다음 2바이트는 뭔지 모르겠음. 코드를 보니 그냥 지나가기도 하는듯 한데?)
- C0D0 (5바이트) : 스킬 (공격, 기술, 방어=12) 등이 기록됨.
그다음 바이트는 상태이상 바이트.
그다음 바이트는 00 인 듯? 그다음에 2번째 적의 데이터가 들어옴.
=> 이름을 이용해서, 원래 롬파일에서 적 데이터가 있는 곳을 알아낼 수 있음.
- 두번째 던전 허약한 보스 '이로도로보우' 의 데이터는 롬파일에서 C8D8 부터 있다.
(램에 들어갈땐 그대로 들어가는게 아니라 중간중간 다른 데이터도 들어가므로 비교해야)
- 첫번째 던전 약한 보스 '라텍크'의 데이터는 C8A0 부터 있다.
(램에 들어가는 데이터 : 7D F6 28 00 2F 00 / 00 FA 00 BC 02 BC 02 0D 0D 96 0A 0A 1E 62 00 00 / CF 13 13 13 13 00 00)
* 적이 몇체 남아있는가 플래그 주소 : D29F 의 위쪽 4비트
- 첫번째 적이 존재하면 비트는 0001 이 된다.
- 첫번째+ 두번째 적이 존재하면 비트는 0011 = 0x3(16진수) 이 된다. 즉 바이트는 0x37 이 되었음.
- 적이 4마리 모두 살아있으면 0xF7 이다.
스샷은 0xE7로 바꾼 모습(비트 1110) = 오른쪽 세마리만 남은 걸로 인식됨.
▶ 두번째 던전의 허약한 보스전에서 적 추가1 - 램 수정 방식
(추가된 적 모습이 안보여 불완전. 완전버전은 아래에)
대화할땐 2명과 싸우는 것처럼 나오지만, 정작 1체 밖에 안나와서 지나치게 쉽다.
- (우측 스샷) 적 플래그 0x37 셋팅과 함께 두번째 적의 데이터를 램에 추가하자, LCD에는 안보이지만 2번째 적이 추가되었다. (LCD에는 미리 그리지 않으면 안보임)
추가로 행동패턴은 CF 13 0B 13 12 인데, '12'는 쓸데없는 '방어' 이고, '0B'는 한명 마법공격, 'CF' 와 '13'은 일반공격 인 듯? 12 -> 0B 로 바꾸면 방어 대신 마법공격이 오게 됨.
(행동패턴 + 확률 조합이 아닐까 해봤지만 아니었음)
▶ 최종보스의 멍청한 AI 강화
행동패턴 CF 13 13 0F 12 라서 일반공격, 방어 가 자주 나오는 멍청한 AI 인데, 전부 0F로 바꿨더니 전체공격만 나오게 됨. 이렇게 해도 크게 어려운건 아님.
- 「CF 0F 0F 0F 0F」 : 전체공격만 나오게 되는 듯.
- 「CF 13 0F 0F 0F」(최종 선택) : 전체공격 확률이 오르고 일반공격도 나옴.
* 롬에서 찾아 고치려면, 주소 C8F4 부터 데이터. 행동패턴은 C90B 부터 5바이트.
■ 에딧2 - 롬 개조 과정 기록
* (참고) 적 데이터 읽는 순서
- 2번째 던전 _ 고스트 : 롬의 C7A4 부터 데이터가 있음. (디버거 램에서는 hl=47A4 가 되어 읽힘. 램에서는 뱅크가 바뀌어서 47A4 인거고 원본롬 상에서는 C7A4 로 앞자리가 'C'였음.)
ㄴ 그전에 hl=45C4 가 된다. => 원본롬의 C5C4 주소에는 'A4 07 (고스트의 데이터가 있는 주소값)' 이 적혀있다. => hl = 07A4 => hl = 47A4 가 되어 원본롬의 C7A4 의 고스트 데이터가 읽힌다.
ㄴ 원본롬의 C5C4 주소의 값을 'A407' -> 'D808' 로 바꾸면 고스트 대신 이로도로보우 가 나오게 됨.
* 추가 메모
(2번째 던전 적)
- '미이라' 데이터 : 롬파일 C788 부터.
ㄴ이 주소 '88 07' 이 기록된 곳 : 롬파일의 C5C2 (여기 1곳만 맞고 뒤쪽은 아님)
ㄴ바로 앞 C5C0 에는 스켈톤의 주소값 '6C 07' 이 있음.
ㄴ바로 뒤 C5C4 는 '고스트'의 주소값 'A4 07' 이 있음.
ㄴ그 뒤 C5C6 에는 '가고일'의 주소값 'C0 07' 이 있음.
- '스켈톤' 데이터 : 롬파일 C76C 부터.
- '가-고일' 데이터 : 롬파일 C7C0 부터.
▶ 전투시 적 등장 패턴 수정
- (왼쪽 스샷) 전투 시작 후 D2F5 의 4바이트가 적 패턴이 임시로 로드되는 곳임을 우연히 발견하였다. (watchpoint를 걸면 됨. 임시 주소인지, 전투시작시 값이 3번쯤 바뀐다)
ㄴ(값 변화 과정 예시 : 가고일 시) 저 0x10값이 a에 읽힌다 => -1이 되어 0F 가 됨 => x2 연산으로 1E 가 됨 => 베이스 주소 05A8 + 1E = 05C6 이 됨 => +4000이 되어 45C6 이 됨. (램에서는 45C6 이고, 원본롬에서는 C5C6 주소가 가고일 데이터의 주소를 가리키는 값임)
- (오른 스샷) 저 값을 읽어오는 곳을 보니 49BC 부터였고, 보니 적 패턴이 저장된 걸 알게됨. (4바이트씩)
=> 원본롬 C9BC 부터 고치면 던전2의 적 패턴 수정 가능.
램주소 49BC => 원본롬 C9BC 부터 그대로 있다. (2번째 던전의) 적패턴 수정 가능.
* 추가메모 - 적 패턴에서 값
- 라텍크1(HP 300) : 1A
- 라텍크2(HP 700, 방어행동 안함) : 1B
- 이로도로보1(변신 전) : 1C
- 이로도로보2(변신 후) : 1D
- (숨겨진??) 1E : HP 1000짜리 방어력 강한 갑각류
▲ '1E'로 해보니 이녀석이 등장. 게임내에서도 같은 모습을 한 적은 등장하는데, 스펙이 같은지는 모르겠다. 방어력이 매우 강함.
적 AI가 멍청하다. 라텍크2는 방어행동을 안하도록 되어있지만, 이로도로보1,2는 하게 되어있음.
▶ 두번째 던전 보스에서, 적 추가 - 롬 수정 (완전)
위의 과정을 거쳐 찾으니, 원본롬 CA10 부근이었다.
▲ 1C = 이로도로보1 만 나오게 돼있는걸, 1C 1B 로 수정하여 라텍크도 같이 나오게 됨.
의문의 '1E' 패턴은 위에 스샷이 있듯 방어력 강한 갑각류임.
▶ 개조된 롬파일
* 파일명 : [GB개조롬]Mahou Kishi Rayearth 2nd - The Missing Colors (J) [S]ed1.7z
(압축파일 안에 아래 스샷들 첨부)
* 개조한 사항들
1. 두번째 던전 보스 이로도로보1 이 방어행동 대신 마법공격을 하도록 살짝 변경
2. 위에 있듯, 두번째 던전 보스전에서 라텍크2 도 같이 나오게 변경
3. 세번째 던전 보스 '이로도로보2' 의 마법공격 확률 증가 + 가드 안함
다른건 안고쳤으므로 아주 살짝 난이도 증가 정도 될듯. 그래도 쉽다.