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

neuromancer noreply at scummvm.org
Sun Sep 27 19:52:02 UTC 2026


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

Summary:
d2a3eb7e9c SCUMM: RA2: added support for special edition demo
0744ba44dd SCUMM: RA1: added support for demo v1.5
25495fa34f SCUMM: RA1: added support for demo v0.67
7c90cea8b7 SCUMM: RA2: added support for non-interactive demo
69017d06a5 SCUMM: RA1: added support for german release v1.8
7d74f5a0e2 SCUMM: RA2: added support for another demo
558a22ce77 SCUMM: RA1: added support for special edition demo
dfd658a885 SCUMM: RA2: added support for an alternative non-interacive dos demo
12307dbb4f SCUMM: RA1: added support for an alternative non-interacive dos demo
ee0d593533 SCUMM: RA1: added support for mac v1.0 demo


Commit: d2a3eb7e9c071a2ec4bc4a894c215ba0748030f7
    https://github.com/scummvm/scummvm/commit/d2a3eb7e9c071a2ec4bc4a894c215ba0748030f7
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-27T21:51:37+02:00

Commit Message:
SCUMM: RA2: added support for special edition demo

Changed paths:
    devtools/scumm-md5.txt
    engines/scumm/detection_tables.h
    engines/scumm/insane/rebel2/releases.cpp
    engines/scumm/scumm-md5.h


diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt
index 02562e81c87..f17db403693 100644
--- a/devtools/scumm-md5.txt
+++ b/devtools/scumm-md5.txt
@@ -471,6 +471,7 @@ rebel2	Star Wars: Rebel Assault II: The Hidden Empire
 	e977ed046b88e75b645491caeff37b0c	313689	en	DOS	Demo	Demo	-	-
 	967409fc4c12b39fb3cf47f45de2623c	646373	en	DOS	Demo DA1.06	Demo DA1.06	Playable demo (chapter 6)	-
 	8e0788210af982fbbc43c244ac6f9581	663561	en	DOS	Demo DG1.15	Demo DG1.15	The Dreighton Encounter (chapters 1, 2 and 4)	-
