aboutsummaryrefslogtreecommitdiff
path: root/queen
diff options
context:
space:
mode:
authorGregory Montoir2004-04-06 20:15:19 +0000
committerGregory Montoir2004-04-06 20:15:19 +0000
commit4fef6d8972cf34f0c6ea709b801183df65757b7f (patch)
treef4526de9e07783078bfe48de7cf5ce9ab4039e14 /queen
parent36d667b2b599a8c58c7e0d52e47afc2a3f828ea0 (diff)
downloadscummvm-rg350-4fef6d8972cf34f0c6ea709b801183df65757b7f.tar.gz
scummvm-rg350-4fef6d8972cf34f0c6ea709b801183df65757b7f.tar.bz2
scummvm-rg350-4fef6d8972cf34f0c6ea709b801183df65757b7f.zip
fix for bug #928549.
Animations on objects/persons setup by cutaways can still be played after the end of the cutscene. (the only ?) one room in which this is reproducable is the first time you talk to the Oracle (first c44, then c47). As a Cutaway object is created for each cutscene, the _cutAnim member should be moved to an more "persistant" object. Otherwise we're reading data from free'd memory... svn-id: r13488
Diffstat (limited to 'queen')
-rw-r--r--queen/cutaway.cpp22
-rw-r--r--queen/cutaway.h2
-rw-r--r--queen/graphics.cpp7
-rw-r--r--queen/graphics.h5
4 files changed, 20 insertions, 16 deletions
diff --git a/queen/cutaway.cpp b/queen/cutaway.cpp
index 57633b7522..bb12e390f6 100644
--- a/queen/cutaway.cpp
+++ b/queen/cutaway.cpp
@@ -1229,23 +1229,20 @@ void Cutaway::talk(char *nextFilename) {
int Cutaway::makeComplexAnimation(int16 currentImage, Cutaway::CutawayAnim *objAnim, int frameCount) {
int frameIndex[256];
int i;
- int bobNum = objAnim[0].object;
- assert(bobNum < 21);
+ assert(frameCount < 30);
+ AnimFrame cutAnim[30];
memset(frameIndex, 0, sizeof(frameIndex));
debug(6, "[Cutaway::makeComplexAnimation] currentImage = %i", currentImage);
- BobSlot *bob = _vm->graphics()->bob(bobNum);
- bob->xflip = objAnim[0].flip;
-
for (i = 0; i < frameCount; i++) {
- _cutAnim[bobNum][i].frame = objAnim[i].unpackFrame;
- _cutAnim[bobNum][i].speed = objAnim[i].speed;
+ cutAnim[i].frame = objAnim[i].unpackFrame;
+ cutAnim[i].speed = objAnim[i].speed;
frameIndex[objAnim[i].unpackFrame] = 1;
}
- _cutAnim[bobNum][frameCount].frame = 0;
- _cutAnim[bobNum][frameCount].speed = 0;
+ cutAnim[frameCount].frame = 0;
+ cutAnim[frameCount].speed = 0;
int nextFrameIndex = 1;
@@ -1254,20 +1251,17 @@ int Cutaway::makeComplexAnimation(int16 currentImage, Cutaway::CutawayAnim *objA
frameIndex[i] = nextFrameIndex++;
for (i = 0; i < frameCount; i++) {
- _cutAnim[bobNum][i].frame = currentImage + frameIndex[objAnim[i].unpackFrame];
- //debug(6, "_cutAnim[%i][%i].frame = %i", bobNum, i, _cutAnim[bobNum][i].frame);
+ cutAnim[i].frame = currentImage + frameIndex[objAnim[i].unpackFrame];
}
for (i = 1; i < 256; i++) {
if (frameIndex[i]) {
currentImage++;
- //debug(6, "bankUnpack(%i, %i, %i)", i, currentImage, objAnim[0].bank);
_vm->bankMan()->unpack(i, currentImage, objAnim[0].bank);
}
}
- bob->animString(_cutAnim[bobNum]);
-
+ _vm->graphics()->setBobCutawayAnim(objAnim[0].object, objAnim[0].flip, cutAnim, frameCount + 1);
return currentImage;
}
diff --git a/queen/cutaway.h b/queen/cutaway.h
index 04d2c236ee..68411a63d9 100644
--- a/queen/cutaway.h
+++ b/queen/cutaway.h
@@ -194,8 +194,6 @@ class Cutaway {
int16 _currentImage;
- AnimFrame _cutAnim[21][30];
-
Cutaway(const char *filename,
QueenEngine *vm);
~Cutaway();
diff --git a/queen/graphics.cpp b/queen/graphics.cpp
index 22ebf7de3f..a9dcebfd6b 100644
--- a/queen/graphics.cpp
+++ b/queen/graphics.cpp
@@ -600,6 +600,13 @@ void Graphics::setupNewRoom(const char *room, uint16 roomNum, int16 *furniture,
}
}
+void Graphics::setBobCutawayAnim(uint16 bobNum, bool xflip, const AnimFrame *af, uint8 frameCount) {
+ assert(bobNum < 21 && frameCount < 30);
+ memcpy(_cutAnim[bobNum], af, sizeof(AnimFrame) * frameCount);
+ _bobs[bobNum].xflip = xflip;
+ _bobs[bobNum].animString(_cutAnim[bobNum]);
+}
+
void Graphics::fillAnimBuffer(const char *anim, AnimFrame *af) {
for (;;) {
// anim frame format is "%3hu,%3hu," (frame number, frame speed)
diff --git a/queen/graphics.h b/queen/graphics.h
index 68360bd381..1e54ccd49f 100644
--- a/queen/graphics.h
+++ b/queen/graphics.h
@@ -115,6 +115,7 @@ public:
void setupNewRoom(const char *room, uint16 roomNum, int16 *furniture, uint16 furnitureCount);
+ void setBobCutawayAnim(uint16 bobNum, bool xflip, const AnimFrame *af, uint8 frameCount);
void fillAnimBuffer(const char *anim, AnimFrame *af);
uint16 countAnimFrames(const char *anim);
void setupObjectAnim(const GraphicData *gd, uint16 firstImage, uint16 bobNum, bool visible);
@@ -165,8 +166,12 @@ private:
//! used to scale a BobFrame
BobFrame _shrinkBuffer;
+ //! in-game objects/persons animations
AnimFrame _newAnim[17][30];
+ //! cutaway objects/persons animations
+ AnimFrame _cutAnim[21][30];
+
uint16 _personFrames[4];
//! Number of animated furniture in current room