aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/engine/kernel32.cpp30
-rw-r--r--engines/sci/gui/gui.cpp37
-rw-r--r--engines/sci/gui/gui.h7
3 files changed, 46 insertions, 28 deletions
diff --git a/engines/sci/engine/kernel32.cpp b/engines/sci/engine/kernel32.cpp
index 80f87a5ad2..0acc49311b 100644
--- a/engines/sci/engine/kernel32.cpp
+++ b/engines/sci/engine/kernel32.cpp
@@ -639,35 +639,8 @@ reg_t kSave(EngineState *s, int argc, reg_t *argv) {
reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv) {
reg_t viewObj = argv[0];
- uint16 viewId = GET_SEL32V(s->_segMan, viewObj, view);
- uint16 loopNo = GET_SEL32V(s->_segMan, viewObj, loop);
- uint16 celNo = GET_SEL32V(s->_segMan, viewObj, cel);
- uint16 leftPos = GET_SEL32V(s->_segMan, viewObj, x);
- uint16 topPos = GET_SEL32V(s->_segMan, viewObj, y);
- int16 priority = GET_SEL32V(s->_segMan, viewObj, priority);
- //int16 control = 0;
-
- // Theoretically, leftPos and topPos should be sane
- // Apparently, sometimes they're not, therefore I'm adding some sanity checks here so that
- // the hack underneath does not try and draw cels outside the screen coordinates
- if (leftPos >= (int16)s->_gui->getScreenWidth()) {
- warning("kAddScreenItem: invalid left position (%d), resetting to 0", leftPos);
- leftPos = 0;
- }
-
- if (topPos >= s->_gui->getScreenHeight()) {
- warning("kAddScreenItem: invalid top position (%d), resetting to 0", topPos);
- topPos = 0;
- }
-
- // HACK: just draw the view on screen
- if (viewId != 0xffff)
- s->_gui->drawCel(viewId, loopNo, celNo, leftPos, topPos, priority, 0);
-
- // TODO
- //warning("kAddScreenItem, object %04x:%04x, view %d, loop %d, cel %d, pri %d", PRINT_REG(viewObj), viewId, loopNo, celNo, priority);
- //s->_gui->addToPicView(viewId, loopNo, celNo, leftPos, topPos, priority, control);
+ s->_gui->addScreenItem(viewObj);
return NULL_REG;
}
@@ -767,6 +740,7 @@ reg_t kFrameOut(EngineState *s, int argc, reg_t *argv) {
// as its called right after a view is updated
// TODO
+ s->_gui->frameOut();
return NULL_REG;
}
diff --git a/engines/sci/gui/gui.cpp b/engines/sci/gui/gui.cpp
index 47d32e27c5..48f99ffa51 100644
--- a/engines/sci/gui/gui.cpp
+++ b/engines/sci/gui/gui.cpp
@@ -65,6 +65,8 @@ SciGui::SciGui(EngineState *state, SciGuiScreen *screen, SciGuiPalette *palette,
_controls = new SciGuiControls(_s->_segMan, _gfx, _text);
_menu = new SciGuiMenu(_s->_event, _s->_segMan, _gfx, _text, _screen, _cursor);
// _gui32 = new SciGui32(_s, _screen, _palette, _cursor); // for debug purposes
+
+ _screenItemCount = 0;
}
SciGui::SciGui() {
@@ -837,6 +839,41 @@ uint16 SciGui::getScreenHeight() {
return _screen->_displayHeight;
}
+void SciGui::addScreenItem(reg_t object) {
+ _screenItems.push_back(object);
+ _screenItemCount++;
+}
+
+void SciGui::frameOut() {
+ for (int itemNr = 0; itemNr < _screenItemCount; itemNr++) {
+ reg_t viewObj = _screenItems[itemNr];
+ uint16 viewId = GET_SEL32V(_s->_segMan, viewObj, view);
+ uint16 loopNo = GET_SEL32V(_s->_segMan, viewObj, loop);
+ uint16 celNo = GET_SEL32V(_s->_segMan, viewObj, cel);
+ uint16 leftPos = GET_SEL32V(_s->_segMan, viewObj, x);
+ uint16 topPos = GET_SEL32V(_s->_segMan, viewObj, y);
+ int16 priority = GET_SEL32V(_s->_segMan, viewObj, priority);
+ //int16 control = 0;
+
+ // Theoretically, leftPos and topPos should be sane
+ // Apparently, sometimes they're not, therefore I'm adding some sanity checks here so that
+ // the hack underneath does not try and draw cels outside the screen coordinates
+ if (leftPos >= getScreenWidth()) {
+ warning("kAddScreenItem: invalid left position (%d), resetting to 0", leftPos);
+ leftPos = 0;
+ }
+
+ if (topPos >= getScreenHeight()) {
+ warning("kAddScreenItem: invalid top position (%d), resetting to 0", topPos);
+ topPos = 0;
+ }
+
+ // HACK: just draw the view on screen
+ if (viewId != 0xffff)
+ drawCel(viewId, loopNo, celNo, leftPos, topPos, priority, 0);
+ }
+}
+
bool SciGui::debugUndither(bool flag) {
_screen->unditherSetState(flag);
return false;
diff --git a/engines/sci/gui/gui.h b/engines/sci/gui/gui.h
index 59f9b8b36e..2017c1b1fe 100644
--- a/engines/sci/gui/gui.h
+++ b/engines/sci/gui/gui.h
@@ -153,6 +153,10 @@ public:
virtual uint16 getScreenWidth();
virtual uint16 getScreenHeight();
+ // SCI32
+ virtual void addScreenItem(reg_t object);
+ virtual void frameOut();
+
virtual bool debugUndither(bool flag);
virtual bool debugShowMap(int mapNo);
@@ -180,6 +184,9 @@ private:
// SciGui32 *_gui32; // for debug purposes
bool _usesOldGfxFunctions;
+
+ Common::Array<reg_t> _screenItems;
+ int _screenItemCount;
};
} // End of namespace Sci