[Scummvm-git-logs] scummvm master -> 6919e5f7384f31298697dd71ddd130b7fd86ce0f

neuromancer noreply at scummvm.org
Wed Sep 23 19:54:41 UTC 2026


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
c2258a46c3 FREESCAPE: workaround to avoid breaking the CI build with a repeated module name
6919e5f738 EEM: added missing spotlight animation in the intro sequence for eem1 mac (cd)


Commit: c2258a46c399bbed3ea65a126a58b04086b9ebac
    https://github.com/scummvm/scummvm/commit/c2258a46c399bbed3ea65a126a58b04086b9ebac
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-23T21:53:11+02:00

Commit Message:
FREESCAPE: workaround to avoid breaking the CI build with a repeated module name

Changed paths:
  A engines/freescape/detection_zx_tape.cpp
    engines/freescape/module.mk


diff --git a/engines/freescape/detection_zx_tape.cpp b/engines/freescape/detection_zx_tape.cpp
new file mode 100644
index 00000000000..8fce9d84e64
--- /dev/null
+++ b/engines/freescape/detection_zx_tape.cpp
@@ -0,0 +1,24 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// Use a separate object for detection to avoid parallel builds writing to the
+// same object file as the engine plugin.
+#include "freescape/zx_tape.cpp"
diff --git a/engines/freescape/module.mk b/engines/freescape/module.mk
index 1b9eba6f068..247e416a8ec 100644
--- a/engines/freescape/module.mk
+++ b/engines/freescape/module.mk
@@ -133,5 +133,5 @@ DETECT_OBJS += $(MODULE)/detection.o
 # module is enabled, because it already has the contents.
 ifneq ($(ENABLE_FREESCAPE), STATIC_PLUGIN)
 # External dependencies for detection.
-DETECT_OBJS += $(MODULE)/zx_tape.o
+DETECT_OBJS += $(MODULE)/detection_zx_tape.o
 endif


Commit: 6919e5f7384f31298697dd71ddd130b7fd86ce0f
    https://github.com/scummvm/scummvm/commit/6919e5f7384f31298697dd71ddd130b7fd86ce0f
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-23T21:54:26+02:00

Commit Message:
EEM: added missing spotlight animation in the intro sequence for eem1 mac (cd)

Changed paths:
    engines/eem/eem.cpp


diff --git a/engines/eem/eem.cpp b/engines/eem/eem.cpp
index c695b89867c..d414f195f31 100644
--- a/engines/eem/eem.cpp
+++ b/engines/eem/eem.cpp
@@ -67,7 +67,7 @@ const uint kPalStormLogo       = 0x26;  // Floppy FUN_23d2_0605
 const uint kMacPicEAKidsLogo   = 0x213; // FUN_000092be
 // PIC 0x20d is the clubhouse scene; the title sequence (FUN_000096fa) omits it.
 const uint kMacPicTitleDark    = 0x20e;
-const uint kMacPicTitleFinal   = 0x20f;
+const uint kMacPicTitleLit     = 0x20f;
 const uint kMacPicTitleIn0     = 0x210;
 const uint kMacPicTitleIn1     = 0x211;
 const uint kMacPicTitleIn2     = 0x212;
@@ -1463,6 +1463,27 @@ static void blitNativeTransparent(Graphics::ManagedSurface &dst,
 	dst.transBlitFrom(pic.surface, Common::Point(x, y), transparent);
 }
 
