마메 디버깅 기록 _ CPS2 던전앤드래곤2 (D&D SOM) - 치트,패치,롬 제작 / 디버거 / Mame Debugger


GB(게임보이) 디버깅 해보니 이것도 가능하게 되었음.

 근데 마메 디버거는 BGB(에뮬레이터 이름) 디버거 대비 상당히 불편. 만약 본인이 마메 개발자라면 디버거부터 업데이트 할것이다.


* 게임 및 프로그램을 고치는게 가능한 이유는, 디버거에서 HEX 코드를 어셈블리어로 바꿔서 보여주는데, HEX코드가 어셈블리어와 1:1 대응되므로 가능하다.

 어셈블리어를 추적해가며 어떻게 프로그래밍 되어있는지 구조 분석 작업이 필요하다.


* 안 점 

- 무료버전은 구글 제미나이보다 챗GPT가 더 영리하다. 정책상 챗GPT는 유료수준 기능을 어느정도 제공한다고. 대신 제한에 빨리 도달함.

 유료로 사용해보니 1년전쯤과는 달리 생산성 엄청 향상됨.

- 마메 디버거는 생각보다 좋지 않음. 그래서 녹화 하면서 해야 함.


- 해독이 된 롬(피닉스에디션:자살배터리 제거+암호화 삭제)만 디버거의 cpu영역 코드를 실시간 수정할 수 있다.

 디버거 메모리뷰 에서 Region: maincpu 를 선택하면 된다.

 해독이 안된 롬은 Region: maincpu 를 선택했을때 암호화 코드만 보임.

 ㄴ그래도 암호화 풀린 코드를 볼 수는 있는데, opcode 영역을 선택하면 됨.

옛날 마메에선 해독이 안된 롬의 경우, 이 영역은 수정도 안되는데, 최신버전 MameUI에서는 수정이 가능한 것처럼 되어있지만 소용없음.



* 마메 디버거 불편점

 (게임보이 BGB 의 디버거는 최상위 수준이어서 비교되긴 함. 왜 아직까지 개선이 안될까?)

- 위쪽 명령을 3줄밖에 안보여준다. (코드 오해석 방지를 위해 그런것같은데, 차라리 보여주면 훨씬 편할것이다)


- 인터페이스가 수동(명령줄) 방식. 예를들어 와치포인트 삭제하려면 정확히 디버거의 프롬프트 칸을 누른후 wpc 명령을 쳐야 한다. 범위삭제도 안되고 전체 or 1 개 삭제 밖에 안됨.

- 일시정지시 디버거도 완전 정지한다..


 관련링크

* 마메 디버거 사용법(영문) https://docs.mamedev.org/debugger/index.html

 Breakpoint 와 Watchpoint, cheat(값 변화를 찾아야 빠른 경우가 많음) 를 가장 많이 쓸듯.

* 시작할때 도움된 글 : https://kangssu.com/MAME-rom-hacking-reversing-%EB%A1%AC-%ED%95%B4%ED%82%B9-%EB%B0%8F-%EB%A6%AC%EB%B2%84%EC%8B%B1/#mame-%EA%B8%B0%EB%B0%98%EC%9D%98-%EA%B2%8C%EC%9E%84-%ED%95%B4%ED%82%B9

 (깃허브 문제로 댓글을 달수없어 이 글을 빌어 감사드립니다)

* Mame32more 용, 핵롬용 치트 4.6 (빠른인벤, 빠른마법,미사용 음성 삽입) 업데이트 글 (글 하단 TMI에 개발관련 글) : https://soulslip29.blogspot.com/2026/08/c-40-www.html

* 위 내용을 적용한, 아시아+핵롬용 실시간IPS 패치 글 (글 하단 TMI에 개발관련 글) : https://soulslip29.blogspot.com/2026/08/d-som-2-ips-1vs4.html


 디버깅 팁 기록

