[Scummvm-git-logs] scummvm master -> b049396ef627d85c0dc53ef6a28d26d53fd3a31c

dreammaster noreply at scummvm.org
Thu Aug 6 10:50:02 UTC 2026


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

Summary:
4cabb86722 MADS: NEBULAR: Add missing GAMEOPTION_ORIGINAL_SAVELOAD from detection entries
5f75a0bb1e MADS: Grab a savegame thumbnail before opening original game dialogs
b049396ef6 MADS: NEBULAR: Fix background when saving using ScummVM GMM


Commit: 4cabb867224c9776c63e691aebf72c29c44e5024
    https://github.com/scummvm/scummvm/commit/4cabb867224c9776c63e691aebf72c29c44e5024
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-08-06T20:49:53+10:00

Commit Message:
MADS: NEBULAR: Add missing GAMEOPTION_ORIGINAL_SAVELOAD from detection entries

Changed paths:
    engines/mads/detection_tables.h


diff --git a/engines/mads/detection_tables.h b/engines/mads/detection_tables.h
index cf19467145e..f801b6cb1f5 100644
--- a/engines/mads/detection_tables.h
+++ b/engines/mads/detection_tables.h
@@ -32,9 +32,9 @@ static const MADSGameDescription gameDescriptions[] = {
 			Common::kPlatformDOS,
 			ADGF_UNSTABLE | GF_INSTALLER,
 #ifdef USE_TTS
-			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION)
+			GUIO8(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #else
-			GUIO6(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION)
+			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #endif
 		},
 		GType_RexNebular,
@@ -51,9 +51,9 @@ static const MADSGameDescription gameDescriptions[] = {
 			Common::kPlatformDOS,
 			ADGF_UNSTABLE | GF_INSTALLER,
 #ifdef USE_TTS
-			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION)
+			GUIO8(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #else
-			GUIO6(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION)
+			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #endif
 		},
 		GType_RexNebular,
@@ -70,9 +70,9 @@ static const MADSGameDescription gameDescriptions[] = {
 			Common::kPlatformDOS,
 			ADGF_UNSTABLE | GF_INSTALLER,
 #ifdef USE_TTS
-			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION)
+			GUIO8(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #else
-			GUIO6(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION)
+			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #endif
 		},
 		GType_RexNebular,
@@ -89,9 +89,9 @@ static const MADSGameDescription gameDescriptions[] = {
 			Common::kPlatformDOS,
 			ADGF_UNSTABLE,
 #ifdef USE_TTS
-			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION)
+			GUIO8(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #else
-			GUIO6(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION)
+			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #endif
 		},
 		GType_RexNebular,
@@ -108,9 +108,9 @@ static const MADSGameDescription gameDescriptions[] = {
 			Common::kPlatformDOS,
 			ADGF_UNSTABLE,
 #ifdef USE_TTS
-			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION)
+			GUIO8(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #else
-			GUIO6(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION)
+			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #endif
 		},
 		GType_RexNebular,
