diff options
author | Sven Hesse | 2006-06-04 17:24:03 +0000 |
---|---|---|
committer | Sven Hesse | 2006-06-04 17:24:03 +0000 |
commit | b5bc1c82fa1e22091d5cfffa1217348acff8d0b2 (patch) | |
tree | acddbddf84bdd53fcb4d1f142707a6b2f7498f3a /engines | |
parent | f57f02482208638d6c29bd740cc3090b993e1312 (diff) | |
download | scummvm-rg350-b5bc1c82fa1e22091d5cfffa1217348acff8d0b2.tar.gz scummvm-rg350-b5bc1c82fa1e22091d5cfffa1217348acff8d0b2.tar.bz2 scummvm-rg350-b5bc1c82fa1e22091d5cfffa1217348acff8d0b2.zip |
- Fixed endianness/signess issues
- Added a memset in Video_v2::SpriteUncompressor(), that should have
been there in the first place; this fixes the tree in GOB2's first room
- Fixed ADL delete[]ing
svn-id: r22917
Diffstat (limited to 'engines')
-rw-r--r-- | engines/gob/game.cpp | 21 | ||||
-rw-r--r-- | engines/gob/game.h | 4 | ||||
-rw-r--r-- | engines/gob/inter_v1.cpp | 7 | ||||
-rw-r--r-- | engines/gob/inter_v2.cpp | 11 | ||||
-rw-r--r-- | engines/gob/map_v2.cpp | 10 | ||||
-rw-r--r-- | engines/gob/music.cpp | 2 | ||||
-rw-r--r-- | engines/gob/parse_v2.cpp | 12 | ||||
-rw-r--r-- | engines/gob/video_v2.cpp | 2 |
8 files changed, 40 insertions, 29 deletions
diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp index 2aa65d4fd6..c301f8177a 100644 --- a/engines/gob/game.cpp +++ b/engines/gob/game.cpp @@ -69,6 +69,8 @@ Game::Game(GobEngine *vm) : _vm(vm) { _soundSamples[i] = 0; _soundIds[i] = 0; _soundTypes[i] = 0; + _soundFromExt[i] = 0; + _soundADL[i] = false; } _curTotFile[0] = 0; @@ -89,7 +91,6 @@ Game::Game(GobEngine *vm) : _vm(vm) { _tempStr[0] = 0; _curImaFile[0] = 0; - _soundFromExt[0] = 0; _collStr[0] = 0; _backupedCount = 0; @@ -401,16 +402,20 @@ void Game::freeSoundSlot(int16 slot) { if ((slot < 0) || (slot >= 60) || (_soundSamples[slot] == 0)) return; - char* data = _soundSamples[slot]->data; + if (_soundADL[slot]) { + _vm->_music->stopPlay(); + delete[] ((char *) _soundSamples[slot]); + } else { + char* data = _soundSamples[slot]->data; - _vm->_snd->freeSoundDesc(_soundSamples[slot], false); - _soundSamples[slot] = 0; + _vm->_snd->freeSoundDesc(_soundSamples[slot], false); + _soundSamples[slot] = 0; - if (_soundFromExt[slot] == 1) { - delete[] (data - 6); - _soundFromExt[slot] = 0; + if (_soundFromExt[slot] == 1) { + delete[] (data - 6); + _soundFromExt[slot] = 0; + } } - } int16 Game::inputArea(int16 xPos, int16 yPos, int16 width, int16 height, int16 backColor, diff --git a/engines/gob/game.h b/engines/gob/game.h index 2ce6d0af0c..426d081fc7 100644 --- a/engines/gob/game.h +++ b/engines/gob/game.h @@ -144,14 +144,14 @@ public: Snd::SoundDesc *_soundSamples[60]; int16 _soundIds[60]; int8 _soundTypes[60]; + char _soundFromExt[60]; + bool _soundADL[60]; char _totToLoad[20]; int32 _startTimeKey; int16 _mouseButtons; - char _soundFromExt[20]; - // For totSub() int8 _backupedCount; int8 _curBackupPos; diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp index 45ed7f8814..b6862f29c2 100644 --- a/engines/gob/inter_v1.cpp +++ b/engines/gob/inter_v1.cpp @@ -938,6 +938,7 @@ bool Inter_v1::o1_readData(char &cmdCount, int16 &counter, int16 &retFlag) { int16 dataVar; int16 offset; int16 handle; + char buf[4]; evalExpr(0); dataVar = _vm->_parse->parseVarIndex(); @@ -956,7 +957,11 @@ bool Inter_v1::o1_readData(char &cmdCount, int16 &counter, int16 &retFlag) { else _vm->_dataio->seekData(handle, offset, 0); - retSize = _vm->_dataio->readData(handle, _vm->_global->_inter_variables + dataVar, size); + if (((dataVar >> 2) == 59) && (size == 4)) { + retSize = _vm->_dataio->readData(handle, buf, 4); + WRITE_VAR(59, READ_LE_UINT32(buf)); + } else + retSize = _vm->_dataio->readData(handle, _vm->_global->_inter_variables + dataVar, size); _vm->_dataio->closeData(handle); if (retSize == size) diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp index 77935eaefd..310a880dab 100644 --- a/engines/gob/inter_v2.cpp +++ b/engines/gob/inter_v2.cpp @@ -856,6 +856,7 @@ int16 Inter_v2::loadSound(int16 search) { _vm->_game->freeSoundSlot(slot); _vm->_game->_soundIds[slot] = id; + _vm->_game->_soundADL[slot] = isADL; if (id == -1) { // loc_969D strcpy(sndfile, _vm->_global->_inter_execPtr); @@ -865,7 +866,7 @@ int16 Inter_v2::loadSound(int16 search) { _vm->_game->_soundSamples[slot] = _vm->_game->loadSND(sndfile, 3); } else { strcat(sndfile, ".ADL"); - // TODO: This is very ugly (and doesn't work with Snd::freeSoundDesc()) + // TODO: This is very ugly _vm->_game->_soundSamples[slot] = (Snd::SoundDesc *) _vm->_dataio->getData(sndfile); } _vm->_game->_soundTypes[slot] = 2; @@ -899,7 +900,7 @@ int16 Inter_v2::loadSound(int16 search) { if (!isADL) _vm->_game->loadSound(slot, extData); else - // TODO: This is very ugly (and doesn't work with Snd::freeSoundDesc()) + // TODO: This is very ugly _vm->_game->_soundSamples[slot] = (Snd::SoundDesc *) extData; } } else { // loc_9A13 @@ -907,7 +908,7 @@ int16 Inter_v2::loadSound(int16 search) { if (!isADL) _vm->_game->loadSound(slot, extData); else - // TODO: This is very ugly (and doesn't work with Snd::freeSoundDesc()) + // TODO: This is very ugly _vm->_game->_soundSamples[slot] = (Snd::SoundDesc *) extData; } } @@ -1753,12 +1754,12 @@ void Inter_v2::o2_playImd(void) { void Inter_v2::o2_totSub(void) { char totFile[14]; + byte length; int flags; - int length; int i; length = *_vm->_global->_inter_execPtr++; - if (length > 13) + if ((length & 0x7F) > 13) error("Length in o2_totSub is greater than 13 (%d)", length); if (length & 0x80) { evalExpr(0); diff --git a/engines/gob/map_v2.cpp b/engines/gob/map_v2.cpp index 6558cd27d9..d5c02fd078 100644 --- a/engines/gob/map_v2.cpp +++ b/engines/gob/map_v2.cpp @@ -59,7 +59,7 @@ void Map_v2::loadMapObjects(char *avjFile) { char *dataPtr; char *dataPtrBak; char *dataPtrBak2; - char statesMask[102]; + int8 statesMask[102]; Goblin::Gob2_State *statesPtr; var = _vm->_parse->parseVarIndex(); @@ -168,13 +168,13 @@ void Map_v2::loadMapObjects(char *avjFile) { _vm->_mult->_objects[i].goblinStates[state][0].field_4 = numData; for (k = 0; k < numData; k++) { dataPtr++; - _vm->_mult->_objects[i].goblinStates[state][k].animation = *dataPtr << 8; + _vm->_mult->_objects[i].goblinStates[state][k].animation = *((byte *) dataPtr) << 8; dataPtr += 2; - _vm->_mult->_objects[i].goblinStates[state][k].animation += *dataPtr; + _vm->_mult->_objects[i].goblinStates[state][k].animation += *((byte *) dataPtr); dataPtr += 2; - _vm->_mult->_objects[i].goblinStates[state][k].layer = *dataPtr << 8; + _vm->_mult->_objects[i].goblinStates[state][k].layer = *((byte *) dataPtr) << 8; dataPtr += 2; - _vm->_mult->_objects[i].goblinStates[state][k].layer += *dataPtr; + _vm->_mult->_objects[i].goblinStates[state][k].layer += *((byte *) dataPtr); _vm->_mult->_objects[i].goblinStates[state][k].field_4 = READ_LE_UINT16(dataPtr); dataPtr += 2; statesPtr++; diff --git a/engines/gob/music.cpp b/engines/gob/music.cpp index e7e15cdd75..2cbce0f593 100644 --- a/engines/gob/music.cpp +++ b/engines/gob/music.cpp @@ -389,6 +389,8 @@ void Music::pollMusic(void) { switch (instr & 0x0F) { case 0xF: // End instruction _ended = true; + _samplesTillPoll = 0; + return; break; default: warning("Unknown special command in ADL, stopping playback: %X", instr & 0x0F); diff --git a/engines/gob/parse_v2.cpp b/engines/gob/parse_v2.cpp index 63aaadb8e4..982b6d09a2 100644 --- a/engines/gob/parse_v2.cpp +++ b/engines/gob/parse_v2.cpp @@ -178,12 +178,12 @@ int16 Parse_v2::parseValExpr(unsigned stopToken) { break; case 21: - *valPtr = *_vm->_global->_inter_execPtr++; + *valPtr = *((int8 *) _vm->_global->_inter_execPtr++); break; case 23: case 24: - *valPtr = *(uint16*)(_vm->_global->_inter_variables + _vm->_inter->load16() * 4); + *valPtr = VAR(_vm->_inter->load16()); break; case 25: @@ -435,7 +435,7 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) { case 21: *operPtr = 20; - *valPtr = *_vm->_global->_inter_execPtr++; + *valPtr = *((int8 *) _vm->_global->_inter_execPtr++); break; case 22: @@ -445,13 +445,9 @@ int16 Parse_v2::parseExpr(char stopToken, byte *arg_2) { break; case 23: - *operPtr = 20; - *valPtr = VAR(_vm->_inter->load16()); - break; - case 24: *operPtr = 20; - *valPtr = *(uint16*)(_vm->_global->_inter_variables + _vm->_inter->load16() * 4); + *valPtr = VAR(_vm->_inter->load16()); break; case 25: diff --git a/engines/gob/video_v2.cpp b/engines/gob/video_v2.cpp index cad6937c0b..edb2ea0287 100644 --- a/engines/gob/video_v2.cpp +++ b/engines/gob/video_v2.cpp @@ -229,6 +229,8 @@ char Video_v2::spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight, else var_2E = 0; + memset(memBuffer, 32, bufPos); + cmdVar = 0; while (1) { cmdVar >>= 1; |