aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Hesse2007-03-30 17:52:31 +0000
committerSven Hesse2007-03-30 17:52:31 +0000
commitd65e05841a324d2ec898a3662f40e193fbc77e47 (patch)
tree55d85a458c0559e6c3d3b060dd54f7385562867a
parent33c6a6f46057748a30a143c9eb5dc1f86c813e32 (diff)
downloadscummvm-rg350-d65e05841a324d2ec898a3662f40e193fbc77e47.tar.gz
scummvm-rg350-d65e05841a324d2ec898a3662f40e193fbc77e47.tar.bz2
scummvm-rg350-d65e05841a324d2ec898a3662f40e193fbc77e47.zip
- Fixed the IMD playing within mults, the non-interactive Gob3 demo should work better now
- Replaced strcpy with strncpy where appropriate - Added detection entries for other languages of the multilingual Gob3 CD; bug #1691230 svn-id: r26327
-rw-r--r--engines/gob/cdrom.cpp4
-rw-r--r--engines/gob/dataio.cpp9
-rw-r--r--engines/gob/detection.cpp63
-rw-r--r--engines/gob/draw_v1.cpp2
-rw-r--r--engines/gob/draw_v2.cpp2
-rw-r--r--engines/gob/game.cpp7
-rw-r--r--engines/gob/game_v1.cpp12
-rw-r--r--engines/gob/game_v2.cpp12
-rw-r--r--engines/gob/gob.h6
-rw-r--r--engines/gob/goblin.cpp2
-rw-r--r--engines/gob/imd.cpp12
-rw-r--r--engines/gob/imd.h2
-rw-r--r--engines/gob/init.cpp5
-rw-r--r--engines/gob/inter_v1.cpp4
-rw-r--r--engines/gob/inter_v2.cpp12
-rw-r--r--engines/gob/map_v1.cpp3
-rw-r--r--engines/gob/mult.h2
-rw-r--r--engines/gob/mult_v2.cpp35
-rw-r--r--engines/gob/sound.cpp4
19 files changed, 136 insertions, 62 deletions
diff --git a/engines/gob/cdrom.cpp b/engines/gob/cdrom.cpp
index 92cd167a52..f436df9988 100644
--- a/engines/gob/cdrom.cpp
+++ b/engines/gob/cdrom.cpp
@@ -53,7 +53,7 @@ void CDROM::readLIC(const char *fname) {
*_curTrack = 0;
- strcpy(tmp, fname);
+ strncpy0(tmp, fname, 79);
handle = _vm->_dataIO->openData(tmp);
@@ -171,7 +171,7 @@ void CDROM::startTrack(const char *trackname) {
return;
}
- strcpy(_curTrack, trackname);
+ strncpy0(_curTrack, trackname, 15);
stopPlaying();
diff --git a/engines/gob/dataio.cpp b/engines/gob/dataio.cpp
index b1202a9250..bd6de8a2a0 100644
--- a/engines/gob/dataio.cpp
+++ b/engines/gob/dataio.cpp
@@ -277,9 +277,11 @@ void DataIO::openDataFile(const char *src, bool itk) {
char path[128];
int16 file;
- strcpy(path, src);
- if (!strchr(path, '.'))
+ strncpy0(path, src, 127);
+ if (!strchr(path, '.')) {
+ path[123] = 0;
strcat(path, ".stk");
+ }
for (file = 0; file < MAX_DATA_FILES; file++)
if (_dataFiles[file] == 0)
@@ -441,7 +443,8 @@ int32 DataIO::getDataSize(const char *name) {
int32 chunkSz;
Common::File file;
- strcpy(buf, name);
+ strncpy0(buf, name, 127);
+
chunkSz = getChunkSize(buf);
if (chunkSz >= 0)
return chunkSz;
diff --git a/engines/gob/detection.cpp b/engines/gob/detection.cpp
index 55733b9be5..f2bf5ffb58 100644
--- a/engines/gob/detection.cpp
+++ b/engines/gob/detection.cpp
@@ -798,7 +798,19 @@ static const GOBGameDescription gameDescriptions[] = {
GF_GOB2,
"intro"
},
- { // Supplied by paul66 in bug report #1652352
+ { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230
+ {
+ "gob3cd",
+ "v1.02",
+ AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"),
+ EN_ANY,
+ kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ GF_GOB2,
+ "intro"
+ },
+ { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230
{
"gob3cd",
"v1.02",
@@ -810,6 +822,42 @@ static const GOBGameDescription gameDescriptions[] = {
GF_GOB2,
"intro"
},
+ { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230
+ {
+ "gob3cd",
+ "v1.02",
+ AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"),
+ FR_FRA,
+ kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ GF_GOB2,
+ "intro"
+ },
+ { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230
+ {
+ "gob3cd",
+ "v1.02",
+ AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"),
+ IT_ITA,
+ kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ GF_GOB2,
+ "intro"
+ },
+ { // Supplied by paul66 and noizert in bug reports #1652352 and #1691230
+ {
+ "gob3cd",
+ "v1.02",
+ AD_ENTRY1("intro.stk", "c3e9132ea9dc0fb866b6d60dcda10261"),
+ ES_ESP,
+ kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ GF_GOB2,
+ "intro"
+ },
{
{
"gob3",
@@ -946,6 +994,18 @@ static const GOBGameDescription fallbackDescs[] = {
GF_BARGON,
"intro"
},
+ {
+ {
+ "gob3cd",
+ "unknown",
+ AD_ENTRY1(0, 0),
+ UNK_LANG,
+ kPlatformPC,
+ Common::ADGF_NO_FLAGS
+ },
+ GF_GOB2 | GF_CD,
+ "intro"
+ },
};
static const ADFileBasedFallback fileBased[] = {
@@ -955,6 +1015,7 @@ static const ADFileBasedFallback fileBased[] = {
{ &fallbackDescs[2], { "intro.stk", "disk2.stk", "disk3.stk", 0 } },
{ &fallbackDescs[3], { "intro.stk", "gobnew.lic", 0 } },
{ &fallbackDescs[4], { "intro.stk", "scaa.imd", "scba.imd", "scbf.imd", 0 } },
+ { &fallbackDescs[5], { "intro.stk", "mus_gob3.lic", 0 } },
{ 0, { 0 } }
};
diff --git a/engines/gob/draw_v1.cpp b/engines/gob/draw_v1.cpp
index 74feea39aa..64b75dca15 100644
--- a/engines/gob/draw_v1.cpp
+++ b/engines/gob/draw_v1.cpp
@@ -267,7 +267,7 @@ void Draw_v1::printTotText(int16 id) {
} else if (cmd == 1) {
val = READ_LE_UINT16(ptrEnd + 18) * 4;
- strcpy(buf, GET_VARO_STR(val));
+ strncpy0(buf, GET_VARO_STR(val), 19);
} else {
val = READ_LE_UINT16(ptrEnd + 18) * 4;
diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp
index 5aa6cbbbf1..17295beeb2 100644
--- a/engines/gob/draw_v2.cpp
+++ b/engines/gob/draw_v2.cpp
@@ -482,7 +482,7 @@ void Draw_v2::printTotText(int16 id) {
sprintf(buf, "%d", VAR_OFFSET(val));
} else if (cmd == 1) {
val = READ_LE_UINT16(ptrEnd + 18) * 4;
- strcpy(buf, GET_VARO_STR(val));
+ strncpy0(buf, GET_VARO_STR(val), 19);
} else {
val = READ_LE_UINT16(ptrEnd + 18) * 4;
sprintf(buf, "%d", VAR_OFFSET(val));
diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp
index 9ed83ecf18..4c0bb5a613 100644
--- a/engines/gob/game.cpp
+++ b/engines/gob/game.cpp
@@ -292,7 +292,7 @@ int16 Game::checkKeys(int16 *pMouseX, int16 *pMouseY,
_vm->_util->processInput();
- if (_vm->_mult->_multData && (_vm->_global->_inter_variables != 0) &&
+ if (_vm->_mult->_multData && _vm->_global->_inter_variables &&
(VAR(58) != 0)) {
if (_vm->_mult->_multData->frameStart != (int) VAR(58) - 1)
_vm->_mult->_multData->frameStart++;
@@ -309,9 +309,6 @@ int16 Game::checkKeys(int16 *pMouseX, int16 *pMouseY,
_vm->_inter->_soundEndTimeKey = 0;
}
- if (_vm->_global->_useMouse == 0)
- error("checkKeys: Can't work without mouse!");
-
_vm->_util->getMouseState(pMouseX, pMouseY, pButtons);
if (*pButtons == 3)
@@ -436,7 +433,7 @@ void Game::totSub(int8 flags, char *newTotFile) {
_vm->_global->_inter_variablesSizes = 0;
}
- strcpy(_curTotFile, newTotFile);
+ strncpy0(_curTotFile, newTotFile, 9);
strcat(_curTotFile, ".TOT");
if (_vm->_inter->_terminate != 0)
diff --git a/engines/gob/game_v1.cpp b/engines/gob/game_v1.cpp
index 2913a21f81..425d9c6b19 100644
--- a/engines/gob/game_v1.cpp
+++ b/engines/gob/game_v1.cpp
@@ -1025,7 +1025,7 @@ void Game_v1::collisionsBlock(void) {
if ((_collisionAreas[i].flags & 0x0F) > 8) {
char *ptr;
- strcpy(_tempStr, GET_VARO_STR(_collisionAreas[i].key));
+ strncpy0(_tempStr, GET_VARO_STR(_collisionAreas[i].key), 255);
while ((ptr = strchr(_tempStr, ' ')) != 0) {
_vm->_util->cutFromStr(_tempStr, (ptr - _tempStr), 1);
ptr = strchr(_tempStr, ' ');
@@ -1037,14 +1037,14 @@ void Game_v1::collisionsBlock(void) {
((_collisionAreas[i].flags & 0x0F) <= 8)) {
str = descArray[var_24].ptr;
- strcpy(_tempStr, GET_VARO_STR(_collisionAreas[i].key));
+ strncpy0(_tempStr, GET_VARO_STR(_collisionAreas[i].key), 255);
if ((_collisionAreas[i].flags & 0x0F) < 7)
_vm->_util->prepareStr(_tempStr);
int16 pos = 0;
do {
- strcpy(_collStr, str);
+ strncpy0(_collStr, str, 255);
pos += strlen(str) + 1;
str += strlen(str) + 1;
@@ -1115,7 +1115,7 @@ int16 Game_v1::multiEdit(int16 time, int16 index, int16 *pCurPos,
if ((collArea->flags & 0x0F) > 10)
continue;
- strcpy(_tempStr, GET_VARO_STR(collArea->key));
+ strncpy0(_tempStr, GET_VARO_STR(collArea->key), 255);
_vm->_draw->_destSpriteX = collArea->left;
_vm->_draw->_destSpriteY = collArea->top;
@@ -1278,10 +1278,10 @@ int16 Game_v1::inputArea(int16 xPos, int16 yPos, int16 width, int16 height,
editSize = width / pFont->itemWidth;
while (1) {
- strcpy(_tempStr, str);
+ strncpy0(_tempStr, str, 254);
strcat(_tempStr, " ");
if (strlen(_tempStr) > editSize)
- strcpy(_tempStr, str);
+ strncpy0(_tempStr, str, 255);
_vm->_draw->_destSpriteX = xPos;
_vm->_draw->_destSpriteY = yPos;
diff --git a/engines/gob/game_v2.cpp b/engines/gob/game_v2.cpp
index e9d10fe8b1..8eb9258a31 100644
--- a/engines/gob/game_v2.cpp
+++ b/engines/gob/game_v2.cpp
@@ -1052,7 +1052,7 @@ void Game_v2::collisionsBlock(void) {
if ((_collisionAreas[i].flags & 0x0F) > 8) {
char *ptr;
- strcpy(_tempStr, GET_VARO_STR(_collisionAreas[i].key));
+ strncpy0(_tempStr, GET_VARO_STR(_collisionAreas[i].key), 255);
while ((ptr = strchr(_tempStr, ' ')))
_vm->_util->cutFromStr(_tempStr, (ptr - _tempStr), 1);
if (_vm->_language == 2)
@@ -1065,14 +1065,14 @@ void Game_v2::collisionsBlock(void) {
((_collisionAreas[i].flags & 0x0F) <= 8)) {
str = descArray[var_24].ptr;
- strcpy(_tempStr, GET_VARO_STR(_collisionAreas[i].key));
+ strncpy0(_tempStr, GET_VARO_STR(_collisionAreas[i].key), 255);
if ((_collisionAreas[i].flags & 0x0F) < 7)
_vm->_util->prepareStr(_tempStr);
int16 pos = 0;
do {
- strcpy(_collStr, str);
+ strncpy0(_collStr, str, 255);
pos += strlen(str) + 1;
str += strlen(str) + 1;
@@ -1155,7 +1155,7 @@ int16 Game_v2::multiEdit(int16 time, int16 index, int16 *pCurPos,
if ((collArea->flags & 0x0F) > 10)
continue;
- strcpy(_tempStr, GET_VARO_STR(collArea->key));
+ strncpy0(_tempStr, GET_VARO_STR(collArea->key), 255);
_vm->_draw->_destSpriteX = collArea->left;
_vm->_draw->_destSpriteY = collArea->top;
@@ -1355,10 +1355,10 @@ int16 Game_v2::inputArea(int16 xPos, int16 yPos, int16 width, int16 height,
editSize = width / pFont->itemWidth;
while (1) {
- strcpy(_tempStr, str);
+ strncpy0(_tempStr, str, 254);
strcat(_tempStr, " ");
if (strlen(_tempStr) > editSize)
- strcpy(_tempStr, str);
+ strncpy0(_tempStr, str, 255);
fontExtraBak = _vm->_draw->_fonts[fontIndex]->extraData;
needAdjust = _vm->_draw->_needAdjust;
diff --git a/engines/gob/gob.h b/engines/gob/gob.h
index a3da4f4fd3..222b6a84f2 100644
--- a/engines/gob/gob.h
+++ b/engines/gob/gob.h
@@ -103,6 +103,12 @@ enum SaveFiles {
SAVE_BLO // Notes
};
+inline char *strncpy0(char *dest, const char *src, size_t n) {
+ strncpy(dest, src, n);
+ dest[n] = 0;
+ return dest;
+}
+
// A "smart" reference counting templated class
template<typename T>
class ReferenceCounter {
diff --git a/engines/gob/goblin.cpp b/engines/gob/goblin.cpp
index 71b2a7704b..af694c17da 100644
--- a/engines/gob/goblin.cpp
+++ b/engines/gob/goblin.cpp
@@ -1221,7 +1221,7 @@ void Goblin::loadObjects(char *source) {
freeObjects();
initList();
- strcpy(_vm->_map->_sourceFile, source);
+ strncpy0(_vm->_map->_sourceFile, source, 14);
_vm->_map->_sourceFile[strlen(_vm->_map->_sourceFile) - 4] = 0;
_vm->_map->loadMapObjects(source);
diff --git a/engines/gob/imd.cpp b/engines/gob/imd.cpp
index 9306f6a2ca..31e562681d 100644
--- a/engines/gob/imd.cpp
+++ b/engines/gob/imd.cpp
@@ -92,8 +92,11 @@ ImdPlayer::Imd *ImdPlayer::loadImdFile(const char *path, SurfaceDesc *surfDesc,
uint32 framesPosPos = 0;
uint32 framesCordsPos = 0;
- strcpy(buf, path);
- strcat(buf, ".IMD");
+ strncpy0(buf, path, 17);
+ if (!strchr(buf, '.')) {
+ buf[13] = 0;
+ strcat(buf, ".IMD");
+ }
handle = _vm->_dataIO->openData(buf);
@@ -196,7 +199,6 @@ ImdPlayer::Imd *ImdPlayer::loadImdFile(const char *path, SurfaceDesc *surfDesc,
assert(_soundBuffer);
memset(_soundBuffer, 0, _soundSliceSize * _soundSlicesCount);
- _vm->_snd->stopSound(0);
_soundDesc.set(SOUND_SND, SOUND_TOT, _soundBuffer,
_soundSliceSize * _soundSlicesCount);
@@ -279,7 +281,7 @@ int8 ImdPlayer::openImd(const char *path, int16 x, int16 y,
_curX = _curImd->x;
_curY = _curImd->y;
- strcpy(_curFile, src);
+ strncpy0(_curFile, src, 17);
delete[] _frameData;
_frameData = new byte[_curImd->frameDataSize + 500];
@@ -852,7 +854,7 @@ inline void ImdPlayer::drawFrame(int16 frame) {
}
inline void ImdPlayer::copyPalette(int16 palStart, int16 palEnd) {
- if (palStart == -1)
+ if ((palStart == -1) || (palEnd == -1))
memcpy((char *) _vm->_global->_pPaletteDesc->vgaPal,
(char *) _curImd->palette, 768);
else
diff --git a/engines/gob/imd.h b/engines/gob/imd.h
index 3069e9eb7d..bf66136d58 100644
--- a/engines/gob/imd.h
+++ b/engines/gob/imd.h
@@ -92,7 +92,7 @@ public:
int16 frames, bool fade, bool interruptible);
protected:
- char _curFile[15];
+ char _curFile[18];
int16 _curX;
int16 _curY;
diff --git a/engines/gob/init.cpp b/engines/gob/init.cpp
index 353f881072..447b8c33e5 100644
--- a/engines/gob/init.cpp
+++ b/engines/gob/init.cpp
@@ -136,10 +136,10 @@ void Init::initGame(char *totName) {
}
if (totName) {
- strcpy(buffer, totName);
+ strncpy0(buffer, totName, 15);
strcat(buffer, ".tot");
} else
- strcpy(buffer, _vm->_startTot);
+ strncpy0(buffer, _vm->_startTot, 19);
handle = _vm->_dataIO->openData(buffer);
@@ -152,7 +152,6 @@ void Init::initGame(char *totName) {
_vm->_global->_inter_variables = new char[varsCount * 4];
_vm->_global->_inter_variablesSizes = new byte[varsCount * 4];
_vm->_global->clearVars(varsCount);
- WRITE_VAR(58, 1);
strcpy(_vm->_game->_curTotFile, buffer);
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index d5bc59fe19..76ba0184d7 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -1432,7 +1432,7 @@ bool Inter_v1::o1_loadTot(OpFuncParams &params) {
if ((*_vm->_global->_inter_execPtr & 0x80) != 0) {
_vm->_global->_inter_execPtr++;
evalExpr(0);
- strcpy(buf, _vm->_global->_inter_resStr);
+ strncpy0(buf, _vm->_global->_inter_resStr, 15);
} else {
size = *_vm->_global->_inter_execPtr++;
for (int i = 0; i < size; i++)
@@ -1948,7 +1948,7 @@ bool Inter_v1::o1_strToLong(OpFuncParams &params) {
int32 res;
strVar = _vm->_parse->parseVarIndex();
- strcpy(str, GET_VARO_STR(strVar));
+ strncpy0(str, GET_VARO_STR(strVar), 19);
res = atol(str);
destVar = _vm->_parse->parseVarIndex();
diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index 74c129bac6..0998d3de31 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -1074,7 +1074,7 @@ void Inter_v2::o2_readLIC() {
char path[40];
evalExpr(0);
- strcpy(path, _vm->_global->_inter_resStr);
+ strncpy0(path, _vm->_global->_inter_resStr, 35);
strcat(path, ".LIC");
_vm->_cdrom->readLIC(path);
@@ -1460,7 +1460,7 @@ void Inter_v2::o2_playImd() {
evalExpr(0);
_vm->_global->_inter_resStr[8] = 0;
- strcpy(imd, _vm->_global->_inter_resStr);
+ strncpy0(imd, _vm->_global->_inter_resStr, 127);
x = _vm->_parse->parseValExpr();
y = _vm->_parse->parseValExpr();
@@ -1542,7 +1542,7 @@ void Inter_v2::o2_openItk() {
char fileName[32];
evalExpr(0);
- strcpy(fileName, _vm->_global->_inter_resStr);
+ strncpy0(fileName, _vm->_global->_inter_resStr, 27);
strcat(fileName, ".ITK");
_vm->_dataIO->openDataFile(fileName, true);
@@ -1920,7 +1920,7 @@ void Inter_v2::o2_loadInfogramesIns(OpGobParams &params) {
if (_vm->_noMusic)
return;
- strcpy(fileName, GET_VAR_STR(varName));
+ strncpy0(fileName, GET_VAR_STR(varName), 15);
strcat(fileName, ".INS");
debugC(1, kDebugMusic, "Loading Infogrames instrument file \"%s\"",
fileName);
@@ -1950,7 +1950,7 @@ void Inter_v2::o2_playInfogrames(OpGobParams &params) {
if (_vm->_noMusic)
return;
- strcpy(fileName, GET_VAR_STR(varName));
+ strncpy0(fileName, GET_VAR_STR(varName), 15);
strcat(fileName, ".DUM");
debugC(1, kDebugMusic, "Playing Infogrames music file \"%s\"", fileName);
@@ -2026,7 +2026,7 @@ int16 Inter_v2::loadSound(int16 search) {
source = SOUND_FILE;
- strcpy(sndfile, _vm->_global->_inter_execPtr);
+ strncpy0(sndfile, _vm->_global->_inter_execPtr, 9);
_vm->_global->_inter_execPtr += 9;
if (type == SOUND_ADL)
diff --git a/engines/gob/map_v1.cpp b/engines/gob/map_v1.cpp
index b0da6a4593..5f2edbb613 100644
--- a/engines/gob/map_v1.cpp
+++ b/engines/gob/map_v1.cpp
@@ -141,13 +141,14 @@ void Map_v1::loadMapObjects(char *avjFile) {
void Map_v1::loadSounds(Common::SeekableReadStream &data) {
int16 count;
int16 handle;
- char buf[128];
+ char buf[19];
char sndNames[20][14];
count = data.readUint16LE();
for (int i = 0; i < count; i++) {
data.read(buf, 14);
+ buf[14] = 0;
strcat(buf, ".SND");
strcpy(sndNames[i], buf);
}
diff --git a/engines/gob/mult.h b/engines/gob/mult.h
index a2cd92b57b..aad9aa0e52 100644
--- a/engines/gob/mult.h
+++ b/engines/gob/mult.h
@@ -156,7 +156,7 @@ public:
int16 field_4;
int16 field_6;
uint16 flags;
- int16 field_A;
+ int16 palFrame;
int16 lastFrame;
int8 palStart;
int8 palEnd;
diff --git a/engines/gob/mult_v2.cpp b/engines/gob/mult_v2.cpp
index 82772842dd..e460ac8641 100644
--- a/engines/gob/mult_v2.cpp
+++ b/engines/gob/mult_v2.cpp
@@ -268,7 +268,7 @@ void Mult_v2::loadImds(Common::SeekableReadStream &data) {
_multData->imdKeys[i][j].field_4 = data.readSint16LE();
_multData->imdKeys[i][j].field_6 = data.readSint16LE();
_multData->imdKeys[i][j].flags = data.readUint16LE();
- _multData->imdKeys[i][j].field_A = data.readSint16LE();
+ _multData->imdKeys[i][j].palFrame = data.readSint16LE();
_multData->imdKeys[i][j].lastFrame = data.readSint16LE();
_multData->imdKeys[i][j].palStart = data.readSByte();
_multData->imdKeys[i][j].palEnd = data.readSByte();
@@ -462,8 +462,10 @@ void Mult_v2::multSub(uint16 multindex) {
for (int i = 0; i < 4; i++) {
_multData->imdKeysIndices[index][i] = 0;
for (int j = 0; j < _multData->imdKeysCount[i]; j++)
- if (_multData->imdKeys[i][j].frame >= firstFrame)
+ if (_multData->imdKeys[i][j].frame >= firstFrame) {
_multData->imdKeysIndices[index][i] = j;
+ break;
+ }
}
_multData->animKeysStartFrames[index] = startFrame;
@@ -998,12 +1000,9 @@ void Mult_v2::animate() {
void Mult_v2::playImd(char *imdFile, Mult::Mult_ImdKey &key, int16 dir,
int16 startFrame) {
int16 x, y;
- int16 repeat = 0;
int16 palStart, palEnd;
- int16 lastFrame;
+ int16 baseFrame, palFrame, lastFrame;
uint16 flags;
- int16 di;
- int16 var_6;
if (_vm->_draw->_renderFlags & 0x100) {
x = VAR(55);
@@ -1022,26 +1021,27 @@ void Mult_v2::playImd(char *imdFile, Mult::Mult_ImdKey &key, int16 dir,
palStart = key.palStart;
palEnd = key.palEnd;
- di = key.field_A;
+ palFrame = key.palFrame;
lastFrame = key.lastFrame;
- if ((di == -1) && (lastFrame == -1))
- if (startFrame > 0)
+ if ((palFrame != -1) && (lastFrame != -1))
+ if ((lastFrame - palFrame) < startFrame)
if (!(key.flags & 0x4000)) {
_vm->_imdPlayer->closeImd();
return;
}
- if (!_vm->_imdPlayer->openImd(imdFile, x, y, repeat, flags))
+ if (!_vm->_imdPlayer->openImd(imdFile, x, y, 0, flags))
return;
- if (di == -1)
- di = 0;
+ if (palFrame == -1)
+ palFrame = 0;
if (lastFrame == -1)
lastFrame = _vm->_imdPlayer->_curImd->framesCount - 1;
- var_6 = startFrame % (lastFrame - di + 1);
- _vm->_imdPlayer->play(var_6 + di, flags & 0x7F, palStart, palEnd, di, lastFrame);
+ baseFrame = startFrame % (lastFrame - palFrame + 1);
+ _vm->_imdPlayer->play(baseFrame + palFrame, flags & 0x7F,
+ palStart, palEnd, palFrame, lastFrame);
}
void Mult_v2::advanceObjects(int16 index) {
@@ -1136,12 +1136,13 @@ void Mult_v2::advanceObjects(int16 index) {
int dir;
int startFrame;
- fileN = -_multData->imdKeys[i][_multData->imdIndices[i]].imdFile - 2;
+ Mult_ImdKey &key = _multData->imdKeys[i][_multData->imdIndices[i]];
+
+ fileN = -key.imdFile - 2;
if (fileN < 0)
return;
- Mult_ImdKey &key = _multData->imdKeys[i][_multData->imdIndices[i]];
-
+ imdFile = _multData->imdFiles + fileN * 14;
dir = _multData->animDirection;
startFrame = frame - key.frame;
if ((dir != 1) && (--startFrame > 0))
diff --git a/engines/gob/sound.cpp b/engines/gob/sound.cpp
index fe5f7ede16..d9c9b10627 100644
--- a/engines/gob/sound.cpp
+++ b/engines/gob/sound.cpp
@@ -313,6 +313,10 @@ void Snd::setSample(SoundDesc &sndDesc, int16 repCount, int16 frequency,
_data = (int8 *) sndDesc.getData();
_length = sndDesc.size();
_freq = frequency;
+
+ if ((frequency % 100) == 0)
+ _freq--;
+
_ratio = ((double) _freq) / _rate;
_offset = 0.0;
_frac = 0;