aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/gui
diff options
context:
space:
mode:
authorMartin Kiewitz2009-10-11 07:54:20 +0000
committerMartin Kiewitz2009-10-11 07:54:20 +0000
commite9bedf9b979e3dcd339d7019a574ab448a68383d (patch)
tree971d3d2c8c0474b2365a706622059b254301cc7d /engines/sci/gui
parent22baa6464733fa075f9896f71bad0bea432c1fa4 (diff)
downloadscummvm-rg350-e9bedf9b979e3dcd339d7019a574ab448a68383d.tar.gz
scummvm-rg350-e9bedf9b979e3dcd339d7019a574ab448a68383d.tar.bz2
scummvm-rg350-e9bedf9b979e3dcd339d7019a574ab448a68383d.zip
SCI/newgui: Implemented kCanBeHere list processing
svn-id: r44893
Diffstat (limited to 'engines/sci/gui')
-rw-r--r--engines/sci/gui/gui.cpp10
-rw-r--r--engines/sci/gui/gui.h2
-rw-r--r--engines/sci/gui/gui_gfx.cpp29
-rw-r--r--engines/sci/gui/gui_gfx.h1
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);