* 자주쓰는 단축키

 - F5 : 계속실행. 게임실행후 멈추는데 이거 한번 눌러야 진행된다.

 - BP : 해당 줄에 BP(Breakpoint)설정 인데, 비활성화된 BP 도 빨간색으로 똑같이 보인다..

 - F10(Step Over) : 다음 명령줄로 진행

 - F11(Step Into) : 진행하다가 함수를 만나면 들어간다

 - Ctrl + F11(Step Out) : 현재 함수를 나간다


* 자주쓰는 단축명령어/명령어

- bp xxxx : 브레이크포인트 걸기. 해당 주소가 실행될 때 멈춤.

- bpc : Breakpoint Clear (전부삭제 인데, 뒤에 번호 붙이면 하나씩 삭제. 그룹삭제는 안됨)

- wpc : Watchpoint Clear

- wp : 와치포인트 설정 

 ㄴex)  wp xxxxxx, 2, w : 2바이트짜리 쓸때 멈춰라는 의미인데, ◆1바이트짜리 쓸땐 안잡힘...

- cheatinit (또는 ci) : 메모리에서 수치 찾기 시작

 ㄴex) cheatinit uw : 부호가 없는 워드(2바이트) 단위 찾기를 시작함

- cheatnext (또는 cn) : 이전 찾은 값들에서 변화한 주소들을 찾음.

 ㄴex) cn +, 2 : 값이 +2 된 주소들을 찾는다

 ㄴex2) cn eq, 0  : 0이 된 값을 찾는다. (★16진수 이다)

- cheatlist (또는 cl) : 지금까지 찾은 주소들 보여줌

- dasm : 어셈블리 코드를 파일로 저장

 ㄴex) dasm x:\asm.txt, xxxxxx, 1000, 1 : 주소로부터 1000글자를 저장하되 HEX 코드도 저장 (맨끝 숫자 옵션을 안주면 HEX 저장 안함)

- comadd xxxxx, <쓸 코멘트> : 코멘트 달기. 코멘트에 문자 「,」 를 쓰고싶으면 따옴표로 묶어야 함. 아니면 따옴표 없이 써도 됨.

 작성한 코멘트는 하위폴더 \comments\롬파일명\ 에 xml파일로 저장된다.

- comdel xxxxx : 코멘트 삭제


* PC 수치 계산 : 「현재 줄 + (무조건)2」 가 PC값임. (디버거에서 보이는 수치 그대로임)

 함수 점프할때 상대주소로 점프하게 되어있는 부분이 많다.

 보통 와치포인트(wp)를 걸면 한줄 넘어가서 잡히는데, 왼쪽 시작주소 +2 를 하면 됨. 

 (PC주소를 갖고 점프할 함수 계산하는 코드에서 필요할 수도 있는데 AI한테 의뢰하면 HEX 코드작성도 해준다.)


* ★(위에 썼으나 또씀) 일시정지시 디버거도 완전 정지한다

 처음에 BreakPoint 창이고 뭐고 안먹혀서 헤멨는데, 알고보니 마메를 일시정지 해놓으면 디버거도 완전 먹통이 되는거였다.

 ◆Memory View 에 수치가 반영이 안된상태에서 정지될 수 있다...(메모리 볼때 주의)


* ★ BP, WP 창에서 'O' 표시가 꺼진 것이고, 'X'표시가 켜진 것이다...

 진입 장벽이었음...하루 저녁동안 헤멤
O로 했는데 작동이 안되니 헤메게 된다. 제미나이한테 물어보니 실제 고치는 수치가 아니라는 둥 엉뚱한 대답만...


 마메 차이 (디버깅 툴)

● HBMame (핵롬 디버깅 용, 거의 핵롬만 구동가능한 마메임) : 좋음

 - 실행법 : 배치파일 만들어 실행 「hbmameui -debug ddsoms08」

* 장점 : Rom (정확히 말하면, 해독된 opcode 영역인 듯) 정보가 강제세이브에 저장되지 않아서 편하다.

 = 게임켠후 ROM 치트 한번만 쓰면 강제로드를 해도 유지된다 = 치트를 ON 때만 한번 작동시키면 OK.  끌때 값 복구하면 됨.

 껐다켜면 강제로드를 해도, 치트적용 안된 상태가 되므로 테스트 하기도 좋음.


