aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/gui/gui.cpp4
-rw-r--r--engines/sci/gui/gui_gfx.cpp78
-rw-r--r--engines/sci/gui/gui_gfx.h2
-rw-r--r--engines/sci/gui/gui_view.h1
4 files changed, 77 insertions, 8 deletions
diff --git a/engines/sci/gui/gui.cpp b/engines/sci/gui/gui.cpp
index befad94231..f006f0032b 100644
--- a/engines/sci/gui/gui.cpp
+++ b/engines/sci/gui/gui.cpp
@@ -377,7 +377,7 @@ int16 SciGui::onControl(byte screenMask, Common::Rect rect) {
}
void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) {
- bool old_picNotValid = _screen->_picNotValid;
+ byte old_picNotValid = _screen->_picNotValid;
if (listReference.isNull()) {
_gfx->AnimateDisposeLastCast();
@@ -398,7 +398,7 @@ void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) {
GuiPort *oldPort = _gfx->SetPort((GuiPort *)_windowMgr->_picWind);
_gfx->AnimateDisposeLastCast();
- _gfx->AnimateFill();
+ _gfx->AnimateFill(list, old_picNotValid);
// _gfx->AnimateSort();
if (old_picNotValid) {
diff --git a/engines/sci/gui/gui_gfx.cpp b/engines/sci/gui/gui_gfx.cpp
index 80f5a3807f..f76f60e74e 100644
--- a/engines/sci/gui/gui_gfx.cpp
+++ b/engines/sci/gui/gui_gfx.cpp
@@ -1068,7 +1068,15 @@ void SciGuiGfx::AnimateDisposeLastCast() {
}
enum {
- SCI_ANIMATE_SIGNAL_FROZEN = 0x0100
+ SCI_ANIMATE_MASK_STOPUPDATE = 0x0001,
+ SCI_ANIMATE_MASK_VIEWUPDATED = 0x0002,
+ SCI_ANIMATE_MASK_NOUPDATE = 0x0004,
+ SCI_ANIMATE_MASK_HIDDEN = 0x0008,
+ SCI_ANIMATE_MASK_FIXEDPRIORITY = 0x0010,
+ SCI_ANIMATE_MASK_ALWAYSUPDATE = 0x0020,
+ SCI_ANIMATE_MASK_FORCEUPDATE = 0x0040,
+ SCI_ANIMATE_MASK_REMOVEVIEW = 0x0080,
+ SCI_ANIMATE_MASK_FROZEN = 0x0100
};
void SciGuiGfx::AnimateInvoke(List *list, int argc, reg_t *argv) {
@@ -1076,12 +1084,13 @@ void SciGuiGfx::AnimateInvoke(List *list, int argc, reg_t *argv) {
reg_t curAddress = list->first;
Node *curNode = _s->_segMan->lookupNode(curAddress);
reg_t curObject;
- uint16 signal;
+ uint16 mask;
while (curNode) {
curObject = curNode->value;
- signal = GET_SEL32V(curObject, signal);
- if (!(signal & SCI_ANIMATE_SIGNAL_FROZEN)) {
+ mask = GET_SEL32V(curObject, signal);
+ if (!(mask & SCI_ANIMATE_MASK_FROZEN)) {
+ // Call .doit method of that object
invoke_selector(_s, curObject, _s->_kernel->_selectorCache.doit, kContinueOnInvalidSelector, argv, argc, __FILE__, __LINE__, 0);
// Lookup node again, since the nodetable it was in may have been reallocated
curNode = _s->_segMan->lookupNode(curAddress);
@@ -1091,7 +1100,66 @@ void SciGuiGfx::AnimateInvoke(List *list, int argc, reg_t *argv) {
}
}
-void SciGuiGfx::AnimateFill() {
+void SciGuiGfx::AnimateFill(List *list, byte &old_picNotValid) {
+ SegManager *segMan = _s->_segMan;
+ reg_t curAddress = list->first;
+ Node *curNode = _s->_segMan->lookupNode(curAddress);
+ reg_t curObject;
+ SciGuiView *view = NULL;
+ GuiResourceId viewId;
+ GuiViewLoopNo loopNo;
+ GuiViewCelNo celNo;
+ int16 x, y, priority;
+ uint16 mask;
+
+ while (curNode) {
+ curObject = curNode->value;
+
+ // Get cel data...
+ viewId = GET_SEL32V(curObject, view);
+ loopNo = GET_SEL32V(curObject, loop);
+ celNo = GET_SEL32V(curObject, cel);
+ x = GET_SEL32V(curObject, x);
+ y = GET_SEL32V(curObject, y);
+ priority = GET_SEL32V(curObject, priority);
+ mask = GET_SEL32V(curObject, signal);
+
+ // Get the corresponding view
+ view = new SciGuiView(_s->resMan, _screen, _palette, viewId);
+
+ // adjust loop and cel, if any of those is invalid
+ if (loopNo >= view->getLoopCount()) {
+ loopNo = 0;
+ PUT_SEL32V(curObject, loop, loopNo);
+ }
+ if (celNo >= view->getCelCount(loopNo)) {
+ celNo = 0;
+ PUT_SEL32V(curObject, cel, celNo);
+ }
+
+ // FIXME: this code doesnt seem to do anything useful?!?!
+ // rect = (Common::Rect *)&cobj[_objOfs[8]];
+ // res->getCelRect(curLoop, curCel, x, y, z, rect);
+ if (!(mask & SCI_ANIMATE_MASK_FIXEDPRIORITY))
+ PUT_SEL32V(curObject, priority, 0); // CoordPri(y) FIXME
+
+ if (mask & SCI_ANIMATE_MASK_NOUPDATE) {
+ if (mask & (SCI_ANIMATE_MASK_FORCEUPDATE | SCI_ANIMATE_MASK_VIEWUPDATED)
+ || (mask & SCI_ANIMATE_MASK_HIDDEN && !(mask & SCI_ANIMATE_MASK_REMOVEVIEW))
+ || (!(mask & SCI_ANIMATE_MASK_HIDDEN) && mask & SCI_ANIMATE_MASK_REMOVEVIEW)
+ || (mask & SCI_ANIMATE_MASK_ALWAYSUPDATE))
+ old_picNotValid++;
+ mask &= 0xFFFF ^ SCI_ANIMATE_MASK_STOPUPDATE;
+ } else {
+ if (mask & SCI_ANIMATE_MASK_STOPUPDATE || mask & SCI_ANIMATE_MASK_ALWAYSUPDATE)
+ old_picNotValid++;
+ mask &= 0xFFFF ^ SCI_ANIMATE_MASK_FORCEUPDATE;
+ }
+ PUT_SEL32V(curObject, signal, mask);
+
+ curAddress = curNode->succ;
+ curNode = _s->_segMan->lookupNode(curAddress);
+ }
}
Common::List<GuiAnimateList> *SciGuiGfx::AnimateMakeSortedList(List *list) {
diff --git a/engines/sci/gui/gui_gfx.h b/engines/sci/gui/gui_gfx.h
index ca00f329ba..2c355f13ad 100644
--- a/engines/sci/gui/gui_gfx.h
+++ b/engines/sci/gui/gui_gfx.h
@@ -106,7 +106,7 @@ public:
int16 onControl(uint16 screenMask, Common::Rect rect);
void AnimateDisposeLastCast();
void AnimateInvoke(List *list, int argc, reg_t *argv);
- void AnimateFill();
+ void AnimateFill(List *list, byte &oldPicNotValid);
Common::List<GuiAnimateList> *AnimateMakeSortedList(List *list);
void AnimateUpdate();
void AnimateDrawCels();
diff --git a/engines/sci/gui/gui_view.h b/engines/sci/gui/gui_view.h
index 2d0e4f723d..df6b0e75e0 100644
--- a/engines/sci/gui/gui_view.h
+++ b/engines/sci/gui/gui_view.h
@@ -59,6 +59,7 @@ public:
byte *getBitmap(GuiViewLoopNo loopNo, GuiViewCelNo celNo);
void draw(Common::Rect rect, Common::Rect clipRect, Common::Rect clipRectTranslated, GuiViewLoopNo loopNo, GuiViewCelNo celNo, byte priority, uint16 paletteNo);
uint16 getLoopCount() const { return _loopCount; }
+ uint16 getCelCount(GuiViewLoopNo loopNo) { return _loop[loopNo].celCount; }
GuiPalette *getPalette();
private: