diff options
-rw-r--r-- | engines/illusions/duckman/scriptopcodes_duckman.cpp | 2 | ||||
-rw-r--r-- | engines/illusions/illusions.cpp | 39 |
2 files changed, 39 insertions, 2 deletions
diff --git a/engines/illusions/duckman/scriptopcodes_duckman.cpp b/engines/illusions/duckman/scriptopcodes_duckman.cpp index ad6ec9d6a7..c864728062 100644 --- a/engines/illusions/duckman/scriptopcodes_duckman.cpp +++ b/engines/illusions/duckman/scriptopcodes_duckman.cpp @@ -578,7 +578,7 @@ void ScriptOpcodes_Duckman::opPlayVideo(ScriptThread *scriptThread, OpCall &opCa ARG_SKIP(2); ARG_UINT32(objectId); // NOTE This has no attached objectId or priority - // TODO _vm->playVideo(videoId, objectId, value, opCall._threadId); + _vm->playVideo(0, objectId, 0, opCall._threadId); //DEBUG Resume calling thread, later done by the video player _vm->notifyThreadId(opCall._threadId); diff --git a/engines/illusions/illusions.cpp b/engines/illusions/illusions.cpp index 79570012c0..9224ba9139 100644 --- a/engines/illusions/illusions.cpp +++ b/engines/illusions/illusions.cpp @@ -45,6 +45,8 @@ #include "illusions/threads/talkthread.h" #include "audio/audiostream.h" +#include "video/video_decoder.h" +#include "video/avi_decoder.h" #include "common/config-manager.h" #include "common/debug-channels.h" #include "common/error.h" @@ -260,7 +262,42 @@ bool IllusionsEngine::calcPointDirection(Common::Point &srcPt, Common::Point &ds } void IllusionsEngine::playVideo(uint32 videoId, uint32 objectId, uint32 priority, uint32 threadId) { - // TODO + Video::VideoDecoder *videoDecoder = new Video::AVIDecoder(); + Common::String filename = Common::String::format("%08X.AVI", objectId); + if (!videoDecoder->loadFile(filename)) { + delete videoDecoder; + warning("Unable to open video %s", filename.c_str()); + return; + } + + videoDecoder->start(); + + bool skipVideo = false; + + while (!shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { + if (videoDecoder->needsUpdate()) { + const Graphics::Surface *frame = videoDecoder->decodeNextFrame(); + if (videoDecoder->hasDirtyPalette()) { + const byte *palette = videoDecoder->getPalette(); + _system->getPaletteManager()->setPalette(palette, 0, 256); + } + + if (frame) { + _system->copyRectToScreen(frame->getPixels(), frame->pitch, 0, 0, frame->w, frame->h); + _system->updateScreen(); + } + } + + Common::Event event; + while (_eventMan->pollEvent(event)) { + if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || + event.type == Common::EVENT_LBUTTONUP) + skipVideo = true; + } + } + + videoDecoder->close(); + delete videoDecoder; } bool IllusionsEngine::isSoundActive() { |