* 불편점 : 마메ui와 치트파일 형식은 같은데(xml 형식들을 7z로 압축), 인식하는 명령어가 다르다.

ㄴ MameUI에서 가능한, 치트파일 xml 내용에서 변수선언 불가 : temp0= ?? 이렇게 된걸 못쓴다. 하지만 안쓰는 게 더 낫다.

ㄴ 명령어 차이 : MameUI용 치트에 있는 'maincpu.ow' 이걸 못씀.  => mw 처럼 바꿔야.   mb(1바이트), mw(2바이트), md(4바이트 ROM = 해독된 Opcode영역 쓰기인 듯) / 램영역을 수정하려면 maincpu.pw 로 써야 적용됨.

 - 연사지원X 


● Mame32ui (아시아판 디버깅 용)

 - 실행법 : 마찬가지로 배치파일 만들어 실행 「mameui -debug -cheat ddsoma」

 *★ MameUI는 버그로 자체 치트가 안된다. 수동으로 'mameui -debug -cheat ddsoma' 이렇게 실행해야 치트를 쓸 수 있다.


* Mame32more 처럼, 그때의 ROM (정확히 말하면, 해독된 opcode 영역인 듯) 정보가 강제세이브에 저장됨.

 그래서 치트 만들때도 'ON' 상태일 때 항상 실행되는 형식으로 바꿔야 좋음..

* Mame32more 대비 발전된점 : 암호화된 롬도 치트로 ROM 영역을 수정할 수 있게 바뀌었음 (해독된 영역을 바꿀 수 있도록 업데이트된 듯)

 ㄴtemp=0 처럼 변수선언 가능하지만 안쓰는 게 나음. 치트 Off 시 복구값 저장용이지만, 어차피 강제로드하면 꼬이므로, off시 복구할 값을 확실히 지정해 주는게 좋다.

 ㄴ명령어 세분화 : HBMame에서는 Rom영역 수정에 maincpu.m~ 한가지로 쓰면 됐으나, 여기서는 .mw 와 .ow 로 분류되었다. 제대로 분류 안하면 안먹힌다.

 디버거에서 'Region : maincpu' 로 봤을때 암호화되어 제대로 안보이는 영역을 고칠때 .o~를 쓰는 듯.

* 단점 : 치트 켠후 강제세이브 하면, 강제로드시 그게 반영된 상태라서 꼬일 수 있음. 끄는 치트도 필요함.

 치트 수정할때마다 기존 강제세이브는 못쓰고 버려야 : opcode 영역까지 저장되어있어 꼬인다.

 - 연사지원X 



■■■ D&D SOM 게임 해킹 관련 기록

- 게임명 : Dungeons & Dragons - Shadow Over Mystara / 던전앤드래곤2 / 던드SOM

 쓰인 숫자는 전부 16진수 일겁니다.


■■ 롬 해독 및 암호화 및 분리(Split)

 : node.js 를 쓰는 cps2-utils 를 이용

 던드 IPS자료글 https://soulslip29.blogspot.com/2026/08/d-som-2-ips-1vs4.html 의 하단 TMI 참조


■ (위 해독~정보로부터) 기본지식

 프로그램 영역은 4MB 이다. 이 영역을 롬에서 수정할 수 있다.

 디버거에서 표시되기로 3FFFFF 영역 까지다. 

 HBMame에서 해독된 핵롬은 실시간 수정하면 반영된다. 위에서 썼듯 'Region: maincpu' 로 선택해야 수정됨.


 중요주소들

* 메모리에서 캐릭터 객체 시작주소 : (1P) FF85DE / (2P) FF87DE ~

 '캐릭루트' 라 칭함

앞바이트 값이 1이면 객체가 활성화 상태이며 매 프레임 체크된다.


* FF97BE - 공격판정이 없는 객체들 생성 시작주소. 효과 애니매이션 등의 객체.

 ㄴ 두번째 객체는 FF97FE / 세번째 FF985E 식이다. (6줄씩 차지)

 아이템창 호출시  부터 객체정보가 생성됨. 화면에 표시할 객체들인데 공격판정이 없는 객체들

