2012년 11월 17일 토요일

XU4 : Ultima4 recreated

Ultima 시리즈 가운데 4번째인 Ultima4 : Quest of the Avatar의 업그레이드 버전인 XU4에 도전해 보았습니다.

이 외에도 각 시리즈별 업그레이드는 다음과 같습니다.
Ultima5 : Lazarus
Ultima6 : Nuvie
Ultima7 : Exult
Ultima8 : Pentagram

도전할 게 뭐가 있냐고 생각할 수도 있지만,  XU4는 윈도우즈와 맥用의 바이너리만 배포합니다. 그러니 우분투에서 사용해 보려면 소스를 컴파일 해야 합니다.

일단 필요한 것을 나열해 보면,
xu4 웹사이트 : http://xu4.sourceforge.net/
xu4 소스 : http://prdownloads.sourceforge.net/xu4/xu4-1.0beta3.tar.gz?download
ultima4(DOS) : http://www.thatfleminggent.com/ultima/u4download.html
ultima4 업그레이드 파일 : http://prdownloads.sourceforge.net/xu4/u4upgrad.zip?download


현재 사용중인 우분투는 10.04 버전입니다.
기본적인 설치를 마친 직후라 추가로 설치해야 하는 패키지들이 있습니다.

libxml2-dev
libsdl1.2-dev
libsdl-mixer1.2-dev
zlib1g-dev
g++

위의 패키지를 시냅틱 패키지 관리자에서 선택해 추가하면, 함께 필요한 패키지들이 자동으로 선택되니 모두 설치하면 됩니다.


이제 소스를 컴파일해 봅니다.
중간에 에러가 나는 경우가 종종 있었는데, 소스를 약간 수정해야만 했습니다.

다음이 수정한 내역입니다.
=================================================================

vc6.h
line 11에 추가
#include <stdlib.h>
#include <string.h>

imagemgr.h
line 105 SubImage *ImageMgr::getSubImage(const std::string &name);
==> SubImage *getSubImage(const std::string &name);

menuitem.cpp
line 7에 추가
#include <stdio.h>

u4file.h
line 13에 추가
#undef putc

lzw/u6decode.cpp
line 36에 추가
#define EXIT_SUCCESS 0
#define EXIT_FAILURE -1
=================================================================

컴파일이 완료되면 몇개의 실행 파일이 생성됩니다.
u4
u4enc
u4dec
tlkconv
dumpsavegame

이 디렉토리에 위에서 받은 ultima4(DOS) 와 Ultima4  업그레이드 파일을 저장해 둡니다.
압축된 상태 그대로 두면 되고 파일의 이름음 ultima4.zip과 u4upgrad.zip으로 되어 있을 것입니다.

압축파일을 다루는데 문제가 좀 있는지 잠깐 로딩 바가 보이다가 종료가 됩니다.
프로그램의 구조를 확인하고 디버깅을 해야 문제를 고칠 수 있지 않을까 싶습니다.

프로그램에 문제가 발생할 경우, 디버깅 방법에 대해 고민을 하곤 합니다.
소스의 구조를 파악해서 논리적으로 문제가 발생한 지점을 찾아낼 것인가?
대략 에러가 난 곳과 의심되는 곳에 메시지를 넣어서 범위를 최소로 줄일 것인가?
디버거를 이용해서 스텝을 따라가면서 문제를 추적할 것인가?

위와 같이 문제가 발생하는 시점과 항상 일정하고 항상 재현이 되는 경우에는 마지막 방법이 좋을 것입니다.

하지만, 내가 만든 소스도 아니고, 소스를 살펴보거나 배우기 위한 것이 아니라....
소스에 포함된 문서를 읽어 보다가, ultima4.zip의 압축을 풀어서 ultima4라는 디렉토리에 넣어 두어도 된다는 문구가 있어 시험 삼아 압축을 풀어 보았습니다.

그냥 실행이 되었습니다.^^
울어야 할지 웃어야 할지.....

암튼 실행 화면이라도 감상해야죠.





=================================================================

디버깅 결과 압축파일에서 원하는 파일을 찾는 부분에 문제가 있었습니다.
그 이유는 ultima4.zip에서 원하는 파일을 찾을 때, <"ultima4/"+파일이름>과 같이 앞 부분에 ultima4라는 디렉토리 이름을 붙여서 찾으려 하고 있기 때문에 원하는 파일을 찾지 못하게 됩니다.
업그레이드 파일인 u4upgrad.zip일 경우에는 디렉토리 이름을 붙이지 않았기에 문제가 없었습니다.

수정해야 할 부분은 u4file.cpp의 238 line입니다.
초기에 압축파일에 대한 정보를 지정하는 부분에서 서브 디렉토리 이름을 지정하지 않도록 수정하는 것입니다.


지금 캡쳐한 사진을 보니, ultima4-1.01.zip인 파일을 사용하는 경우에도 문제가 발생하겠네요.
소스를 수정할 수 없는 상황이라면, 실행 파일이 있는 곳에 ultima4라는 서브디렉토리를 만들고 이곳에 압축 파일을 넣어도 됩니다.

간만에 소스 들여다 보며 디버깅하려니 힘드는군요^^
=================================================================

댓글 없음: