aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorTravis Howell2006-10-14 01:15:28 +0000
committerTravis Howell2006-10-14 01:15:28 +0000
commitca620f02f327b95f8764d2b093c147a61b7c0814 (patch)
tree6f79ed760d8787fce6282f5de049e3c59fc65dca /engines
parente87ff48e053b621dc5df63d42b561d69d0643bce (diff)
downloadscummvm-rg350-ca620f02f327b95f8764d2b093c147a61b7c0814.tar.gz
scummvm-rg350-ca620f02f327b95f8764d2b093c147a61b7c0814.tar.bz2
scummvm-rg350-ca620f02f327b95f8764d2b093c147a61b7c0814.zip
Add sound effects support for early games
svn-id: r24300
Diffstat (limited to 'engines')
-rw-r--r--engines/agos/agos.cpp7
-rw-r--r--engines/agos/agos.h2
-rw-r--r--engines/agos/res.cpp71
-rw-r--r--engines/agos/sound.cpp8
-rw-r--r--engines/agos/sound.h3
-rw-r--r--engines/agos/vga.cpp71
6 files changed, 114 insertions, 48 deletions
diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp
index d97d14270f..0768b7e854 100644
--- a/engines/agos/agos.cpp
+++ b/engines/agos/agos.cpp
@@ -1523,9 +1523,10 @@ void AGOSEngine::loadZone(uint zoneNum) {
vpe->sfxFile = NULL;
if (!(getFeatures() & GF_ZLIBCOMP)) {
- loadVGAFile(zoneNum, 3);
- vpe->sfxFile = _block;
- vpe->sfxFileEnd = _blockEnd;
+ if (loadVGAFile(zoneNum, 3)) {
+ vpe->sfxFile = _block;
+ vpe->sfxFileEnd = _blockEnd;
+ }
}
}
diff --git a/engines/agos/agos.h b/engines/agos/agos.h
index 4b5c195992..9f08142992 100644
--- a/engines/agos/agos.h
+++ b/engines/agos/agos.h
@@ -1275,7 +1275,7 @@ protected:
byte *getScaleBuf();
void convertAmiga(byte *srcBuf, int32 fileSize);
- void loadVGAFile(uint id, uint type);
+ bool loadVGAFile(uint id, uint type);
void loadSimonVGAFile(uint id);
int init();
diff --git a/engines/agos/res.cpp b/engines/agos/res.cpp
index d511e40fdc..18b305617c 100644
--- a/engines/agos/res.cpp
+++ b/engines/agos/res.cpp
@@ -631,7 +631,7 @@ void AGOSEngine::loadSimonVGAFile(uint id) {
}
}
-void AGOSEngine::loadVGAFile(uint id, uint type) {
+bool AGOSEngine::loadVGAFile(uint id, uint type) {
File in;
char filename[15];
byte *dst = NULL;
@@ -685,41 +685,46 @@ void AGOSEngine::loadVGAFile(uint id, uint type) {
}
in.open(filename);
- if (in.isOpen() == true) {
- dstSize = srcSize = in.size();
- if (getFeatures() & GF_CRUNCHED) {
- byte *srcBuffer = (byte *)malloc(srcSize);
- if (in.read(srcBuffer, srcSize) != srcSize)
- error("loadVGAFile: Read failed");
+ if (in.isOpen() == false) {
+ // Sound VGA files don't always exist
+ if (type == 3) {
+ return false;
+ } else {
+ error("loadVGAFile: Can't load %s", filename);
+ }
+ }
- dstSize = READ_BE_UINT32(srcBuffer + srcSize - 4);
- if (type == 2 && dstSize != 64800) {
- dst = (byte *)malloc(dstSize);
- decrunchFile(srcBuffer, dst, srcSize);
- convertAmiga(dst, dstSize);
- free(dst);
- } else {
- dst = allocBlock (dstSize + extraBuffer);
- decrunchFile(srcBuffer, dst, srcSize);
- }
- free(srcBuffer);
+ dstSize = srcSize = in.size();
+ if (getFeatures() & GF_CRUNCHED) {
+ byte *srcBuffer = (byte *)malloc(srcSize);
+ if (in.read(srcBuffer, srcSize) != srcSize)
+ error("loadVGAFile: Read failed");
+
+ dstSize = READ_BE_UINT32(srcBuffer + srcSize - 4);
+ if (type == 2 && dstSize != 64800) {
+ dst = (byte *)malloc(dstSize);
+ decrunchFile(srcBuffer, dst, srcSize);
+ convertAmiga(dst, dstSize);
+ free(dst);
} else {
- if (getGameId() == GID_SIMON1CD32 && type == 2) {
- dst = (byte *)malloc(dstSize);
- if (in.read(dst, dstSize) != dstSize)
- error("loadVGAFile: Read failed");
- convertAmiga(dst, dstSize);
- free(dst);
- } else {
- dst = allocBlock(dstSize + extraBuffer);
- if (in.read(dst, dstSize) != dstSize)
- error("loadVGAFile: Read failed");
- }
+ dst = allocBlock (dstSize + extraBuffer);
+ decrunchFile(srcBuffer, dst, srcSize);
+ }
+ free(srcBuffer);
+ } else {
+ if (getGameId() == GID_SIMON1CD32 && type == 2) {
+ dst = (byte *)malloc(dstSize);
+ if (in.read(dst, dstSize) != dstSize)
+ error("loadVGAFile: Read failed");
+ convertAmiga(dst, dstSize);
+ free(dst);
+ } else {
+ dst = allocBlock(dstSize + extraBuffer);
+ if (in.read(dst, dstSize) != dstSize)
+ error("loadVGAFile: Read failed");
}
- in.close();
- } else if (type != 3) {
- error("loadVGAFile: Can't load %s", filename);
}
+ in.close();
} else {
id = id * 2 + (type - 1);
offs = _gameOffsetsPtr[id];
@@ -728,6 +733,8 @@ void AGOSEngine::loadVGAFile(uint id, uint type) {
dst = allocBlock(dstSize + extraBuffer);
readGameFile(dst, offs, dstSize);
}
+
+ return true;
}
static const char *dimpSoundList[32] = {
diff --git a/engines/agos/sound.cpp b/engines/agos/sound.cpp
index e9484ca994..6cdd5347d7 100644
--- a/engines/agos/sound.cpp
+++ b/engines/agos/sound.cpp
@@ -624,6 +624,14 @@ void Sound::ambientPause(bool b) {
}
}
+// Elvira 1/2 and Waxworks specific
+void Sound::playRawData(byte *soundData, uint sound, uint size) {
+ byte *buffer = (byte *)malloc(size);
+ memcpy(buffer, soundData, size);
+
+ _mixer->playRaw(&_effectsHandle, buffer, size, 8000, Audio::Mixer::FLAG_UNSIGNED | Audio::Mixer::FLAG_AUTOFREE);
+}
+
// Feeble Files specific
void Sound::playAmbientData(byte *soundData, uint sound, uint pan, uint vol) {
if (sound == _ambientPlaying)
diff --git a/engines/agos/sound.h b/engines/agos/sound.h
index 606dad5b59..a10458534e 100644
--- a/engines/agos/sound.h
+++ b/engines/agos/sound.h
@@ -75,6 +75,9 @@ public:
void playEffects(uint sound);
void playAmbient(uint sound);
+ // Elvira 1/2 and Waxworks specific
+ void playRawData(byte *soundData, uint sound, uint size);
+
// Feeble Files specific
void playAmbientData(byte *soundData, uint sound, uint pan, uint vol);
void playSfxData(byte *soundData, uint sound, uint pan, uint vol);
diff --git a/engines/agos/vga.cpp b/engines/agos/vga.cpp
index 2f28944617..82191a61a2 100644
--- a/engines/agos/vga.cpp
+++ b/engines/agos/vga.cpp
@@ -1983,12 +1983,37 @@ void AGOSEngine::vc27_resetSprite() {
}
void AGOSEngine::vc28_playSFX() {
- // TODO
- uint a = vcReadNextWord();
- uint b = vcReadNextWord();
- uint c = vcReadNextWord();
- uint d = vcReadNextWord();
- debug(0, "vc28_playSFX: stub (%d, %d, %d, %d)", a, b, c, d);
+ byte *dst;
+ uint sound, channels, frequency, flags;
+ uint offs, size;
+
+ sound = vcReadNextWord();
+ channels = vcReadNextWord();
+ frequency = vcReadNextWord();
+ flags = vcReadNextWord();
+
+ debug(0, "vc28_playSFX: stub (%d, %d, %d, %d)", sound, channels, frequency, flags);
+
+ if (_curSfxFile == NULL)
+ return;
+
+ dst = _curSfxFile;
+ if (getGameType() == GType_WW) {
+ uint tmp = sound;
+ while (tmp--)
+ dst += READ_LE_UINT16(dst) + 4;
+
+ size = READ_LE_UINT16(dst);
+ offs = 4;
+ } else {
+ while (READ_BE_UINT16(dst) != sound)
+ dst += 12;
+
+ size = READ_BE_UINT16(dst + 2);
+ offs = READ_BE_UINT32(dst + 8);
+ }
+
+ _sound->playRawData(dst + offs, sound, size);
}
void AGOSEngine::vc29_stopAllSounds() {
@@ -2453,6 +2478,9 @@ void AGOSEngine::vc56_fullScreen() {
byte *src = _curVgaFile2 + 32;
byte *dst = getBackBuf();
+ memcpy(dst, src, _screenHeight * _screenWidth);
+ //fullFade();
+
uint8 palette[1024];
for (int i = 0; i < 256; i++) {
palette[i * 4 + 0] = *src++ * 4;
@@ -2462,7 +2490,6 @@ void AGOSEngine::vc56_fullScreen() {
}
_system->setPalette(palette, 0, 256);
- memcpy(dst, src, _screenHeight * _screenWidth);
}
void AGOSEngine::vc56_delayLong() {
@@ -2588,30 +2615,50 @@ void AGOSEngine::vc60_stopAnimation() {
void AGOSEngine::vc61() {
uint16 a = vcReadNextWord();
byte *src, *dst;
+ uint h, tmp;
if (a == 6) {
src = _curVgaFile2 + 800;
dst = getBackBuf();
memcpy(dst, src, 64000);
- a = 4;
+ tmp = 4;
+ } else {
+ tmp = a;
}
src = _curVgaFile2 + 3360;
- dst = getBackBuf() + 3840;
-
- uint tmp = a;
while (tmp--) {
src += 1712;
- dst += 1536;
}
src += 800;
if (a != 5) {
+ dst = getBackBuf() + 7448;
+ for (h = 0; h < 177; h++) {
+ memcpy(dst, src, 144);
+ src += 144;
+ dst += _screenWidth;
+ }
+
+ if (a != 6)
+ return;
+
+ src += 15344;
+ }
+
+ dst = getBackBuf() + 50296;
+ for (h = 0; h < 17; h++) {
+ memcpy(dst, src, 208);
+ src += 208;
+ dst += _screenWidth;
}
if (a == 6) {
+ //fullFade();
}
+
+ debug(0, "vc61: stub (%d)", a);
}
void AGOSEngine::vc61_setMaskImage() {