diff options
-rw-r--r-- | engines/sci/graphics/gui.cpp | 2 | ||||
-rw-r--r-- | engines/sci/graphics/portrait.cpp | 22 | ||||
-rw-r--r-- | engines/sci/graphics/portrait.h | 3 |
3 files changed, 21 insertions, 6 deletions
diff --git a/engines/sci/graphics/gui.cpp b/engines/sci/graphics/gui.cpp index 5f8b86204d..1c418cbed7 100644 --- a/engines/sci/graphics/gui.cpp +++ b/engines/sci/graphics/gui.cpp @@ -843,7 +843,7 @@ reg_t SciGui::portraitLoad(Common::String resourceName) { } void SciGui::portraitShow(Common::String resourceName, Common::Point position, uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq) { - Portrait *myPortrait = new Portrait(_s->resMan, this, _screen, _palette, _audio, resourceName); + Portrait *myPortrait = new Portrait(_s->resMan, _s->_event, this, _screen, _palette, _audio, resourceName); // TODO: cache portraits // adjust given coordinates to curPort (but dont adjust coordinates on upscaledHires_Save_Box and give us hires coordinates // on kDrawCel, yeah this whole stuff makes sense) diff --git a/engines/sci/graphics/portrait.cpp b/engines/sci/graphics/portrait.cpp index f948a206cb..fc48ba981c 100644 --- a/engines/sci/graphics/portrait.cpp +++ b/engines/sci/graphics/portrait.cpp @@ -28,6 +28,7 @@ #include "graphics/primitives.h" #include "sci/sci.h" +#include "sci/event.h" #include "sci/engine/state.h" #include "sci/graphics/gui.h" #include "sci/graphics/screen.h" @@ -37,8 +38,8 @@ namespace Sci { -Portrait::Portrait(ResourceManager *resMan, SciGui *gui, Screen *screen, SciPalette *palette, AudioPlayer *audio, Common::String resourceName) - : _resMan(resMan), _gui(gui), _screen(screen), _palette(palette), _audio(audio), _resourceName(resourceName) { +Portrait::Portrait(ResourceManager *resMan, SciEvent *event, SciGui *gui, Screen *screen, SciPalette *palette, AudioPlayer *audio, Common::String resourceName) + : _resMan(resMan), _event(event), _gui(gui), _screen(screen), _palette(palette), _audio(audio), _resourceName(resourceName) { init(); } @@ -154,7 +155,10 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint // TODO: This whole mess doesnt seem to be correct currently uint16 syncCue; int timerPosition, curPosition; - while (syncOffset < syncResource->size - 2) { + sciEvent curEvent; + bool userAbort = false; + + while ((syncOffset < syncResource->size - 2) && (!userAbort)) { timerPosition = (int16)READ_LE_UINT16(syncResource->data + syncOffset); syncOffset += 2; if (syncOffset < syncResource->size - 2) { @@ -167,8 +171,9 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint // Wait till syncTime passed, then show specific animation bitmap do { _gui->wait(1); + curEvent = _event->get(SCI_EVENT_ANY); curPosition = _audio->getAudioPosition(); - } while ((curPosition != -1) && (curPosition < timerPosition)); + } while ((curPosition != -1) && (curPosition < timerPosition) && (curEvent.type == SCI_EVENT_NONE)); if (syncCue != 0xFFFF) { // Display animation bitmap @@ -181,8 +186,17 @@ void Portrait::doit(Common::Point position, uint16 resourceId, uint16 noun, uint warning("kPortrait: sync information tried to draw non-existant %d", syncCue); } } + + switch (curEvent.type) { + case SCI_EVENT_MOUSE_RELEASE: + case SCI_EVENT_MOUSE_PRESS: + userAbort = true; + } } + if (userAbort) + _audio->stopAudio(); + _resMan->unlockResource(syncResource); } diff --git a/engines/sci/graphics/portrait.h b/engines/sci/graphics/portrait.h index 347f564f33..27b055d1e1 100644 --- a/engines/sci/graphics/portrait.h +++ b/engines/sci/graphics/portrait.h @@ -37,7 +37,7 @@ struct PortraitBitmap { class Portrait { public: - Portrait(ResourceManager *resMan, SciGui *gui, Screen *screen, SciPalette *palette, AudioPlayer *audio, Common::String resourceName); + Portrait(ResourceManager *resMan, SciEvent *event, SciGui *gui, Screen *screen, SciPalette *palette, AudioPlayer *audio, Common::String resourceName); ~Portrait(); void setupAudio(uint16 resourceId, uint16 noun, uint16 verb, uint16 cond, uint16 seq); @@ -49,6 +49,7 @@ private: void bitsShow(); ResourceManager *_resMan; + SciEvent *_event; SciGui *_gui; Screen *_screen; SciPalette *_palette; |