diff options
Diffstat (limited to 'engines/sci/gui')
-rw-r--r-- | engines/sci/gui/gui.cpp | 10 | ||||
-rw-r--r-- | engines/sci/gui/gui.h | 2 | ||||
-rw-r--r-- | engines/sci/gui/gui_gfx.cpp | 29 | ||||
-rw-r--r-- | engines/sci/gui/gui_gfx.h | 1 |
4 files changed, 37 insertions, 5 deletions
diff --git a/engines/sci/gui/gui.cpp b/engines/sci/gui/gui.cpp index e4c1191f51..5cd5ee5119 100644 --- a/engines/sci/gui/gui.cpp +++ b/engines/sci/gui/gui.cpp @@ -54,7 +54,7 @@ SciGui::SciGui(EngineState *state, SciGuiScreen *screen, SciGuiPalette *palette, _gfx = new SciGuiGfx(_s, _screen, _palette); _windowMgr = new SciGuiWindowMgr(_s, _screen, _gfx); - // _gui32 = new SciGui32(_s, _screen, _palette, _cursor); // for debug purposes +// _gui32 = new SciGui32(_s, _screen, _palette, _cursor); // for debug purposes } SciGui::SciGui() { @@ -429,10 +429,8 @@ void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) { _gfx->AnimateDisposeLastCast(); _gfx->AnimateMakeSortedList(list); - _gfx->AnimateFill(old_picNotValid); - // _gfx->AnimateSort(); if (old_picNotValid) { _windowMgr->BeginUpdate(_windowMgr->_picWind); _gfx->AnimateUpdate(); @@ -492,7 +490,11 @@ bool SciGui::canBeHere(reg_t curObject, reg_t listReference) { controlMask = GET_SEL32V(curObject, illegalBits); result = (_gfx->onControl(SCI_SCREEN_MASK_CONTROL, checkRect) & controlMask) ? false : true; if ((!result) && (signal & (SCI_ANIMATE_SIGNAL_IGNOREACTOR | SCI_ANIMATE_SIGNAL_REMOVEVIEW))) { - result = true; + List *list = _s->_segMan->lookupList(listReference); + if (!list) + error("kCanBeHere called with non-list as parameter"); + + result = _gfx->CanBeHereCheckRectList(curObject, checkRect, list); } _gfx->SetPort(oldPort); return result; diff --git a/engines/sci/gui/gui.h b/engines/sci/gui/gui.h index fd2ecbc8dd..246bb1d167 100644 --- a/engines/sci/gui/gui.h +++ b/engines/sci/gui/gui.h @@ -113,7 +113,7 @@ private: SciGuiresources *_resources; SciGuiWindowMgr *_windowMgr; - // SciGui32 *_gui32; // for debug purposes +// SciGui32 *_gui32; // for debug purposes }; } // End of namespace Sci diff --git a/engines/sci/gui/gui_gfx.cpp b/engines/sci/gui/gui_gfx.cpp index 0292860e59..bedffac9e2 100644 --- a/engines/sci/gui/gui_gfx.cpp +++ b/engines/sci/gui/gui_gfx.cpp @@ -1200,6 +1200,35 @@ void SciGuiGfx::AddToPicDrawView(GuiResourceId viewId, GuiViewLoopNo loopNo, Gui drawCel(viewId, loopNo, celNo, celRect.left, celRect.top, priority, 0); } +bool SciGuiGfx::CanBeHereCheckRectList(reg_t checkObject, Common::Rect checkRect, List *list) { + SegManager *segMan = _s->_segMan; + reg_t curAddress = list->first; + Node *curNode = _s->_segMan->lookupNode(curAddress); + reg_t curObject; + uint16 signal; + Common::Rect curRect; + + while (curNode) { + curObject = curNode->value; + if (curObject != checkObject) { + signal = GET_SEL32V(curObject, signal); + if ((signal & (SCI_ANIMATE_SIGNAL_IGNOREACTOR | SCI_ANIMATE_SIGNAL_REMOVEVIEW | SCI_ANIMATE_SIGNAL_NOUPDATE)) == 0) { + curRect.left = GET_SEL32V(curObject, brLeft); + curRect.top = GET_SEL32V(curObject, brTop); + curRect.right = GET_SEL32V(curObject, brRight); + curRect.bottom = GET_SEL32V(curObject, brBottom); + // Check if curRect is within checkRect + if (curRect.right > checkRect.left && curRect.left < checkRect.right && curRect.bottom > checkRect.top && curRect.top < checkRect.bottom) { + return false; + } + } + } + curAddress = curNode->succ; + curNode = _s->_segMan->lookupNode(curAddress); + } + return true; +} + void SciGuiGfx::SetNowSeen(reg_t objectReference) { SegManager *segMan = _s->_segMan; SciGuiView *view = NULL; diff --git a/engines/sci/gui/gui_gfx.h b/engines/sci/gui/gui_gfx.h index 93b3da25b2..be20bbb396 100644 --- a/engines/sci/gui/gui_gfx.h +++ b/engines/sci/gui/gui_gfx.h @@ -123,6 +123,7 @@ public: void AnimateRestoreAndDelete(int argc, reg_t *argv); void AddToPicDrawCels(List *list); void AddToPicDrawView(GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo celNo, int16 leftPos, int16 topPos, int16 priority, int16 control); + bool CanBeHereCheckRectList(reg_t checkObject, Common::Rect checkRect, List *list); void SetNowSeen(reg_t objectReference); |