[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