[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