diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/gob/inter.h | 1 | ||||
-rw-r--r-- | engines/gob/inter_v7.cpp | 131 |
2 files changed, 132 insertions, 0 deletions
diff --git a/engines/gob/inter.h b/engines/gob/inter.h index 93fcd1e5ca..4557d83437 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -607,6 +607,7 @@ protected: void o7_intToString(); void o7_callFunction(); void o7_loadFunctions(); + void o7_playVmdOrMusic(); void o7_draw0x89(); void o7_findFile(); void o7_getSystemProperty(); diff --git a/engines/gob/inter_v7.cpp b/engines/gob/inter_v7.cpp index b718a26998..b4ef4caa75 100644 --- a/engines/gob/inter_v7.cpp +++ b/engines/gob/inter_v7.cpp @@ -34,6 +34,8 @@ #include "gob/game.h" #include "gob/script.h" #include "gob/expression.h" +#include "gob/videoplayer.h" +#include "gob/sound/sound.h" namespace Gob { @@ -55,6 +57,7 @@ void Inter_v7::setupOpcodesDraw() { OPCODEDRAW(0x57, o7_intToString); OPCODEDRAW(0x59, o7_callFunction); OPCODEDRAW(0x5A, o7_loadFunctions); + OPCODEDRAW(0x83, o7_playVmdOrMusic); OPCODEDRAW(0x89, o7_draw0x89); OPCODEDRAW(0x8A, o7_findFile); OPCODEDRAW(0x8C, o7_getSystemProperty); @@ -153,6 +156,134 @@ void Inter_v7::o7_loadFunctions() { _vm->_game->loadFunctions(tot, flags); } +void Inter_v7::o7_playVmdOrMusic() { + Common::String file = _vm->_game->_script->evalString(); + + VideoPlayer::Properties props; + + props.x = _vm->_game->_script->readValExpr(); + props.y = _vm->_game->_script->readValExpr(); + props.startFrame = _vm->_game->_script->readValExpr(); + props.lastFrame = _vm->_game->_script->readValExpr(); + props.breakKey = _vm->_game->_script->readValExpr(); + props.flags = _vm->_game->_script->readValExpr(); + props.palStart = _vm->_game->_script->readValExpr(); + props.palEnd = _vm->_game->_script->readValExpr(); + props.palCmd = 1 << (props.flags & 0x3F); + props.forceSeek = true; + + debugC(1, kDebugVideo, "Playing video \"%s\" @ %d+%d, frames %d - %d, " + "paletteCmd %d (%d - %d), flags %X", file.c_str(), + props.x, props.y, props.startFrame, props.lastFrame, + props.palCmd, props.palStart, props.palEnd, props.flags); + + if (file == "RIEN") { + _vm->_vidPlayer->closeAll(); + return; + } + + bool close = false; + if (props.lastFrame == -1) { + close = true; + } else if (props.lastFrame == -3) { + + if (file.empty()) { + _vm->_vidPlayer->closeVideo(_vm->_mult->_objects[props.startFrame].videoSlot - 1); + _vm->_mult->_objects[props.startFrame].videoSlot = 0; + return; + } + + props.flags = VideoPlayer::kFlagOtherSurface; + props.sprite = -1; + + _vm->_mult->_objects[props.startFrame].pAnimData->animation = -props.startFrame - 1; + + if (_vm->_mult->_objects[props.startFrame].videoSlot > 0) + _vm->_vidPlayer->closeVideo(_vm->_mult->_objects[props.startFrame].videoSlot - 1); + + uint32 x = props.x; + uint32 y = props.y; + + int slot = _vm->_vidPlayer->openVideo(false, file, props); + + _vm->_mult->_objects[props.startFrame].videoSlot = slot + 1; + + if (x == 0xFFFFFFFF) { + *_vm->_mult->_objects[props.startFrame].pPosX = _vm->_vidPlayer->getDefaultX(slot); + *_vm->_mult->_objects[props.startFrame].pPosY = _vm->_vidPlayer->getDefaultY(slot); + } else { + *_vm->_mult->_objects[props.startFrame].pPosX = x; + *_vm->_mult->_objects[props.startFrame].pPosY = y; + } + + return; + } else if (props.lastFrame == -4) { + warning("Woodruff Stub: Video/Music command -4: Play background video %s", file.c_str()); + return; + } else if (props.lastFrame == -5) { +// warning("Urban/Playtoons Stub: Stop without delay"); + _vm->_sound->bgStop(); + return; + } else if (props.lastFrame == -6) { +// warning("Urban/Playtoons Stub: Video/Music command -6 (cache video)"); + return; + } else if (props.lastFrame == -7) { +// warning("Urban/Playtoons Stub: Video/Music command -6 (flush cache)"); + return; + } else if ((props.lastFrame == -8) || (props.lastFrame == -9)) { + if (!file.contains('.')) + file += ".WA8"; + + probe16bitMusic(file); + + if (props.lastFrame == -9) + debugC(0, kDebugVideo, "Urban/Playtoons Stub: Delayed music stop?"); + + _vm->_sound->bgStop(); + _vm->_sound->bgPlay(file.c_str(), SOUND_WAV); + return; + } else if (props.lastFrame <= -10) { + _vm->_vidPlayer->closeVideo(); + + if (!(props.flags & VideoPlayer::kFlagNoVideo)) + props.loop = true; + + } else if (props.lastFrame < 0) { + warning("Urban/Playtoons Stub: Unknown Video/Music command: %d, %s", props.lastFrame, file.c_str()); + return; + } + + if (props.startFrame == -2) { + props.startFrame = 0; + props.lastFrame = -1; + props.noBlock = true; + } + + _vm->_vidPlayer->evaluateFlags(props); + + bool primary = true; + if (props.noBlock && (props.flags & VideoPlayer::kFlagNoVideo)) + primary = false; + + int slot = 0; + if (!file.empty() && ((slot = _vm->_vidPlayer->openVideo(primary, file, props)) < 0)) { + WRITE_VAR(11, (uint32) -1); + return; + } + + if (props.hasSound) + _vm->_vidPlayer->closeLiveSound(); + + if (props.startFrame >= 0) + _vm->_vidPlayer->play(slot, props); + + if (close && !props.noBlock) { + if (!props.canceled) + _vm->_vidPlayer->waitSoundEnd(slot); + _vm->_vidPlayer->closeVideo(slot); + } + +} void Inter_v7::o7_draw0x89() { Common::String str0 = _vm->_game->_script->evalString(); Common::String str1 = _vm->_game->_script->evalString(); |