* FF90DE - 공격판정을 가질 수 있는 객체들 생성 시작주소

ㄴ두번째 객체는 FF913E 식. 마찬가지로 6줄씩 차지

* FFE2DE : 아이템 객체 생성 주소 시작


* 캐릭루트+5 : 큰상태 번호 같은데 여러 동작이 공유해서 헷갈리게 만듦. 예를들어 기술쓸땐 공통적으로 AC 였나 로 셋팅됨.

* 캐릭루트+6 : 작은상태 진행 번호. 어떤동작 시작시 2 셋팅 -> 진행될수록 +2가 된다.


* (핵롬만) FF5000 : C모드면 1이 됨

* (핵롬만) FF5100 : 레드C모드면 1이 됨 (플레이어 2인 이하이면 0)


■■ 3인 이상시 다크워리어 전기기둥/불기둥 공격시 멈추는 버그

 이 버그는 코딩의 문제였음.

 기둥공격은 1개 생성과, 3개 연속생성 동작이 있다. 

 1개 생성 동작때만 버그가 발생한다..

▲ 아시아버전 코드. 핵롬은 FF4100(핵롬이 쓰는 플레이어수) 값을 셋팅하게 바뀌어있음

- move.b~ 뜻 : A5+35 주소의 1바이트 값(플레이어수)을 A0+AC(기둥 생성할 수) 값에 써라

 그다음 줄에서 -1을 하고 있다. 즉 플레이어수-1 만큼 갯수가 셋팅되며, 최소 루프는 1회 실행되므로 기둥은 최소 1개는 생성됨.

- (참고) A0 (주소 저장하는 레지스터) 에는 현재 조정할 객체 시작주소가 들어간다. 프로그램이 다워1 조작시, A0=FFBA1E 인데 그린드래곤도 여기인듯 한걸로 보아 보스 주소인 듯.

 * 기둥생성 로직 : 기둥은 무조건 1개는 생성되는데, 처음에 플레이어수-1 로 생성할 갯수를 설정 -> 실시간으로 랜덤을 돌려 당첨된 플레이어의 슬롯이 열려있나 검사. 안열려있으면 넘어가고, 열려있으면 기둥 생성후 생성했다고 플래그 표시 -> 플레이어 수가 생성할 기둥 수보다 작으면 무한루프 걸림.

 ㄴ최적화상의 문제점 : 주사위가 같은 플레이어에게 걸리면 그만큼 CPU클럭 소비됨... 다른데서는 최적화(사운드 출력시 공통함수로 빼지않고, 함수호출시간을 줄이기 위해 긴 코드를 그대로 박음) 코드가 보이는데 다워 불기둥 에서는 반대로 쓸데없이 시간 소비되게 되어있음.


- 코드 수정내용 : 주소 200000~ 부터 함수 추가함. 호출부분도 수정.

 이미 타겟된 플레이어에게 중복생성이 안되므로 3인 이상 모드이면, 1P밖에 없는데 1P는 이미 타겟팅됨 -> 「남은 기둥을 생성할 플레이어 탐색」 에서 무한루프에 걸리는 것이다. 그래서  바깥에서 생성할 기둥 수를 열린 플레이어 슬롯 이하로 셋팅하게끔 코드 수정함.

 (원작과 동일하게 같은 플레이어에게 중복 생성 안됨)


■■ 인벤토리 회전시간 빠르게

* 찾은 방법 : 치트찾기로 시간 감소를 이용해 찾음.  코드를 눈알빠지게 보는 걸로는 못찾음. 

=> 인벤토리 호출 또는 회전 후 일정시간동안 C버튼 먹통이 되므로,

cheatinit  => cheatnext -,1 (1이 감소된 주소를 찾음) 이걸로 찾음.


