Majesty Agora City Demo



아직 마제스티 시스템의 전체적 해독이 완전히 끝난 것은 아니지만, 여태까지 수집해온 데이터들을 테스트하고, 보안할 점을 찾기 위해 아고라시 데모를 만들어봤습니다. 마제스티 서비스 종료후 많은 시간이 흘렀습니다만, 이 프로그램으로 일단 아쉬운 마음이라도 조금 달랠 수 있었으면 하는 바람입니다. 컴퓨터에 DirectX 9.0C 버젼 이상이 설치되어있어야 동작합니다.

[권장 운영체제 ]
윈도우즈XP, Vista, 7

[이용 방법 ]
1)압축을 풉니다
2)AgoraDemo.exe를 실행합니다.

[조작법 ]
맵 클릭 - 플레이어 이동

몬스터 클릭 - 공격

키보드 "M"키 - 음악  ON/OFF

키보드 "S"키 - 효과음 ON/OFF

ESC키 - 종료

[다운로드 링크 ]

http://myhome.qook.co.kr/~imsangha/AgoraCityDemo.zip
http://home.megapass.co.kr/~imsangha/AgoraCityDemo.zip


"응용 프로그램 구성이 올바르지 않기 대문에 이 응용 프로그램을 시작하지 못했습니다. 이 문제를 해결하려면 응용프로그램을 다시 설치하십시오." 메시지가 뜨시는 분들은 아래 Visual C++ 2005 Runtime Redistributable을 설치해보시기바랍니다.

http://myhome.qook.co.kr/~imsangha/vcredist_x86.exe

by Mesmerized | 2010/06/16 12:26 | 트랙백 | 덧글(9)

Developing Majesty Map Viewer

 이 글에서는 어떻게 마제스티 맵 뷰어를 만들었는지 간략하게 설명하겠습니다.

 일단 마제스티 패킹을 다 풀어헤쳐야합니다. 데이터가 없이는 맵을 구현할 수 없으니까요.

 패킹을 풀었으면, MapTile.dat 폴더에 들어가봅니다.

 대충 어떤 파일들이 있는지 눈으로 익혔으면 다음과 같은 결론을 내릴 수 있습니다.

1) 맵번호.bmp - 맵 타일 그래픽을 담고 있는 비트맵 파일
2) 맵번호.cod - 맵 타일 배열에 관한 코드를 담고있는 파일
3) 맵번호.att - 각 맵 Array Element의 속성을 담고 있는 파일


맵 구현에 대해 어떻게 익혔는지 궁금하시다면.... 그것도 간단합니다. -_- 또 HexEdit으로 열어서 눈으로 해독했습니다. 하지만 약간의 한계점이 있지요. 많은 코드의 정확한 의미를 해독하지 못하는 단점이 있습니다. 이 부분은 개발할 때, 이리 저리 부딫히면서 해독하는 수 밖에 없겠죠.

COD파일을 HexEdit으로 열어보면 다음과 같은 형식임을 알 수 있습니다.

[ Unknown Header] [ Map Width ] [ Map Height ] [ Unknown Header ] [ Object File Index] [ Unknown Header ]
         4 byte              4 byte             4 byte                 4 byte                     4 byte                     80 byte

Unknown Headers는 뭐에 쓰이는 지 저도 잘 모르겠습니다. 거의 모든 맵에서 0으로 표기되기 때문에, 저의 경우에는 그냥 무시했습니다(아직 까지 이 부분이 0이 아닌 다른 값으로 설정된 맵은 보지 못했습니다.) 이 헤더 다음에는 데이터가 따라옵니다. 즉, Map Width * Map Height * 4 byte 만큼이 따라 붙습니다.

그러면 ATT 파일도 몇 바이트인지는 자동으로 알게되겠지요? Map Widht + Map Height * 4 byte 입니다. ATT 파일에는 아무런 헤더가 없습니다. 각 Map Array Element와 4 바이트 값의 1:1 대응입니다.

COD와 BMP파일을 이용해서 오브젝트를 제외한 맵 윤곽을 표시할 수 있게 된다면, ATT 파일을 이용해서 오브젝트를 맵 위에 출력할 수 있습니다. 여기까지 완성하시게 되면, 그 때 어떻게 오브젝트 파일을 출력하는지에 대한 글 남기겠습니다.

