완벽함이란 더 이상 무엇인가를 더할 것이 없을때 이루어 지는 것이 아니라, 더 이상 무엇인가를 뺄 것이 없을 때 이루어진다. - 앙뜨완느 마리 로제 드 생떽쥐페리
by 미친병아리 이글루스 피플 2006 이글루스 TOP 100 2007 이글루스 TOP 100
포토로그
메뉴릿
주저리 주저리
라이프로그
Quake Virtual Machine..
읽고 있는 Quake Mod 만들기 책의 중간쯤에 가보니 Quake Virtual Machine에 대한 이야기가 나온다.. 책이나 인터넷에서 찾은 내용대로 아무리 따라해봐도 QVM이 빌드가 되지 않아 정말 꽤 많은 시간을 허비했다.. 잊어먹기 전에 삽질한 내용 정리를..

퀘이크 소스는 게임엔진 (서버), 게임엔진 (클라이언트), UI, 그래픽 엔진으로 소스가 나뉘어져 있는데, 그래픽 엔진을 제외한 부분의 소스가 공개되어 있다.. 그래픽 엔진과 나머지 부분의 인터페이스가 VM으로 되어 있다.. 물론, DLL로 빌드하여도 된다..
(그래, 모듈화란 대충해서는 안되고 이렇게 해야한다.. 그래픽엔진, UI, 게임엔진이 정말로 잘 분리되어 있으며, 해킹방지를 위해 - 퀘이크 아레나는 본격적인 네트워크 기반 게임이다.. 싱글모드 조차 로봇과 해야하는.. 혼자 미션을 깨는게 없는 오락인 것이다.. - VM 모듈까지 만들어 넣고.. 시간과 돈이 있어서 이렇게 만들 수 있는게 아니라, 이렇게 만들 수 있기 때문에 시간과 돈을 확보하고 있는 사람들이라는 생각이 든다..)

근데 Quake3를 설치하면 아무리 봐도 그래픽 엔진 (Quake3.exe)만 있고 나머지 파일들은 없다.. 처음엔 신기했었는데, 설마 이 파일들이 없이 실행될리 만무하다.. 찾아보니 baseq3 폴더 하위에 있는 *.pk3 파일 안에 들어있더군.. *.pk3 파일은 *.zip 파일을 확장자만 바꿔둔 것으로 *.zip 파일로 확장자를 바꾸고 압축을 풀어보면 무슨 파일들이 들어있는지 확인해볼 수 있다..

압축을 풀어보면 *.qvm 이라는 파일들로 들어가 있다..

존 카멕은 왜 QVM을 만들었을까..

먼저 해킹에 대한 방어를 위해서다.. 해킹이라기 보다는 결과 조작일 수 있겠다.. 혹은 다른 사람보다 유리할 수 있는 그 어떤 조작들.. 물론, VM을 만든다고 해서 이에 자유로울 수는 없을 것이다.. 하지만, DLL을 후킹할 줄 아는 프로그래머들이 VM을 후킹할 줄 아는 프로그래머들 보다 훨씬 많을테니 이런 선택을 한 것 같다.. (귀찮은 일이지만, API의 스펙이 공개되면 얼마든지 후킹이 가능하다.. 예전에 윈속 DLL을 이런식으로 가로채는 것을 심심해서 만들어본 적이 있는데, 귀찮아서 그렇지 얼마든지 가능하고 아주 쉽다.. 내 DLL을 하나 만들고 이 DLL에서 원본 DLL을 로드해서 API를 원본과 똑같이 만든다.. 그리고 실행파일을 조작해서 원본이 아닌 내 DLL을 로드하도록 만들면 모든 API들이 호출될때 내가 만들 DLL을 통해 원본이 호출되게 된다.. 이 방법은 워낙에 유명한 널리 알려진 방법이기 때문에 많은 사람들이 시도하는 방법일 수 있다.. 이를 통한 조작이 널리 퍼지는 것은 힘들지만, 퀘이크 처럼 나만 이렇게 동작하여 대전에서 유리할 수 있으면 되기 때문에 이런 후킹이 카멕은 아주 싫었던 모양이다.. VM까지 만들걸 보면.. 윈속 DLL 가로채기법은 나중에 시간이 되면 함 정리해보자.. 아마 인터넷에서 찾으면 보다 쉽게 잘 정리된 내용을 찾을 수 있을지 모른다..)