@@ -126,7 +126,7 @@ static const MADSGameDescription gameDescriptions[] = {
 			Common::RU_RUS,
 			Common::kPlatformDOS,
 			ADGF_UNSTABLE,
-			GUIO6(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION)
+			GUIO7(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 		},
 		GType_RexNebular,
 		0
@@ -141,7 +141,7 @@ static const MADSGameDescription gameDescriptions[] = {
 			Common::EN_ANY,
 			Common::kPlatformDOS,
 			ADGF_UNSTABLE | ADGF_DEMO,
-			GUIO5(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE)
+			GUIO6(GUIO_NOSPEECH, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_ORIGINAL_SAVELOAD)
 		},
 		GType_RexNebular,
 		0
@@ -160,9 +160,9 @@ static const MADSGameDescription gameDescriptions[] = {
 			Common::kPlatformMacintosh,
 			ADGF_UNSTABLE,
 #ifdef USE_TTS
-			GUIO9(GUIO_NOMIDI, GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION)
+			GUIO10(GUIO_NOMIDI, GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_TTS_NARRATOR, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #else
-			GUIO8(GUIO_NOMIDI, GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION)
+			GUIO9(GUIO_NOMIDI, GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EASY_MOUSE, GAMEOPTION_ANIMATED_INVENTORY, GAMEOPTION_ANIMATED_INTERFACE, GAMEOPTION_NAUGHTY_MODE, GAMEOPTION_COPY_PROTECTION, GAMEOPTION_ORIGINAL_SAVELOAD)
 #endif
 		},
 		GType_RexNebular,


Commit: 5f75a0bb1e6bdf9309ec49c7408082567a158918
    https://github.com/scummvm/scummvm/commit/5f75a0bb1e6bdf9309ec49c7408082567a158918
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-08-06T20:49:53+10:00

Commit Message:
MADS: Grab a savegame thumbnail before opening original game dialogs

Changed paths:
    engines/mads/core/game.cpp
    engines/mads/mads.cpp
    engines/mads/mads.h
    engines/mads/metaengine.cpp
    engines/mads/nebular/menus.cpp


diff --git a/engines/mads/core/game.cpp b/engines/mads/core/game.cpp
index 8d4d4481a5e..824b0c110e1 100644
--- a/engines/mads/core/game.cpp
+++ b/engines/mads/core/game.cpp
@@ -1497,7 +1497,10 @@ void game_control() {
 			if (g_engine->getGameID() == GType_RexNebular && kernel.activate_menu != GAME_NO_MENU &&
 					player.commands_allowed && !global[RexNebular::kCopyProtectFailed]) {
 				player_dump_walker();
+
+				g_engine->setSavegameThumbnail();
 				game_exec_function(game_menu_routine);
+				g_engine->clearSavegameThumbnail();
 				kernel.activate_menu = GAME_NO_MENU;
 			}
 
@@ -1927,7 +1930,6 @@ static void game_control_loop() {
 	if (debugger) game_exec_function(debugger_reset);
 
 	while ((new_room == room_id) && game.going && !kernel.force_restart) {
-
 		game_main_loop();
 
 		if (kernel.activate_menu) {
@@ -1939,7 +1941,9 @@ static void game_control_loop() {
 					kernel.force_restart = true;
 
 				} else {
+					g_engine->setSavegameThumbnail();
 					game_exec_function(game_menu_routine);
+					g_engine->clearSavegameThumbnail();
 
 					if (game_menu_routine == NULL)
 						game.going = false;
diff --git a/engines/mads/mads.cpp b/engines/mads/mads.cpp
index 2681a38d499..559ec692450 100644
--- a/engines/mads/mads.cpp
+++ b/engines/mads/mads.cpp
@@ -23,6 +23,7 @@
 #include "common/config-manager.h"
 #include "common/memstream.h"
 #include "engines/util.h"
+#include "graphics/scaler.h"
 #include "mads/mads.h"
 #include "mads/mads.h"
 #include "mads/core/anim.h"
@@ -548,4 +549,12 @@ int MADSEngine::getRandomNumber(int minNumber, int maxNumber) {
 	return minNumber + _randomSource.getRandomNumber(range);
 }
 
+void MADSEngine::setSavegameThumbnail() {
+	::createThumbnailFromScreen(&_savegameThumbnail);
+}
+
+void MADSEngine::clearSavegameThumbnail() {
+	_savegameThumbnail.free();
+}
+
 } // namespace MADS
diff --git a/engines/mads/mads.h b/engines/mads/mads.h
index 18eb8a05905..19526e5f4b4 100644
--- a/engines/mads/mads.h
+++ b/engines/mads/mads.h
@@ -86,6 +86,7 @@ protected:
 	Audio::SoundHandle _speechHandle;
 	TimerFunction _timerFunction = nullptr;
 	uint32 _nextTimerTime = 0;
+	Graphics::Surface _savegameThumbnail;
 
 	virtual Common::Point screenToGame(const Common::Point &point) const;
 	virtual Common::Point gameToScreen(const Common::Point &point) const;
@@ -132,6 +133,12 @@ public:
 	void warpMouse(int x, int y);
 	void updateDisplay();
 
+	const Graphics::Surface &getSavegameThumbnail() const {
+		return _savegameThumbnail;
+	}
+	void setSavegameThumbnail();
+	void clearSavegameThumbnail();
+
 	/**
 	 * Get the elapsed time in milliseconds
 	 */
diff --git a/engines/mads/metaengine.cpp b/engines/mads/metaengine.cpp
index 76127226a36..f9427f7bc3b 100644
--- a/engines/mads/metaengine.cpp
+++ b/engines/mads/metaengine.cpp
@@ -22,18 +22,16 @@
 
 #include "base/plugins.h"
 #include "engines/advancedDetector.h"
-
 #include "backends/keymapper/action.h"
 #include "backends/keymapper/keymapper.h"
 #include "backends/keymapper/standard-actions.h"
-
 #include "common/savefile.h"
 #include "common/str-array.h"
 #include "common/memstream.h"
 #include "common/system.h"
 #include "common/translation.h"
+#include "graphics/scaler.h"
 #include "graphics/surface.h"
-
 #include "mads/detection.h"
 #include "mads/nebular/nebular.h"
 #include "mads/phantom/phantom.h"
@@ -178,6 +176,7 @@ public:
 	Common::Error createInstance(OSystem *syst, Engine **engine, const MADS::MADSGameDescription *desc) const override;
 	int getMaximumSaveSlot() const override;
 	Common::KeymapArray initKeymaps(const char *target) const override;
+	void getSavegameThumbnail(Graphics::Surface &thumb) override;
 };
 
 bool MADSMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -332,6 +331,18 @@ Common::KeymapArray MADSMetaEngine::initKeymaps(const char *target) const {
 	return keymaps;
 }
 
+void MADSMetaEngine::getSavegameThumbnail(Graphics::Surface &thumb) {
+	const Graphics::Surface &newThumb = MADS::g_engine->getSavegameThumbnail();
+	thumb.free();
+
+	if (newThumb.h == 0)
+		// No provided thumbnail, so just get it from the screen
+		::createThumbnailFromScreen(&thumb);
+	else
+		// Use provided thumbnail
+		thumb.copyFrom(newThumb);
+}
+
 #if PLUGIN_ENABLED_DYNAMIC(MADS)
 	REGISTER_PLUGIN_DYNAMIC(MADS, PLUGIN_TYPE_ENGINE, MADSMetaEngine);
 #else
diff --git a/engines/mads/nebular/menus.cpp b/engines/mads/nebular/menus.cpp
index bb56da9b251..a2bd6e380ca 100644
--- a/engines/mads/nebular/menus.cpp
+++ b/engines/mads/nebular/menus.cpp
@@ -1745,11 +1745,22 @@ void global_game_menu() {
 			break;
 
 		case GAME_SAVE_MENU:
-			game_menu_save();
+			if (config_file.original_save_load) {
+				game_menu_save();
+			} else {
+				kernel.activate_menu = GAME_NO_MENU;
+				g_engine->saveGameDialog();
+			}
 			break;
-
 		case GAME_RESTORE_MENU:
-			game_menu_restore();
+			if (config_file.original_save_load) {
+				game_menu_restore();
+			} else {
+				kernel.activate_menu = GAME_NO_MENU;
+				if (g_engine->loadGameDialog())
+					// Dummy name to flag that load was successful
+					Common::strcpy_s(save_game_buf, "OK");
+			}
 			break;
 
 		case GAME_OPTIONS_MENU:


Commit: b049396ef627d85c0dc53ef6a28d26d53fd3a31c
    https://github.com/scummvm/scummvm/commit/b049396ef627d85c0dc53ef6a28d26d53fd3a31c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2026-08-06T20:49:53+10:00

Commit Message:
MADS: NEBULAR: Fix background when saving using ScummVM GMM

Changed paths:
    engines/mads/nebular/menus.cpp


diff --git a/engines/mads/nebular/menus.cpp b/engines/mads/nebular/menus.cpp
index a2bd6e380ca..4ea7e154fd9 100644
--- a/engines/mads/nebular/menus.cpp
+++ b/engines/mads/nebular/menus.cpp
@@ -1733,6 +1733,25 @@ void global_menu_system_shutdown() {
 void global_game_menu() {
 	g_engine->flushKeys();
 
+	// Special handling for direct save/load dialogs when not using the original dialogs. We do it here
+	// before the original code screws up the active screen
+	if (!config_file.original_save_load) {
+		switch (kernel.activate_menu) {
+		case GAME_SAVE_MENU:
+			kernel.activate_menu = GAME_NO_MENU;
+			g_engine->saveGameDialog();
+			return;
+		case GAME_RESTORE_MENU:
+			kernel.activate_menu = GAME_NO_MENU;
+			if (g_engine->loadGameDialog())
+				// Dummy name to flag that load was successful
+				Common::strcpy_s(save_game_buf, "OK");
+			return;
+		default:
+			break;
+		}
+	}
+
 	game_menu_setup();
 
 	game_menu_direct_jump = (kernel.activate_menu != GAME_MAIN_MENU);




More information about the Scummvm-git-logs mailing list