by Mesmerized | 2007/12/31 17:51 | 트랙백 | 덧글(6)

Disassembling Majesty

문영호님의 요청에 따라, 어떻게 마제스티를 풀어헤쳤는지 비교적 간단하게 설명해보겠습니다.

일단 마제스티로부터 데이터 추출하기는 크게 3가지로 나누겠습니다.

1) Resource Extraction
2) Raw-Binary Data Extraction
3) Unpacking




1. Resource Extraction


 프로그램 리소스를 추출하는 과정입니다. 패킹을 다 풀어 제친 후, 아무리 살펴봐도 많은 그림 파일들이 패킹 안에 존재하지 않는다는 사실을 깨달았습니다.

 저는 나머지 그림들이 EXE 파일 안에 존재할 것이라고 추측을 하고 Resource Hacker 프로그램으로 마제스티 실행 파일을 열어봤지만, 뭔가 이상한 스크립트들만 보이고, 그림 파일들은 존재하지 않았습니다. "마제스티가 자체 스크립트를 이용할 만큼 정교하게 제작된 프로그램이었나?" 하고 감탄하고 있었지만...

 잠시후 마제스티는 볼랜드 델파이로 만들어진 프로그램이었다는 것을 발견하고 기절하는 줄 알았습니다. -_- 도대체 누가 상업용 온라인 게임을 델파이로 만든단 말입니까? 마제스티가 허구한날 해킹 당한 것도 이해가 갑니다.

 마제스티 안에 있는 리소스 파일들을 추출하기 위해서는 Resource Tuner라는 유틸리티를 사용하면 간단합니다. EXE파일을 Resource Tuner로 불러들이고, 각종 Form에 있는 그림들을 일일히 BMP로 저장하기만 하면 됩니다.




2. Raw-Binary Data Extraction


 뭐 이 것도 간단합니다. 말그대로 패킹되지 않은 이 진수로 저장된 데이터 파일을 풀어헤치는 것입니다. 이 과정을 수행하기 위해서는 기초적인 어셈블리어 및 파일 저장 시스템에 관한 이해가 필요합니다(Little Endian을 이해하는 것은 필수!) 

 마제스티에서 이 것에 해당하는 데이터로는, KString.dat, Magic_c.dat, Mob.dat(이진수가 아니라 ASCII이지만...), item_c.dat을 꼽을 수 있겠습니다.

 말 그대로, HexEdit으로 불러와서 일일히 각 데이터를 분류하는 수 밖에 없습니다. 데이터 베이스에 저장하거나, 아니면 자신이 알아보기 좋게 문서로 저장하면 됩니다.

 예를들어, 각종 아이템 코드는 다음과 같이 이진수로 기록되어있습니다.

NNNN      NNNN      NNNN      NNNN
NNNN      NNNN      NNNN      NNNN
NNNN      NNNN      NNNN      NNNN
TYPE       TYPE2      PRICE      LEVEL
HP+         MANA+     DAMAGE  DEFENSE

 N 필드는 아이템 이름입니다. 그리고 이 헤더 뒤에 오는 1024바이트는 아이템에 관한 설명입니다.

 따라서, 패킹이 안된 데이터는 HexEdit을 이용해서 분석하는 수 밖에 없습니다.