두번째 이유로는 포팅.. 한번 빌드한 QVM은 윈도, 리눅스, 맥.. 어디로든 파일 카피만 해도 돌아간다.. 자바도 같은 특징을 가지고 있다.. 윈도용, 리눅스용, 맥용 등 플랫폼 별로 빌드하는데 지겨웠나보다.. 흐흐흐.. 하긴 VM 한번 만들어두면 그 다음부터는 이런 삽질 안해도 되니 충분한 가치가 있다.. 그래도 행동에 옮기긴 쉽지 않은 결정이기도 하다..

일단 빌드를 해보기 전에 어케 만들어지는지 관련 *.bat 파일들을 좀 둘러봤다.. 흠, 컴파일러는 lcc를 사용하는 듯 하다.. (책은 예전부터 사놓고 읽지 않고 있는 lcc를 이렇게 다시 만나게 되네..) 이를 바이트코드로 만들어 퀘이크 어셈블리로 만드는 것 같은데, 보아하니 오리지널 lcc를 그대로 쓰는 것이 아니라 소스가 오픈되어 있으니 수정하여 퀘이크용 바이트 코드를 만들어내는 것으로 보인다.. 물론, 그래픽 엔진과 함께 VM 환경을 조성하는 엔진 역시 아직 소스가 오픈되어 있지 않다.. id 소프트도 먹고 살아야 하니.. Quake III의 소스코드 풀 라이센스는 여전히 아주 비싼 가격이다.. (250만불) Quake II 역시 GPL로 오픈되어 있지만, GPL을 따르는 경우 내 소스도 오픈해야 하므로 상용 게임을 만들려면 다른 라이센스를 받아야 한다.. Quake II의 경우는 만불 정도 된다.. Quake 정도의 그래픽 엔진을 가져다 쓰는데 이정도 가격이면, 글쎄 게임에 대해 아는건 별로 없지만 인력투입해 맨땅에 만드는 비용을 생각해보면 라이센스를 받는것도 나쁘지 않은 선택으로 보인다.. 인력투입해서 이정도 나온다는 보장이 없다면..
물론, 존 카멕은 Quake I, II에 이어 Quake III도 GPL로 소스 오픈을 한다고 이야기 한 바 있다.. 이때가 되면 그래픽 엔진과 VM 엔진을 어케 만들었는지 알아볼 수 있을 것 같다..

QVM을 빌드하는 것은 간단하다.. 같이 제공되는 소스에 필요한 *.bat 파일들이 이미 만들어져 있기 때문이다.. 배치파일 실행시키면 QVM 파일이 만들어진다.. 만들어지면 아래와 같이 실행시키면 된다.. DLL로 실행시킬때와는 옵션이 좀 다르다..

quake3.exe +set fs_game !MadchickMod! +set sv_pure 0 +map q3dm1

!MadchickMod! 자리에 자신의 VM이 위치하는 경로를 넣으면 된다..

나는 QVM을 빌드하는데 꽤 시간낭비를 했는데, 알고보니 VS .NET 2003 때문이었다.. 환경변수의 include와 lib 변수에 .NET SDK 1.1의 include와 lib 폴더가 설정되어 있었는데 이것 때문에 lcc가 이상하게 동작을 했다.. 환경변수에서 이 값들을 공백으로 만들어주니 아주 잘 빌드가 되었다.. 으~ 이걸 알아내느라 정말 별별 시도를 다 해봤다.. 공개된 다른 Q3 소스도 찾아서 해봤지만, 결과는 같아서 내 PC에 lcc가 이상하게 동작하는데 같은 파일이 내 PC에서만 그런 것으로 보아 환경세팅 문제다.. 이 개발자들은 없는데, 나는 있는게 뭔가.. 이짓 저짓 해서 알아낸게 바로 VS .NET 2003의 include, lib 경로 설정.. 환경변수에서 이거 없애니 아주 빌드가 잘 되는데.. 좀 허탈하더구만.. lcc가 include와 lib 환경변수를 참조하는 부분이 있는가 보다..