- FF97DA (표시할 객체가 등록되는 주소 부근임. FF979E + 3C) : (화면에 표시할 다른 객체가 없을 경우) 이곳이 아이템칸 정지 타이머이다. C버튼 누르자마자(아이템창이 튀어나오거나 회전되거나 들어갈때 셋팅된다.)

 그런데 이것만으로는, B버튼으로 마법 계열(서클) 변경시, 먼저 있던 창이 사라지지 않고 오래 유지되어 버린다. 이거 찾는데 고생했으나

 * 찾은 방법 : 눈으로 메모리뷰 창 보고 찾음...

 B를 눌렀을 때 부근 주소 FF9858 이 셋팅되는걸 발견하였다. 여기가 먼저있던 인벤창이 사라지는 딜레이 주소였음.


=> 위 값들이 셋팅될 때 어디서 읽어오는지를 본다.

 마메 디버거에서 「wp FF97DA, 1, w」 를 치면 와치포인트가 셋팅됨. '1바이트 크기에 값을 쓸때 멈춰라' 는 의미다.

 ㄴ「wp, FF97DA, 1, w, wpdata == 1」 이건 쓴 값이 1일때 멈춰라 는 의미다.


■■ 마법 시전시간 축소

캐릭루트 주변을 보다가, 1P의경우,

- FF860E (캐릭루트+30) 가 현재 스프라이트의 프레임임을 알게 됨. 값 감소 방식임.

 기본적으로 이걸 줄인다.

- FF85FE (+20) 은 다음 프레임 정보가 기록된 주소임.

 상태가 바뀔때 여기서 -0x18 해야 첫 스프라이트.

 ex) 마법사용 : 동작이 바뀌면서 FF85FE 에 새 주소가 셋팅되는게 보일텐데, 이건 2번째 스프라이트 주소이다. 거기서 -18 을 해야 첫 스프라이트 주소다.


▲ 상태(?) 이전 부분
애니매이션 시간이 다 되면, 다음 애니(첫스프라이트 등) 정보를 복사한다


▲ 캐릭터 스프라이트 테이블. 첫 데이터가 스프라이트 시간 이다. +0x18 마다 다음 스프라이트 정보가 있다. (=12 워드씩)
이에비해 객체 스프라이트는 한줄(8워드) 씩임.

■ 매 프레임 호출되는,  캐릭터마다의 상태별 함수가 어딘지 어떻게 찾을까?

- 마법사용시만 셋팅되는 특수 타이머 FF8746(루트+168) 를 어디서 감소시키는지 체크한다.

 ㄴ마메 디버거에서 wp ff8746, 2, w

  (2바이트짜리 쓸때 멈춘다는 의미. 숫자 1씩 감소하므로 매 프레임 멈춘다)


 *법사 파이어볼을 예로 들면 046964라는 주소에서 쓰기 명령(초기값 셋팅)이 수행된다.

 move.w(워드 쓰기) 명령을 HEX코드로 표현하면 2~3워드(바이트)인데, 가운데 2바이트에 쓸 숫자가 박혀 있으므로, +2 를 한 주소인 046966 이 숫자가 들어있는 주소이고 치트파일에 2바이트짜리를 쓰게 하면 수정된다.


■ 공격마법시 생성되는 객체(ex:월오브파이어) 는, 일반 객체주소에 생성되지 않음.

 * 찾은 방법 : 평상시 0 검색 (cheatinit) => 마법 사용직후(ex: 월오브파이어) 불 생성되면 1 검색 (cheatnext +,1). 

 활성화 플래그가 1이기 때문에 이걸 찾는 것이다. 결과 30개쯤 나오는 영역 다 테스트해봄.

 (눈알빠지게 코드를 보는 걸로는 못찾음)

 - 주소 FF90DE (플레이어들 정보 주소의 뒤쪽)

 - 효과객체 및 플레이어 객체와 마찬가지로 애니매이션 정보를 가지고 있으므로 그 주소에서  스프라이트 시간을 줄이면 빠르게 된다.


* 미티어스웜 방식 

 위 주소에, 미리 12개 떨어질 운석객체를 생성해 놓고, 타이머를 감소시켜 0이면 떨어짐.


■ 마법을 받는 캐릭의 모션은 빨리 바뀌지 않는다.

* 찾은방법 : 상태변화로 찾음. (+6의 주소가 1E00 -> 1E04 로 바뀐다. 알고보니 8바이트 쓰기 였음)