3. Unpacking


 제가 어셈블리어를 독학으로 공부하고, 학교에서 수강까지 했더라 하더라도, 마제스티 같이 복잡한 프로그램을 리버싱하는데는 무리가 있습니다. 간단한 프로그램 몇 개 정도는 크랙은 해봤지만요. 물론, IDA Pro를 이용해서 마제스티를 Disassemble 해봤지만, 워낙 복잡해서 중간에 그만 둬야했습니다(아... 2.1버젼에서 "모니터 색상이 16비트 트루 컬러로 설정되어야합니다." 라는 메시지를 우회하게 리버싱하는데는 성공했습니다. 얼마 안있어서 연산오류 나면서 프로그램이 깨지더군요.) 아무리 숙련된 리버스 엔지니어라 하더라도, 마제스티 패킹 형식을 리버싱으로 습득하는데는 상당한 시간이 걸릴 것 입니다. 동작하는 프로그램이라면, FileMon 의 협조를 받아, 어디서 어디까지 읽혀지는지 눈으로 확인할 수 있지만, 서비스가 종료된 상태에서 그 것도 불가능한 상황이지요.

 그렇다면 어떻게 마제스티 패킹 형식을 해독했는가? -_- 별 거 없습니다. 그냥 HexEdit으로 열어 제껴서 맨 눈으로 해독했습니다. (초등학교 4학년 때인가... IQ 검사 때, 다른 것은 다 보통이었는데 추리력만 150이 넘게 나왔다는...) 한 30분 조금 넘게 걸렸던 것 같네요. 마제스티 패킹에는 그 어떤 압축 알고리즘도 구현되어 있지 않아 굉장히 간단했습니다.

 마제스티 패킹은 다음과 같이 구현되었습니다.

 [Number of Files]    [File Offset 1]    [File Name 1]   [File Offset 2]   [File Name 2]   ...N 번 만큼 반복 ... [ File Data ]
         4 byte                 4 byte             24 byte           4 byte           24 byte

 Fseek 함수나 WINAPI의 SetFilePointer 함수만 잘 이용하면 간단하게 마제스티 Unpacking 프로그램을 만들 수 있습니다. 제가 C를 이용해서 만든 프로그램의 경우에는 소스 코드가 266줄 밖에 안되는군요. 주석 처리도 하나도 안했을 뿐더러, 파일 해독에 집중한 나머지 개판으로 작성한지라, 도저히 부끄러워 소스코드 공개는 못하겠습니다. -_-;;;

 다음 글에는 어떻게 마제스티 맵을 구현했는지 설명하도록 하겠습니다.

by Mesmerized | 2007/12/31 17:30 | Game Development | 트랙백 | 덧글(4)

Player Sprite 관련 함수들 개발 진행

어제 밤 5시 30분부터 메인캐릭터 스프라이트들 다 다시 패킹하고, 그 데이터를 읽어서 렌더링 하는 걸 구현하는데 약 8시간 정도 걸린 것 같습니다. 항상 그렇 듯이, 실제로 코드 작성하는데 쓴 시간보다 디버깅 하는데 들어간 시간이 더 많았죠. ColorKey가 제대로 적용이 안되는게 문제였는데, 비트맵 픽셀 계산을 잘못했더군요. 게다가 256칼라 비트맵에는 Padding이 들어간다는 것을 깜빡하고 있었습니다.

여하튼 그렇게해서 플레이어 그 자체를 맵에 표시하는 함수들을 완성했습니다. 좀 더 나아가서, 휘장, 아이디, 대화, 마법 및 스킬 효과 등을 캐릭터 주변에 그려낼 수 있도록 개선하는 일이 남았습니다. 그 다음은 아이템, 몬스터 등 나머지 그래픽들을 처리해야겠죠.

열심히 노력해서 만든 것들이 제대로 동작할 때 정말 뿌듯합니다. =] 계속 열심히 노력해서 더 많은 진전을 가지도록 해야겠습니다.


제군들, 아고라시에 돌아온 것을 환영하네. =P

일단 함수 테스트는, 10개의 플레이어 캐릭터를 가지고 했습니다. 보시다싶이, 각각 캐릭터들이 맵 위에 렌더링됩니다.


수르수르 동굴. 여기 한창 플레이할 때, 마제가 문 닫았죠.

각각의 캐릭터는 여러가지 모션을 취할 수 있고, 화면에 에니메이션 처리되어 나타납니다. (아직 알파블렌딩 처리를 안해서 위 스샷에서 조명이 그냥 시꺼멓게 드러납니다. -_-.. 이 부분은 나중에 작업하겠습니다.)


다크스왐프였던 것으로 기억합니다. 비연검으로 제 친구 여기서 렙업시켜주던 기억이 나네요.

캐릭터 중심 좌표 시스템도 구현해야합니다. 해야 할 것이 많군요. =/


초보연습장에서 한 컷!

레드윈드 숲에서 달밤의 체조 중인 마제 캐릭터들

by Mesmerized | 2007/11/26 06:32 | Game Development | 트랙백 | 덧글(1)

Direct3D9를 이용한 Graphic Class 개발 시작

개발 일지를 남기면서 프로젝트를 진행하는게 도움이 될 것 같아서, 2007년 11월 24일 블로그를 개설했습니다. =)