그리고, DLL 파일로 하던 것과 QVM을 만들어 하는 것의 차이를 발견했는데 DLL로 만든 경우 이상하게 한 게임이 끝나고 다시 게임이 시작되면 내가 변경한 mod가 반영되지 않고, 오리지날 게임이 진행된다.. 하지만, QVM으로 하는 경우는 계속 내가 변경한 것으로 시작되었다..
이게 게임 실행옵션에서 뭐가 다른 건지 알 수 없지만, 아무튼 현재 알아낸 바로는 그렇다.. DLL로 만든 경우도 mod가 계속 반영될 수 있는 옵션이 있는데 아직 내가 못 찾아냈는지도 모르지..

QVM을 쉽게 빌드할 수 있는 소스코드는 여기서 다운로드 가능하다.. 물론, 예전에 소개했던 소스코드로도 충분히 빌드 가능하지만 이 소스코드가 비교적 QVM을 빌드할 수 있는 배치파일들이 정리가 더 잘되어 있다.. 빌드에 필요한 설명은 소스코드 다운로드후 압축을 풀면 나오는 Readme_eng.html 파일을 읽어보면 알아둬야 하는 모든 내용이 담겨있다..
by 미친병아리 | 2004/08/22 22:05 | ▣ 퀘크야그 ▣ | 트랙백 | 덧글(4)
트랙백 주소 : http://madchick.egloos.com/tb/685035
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by SOUP at 2004/08/24 10:14
조금씩 어려워지기 시작하는데요~^^;;
저도 빨리 책을 보고 글을 올리고 싶은데, 9월달은 되어야 책을 받아볼 수 있을 듯 합니다.그전까지 좋은 글 많이 부탁드립니다.~^
Commented by 미친병아리 at 2004/08/24 10:57
뭐, 책은 읽고 있는데 전반적으로 모든 내용을 상세히 다루지 않기 때문에 그리 어렵지는 않은 것 같습니다.. 아무래도 그래픽 엔진과 게임엔진이 완벽히 분리되어 있기 때문이겠지요.. 책 보시면 어렵지 않게 술술 읽으실 수 있으실 겁니다.. 시간만 내시면..
Commented by 하상원 at 2006/11/27 12:19
정말 알찬 블로그네요 ^^;
이제 시작하는 프로그래머로 정말 배울 점 많네요...
잘 보고 갈께요 ^^
Commented by 미친병아리 at 2006/12/10 21:23
하상원님 : 감사합니다..

:         :

:

비공개 덧글

Creative Commons License

< 이전페이지 다음페이지 >


