aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/graphics/transitions32.cpp60
-rw-r--r--engines/sci/graphics/transitions32.h8
2 files changed, 64 insertions, 4 deletions
diff --git a/engines/sci/graphics/transitions32.cpp b/engines/sci/graphics/transitions32.cpp
index 8f18a60971..df9c2da82b 100644
--- a/engines/sci/graphics/transitions32.cpp
+++ b/engines/sci/graphics/transitions32.cpp
@@ -320,6 +320,9 @@ void GfxTransitions32::kernelSetShowStyle(const uint16 argc, const reg_t planeOb
case kShowStyleWipeRight:
configure21EarlyHorizontalWipe(*entry, priority);
break;
+ case kShowStyleHShutterOut:
+ configure21EarlyHorizontalShutter(*entry, priority);
+ break;
case kShowStyleIrisOut:
case kShowStyleIrisIn:
configure21EarlyIris(*entry, priority);
@@ -382,6 +385,7 @@ ShowStyleList::iterator GfxTransitions32::deleteShowStyle(const ShowStyleList::i
case kShowStyleWipeRight:
case kShowStyleIrisOut:
case kShowStyleIrisIn:
+ case kShowStyleHShutterOut:
if (getSciVersion() <= SCI_VERSION_2_1_EARLY) {
for (uint i = 0; i < showStyle->screenItems.size(); ++i) {
ScreenItem *screenItem = showStyle->screenItems[i];
@@ -436,6 +440,47 @@ void GfxTransitions32::configure21EarlyHorizontalWipe(PlaneShowStyle &showStyle,
}
}
+void GfxTransitions32::configure21EarlyHorizontalShutter(PlaneShowStyle &showStyle, const int16 priority) {
+ showStyle.numEdges = 2;
+ const int numScreenItems = showStyle.numEdges * showStyle.divisions;
+ showStyle.screenItems.reserve(numScreenItems);
+
+ CelInfo32 celInfo;
+ celInfo.type = kCelTypeColor;
+ celInfo.color = showStyle.color;
+
+ const int width = showStyle.width;
+ const int divisions = showStyle.divisions;
+
+ for (int i = 0; i < divisions; ++i) {
+ Common::Rect rect;
+
+ // Left
+ rect.top = 0;
+ rect.right = (width + 1) * (i + 1) / (2 * divisions);
+ rect.bottom = showStyle.height;
+ const int16 leftLeft = rect.left;
+
+ showStyle.screenItems.push_back(new ScreenItem(showStyle.plane, celInfo, rect));
+ showStyle.screenItems.back()->_priority = priority;
+ showStyle.screenItems.back()->_fixedPriority = true;
+
+ // Right
+ rect.left = width - rect.right;
+ rect.right = width - leftLeft;
+
+ showStyle.screenItems.push_back(new ScreenItem(showStyle.plane, celInfo, rect));
+ showStyle.screenItems.back()->_priority = priority;
+ showStyle.screenItems.back()->_fixedPriority = true;
+ }
+
+ if (showStyle.fadeUp) {
+ for (int i = 0; i < numScreenItems; ++i) {
+ g_sci->_gfxFrameout->addScreenItem(*showStyle.screenItems[i]);
+ }
+ }
+}
+
void GfxTransitions32::configure21EarlyIris(PlaneShowStyle &showStyle, const int16 priority) {
showStyle.numEdges = 4;
const int numScreenItems = showStyle.numEdges * showStyle.divisions;
@@ -532,7 +577,6 @@ bool GfxTransitions32::processShowStyle(PlaneShowStyle &showStyle, uint32 now) {
default:
case kShowStyleNone:
return processNone(showStyle);
- case kShowStyleHShutterOut:
case kShowStyleHShutterIn:
case kShowStyleVShutterOut:
case kShowStyleVShutterIn:
@@ -541,6 +585,12 @@ bool GfxTransitions32::processShowStyle(PlaneShowStyle &showStyle, uint32 now) {
case kShowStyleDissolveNoMorph:
case kShowStyleMorph:
return processMorph(showStyle);
+ case kShowStyleHShutterOut:
+ if (getSciVersion() > SCI_VERSION_2_1_EARLY) {
+ return processMorph(showStyle);
+ } else {
+ return processHShutterOut(showStyle);
+ }
case kShowStyleWipeLeft:
if (getSciVersion() > SCI_VERSION_2_1_EARLY) {
return processMorph(showStyle);
@@ -589,8 +639,12 @@ bool GfxTransitions32::processNone(PlaneShowStyle &showStyle) {
return true;
}
-void GfxTransitions32::processHShutterOut(PlaneShowStyle &showStyle) {
- error("HShutterOut is not known to be used by any game. Please submit a bug report with details about the game you were playing and what you were doing that triggered this error. Thanks!");
+bool GfxTransitions32::processHShutterOut(PlaneShowStyle &showStyle) {
+ if (getSciVersion() > SCI_VERSION_2_1_EARLY) {
+ error("HShutterOut is not known to be used by any game. Please submit a bug report with details about the game you were playing and what you were doing that triggered this error. Thanks!");
+ }
+
+ return processWipe(-1, showStyle);
}
void GfxTransitions32::processHShutterIn(const PlaneShowStyle &showStyle) {
diff --git a/engines/sci/graphics/transitions32.h b/engines/sci/graphics/transitions32.h
index 685012fada..c4c52283d1 100644
--- a/engines/sci/graphics/transitions32.h
+++ b/engines/sci/graphics/transitions32.h
@@ -337,6 +337,12 @@ private:
void configure21EarlyHorizontalWipe(PlaneShowStyle &showStyle, const int16 priority);
/**
+ * Initializes the given PlaneShowStyle for a
+ * horizontal shutter effect for SCI2 to 2.1early.
+ */
+ void configure21EarlyHorizontalShutter(PlaneShowStyle &showStyle, const int16 priority);
+
+ /**
* Initializes the given PlaneShowStyle for an
* iris effect for SCI2 to 2.1early.
*/
@@ -364,7 +370,7 @@ private:
* Performs a transition that renders into a room
* with a horizontal shutter effect.
*/
- void processHShutterOut(PlaneShowStyle &showStyle);
+ bool processHShutterOut(PlaneShowStyle &showStyle);
/**
* Performs a transition that renders to black