aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/graphics/gui.cpp2
-rw-r--r--engines/sci/graphics/portrait.cpp22
-rw-r--r--engines/sci/graphics/portrait.h3
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;