이글루 파인더
카테고리
태그
최근 등록된 덧글
^^;; 톰켓, 아파치를 ..
by 지난가는이 at 18:35
한동안 이 앺을 잘 썼는데..
by 수학의정석 at 01/06
gw031511@naver.com ..
by gw031511 at 01/05
최고입니다!
by 아리스 at 12/28
귀환 축하드립니다~ㅎㅎ
by 라디오키즈 at 12/23
ftp이동시 한글/중국어/..
by 흐흠... at 12/17
YOIU MAD CHICK YOU.
by my name at 12/17
YOU MAD CHICK YOU.
by my name at 12/17
Solution for Error code:..
by C광 at 12/14
저도내복사야하는디....
by 미친감자 at 12/09
하하^^ 저도 요즘 뜸하..
by 김정수 at 11/27
잘 봤습니다. UML에 대..
by ohyecloudy at 11/21
잘 지내시죠? 여전히 일로..
by hehua at 11/20
월동준비없이 간만에 오..
by 쩌비 at 11/20
블로그가 업데이트 되어..
by Funny at 11/19
간만의 포스팅 반갑습니..
by 135th at 11/19
오랜만이세요.. 어케 ..
by zoops at 11/19
오래간만 입니다. :)
by 마음으로 찍는 사진 at 11/19
오랜만에 돌아오셨네요~..
by jely at 11/19
좋은평가 감사드립니다. ..
by ilsooni at 11/16
최근 등록된 트랙백
[펌] UTF-8 인코딩과..
by 돈버는 기계로 살것인가?..
크리스마스 영어 표현들
by 영어와 가제트 이야기 [..
데꾸벅의 생각
by techbug's me2DAY
UML, 실전에서는 이것..
by Ohyecloudy's Progr..
데드라인 - 소설로 재미..
by Ohyecloudy's S3
실전적 문장비법 글쓰기..
by 블로거1.0의 WEB2.0 도전기
우분투 리눅스 8.10 하루..
by joogunking
마이클잭슨 사망 소식들..
by Bluesky
후아유(2002) : 2000년대 ..
by 생활의 발견
知的人의 생각
by peter_c's me2DAY
톰캣!!
by 나두미키님의 이글루
정규 표현식 완전 해부와..
by 김재호의 디지털보단 아..
HTML 소스 제대로 보자,..
by [부동산]개발.정비구역
내 손안의 PC - 자바가 ..
by 上善若水
Stringbuilder OutOfMe..
by Pinch of Smack for D..
웹 오피스 정리
by Web N Bizr
네이버 블로그 검색 - ..
by InformationRedesign
에반게리온: 서 - 사운드..
by LG전자 XCANVAS홈..
블로그에서 수익은 기대..
by IT, 모바일, 엔터테..
"다음으로 지원한 이메일..
by 민노씨.네
이글루링크
EBC (Egloos Broad..
erehwon.LAB
About willy
Living Loving and L..
修身齊家萬事成
【 이름쟁이™의 눈으로 】
개 풀 뜯어먹는 소리
觀鷄者의 망상 공간
Oz in Wonderland
김명신의 즐거운 하루
함께.. 늘 그렇게..
荷花(hehua)
소스코드위를 걷다.....
네러티브 오프로드
zoops 이야기
까모의 룰루랄라~
▒ 제닉스의 사고뭉치 ▒
河伊兒의 고물상
가로수들은 여전히 제자..
餘分D: physics and fun
극한추리 hansang\'s w..
길고양이 이야기
어쨌건간에 흘러가는 者
선인장 일지
~★~ 우하하!!~ 프로..
without coffee
Lady Nariel's Golde..
검색엔진 루씬 Lucene..
fire, walk with me
디지털을 말한다 by oojoo
♠후리지아 향기처럼♠
일상 생활 속의 파편들
뽐뿌 inside
책읽는 엄마의 보석창고
Mono log
blogger jely
반복되는 일상속의 비정..
골룸의 골방
질풍 17주의 머브러브 라..
maniacs
AURA's Showcase
ozzyz review 허지웅..
디제의 애니와 영화 이야기
ANTIEGOIST : GyuHo..
미달이의 육아일기
All about IT Trends
Suicide Solution
얼음집
Trouble n Travel
모기불통신
Trip
찬별은 초식동물
숲 속 작은 섬
snowcat blog
전도서에 바치는 장미
한글이 꿈틀
이우진의 UCC 제작실 ..
INVENT
위로..위로..위로..
woody's film review
Show me the money
전자음악 알아보기
sunny's store
이규영 연예영화 블로그
◀ M.HOUSE - Masade..
Urban Living
쉽니다.
roadster
무디의 무책임한 세상
이제 다시... 바라보다.
random life
Beyond Web
ricordati di me
Jania's Blog
Gaious 功房 네오베..
애자일 이야기
- Last Paromix -
T9T9 Research Center
양군 블로그
소프트웨어 이야기
식사일보 food daily
Software Engineering..
티오
고재관의 블로그
mocca
yundream의 프로그래..
통TON
lalou
생각이 없는 블로그
이전블로그
rss

skin by 이글루스