diff options
| -rw-r--r-- | NEWS | 4 | ||||
| -rw-r--r-- | scumm/resource.cpp | 10 | ||||
| -rw-r--r-- | scumm/script_v72he.cpp | 7 | ||||
| -rw-r--r-- | scumm/scumm.cpp | 45 | ||||
| -rw-r--r-- | scumm/scumm.h | 3 | ||||
| -rw-r--r-- | scumm/sound.cpp | 19 | 
6 files changed, 79 insertions, 9 deletions
| @@ -9,8 +9,8 @@ For a more comprehensive changelog for the latest experimental CVS code, see:   General:     - ... - <ENGINE #1 NEWS> -   - ... + SCUMM +   - Added support for Mac Humongous Entertainment titles   <PORT #1 NEWS>     - ... diff --git a/scumm/resource.cpp b/scumm/resource.cpp index 6e231f251e..97ebd26cb4 100644 --- a/scumm/resource.cpp +++ b/scumm/resource.cpp @@ -123,6 +123,16 @@ void ScummEngine::openRoom(int room) {  			encByte = (_features & GF_USE_KEY) ? 0xFF : 0;  		} +		// If we have substitute +		if (_heMacFileNameIndex > 0) { +			char tmpBuf[128]; + +			generateMacFileName(buf, tmpBuf, 128, 0, _heMacFileNameIndex); +			strcpy(buf, tmpBuf); +			generateMacFileName(buf2, tmpBuf, 128, 0, _heMacFileNameIndex); +			strcpy(buf2, tmpBuf); +		} +  		result = openResourceFile(buf, encByte);  		if ((result == false) && (buf2[0])) {  			result = openResourceFile(buf2, encByte); diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp index dc9abc00d6..44686e5bdd 100644 --- a/scumm/script_v72he.cpp +++ b/scumm/script_v72he.cpp @@ -1547,6 +1547,13 @@ void ScummEngine_v72he::o72_openFile() {  		sprintf((char *)filename, "%s.he9", _gameName.c_str());  	} +	if (_heMacFileNameIndex > 0) { +		char buf1[128]; + +		generateMacFileName((char *)filename, buf1, 128, 0, _heMacFileNameIndex); +		strcpy((char *)filename, buf1); +	} +  	for (r = strlen((char*)filename); r != 0; r--) {  		if (filename[r - 1] == '\\')  			break; diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp index 3f326fb18f..bca0bda002 100644 --- a/scumm/scumm.cpp +++ b/scumm/scumm.cpp @@ -69,7 +69,7 @@  extern bool isSmartphone(void);  #endif -static int generateMacFileName(const char *filename, char *buf, int bufsize, int cont = 0); +static int generateMacFileName_(const char *filename, char *buf, int bufsize, int cont = 0, int index = 0);  namespace Scumm { @@ -678,6 +678,7 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS  	_expire_counter = 0;  	_lastLoadedRoom = 0;  	_roomResource = 0; +	_heMacFileNameIndex = 0;  	OF_OWNER_ROOM = 0;  	_verbMouseOver = 0;  	_inventoryOffset = 0; @@ -2597,6 +2598,11 @@ void ScummEngine::errorString(const char *buf1, char *buf2) {  	}  } +int ScummEngine::generateMacFileName(const char *filename, char *buf, int bufsize, int cont, int index) { +	return generateMacFileName_(filename, buf, bufsize, cont, index); +} + +  } // End of namespace Scumm  using namespace Scumm; @@ -2674,7 +2680,7 @@ DetectedGameList Engine_SCUMM_detectGames(const FSList &fslist) {  			}  			if (g->features & GF_HUMONGOUS) { -				if ((heLastName = generateMacFileName(tempName, detectName, 128,  +				if ((heLastName = generateMacFileName_(tempName, detectName, 128,   													  heLastName)) == -1)  					heOver = true;  			} else { @@ -2736,7 +2742,7 @@ DetectedGameList Engine_SCUMM_detectGames(const FSList &fslist) {  	return detectedGames;  } -static int generateMacFileName(const char *filename, char *buf, int bufsize, int cont) { +static int generateMacFileName_(const char *filename, char *buf, int bufsize, int cont, int index) {  	if (cont == -1)  		return -1; @@ -2744,9 +2750,17 @@ static int generateMacFileName(const char *filename, char *buf, int bufsize, int  		cont++;  	char num = filename[strlen(filename) - 1]; +	 +	// In some cases we have .(a) and .(b) extensions +	if (num == ')') +		num = filename[strlen(filename) - 2]; +  	char *n = strrchr(filename, '.');  	int len = n - filename; +	if (index > 0) +		cont = index; +  	for (int i = cont; i < ARRAYSIZE(heMacFileNameTable); i++) {  		if (!scumm_strnicmp(filename, heMacFileNameTable[i].winName, len)) {  			if (heMacFileNameTable[i].hasParens) @@ -2777,8 +2791,9 @@ Engine *Engine_SCUMM_create(GameDetector *detector, OSystem *syst) {  	// Calculate MD5 of the games detection file, for savegames etc.  	const char *name = g->name; -	char detectName[256], gameMD5[32+1]; +	char detectName[256], tempName[256], gameMD5[32+1];  	uint8 md5sum[16]; +	int heLastName = 0;  	if (g->detectFilename) {  		strcpy(detectName, game.detectFilename); @@ -2792,6 +2807,24 @@ Engine *Engine_SCUMM_create(GameDetector *detector, OSystem *syst) {  	} else if (g->features & GF_HUMONGOUS) {  		strcpy(detectName, name);  		strcat(detectName, ".he0"); +		strcpy(tempName, name); +		strcat(tempName, ".he0"); +		 +		bool heOver = false; +		File f; + +		while (!heOver) { +			if (f.exists(detectName, ConfMan.get("path").c_str())) +				break; + +			if ((heLastName = generateMacFileName_(tempName, detectName, 256,  +													  heLastName)) == -1) +					heOver = true; +		} + +		// Force game to have Mac platform +		if (heLastName > 0) +			game.features |= GF_MACINTOSH;  	} else {  		strcpy(detectName, name);  		strcat(detectName, ".000"); @@ -2922,6 +2955,10 @@ Engine *Engine_SCUMM_create(GameDetector *detector, OSystem *syst) {  		error("Engine_SCUMM_create(): Unknown version of game engine");  	} +	// FIXME: dirty HACK. Should we introduce another parameter to constructor +	// instead? +	((ScummEngine *)engine)->_heMacFileNameIndex = heLastName; +  	return engine;  } diff --git a/scumm/scumm.h b/scumm/scumm.h index c66031300f..99678243a2 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -489,6 +489,9 @@ public:  	int _roomResource;  // FIXME - should be protected but Sound::pauseSounds uses it  	bool _egoPositioned;	// Used by Actor::putActor, hence public +	int generateMacFileName(const char *filename, char *buf, int bufsize, int cont = 0, int index = 0); +	int _heMacFileNameIndex; +  protected:  	int _keyPressed;  	uint16 _lastKeyHit; diff --git a/scumm/sound.cpp b/scumm/sound.cpp index de2a9a5080..4f76c0e451 100644 --- a/scumm/sound.cpp +++ b/scumm/sound.cpp @@ -171,10 +171,15 @@ void Sound::playSound(int soundID, int heOffset, int heChannel, int heFlags) {  		int music_offs, total_size;  		uint tracks, skip = 0; -		char buf[32]; +		char buf[32], buf1[128];  		File musicFile;  		sprintf(buf, "%s.he4", _vm->getGameName()); + +		if (_vm->_heMacFileNameIndex > 0) { +			_vm->generateMacFileName(buf, buf1, 128, 0, _vm->_heMacFileNameIndex); +			strcpy(buf, buf1); +		}  		if (musicFile.open(buf) == false) {  			warning("playSound: Music file is not open");  			return; @@ -1072,10 +1077,18 @@ ScummFile *Sound::openSfxFile() {  	}  	if (!file->isOpen()) { -		if (_vm->_heversion >= 70) +		if (_vm->_heversion >= 70) {  			sprintf(buf, "%s.he2", _vm->getGameName()); -		else + +			if (_vm->_heMacFileNameIndex > 0) { +				char buf1[128]; + +				_vm->generateMacFileName(buf, buf1, 128, 0, _vm->_heMacFileNameIndex); +				strcpy(buf, buf1); +			} +		} else {  			sprintf(buf, "%s.tlk", _vm->getGameName()); +		}  		if (file->open(buf) && _vm->_heversion <= 72)   			file->setEnc(0x69);  		_soundMode = kVOCMode; | 