원래 이번 프로젝트의 계획은, 순수한 Direct3D9의 Quad를 이용해서 맵을 렌더링 하고, 그 위에 또 Quad로 만들어진 오브젝트를 올려놓는 식으로 제작하는 방식이었습니다. 하지만 속도가 만족스럽지 않고, UV맵핑을 이용했을 시, 픽셀과 1:1 대응이 상당히 힘들다는 것을 알게되었습니다 (솔직히 말하자면, DXSDK 문서 다 읽고도 이해를 못했지요. Shader가 아닌 Pipeline에서 이걸 어떻게 구현하나 하구요...)

추수감사절이라 목요일부터 학교도 쉬겠다.. 시간이 많아서, 수요일에 C++를 이용한 DxSDK Beginner's 튜토리얼들을 모두 작성해보고, Frank D. Luna 서적과 MDX KickStart(물론 C#을 이용한 Managed DirectX에 관한 책이었지만, 나름대로 쉽게 풀어놔서 DirctX의 전반적인 구조를 이해하는데 도움이 많이 되었습니다.) 를 읽어가며 맵 렌더링 클래스를 작성했습니다. 하지만, 그 결과는 별로 좋지가 않았습니다. =/ 


Vertex Buffer, Index Buffer에 수만개의 Vertices를 넣어가며 제작한 맵 렌더링 클래스..
텍셀과 픽셀의 1:1 대응을 구현하지 못해, UV맵핑이 엉망이되어, 보시다싶이 맵 중앙에 금이가버렸습니다. OTL


외국 게임 개발 사이트에 여러가지 질문을 해봤지만 별 다른 반응이 없길래... 할 수 없이 D3DXSPRITE9 인터페이스를 이용해야겠다고 다시 마음을 잡아 계획을 변경하고, 금요일 아침부터 열심히 D3DXSPRITE9를 공부하여서, 결국은 맵과 맵 오브젝트를 렌더링 할 수 있는 클래스를 작성했습니다. =]

이번 봄에 SDL로 제작한 마제스티 렌더링 엔진... 파일 관리나 소스코드 작성에 있어 정말 지저분한게 많았습니다.


가장 힘들었던 것은 Object가 제대로 표시되지 않았던 것과, 8비트 비트맵에서 첫번째 픽셀 값을 가져와서 ColorKey로 텍스쳐에 적용시키는 것이었던 것 같네요. 덕분에 비트맵 구조 한번 제대로 공부했습니다. ㅎㅎ
 
아고라시 광장 중앙 스크린 샷. 실제로 프로그램을 구동하면 분수는 에니메이션 처리되어 나타납니다.
 
초보 수련장 스크린 샷. 광장에 있는 할배한테 말걸면 여기로 데려다줬죠. 토깽이 때려잡던 기억이 나네요.

렙 3000때 마제가 망해버리는 바람에 직접 플레이 할 기회는 없었지만, 불꽃지대의 스크린샷입니다.

레드윈드 숲이였던가? 이름은 기억이 안나는데, 상반신은 황소이고 하반신은 말이었던 괴물들 때려잡던 기억이 납니다.


일단, 학교 과제도 있고 하니 일단은 여기까지만 해둬야겠네요. 3주 있으면 겨울 방학이니 그 때 부터 본격적으로 마제스티 제작에 들어가야겠습니다.

아직 갈길이 까마득합니다 -_- 그래픽 클래스도 아직 완성된 상태가 아니고... 일단은 에니메이션 프레임 버그부터 좀 잡아줘야할 것 같습니다. 그리고 메인캐릭터 그림들 패킹하고, 아이템 패킹, 폰트 프린트 함수 등등, 대강 다 짜놔야 할텐데, 겨울 방학 안에 다 끝낼 수 있을런지 모르겠습니다.

그 것보다 걱정되는건, 네트워크 프로그래밍은 지금 거의 무지에 가까운 상태입니다. -_- 소켓 공부하랴, 데이타베이스 공부하랴, 다중 쓰레드 공부하랴 앞으로 할일이 태산입니다. 하지만 여기서 포기할 수는 없습니다. 앞으로 계속 노력해서 꼭 Majesty : Renaissance 프로젝트를 완성하겠습니다. =]


* P.S.. 방금 에니메이션 버그 고쳤습니다. 프레임 중복 추가 검사를 빼먹었었네요. =S

by Mesmerized | 2007/11/25 08:37 | Game Development | 트랙백 | 덧글(1)

◀ 이전 페이지          다음 페이지 ▶