+	ca546c05ec7be680bb7d97675dc9ba59	662441	en	DOS	Demo Special Edition	Demo Special Edition	Special Edition (chapters 1, 2 and 3)	-
 	d89f31e209c0642b4d20ccf615840401	128658792	en	Mac	Demo v1.0	Demo v1.0	Mac bundle (chapter 6)	-
 
 dig	The Dig
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index 6c3dbdd7a6a..d897c592aec 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -240,6 +240,7 @@ static const GameSettings gameVariantsTable[] = {
 	{"rebel2", "Demo", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
 	{"rebel2", "Demo DA1.06", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO6(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE, GAMEOPTION_REBEL2_RESTORED_CONTENT)},
 	{"rebel2", "Demo DG1.15", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
+	{"rebel2", "Demo Special Edition", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
 	{"rebel2", "Demo v1.0", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformMacintosh, GUIO6(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE, GAMEOPTION_REBEL2_RESTORED_CONTENT)},
 	{"rebel2", "PlayStation", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_UNSTABLE | GF_16BIT_COLOR, Common::kPlatformPSX, GUIO5(GUIO_NOMIDI, GUIO_NOASPECT, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
 
diff --git a/engines/scumm/insane/rebel2/releases.cpp b/engines/scumm/insane/rebel2/releases.cpp
index 29488f52c06..21cf43405aa 100644
--- a/engines/scumm/insane/rebel2/releases.cpp
+++ b/engines/scumm/insane/rebel2/releases.cpp
@@ -74,6 +74,13 @@ static const Rebel2Release kReleases[] = {
 		"Demo DG1.15", nullptr, "SYSTM/GAME.TRS", nullptr, "OPEN/O_PLAYDE.SAN", { 1, 2, 4 },
 		false, false, false, true, nullptr, 0
 	},
+	{
+		// GAME.TRS selects chapters 1, 2 and 3 in playable-demo mode.
+		// LE object 1, 0x12e70 plays O_PLAYDE after the last chapter;
+		// 0xf840 retains retail completion passwords, unlike DG1.15.
+		"Demo Special Edition", nullptr, "SYSTM/GAME.TRS", nullptr, "OPEN/O_PLAYDE.SAN", { 1, 2, 3 },
+		false, false, false, false, nullptr, 0
+	},
 	{
 		// Macintosh v1.0's chapter-6 handler (PEF code section, 0x17fe8)
 		// also skips the shield attack in demo mode and uses 06END_B.
diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h
index bb445084e06..be352805f44 100644
--- a/engines/scumm/scumm-md5.h
+++ b/engines/scumm/scumm-md5.h
@@ -1,5 +1,5 @@
 /*
-  This file was generated by the md5table tool on Sun Sep 27 13:12:00 2026
+  This file was generated by the md5table tool on Sun Sep 27 14:26:19 2026
   DO NOT EDIT MANUALLY!
  */
 
@@ -668,6 +668,7 @@ static const MD5Table md5table[] = {
 	{ "c8c5baadcbfc8d0372ed4335abace8a7", "pajama3", "", "Demo", -1, Common::FR_FRA, Common::kPlatformWindows },
 	{ "c9694a19b19092d7494c586c72b7c046", "ft", "Remastered", "Remastered", 5468384784, Common::EN_ANY, Common::kPlatformDOS },
 	{ "c9717ee6059f1e43b768b464493d2fba", "fbpack", "", "", -1, Common::JA_JPN, Common::kPlatform3DO },
+	{ "ca546c05ec7be680bb7d97675dc9ba59", "rebel2", "Demo Special Edition", "Demo Special Edition", 662441, Common::EN_ANY, Common::kPlatformDOS },
 	{ "cb1559e8405d17a5a278a6b5ad9338d1", "freddi3", "", "Demo", 22718, Common::EN_ANY, Common::kPlatformUnknown },
 	{ "cb8feea195746e042368e2b738766d8b", "indy3", "VGA", "VGA", -1, Common::KO_KOR, Common::kPlatformDOS },
 	{ "cc04a076779379524ed4d9c5ee3c6fb1", "tentacle", "", "CD", 282467632, Common::EN_ANY, Common::kPlatformMacintosh },


Commit: 0744ba44dd857a84c30859f5eec7c75a44c9bf1e
    https://github.com/scummvm/scummvm/commit/0744ba44dd857a84c30859f5eec7c75a44c9bf1e
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-27T21:51:37+02:00

Commit Message:
SCUMM: RA1: added support for demo v1.5

Changed paths:
    devtools/scumm-md5.txt
    engines/scumm/detection_tables.h
    engines/scumm/insane/rebel1/releases.cpp
    engines/scumm/scumm-md5.h


diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt
index f17db403693..ded079fdd85 100644
--- a/devtools/scumm-md5.txt
+++ b/devtools/scumm-md5.txt
@@ -450,6 +450,7 @@ ft	Full Throttle
 	8ead2c01c48c2e3d15d6a89b86cd84ab	19697	he	DOS	-	-	-	Hebrew fan translation
 
 rebel1	Star Wars: Rebel Assault
+	a29730a42dfcff7bc2e10acfca1e76a2	212951	en	DOS	Demo v1.5	Demo v1.5	CD-ROM demo (chapters 2 and 10)	-
 	274f6026d41fa2a2990a6d6b7a561dc2	217559	en	DOS	Demo v1.51	Demo v1.51	CD-ROM demo	-
 	551a7c06bf5098b32d5fe7641d695df8	226750	en	DOS	Demo 1994-04-13	Demo 1994-04-13	CD-ROM demo (chapters 8 and 10)	-
 	4e9f4571f5859ea50f1e505a1f15c408	451096	en	Mac	Demo v1.02c	Demo v1.02c	68k demo application (chapters 6 and 9)	-
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index d897c592aec..65ea3588f31 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -232,6 +232,7 @@ static const GameSettings gameVariantsTable[] = {
 	{"ft",   "Demo", 0, GID_FT,  7, 0, MDT_NONE, GF_DEMO, UNK, GUIO4(GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO, GAMEOPTION_TTS)},
 
 	{"rebel1", "", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_TESTING, Common::kPlatformDOS, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
+	{"rebel1", "Demo v1.5", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
 	{"rebel1", "Demo v1.51", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
 	{"rebel1", "Demo 1994-04-13", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO4(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE, GAMEOPTION_REBEL1_RESTORED_CONTENT)},
 	{"rebel1", "Demo v1.02c", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformMacintosh, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
diff --git a/engines/scumm/insane/rebel1/releases.cpp b/engines/scumm/insane/rebel1/releases.cpp
index e79d581a4f9..f874cae532b 100644
--- a/engines/scumm/insane/rebel1/releases.cpp
+++ b/engines/scumm/insane/rebel1/releases.cpp
@@ -45,6 +45,13 @@ static const Rebel1Release kReleases[] = {
 		{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, nullptr,
 		0x7fff, false, { 0, 0, 0 }, &kRetailWalker
 	},
+	{
+		// CD-ROM Demo v1.5: the original dispatcher at 0x1478d redirects
+		// chapter 1 to 2, chapter 3 to 10, and returns to the menu after 10.
+		"Demo v1.5", "ASSAULT.EXE", "OPEN/O1LOGO.ANM", "OPEN/O1DEMO.ANM", "OPEN/O1OPEN.ANM", nullptr, false, true,
+		{ 2, 10 }, nullptr,
+		0x7fff, false, { 0, 0, 0 }, &kRetailWalker
+	},
 	{
 		// CD-ROM Demo v1.51: the original dispatcher skips chapters 3-9 and
 		// 11-15, their transitions, and the retail ending.
diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h
index be352805f44..8f443b4b61b 100644
--- a/engines/scumm/scumm-md5.h
+++ b/engines/scumm/scumm-md5.h
@@ -1,5 +1,5 @@
 /*
-  This file was generated by the md5table tool on Sun Sep 27 14:26:19 2026
+  This file was generated by the md5table tool on Sun Sep 27 14:47:35 2026
   DO NOT EDIT MANUALLY!
  */
 
@@ -551,6 +551,7 @@ static const MD5Table md5table[] = {
 	{ "a22af0ad0e3126d19d22707b0267a37d", "balloon", "HE 80", "", 12800, Common::NL_NLD, Common::kPlatformWindows },
 	{ "a2386da005672cbd5136f4f27a626c5f", "farm", "HE 73", "", 87061, Common::NL_NLD, Common::kPlatformWindows },
 	{ "a28135a7ade38cc0208b04507c46efd1", "spyfox", "HE 99", "", 49325, Common::DE_DEU, Common::kPlatformUnknown },
+	{ "a29730a42dfcff7bc2e10acfca1e76a2", "rebel1", "Demo v1.5", "Demo v1.5", 212951, Common::EN_ANY, Common::kPlatformDOS },
 	{ "a2ac6b38420db5f4c2225759ac3d8d46", "dig", "", "Super Sampler Demo", 3314, Common::EN_ANY, Common::kPlatformDOS },
 	{ "a2bb6aa0537402c1b3c2ea899ccef64b", "lost", "HE 99", "Demo", 15540, Common::EN_ANY, Common::kPlatformWindows },
 	{ "a3036878840720fbefa41e6965fa4a0a", "samnmax", "Floppy", "Floppy", 9040, Common::EN_ANY, Common::kPlatformDOS },


Commit: 25495fa34f0782dbc6a4ac6768f89d1de123d480
    https://github.com/scummvm/scummvm/commit/25495fa34f0782dbc6a4ac6768f89d1de123d480
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-27T21:51:37+02:00

Commit Message:
SCUMM: RA1: added support for demo v0.67

Changed paths:
    devtools/scumm-md5.txt
    engines/scumm/detection_tables.h
    engines/scumm/insane/rebel1/rebel.h
    engines/scumm/insane/rebel1/releases.cpp
    engines/scumm/insane/rebel1/releases.h
    engines/scumm/insane/rebel1/runlevels.cpp
    engines/scumm/saveload.cpp
    engines/scumm/scumm-md5.h


diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt
index ded079fdd85..22870a6acfb 100644
--- a/devtools/scumm-md5.txt
+++ b/devtools/scumm-md5.txt
@@ -450,6 +450,7 @@ ft	Full Throttle
 	8ead2c01c48c2e3d15d6a89b86cd84ab	19697	he	DOS	-	-	-	Hebrew fan translation
 
 rebel1	Star Wars: Rebel Assault
+	0ca9c07185b4969764eaf3ecd0de06e9	111530	en	DOS	Demo v0.67	Demo v0.67	Non-interactive demo	-
 	a29730a42dfcff7bc2e10acfca1e76a2	212951	en	DOS	Demo v1.5	Demo v1.5	CD-ROM demo (chapters 2 and 10)	-
 	274f6026d41fa2a2990a6d6b7a561dc2	217559	en	DOS	Demo v1.51	Demo v1.51	CD-ROM demo	-
 	551a7c06bf5098b32d5fe7641d695df8	226750	en	DOS	Demo 1994-04-13	Demo 1994-04-13	CD-ROM demo (chapters 8 and 10)	-
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index 65ea3588f31..b9176bdabd6 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -232,6 +232,7 @@ static const GameSettings gameVariantsTable[] = {
 	{"ft",   "Demo", 0, GID_FT,  7, 0, MDT_NONE, GF_DEMO, UNK, GUIO4(GUIO_NOMIDI, GAMEOPTION_ORIGINALGUI, GAMEOPTION_LOWLATENCYAUDIO, GAMEOPTION_TTS)},
 
 	{"rebel1", "", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_TESTING, Common::kPlatformDOS, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
+	{"rebel1", "Demo v0.67", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO2(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD)},
 	{"rebel1", "Demo v1.5", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
 	{"rebel1", "Demo v1.51", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
 	{"rebel1", "Demo 1994-04-13", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO4(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE, GAMEOPTION_REBEL1_RESTORED_CONTENT)},
diff --git a/engines/scumm/insane/rebel1/rebel.h b/engines/scumm/insane/rebel1/rebel.h
index 9de3046f833..28544fe73c6 100644
--- a/engines/scumm/insane/rebel1/rebel.h
+++ b/engines/scumm/insane/rebel1/rebel.h
@@ -184,6 +184,7 @@ public:
 	void resetFrameObjectState();
 
 	void runGame();
+	bool hasPlayableLevels() const { return _release.getLevelCount() != 0; }
 	Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave = false);
 	Common::Error loadGameState(int slot, bool startupLoad = false);
 	bool shouldAbortGameFlow() const { return _vm->shouldQuit() || _loadRequested; }
diff --git a/engines/scumm/insane/rebel1/releases.cpp b/engines/scumm/insane/rebel1/releases.cpp
index f874cae532b..da7db2d2697 100644
--- a/engines/scumm/insane/rebel1/releases.cpp
+++ b/engines/scumm/insane/rebel1/releases.cpp
@@ -45,6 +45,13 @@ static const Rebel1Release kReleases[] = {
 		{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, nullptr,
 		0x7fff, false, { 0, 0, 0 }, &kRetailWalker
 	},
+	{
+		// v0.67: the original at 0x28ac plays the logo once, then loops the
+		// preview. Neither the menu movie nor any chapter assets are supplied.
+		"Demo v0.67", "REBEL.EXE", "OPEN/O1LOGO.ANM", nullptr, "OPEN/O1OPEN.ANM", nullptr, false, false,
+		{ 0 }, nullptr,
+		0, false, { 0, 0, 0 }, &kRetailWalker
+	},
 	{
 		// CD-ROM Demo v1.5: the original dispatcher at 0x1478d redirects
 		// chapter 1 to 2, chapter 3 to 10, and returns to the menu after 10.
diff --git a/engines/scumm/insane/rebel1/releases.h b/engines/scumm/insane/rebel1/releases.h
index 1dd29af0583..7c54c94192f 100644
--- a/engines/scumm/insane/rebel1/releases.h
+++ b/engines/scumm/insane/rebel1/releases.h
@@ -59,6 +59,7 @@ struct Rebel1Release {
 	bool chapterTransitions;
 	bool passcodes;
 	// Chapter numbers in playback order. Unused entries are zero.
+	// An empty list denotes a non-interactive demo that loops the intro.
 	byte levels[kNumLevels];
 	// Optional replacement chapter order when restored content is enabled.
 	const byte *restoredLevels;
diff --git a/engines/scumm/insane/rebel1/runlevels.cpp b/engines/scumm/insane/rebel1/runlevels.cpp
index 14bae7650f7..ed127c78f4a 100644
--- a/engines/scumm/insane/rebel1/runlevels.cpp
+++ b/engines/scumm/insane/rebel1/runlevels.cpp
@@ -105,6 +105,8 @@ void InsaneRebel1::playCinematic(const char *filename, int32 startFrame) {
 	splayer->setCurVideoFlags(0x420);
 	splayer->setFastForwardFromFrame(0);
 	splayer->setFastForwardToFrame(startFrame > 0 ? startFrame : 0);
+	// A missing movie must not retain the previous movie's completion status.
+	splayer->_endOfFile = false;
 	splayer->play(filename, 15);
 
 	_introTextActive = false;
@@ -1372,6 +1374,14 @@ bool InsaneRebel1::runLevel15() {
 }
 
 void InsaneRebel1::runGame() {
+	if (!hasPlayableLevels()) {
+		playIntroSequence();
+		// Only restart after natural completion; skipping the preview exits.
+		while (_release.intro && !shouldAbortGameFlow() && _vm->_splayer->_endOfFile)
+			playCinematic(_release.intro);
+		return;
+	}
+
 	typedef bool (InsaneRebel1::*RunLevelMethod)();
 	const RunLevelMethod kLevelRunners[] = {
 		&InsaneRebel1::runLevel1,
diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp
index 8bad50a6ddc..475cdecc67d 100644
--- a/engines/scumm/saveload.cpp
+++ b/engines/scumm/saveload.cpp
@@ -104,7 +104,11 @@ bool ScummEngine::canLoadGameStateCurrently(Common::U32String *msg) {
 		return false;
 
 #ifdef ENABLE_SCUMM_7_8
-	if (_game.id == GID_REBEL1 || _game.id == GID_REBEL2)
+	if (_game.id == GID_REBEL1) {
+		const InsaneRebel1 *rebel = (InsaneRebel1 *)((ScummEngine_v7 *)this)->getInsane();
+		return rebel && rebel->hasPlayableLevels();
+	}
+	if (_game.id == GID_REBEL2)
 		return true;
 #endif
 
@@ -184,8 +188,10 @@ bool ScummEngine::canSaveGameStateCurrently(Common::U32String *msg) {
 		return false;
 
 #ifdef ENABLE_SCUMM_7_8
-	if (_game.id == GID_REBEL1)
-		return true;
+	if (_game.id == GID_REBEL1) {
+		const InsaneRebel1 *rebel = (InsaneRebel1 *)((ScummEngine_v7 *)this)->getInsane();
+		return rebel && rebel->hasPlayableLevels();
+	}
 
 	// No save interface: progress is written as levels are completed.
 	if (_game.id == GID_REBEL2) {
diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h
index 8f443b4b61b..6744cab4cda 100644
--- a/engines/scumm/scumm-md5.h
+++ b/engines/scumm/scumm-md5.h
@@ -1,5 +1,5 @@
 /*
-  This file was generated by the md5table tool on Sun Sep 27 14:47:35 2026
+  This file was generated by the md5table tool on Sun Sep 27 14:58:20 2026
   DO NOT EDIT MANUALLY!
  */
 
@@ -64,6 +64,7 @@ static const MD5Table md5table[] = {
 	{ "0bf1a3eb198ca1bd2ebe104825cec770", "puttrace", "HE 99", "Demo", -1, Common::FR_FRA, Common::kPlatformWindows },
 	{ "0c331637580950aea2346e012ef2a868", "maniac", "V2", "V2", 1988, Common::EN_ANY, Common::kPlatformAtariST },
 	{ "0c45eb4baff0c12c3d9dfa889c8070ab", "pajama3", "", "Demo", 13884, Common::DE_DEU, Common::kPlatformUnknown },
+	{ "0ca9c07185b4969764eaf3ecd0de06e9", "rebel1", "Demo v0.67", "Demo v0.67", 111530, Common::EN_ANY, Common::kPlatformDOS },
 	{ "0cccfa5223099a60e76cfcca57a1a141", "freddi3", "", "", 55959, Common::NL_NLD, Common::kPlatformUnknown },
 	{ "0d1b69471605201ef2fa9cec1f5f02d2", "maniac", "V2", "V2", 1988, Common::ES_ESP, Common::kPlatformDOS },
 	{ "0ddf1174d0d097956ba10dd452ea65e6", "freddi3", "HE 99", "", -1, Common::HE_ISR, Common::kPlatformWindows },


Commit: 7c90cea8b77d8dcb3af2028ed58581c620dcd4c5
    https://github.com/scummvm/scummvm/commit/7c90cea8b77d8dcb3af2028ed58581c620dcd4c5
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-27T21:51:37+02:00

Commit Message:
SCUMM: RA2: added support for non-interactive demo

Changed paths:
    devtools/scumm-md5.txt
    engines/scumm/detection_tables.h
    engines/scumm/insane/rebel2/levels.cpp
    engines/scumm/insane/rebel2/rebel.cpp
    engines/scumm/insane/rebel2/releases.cpp
    engines/scumm/insane/rebel2/releases.h
    engines/scumm/saveload.cpp
    engines/scumm/scumm-md5.h
    engines/scumm/scumm.cpp
    engines/scumm/smush/rebel/smush_multi_font.cpp
    engines/scumm/smush/rebel/smush_player_ra2.cpp


diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt
index 22870a6acfb..80a1a53c69d 100644
--- a/devtools/scumm-md5.txt
+++ b/devtools/scumm-md5.txt
@@ -471,6 +471,7 @@ rebel2	Star Wars: Rebel Assault II: The Hidden Empire
 	ae607f6ed270311d7dbc033d3e943d3e	750723120	us	PSX	PlayStation	-	Disc 1 raw image	-
 
 	e977ed046b88e75b645491caeff37b0c	313689	en	DOS	Demo	Demo	-	-
+	d738db94e852d8a0e2405b0bc4f4d4fb	126976	en	Windows	Demo Windows 95	Demo Windows 95	LucasArts non-interactive demo bundle	-
 	967409fc4c12b39fb3cf47f45de2623c	646373	en	DOS	Demo DA1.06	Demo DA1.06	Playable demo (chapter 6)	-
 	8e0788210af982fbbc43c244ac6f9581	663561	en	DOS	Demo DG1.15	Demo DG1.15	The Dreighton Encounter (chapters 1, 2 and 4)	-
 	ca546c05ec7be680bb7d97675dc9ba59	662441	en	DOS	Demo Special Edition	Demo Special Edition	Special Edition (chapters 1, 2 and 3)	-
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index b9176bdabd6..fa6d8226c87 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -240,6 +240,7 @@ static const GameSettings gameVariantsTable[] = {
 
 	{"rebel2", "", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
 	{"rebel2", "Demo", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
+	{"rebel2", "Demo Windows 95", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformWindows, GUIO3(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD, GUIO_NOSUBTITLES)},
 	{"rebel2", "Demo DA1.06", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO6(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE, GAMEOPTION_REBEL2_RESTORED_CONTENT)},
 	{"rebel2", "Demo DG1.15", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
 	{"rebel2", "Demo Special Edition", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
@@ -523,6 +524,7 @@ static const GameFilenamePattern gameFilenamesTable[] = {
 
 	{ "rebel2", "REBEL2.EXE", kGenUnchanged, UNK_LANG, Common::kPlatformDOS, "" },
 	{ "rebel2", "REBEL2.EXE", kGenUnchanged, UNK_LANG, Common::kPlatformDOS, "Demo" },
+	{ "rebel2", "LUCASDMO.EXE", kGenUnchanged, UNK_LANG, Common::kPlatformWindows, "Demo Windows 95" },
 	{ "rebel2", "RA2.EXE", kGenUnchanged, UNK_LANG, Common::kPlatformDOS, "Demo DA1.06" },
 	{ "rebel2", "Rebel Assault II Demo Data", kGenUnchanged, UNK_LANG, Common::kPlatformMacintosh, "Demo v1.0" },
 	{ "rebel2", "SLUS_003.81", kGenUnchanged, Common::EN_USA, Common::kPlatformPSX, "PlayStation" },
diff --git a/engines/scumm/insane/rebel2/levels.cpp b/engines/scumm/insane/rebel2/levels.cpp
index 9e53b9b390e..7441a535987 100644
--- a/engines/scumm/insane/rebel2/levels.cpp
+++ b/engines/scumm/insane/rebel2/levels.cpp
@@ -84,10 +84,12 @@ Common::String InsaneRebel2::getLevelPrefix(int levelId) {
 }
 
 void InsaneRebel2::runGame() {
-	SmushPlayer *splayer = ((ScummEngine_v7 *)_vm)->_splayer;
-
-	if (_release.nonInteractiveVideo) {
-		splayer->play(_release.nonInteractiveVideo, 15);
+	if (_release.nonInteractiveVideos) {
+		// Cinematics must not run the main menu's input or inactivity timer.
+		_gameState = kStateIntro;
+		for (const Rebel2DemoVideo *video = _release.nonInteractiveVideos;
+				video->filename && !_vm->shouldQuit(); ++video)
+			playCinematic(video->filename, video->flags);
 		return;
 	}
 
diff --git a/engines/scumm/insane/rebel2/rebel.cpp b/engines/scumm/insane/rebel2/rebel.cpp
index c4c591033b0..9e0e2ec0b06 100644
--- a/engines/scumm/insane/rebel2/rebel.cpp
+++ b/engines/scumm/insane/rebel2/rebel.cpp
@@ -188,8 +188,9 @@ InsaneRebel2::InsaneRebel2(ScummEngine_v7 *scumm) :
 	_smush_bensgoggNut = nullptr;
 
 	const bool highRes = isHiRes();
+	const bool playable = !_release.nonInteractiveVideos;
 
-	_smush_iconsNut = new NutRenderer(_vm, highRes ? "SYSTM/CPITIMHI.NUT" : "SYSTM/CPITIMAG.NUT");
+	_smush_iconsNut = playable ? new NutRenderer(_vm, highRes ? "SYSTM/CPITIMHI.NUT" : "SYSTM/CPITIMAG.NUT") : nullptr;
 	_smush_icons2Nut = nullptr;
 
 	_laserTexture.pixels = nullptr;
@@ -201,14 +202,15 @@ InsaneRebel2::InsaneRebel2(ScummEngine_v7 *scumm) :
 
 	initEdgeTable(nullptr);
 	_rebelDetailMode = 1;
-	_smush_cockpitNut = new NutRenderer(_vm, highRes ? "SYSTM/DIHIFONT.NUT" : "SYSTM/DISPFONT.NUT");
+	_smush_cockpitNut = playable ? new NutRenderer(_vm, highRes ? "SYSTM/DIHIFONT.NUT" : "SYSTM/DISPFONT.NUT") : nullptr;
 
-	_rebelMsgFont = makeRebel2Font(_vm, "SYSTM/DIHIFONT.NUT");
+	_rebelMsgFont = playable ? makeRebel2Font(_vm, "SYSTM/DIHIFONT.NUT") : nullptr;
 
-	_smush_talkfontNut = makeRebel2Font(_vm, highRes ? "SYSTM/TKHIFONT.NUT" : "SYSTM/TALKFONT.NUT");
-	_smush_smalfontNut = makeRebel2Font(_vm, highRes ? "SYSTM/SMHIFONT.NUT" : "SYSTM/SMALFONT.NUT");
-	_smush_titlefontNut = makeRebel2Font(_vm, highRes ? "SYSTM/TIHIFONT.NUT" : "SYSTM/TITLFONT.NUT");
-	_smush_povfontNut = makeRebel2Font(_vm, highRes ? "SYSTM/POHIFONT.NUT" : "SYSTM/POVFONT.NUT");
+	// Non-interactive demos load their movie fonts through the SMUSH player.
+	_smush_talkfontNut = playable ? makeRebel2Font(_vm, _release.getFontFile(0, highRes)) : nullptr;
+	_smush_smalfontNut = playable ? makeRebel2Font(_vm, _release.getFontFile(1, highRes)) : nullptr;
+	_smush_titlefontNut = playable ? makeRebel2Font(_vm, _release.getFontFile(2, highRes)) : nullptr;
+	_smush_povfontNut = playable ? makeRebel2Font(_vm, _release.getFontFile(3, highRes)) : nullptr;
 
 	_pauseOverlayActive = false;
 	memset(_savedPausePalette, 0, sizeof(_savedPausePalette));
@@ -502,7 +504,8 @@ InsaneRebel2::InsaneRebel2(ScummEngine_v7 *scumm) :
 		_sfxData[i] = nullptr;
 		_sfxSize[i] = 0;
 	}
-	loadSfx();
+	if (playable)
+		loadSfx();
 
 	for (i = 0; i < kRA2NumAuxSfx; i++) {
 		_auxSfxData[i] = (byte *)calloc(kRA2AuxBufSize, 1);
@@ -539,7 +542,8 @@ InsaneRebel2::InsaneRebel2(ScummEngine_v7 *scumm) :
 	for (i = 0; i < kMaxPilots; i++) {
 		_pilots[i].init();
 	}
-	loadPilots();
+	if (playable)
+		loadPilots();
 	updateChapterUnlocks();
 
 	_levelSelection = 0;
diff --git a/engines/scumm/insane/rebel2/releases.cpp b/engines/scumm/insane/rebel2/releases.cpp
index 21cf43405aa..7038b5b14d3 100644
--- a/engines/scumm/insane/rebel2/releases.cpp
+++ b/engines/scumm/insane/rebel2/releases.cpp
@@ -49,46 +49,88 @@ static const Rebel2DifficultyOverride kChapter6DemoDifficulty[] = {
 	} }
 };
 
+static const Rebel2DemoVideo kDemoVideos[] = {
+	{ "OPEN/O_DEMO.SAN", 0 },
+	{ nullptr, 0 }
+};
+
+static const Rebel2DemoVideo kWindowsDemoVideos[] = {
+	{ "RA2VID/O_OPEN_A.SAN", 0x28 },
+	{ "RA2VID/O_OPEN_B.SAN", 0x28 },
+	{ nullptr, 0 }
+};
+
+static const char *const kWindowsDemoFonts[] = {
+	"RA2VID/TALKFONT.NUT", "RA2VID/SMALFONT.NUT", "RA2VID/TITLFONT.NUT", nullptr
+};
+
 // Variants match detection_tables.h. Availability also limits passwords,
 // saved pilot progress and the unlock-all option.
 static const Rebel2Release kReleases[] = {
 	{
 		"", nullptr, "SYSTM/GAME.TRS", nullptr, nullptr,
 		{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
-		true, false, false, false, nullptr, 0
+		true, false, false, false, nullptr, 0, nullptr
 	},
 	{
-		"Demo", nullptr, "SYSTM/GAME.TRS", "OPEN/O_DEMO.SAN", nullptr, { 0 },
-		false, false, false, false, nullptr, 0
+		"Demo", nullptr, "SYSTM/GAME.TRS", kDemoVideos, nullptr, { 0 },
+		false, false, false, false, nullptr, 0, nullptr
+	},
+	{
+		// LUCASDMO.EXE (0x401340/0x401610) plays both intro movies, using
+		// three fonts and a TRS containing only credits and the demo notice.
+		"Demo Windows 95", nullptr, "RA2VID/REBEL2.TRS", kWindowsDemoVideos, nullptr, { 0 },
+		false, false, false, false, nullptr, 0, kWindowsDemoFonts
 	},
 	{
 		// RBL2DEMO.EXE selects GAME_E.TRS. The original chapter-6 handler
 		// (LE object 1, 0x10d10) skips the shield attack and uses 06END_B.
 		"Demo DA1.06", nullptr, "SYSTM/GAME_E.TRS", nullptr, nullptr, { 6 },
-		false, true, true, false, kChapter6DemoDifficulty, ARRAYSIZE(kChapter6DemoDifficulty)
+		false, true, true, false, kChapter6DemoDifficulty, ARRAYSIZE(kChapter6DemoDifficulty), nullptr
 	},
 	{
 		// GAME.TRS selects chapters 1, 2 and 4 in playable-demo mode.
 		// LE object 1, 0xf860 advances passwords past missing chapters;
 		// 0x12eb0 plays O_PLAYDE instead of the retail finale.
 		"Demo DG1.15", nullptr, "SYSTM/GAME.TRS", nullptr, "OPEN/O_PLAYDE.SAN", { 1, 2, 4 },
-		false, false, false, true, nullptr, 0
+		false, false, false, true, nullptr, 0, nullptr
 	},
 	{
 		// GAME.TRS selects chapters 1, 2 and 3 in playable-demo mode.
 		// LE object 1, 0x12e70 plays O_PLAYDE after the last chapter;
 		// 0xf840 retains retail completion passwords, unlike DG1.15.
 		"Demo Special Edition", nullptr, "SYSTM/GAME.TRS", nullptr, "OPEN/O_PLAYDE.SAN", { 1, 2, 3 },
-		false, false, false, false, nullptr, 0
+		false, false, false, false, nullptr, 0, nullptr
 	},
 	{
 		// Macintosh v1.0's chapter-6 handler (PEF code section, 0x17fe8)
 		// also skips the shield attack in demo mode and uses 06END_B.
 		"Demo v1.0", "Rebel Assault II Demo Data", "SYSTM/GAME_E.TRS", nullptr, nullptr, { 6 },
-		false, true, true, false, kChapter6DemoDifficulty, ARRAYSIZE(kChapter6DemoDifficulty)
+		false, true, true, false, kChapter6DemoDifficulty, ARRAYSIZE(kChapter6DemoDifficulty), nullptr
 	}
 };
 
+int Rebel2Release::getFontCount() const {
+	if (!fontFiles)
+		return 4;
+	int count = 0;
+	while (fontFiles[count])
+		++count;
+	return count;
+}
+
+const char *Rebel2Release::getFontFile(int font, bool highRes) const {
+	static const char *const kFontsLo[] = {
+		"SYSTM/TALKFONT.NUT", "SYSTM/SMALFONT.NUT", "SYSTM/TITLFONT.NUT", "SYSTM/POVFONT.NUT"
+	};
+	static const char *const kFontsHi[] = {
+		"SYSTM/TKHIFONT.NUT", "SYSTM/SMHIFONT.NUT", "SYSTM/TIHIFONT.NUT", "SYSTM/POHIFONT.NUT"
+	};
+	if (font < 0 || font >= getFontCount())
+		font = 0;
+	return fontFiles ? fontFiles[font] : (highRes ? kFontsHi[font] : kFontsLo[font]);
+}
+
 bool Rebel2Release::isChapterAvailable(int chapter) const {
 	if (chapter == kFinale)
 		return ending;
diff --git a/engines/scumm/insane/rebel2/releases.h b/engines/scumm/insane/rebel2/releases.h
index a5049575842..9a768ae4a3b 100644
--- a/engines/scumm/insane/rebel2/releases.h
+++ b/engines/scumm/insane/rebel2/releases.h
@@ -51,13 +51,19 @@ struct Rebel2DifficultyOverride {
 	Rebel2DifficultyParams difficulty[6];
 };
 
+struct Rebel2DemoVideo {
+	const char *filename;
+	int16 flags;
+};
+
 struct Rebel2Release {
 	enum { kNumLevels = 15, kFinale = 16 };
 
 	const char *variant;
 	const char *container;
 	const char *strings;
-	const char *nonInteractiveVideo;
+	// Null-terminated playlist for non-interactive demos.
+	const Rebel2DemoVideo *nonInteractiveVideos;
 	const char *completionVideo;
 	// Chapter numbers in playback order; unused entries are zero.
 	byte levels[kNumLevels];
@@ -68,11 +74,15 @@ struct Rebel2Release {
 	bool advanceCompletionPasswords;
 	const Rebel2DifficultyOverride *difficultyOverrides;
 	uint difficultyOverrideCount;
+	// Optional null-terminated list replacing the retail movie fonts.
+	const char *const *fontFiles;
 
 	bool isChapterAvailable(int chapter) const;
 	int getNextChapter(int chapter) const;
 	int getCompletionPasswordChapter(int chapter) const;
 	const Rebel2DifficultyParams *getDifficultyOverride(int difficulty, int levelType) const;
+	int getFontCount() const;
+	const char *getFontFile(int font, bool highRes) const;
 };
 
 Rebel2Release getRebel2Release(const char *variant, bool restoredContent = false);
diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp
index 475cdecc67d..d1d7a7646b6 100644
--- a/engines/scumm/saveload.cpp
+++ b/engines/scumm/saveload.cpp
@@ -108,8 +108,10 @@ bool ScummEngine::canLoadGameStateCurrently(Common::U32String *msg) {
 		const InsaneRebel1 *rebel = (InsaneRebel1 *)((ScummEngine_v7 *)this)->getInsane();
 		return rebel && rebel->hasPlayableLevels();
 	}
-	if (_game.id == GID_REBEL2)
-		return true;
+	if (_game.id == GID_REBEL2) {
+		const InsaneRebel2 *rebel = (InsaneRebel2 *)((ScummEngine_v7 *)this)->getInsane();
+		return rebel && !rebel->_release.nonInteractiveVideos;
+	}
 #endif
 
 	// FIXME: For now always allow loading in V0-V3 games
diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h
index 6744cab4cda..bd69b2f5b50 100644
--- a/engines/scumm/scumm-md5.h
+++ b/engines/scumm/scumm-md5.h
@@ -1,5 +1,5 @@
 /*
-  This file was generated by the md5table tool on Sun Sep 27 14:58:20 2026
+  This file was generated by the md5table tool on Sun Sep 27 15:12:52 2026
   DO NOT EDIT MANUALLY!
  */
 
@@ -713,6 +713,7 @@ static const MD5Table md5table[] = {
 	{ "d6334a5a9b61afe18c368540fdf522ca", "airport", "", "", -1, Common::EN_ANY, Common::kPlatformMacintosh },
 	{ "d670454da245c19bef988a341c416e40", "monkey2", "SE", "SE", 506101054, Common::EN_ANY, Common::kPlatformDOS },
 	{ "d6dd0646404768a63e963891a96daadd", "atlantis", "Mac Floppy", "Floppy", 12035, Common::EN_ANY, Common::kPlatformMacintosh },
+	{ "d738db94e852d8a0e2405b0bc4f4d4fb", "rebel2", "Demo Windows 95", "Demo Windows 95", 126976, Common::EN_ANY, Common::kPlatformWindows },
 	{ "d73c851b942af44deb9b6d5f416a0972", "freddi3", "HE 99", "Demo", 22779, Common::HE_ISR, Common::kPlatformWindows },
 	{ "d74122362a77ec24525fdd50297dfd82", "freddi4", "", "", -1, Common::FR_FRA, Common::kPlatformMacintosh },
 	{ "d77be4d8a3e609092703508e09f1ed5d", "rebel1", "", "", 132904, Common::JA_JPN, Common::kPlatformSegaCD },
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index 75040205bc9..e3f1bff152c 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -412,7 +412,8 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
 	} else if (_game.id == GID_REBEL2 && _game.platform == Common::kPlatformPSX) {
 		_screenHeight = 240;
 #endif
-	} else if (_game.id == GID_REBEL2 && ConfMan.getBool("rebel2_hires")) {
+	} else if (_game.id == GID_REBEL2 &&
+			Common::checkGameGUIOption(GAMEOPTION_REBEL2_HIRES, _game.guioptions) && ConfMan.getBool("rebel2_hires")) {
 		_screenWidth = 640;
 		_screenHeight = 400;
 	} else if (_game.version == 8 || _game.heversion >= 71) {
diff --git a/engines/scumm/smush/rebel/smush_multi_font.cpp b/engines/scumm/smush/rebel/smush_multi_font.cpp
index 8bf8172e884..ebd154f5659 100644
--- a/engines/scumm/smush/rebel/smush_multi_font.cpp
+++ b/engines/scumm/smush/rebel/smush_multi_font.cpp
@@ -23,6 +23,8 @@
 #include "scumm/smush/smush_font.h"
 #include "scumm/smush/smush_player.h"
 #include "scumm/scumm.h"
+#include "scumm/scumm_v7.h"
+#include "scumm/insane/rebel2/rebel.h"
 
 namespace Scumm {
 
@@ -47,30 +49,19 @@ NutRenderer *SmushMultiFont::getCurrentFont() const {
 }
 
 Rebel2FontSet SmushMultiFont::getRebel2FontSet() {
-	// High-res mode uses dedicated larger-glyph font assets.
-	static const char *ra2FontsLo[] = {
-		"SYSTM/TALKFONT.NUT",
-		"SYSTM/SMALFONT.NUT",
-		"SYSTM/TITLFONT.NUT",
-		"SYSTM/POVFONT.NUT"
-	};
-	static const char *ra2FontsHi[] = {
-		"SYSTM/TKHIFONT.NUT",
-		"SYSTM/SMHIFONT.NUT",
-		"SYSTM/TIHIFONT.NUT",
-		"SYSTM/POHIFONT.NUT"
-	};
+	const Rebel2Release &release = static_cast<InsaneRebel2 *>(
+		static_cast<ScummEngine_v7 *>(_vm)->getInsane())->_release;
 	const bool highRes = _vm->_screenWidth >= 640 && _vm->_screenHeight >= 400;
-	const char *const *ra2Fonts = highRes ? ra2FontsHi : ra2FontsLo;
 
 	Rebel2FontSet fontSet(_vm->_language == Common::JA_JPN);
-	fontSet.numFonts = ARRAYSIZE(ra2FontsLo);
+	fontSet.numFonts = release.getFontCount();
 	fontSet.defaultFont = CLIP<int>(_defaultFont, 0, fontSet.numFonts - 1);
 	for (int i = 0; i < fontSet.numFonts; i++) {
 		if (!_rebel2Fonts[i]) {
-			_rebel2Fonts[i] = makeRebel2Font(_vm, ra2Fonts[i]);
+			const char *filename = release.getFontFile(i, highRes);
+			_rebel2Fonts[i] = makeRebel2Font(_vm, filename);
 			debugC(DEBUG_SMUSH, "SmushMultiFont::getRebel2FontSet: loaded RA2 font[%d]=%s (highRes=%d)",
-				i, ra2Fonts[i], (int)highRes);
+				i, filename, (int)highRes);
 		}
 		fontSet.fonts[i] = _rebel2Fonts[i];
 	}
diff --git a/engines/scumm/smush/rebel/smush_player_ra2.cpp b/engines/scumm/smush/rebel/smush_player_ra2.cpp
index 1d9168639e3..36e88cb124a 100644
--- a/engines/scumm/smush/rebel/smush_player_ra2.cpp
+++ b/engines/scumm/smush/rebel/smush_player_ra2.cpp
@@ -477,7 +477,7 @@ bool SmushPlayerRebel2::handleGameTextResource(uint32 subType, int32 subSize, Co
 	}
 
 	TextStyleFlags flg = (TextStyleFlags)(flags & 7);
-	if (ConfMan.getBool("subtitles"))
+	if (static_cast<InsaneRebel2 *>(_insane)->_release.nonInteractiveVideos || ConfMan.getBool("subtitles"))
 		ra2HandleTextResource(str, fontId, color, posX, posY, left, top, width, height, flg);
 
 	free(text);
@@ -493,27 +493,9 @@ bool SmushPlayerRebel2::handleGameTextRendering(const char *str, int fontId, int
 }
 
 SmushFont *SmushPlayerRebel2::getGameFont(int font) {
-	const char *ra2FontsLo[] = {
-		"SYSTM/TALKFONT.NUT",
-		"SYSTM/SMALFONT.NUT",
-		"SYSTM/TITLFONT.NUT",
-		"SYSTM/POVFONT.NUT"
-	};
-	const char *ra2FontsHi[] = {
-		"SYSTM/TKHIFONT.NUT",
-		"SYSTM/SMHIFONT.NUT",
-		"SYSTM/TIHIFONT.NUT",
-		"SYSTM/POHIFONT.NUT"
-	};
+	const Rebel2Release &release = static_cast<InsaneRebel2 *>(_insane)->_release;
 	const bool highRes = _vm->_screenWidth >= 640 && _vm->_screenHeight >= 400;
-	const char **ra2Fonts = highRes ? ra2FontsHi : ra2FontsLo;
-	int numFonts = ARRAYSIZE(ra2FontsLo);
-	if (font >= 0 && font < numFonts) {
-		_sf[font] = new SmushFont(_vm, ra2Fonts[font], true);
-	} else {
-		debugC(DEBUG_SMUSH, "SmushPlayerRebel2::getGameFont: RA2 unknown font %d, using TALKFONT", font);
-		_sf[font] = new SmushFont(_vm, ra2Fonts[0], true);
-	}
+	_sf[font] = new SmushFont(_vm, release.getFontFile(font, highRes), true);
 	return _sf[font];
 }
 
@@ -530,9 +512,11 @@ class StringResourceRA2 : public StringResource {
 	int _ra2NbStrings;
 	int _ra2LastId;
 	const char *_ra2LastString;
+	bool _ignoreMissingStrings;
 
 public:
-	StringResourceRA2() : _ra2NbStrings(0), _ra2LastId(-1), _ra2LastString(nullptr) {
+	StringResourceRA2(bool ignoreMissingStrings) :
+			_ra2NbStrings(0), _ra2LastId(-1), _ra2LastString(nullptr), _ignoreMissingStrings(ignoreMissingStrings) {
 		for (int i = 0; i < RA2_MAX_STRINGS; i++) {
 			_ra2Strings[i].id = 0;
 			_ra2Strings[i].string = nullptr;
@@ -623,6 +607,10 @@ public:
 				return _ra2LastString;
 			}
 		}
+		// Preview TRS files can omit dialogue subtitles still referenced by
+		// the movies. LUCASDMO.EXE's 0x40e790/0x4016d0 skips those entries.
+		if (_ignoreMissingStrings)
+			return "";
 		warning("StringResourceRA2: invalid string id : %d", id);
 		_ra2LastId = -1;
 		_ra2LastString = "unknown string";
@@ -652,7 +640,8 @@ bool SmushPlayerRebel2::handleGameSetupStrings() {
 		filebuffer[length] = '\0';
 	}
 
-	StringResourceRA2 *sr = new StringResourceRA2;
+	StringResourceRA2 *sr = new StringResourceRA2(
+		static_cast<InsaneRebel2 *>(_insane)->_release.nonInteractiveVideos != nullptr);
 	sr->init(filebuffer, length);
 	delete[] filebuffer;
 	_strings = sr;


Commit: 69017d06a522a802e7dc1c35b8ed7d1c34d2b293
    https://github.com/scummvm/scummvm/commit/69017d06a522a802e7dc1c35b8ed7d1c34d2b293
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-27T21:51:37+02:00

Commit Message:
SCUMM: RA1: added support for german release v1.8

Changed paths:
    devtools/scumm-md5.txt
    engines/scumm/scumm-md5.h


diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt
index 80a1a53c69d..cf241cf40de 100644
--- a/devtools/scumm-md5.txt
+++ b/devtools/scumm-md5.txt
@@ -460,6 +460,7 @@ rebel1	Star Wars: Rebel Assault
 	6bb0fe2d7816c5528c773f2898e4e0ff	212915	en	DOS	-	v1.7	-	-
 	02236dcfb0cac59457153fc296233825	213171	fr	DOS	-	v1.7	-	-
 	b978b92affdfe5744711ca0cb3548720	213115	de	DOS	-	v1.7	-	-
+	2f258cec59ae69fb451d82d0881208db	212915	en	DOS	-	v1.8	Official patch	-
 	bb1d02798011e5906c4c726be4d63544	1908	en	3DO	-	-	-	-
 	d77be4d8a3e609092703508e09f1ed5d	132904	ja	SEGA	-	-	-	-
 	62543831f454b46ef8d0f50b9e1c063c	560453	en	Mac	-	-	68k application	-
diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h
index bd69b2f5b50..d6ca634635c 100644
--- a/engines/scumm/scumm-md5.h
+++ b/engines/scumm/scumm-md5.h
@@ -1,5 +1,5 @@
 /*
-  This file was generated by the md5table tool on Sun Sep 27 15:12:52 2026
+  This file was generated by the md5table tool on Sun Sep 27 15:27:01 2026
   DO NOT EDIT MANUALLY!
  */
 
@@ -177,6 +177,7 @@ static const MD5Table md5table[] = {
 	{ "2e85f7aa054930c692a5b1bed1dfc295", "football2002", "", "Patched", -1, Common::EN_ANY, Common::kPlatformUnknown },
 	{ "2e8a1f76ea33bc5e04347646feee173d", "pajama3", "", "", -1, Common::DE_DEU, Common::kPlatformUnknown },
 	{ "2edee19abf8ab2868b09c5959683dbd4", "loom", "FM-TOWNS", "", 7540, Common::IT_ITA, Common::kPlatformFMTowns },
+	{ "2f258cec59ae69fb451d82d0881208db", "rebel1", "", "v1.8", 212915, Common::EN_ANY, Common::kPlatformDOS },
 	{ "2f7583da072d027057983c43bb3fa53f", "spyfox", "HE 100", "", 49742, Common::EN_GRB, Common::kPlatformWii },
 	{ "2fe369ad70f52a8cf7ad6077ee64f81a", "loom", "EGA", "EGA", 5748, Common::DE_DEU, Common::kPlatformAmiga },
 	{ "303708df4166067540a5c481eceb04ef", "loom", "FM-TOWNS", "", 7540, Common::RU_RUS, Common::kPlatformFMTowns },


Commit: 7d74f5a0e250b8098b573cfdbd069281b3bfa626
    https://github.com/scummvm/scummvm/commit/7d74f5a0e250b8098b573cfdbd069281b3bfa626
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-27T21:51:37+02:00

Commit Message:
SCUMM: RA2: added support for another demo

Changed paths:
    devtools/scumm-md5.txt
    engines/scumm/detection_tables.h
    engines/scumm/insane/rebel2/levels.cpp
    engines/scumm/insane/rebel2/releases.cpp
    engines/scumm/insane/rebel2/releases.h
    engines/scumm/scumm-md5.h


diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt
index cf241cf40de..3856764876d 100644
--- a/devtools/scumm-md5.txt
+++ b/devtools/scumm-md5.txt
@@ -474,6 +474,7 @@ rebel2	Star Wars: Rebel Assault II: The Hidden Empire
 	e977ed046b88e75b645491caeff37b0c	313689	en	DOS	Demo	Demo	-	-
 	d738db94e852d8a0e2405b0bc4f4d4fb	126976	en	Windows	Demo Windows 95	Demo Windows 95	LucasArts non-interactive demo bundle	-
 	967409fc4c12b39fb3cf47f45de2623c	646373	en	DOS	Demo DA1.06	Demo DA1.06	Playable demo (chapter 6)	-
+	54b33908bb1e1632fa96edee53edb697	641717	en	DOS	Demo DB1.03	Demo DB1.03	Softgold demo CD (chapters 6 and 8)	-
 	8e0788210af982fbbc43c244ac6f9581	663561	en	DOS	Demo DG1.15	Demo DG1.15	The Dreighton Encounter (chapters 1, 2 and 4)	-
 	ca546c05ec7be680bb7d97675dc9ba59	662441	en	DOS	Demo Special Edition	Demo Special Edition	Special Edition (chapters 1, 2 and 3)	-
 	d89f31e209c0642b4d20ccf615840401	128658792	en	Mac	Demo v1.0	Demo v1.0	Mac bundle (chapter 6)	-
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index fa6d8226c87..130731454f4 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -242,6 +242,7 @@ static const GameSettings gameVariantsTable[] = {
 	{"rebel2", "Demo", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
 	{"rebel2", "Demo Windows 95", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformWindows, GUIO3(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD, GUIO_NOSUBTITLES)},
 	{"rebel2", "Demo DA1.06", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO6(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE, GAMEOPTION_REBEL2_RESTORED_CONTENT)},
+	{"rebel2", "Demo DB1.03", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
 	{"rebel2", "Demo DG1.15", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
 	{"rebel2", "Demo Special Edition", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
 	{"rebel2", "Demo v1.0", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformMacintosh, GUIO6(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE, GAMEOPTION_REBEL2_RESTORED_CONTENT)},
diff --git a/engines/scumm/insane/rebel2/levels.cpp b/engines/scumm/insane/rebel2/levels.cpp
index 7441a535987..295732693da 100644
--- a/engines/scumm/insane/rebel2/levels.cpp
+++ b/engines/scumm/insane/rebel2/levels.cpp
@@ -333,6 +333,11 @@ void InsaneRebel2::prepareLevelEndStats(int levelId, int accuracy, int flightErr
 	}
 
 	Rebel2LevelEndParams p = kRebel2LevelEndParams[levelId];
+	const Rebel2AccuracyOverride *accuracyOverride = _release.getAccuracyOverride(levelId);
+	if (accuracyOverride) {
+		p.accLow = accuracyOverride->low;
+		p.accHigh = accuracyOverride->high;
+	}
 	if (levelId == 6 && _release.skipMiningFacilityAttack) {
 		p.titleStartBeforeEnd = 120;
 		p.titleEndBeforeEnd = 10;
@@ -814,7 +819,10 @@ void InsaneRebel2::playLevelRetryVariant(int levelId, int phase) {
 	Common::String prefix = getLevelPrefix(levelId);
 	Common::String filename;
 
-	if ((levelId == 3 || levelId == 6) && phase == 2) {
+	// Chapter-6 demos use the regular retry movie for their reactor-only run.
+	const bool secondPhaseRetry = phase == 2 &&
+		(levelId == 3 || (levelId == 6 && !_release.skipMiningFacilityAttack));
+	if (secondPhaseRetry) {
 		filename = Common::String::format("%s/%sRETRYB.SAN", dir.c_str(), prefix.c_str());
 	} else {
 		filename = Common::String::format("%s/%sRETRY.SAN", dir.c_str(), prefix.c_str());
diff --git a/engines/scumm/insane/rebel2/releases.cpp b/engines/scumm/insane/rebel2/releases.cpp
index 7038b5b14d3..843e7065259 100644
--- a/engines/scumm/insane/rebel2/releases.cpp
+++ b/engines/scumm/insane/rebel2/releases.cpp
@@ -49,6 +49,33 @@ static const Rebel2DifficultyOverride kChapter6DemoDifficulty[] = {
 	} }
 };
 
+// DB1.03's difficulty table starts at 0x4760 in LE object 3, with the same
+// layout as DA1.06. Only the reactor attack (type 6) and chapter 8 are present.
+static const Rebel2DifficultyOverride kDemoDB103Difficulty[] = {
+	{ 6, {
+		{ 6, 5, 180, 27, 3, -1, 75, 25, 50, 2, 500, 250, 8, 120, 120, 120, 85 },
+		{ 5, 3, 190, 35, 4, -1, 75, 50, 100, 4, 1000, 500, 16, 140, 140, 140, 100 },
+		{ 5, 1, 200, 50, 4, -1, 75, 75, 150, 6, 1500, 750, 0, 160, 160, 160, 120 },
+		{ 7, 0, 220, 90, 30, -1, 100, 100, 200, 8, 2000, 1000, 4, 180, 180, 180, 140 },
+		{ 5, 1, 200, 50, 4, -1, 75, 75, 150, 6, 1500, 750, 0, 160, 160, 160, 120 },
+		{ 5, 1, 200, 50, 4, -1, 75, 75, 150, 6, 1500, 750, 0, 160, 160, 160, 120 }
+	} },
+	{ 8, {
+		{ 6, 8, 21, -1, 2, -1, 75, 25, -1, 2, 500, 250, 8, -1, -1, -1, -1 },
+		{ 6, 5, 24, -1, 2, -1, 75, 50, -1, 4, 1000, 500, 16, -1, -1, -1, -1 },
+		{ 6, 3, 28, -1, 3, -1, 60, 75, -1, 6, 1500, 750, 0, -1, -1, -1, -1 },
+		{ 6, 2, 38, -1, 3, -1, 68, 100, -1, 8, 2000, 1000, 4, -1, -1, -1, -1 },
+		{ 6, 3, 28, -1, 3, -1, 60, 75, -1, 6, 1500, 750, 0, -1, -1, -1, -1 },
+		{ 6, 3, 28, -1, 3, -1, 60, 75, -1, 6, 1500, 750, 0, -1, -1, -1, -1 }
+	} }
+};
+
+// Chapter handlers at 0x10c30 and 0x11230 pass these thresholds to the
+// completion-bonus routine at 0xf550, instead of the retail 60/76 and 90/96.
+static const Rebel2AccuracyOverride kDemoDB103Accuracy[] = {
+	{ 6, 70, 90 }, { 8, 90, 95 }, { 0, 0, 0 }
+};
+
 static const Rebel2DemoVideo kDemoVideos[] = {
 	{ "OPEN/O_DEMO.SAN", 0 },
 	{ nullptr, 0 }
@@ -70,43 +97,50 @@ static const Rebel2Release kReleases[] = {
 	{
 		"", nullptr, "SYSTM/GAME.TRS", nullptr, nullptr,
 		{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
-		true, false, false, false, nullptr, 0, nullptr
+		true, false, false, false, false, nullptr, 0, nullptr, nullptr
 	},
 	{
 		"Demo", nullptr, "SYSTM/GAME.TRS", kDemoVideos, nullptr, { 0 },
-		false, false, false, false, nullptr, 0, nullptr
+		false, false, false, false, false, nullptr, 0, nullptr, nullptr
 	},
 	{
 		// LUCASDMO.EXE (0x401340/0x401610) plays both intro movies, using
 		// three fonts and a TRS containing only credits and the demo notice.
 		"Demo Windows 95", nullptr, "RA2VID/REBEL2.TRS", kWindowsDemoVideos, nullptr, { 0 },
-		false, false, false, false, nullptr, 0, kWindowsDemoFonts
+		false, false, false, false, false, nullptr, 0, nullptr, kWindowsDemoFonts
 	},
 	{
 		// RBL2DEMO.EXE selects GAME_E.TRS. The original chapter-6 handler
 		// (LE object 1, 0x10d10) skips the shield attack and uses 06END_B.
 		"Demo DA1.06", nullptr, "SYSTM/GAME_E.TRS", nullptr, nullptr, { 6 },
-		false, true, true, false, kChapter6DemoDifficulty, ARRAYSIZE(kChapter6DemoDifficulty), nullptr
+		false, true, true, true, false, kChapter6DemoDifficulty, ARRAYSIZE(kChapter6DemoDifficulty), nullptr, nullptr
+	},
+	{
+		// REB2DEMO.EXE selects GAME_D.TRS, enabling chapters 6 and 8.
+		// The chapter-6 handler (LE object 1, 0x10c30) skips the shield attack
+		// and uses 06END_B. This CD omits the files needed to restore that phase.
+		"Demo DB1.03", nullptr, "SYSTM/GAME_D.TRS", nullptr, nullptr, { 6, 8 },
+		false, true, true, false, false, kDemoDB103Difficulty, ARRAYSIZE(kDemoDB103Difficulty), kDemoDB103Accuracy, nullptr
 	},
 	{
 		// GAME.TRS selects chapters 1, 2 and 4 in playable-demo mode.
 		// LE object 1, 0xf860 advances passwords past missing chapters;
 		// 0x12eb0 plays O_PLAYDE instead of the retail finale.
 		"Demo DG1.15", nullptr, "SYSTM/GAME.TRS", nullptr, "OPEN/O_PLAYDE.SAN", { 1, 2, 4 },
-		false, false, false, true, nullptr, 0, nullptr
+		false, false, false, false, true, nullptr, 0, nullptr, nullptr
 	},
 	{
 		// GAME.TRS selects chapters 1, 2 and 3 in playable-demo mode.
 		// LE object 1, 0x12e70 plays O_PLAYDE after the last chapter;
 		// 0xf840 retains retail completion passwords, unlike DG1.15.
 		"Demo Special Edition", nullptr, "SYSTM/GAME.TRS", nullptr, "OPEN/O_PLAYDE.SAN", { 1, 2, 3 },
-		false, false, false, false, nullptr, 0, nullptr
+		false, false, false, false, false, nullptr, 0, nullptr, nullptr
 	},
 	{
 		// Macintosh v1.0's chapter-6 handler (PEF code section, 0x17fe8)
 		// also skips the shield attack in demo mode and uses 06END_B.
 		"Demo v1.0", "Rebel Assault II Demo Data", "SYSTM/GAME_E.TRS", nullptr, nullptr, { 6 },
-		false, true, true, false, kChapter6DemoDifficulty, ARRAYSIZE(kChapter6DemoDifficulty), nullptr
+		false, true, true, true, false, kChapter6DemoDifficulty, ARRAYSIZE(kChapter6DemoDifficulty), nullptr, nullptr
 	}
 };
 
@@ -174,13 +208,23 @@ const Rebel2DifficultyParams *Rebel2Release::getDifficultyOverride(int difficult
 	return nullptr;
 }
 
+const Rebel2AccuracyOverride *Rebel2Release::getAccuracyOverride(int chapter) const {
+	if (accuracyOverrides) {
+		for (const Rebel2AccuracyOverride *entry = accuracyOverrides; entry->chapter; ++entry) {
+			if (entry->chapter == chapter)
+				return entry;
+		}
+	}
+	return nullptr;
+}
+
 Rebel2Release getRebel2Release(const char *variant, bool restoredContent) {
 	if (!variant)
 		variant = "";
 	for (const Rebel2Release &release : kReleases) {
 		if (!strcmp(variant, release.variant)) {
 			Rebel2Release result = release;
-			if (restoredContent)
+			if (restoredContent && release.canRestoreMiningFacilityAttack)
 				result.skipMiningFacilityAttack = false;
 			return result;
 		}
diff --git a/engines/scumm/insane/rebel2/releases.h b/engines/scumm/insane/rebel2/releases.h
index 9a768ae4a3b..d4dabbe2ead 100644
--- a/engines/scumm/insane/rebel2/releases.h
+++ b/engines/scumm/insane/rebel2/releases.h
@@ -51,6 +51,12 @@ struct Rebel2DifficultyOverride {
 	Rebel2DifficultyParams difficulty[6];
 };
 
+struct Rebel2AccuracyOverride {
+	byte chapter;
+	int16 low;
+	int16 high;
+};
+
 struct Rebel2DemoVideo {
 	const char *filename;
 	int16 flags;
@@ -71,9 +77,13 @@ struct Rebel2Release {
 	bool unlockAvailableLevels;
 	// The chapter-6 demos start at the attack on the reactor.
 	bool skipMiningFacilityAttack;
+	// Some demos omit the shield-attack resources entirely.
+	bool canRestoreMiningFacilityAttack;
 	bool advanceCompletionPasswords;
 	const Rebel2DifficultyOverride *difficultyOverrides;
 	uint difficultyOverrideCount;
+	// Optional chapter-completion thresholds, terminated by chapter zero.
+	const Rebel2AccuracyOverride *accuracyOverrides;
 	// Optional null-terminated list replacing the retail movie fonts.
 	const char *const *fontFiles;
 
@@ -81,6 +91,7 @@ struct Rebel2Release {
 	int getNextChapter(int chapter) const;
 	int getCompletionPasswordChapter(int chapter) const;
 	const Rebel2DifficultyParams *getDifficultyOverride(int difficulty, int levelType) const;
+	const Rebel2AccuracyOverride *getAccuracyOverride(int chapter) const;
 	int getFontCount() const;
 	const char *getFontFile(int font, bool highRes) const;
 };
diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h
index d6ca634635c..97039521d1b 100644
--- a/engines/scumm/scumm-md5.h
+++ b/engines/scumm/scumm-md5.h
@@ -1,5 +1,5 @@
 /*
-  This file was generated by the md5table tool on Sun Sep 27 15:27:01 2026
+  This file was generated by the md5table tool on Sun Sep 27 15:46:56 2026
   DO NOT EDIT MANUALLY!
  */
 
@@ -295,6 +295,7 @@ static const MD5Table md5table[] = {
 	{ "52a4bae0746a11d7b1e8554e91a6645c", "zak", "V2", "V2", 1916, Common::FR_FRA, Common::kPlatformDOS },
 	{ "53e94115b55dd51d4b8ff0871aa1df1e", "spyfox", "", "Demo", 20103, Common::EN_USA, Common::kPlatformUnknown },
 	{ "54a936ad06161ff7bfefcb96200f7bff", "monkey", "VGA Demo", "Demo", 7617, Common::EN_ANY, Common::kPlatformAmiga },
+	{ "54b33908bb1e1632fa96edee53edb697", "rebel2", "Demo DB1.03", "Demo DB1.03", 641717, Common::EN_ANY, Common::kPlatformDOS },
 	{ "551a7c06bf5098b32d5fe7641d695df8", "rebel1", "Demo 1994-04-13", "Demo 1994-04-13", 226750, Common::EN_ANY, Common::kPlatformDOS },
 	{ "55518cd73cf9c6d23ea29c51ee06bdfe", "ft", "", "", -1, Common::IT_ITA, Common::kPlatformUnknown },
 	{ "55923e34363c8ec6541368101d84a3bf", "soccer", "", "", 67178, Common::EN_GRB, Common::kPlatformWindows },


Commit: 558a22ce7789e5e192168b27b0acc5517e674030
    https://github.com/scummvm/scummvm/commit/558a22ce7789e5e192168b27b0acc5517e674030
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-27T21:51:37+02:00

Commit Message:
SCUMM: RA1: added support for special edition demo

Changed paths:
    devtools/scumm-md5.txt
    engines/scumm/scumm-md5.h


diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt
index 3856764876d..909c21e90f1 100644
--- a/devtools/scumm-md5.txt
+++ b/devtools/scumm-md5.txt
@@ -453,6 +453,7 @@ rebel1	Star Wars: Rebel Assault
 	0ca9c07185b4969764eaf3ecd0de06e9	111530	en	DOS	Demo v0.67	Demo v0.67	Non-interactive demo	-
 	a29730a42dfcff7bc2e10acfca1e76a2	212951	en	DOS	Demo v1.5	Demo v1.5	CD-ROM demo (chapters 2 and 10)	-
 	274f6026d41fa2a2990a6d6b7a561dc2	217559	en	DOS	Demo v1.51	Demo v1.51	CD-ROM demo	-
+	5a76a7967ae1d87b43c3e8c6ba9773a0	217559	en	DOS	Demo v1.51	Demo Special Edition	Dark Forces and Rebel Assault Special Editions CD	-
 	551a7c06bf5098b32d5fe7641d695df8	226750	en	DOS	Demo 1994-04-13	Demo 1994-04-13	CD-ROM demo (chapters 8 and 10)	-
 	4e9f4571f5859ea50f1e505a1f15c408	451096	en	Mac	Demo v1.02c	Demo v1.02c	68k demo application (chapters 6 and 9)	-
 	b9ac90e4411da1b6f7dd075cc4b03c2a	214435	en	DOS	-	v1.0	-	-
diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h
index 97039521d1b..d5eddc4d61f 100644
--- a/engines/scumm/scumm-md5.h
+++ b/engines/scumm/scumm-md5.h
@@ -1,5 +1,5 @@
 /*
-  This file was generated by the md5table tool on Sun Sep 27 15:46:56 2026
+  This file was generated by the md5table tool on Sun Sep 27 16:59:28 2026
   DO NOT EDIT MANUALLY!
  */
 
@@ -320,6 +320,7 @@ static const MD5Table md5table[] = {
 	{ "591bb98948d277f6c91e65db3f26c829", "atlantis", "", "Demo", 11210, Common::EN_ANY, Common::kPlatformMacintosh },
 	{ "59d5cfcc5e672a6e07baae01328b918b", "PuttTime", "HE 90", "Demo", 18394, Common::FR_FRA, Common::kPlatformUnknown },
 	{ "5a35e36fd777e9c37a49c5b2faca52f9", "loom", "Demo", "EGA Demo", 6108, Common::EN_ANY, Common::kPlatformDOS },
+	{ "5a76a7967ae1d87b43c3e8c6ba9773a0", "rebel1", "Demo v1.51", "Demo Special Edition", 217559, Common::EN_ANY, Common::kPlatformDOS },
 	{ "5b08000a9c47b2887df6506ac767ca68", "fbear", "HE 62", "", -1, Common::EN_ANY, Common::kPlatform3DO },
 	{ "5bd335265a61caa3d78956ad9f88ba23", "football", "", "Demo", 23135, Common::EN_ANY, Common::kPlatformUnknown },
 	{ "5c21fc49aee8f46e58fef21579e614a1", "thinker1", "", "", -1, Common::EN_USA, Common::kPlatformUnknown },


Commit: dfd658a885bb84b3bed3069e5b9535af4f4f73a0
    https://github.com/scummvm/scummvm/commit/dfd658a885bb84b3bed3069e5b9535af4f4f73a0
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-27T21:51:37+02:00

Commit Message:
SCUMM: RA2: added support for an alternative non-interacive dos demo

Changed paths:
    engines/scumm/detection_tables.h
    engines/scumm/insane/rebel2/releases.cpp


diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index 130731454f4..8cd92953a64 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -239,7 +239,7 @@ static const GameSettings gameVariantsTable[] = {
 	{"rebel1", "Demo v1.02c", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformMacintosh, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
 
 	{"rebel2", "", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
-	{"rebel2", "Demo", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
+	{"rebel2", "Demo", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO3(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD, GUIO_NOSUBTITLES)},
 	{"rebel2", "Demo Windows 95", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformWindows, GUIO3(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD, GUIO_NOSUBTITLES)},
 	{"rebel2", "Demo DA1.06", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO6(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE, GAMEOPTION_REBEL2_RESTORED_CONTENT)},
 	{"rebel2", "Demo DB1.03", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
diff --git a/engines/scumm/insane/rebel2/releases.cpp b/engines/scumm/insane/rebel2/releases.cpp
index 843e7065259..46e3e799b78 100644
--- a/engines/scumm/insane/rebel2/releases.cpp
+++ b/engines/scumm/insane/rebel2/releases.cpp
@@ -81,6 +81,10 @@ static const Rebel2DemoVideo kDemoVideos[] = {
 	{ nullptr, 0 }
 };
 
+static const char *const kDemoFonts[] = {
+	"SYSTM/TALKFONT.NUT", "SYSTM/SMALFONT.NUT", nullptr
+};
+
 static const Rebel2DemoVideo kWindowsDemoVideos[] = {
 	{ "RA2VID/O_OPEN_A.SAN", 0x28 },
 	{ "RA2VID/O_OPEN_B.SAN", 0x28 },
@@ -100,8 +104,10 @@ static const Rebel2Release kReleases[] = {
 		true, false, false, false, false, nullptr, 0, nullptr, nullptr
 	},
 	{
-		"Demo", nullptr, "SYSTM/GAME.TRS", kDemoVideos, nullptr, { 0 },
-		false, false, false, false, false, nullptr, 0, nullptr, nullptr
+		// REBEL2.EXE (LE object 1, 0x10) loads two fonts and DEFAULT.TRS
+		// for the release announcement at the end of O_DEMO.SAN.
+		"Demo", nullptr, "SYSTM/DEFAULT.TRS", kDemoVideos, nullptr, { 0 },
+		false, false, false, false, false, nullptr, 0, nullptr, kDemoFonts
 	},
 	{
 		// LUCASDMO.EXE (0x401340/0x401610) plays both intro movies, using


Commit: 12307dbb4f7d30735532e422961d4ee3ff71cbfa
    https://github.com/scummvm/scummvm/commit/12307dbb4f7d30735532e422961d4ee3ff71cbfa
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-27T21:51:37+02:00

Commit Message:
SCUMM: RA1: added support for an alternative non-interacive dos demo

Changed paths:
    devtools/scumm-md5.txt
    engines/scumm/detection_tables.h
    engines/scumm/insane/rebel1/releases.cpp
    engines/scumm/scumm-md5.h


diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt
index 909c21e90f1..7a294680f67 100644
--- a/devtools/scumm-md5.txt
+++ b/devtools/scumm-md5.txt
@@ -454,6 +454,7 @@ rebel1	Star Wars: Rebel Assault
 	a29730a42dfcff7bc2e10acfca1e76a2	212951	en	DOS	Demo v1.5	Demo v1.5	CD-ROM demo (chapters 2 and 10)	-
 	274f6026d41fa2a2990a6d6b7a561dc2	217559	en	DOS	Demo v1.51	Demo v1.51	CD-ROM demo	-
 	5a76a7967ae1d87b43c3e8c6ba9773a0	217559	en	DOS	Demo v1.51	Demo Special Edition	Dark Forces and Rebel Assault Special Editions CD	-
+	0d6b6e42fffc11c4c7957951d3601b80	218075	en	DOS	Demo v1.7	Demo v1.7	PC Media 1 non-interactive demo	-
 	551a7c06bf5098b32d5fe7641d695df8	226750	en	DOS	Demo 1994-04-13	Demo 1994-04-13	CD-ROM demo (chapters 8 and 10)	-
 	4e9f4571f5859ea50f1e505a1f15c408	451096	en	Mac	Demo v1.02c	Demo v1.02c	68k demo application (chapters 6 and 9)	-
 	b9ac90e4411da1b6f7dd075cc4b03c2a	214435	en	DOS	-	v1.0	-	-
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index 8cd92953a64..205affb2be8 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -235,6 +235,7 @@ static const GameSettings gameVariantsTable[] = {
 	{"rebel1", "Demo v0.67", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO2(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD)},
 	{"rebel1", "Demo v1.5", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
 	{"rebel1", "Demo v1.51", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
+	{"rebel1", "Demo v1.7", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO2(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD)},
 	{"rebel1", "Demo 1994-04-13", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO4(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE, GAMEOPTION_REBEL1_RESTORED_CONTENT)},
 	{"rebel1", "Demo v1.02c", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformMacintosh, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
 
diff --git a/engines/scumm/insane/rebel1/releases.cpp b/engines/scumm/insane/rebel1/releases.cpp
index da7db2d2697..09a6555116b 100644
--- a/engines/scumm/insane/rebel1/releases.cpp
+++ b/engines/scumm/insane/rebel1/releases.cpp
@@ -66,6 +66,14 @@ static const Rebel1Release kReleases[] = {
 		{ 1, 2, 10 }, nullptr,
 		0x7fff, false, { 0, 0, 0 }, &kRetailWalker
 	},
+	{
+		// PC Media 1 preview: the dispatcher at 0x1496e redirects every
+		// chapter and transition to the intro/menu at 0x151f2. No chapter
+		// assets are supplied; the demo notice precedes the preview movie.
+		"Demo v1.7", "ASSAULT.EXE", "OPEN/O1LOGO.ANM", "OPEN/O1DEMO.ANM", "OPEN/O1OPEN.ANM", nullptr, false, false,
+		{ 0 }, nullptr,
+		0, false, { 0, 0, 0 }, &kRetailWalker
+	},
 	{
 		// The dispatcher at 0x3466 starts at chapter 8, skips 9, and returns
 		// to the menu after 10. Chapters 3 and 6 have complete resources and
diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h
index d5eddc4d61f..f233f21aaac 100644
--- a/engines/scumm/scumm-md5.h
+++ b/engines/scumm/scumm-md5.h
@@ -1,5 +1,5 @@
 /*
-  This file was generated by the md5table tool on Sun Sep 27 16:59:28 2026
+  This file was generated by the md5table tool on Sun Sep 27 19:12:17 2026
   DO NOT EDIT MANUALLY!
  */
 
@@ -67,6 +67,7 @@ static const MD5Table md5table[] = {
 	{ "0ca9c07185b4969764eaf3ecd0de06e9", "rebel1", "Demo v0.67", "Demo v0.67", 111530, Common::EN_ANY, Common::kPlatformDOS },
 	{ "0cccfa5223099a60e76cfcca57a1a141", "freddi3", "", "", 55959, Common::NL_NLD, Common::kPlatformUnknown },
 	{ "0d1b69471605201ef2fa9cec1f5f02d2", "maniac", "V2", "V2", 1988, Common::ES_ESP, Common::kPlatformDOS },
+	{ "0d6b6e42fffc11c4c7957951d3601b80", "rebel1", "Demo v1.7", "Demo v1.7", 218075, Common::EN_ANY, Common::kPlatformDOS },
 	{ "0ddf1174d0d097956ba10dd452ea65e6", "freddi3", "HE 99", "", -1, Common::HE_ISR, Common::kPlatformWindows },
 	{ "0e4c5d54a0ad4b26132e78b5ea76642a", "samnmax", "Floppy", "Demo", 6485, Common::EN_ANY, Common::kPlatformDOS },
 	{ "0e96ab45a4eb72acc1b46813976589fd", "activity", "", "", -1, Common::EN_ANY, Common::kPlatformMacintosh },


Commit: ee0d593533ad9e4f474e29159fbefd9f56e590c5
    https://github.com/scummvm/scummvm/commit/ee0d593533ad9e4f474e29159fbefd9f56e590c5
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-09-27T21:51:37+02:00

Commit Message:
SCUMM: RA1: added support for mac v1.0 demo

Changed paths:
    devtools/scumm-md5.txt
    engines/scumm/detection_tables.h
    engines/scumm/insane/rebel1/releases.cpp
    engines/scumm/scumm-md5.h


diff --git a/devtools/scumm-md5.txt b/devtools/scumm-md5.txt
index 7a294680f67..fd97698ba56 100644
--- a/devtools/scumm-md5.txt
+++ b/devtools/scumm-md5.txt
@@ -456,6 +456,7 @@ rebel1	Star Wars: Rebel Assault
 	5a76a7967ae1d87b43c3e8c6ba9773a0	217559	en	DOS	Demo v1.51	Demo Special Edition	Dark Forces and Rebel Assault Special Editions CD	-
 	0d6b6e42fffc11c4c7957951d3601b80	218075	en	DOS	Demo v1.7	Demo v1.7	PC Media 1 non-interactive demo	-
 	551a7c06bf5098b32d5fe7641d695df8	226750	en	DOS	Demo 1994-04-13	Demo 1994-04-13	CD-ROM demo (chapters 8 and 10)	-
+	f3207ec861b0e0db9b5117c339c734ad	453724	en	Mac	Demo v1.0	Demo v1.0	MacFormat 18 68k demo (chapters 6 and 9)	-
 	4e9f4571f5859ea50f1e505a1f15c408	451096	en	Mac	Demo v1.02c	Demo v1.02c	68k demo application (chapters 6 and 9)	-
 	b9ac90e4411da1b6f7dd075cc4b03c2a	214435	en	DOS	-	v1.0	-	-
 	e210a57b756473be705d24b9378a8233	212383	en	DOS	-	v1.3	-	-
diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h
index 205affb2be8..222ca6f7bbb 100644
--- a/engines/scumm/detection_tables.h
+++ b/engines/scumm/detection_tables.h
@@ -237,6 +237,7 @@ static const GameSettings gameVariantsTable[] = {
 	{"rebel1", "Demo v1.51", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
 	{"rebel1", "Demo v1.7", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO2(GUIO_NOMIDI, GUIO_NOLAUNCHLOAD)},
 	{"rebel1", "Demo 1994-04-13", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformDOS, GUIO4(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE, GAMEOPTION_REBEL1_RESTORED_CONTENT)},
+	{"rebel1", "Demo v1.0", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformMacintosh, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
 	{"rebel1", "Demo v1.02c", 0, GID_REBEL1, 7, 0, MDT_NONE, GF_DEMO | GF_TESTING, Common::kPlatformMacintosh, GUIO3(GUIO_NOMIDI, GAMEOPTION_REBEL1_UNLOCK_ALL, GAMEOPTION_REBEL1_NO_DAMAGE)},
 
 	{"rebel2", "", 0, GID_REBEL2, 7, 0, MDT_NONE, GF_TESTING, Common::kPlatformDOS, GUIO5(GUIO_NOMIDI, GAMEOPTION_REBEL2_HIRES, GAMEOPTION_REBEL2_UNLOCK_ALL, GAMEOPTION_REBEL2_NO_DAMAGE, GAMEOPTION_REBEL2_YODA_MODE)},
diff --git a/engines/scumm/insane/rebel1/releases.cpp b/engines/scumm/insane/rebel1/releases.cpp
index 09a6555116b..9383392327d 100644
--- a/engines/scumm/insane/rebel1/releases.cpp
+++ b/engines/scumm/insane/rebel1/releases.cpp
@@ -82,6 +82,13 @@ static const Rebel1Release kReleases[] = {
 		{ 8, 10 }, kDemo940413RestoredLevels,
 		1 << (6 - 1), true, { 0x289dc, 0x1a, 0x222 }, &kDemo940413Walker
 	},
+	{
+		// Macintosh v1.0: CODE 3 at 0x38c uses the same chapter order as
+		// v1.02c below. The supplied chapter assets and tuning also match.
+		"Demo v1.0", nullptr, "OPEN/O1LOGO.ANM", nullptr, "OPEN/O1OPEN.ANM", nullptr, false, false,
+		{ 6, 9 }, nullptr,
+		0x7fff, false, { 0, 0, 0 }, &kRetailWalker
+	},
 	{
 		// Macintosh v1.02c: CODE 3's dispatcher redirects chapters 1-5 to 6,
 		// 7-8 to 9, and 10-15 to the menu. The included ending is not played.
diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h
index f233f21aaac..f2a5530f9d0 100644
--- a/engines/scumm/scumm-md5.h
+++ b/engines/scumm/scumm-md5.h
@@ -1,5 +1,5 @@
 /*
-  This file was generated by the md5table tool on Sun Sep 27 19:12:17 2026
+  This file was generated by the md5table tool on Sun Sep 27 19:37:35 2026
   DO NOT EDIT MANUALLY!
  */
 
@@ -802,6 +802,7 @@ static const MD5Table md5table[] = {
 	{ "f27dc913b7fb3eb5b48bde1e4a687102", "monkey", "SE Talkie", "Unofficial SE Talkie", 9135, Common::CA_ESP, Common::kPlatformDOS },
 	{ "f2ec78e50bdc63b70044e9758be10914", "spyfox", "HE 98.5", "Demo", 20141, Common::NL_NLD, Common::kPlatformMacintosh },
 	{ "f3038f4a7c98c3cdcc767bad832b0f54", "funpack", "Mac Floppy", "Floppy", 5798, Common::EN_ANY, Common::kPlatformMacintosh },
+	{ "f3207ec861b0e0db9b5117c339c734ad", "rebel1", "Demo v1.0", "Demo v1.0", 453724, Common::EN_ANY, Common::kPlatformMacintosh },
 	{ "f3c4ed6101b4c26c762b2dfb16b1481d", "indy3", "VGA", "VGA", 6295, Common::FR_FRA, Common::kPlatformDOS },
 	{ "f3c5d9bf3f091bd1f18dc1013fba5396", "atlantis", "Steam", "Steam", 638976, Common::EN_ANY, Common::kPlatformWindows },
 	{ "f3d55aea441e260e9e9c7d2a187097e0", "puttzoo", "", "Demo", 14337, Common::EN_ANY, Common::kPlatformWindows },




More information about the Scummvm-git-logs mailing list