- 마법 사용시 동작시간 : FF8746

- 마법 받을때 대기시간 : (1P) FF87C6 / (2P) FF89C6

 여기 데이터를 쓸 때, 어디서 쓰는지를 본다.


* LB(라이트닝볼트) 방향전환때, 키입력 씹는 시간도 여기에 셋팅됨 : FF87C6


■ 대머리직자 어스퀘이크 만 특이

* 다른 마법들과 달리, 마법 시전시간이 처음에 셋팅되지 않음. 그럼 종료시간을 어디서 판정할까?

- 볼이 땅에 떨어진 후에는 객체의 애니 시간으로 종료 판정하지만, 직자 애니를 빠르게 해도, 볼이 땅에 늦게 떨어진다.

- 알고보니 볼이 땅에 떨어지는 조건은 2가지로 셋팅되어 있었음 : 「시간 > 0x40」 + 「직자 동작이 진행되어야」 = 두군데의 수치를 같이 고쳐야 함


 - 객체의 시간 : 4aef8 부터 3워드(6바이트) 인데, 가운데꺼 기본값 041E. 앞바이트 04가 뭔지 모르겠으나 상태분기와 관련되므로 놔두는게 좋을듯.

 애니매이션에서 앞바이트 변화는 처음에 「00 -> 04 -> 00」 인데, 렙업되면 「00 -> 04 -> 08 -> 04 -> 00」 이런식으로 셋팅되게 됨.


■■ 사운드 출력부 찾기

 어려웠다. 그냥 출력하는게 아니라 스테레오 계산까지 해서 코드가 좀 긺.

 - 사운드 출력방식 : 큐에 밀어넣으면 출력된다.

* 사운드 큐 주소 : FF257d ~ FF294d (개당 한줄씩)

* 사운드 출력 최종함수(공통호출) : jsr $dfa6a.l (뒤에붙은 l은 그냥 붙는것인듯)

 이걸 호출하기 전, 상위 함수에서 음성값을 셋팅한다 => 1~2단계 상위의 함수를 찾아야 하였음.

  ㄴㄴ이거 호출하기 전에 앞에서 스테레오 계산을 막 함. 긴 코드를 왜 함수로 묶지 않고 매번 썼는고 하니, 함수호출 딜레이 줄이려고 그렇다고 AI가 답변.


 위의 정보만으로도 찾기 어렵다. 마메는 위쪽 코드를 3줄 밖에 안보여주므로.

* 찾은 방법 : (사운드 정보가 큐에 등록되기 직전 프레임에서) 최상위 상태를 타고 찾아 내려가야 찾을 수 있었음 / 또는 BP 를 3줄위(보이는 최대한 앞부분) 거는 행위를 반복해서 거꾸로 추적

  한다.


* 캐릭터가 정상 상태일 때 (조작가능 등). 메인루프 최상위 함수 : [035350] (핵롬,아시아 동일)

 여기서 내려가는걸 추적 (캐릭 상태에 따라 이동하는 함수가 달라지므로)

 ex) [035350] : 최상위 메인 분기  => (ex: 035358) => 035782 이런식으로 내려간다.


* 상태변경 플래그 주소를 체크한다.

 예를들어 캐릭루트+33 (1p : FF8611)이 상태변경 플래그 주소이다. 여기가 1로 셋팅되면 다음 상태로 넘어가면서 사운드를 등록한다던지, 객체를 생성한다던지 한다.

 여기를 1로 셋팅하는건 코드에 없고, 스프라이트 테이블에 있다. 스프라이트 읽어오면서 복사되는걸로 기억


 여러 동작이 같은 상태를 공유하기도 해서 난감하다.

 예를들어 성직자 전진기와 대공기는 똑같이 [03fd3c] 를 거침

 A+B 가 있는 캐릭들은  [048b5a] 를 거침. 사운드 셋팅하는 함수도 똑같음.


* 캐릭터가 쓰러졌을땐 메인루프 번호가 다름.


■ 아시아버전 코드 관련

