aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Sandulenko2005-01-29 17:58:47 +0000
committerEugene Sandulenko2005-01-29 17:58:47 +0000
commit66c524f0eec53790f9a8c88b58caa94dac677720 (patch)
treeb89519454e6bce19f802445fb5525d8a0e95ca3c
parent04fc9fe6e744663fc9cc27c325be0a282b72ec3c (diff)
downloadscummvm-rg350-66c524f0eec53790f9a8c88b58caa94dac677720.tar.gz
scummvm-rg350-66c524f0eec53790f9a8c88b58caa94dac677720.tar.bz2
scummvm-rg350-66c524f0eec53790f9a8c88b58caa94dac677720.zip
Add support for Humongous Mac titles in native format. Please test :)
svn-id: r16693
-rw-r--r--NEWS4
-rw-r--r--scumm/resource.cpp10
-rw-r--r--scumm/script_v72he.cpp7
-rw-r--r--scumm/scumm.cpp45
-rw-r--r--scumm/scumm.h3
-rw-r--r--scumm/sound.cpp19
6 files changed, 79 insertions, 9 deletions
diff --git a/NEWS b/NEWS
index 4e46ab6cf8..a993da7c28 100644
--- a/NEWS
+++ b/NEWS
@@ -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;