diff options
-rw-r--r-- | engines/gob/game_v6.cpp | 3 | ||||
-rw-r--r-- | engines/gob/inter.h | 2 | ||||
-rw-r--r-- | engines/gob/inter_v6.cpp | 73 | ||||
-rw-r--r-- | engines/gob/sound/sound.cpp | 21 | ||||
-rw-r--r-- | engines/gob/sound/sound.h | 1 | ||||
-rw-r--r-- | engines/gob/videoplayer.cpp | 4 | ||||
-rw-r--r-- | engines/gob/videoplayer.h | 2 |
7 files changed, 102 insertions, 4 deletions
diff --git a/engines/gob/game_v6.cpp b/engines/gob/game_v6.cpp index 2a9a1c254f..d8c921107f 100644 --- a/engines/gob/game_v6.cpp +++ b/engines/gob/game_v6.cpp @@ -93,6 +93,9 @@ void Game_v6::pushCollisions(char all) { size++; } + if (_collStackSize >= 5) + error("Game_v6::pushCollisions: _collStackSize == %d", _collStackSize); + destPtr = new Collision[size]; _collStack[_collStackSize] = destPtr; diff --git a/engines/gob/inter.h b/engines/gob/inter.h index 59a914b2fd..140f99c432 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -624,6 +624,8 @@ protected: virtual const char *getOpcodeFuncDesc(byte i, byte j); virtual const char *getOpcodeGoblinDesc(int i); + void o6_playVmdOrMusic(); + bool o6_loadCursor(OpFuncParams ¶ms); bool o6_evaluateStore(OpFuncParams ¶ms); bool o6_palLoad(OpFuncParams ¶ms); diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp index 59c406f7bb..f4c10dfb2f 100644 --- a/engines/gob/inter_v6.cpp +++ b/engines/gob/inter_v6.cpp @@ -32,6 +32,8 @@ #include "gob/game.h" #include "gob/parse.h" #include "gob/draw.h" +#include "gob/sound/sound.h" +#include "gob/videoplayer.h" #include "gob/indeo3.h" namespace Gob { @@ -214,7 +216,7 @@ void Inter_v6::setupOpcodes() { OPCODE(o5_initScreen), OPCODE(o2_scroll), OPCODE(o2_setScrollOffset), - OPCODE(o4_playVmdOrMusic), + OPCODE(o6_playVmdOrMusic), /* 84 */ OPCODE(o2_getImdInfo), OPCODE(o2_openItk), @@ -651,6 +653,75 @@ const char *Inter_v6::getOpcodeGoblinDesc(int i) { return ""; } +void Inter_v6::o6_playVmdOrMusic() { + char fileName[128]; + int16 x, y; + int16 startFrame; + int16 lastFrame; + int16 breakKey; + int16 flags; + int16 palStart; + int16 palEnd; + uint16 palCmd; + bool close; + + evalExpr(0); + strncpy0(fileName, _vm->_global->_inter_resStr, 127); + + x = _vm->_parse->parseValExpr(); + y = _vm->_parse->parseValExpr(); + startFrame = _vm->_parse->parseValExpr(); + lastFrame = _vm->_parse->parseValExpr(); + breakKey = _vm->_parse->parseValExpr(); + flags = _vm->_parse->parseValExpr(); + palStart = _vm->_parse->parseValExpr(); + palEnd = _vm->_parse->parseValExpr(); + palCmd = 1 << (flags & 0x3F); + + debugC(1, kDebugVideo, "Playing video \"%s\" @ %d+%d, frames %d - %d, " + "paletteCmd %d (%d - %d), flags %X", fileName, x, y, startFrame, lastFrame, + palCmd, palStart, palEnd, flags); + + close = false; + if (lastFrame == -1) { + close = true; + } else if (lastFrame == -5) { + warning("Urban Stub: Stopping background music \"%s\"", fileName); + return; + } else if (lastFrame == -9) { + warning("Urban Stub: Starting background music \"%s\"", fileName); + return; + } else if (lastFrame == -10) { + _vm->_vidPlayer->primaryClose(); + warning("Urban Stub: Video/Music command -10 (close video?)"); + return; + } else if (lastFrame < 0) { + warning("Unknown Video/Music command: %d, %s", lastFrame, fileName); + return; + } + + if (startFrame == -2) { + startFrame = 0; + lastFrame = -1; + close = false; + } + + if ((fileName[0] != 0) && !_vm->_vidPlayer->primaryOpen(fileName, x, y, flags)) { + WRITE_VAR(11, (uint32) -1); + return; + } + + if (startFrame >= 0) { + _vm->_game->_preventScroll = true; + _vm->_vidPlayer->primaryPlay(startFrame, lastFrame, breakKey, + palCmd, palStart, palEnd, 0, -1, false, -1, true); + _vm->_game->_preventScroll = false; + } + + if (close) + _vm->_vidPlayer->primaryClose(); +} + bool Inter_v6::o6_loadCursor(OpFuncParams ¶ms) { int16 width, height; byte *dataBuf; diff --git a/engines/gob/sound/sound.cpp b/engines/gob/sound/sound.cpp index 78ef69c912..84f47990ec 100644 --- a/engines/gob/sound/sound.cpp +++ b/engines/gob/sound/sound.cpp @@ -520,6 +520,25 @@ void Sound::cdTest(int trySubst, const char *label) { _cdrom->testCD(trySubst, label); } +void Sound::bgPlay(const char *file) { + if (!_bgatmos) + return; + + debugC(1, kDebugSound, "BackgroundAtmosphere: Playing \"%s\"", file); + + _bgatmos->stop(); + _bgatmos->queueClear(); + + SoundDesc *sndDesc = new SoundDesc; + if (!sampleLoad(sndDesc, file)) { + delete sndDesc; + return; + } + + _bgatmos->queueSample(*sndDesc); + _bgatmos->play(); +} + void Sound::bgPlay(const char *base, int count) { if (!_bgatmos) return; @@ -539,6 +558,8 @@ void Sound::bgPlay(const char *base, int count) { sndDesc = new SoundDesc; if (sampleLoad(sndDesc, fileName)) _bgatmos->queueSample(*sndDesc); + else + delete sndDesc; } _bgatmos->play(); diff --git a/engines/gob/sound/sound.h b/engines/gob/sound/sound.h index 07b5a737db..641df6eb51 100644 --- a/engines/gob/sound/sound.h +++ b/engines/gob/sound/sound.h @@ -121,6 +121,7 @@ public: // Background Atmosphere + void bgPlay(const char *file); void bgPlay(const char *base, int count); void bgStop(); diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp index e719374b5c..403fa12408 100644 --- a/engines/gob/videoplayer.cpp +++ b/engines/gob/videoplayer.cpp @@ -271,7 +271,7 @@ bool VideoPlayer::primaryOpen(const char *videoFile, int16 x, int16 y, void VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey, uint16 palCmd, int16 palStart, int16 palEnd, - int16 palFrame, int16 endFrame, bool fade, int16 reverseTo) { + int16 palFrame, int16 endFrame, bool fade, int16 reverseTo, bool forceSeek) { if (!_primaryVideo->isOpen()) return; @@ -290,7 +290,7 @@ void VideoPlayer::primaryPlay(int16 startFrame, int16 lastFrame, int16 breakKey, palCmd &= 0x3F; if (video.getCurrentFrame() != startFrame) { - if (video.getFeatures() & CoktelVideo::kFeaturesSound) + if (!forceSeek && (video.getFeatures() & CoktelVideo::kFeaturesSound)) startFrame = video.getCurrentFrame(); else video.seekFrame(startFrame); diff --git a/engines/gob/videoplayer.h b/engines/gob/videoplayer.h index 295bb62fd3..a0617ca52f 100644 --- a/engines/gob/videoplayer.h +++ b/engines/gob/videoplayer.h @@ -58,7 +58,7 @@ public: void primaryPlay(int16 startFrame = -1, int16 lastFrame = -1, int16 breakKey = 27, uint16 palCmd = 8, int16 palStart = 0, int16 palEnd = 255, int16 palFrame = -1, int16 endFrame = -1, bool fade = false, - int16 reverseTo = -1); + int16 reverseTo = -1, bool forceSeek = false); void primaryClose(); int slotOpen(const char *videoFile, Type which = kVideoTypeTry); |