diff options
author | Colin Snover | 2016-03-10 15:48:48 -0600 |
---|---|---|
committer | Colin Snover | 2016-03-10 18:28:53 -0600 |
commit | 8dea7400860270b23df210486a2eadb31194f898 (patch) | |
tree | de5ead61f0ada1ea6d4df566eda9b10ca7f34b87 /engines/sci | |
parent | 3ffd8dedd2f2f46690b2b42490bf7e6adc21d3fc (diff) | |
download | scummvm-rg350-8dea7400860270b23df210486a2eadb31194f898.tar.gz scummvm-rg350-8dea7400860270b23df210486a2eadb31194f898.tar.bz2 scummvm-rg350-8dea7400860270b23df210486a2eadb31194f898.zip |
SCI32: Implement kMovePlaneItems
Diffstat (limited to 'engines/sci')
-rw-r--r-- | engines/sci/engine/kernel.h | 1 | ||||
-rw-r--r-- | engines/sci/engine/kernel_tables.h | 6 | ||||
-rw-r--r-- | engines/sci/engine/kgraphics32.cpp | 10 | ||||
-rw-r--r-- | engines/sci/graphics/frameout.cpp | 27 | ||||
-rw-r--r-- | engines/sci/graphics/frameout.h | 1 | ||||
-rw-r--r-- | engines/sci/graphics/plane32.cpp | 14 | ||||
-rw-r--r-- | engines/sci/graphics/plane32.h | 7 |
7 files changed, 63 insertions, 3 deletions
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 6feaeb865b..b992e9742e 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -479,6 +479,7 @@ reg_t kBitmapCreateFromUnknown(EngineState *s, int argc, reg_t *argv); reg_t kAddPlane(EngineState *s, int argc, reg_t *argv); reg_t kDeletePlane(EngineState *s, int argc, reg_t *argv); reg_t kUpdatePlane(EngineState *s, int argc, reg_t *argv); +reg_t kMovePlaneItems(EngineState *s, int argc, reg_t *argv); reg_t kSetShowStyle(EngineState *s, int argc, reg_t *argv); reg_t kSetPalStyleRange(EngineState *s, int argc, reg_t *argv); reg_t kGetHighPlanePri(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index a0ae627cff..e49c6b4015 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -772,9 +772,9 @@ static SciKernelMapEntry s_kernelMap[] = { // <lskovlun> The idea, if I understand correctly, is that the engine generates events // of a special HotRect type continuously when the mouse is on that rectangle - // MovePlaneItems - used by SQ6 to scroll through the inventory via the up/down buttons - // SetPalStyleRange - 2 integer parameters, start and end. All styles from start-end - // (inclusive) are set to 0 + // Used by SQ6 to scroll through the inventory via the up/down buttons + { MAP_CALL(MovePlaneItems), SIG_SINCE_SCI21, SIGFOR_ALL, "oii(i)", NULL, NULL }, + { MAP_CALL(SetPalStyleRange), SIG_EVERYWHERE, "ii", NULL, NULL }, { MAP_CALL(MorphOn), SIG_EVERYWHERE, "", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 06a3336da2..93d5ca5ee9 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -106,6 +106,16 @@ reg_t kDeletePlane(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } +reg_t kMovePlaneItems(EngineState *s, int argc, reg_t *argv) { + const reg_t plane = argv[0]; + const int16 deltaX = argv[1].toSint16(); + const int16 deltaY = argv[2].toSint16(); + const bool scrollPics = argc > 3 ? argv[3].toUint16() : false; + + g_sci->_gfxFrameout->kernelMovePlaneItems(plane, deltaX, deltaY, scrollPics); + return NULL_REG; +} + reg_t kAddPicAt(EngineState *s, int argc, reg_t *argv) { reg_t planeObj = argv[0]; GuiResourceId pictureId = argv[1].toUint16(); diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 78e61b9e34..cf4000d9a5 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -381,6 +381,33 @@ void GfxFrameout::deletePlane(Plane &planeToFind) { } } +void GfxFrameout::kernelMovePlaneItems(const reg_t object, const int16 deltaX, const int16 deltaY, const bool scrollPics) { + Plane *plane = _planes.findByObject(object); + if (plane == nullptr) { + error("Invalid plane %04x:%04x", PRINT_REG(object)); + } + + plane->scrollScreenItems(deltaX, deltaY, scrollPics); + + for (ScreenItemList::iterator it = plane->_screenItemList.begin(); it != plane->_screenItemList.end(); ++it) { + ScreenItem &screenItem = **it; + + // If object is a number, the screen item from the + // engine, not a script, and should be ignored + if (screenItem._object.isNumber()) { + continue; + } + + if (deltaX != 0) { + writeSelectorValue(_segMan, screenItem._object, SELECTOR(x), readSelectorValue(_segMan, screenItem._object, SELECTOR(x)) + deltaX); + } + + if (deltaY != 0) { + writeSelectorValue(_segMan, screenItem._object, SELECTOR(y), readSelectorValue(_segMan, screenItem._object, SELECTOR(y)) + deltaY); + } + } +} + int16 GfxFrameout::kernelGetHighPlanePri() { return _planes.getTopSciPlanePriority(); } diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h index 969123f4d3..22c0e14829 100644 --- a/engines/sci/graphics/frameout.h +++ b/engines/sci/graphics/frameout.h @@ -294,6 +294,7 @@ public: void kernelAddPlane(const reg_t object); void kernelUpdatePlane(const reg_t object); void kernelDeletePlane(const reg_t object); + void kernelMovePlaneItems(const reg_t object, const int16 deltaX, const int16 deltaY, const bool scrollPics); int16 kernelGetHighPlanePri(); #pragma mark - diff --git a/engines/sci/graphics/plane32.cpp b/engines/sci/graphics/plane32.cpp index 04cfa5a556..099d4dd8c4 100644 --- a/engines/sci/graphics/plane32.cpp +++ b/engines/sci/graphics/plane32.cpp @@ -798,6 +798,20 @@ void Plane::update(const reg_t object) { _back = readSelectorValue(segMan, object, SELECTOR(back)); } +void Plane::scrollScreenItems(const int16 deltaX, const int16 deltaY, const bool scrollPics) { + _redrawAllCount = g_sci->_gfxFrameout->getScreenCount(); + + for (ScreenItemList::iterator it = _screenItemList.begin(); it != _screenItemList.end(); ++it) { + if (*it != nullptr) { + ScreenItem &screenItem = **it; + if (!screenItem._deleted && (screenItem._celInfo.type != kCelTypePic || scrollPics)) { + screenItem._position.x += deltaX; + screenItem._position.y += deltaY; + } + } + } +} + #pragma mark - #pragma mark PlaneList void PlaneList::add(Plane *plane) { diff --git a/engines/sci/graphics/plane32.h b/engines/sci/graphics/plane32.h index d844919c9e..51d93b78a5 100644 --- a/engines/sci/graphics/plane32.h +++ b/engines/sci/graphics/plane32.h @@ -303,6 +303,13 @@ public: */ void update(const reg_t object); + /** + * Modifies the position of all non-pic screen items + * by the given delta. If `scrollPics` is true, pic + * items are also repositioned. + */ + void scrollScreenItems(const int16 deltaX, const int16 deltaY, const bool scrollPics); + #pragma mark - #pragma mark Plane - Pic private: |