+static void blitMacTitleSpotlight(Graphics::ManagedSurface &dst,
+		const Graphics::ManagedSurface &lit, const Graphics::ManagedSurface &mask,
+		int x, int y) {
+	Common::Rect area(x, y, x + mask.w, y + mask.h);
+	area.clip(Common::Rect(dst.w, dst.h));
+	area.clip(Common::Rect(lit.w, lit.h));
+	if (area.isEmpty())
+		return;
+
+	// Mac CD CODE 6:3d1c copies the lit background wherever the mask is zero.
+	for (int row = area.top; row < area.bottom; row++) {
+		byte *out = (byte *)dst.getBasePtr(area.left, row);
+		const byte *src = (const byte *)lit.getBasePtr(area.left, row);
+		const byte *maskRow = (const byte *)mask.getBasePtr(area.left - x, row - y);
+		for (int col = 0; col < area.width(); col++) {
+			if (maskRow[col] == 0)
+				out[col] = src[col];
+		}
+	}
+}
+
 bool EEMEngine::waitIntroDelay(uint32 maxMs) {
 	const uint32 startMs = g_system->getMillis();
 	while (!shouldQuit() && (g_system->getMillis() - startMs < maxMs)) {
@@ -1569,15 +1590,23 @@ void EEMEngine::showMacTitleIntro() {
 		return;
 	}
 
-	// FUN_000096fa uses only the dark-eye (0x20e) and lit-eye (0x20f) frames; the
-	// eye "powers up" from one to the other (PIC 0x20d, the clubhouse, isn't used).
-	Picture titleDark, titleFinal;
+	// Mac CD CODE 6:3ff2 moves a spotlight over the dark title, revealing
+	// the lit picture through the mask stored in BIGMAP's second entry.
+	Picture titleDark, titleLit;
 	if (!_picsArchive.getPicture(kMacPicTitleDark, titleDark) ||
-		!_picsArchive.getPicture(kMacPicTitleFinal, titleFinal)) {
+		!_picsArchive.getPicture(kMacPicTitleLit, titleLit)) {
 		warning("Mac title base pictures failed to load");
 		return;
 	}
 
+	DBDArchive bigMapArchive;
+	Picture spotlight;
+	if (!bigMapArchive.open(Common::Path("BIGMAP.DBD"), Common::Path("BIGMAP.DBX"), true) ||
+		!bigMapArchive.loadEntry(1, spotlight)) {
+		warning("Mac title spotlight mask failed to load");
+		return;
+	}
+
 	Picture in[3], left[3], right[3];
 	const uint inIds[3] = {
 		kMacPicTitleIn0, kMacPicTitleIn1, kMacPicTitleIn2
@@ -1607,73 +1636,76 @@ void EEMEngine::showMacTitleIntro() {
 	g_system->updateScreen();
 	fadePaletteFromBlack(target);
 
-	for (int i = 0; i < 0x2c && !shouldQuit() && !_skipIntro; i++) {
-		frame.blitFrom(titleDark.surface, Common::Point(0, 0));
-		const int revealW = (i + 1) * kMacScreenWidth / 0x2c;
-		if (revealW > 0) {
-			const Common::Rect src(0, 0, revealW, kMacScreenHeight);
-			frame.blitFrom(titleFinal.surface, src, Common::Point(0, 0));
-		}
+	// The original repeats both sweeps, waiting four TickCount ticks per frame.
+	const uint32 frameDelayMs = 4 * 1000 / 60;
+	while (!shouldQuit() && !_skipIntro) {
+		for (int i = 0; i < 0x2c && !shouldQuit() && !_skipIntro; i++) {
+			const uint32 startMs = g_system->getMillis();
+			frame.blitFrom(titleDark.surface, Common::Point(0, 0));
+			blitMacTitleSpotlight(frame, titleLit.surface, spotlight.surface,
+							  -110 + i * 15, 60 - i * 3);
+
+			switch (i) {
+			case 15:
+			case 19:
+				blitNativeTransparent(frame, in[0], 0xb9, 0x29);
+				break;
+			case 16:
+			case 18:
+				blitNativeTransparent(frame, in[1], 0xb9, 0x29);
+				break;
+			case 17:
+				blitNativeTransparent(frame, in[2], 0xb9, 0x29);
+				break;
+			default:
+				break;
+			}
 
-		switch (i) {
-		case 15:
-		case 19:
-			blitNativeTransparent(frame, in[0], 0xb9, 0x29);
-			break;
-		case 16:
-		case 18:
-			blitNativeTransparent(frame, in[1], 0xb9, 0x29);
-			break;
-		case 17:
-			blitNativeTransparent(frame, in[2], 0xb9, 0x29);
-			break;
-		default:
-			break;
+			copyNativeSurfaceToScreen(frame);
+			const uint32 elapsed = g_system->getMillis() - startMs;
+			if (waitIntroDelay(elapsed < frameDelayMs ? frameDelayMs - elapsed : 1))
+				return;
 		}
 
-		copyNativeSurfaceToScreen(frame);
-		if (waitIntroDelay(40))
-			return;
-	}
-
-	for (int i = 0x2a; i >= 0 && !shouldQuit() && !_skipIntro; i--) {
-		frame.blitFrom(titleFinal.surface, Common::Point(0, 0));
+		for (int i = 0x2a; i >= -1 && !shouldQuit() && !_skipIntro; i--) {
+			const uint32 startMs = g_system->getMillis();
+			frame.blitFrom(titleDark.surface, Common::Point(0, 0));
+			blitMacTitleSpotlight(frame, titleLit.surface, spotlight.surface,
+							  512 - (0x2a - i) * 15, 145);
+
+			switch (i) {
+			case 7:
+			case 11:
+				blitNativeTransparent(frame, left[0], 0x39, 0xb1);
+				break;
+			case 8:
+			case 10:
+				blitNativeTransparent(frame, left[1], 0x39, 0xb1);
+				break;
+			case 9:
+				blitNativeTransparent(frame, left[2], 0x39, 0xb1);
+				break;
+			case 24:
+			case 28:
+				blitNativeTransparent(frame, right[0], 0x131, 0xb1);
+				break;
+			case 25:
+			case 27:
+				blitNativeTransparent(frame, right[1], 0x131, 0xb1);
+				break;
+			case 26:
+				blitNativeTransparent(frame, right[2], 0x131, 0xb1);
+				break;
+			default:
+				break;
+			}
 
-		switch (i) {
-		case 7:
-		case 11:
-			blitNativeTransparent(frame, left[0], 0x39, 0xb1);
-			break;
-		case 8:
-		case 10:
-			blitNativeTransparent(frame, left[1], 0x39, 0xb1);
-			break;
-		case 9:
-			blitNativeTransparent(frame, left[2], 0x39, 0xb1);
-			break;
-		case 24:
-		case 28:
-			blitNativeTransparent(frame, right[0], 0x131, 0xb1);
-			break;
-		case 25:
-		case 27:
-			blitNativeTransparent(frame, right[1], 0x131, 0xb1);
-			break;
-		case 26:
-			blitNativeTransparent(frame, right[2], 0x131, 0xb1);
-			break;
-		default:
-			break;
+			copyNativeSurfaceToScreen(frame);
+			const uint32 elapsed = g_system->getMillis() - startMs;
+			if (waitIntroDelay(elapsed < frameDelayMs ? frameDelayMs - elapsed : 1))
+				return;
 		}
-
-		copyNativeSurfaceToScreen(frame);
-		if (waitIntroDelay(40))
-			return;
 	}
-
-	frame.blitFrom(titleFinal.surface, Common::Point(0, 0));
-	copyNativeSurfaceToScreen(frame);
-	waitIntroDelay(0xFFFFFFFFu);
 }
 
 void EEMEngine::playMacCDIntro() {




More information about the Scummvm-git-logs mailing list