aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorSven Hesse2006-06-04 17:24:03 +0000
committerSven Hesse2006-06-04 17:24:03 +0000
commitb5bc1c82fa1e22091d5cfffa1217348acff8d0b2 (patch)
treeacddbddf84bdd53fcb4d1f142707a6b2f7498f3a /engines
parentf57f02482208638d6c29bd740cc3090b993e1312 (diff)
downloadscummvm-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.cpp21
-rw-r--r--engines/gob/game.h4
-rw-r--r--engines/gob/inter_v1.cpp7
-rw-r--r--engines/gob/inter_v2.cpp11
-rw-r--r--engines/gob/map_v2.cpp10
-rw-r--r--engines/gob/music.cpp2
-rw-r--r--engines/gob/parse_v2.cpp12
-rw-r--r--engines/gob/video_v2.cpp2
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;