- 국가체크를 해서 일본판이 아니면 무조건 영어음성을 출력하도록 되어있음. 핵롬은 이 국가체크 부분이 상당수 제거되어 있음.

- 넘어졌다 일어날때는 일본판은 2가지 상태로(음성이 각각 2가지) 이전. 나머지 버전은 영어음성 출력되는 상태르 이전됨.

- A5 = FF8000 으로 게임중 고정임
- tst.w ($70, A5) 뜻 : A5+70 주소의 워드단위(2바이트)의 값을 테스트해서 결과(양수 or 음수 or 0)가 상태 레지스터(SR) 에 저장됨.
- bne $e168 뜻 : 0 이 아니면 점프 (= 일본판이 아니면 점프). 
- e1c68 이 특정사운드 출력 함수이다. 이 함수 내부에서, 사운드 큐에 등록하는 1dafa


■■ 화면에 표시되는 글자 조정

 사운드처럼, 해당 메모리 영역에 쓰면 글자가 표시되는 방식이었다.

*  핵롬에서 나오는, 보스전에서 방해되는 www~ 글자 시작되는 주소 : 912858

* 뒷 워드(+2바이트) 에 쓰면 다음 줄에 글자가 나타난다.

* +80 주소에 쓰면 오른쪽에 글자가 나타난다.

* 글자 정보 앞바이트가 글자 종류, 뒷바이트는 색깔 인듯

 ㄴ글자 종류 : 0 ~ F : 그대로나옴 / 10, 20 : 빈칸 / 11~16 네모(색바뀜) 17:검은사각 / 21~ 특수문자들 / 30~ 숫자 / 3A~특수문자 / 41~5A 대문자 A~ / 5B~특문

  ㄴ61~ 소문자 a~ / 64: d / 66 : f / 68 : 소문자 h / 6B : k / 6E : n / 70: p / 75: u / 7A : z

  => 빈칸으로 하고싶으면 10 or 20 을 쓴다.

 ㄴ색깔 : 0 노랑  1초록  2파랑  3빨강  C회색  11노(그림자없)  12빨  13파  14노랑


■■ 플레이어 수 설정관련 약간의 오류

 핵롬이나 기존 www.dnd2.net 의 1vs4 패치는, 플레이중이 아닐때도 무조건 플레이어수를 4로 셋팅한다. 그래서 보스전에서 죽으면 보스가 승리포즈를 취하지 않는다 (핵롬도 마찬가지)


■ 1vs4 에서 보스가 승리포즈 취하게

 FF8035 가 플레이어수가 저장되는 변수다. 기존 1vs4나 핵롬은 이게 4로 고정이 되어서 보스가 승리포즈를 취하지 않았다.

 이걸 플레이어가 한명이라도 있으면(HP > 0) 4로 설정, 다죽으면 0으로 설정함으로써 승리포즈가 나오게 함.

 핵롬은 C모드의 경우 FF8035를 4로 셋팅해두고 따로 FF4100 에서 실제 플레이어수 설정하는데, 정작 보스 승리포즈는 FF8035 를 기준으로 나옴 / C모드 아니면 FF4100 값을 FF8035 에 셋팅함

▲ (핵롬) C모드 아닐때와, C모드일때 설정 부분


■■ 아시아버전의 차이점 + 부모롬(유로) 차이

 부모롬(EURO)은 뭔가 프로그램이 다르다(메인루프 함수 위치가 다름 등).

 이에비해 다행히 아시아버전은 핵롬과 거의같음(틀린곳도 있음).


■■ 레드C모드 녹용뿔(용이빨) 나올 확률


 => 랜덤값에서 0~15 의 값만 남김 -> 테이블의 값 16개중 1개 선택 -> FF 가 걸리면 꽝 = 16개중 4개가 FF 이다.
 * 용이빨 나올확률 : 75%
 (기판이 완전랜덤 생성 기능이 없어 계속 랜덤값을 조작하므로 완전 75%는 아니고 약간 오차 있을듯)

* 아래는 참고용. 아이템값 0226이 녹용뿔. 항상 첫번째 아이템으로 셋팅되는듯.





댓글 없음:

댓글 쓰기